@mocanvas/mocanvas 1.0.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shapes/spline-helpers.ts","../src/shapes/arrow-helpers.ts","../src/bindings/arrow-terminals.ts","../src/shapes/shape-theme.ts","../src/shapes/text-helpers.ts","../src/text/TextMeasure.ts","../src/text/TextEditor.tsx","../src/text/text-layout.ts","../src/shapes/elbow-helpers.ts","../src/shapes/prop-access.ts","../src/shapes/svg-path.ts","../src/shapes/ArrowShapeUtil.tsx","../src/shapes/BookmarkShapeUtil.tsx","../src/shapes/EmbedShapeUtil.tsx","../src/shapes/FrameShapeUtil.tsx","../src/shapes/geo-helpers.ts","../src/shapes/GeoShapeUtil.tsx","../src/shapes/NoteShapeUtil.tsx","../src/text/TextTexture.ts","../src/shapes/TextShapeUtil.tsx","../src/shapes/VideoShapeUtil.tsx","../src/export/svg-utils.ts","../src/export/text-svg.ts","../src/export/shape-svg.ts","../src/export/svg.ts","../src/export/image.ts","../src/install.ts","../src/shapes/draw-helpers.ts","../src/shapes/DrawShapeUtil.tsx","../src/shapes/ImageShapeUtil.tsx","../src/shapes/LineShapeUtil.tsx","../src/shapes/GroupShapeUtil.tsx","../src/shapes/index.ts","../src/bindings/ArrowBindingUtil.ts","../src/bindings/index.ts","../src/tools/ArrowTool.ts","../src/tools/DrawTool.ts","../src/tools/EraserTool.ts","../src/tools/FrameTool.ts","../src/tools/GeoTool.ts","../src/tools/HandTool.ts","../src/tools/LineTool.ts","../src/tools/NoteTool.ts","../src/tools/SelectTool.ts","../src/tools/TextTool.ts","../src/tools/index.ts","../src/ui/icons.tsx","../src/ui/overlays.tsx","../src/ui/StylePanel.tsx","../src/ui/useKeyboardShortcuts.ts","../src/ui/DefaultUi.tsx","../src/file.ts","../src/external/defaultExternalContentHandlers.ts","../src/external/useExternalContent.ts","../src/Mocanvas.tsx"],"names":["Vec","p","anchorFor","m","EPS","STROKE_SIZES","Group2d","jsx","Rectangle2d","jsxs","Fragment","BaseBoxShapeUtil","hexToRgba","r","CubicSpline2d","Polygon2d","points","Polyline2d","LABEL_PADDING","DefaultColorStyle","DefaultLabelColorStyle","DefaultFillStyle","DefaultDashStyle","DefaultSizeStyle","DefaultFontStyle","FONT_SIZES","DefaultHorizontalAlignStyle","DefaultVerticalAlignStyle","LABEL_KEYS","ShapeUtil","LIGHT_THEME","useRef","useEffect","PATH_OP","Box","Idle","StateNode","createShapeId","Pointing","GeoShapeGeoStyle","useState","useLayoutEffect","useCallback","GEO_SHAPE_KINDS","StylePanel","useEditor","titleCase","track","Toolbar","ZoomBar","DebugStats","isEditable"],"mappings":"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","file":"index.js","sourcesContent":["/** Curve construction shared by the line, arrow and geo shapes. */\nimport { Vec, type VecLike } from \"@mocanvas/editor\"\n\nexport interface CubicSegment {\n p0: VecLike\n c1: VecLike\n c2: VecLike\n p1: VecLike\n}\n\n/** A straight line expressed as a cubic (control points at 1/3 and 2/3). */\nexport function lineSegment(a: VecLike, b: VecLike): CubicSegment {\n return { p0: a, c1: Vec.Lrp(a, b, 1 / 3), c2: Vec.Lrp(a, b, 2 / 3), p1: b }\n}\n\n/**\n * Approximate a circular arc with `count` cubic béziers.\n * `sweep` is signed: positive sweeps toward increasing angle (clockwise in\n * screen space where +y points down).\n */\nexport function arcToCubicSegments(\n center: VecLike,\n radius: number,\n startAngle: number,\n sweep: number,\n count = 2,\n): CubicSegment[] {\n const n = Math.max(1, Math.floor(count))\n const step = sweep / n\n // Tangent handle length for a cubic approximating an arc of `step` radians.\n const k = (4 / 3) * Math.tan(step / 4) * radius\n const out: CubicSegment[] = []\n for (let i = 0; i < n; i++) {\n const a0 = startAngle + step * i\n const a1 = a0 + step\n const p0 = { x: center.x + radius * Math.cos(a0), y: center.y + radius * Math.sin(a0) }\n const p1 = { x: center.x + radius * Math.cos(a1), y: center.y + radius * Math.sin(a1) }\n out.push({\n p0,\n c1: { x: p0.x - k * Math.sin(a0), y: p0.y + k * Math.cos(a0) },\n c2: { x: p1.x + k * Math.sin(a1), y: p1.y - k * Math.cos(a1) },\n p1,\n })\n }\n return out\n}\n\n/**\n * Convert a polyline into a smooth cubic spline that passes through every\n * point (uniform Catmull-Rom, tension 0.5, converted to bézier handles).\n * Endpoints are clamped so the curve starts and ends exactly on the first and\n * last points.\n */\nexport function catmullRomToBezier(points: readonly VecLike[], closed = false): CubicSegment[] {\n const n = points.length\n if (n < 2) return []\n const at = (i: number): VecLike => {\n if (closed) return points[((i % n) + n) % n]!\n return points[Math.max(0, Math.min(n - 1, i))]!\n }\n const segCount = closed ? n : n - 1\n const out: CubicSegment[] = []\n for (let i = 0; i < segCount; i++) {\n const p0 = at(i - 1)\n const p1 = at(i)\n const p2 = at(i + 1)\n const p3 = at(i + 2)\n out.push({\n p0: p1,\n c1: { x: p1.x + (p2.x - p0.x) / 6, y: p1.y + (p2.y - p0.y) / 6 },\n c2: { x: p2.x - (p3.x - p1.x) / 6, y: p2.y - (p3.y - p1.y) / 6 },\n p1: p2,\n })\n }\n return out\n}\n\n/** Evaluate a cubic segment at `t`. */\nexport function pointOnCubic(s: CubicSegment, t: number): Vec {\n const u = 1 - t\n return new Vec(\n u * u * u * s.p0.x + 3 * u * u * t * s.c1.x + 3 * u * t * t * s.c2.x + t * t * t * s.p1.x,\n u * u * u * s.p0.y + 3 * u * u * t * s.c1.y + 3 * u * t * t * s.c2.y + t * t * t * s.p1.y,\n )\n}\n","/**\n * Arrow body and arrowhead math.\n *\n * A body is a straight run, an arc, or — for an elbow arrow — the polyline\n * routed by `elbow-helpers`. Everything below works on all three, so callers\n * ask for a point, a tangent or a length without caring which one they hold.\n *\n * Bend convention: `bend` is the signed perpendicular offset of the arc's\n * midpoint from the chord midpoint. The perpendicular is `Per(Uni(end-start))`\n * = (-dy, dx), so for a left-to-right arrow a positive bend bows the arc toward\n * +y (down in screen space).\n */\nimport { CubicSpline2d, Polygon2d, Polyline2d, Vec, type Geometry2d, type VecLike } from \"@mocanvas/editor\"\nimport { arcToCubicSegments } from \"./spline-helpers\"\n\nexport type ArrowheadKind = \"none\" | \"arrow\" | \"triangle\" | \"square\" | \"dot\" | \"diamond\" | \"inverted\" | \"bar\" | \"pipe\"\n\nexport interface StraightBody {\n kind: \"straight\"\n start: Vec\n end: Vec\n}\n\nexport interface ArcBody {\n kind: \"arc\"\n center: Vec\n radius: number\n startAngle: number\n /** Signed sweep in radians. */\n sweep: number\n}\n\n/**\n * A body made of straight runs: the elbow arrow's axis-aligned route with its\n * corners already rounded. Built by `getElbowBody` in `elbow-helpers`; every\n * body operation below treats it as a polyline parameterized by arc length.\n */\nexport interface ElbowBody {\n kind: \"elbow\"\n points: Vec[]\n}\n\nexport type ArrowBody = StraightBody | ArcBody | ElbowBody\n\nconst EPS = 1e-6\n\nfunction normalizeAngle(a: number): number {\n let r = a % (Math.PI * 2)\n if (r > Math.PI) r -= Math.PI * 2\n if (r <= -Math.PI) r += Math.PI * 2\n return r\n}\n\n/** Describe the body running from `start` to `end`, bowed by `bend`. */\nexport function getArrowBody(start: VecLike, end: VecLike, bend: number): ArrowBody {\n const s = Vec.From(start)\n const e = Vec.From(end)\n const chord = Vec.Sub(e, s)\n const halfChord = Vec.Len(chord) / 2\n if (Math.abs(bend) < EPS || halfChord < EPS) return { kind: \"straight\", start: s, end: e }\n\n const u = Vec.Uni(chord)\n const n = Vec.Per(u)\n const mid = Vec.Lrp(s, e, 0.5)\n const b = Math.abs(bend)\n const sign = Math.sign(bend)\n const radius = (halfChord * halfChord + b * b) / (2 * b)\n const center = Vec.Add(mid, Vec.Mul(n, bend - sign * radius))\n const arcMid = Vec.Add(mid, Vec.Mul(n, bend))\n\n const startAngle = Vec.Angle(center, s)\n const endAngle = Vec.Angle(center, e)\n let sweep = normalizeAngle(endAngle - startAngle)\n // Pick the direction whose midpoint lands on the requested arc midpoint.\n const midAngle = startAngle + sweep / 2\n const candidate = new Vec(center.x + radius * Math.cos(midAngle), center.y + radius * Math.sin(midAngle))\n if (Vec.Dist(candidate, arcMid) > 1e-3 * Math.max(1, radius)) {\n sweep = sweep - Math.sign(sweep || 1) * Math.PI * 2\n }\n return { kind: \"arc\", center, radius, startAngle, sweep }\n}\n\n/** Cumulative length at each point of a polyline; `at(-1)` is its total length. */\nfunction cumulativeLengths(points: Vec[]): number[] {\n const out = [0]\n for (let i = 1; i < points.length; i++) out.push(out[i - 1]! + Vec.Dist(points[i - 1]!, points[i]!))\n return out\n}\n\n/** Index of the segment holding `distance`, as an index into `points`. */\nfunction segmentAt(lengths: number[], distance: number): number {\n for (let i = 1; i < lengths.length; i++) {\n if (distance <= lengths[i]! || i === lengths.length - 1) return i - 1\n }\n return 0\n}\n\n/** The point `distance` along a polyline, clamped to its ends. */\nfunction pointAtDistance(points: Vec[], lengths: number[], distance: number): Vec {\n if (points.length === 0) return new Vec()\n if (points.length === 1) return points[0]!.clone()\n const i = segmentAt(lengths, distance)\n const segment = lengths[i + 1]! - lengths[i]!\n const t = segment < EPS ? 0 : (distance - lengths[i]!) / segment\n return Vec.Lrp(points[i]!, points[i + 1]!, Math.max(0, Math.min(1, t)))\n}\n\nexport function getBodyLength(body: ArrowBody): number {\n if (body.kind === \"straight\") return Vec.Dist(body.start, body.end)\n if (body.kind === \"elbow\") return cumulativeLengths(body.points).at(-1) ?? 0\n return Math.abs(body.sweep) * body.radius\n}\n\n/** Point at parameter `t` in [0, 1] along the body. */\nexport function getPointOnBody(body: ArrowBody, t: number): Vec {\n if (body.kind === \"straight\") return Vec.Lrp(body.start, body.end, t)\n if (body.kind === \"elbow\") {\n const lengths = cumulativeLengths(body.points)\n return pointAtDistance(body.points, lengths, (lengths.at(-1) ?? 0) * t)\n }\n const a = body.startAngle + body.sweep * t\n return new Vec(body.center.x + body.radius * Math.cos(a), body.center.y + body.radius * Math.sin(a))\n}\n\n/**\n * Unit direction of travel at parameter `t`. On an elbow that is the direction\n * of the leg `t` falls on, so `t = 1` gives the direction of the final leg —\n * which is where the end arrowhead points.\n */\nexport function getTangentOnBody(body: ArrowBody, t: number): Vec {\n if (body.kind === \"straight\") return Vec.Uni(Vec.Sub(body.end, body.start))\n if (body.kind === \"elbow\") {\n const points = body.points\n if (points.length < 2) return new Vec(1, 0)\n const lengths = cumulativeLengths(points)\n const i = segmentAt(lengths, (lengths.at(-1) ?? 0) * Math.max(0, Math.min(1, t)))\n // Degenerate segments carry no direction; walk to the nearest one that does.\n for (let step = 0; step < points.length; step++) {\n for (const j of [i + step, i - step]) {\n if (j < 0 || j >= points.length - 1) continue\n const d = Vec.Sub(points[j + 1]!, points[j]!)\n if (Vec.Len(d) > EPS) return Vec.Uni(d)\n }\n }\n return new Vec(1, 0)\n }\n const a = body.startAngle + body.sweep * t\n const dir = Math.sign(body.sweep) || 1\n return new Vec(-Math.sin(a) * dir, Math.cos(a) * dir)\n}\n\n/** Trim `startBy` / `endBy` page units from either end of the body. */\nexport function shortenBody(body: ArrowBody, startBy: number, endBy: number): ArrowBody {\n const length = getBodyLength(body)\n if (length < EPS) return body\n // Never eat more than 90% of the body.\n const total = startBy + endBy\n const budget = length * 0.9\n const scale = total > budget ? budget / total : 1\n const s = startBy * scale\n const e = endBy * scale\n if (body.kind === \"straight\") {\n return { kind: \"straight\", start: getPointOnBody(body, s / length), end: getPointOnBody(body, 1 - e / length) }\n }\n if (body.kind === \"elbow\") {\n const lengths = cumulativeLengths(body.points)\n const from = s\n const to = length - e\n const points: Vec[] = [pointAtDistance(body.points, lengths, from)]\n for (let i = 1; i < body.points.length - 1; i++) {\n const at = lengths[i]!\n if (at > from + EPS && at < to - EPS) points.push(body.points[i]!.clone())\n }\n points.push(pointAtDistance(body.points, lengths, to))\n return { kind: \"elbow\", points }\n }\n const dir = Math.sign(body.sweep) || 1\n const dStart = (s / body.radius) * dir\n const dEnd = (e / body.radius) * dir\n return {\n kind: \"arc\",\n center: body.center,\n radius: body.radius,\n startAngle: body.startAngle + dStart,\n sweep: body.sweep - dStart - dEnd,\n }\n}\n\n/** Geometry for the body: a polyline (straight or elbow) or a cubic approximation of the arc. */\nexport function bodyToGeometry(body: ArrowBody): Geometry2d {\n if (body.kind === \"straight\") return new Polyline2d({ points: [body.start, body.end] })\n if (body.kind === \"elbow\") return new Polyline2d({ points: body.points })\n const count = Math.max(2, Math.ceil(Math.abs(body.sweep) / (Math.PI / 2)))\n return new CubicSpline2d({\n segments: arcToCubicSegments(body.center, body.radius, body.startAngle, body.sweep, count),\n isClosed: false,\n isFilled: false,\n })\n}\n\n/** Arrowhead length for a stroke width, capped so two heads never overlap. */\nexport function getArrowheadLength(strokeWidth: number, bodyLength: number): number {\n return Math.max(0, Math.min(Math.max(12, strokeWidth * 4), bodyLength / 2.5))\n}\n\n/** How far the body must retreat from the tip so it ends at the head's base. */\nexport function getArrowheadInset(kind: ArrowheadKind, length: number): number {\n switch (kind) {\n case \"triangle\":\n case \"inverted\":\n case \"diamond\":\n case \"square\":\n case \"dot\":\n return length\n case \"arrow\":\n case \"bar\":\n case \"pipe\":\n case \"none\":\n return 0\n }\n}\n\nconst CHEVRON_HALF_WIDTH = Math.tan(Math.PI / 6)\n\n/**\n * Arrowhead geometry with its tip at `tip`, pointing along unit `dir` (from\n * the body outward). Closed heads are filled; open ones are polylines.\n */\nexport function getArrowheadGeometry(kind: ArrowheadKind, tip: VecLike, dir: VecLike, length: number): Geometry2d | null {\n if (kind === \"none\" || length <= 0) return null\n const t = Vec.From(tip)\n const d = Vec.From(dir)\n const p = Vec.Per(d)\n const back = Vec.Sub(t, Vec.Mul(d, length))\n const wing = Vec.Mul(p, length * CHEVRON_HALF_WIDTH)\n switch (kind) {\n case \"arrow\":\n return new Polyline2d({ points: [Vec.Add(back, wing), t, Vec.Sub(back, wing)] })\n case \"triangle\":\n return new Polygon2d({ points: [t, Vec.Add(back, wing), Vec.Sub(back, wing)], isFilled: true })\n case \"inverted\":\n return new Polygon2d({ points: [back, Vec.Add(t, wing), Vec.Sub(t, wing)], isFilled: true })\n case \"square\": {\n const half = Vec.Mul(p, length / 2)\n return new Polygon2d({\n points: [Vec.Add(t, half), Vec.Sub(t, half), Vec.Sub(back, half), Vec.Add(back, half)],\n isFilled: true,\n })\n }\n case \"diamond\": {\n const mid = Vec.Lrp(t, back, 0.5)\n const half = Vec.Mul(p, length / 2)\n return new Polygon2d({ points: [t, Vec.Add(mid, half), back, Vec.Sub(mid, half)], isFilled: true })\n }\n case \"dot\": {\n const center = Vec.Lrp(t, back, 0.5)\n return new CubicSpline2d({\n segments: arcToCubicSegments(center, length / 2, 0, Math.PI * 2, 4),\n isClosed: true,\n isFilled: true,\n })\n }\n case \"bar\": {\n const half = Vec.Mul(p, length / 2)\n return new Polyline2d({ points: [Vec.Add(t, half), Vec.Sub(t, half)] })\n }\n case \"pipe\": {\n const half = Vec.Mul(p, length * 0.35)\n return new Polyline2d({ points: [Vec.Add(t, half), Vec.Sub(t, half)] })\n }\n }\n}\n\n/** Signed bend for a dragged midpoint handle at `point`. */\nexport function getBendFromPoint(start: VecLike, end: VecLike, point: VecLike): number {\n const chord = Vec.Sub(end, start)\n if (Vec.Len(chord) < EPS) return 0\n const n = Vec.Per(Vec.Uni(chord))\n const mid = Vec.Lrp(start, end, 0.5)\n const bend = Vec.Dot(Vec.Sub(point, mid), n)\n return Math.abs(bend) < 1 ? 0 : bend\n}\n","/**\n * Arrow terminal resolution.\n *\n * An arrow terminal is either static (`props.start` / `props.end`, in\n * arrow-local space) or bound to another shape through an `arrow` binding.\n * A bound terminal is derived from the bound shape every time it is read, so\n * the arrow follows the shape without anyone copying coordinates around.\n */\nimport {\n Box,\n Group2d,\n STROKE_SIZES,\n Vec,\n type DefaultSizeStyle,\n type Editor,\n type Geometry2d,\n type ShapeId,\n type UnknownShape,\n type VecLike,\n} from \"@mocanvas/editor\"\nimport type { ArrowShape } from \"../shapes/ArrowShapeUtil\"\nimport { getArrowBody, getPointOnBody } from \"../shapes/arrow-helpers\"\nimport type { ArrowBinding, ArrowTerminal } from \"./ArrowBindingUtil\"\n\n/** Affine transform components as returned by `Editor.getShapePageTransform`. */\nexport interface TransformLike {\n a: number\n b: number\n c: number\n d: number\n e: number\n f: number\n}\n\nexport function applyTransform(m: TransformLike, p: VecLike): Vec {\n return new Vec(m.a * p.x + m.c * p.y + m.e, m.b * p.x + m.d * p.y + m.f)\n}\n\nexport interface ArrowBindings {\n start?: ArrowBinding\n end?: ArrowBinding\n}\n\n/** The arrow's terminal bindings, keyed by terminal. */\nexport function getArrowBindings(editor: Editor, arrow: ArrowShape): ArrowBindings {\n const out: ArrowBindings = {}\n for (const binding of editor.getBindingsFromShape<ArrowBinding>(arrow, \"arrow\")) {\n out[binding.props.terminal] = binding\n }\n return out\n}\n\n/** Map a normalized anchor `(0..1, 0..1)` into a shape's geometry bounds (shape-local space). */\nexport function getAnchorInShapeSpace(editor: Editor, shape: UnknownShape, normalizedAnchor: VecLike): Vec {\n const b = editor.getShapeGeometry(shape).bounds\n return new Vec(b.x + b.w * normalizedAnchor.x, b.y + b.h * normalizedAnchor.y)\n}\n\n/**\n * The topmost shape an arrow terminal dropped at `pagePoint` should bind to,\n * or `undefined`. Candidates must accept arrow bindings, may not be arrows,\n * the arrow itself, or one of the arrow's ancestors, and are hit inside their\n * outline (or within the hit-test margin of it) regardless of fill, so an arrow\n * can attach to a hollow rectangle by pointing into it.\n */\nexport function getArrowBindingTargetAtPoint(editor: Editor, arrow: UnknownShape, pagePoint: VecLike): UnknownShape | undefined {\n const margin = editor.options.hitTestMargin / editor.getZoomLevel()\n const ancestors = new Set<ShapeId>()\n for (let p = editor.getShapeParent(arrow); p; p = editor.getShapeParent(p)) ancestors.add(p.id)\n const shapes = editor.getCurrentPageShapesSorted()\n for (let i = shapes.length - 1; i >= 0; i--) {\n const shape = shapes[i]!\n if (shape.id === arrow.id || shape.type === \"arrow\" || shape.isLocked || ancestors.has(shape.id)) continue\n if (!editor.getShapeUtil(shape).canBind({ fromShapeType: \"arrow\", toShapeType: shape.type, bindingType: \"arrow\" })) continue\n const bounds = editor.getShapePageBounds(shape)\n if (!bounds || !Box.ContainsPoint(bounds, pagePoint, margin)) continue\n const local = editor.getPointInShapeSpace(shape, pagePoint)\n if (editor.getShapeGeometry(shape).hitTestPoint(local, margin, true)) return shape\n }\n return undefined\n}\n\n/** Normalize a page point into a shape's geometry bounds, clamped to `[0, 1]`. */\nexport function getNormalizedAnchor(editor: Editor, shape: UnknownShape, pagePoint: VecLike): Vec {\n const local = editor.getPointInShapeSpace(shape, pagePoint)\n const b = editor.getShapeGeometry(shape).bounds\n const clamp = (v: number): number => (Number.isFinite(v) ? Math.max(0, Math.min(1, v)) : 0.5)\n return new Vec(clamp(b.w === 0 ? 0.5 : (local.x - b.x) / b.w), clamp(b.h === 0 ? 0.5 : (local.y - b.y) / b.h))\n}\n\n/**\n * Flattened outline of a geometry as line segments, in the geometry's own\n * space. Groups are walked recursively; label geometry is skipped so arrows\n * end on the shape body rather than on its text box.\n */\nexport function getOutlineSegments(geometry: Geometry2d): [Vec, Vec][] {\n if (geometry.isLabel) return []\n if (geometry instanceof Group2d) return geometry.children.flatMap(getOutlineSegments)\n const v = geometry.vertices\n const out: [Vec, Vec][] = []\n if (v.length < 2) return out\n const n = geometry.isClosed ? v.length : v.length - 1\n for (let i = 0; i < n; i++) out.push([v[i]!, v[(i + 1) % v.length]!])\n return out\n}\n\n/**\n * Intersection point of segments `a1-a2` and `b1-b2`, or `null` when they do\n * not cross. Parallel and degenerate segments never intersect.\n */\nexport function intersectSegments(a1: VecLike, a2: VecLike, b1: VecLike, b2: VecLike): Vec | null {\n const rx = a2.x - a1.x\n const ry = a2.y - a1.y\n const sx = b2.x - b1.x\n const sy = b2.y - b1.y\n const denom = rx * sy - ry * sx\n if (Math.abs(denom) < 1e-12) return null\n const qx = b1.x - a1.x\n const qy = b1.y - a1.y\n const t = (qx * sy - qy * sx) / denom\n const u = (qx * ry - qy * rx) / denom\n if (t < 0 || t > 1 || u < 0 || u > 1) return null\n return new Vec(a1.x + rx * t, a1.y + ry * t)\n}\n\n/**\n * Walk a polyline from its first point and return the first place it crosses\n * any of `segments`, or `null`.\n */\nfunction firstCrossing(path: Vec[], segments: [Vec, Vec][]): Vec | null {\n for (let i = 0; i < path.length - 1; i++) {\n const p0 = path[i]!\n const p1 = path[i + 1]!\n let best: Vec | null = null\n let bestD = Infinity\n for (const [s0, s1] of segments) {\n const hit = intersectSegments(p0, p1, s0, s1)\n if (!hit) continue\n const d = Vec.Dist2(p0, hit)\n if (d < bestD) {\n bestD = d\n best = hit\n }\n }\n if (best) return best\n }\n return null\n}\n\n/**\n * Sample the arrow body from `from` to `to` (bowed by `bend`) as a polyline\n * starting at `from`. An elbow arrow is sampled the same way: where it meets\n * the bound shape is decided by the line of sight from the other terminal —\n * the route is built afterwards, from the terminals this returns.\n */\nfunction sampleBody(from: Vec, to: Vec, bend: number, reverse: boolean): Vec[] {\n // The body is always described start → end so the bend sign keeps its meaning.\n const body = reverse ? getArrowBody(to, from, bend) : getArrowBody(from, to, bend)\n if (body.kind !== \"arc\") return [from, to]\n const count = Math.max(8, Math.min(128, Math.ceil((Math.abs(body.sweep) * body.radius) / 4)))\n const pts: Vec[] = []\n for (let i = 0; i <= count; i++) {\n const t = reverse ? 1 - i / count : i / count\n pts.push(getPointOnBody(body, t))\n }\n return pts\n}\n\nexport interface ArrowTerminals {\n start: Vec\n end: Vec\n}\n\n/** Which axis an elbow arrow leaves a terminal on, when that terminal is bound. */\nexport interface ElbowTerminalAxes {\n start?: \"x\" | \"y\"\n end?: \"x\" | \"y\"\n}\n\n/**\n * For each bound terminal, the axis of the normal of the bound shape's nearest\n * edge: `\"x\"` on a left or right edge, `\"y\"` on a top or bottom one. An elbow\n * arrow routes its first and last leg along these, so it leaves and enters a\n * bound shape square-on instead of diagonally. A free terminal is absent from\n * the result and the router falls back to the dominant axis.\n *\n * The bound shape's bounds are measured in arrow space, so a rotated shape is\n * compared against the box it occupies from the arrow's point of view — which\n * is the frame the route itself is built in.\n */\nexport function getBoundElbowAxes(editor: Editor, arrow: ArrowShape, terminals: ArrowTerminals): ElbowTerminalAxes {\n const bindings = getArrowBindings(editor, arrow)\n const out: ElbowTerminalAxes = {}\n for (const terminal of [\"start\", \"end\"] as const) {\n const binding = bindings[terminal]\n const shape = binding ? editor.getShape(binding.toId) : undefined\n if (!shape) continue\n const m = editor.getShapePageTransform(shape)\n const corners = editor\n .getShapeGeometry(shape)\n .bounds.corners.map((p) => editor.getPointInShapeSpace(arrow, applyTransform(m, p)))\n const box = Box.FromPoints(corners)\n if (box.w < 1e-6 && box.h < 1e-6) continue\n const p = terminals[terminal]\n const dx = Math.min(Math.abs(p.x - box.minX), Math.abs(p.x - box.maxX))\n const dy = Math.min(Math.abs(p.y - box.minY), Math.abs(p.y - box.maxY))\n out[terminal] = dx <= dy ? \"x\" : \"y\"\n }\n return out\n}\n\n/**\n * How far a bound arrow stops short of the shape it points at, as a multiple\n * of its stroke width. An arrowhead resting on a shape's border reads as part\n * of that border; a small gap reads as pointing at it.\n */\nexport const ARROW_TERMINAL_GAP_STROKES = 2.7\n\n/** The gap in page units for an arrow of a given size style. */\nexport function getArrowTerminalGap(size: DefaultSizeStyle, scale = 1): number {\n return STROKE_SIZES[size] * scale * ARROW_TERMINAL_GAP_STROKES\n}\n\n/** Move `point` back along the line toward `from` by `distance`, never past `from`. */\nfunction pullBack(point: Vec, from: Vec, distance: number): Vec {\n const d = Vec.Dist(point, from)\n if (d <= 1e-6) return point\n return Vec.Lrp(point, from, Math.min(distance, d) / d)\n}\n\n/**\n * Resolve both terminals of an arrow in arrow-local space.\n *\n * Unbound terminals come straight from `props`. A bound terminal starts at\n * its anchor inside the bound shape's bounds; unless the binding is exact it\n * is then pulled back to where the arrow body first crosses the bound shape's\n * outline on its way from the opposite terminal. If the body never crosses\n * the outline (e.g. the other terminal is inside the shape) the anchor is used.\n */\nexport function getArrowTerminalsInArrowSpace(editor: Editor, arrow: ArrowShape): ArrowTerminals {\n const bindings = getArrowBindings(editor, arrow)\n const startShape = bindings.start ? editor.getShape(bindings.start.toId) : undefined\n const endShape = bindings.end ? editor.getShape(bindings.end.toId) : undefined\n\n const anchorFor = (terminal: ArrowTerminal, binding: ArrowBinding | undefined, shape: UnknownShape | undefined): Vec => {\n if (!binding || !shape) return Vec.From(arrow.props[terminal])\n const local = getAnchorInShapeSpace(editor, shape, binding.props.normalizedAnchor)\n const page = applyTransform(editor.getShapePageTransform(shape), local)\n return editor.getPointInShapeSpace(arrow, page)\n }\n\n const startAnchor = anchorFor(\"start\", bindings.start, startShape)\n const endAnchor = anchorFor(\"end\", bindings.end, endShape)\n\n const outlineInArrowSpace = (shape: UnknownShape): [Vec, Vec][] => {\n const m = editor.getShapePageTransform(shape)\n const toArrow = (p: Vec): Vec => editor.getPointInShapeSpace(arrow, applyTransform(m, p))\n return getOutlineSegments(editor.getShapeGeometry(shape)).map(([a, b]) => [toArrow(a), toArrow(b)])\n }\n\n const snap = (terminal: ArrowTerminal, binding: ArrowBinding | undefined, shape: UnknownShape | undefined, anchor: Vec, other: Vec): Vec => {\n if (!binding || !shape || binding.props.isExact) return anchor\n if (Vec.Dist2(anchor, other) < 1e-12) return anchor\n const path = sampleBody(other, anchor, arrow.props.bend, terminal === \"start\")\n const crossing = firstCrossing(path, outlineInArrowSpace(shape))\n if (!crossing) return anchor\n // Stop short of the outline rather than on it. `isExact` opts out above,\n // which is what an exact binding means.\n return pullBack(crossing, other, getArrowTerminalGap(arrow.props.size, arrow.props.scale))\n }\n\n return {\n start: snap(\"start\", bindings.start, startShape, startAnchor, endAnchor),\n end: snap(\"end\", bindings.end, endShape, endAnchor, startAnchor),\n }\n}\n","/**\n * Theme lookups shared by the default shapes. Everything resolves against the\n * light theme for now; a theme-aware variant can be threaded through later.\n */\nimport {\n hexToRgba,\n LIGHT_THEME,\n type DefaultColorStyle,\n type DefaultFillStyle,\n type DefaultFontStyle,\n} from \"@mocanvas/editor\"\n\n/** Engine RGBA for a shape's stroke. */\nexport function getStrokeRgba(color: DefaultColorStyle): number {\n return hexToRgba(LIGHT_THEME[color].solid)\n}\n\n/**\n * Engine RGBA for a shape's interior. `0` means \"no fill\".\n *\n * The fill *styles* and the palette *tokens* share names but are one step\n * apart, which is easy to get wrong: `semi` paints the paper colour with a\n * barely-there tint, `solid` paints the hue's pale tint (the `semi` token),\n * and only `fill` paints the hue at full strength (the `solid` token). Reading\n * the token whose name matches the style makes every filled shape a step too\n * saturated. The stroke always uses the full-strength colour, so a `solid`\n * fill reads as a pale body inside a saturated outline.\n */\nexport function getFillRgba(color: DefaultColorStyle, fill: DefaultFillStyle): number {\n const theme = LIGHT_THEME[color]\n switch (fill) {\n case \"none\":\n return 0\n case \"semi\":\n return hexToRgba(LIGHT_THEME.solid)\n case \"pattern\":\n return hexToRgba(theme.pattern)\n case \"solid\":\n return hexToRgba(theme.semi)\n case \"fill\":\n return hexToRgba(theme.fill)\n }\n}\n\n/** Engine RGBA for a sticky note's background. */\nexport function getNoteFillRgba(color: DefaultColorStyle): number {\n return hexToRgba(LIGHT_THEME[color].note.fill)\n}\n\n/** CSS color string for text drawn in the DOM overlay. */\nexport function getTextCssColor(color: DefaultColorStyle): string {\n return LIGHT_THEME[color].solid\n}\n\n/** CSS color string for text on a sticky note. */\nexport function getNoteTextCssColor(color: DefaultColorStyle): string {\n return LIGHT_THEME[color].note.text\n}\n\n/** Local-only font stacks; no web fonts are loaded. */\nexport function getFontFamily(font: DefaultFontStyle): string {\n switch (font) {\n case \"draw\":\n return '\"Comic Sans MS\", \"Segoe Print\", \"Bradley Hand\", \"Chalkboard SE\", cursive'\n case \"sans\":\n return 'system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif'\n case \"serif\":\n return 'Georgia, \"Times New Roman\", Times, serif'\n case \"mono\":\n return 'ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace'\n }\n}\n\n/** Engine dash pattern id for a dash style (see `mocanvas-render::dash`). */\nexport function getDashId(dash: string): number {\n switch (dash) {\n case \"dashed\":\n return 1\n case \"dotted\":\n return 2\n case \"draw\":\n return 3\n default:\n return 0\n }\n}\n\n// ---- frame chrome ---------------------------------------------------------\n\n/** A frame's body. */\nexport const FRAME_FILL = \"#ffffff\"\n\n/**\n * A frame's border.\n *\n * Measured off a reference render: a neutral grey hairline, not the blue-grey\n * (`#9fa8b2`) this used to be. The difference reads as a colour cast along\n * every frame edge, so it is worth being exact about.\n */\nexport const FRAME_STROKE = \"#717171\"\n\n/** Width of that border, in page units. */\nexport const FRAME_STROKE_WIDTH = 1\n\n/**\n * The frame's name, drawn in the strip above it. A shade darker than the\n * border so the caption carries more weight than the hairline it labels.\n */\nexport const FRAME_NAME_COLOR = \"#5f5f5f\"\n\nexport const FRAME_NAME_FONT_SIZE = 12\n\n/** Height of the strip above the frame that the name is laid out in. */\nexport const FRAME_NAME_OFFSET = 24\n\n/**\n * Gap between the bottom of that strip and the frame's top edge. The name is\n * bottom-aligned in the strip, so this is what sets how far above the frame it\n * sits — measured two pixels higher than the four this used to be.\n */\nexport const FRAME_NAME_GAP = 6\n\n/** Box the frame name is laid out in: the strip above the frame, minus the gap. */\nexport const FRAME_NAME_HEIGHT = FRAME_NAME_OFFSET - FRAME_NAME_GAP\n\n// ---- sticky-note chrome ---------------------------------------------------\n\n/**\n * A note body is not flat. It runs from a slightly deeper tint at the top to\n * the palette's `note.fill` at the bottom — `#f7dc99` → `#fce19c` for the\n * default yellow, i.e. the fill scaled by this factor channel-wise, which is\n * the ratio measured off the reference render and holds for every hue.\n */\nexport const NOTE_GRADIENT_TOP_SCALE = 0.9785\n\n/**\n * The soft shadow that falls below a note. Chosen so the darkest pixel just\n * under the body composites to `#c0c4c5` over the `#f9fafb` page and fades out\n * about twelve pixels down, matching the reference.\n *\n * The shadow is decoration *outside* the body: it is drawn by the DOM overlay\n * (and by a filter in SVG export) and never enters the shape's geometry,\n * bounds or hit-testing.\n */\nexport const NOTE_SHADOW_COLOR = \"#152223\"\nexport const NOTE_SHADOW_OPACITY = 0.36\n/**\n * A note's shadow falls almost entirely *below* it. A wide blur with no spread\n * haloes the note on every side, which reads as a glow rather than as paper\n * lifted off the page; the negative spread pulls the shadow rect in so the\n * sides stay tight while the offset keeps the soft falloff underneath.\n */\nexport const NOTE_SHADOW_OFFSET_Y = 12\nexport const NOTE_SHADOW_BLUR = 13\nexport const NOTE_SHADOW_SPREAD = -9\n\n/** `#rrggbb` with every channel scaled by `factor`, clamped to the byte range. */\nfunction scaleHexColor(hex: string, factor: number): string {\n const n = Number.parseInt(hex.slice(1), 16)\n const ch = (shift: number): number => Math.max(0, Math.min(255, Math.round(((n >> shift) & 0xff) * factor)))\n return `#${(((ch(16) << 16) | (ch(8) << 8) | ch(0)) >>> 0).toString(16).padStart(6, \"0\")}`\n}\n\n/** `#rrggbb` as a CSS `rgba()` string at `alpha`. */\nexport function hexToCssRgba(hex: string, alpha: number): string {\n const n = Number.parseInt(hex.slice(1), 16)\n return `rgba(${(n >> 16) & 0xff}, ${(n >> 8) & 0xff}, ${n & 0xff}, ${alpha})`\n}\n\n/** CSS colour at the bottom of a note's body gradient (the palette's note fill). */\nexport function getNoteFillCssColor(color: DefaultColorStyle): string {\n return LIGHT_THEME[color].note.fill\n}\n\n/**\n * Top of a note's body gradient, derived from the colour at its bottom. Takes\n * a `#rrggbb`; anything else (an `#rrggbbaa`, a named colour) is returned\n * unchanged, so the gradient degrades to a flat body rather than to garbage.\n */\nexport function getNoteGradientTopFrom(fill: string): string {\n if (!/^#[0-9a-fA-F]{6}$/.test(fill)) return fill\n return scaleHexColor(fill, NOTE_GRADIENT_TOP_SCALE)\n}\n\n/** CSS colour at the top of a note's body gradient. */\nexport function getNoteGradientTopCssColor(color: DefaultColorStyle): string {\n return getNoteGradientTopFrom(getNoteFillCssColor(color))\n}\n\n/** CSS `background` for a note body: the vertical gradient, top to bottom. */\nexport function getNoteBodyGradientCss(color: DefaultColorStyle): string {\n return `linear-gradient(to bottom, ${getNoteGradientTopCssColor(color)} 0%, ${getNoteFillCssColor(color)} 100%)`\n}\n\n/** CSS `box-shadow` for a note body, in shape-local units at `scale`. */\nexport function getNoteShadowCss(scale = 1): string {\n const dy = NOTE_SHADOW_OFFSET_Y * scale\n const blur = NOTE_SHADOW_BLUR * scale\n const spread = NOTE_SHADOW_SPREAD * scale\n return `0 ${dy}px ${blur}px ${spread}px ${hexToCssRgba(NOTE_SHADOW_COLOR, NOTE_SHADOW_OPACITY)}`\n}\n\n/**\n * The note shadow's geometry for an SVG export, in shape-local units.\n * `feDropShadow` has no spread, so the exporter draws the shadow as its own\n * rect — the body inset by the spread and offset down — behind the body, and\n * blurs just that rect.\n */\nexport function getNoteShadowSvgRect(w: number, h: number, scale = 1): { x: number; y: number; w: number; h: number; stdDeviation: number } {\n const inset = -NOTE_SHADOW_SPREAD * scale\n return {\n x: inset,\n y: NOTE_SHADOW_OFFSET_Y * scale + inset,\n w: Math.max(0, w - inset * 2),\n h: Math.max(0, h - inset * 2),\n // CSS blur radius is twice the Gaussian standard deviation.\n stdDeviation: (NOTE_SHADOW_BLUR * scale) / 2,\n }\n}\n","/** Cheap text metrics used until real measurement lands (phase 2 text layout). */\n\nexport const LINE_HEIGHT = 1.3\n/** Average glyph advance as a fraction of the font size. */\nexport const AVG_CHAR_WIDTH = 0.6\n\nexport interface TextSizeEstimate {\n w: number\n h: number\n lines: number\n}\n\n/**\n * Estimate the box a run of text occupies at `fontSize`, wrapping each\n * paragraph at `maxWidth` using an average character width.\n */\nexport function estimateTextSize(text: string, fontSize: number, maxWidth = Infinity): TextSizeEstimate {\n const charW = fontSize * AVG_CHAR_WIDTH\n const charsPerLine = Number.isFinite(maxWidth) && charW > 0 ? Math.max(1, Math.floor(maxWidth / charW)) : Infinity\n let lines = 0\n let widest = 0\n for (const paragraph of text.split(\"\\n\")) {\n const n = paragraph.length\n lines += Math.max(1, Math.ceil(n / charsPerLine))\n widest = Math.max(widest, Math.min(n, charsPerLine) * charW)\n }\n return { w: widest, h: lines * fontSize * LINE_HEIGHT, lines }\n}\n","import { estimateTextSize } from \"../shapes/text-helpers\"\n\nexport interface TextMeasureOptions {\n fontFamily: string\n fontSize: number\n fontWeight?: string | number\n /** Unitless line height (multiplier of the font size). */\n lineHeight: number\n /** Wrap width in CSS px, including `padding`. Omit for a single unwrapped run per paragraph. */\n maxWidth?: number\n /** Padding applied on every side; included in the returned `w`/`h`. */\n padding?: number\n}\n\nexport interface TextMeasurement {\n w: number\n h: number\n lineCount: number\n}\n\nconst MAX_CACHE_ENTRIES = 2000\n\n/** Placeholder so an empty text (or a trailing newline) still occupies one line. */\nconst ZERO_WIDTH_SPACE = \"\\u200b\"\n\n/** Text exactly as the static label / measuring element must render it to occupy the right box. */\nexport function toDisplayText(text: string): string {\n if (text.length === 0) return ZERO_WIDTH_SPACE\n return text.endsWith(\"\\n\") ? text + ZERO_WIDTH_SPACE : text\n}\n\n/**\n * Measures runs of text with a hidden DOM element, mirroring the CSS the\n * `<TextLabel>` component uses (pre-wrap + break-word, border-box padding).\n * Falls back to `estimateTextSize` where no `document` exists (tests, SSR).\n */\nexport class TextMeasure {\n private element: HTMLDivElement | null = null\n private readonly cache = new Map<string, TextMeasurement>()\n\n measureText(text: string, opts: TextMeasureOptions): TextMeasurement {\n const key = cacheKey(text, opts)\n const hit = this.cache.get(key)\n if (hit) return hit\n const result = typeof document === \"undefined\" ? this.estimate(text, opts) : this.measureDom(text, opts)\n if (this.cache.size >= MAX_CACHE_ENTRIES) {\n const oldest = this.cache.keys().next().value\n if (oldest !== undefined) this.cache.delete(oldest)\n }\n this.cache.set(key, result)\n return result\n }\n\n /** Number of cached measurements (for tests and debugging). */\n get cacheSize(): number {\n return this.cache.size\n }\n\n clearCache(): void {\n this.cache.clear()\n }\n\n dispose(): void {\n this.cache.clear()\n this.element?.remove()\n this.element = null\n }\n\n private estimate(text: string, opts: TextMeasureOptions): TextMeasurement {\n const padding = opts.padding ?? 0\n const inner = opts.maxWidth === undefined ? Infinity : Math.max(1, opts.maxWidth - padding * 2)\n const est = estimateTextSize(text, opts.fontSize, inner)\n return {\n w: est.w + padding * 2,\n h: est.lines * opts.fontSize * opts.lineHeight + padding * 2,\n lineCount: est.lines,\n }\n }\n\n private measureDom(text: string, opts: TextMeasureOptions): TextMeasurement {\n const el = this.getElement()\n const padding = opts.padding ?? 0\n const s = el.style\n s.fontFamily = opts.fontFamily\n s.fontSize = `${opts.fontSize}px`\n s.fontWeight = opts.fontWeight === undefined ? \"normal\" : String(opts.fontWeight)\n s.lineHeight = String(opts.lineHeight)\n s.padding = `${padding}px`\n s.maxWidth = opts.maxWidth === undefined ? \"none\" : `${Math.max(1, opts.maxWidth)}px`\n el.textContent = toDisplayText(text)\n const rect = el.getBoundingClientRect()\n const lineHeightPx = opts.fontSize * opts.lineHeight\n const contentH = Math.max(0, rect.height - padding * 2)\n const lineCount = lineHeightPx > 0 ? Math.max(1, Math.round(contentH / lineHeightPx)) : 1\n // Round up so a label sized from the result never wraps differently than the probe.\n return { w: Math.ceil(rect.width * 100) / 100, h: Math.ceil(rect.height * 100) / 100, lineCount }\n }\n\n private getElement(): HTMLDivElement {\n if (this.element && this.element.isConnected) return this.element\n const el = document.createElement(\"div\")\n el.setAttribute(\"aria-hidden\", \"true\")\n el.className = \"mocanvas-text-measure\"\n Object.assign(el.style, {\n position: \"fixed\",\n top: \"-10000px\",\n left: \"-10000px\",\n visibility: \"hidden\",\n pointerEvents: \"none\",\n whiteSpace: \"pre-wrap\",\n overflowWrap: \"break-word\",\n wordBreak: \"normal\",\n width: \"max-content\",\n boxSizing: \"border-box\",\n margin: \"0\",\n border: \"0\",\n zIndex: \"-1\",\n } satisfies Partial<CSSStyleDeclaration>)\n document.body.appendChild(el)\n this.element = el\n return el\n }\n}\n\nfunction cacheKey(text: string, o: TextMeasureOptions): string {\n return `${o.fontFamily}|${o.fontSize}|${o.fontWeight ?? \"\"}|${o.lineHeight}|${o.maxWidth ?? \"\"}|${o.padding ?? 0}|${text}`\n}\n\nlet singleton: TextMeasure | null = null\n\n/** The shared measurer. */\nexport function getTextMeasure(): TextMeasure {\n if (!singleton) singleton = new TextMeasure()\n return singleton\n}\n","import { useEditor, type DefaultFontStyle, type DefaultHorizontalAlignStyle, type DefaultVerticalAlignStyle, type UnknownShape } from \"@mocanvas/editor\"\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState, type CSSProperties, type KeyboardEvent, type ReactNode } from \"react\"\nimport { getFontFamily } from \"../shapes/shape-theme\"\nimport { LINE_HEIGHT } from \"../shapes/text-helpers\"\nimport { toDisplayText } from \"./TextMeasure\"\n\nexport interface TextLabelProps {\n shape: UnknownShape\n text: string\n isEditing: boolean\n font: DefaultFontStyle\n fontSize: number\n /** CSS color of the text. */\n color: string\n align: DefaultHorizontalAlignStyle\n verticalAlign: DefaultVerticalAlignStyle\n /** Soft-wrap at `width`. When false the label only breaks at explicit newlines. */\n wrap: boolean\n /** Box the label is laid out in, in shape-local px. Omit for an intrinsically sized label. */\n width?: number\n height?: number\n /** Padding on every side of the text, in px (default 0). */\n padding?: number\n /** Shown in place of an empty label when not editing. */\n placeholder?: string\n /** Single-line labels commit on Enter and never contain newlines (frame names). */\n singleLine?: boolean\n /** Called with the new text; at most once per animation frame while typing. */\n onChange(text: string): void\n}\n\nexport function alignToJustify(align: DefaultHorizontalAlignStyle): CSSProperties[\"justifyContent\"] {\n switch (align) {\n case \"start\":\n case \"start-legacy\":\n return \"flex-start\"\n case \"end\":\n case \"end-legacy\":\n return \"flex-end\"\n default:\n return \"center\"\n }\n}\n\nexport function alignToTextAlign(align: DefaultHorizontalAlignStyle): CSSProperties[\"textAlign\"] {\n switch (align) {\n case \"start\":\n case \"start-legacy\":\n return \"left\"\n case \"end\":\n case \"end-legacy\":\n return \"right\"\n default:\n return \"center\"\n }\n}\n\nexport function verticalAlignToAlignItems(align: DefaultVerticalAlignStyle): CSSProperties[\"alignItems\"] {\n switch (align) {\n case \"start\":\n return \"flex-start\"\n case \"end\":\n return \"flex-end\"\n default:\n return \"center\"\n }\n}\n\n/** Upper bound between a keystroke and its store write when animation frames are paused. */\nconst FLUSH_FALLBACK_MS = 32\n\nconst stop = (e: { stopPropagation(): void }) => {\n e.stopPropagation()\n}\n\n/**\n * A shape's text label. Static text when idle; while editing, a plain-text\n * `<textarea>` overlays an invisible copy of the text so the box keeps the\n * exact size the static label would have.\n */\nexport function TextLabel(props: TextLabelProps): ReactNode {\n const { text, isEditing, font, fontSize, color, align, verticalAlign, wrap, width, height, padding = 0, placeholder, singleLine } = props\n\n const textStyle: CSSProperties = {\n position: \"relative\",\n fontFamily: getFontFamily(font),\n fontSize,\n fontWeight: \"normal\",\n lineHeight: LINE_HEIGHT,\n color,\n textAlign: alignToTextAlign(align),\n whiteSpace: wrap ? \"pre-wrap\" : \"pre\",\n overflowWrap: wrap ? \"break-word\" : \"normal\",\n wordBreak: \"normal\",\n padding,\n boxSizing: \"border-box\",\n maxWidth: \"100%\",\n minWidth: isEditing ? fontSize + padding * 2 : undefined,\n width: wrap ? \"100%\" : undefined,\n margin: 0,\n }\n\n const outerStyle: CSSProperties = {\n position: \"absolute\",\n left: 0,\n top: 0,\n width: width ?? \"max-content\",\n height: height ?? \"auto\",\n display: \"flex\",\n justifyContent: alignToJustify(align),\n alignItems: verticalAlignToAlignItems(verticalAlign),\n pointerEvents: isEditing ? \"auto\" : \"none\",\n userSelect: isEditing ? \"text\" : \"none\",\n WebkitUserSelect: isEditing ? \"text\" : \"none\",\n }\n\n if (!isEditing) {\n const shown = text.length === 0 && placeholder ? placeholder : toDisplayText(text)\n return (\n <div className=\"mocanvas-text-label\" style={outerStyle}>\n <div style={{ ...textStyle, opacity: text.length === 0 && placeholder ? 0.5 : 1 }}>{shown}</div>\n </div>\n )\n }\n\n return (\n <div className=\"mocanvas-text-label mocanvas-text-label-editing\" style={outerStyle}>\n <TextEditor {...props} textStyle={textStyle} singleLine={singleLine ?? false} />\n </div>\n )\n}\n\ninterface TextEditorProps extends TextLabelProps {\n textStyle: CSSProperties\n singleLine: boolean\n}\n\nfunction TextEditor({ text, onChange, textStyle, singleLine, wrap, color }: TextEditorProps): ReactNode {\n const editor = useEditor()\n const ref = useRef<HTMLTextAreaElement>(null)\n const [value, setValue] = useState(text)\n const valueRef = useRef(text)\n const pendingRef = useRef<string | null>(null)\n const rafRef = useRef(0)\n const timerRef = useRef(0)\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n const flush = useCallback(() => {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current)\n rafRef.current = 0\n }\n if (timerRef.current) {\n clearTimeout(timerRef.current)\n timerRef.current = 0\n }\n if (pendingRef.current !== null) {\n const next = pendingRef.current\n pendingRef.current = null\n onChangeRef.current(next)\n }\n }, [])\n\n const commit = useCallback(\n (next: string) => {\n valueRef.current = next\n setValue(next)\n pendingRef.current = next\n // One store write per frame; the timer covers hidden tabs where rAF is paused.\n if (!rafRef.current) rafRef.current = requestAnimationFrame(flush)\n if (!timerRef.current) timerRef.current = window.setTimeout(flush, FLUSH_FALLBACK_MS)\n },\n [flush],\n )\n\n // External changes (undo, collaboration) while nothing is pending.\n useEffect(() => {\n if (pendingRef.current === null && text !== valueRef.current) {\n valueRef.current = text\n setValue(text)\n }\n }, [text])\n\n // Focus with the caret at the end on mount; flush on unmount.\n useLayoutEffect(() => {\n const el = ref.current\n if (el) {\n el.focus({ preventScroll: true })\n const end = el.value.length\n el.setSelectionRange(end, end)\n }\n return () => flush()\n }, [flush])\n\n const finish = useCallback(() => {\n flush()\n editor.setEditingShape(null)\n editor.complete()\n }, [editor, flush])\n\n const onKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n e.stopPropagation()\n if (e.key === \"Escape\") {\n e.preventDefault()\n finish()\n return\n }\n if (e.key === \"Tab\") {\n e.preventDefault()\n return\n }\n if (e.key === \"Enter\" && singleLine && !e.shiftKey) {\n e.preventDefault()\n finish()\n }\n }\n\n const displayed = toDisplayText(value)\n\n return (\n <div style={textStyle} onPointerDown={stop} onPointerMove={stop} onPointerUp={stop}>\n {/* Invisible copy of the text keeps the box sized exactly like the static label. */}\n <div aria-hidden=\"true\" style={{ visibility: \"hidden\", pointerEvents: \"none\" }}>\n {displayed}\n </div>\n <textarea\n ref={ref}\n className=\"mocanvas-text-editor\"\n value={value}\n rows={1}\n wrap={wrap ? \"soft\" : \"off\"}\n spellCheck={false}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n data-gramm=\"false\"\n onChange={(e) => {\n const raw = e.currentTarget.value\n commit(singleLine ? raw.replace(/[\\r\\n]+/g, \"\") : raw)\n }}\n onBlur={flush}\n onKeyDown={onKeyDown}\n onKeyUp={stop}\n onPointerDown={stop}\n onPointerMove={stop}\n onPointerUp={stop}\n onContextMenu={stop}\n style={{\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n display: \"block\",\n margin: 0,\n border: \"none\",\n outline: \"none\",\n background: \"transparent\",\n resize: \"none\",\n overflow: \"hidden\",\n boxSizing: \"border-box\",\n padding: textStyle.padding,\n fontFamily: textStyle.fontFamily,\n fontSize: textStyle.fontSize,\n fontWeight: textStyle.fontWeight,\n lineHeight: textStyle.lineHeight,\n color,\n caretColor: color,\n textAlign: textStyle.textAlign,\n whiteSpace: textStyle.whiteSpace,\n overflowWrap: textStyle.overflowWrap,\n wordBreak: textStyle.wordBreak,\n letterSpacing: \"inherit\",\n userSelect: \"text\",\n WebkitUserSelect: \"text\",\n pointerEvents: \"auto\",\n cursor: \"text\",\n touchAction: \"auto\",\n }}\n />\n </div>\n )\n}\n","/** Pure text layout helpers shared by the label-bearing shapes. DOM-free so they are testable in Node. */\n\nimport type { DefaultFontStyle } from \"@mocanvas/editor\"\nimport { getFontFamily } from \"../shapes/shape-theme\"\nimport { LINE_HEIGHT } from \"../shapes/text-helpers\"\nimport { getTextMeasure, type TextMeasurement } from \"./TextMeasure\"\n\n/**\n * Extra height a box needs so its label fits: `labelHeight - boxHeight`,\n * never negative. `growY` is stored on the shape and added to `h`.\n */\nexport function computeGrowY(labelHeight: number, boxHeight: number): number {\n if (!Number.isFinite(labelHeight) || !Number.isFinite(boxHeight)) return 0\n return Math.max(0, labelHeight - boxHeight)\n}\n\n/** Trim whitespace at the end of a label (kept inside the run, e.g. indentation on later lines). */\nexport function trimTrailingWhitespace(text: string): string {\n return text.replace(/\\s+$/u, \"\")\n}\n\nexport interface LabelMeasureOptions {\n font: DefaultFontStyle\n fontSize: number\n /** Wrap width in px including padding; omit for no soft wrapping. */\n maxWidth?: number\n padding?: number\n}\n\n/** Measure a shape label with the shared measurer using the default label typography. */\nexport function measureLabel(text: string, opts: LabelMeasureOptions): TextMeasurement {\n return getTextMeasure().measureText(text, {\n fontFamily: getFontFamily(opts.font),\n fontSize: opts.fontSize,\n lineHeight: LINE_HEIGHT,\n ...(opts.maxWidth === undefined ? {} : { maxWidth: opts.maxWidth }),\n padding: opts.padding ?? 0,\n })\n}\n\n/** Minimum width of an auto-sized text shape so an empty one still shows a caret area. */\nexport const TEXT_SHAPE_MIN_WIDTH = 8\n\nexport interface TextShapeSizeInput {\n text: string\n font: DefaultFontStyle\n fontSize: number\n autoSize: boolean\n /** Current wrap width, used when `autoSize` is off. */\n w: number\n}\n\n/** Width and height of a text shape: measured (auto-size) or wrapped at `w`. */\nexport function getTextShapeSize(input: TextShapeSizeInput): { w: number; h: number; lineCount: number } {\n const { text, font, fontSize, autoSize, w } = input\n if (autoSize) {\n const m = measureLabel(text, { font, fontSize })\n return { w: Math.max(TEXT_SHAPE_MIN_WIDTH, m.w), h: m.h, lineCount: m.lineCount }\n }\n const width = Math.max(1, w)\n const m = measureLabel(text, { font, fontSize, maxWidth: width })\n return { w: width, h: m.h, lineCount: m.lineCount }\n}\n","/**\n * Elbow arrow routing.\n *\n * An elbow arrow runs from its start terminal to its end terminal along\n * axis-aligned legs instead of an arc. The route is decided by two axes — the\n * axis the body leaves the start on and the axis it arrives at the end on:\n *\n * - same axis on both ends: three legs (H-V-H or V-H-V), with the middle leg\n * placed at `midPoint` along that axis (0 hard against the start, 1 against\n * the end);\n * - different axes: two legs (an L, H-V or V-H).\n *\n * A free terminal uses the *dominant* axis — whichever of `|dx|` and `|dy|` is\n * larger — so a wide, short arrow leaves horizontally and a tall, narrow one\n * leaves vertically. A bound terminal uses the axis of the bound shape's\n * nearest edge normal (see `getBoundElbowAxes`), so the arrow leaves the shape\n * square-on rather than diagonally.\n *\n * Corners are then rounded with a quarter-turn whose radius is clamped to half\n * of each adjacent leg, so two corners sharing a leg can never overlap.\n */\nimport { Vec, type VecLike } from \"@mocanvas/editor\"\nimport type { ElbowBody } from \"./arrow-helpers\"\n\n/** Which coordinate a leg varies: `\"x\"` for a horizontal leg, `\"y\"` for a vertical one. */\nexport type ElbowAxis = \"x\" | \"y\"\n\nconst EPS = 1e-6\n\n/** Corner radius as a multiple of the stroke width. */\nexport const ELBOW_CORNER_STROKES = 2.5\n\n/** Line segments used to approximate one rounded corner. */\nconst CORNER_SEGMENTS = 4\n\nexport interface ElbowRouteOptions {\n /** Where the middle leg sits along the shared axis, clamped to `0..1`. */\n midPoint?: number\n /** Axis the body must leave the start on; defaults to the dominant axis. */\n startAxis?: ElbowAxis | undefined\n /** Axis the body must arrive at the end on; defaults to the dominant axis. */\n endAxis?: ElbowAxis | undefined\n /** Corner radius before per-corner clamping. */\n cornerRadius?: number\n}\n\nexport interface ElbowRoute {\n /** Corner points from start to end, before the corners are rounded. */\n corners: Vec[]\n /** The drawn polyline: `corners` with each corner replaced by a fillet. */\n points: Vec[]\n /** The middle leg, when the route has one; `null` for an L or a straight run. */\n midLeg: [Vec, Vec] | null\n /** The axis the middle leg slides along, `null` when there is no middle leg. */\n slideAxis: ElbowAxis | null\n}\n\nfunction clamp01(value: number): number {\n return value < 0 ? 0 : value > 1 ? 1 : value\n}\n\n/** The axis a free terminal leaves on: the one the terminals are further apart on. */\nexport function getDominantAxis(start: VecLike, end: VecLike): ElbowAxis {\n return Math.abs(end.x - start.x) >= Math.abs(end.y - start.y) ? \"x\" : \"y\"\n}\n\n/** Drop points that repeat, and points that sit on the straight line between their neighbours. */\nfunction simplify(points: Vec[]): Vec[] {\n const out: Vec[] = []\n for (const p of points) {\n const last = out.at(-1)\n if (last && Vec.Dist2(last, p) < EPS * EPS) continue\n out.push(p)\n }\n for (let i = out.length - 2; i > 0; i--) {\n const a = out[i - 1]!\n const b = out[i]!\n const c = out[i + 1]!\n const cross = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x)\n if (Math.abs(cross) < EPS) out.splice(i, 1)\n }\n return out\n}\n\n/**\n * Round one corner at `p` between `a` and `b` into `CORNER_SEGMENTS` chords of\n * a quarter circle. The radius is clamped to half of each adjacent leg. Corners\n * that are not right angles (which an axis-aligned route never produces) are\n * left sharp.\n */\nfunction roundCorner(a: Vec, p: Vec, b: Vec, radius: number): Vec[] {\n const lenA = Vec.Dist(a, p)\n const lenB = Vec.Dist(b, p)\n const r = Math.min(radius, lenA / 2, lenB / 2)\n if (r < EPS) return [p]\n const da = Vec.Div(Vec.Sub(a, p), lenA)\n const db = Vec.Div(Vec.Sub(b, p), lenB)\n if (Math.abs(Vec.Dot(da, db)) > 1e-3) return [p]\n const from = Vec.Add(p, Vec.Mul(da, r))\n const to = Vec.Add(p, Vec.Mul(db, r))\n // Both legs are unit and perpendicular, so the arc's centre is one radius\n // along each of them.\n const center = Vec.Add(p, Vec.Mul(Vec.Add(da, db), r))\n const a0 = Math.atan2(from.y - center.y, from.x - center.x)\n const a1 = Math.atan2(to.y - center.y, to.x - center.x)\n let sweep = a1 - a0\n while (sweep > Math.PI) sweep -= Math.PI * 2\n while (sweep <= -Math.PI) sweep += Math.PI * 2\n const out: Vec[] = []\n for (let i = 0; i <= CORNER_SEGMENTS; i++) {\n const angle = a0 + (sweep * i) / CORNER_SEGMENTS\n out.push(new Vec(center.x + r * Math.cos(angle), center.y + r * Math.sin(angle)))\n }\n return out\n}\n\n/** `corners` with every interior corner replaced by a fillet of `radius`. */\nexport function roundElbowCorners(corners: Vec[], radius: number): Vec[] {\n if (corners.length < 3 || radius < EPS) return corners.map((p) => p.clone())\n const out: Vec[] = [corners[0]!.clone()]\n for (let i = 1; i < corners.length - 1; i++) {\n for (const p of roundCorner(corners[i - 1]!, corners[i]!, corners[i + 1]!, radius)) out.push(p)\n }\n out.push(corners.at(-1)!.clone())\n return simplify(out)\n}\n\n/**\n * Route an elbow from `start` to `end`. See the module comment for the rule.\n */\nexport function getElbowRoute(start: VecLike, end: VecLike, options: ElbowRouteOptions = {}): ElbowRoute {\n const s = Vec.From(start)\n const e = Vec.From(end)\n const dominant = getDominantAxis(s, e)\n const startAxis = options.startAxis ?? dominant\n const endAxis = options.endAxis ?? dominant\n const t = clamp01(options.midPoint ?? 0.5)\n\n let corners: Vec[]\n let midLeg: [Vec, Vec] | null = null\n let slideAxis: ElbowAxis | null = null\n\n if (startAxis === endAxis) {\n // Three legs: out along the shared axis, across, then in along it again.\n if (startAxis === \"x\") {\n const mx = s.x + (e.x - s.x) * t\n const a = new Vec(mx, s.y)\n const b = new Vec(mx, e.y)\n corners = [s, a, b, e]\n if (Math.abs(e.y - s.y) > EPS) {\n midLeg = [a, b]\n slideAxis = \"x\"\n }\n } else {\n const my = s.y + (e.y - s.y) * t\n const a = new Vec(s.x, my)\n const b = new Vec(e.x, my)\n corners = [s, a, b, e]\n if (Math.abs(e.x - s.x) > EPS) {\n midLeg = [a, b]\n slideAxis = \"y\"\n }\n }\n } else {\n // Two legs: one turn, at the corner the two axes meet in.\n corners = startAxis === \"x\" ? [s, new Vec(e.x, s.y), e] : [s, new Vec(s.x, e.y), e]\n }\n\n const simplified = simplify(corners)\n return {\n corners: simplified,\n points: roundElbowCorners(simplified, options.cornerRadius ?? 0),\n midLeg,\n slideAxis,\n }\n}\n\n/** The elbow body for an arrow: the rounded route as a polyline body. */\nexport function getElbowBody(start: VecLike, end: VecLike, options: ElbowRouteOptions = {}): ElbowBody {\n return { kind: \"elbow\", points: getElbowRoute(start, end, options).points }\n}\n\n/**\n * `elbowMidPoint` for a midpoint handle dragged to `point`: how far along\n * `axis` it sits between the terminals, clamped to `0..1`.\n */\nexport function getElbowMidPointFromPoint(start: VecLike, end: VecLike, point: VecLike, axis: ElbowAxis): number {\n const span = end[axis] - start[axis]\n if (Math.abs(span) < EPS) return 0.5\n return clamp01((point[axis] - start[axis]) / span)\n}\n","/**\n * Tolerant prop reads for the default shape utils.\n *\n * A shape can reach a util with props that do not match its declared shape:\n * a file written by another editor, a record hand-built by an integrator, a\n * partial update. Geometry and rendering must survive that, so the utils read\n * through these helpers rather than trusting the declared types (and rather\n * than sprinkling `?.` and `??` over every access).\n *\n * Each helper takes the shape's props object and returns a usable value of the\n * expected kind, falling back to the util's default when the stored value is\n * missing or of the wrong type.\n */\n\nimport { richTextToPlainText, type EnumStyleProp } from \"@mocanvas/editor\"\n\ntype Props = Record<string, unknown>\n\n/** A shape's props as a bag of unknowns, tolerating a missing or non-object `props`. */\nexport function propsOf(shape: { props?: unknown }): Props {\n const props = shape.props\n return typeof props === \"object\" && props !== null && !Array.isArray(props) ? (props as Props) : {}\n}\n\nexport function readString(props: unknown, key: string, fallback: string): string {\n const value = (props as Props | undefined)?.[key]\n return typeof value === \"string\" ? value : fallback\n}\n\n/** A string prop constrained to a known set; anything else falls back. */\nexport function readEnum<T extends string>(props: unknown, key: string, allowed: readonly T[], fallback: T): T {\n const value = (props as Props | undefined)?.[key]\n return typeof value === \"string\" && (allowed as readonly string[]).includes(value) ? (value as T) : fallback\n}\n\n/** A style prop's value, validated against the style's own set of values. */\nexport function readStyle<T extends string>(props: unknown, key: string, style: EnumStyleProp<T>, fallback: T = style.defaultValue): T {\n return readEnum(props, key, style.values, fallback)\n}\n\nexport function readNumber(props: unknown, key: string, fallback: number): number {\n const value = (props as Props | undefined)?.[key]\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback\n}\n\nexport function readBoolean(props: unknown, key: string, fallback: boolean): boolean {\n const value = (props as Props | undefined)?.[key]\n return typeof value === \"boolean\" ? value : fallback\n}\n\n/**\n * A shape's label. Prefers `props.text`; a record that still carries a\n * rich-text document (one that skipped the load-time normalization) is\n * flattened here so it renders rather than throwing.\n */\nexport function readText(props: unknown, key = \"text\"): string {\n const bag = props as Props | undefined\n const value = bag?.[key]\n if (typeof value === \"string\") return value\n const rich = bag?.[\"richText\"]\n return rich === undefined || rich === null ? \"\" : richTextToPlainText(rich)\n}\n\n/** A `{ x, y }` prop, with each coordinate falling back independently. */\nexport function readPoint(props: unknown, key: string, fallback: { x: number; y: number }): { x: number; y: number } {\n const value = (props as Props | undefined)?.[key]\n if (typeof value !== \"object\" || value === null) return fallback\n return { x: readNumber(value, \"x\", fallback.x), y: readNumber(value, \"y\", fallback.y) }\n}\n\n/** An array prop; a missing or non-array value reads as empty. */\nexport function readArray(props: unknown, key: string): unknown[] {\n const value = (props as Props | undefined)?.[key]\n return Array.isArray(value) ? value : []\n}\n\n/** A record-of-objects prop (a line's points, say); anything else reads as empty. */\nexport function readRecord(props: unknown, key: string): Record<string, unknown> {\n const value = (props as Props | undefined)?.[key]\n return typeof value === \"object\" && value !== null && !Array.isArray(value) ? (value as Record<string, unknown>) : {}\n}\n","import { PATH_OP } from \"@mocanvas/editor\"\n\nfunction num(v: number | undefined): string {\n const n = v ?? 0\n return String(Math.round(n * 100) / 100)\n}\n\n/** Convert the engine's flat path encoding to an SVG `d` attribute (for indicators). */\nexport function pathWordsToSvgD(words: readonly number[]): string {\n const parts: string[] = []\n let i = 0\n while (i < words.length) {\n const op = words[i]\n switch (op) {\n case PATH_OP.MOVE:\n parts.push(`M${num(words[i + 1])} ${num(words[i + 2])}`)\n i += 3\n break\n case PATH_OP.LINE:\n parts.push(`L${num(words[i + 1])} ${num(words[i + 2])}`)\n i += 3\n break\n case PATH_OP.QUAD:\n parts.push(`Q${num(words[i + 1])} ${num(words[i + 2])} ${num(words[i + 3])} ${num(words[i + 4])}`)\n i += 5\n break\n case PATH_OP.CUBIC:\n parts.push(\n `C${num(words[i + 1])} ${num(words[i + 2])} ${num(words[i + 3])} ${num(words[i + 4])} ${num(words[i + 5])} ${num(words[i + 6])}`,\n )\n i += 7\n break\n case PATH_OP.CLOSE:\n parts.push(\"Z\")\n i += 1\n break\n default:\n // Malformed stream: stop rather than emit garbage.\n return parts.join(\" \")\n }\n }\n return parts.join(\" \")\n}\n","import {\n FONT_SIZES,\n Group2d,\n Rectangle2d,\n ShapeUtil,\n STROKE_SIZES,\n Vec,\n DefaultColorStyle,\n DefaultDashStyle,\n DefaultFillStyle,\n DefaultFontStyle,\n DefaultLabelColorStyle,\n DefaultSizeStyle,\n type BaseShape,\n type Geometry2d,\n type ShapeHandle,\n type StyleWords,\n} from \"@mocanvas/editor\"\nimport type { ReactNode } from \"react\"\nimport {\n applyTransform,\n getArrowBindings,\n getArrowBindingTargetAtPoint,\n getArrowTerminalsInArrowSpace,\n getBoundElbowAxes,\n getNormalizedAnchor,\n type ArrowTerminals,\n} from \"../bindings/arrow-terminals\"\nimport type { ArrowBinding, ArrowTerminal } from \"../bindings/ArrowBindingUtil\"\nimport { TextLabel } from \"../text/TextEditor\"\nimport { measureLabel, trimTrailingWhitespace } from \"../text/text-layout\"\nimport {\n bodyToGeometry,\n getArrowBody,\n getArrowheadGeometry,\n getArrowheadInset,\n getArrowheadLength,\n getBendFromPoint,\n getBodyLength,\n getPointOnBody,\n getTangentOnBody,\n shortenBody,\n type ArrowBody,\n type ArrowheadKind,\n} from \"./arrow-helpers\"\nimport { ELBOW_CORNER_STROKES, getElbowMidPointFromPoint, getElbowRoute, type ElbowRoute } from \"./elbow-helpers\"\nimport { propsOf, readEnum, readNumber, readPoint, readStyle, readText } from \"./prop-access\"\nimport { getDashId, getStrokeRgba, getTextCssColor } from \"./shape-theme\"\nimport { pathWordsToSvgD } from \"./svg-path\"\n\nexport type { ArrowheadKind } from \"./arrow-helpers\"\n\nexport interface ArrowShapeProps {\n /**\n * How the body is routed: `\"arc\"` bows from start to end by `bend`,\n * `\"elbow\"` runs in axis-aligned legs (and ignores `bend`).\n */\n kind: ArrowKind\n /** Static start terminal in arrow-local space; ignored while the terminal is bound. */\n start: { x: number; y: number }\n /** Static end terminal in arrow-local space; ignored while the terminal is bound. */\n end: { x: number; y: number }\n bend: number\n /** Where an elbow's middle leg sits along the routing axis, `0..1`; unused by `\"arc\"`. */\n elbowMidPoint: number\n color: DefaultColorStyle\n labelColor: DefaultColorStyle\n fill: DefaultFillStyle\n dash: DefaultDashStyle\n size: DefaultSizeStyle\n arrowheadStart: ArrowheadKind\n arrowheadEnd: ArrowheadKind\n font: DefaultFontStyle\n text: string\n labelPosition: number\n scale: number\n}\n\nexport type ArrowShape = BaseShape<\"arrow\", ArrowShapeProps>\n\nexport const ARROW_LABEL_PADDING = 8\nconst LABEL_PADDING = ARROW_LABEL_PADDING\n\nconst ARROWHEADS = [\"none\", \"arrow\", \"triangle\", \"square\", \"dot\", \"diamond\", \"inverted\", \"bar\", \"pipe\"] as const\n\n/** Routing kinds an arrow can have. */\nexport const ARROW_KINDS = [\"arc\", \"elbow\"] as const\nexport type ArrowKind = (typeof ARROW_KINDS)[number]\n\n/**\n * The shape with every declared prop present and of the declared type. Terminal\n * resolution and binding code read the arrow as a whole, so the normalized copy\n * is a whole shape rather than a loose props bag.\n */\nexport function readArrowShape(shape: ArrowShape): ArrowShape {\n return { ...shape, props: readArrowProps(shape) }\n}\n\n/**\n * `shape.props` with every declared prop present and of the declared type, so\n * geometry and rendering survive a record that arrived without one.\n */\nexport function readArrowProps(shape: { props?: unknown }): ArrowShapeProps {\n const p = propsOf(shape)\n return {\n kind: readEnum(p, \"kind\", ARROW_KINDS, \"arc\"),\n start: readPoint(p, \"start\", { x: 0, y: 0 }),\n end: readPoint(p, \"end\", { x: 2, y: 0 }),\n bend: readNumber(p, \"bend\", 0),\n elbowMidPoint: readNumber(p, \"elbowMidPoint\", 0.5),\n color: readStyle(p, \"color\", DefaultColorStyle),\n labelColor: readStyle(p, \"labelColor\", DefaultLabelColorStyle),\n fill: readStyle(p, \"fill\", DefaultFillStyle),\n dash: readStyle(p, \"dash\", DefaultDashStyle),\n size: readStyle(p, \"size\", DefaultSizeStyle),\n arrowheadStart: readEnum(p, \"arrowheadStart\", ARROWHEADS, \"none\"),\n arrowheadEnd: readEnum(p, \"arrowheadEnd\", ARROWHEADS, \"arrow\"),\n font: readStyle(p, \"font\", DefaultFontStyle),\n text: readText(p),\n labelPosition: readNumber(p, \"labelPosition\", 0.5),\n scale: readNumber(p, \"scale\", 1),\n }\n}\n\nexport class ArrowShapeUtil extends ShapeUtil<ArrowShape> {\n static override type = \"arrow\" as const\n /**\n * `kind` is deliberately not among these. A style is shared across shape\n * types, remembered for the next shape and applied to a whole selection at\n * once; arc-versus-elbow is routing that belongs to the one arrow, and\n * declaring it a style would put it in every mixed selection's shared styles\n * (and in the style panel) with nothing else to share it with.\n */\n static override props = {\n color: DefaultColorStyle,\n labelColor: DefaultLabelColorStyle,\n fill: DefaultFillStyle,\n dash: DefaultDashStyle,\n size: DefaultSizeStyle,\n font: DefaultFontStyle,\n }\n\n getDefaultProps(): ArrowShapeProps {\n return {\n kind: \"arc\",\n start: { x: 0, y: 0 },\n end: { x: 2, y: 0 },\n bend: 0,\n elbowMidPoint: 0.5,\n color: \"black\",\n labelColor: \"black\",\n fill: \"none\",\n dash: \"draw\",\n size: \"m\",\n arrowheadStart: \"none\",\n arrowheadEnd: \"arrow\",\n font: \"draw\",\n text: \"\",\n labelPosition: 0.5,\n scale: 1,\n }\n }\n\n /**\n * The arrow's terminals and the body running between them, in arrow-local\n * space. `\"arc\"` bows by `bend`; `\"elbow\"` routes axis-aligned legs, leaving\n * a bound shape along its nearest edge's normal, with corners rounded in\n * proportion to the stroke. The elbow's route is handed back as well, for the\n * midpoint handle.\n */\n private resolveBody(shape: ArrowShape): { props: ArrowShapeProps; terminals: ArrowTerminals; body: ArrowBody; route: ElbowRoute | null } {\n const normalized = readArrowShape(shape)\n const props = normalized.props\n const terminals = getArrowTerminalsInArrowSpace(this.editor, normalized)\n if (props.kind !== \"elbow\") {\n return { props, terminals, body: getArrowBody(terminals.start, terminals.end, props.bend), route: null }\n }\n const axes = getBoundElbowAxes(this.editor, normalized, terminals)\n const route = getElbowRoute(terminals.start, terminals.end, {\n midPoint: props.elbowMidPoint,\n startAxis: axes.start,\n endAxis: axes.end,\n cornerRadius: STROKE_SIZES[props.size] * props.scale * ELBOW_CORNER_STROKES,\n })\n return { props, terminals, body: { kind: \"elbow\", points: route.points }, route }\n }\n\n getGeometry(shape: ArrowShape): Geometry2d {\n const { props, terminals, body: full } = this.resolveBody(shape)\n const { arrowheadStart, arrowheadEnd, size, scale, text, labelPosition, font } = props\n const { start, end } = terminals\n const strokeWidth = STROKE_SIZES[size] * scale\n const length = getBodyLength(full)\n const headLength = getArrowheadLength(strokeWidth, length)\n const body = shortenBody(full, getArrowheadInset(arrowheadStart, headLength), getArrowheadInset(arrowheadEnd, headLength))\n\n const children: Geometry2d[] = [bodyToGeometry(body)]\n const startHead = getArrowheadGeometry(arrowheadStart, start, Vec.Mul(getTangentOnBody(full, 0), -1), headLength)\n if (startHead) children.push(startHead)\n const endHead = getArrowheadGeometry(arrowheadEnd, end, getTangentOnBody(full, 1), headLength)\n if (endHead) children.push(endHead)\n\n if (text) {\n const m = measureLabel(text, { font, fontSize: FONT_SIZES[size] * scale, padding: LABEL_PADDING * scale })\n const c = getPointOnBody(full, Math.max(0, Math.min(1, labelPosition)))\n children.push(new Rectangle2d({ x: c.x - m.w / 2, y: c.y - m.h / 2, width: m.w, height: m.h, isFilled: false, isLabel: true }))\n }\n return new Group2d({ children })\n }\n\n override getRenderStyle(shape: ArrowShape): StyleWords {\n const { color, dash, size, scale } = readArrowProps(shape)\n const stroke = getStrokeRgba(color)\n // The body is open so it never fills; closed arrowheads fill with the stroke color.\n return { stroke, strokeWidth: STROKE_SIZES[size] * scale, fill: stroke, dash: getDashId(dash), opacity: 1 }\n }\n\n component(shape: ArrowShape): ReactNode {\n const { text, font, size, scale, labelColor, labelPosition } = readArrowProps(shape)\n const isEditing = this.editor.getEditingShapeId() === shape.id\n if (!text && !isEditing) return null\n const c = getPointOnBody(this.resolveBody(shape).body, Math.max(0, Math.min(1, labelPosition)))\n return (\n <div\n style={{\n position: \"absolute\",\n left: c.x,\n top: c.y,\n transform: \"translate(-50%, -50%)\",\n width: \"max-content\",\n pointerEvents: \"none\",\n }}\n >\n <div style={{ position: \"relative\", width: \"max-content\" }}>\n <TextLabel\n shape={shape}\n text={text}\n isEditing={isEditing}\n font={font}\n fontSize={FONT_SIZES[size] * scale}\n color={getTextCssColor(labelColor)}\n align=\"middle\"\n verticalAlign=\"middle\"\n wrap={false}\n padding={LABEL_PADDING * scale}\n onChange={(next) => this.editor.updateShape<ArrowShape>({ id: shape.id, type: \"arrow\", props: { text: next } })}\n />\n </div>\n </div>\n )\n }\n\n indicator(shape: ArrowShape): ReactNode {\n return <path d={pathWordsToSvgD(this.getGeometry(shape).toPathWords())} />\n }\n\n /** The GPU keeps drawing the arrow while its label is edited. */\n override needsOverlay(_shape: ArrowShape): boolean {\n return false\n }\n\n override hasOverlayLabel(shape: ArrowShape): boolean {\n return readText(shape.props).trim().length > 0 || this.editor.getEditingShapeId() === shape.id\n }\n\n override canEdit(_shape: ArrowShape): boolean {\n return true\n }\n\n /** Nothing binds to an arrow (no arrow-to-arrow bindings). */\n override canBind(_opts: { fromShapeType: string; toShapeType: string; bindingType: string }): boolean {\n return false\n }\n\n /** A selected arrow shows its handles instead of a selection box. */\n override hideSelectionBoundsBg(_shape: ArrowShape): boolean {\n return true\n }\n\n override hideSelectionBoundsFg(_shape: ArrowShape): boolean {\n return true\n }\n\n override hideResizeHandles(_shape: ArrowShape): boolean {\n return true\n }\n\n override getText(shape: ArrowShape): string {\n return readText(shape.props)\n }\n\n override onEditEnd(shape: ArrowShape): void {\n const text = readText(shape.props)\n const trimmed = trimTrailingWhitespace(text)\n if (trimmed !== text) this.editor.updateShape<ArrowShape>({ id: shape.id, type: \"arrow\", props: { text: trimmed } })\n }\n\n /**\n * Start and end handles move (and bind) the terminals. Between them sits one\n * virtual handle: an arc's `bend` handle rides the middle of the curve, while\n * an elbow's `midpoint` handle sits on its middle leg and slides that leg.\n * An elbow with no middle leg (an L route, or a straight run) has neither.\n */\n override getHandles(shape: ArrowShape): ShapeHandle[] {\n const { terminals, body, route } = this.resolveBody(shape)\n const { start, end } = terminals\n const handles: ShapeHandle[] = [{ id: \"start\", type: \"vertex\", index: \"a1\", x: start.x, y: start.y }]\n if (route) {\n if (route.midLeg) {\n const mid = Vec.Lrp(route.midLeg[0], route.midLeg[1], 0.5)\n handles.push({ id: \"midpoint\", type: \"virtual\", index: \"a2\", x: mid.x, y: mid.y })\n }\n } else {\n const mid = getPointOnBody(body, 0.5)\n handles.push({ id: \"bend\", type: \"virtual\", index: \"a2\", x: mid.x, y: mid.y })\n }\n handles.push({ id: \"end\", type: \"vertex\", index: \"a3\", x: end.x, y: end.y })\n return handles\n }\n\n override onHandleDrag(shape: ArrowShape, info: { handle: ShapeHandle; isPrecise: boolean; initial?: ArrowShape }): Partial<ArrowShape> | void {\n const { handle } = info\n switch (handle.id) {\n case \"start\":\n case \"end\":\n return this.dragTerminal(shape, handle.id, handle, info.isPrecise)\n case \"bend\": {\n const { start, end } = getArrowTerminalsInArrowSpace(this.editor, readArrowShape(shape))\n return { props: { ...shape.props, bend: getBendFromPoint(start, end, handle) } }\n }\n case \"midpoint\": {\n const { terminals, route } = this.resolveBody(shape)\n if (!route?.slideAxis) return\n const elbowMidPoint = getElbowMidPointFromPoint(terminals.start, terminals.end, handle, route.slideAxis)\n return { props: { ...shape.props, elbowMidPoint } }\n }\n default:\n return\n }\n }\n\n /**\n * Move a terminal handle. When the handle lands on a bindable shape the\n * terminal is bound to it (centered, or at the precise point under the\n * pointer); otherwise any existing binding is dropped. The static point is\n * always written so the arrow renders sensibly if the binding goes away.\n * Holding Ctrl suppresses binding. Targets are found by hit-testing shape\n * geometry directly (not `editor.getShapeAtPoint`) because the engine treats\n * unfilled shapes as hollow, and arrows must bind into hollow shapes too.\n */\n private dragTerminal(shape: ArrowShape, terminal: ArrowTerminal, point: { x: number; y: number }, isPrecise: boolean): Partial<ArrowShape> {\n const editor = this.editor\n const local = { x: point.x, y: point.y }\n const pagePoint = applyTransform(editor.getShapePageTransform(shape), local)\n const existing = getArrowBindings(editor, shape)[terminal]\n\n const target = editor.inputs.ctrlKey ? undefined : getArrowBindingTargetAtPoint(editor, shape, pagePoint)\n\n if (target) {\n const bindingProps: ArrowBinding[\"props\"] = {\n terminal,\n normalizedAnchor: isPrecise ? getNormalizedAnchor(editor, target, pagePoint).toJson() : { x: 0.5, y: 0.5 },\n isPrecise,\n isExact: false,\n }\n if (existing && existing.toId === target.id) {\n editor.updateBinding<ArrowBinding>({ id: existing.id, type: \"arrow\", props: bindingProps })\n } else {\n if (existing) editor.deleteBinding(existing.id)\n editor.createBinding<ArrowBinding>({ type: \"arrow\", fromId: shape.id, toId: target.id, props: bindingProps })\n }\n } else if (existing) {\n editor.deleteBinding(existing.id)\n }\n\n return { props: { ...shape.props, [terminal]: local } }\n }\n\n /**\n * Dragging the arrow on its own detaches it: bindings to shapes that are not\n * part of the selection are dropped and their terminals frozen in place.\n * Bindings to shapes moving along with the arrow are kept.\n */\n override onTranslateStart(shape: ArrowShape): void {\n const editor = this.editor\n const selected = new Set(editor.getSelectedShapeIds())\n const stale = editor.getBindingsFromShape<ArrowBinding>(shape, \"arrow\").filter((b) => !selected.has(b.toId))\n if (stale.length) editor.deleteBindings(stale, { isolateShapes: true })\n }\n}\n","import {\n BaseBoxShapeUtil,\n Rectangle2d,\n type AssetId,\n type BaseShape,\n type BookmarkAsset,\n type Editor,\n type Geometry2d,\n type StyleWords,\n} from \"@mocanvas/editor\"\nimport type { CSSProperties, ReactNode } from \"react\"\nimport { propsOf, readNumber, readString } from \"./prop-access\"\n\nexport interface BookmarkShapeProps {\n w: number\n h: number\n /** The `bookmark` asset holding the scraped preview; `null` when nothing was scraped. */\n assetId: AssetId | null\n /** The page the card points at. Kept on the shape so a card survives a missing asset. */\n url: string\n}\n\nexport type BookmarkShape = BaseShape<\"bookmark\", BookmarkShapeProps>\n\nexport const BOOKMARK_WIDTH = 300\nexport const BOOKMARK_HEIGHT = 320\n\n// ---- card chrome ----------------------------------------------------------\n\nexport const BOOKMARK_FILL = \"#ffffff\"\nexport const BOOKMARK_STROKE = \"#e8e9ea\"\nexport const BOOKMARK_STROKE_WIDTH = 1\nexport const BOOKMARK_RADIUS = 8\n/** The banner strip behind the asset's preview image (and its colour when there is none). */\nexport const BOOKMARK_BANNER_HEIGHT = 160\nexport const BOOKMARK_BANNER_FILL = \"#eceff3\"\nexport const BOOKMARK_PADDING = 12\nexport const BOOKMARK_GAP = 6\nexport const BOOKMARK_TITLE_HEIGHT = 38\nexport const BOOKMARK_META_HEIGHT = 16\nexport const BOOKMARK_FAVICON_SIZE = 14\nexport const BOOKMARK_TITLE_FONT_SIZE = 14\nexport const BOOKMARK_TEXT_FONT_SIZE = 12\nexport const BOOKMARK_META_FONT_SIZE = 11\nexport const BOOKMARK_TITLE_COLOR = \"#1d1d1d\"\nexport const BOOKMARK_TEXT_COLOR = \"#666666\"\nexport const BOOKMARK_META_COLOR = \"#8f8f8f\"\n/** Body left under the banner even on a short card, so the text never disappears. */\nexport const BOOKMARK_MIN_BODY_HEIGHT = 80\n\n/** A rectangle in shape-local space. */\nexport interface BookmarkRect {\n x: number\n y: number\n w: number\n h: number\n}\n\n/** Where each part of the card sits, in shape-local space. Shared by the overlay and the SVG export. */\nexport interface BookmarkLayout {\n banner: BookmarkRect\n title: BookmarkRect\n description: BookmarkRect\n favicon: BookmarkRect\n hostname: BookmarkRect\n}\n\nexport function getBookmarkLayout(w: number, h: number): BookmarkLayout {\n const pad = BOOKMARK_PADDING\n const innerW = Math.max(0, w - pad * 2)\n const bannerH = Math.max(0, Math.min(BOOKMARK_BANNER_HEIGHT, h - BOOKMARK_MIN_BODY_HEIGHT))\n // The host line is placed from the bottom up and the title is what gives way\n // when the card is short, so a resized card loses its description first and\n // still reads as a link to somewhere.\n const metaY = Math.max(bannerH, h - pad - BOOKMARK_META_HEIGHT)\n const titleY = bannerH + pad\n const titleH = Math.max(0, Math.min(BOOKMARK_TITLE_HEIGHT, metaY - BOOKMARK_GAP - titleY))\n const descY = titleY + titleH + BOOKMARK_GAP\n const clamp = (r: BookmarkRect): BookmarkRect => {\n const x = Math.max(0, Math.min(r.x, w))\n const y = Math.max(0, Math.min(r.y, h))\n return { x, y, w: Math.max(0, Math.min(r.w, w - x)), h: Math.max(0, Math.min(r.h, h - y)) }\n }\n return {\n banner: clamp({ x: 0, y: 0, w, h: bannerH }),\n title: clamp({ x: pad, y: titleY, w: innerW, h: titleH }),\n description: clamp({ x: pad, y: descY, w: innerW, h: metaY - BOOKMARK_GAP - descY }),\n favicon: clamp({\n x: pad,\n y: metaY + (BOOKMARK_META_HEIGHT - BOOKMARK_FAVICON_SIZE) / 2,\n w: BOOKMARK_FAVICON_SIZE,\n h: BOOKMARK_FAVICON_SIZE,\n }),\n hostname: clamp({\n x: pad + BOOKMARK_FAVICON_SIZE + BOOKMARK_GAP,\n y: metaY,\n w: innerW - BOOKMARK_FAVICON_SIZE - BOOKMARK_GAP,\n h: BOOKMARK_META_HEIGHT,\n }),\n }\n}\n\n/**\n * The host a bookmark points at, without a `www.` prefix — the one line of a\n * link card that is always available, since it comes from the shape's own url\n * rather than from a scrape. An unparseable url reads as `\"\"`.\n */\nexport function getBookmarkHostname(url: string): string {\n if (!url) return \"\"\n try {\n const host = new URL(url).hostname.toLowerCase()\n return host.startsWith(\"www.\") ? host.slice(4) : host\n } catch {\n return \"\"\n }\n}\n\n/** The shape's `bookmark` asset, or `null` when it has none (or one of another type). */\nexport function getBookmarkAsset(editor: Editor, shape: BookmarkShape): BookmarkAsset | null {\n const assetId = readString(propsOf(shape), \"assetId\", \"\") as AssetId | \"\"\n if (!assetId) return null\n const asset = editor.getAsset<BookmarkAsset>(assetId)\n return asset && asset.type === \"bookmark\" ? asset : null\n}\n\n/** Everything the card draws, with each field falling back to something renderable. */\nexport interface BookmarkCard {\n title: string\n description: string\n image: string\n favicon: string\n hostname: string\n url: string\n /** Whether the card has a scraped asset behind it; `false` renders the placeholder. */\n hasAsset: boolean\n}\n\nexport function getBookmarkCard(editor: Editor, shape: BookmarkShape): BookmarkCard {\n const url = readString(propsOf(shape), \"url\", \"\")\n const asset = getBookmarkAsset(editor, shape)\n const props = asset ? (asset.props as Partial<BookmarkAsset[\"props\"]>) : undefined\n return {\n title: readString(props, \"title\", \"\"),\n description: readString(props, \"description\", \"\"),\n image: readString(props, \"image\", \"\"),\n favicon: readString(props, \"favicon\", \"\"),\n hostname: getBookmarkHostname(url) || getBookmarkHostname(readString(props, \"src\", \"\") ?? \"\"),\n url,\n hasAsset: asset !== null,\n }\n}\n\nfunction readBookmarkBox(shape: { props?: unknown }): { w: number; h: number } {\n const p = propsOf(shape)\n return { w: readNumber(p, \"w\", BOOKMARK_WIDTH), h: readNumber(p, \"h\", BOOKMARK_HEIGHT) }\n}\n\nconst ELLIPSIS: CSSProperties = { overflow: \"hidden\", textOverflow: \"ellipsis\" }\n\nexport class BookmarkShapeUtil extends BaseBoxShapeUtil<BookmarkShape> {\n static override type = \"bookmark\" as const\n\n getDefaultProps(): BookmarkShapeProps {\n return { w: BOOKMARK_WIDTH, h: BOOKMARK_HEIGHT, assetId: null, url: \"\" }\n }\n\n getGeometry(shape: BookmarkShape): Geometry2d {\n const { w, h } = readBookmarkBox(shape)\n return new Rectangle2d({ width: Math.max(1, w), height: Math.max(1, h), isFilled: true })\n }\n\n /**\n * The card is html — a banner image over wrapped, ellipsised text — which no\n * single textured quad can stand in for, so the shape always renders through\n * the DOM overlay.\n */\n override getRenderStyle(_shape: BookmarkShape): StyleWords | null {\n return null\n }\n\n component(shape: BookmarkShape): ReactNode {\n const { w, h } = readBookmarkBox(shape)\n const card = getBookmarkCard(this.editor, shape)\n const layout = getBookmarkLayout(w, h)\n const isEditing = this.editor.getEditingShapeId() === shape.id\n const frame: CSSProperties = {\n position: \"absolute\",\n left: 0,\n top: 0,\n width: w,\n height: h,\n boxSizing: \"border-box\",\n overflow: \"hidden\",\n borderRadius: BOOKMARK_RADIUS,\n background: BOOKMARK_FILL,\n border: `${BOOKMARK_STROKE_WIDTH}px solid ${BOOKMARK_STROKE}`,\n fontFamily: 'system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n /*\n * The canvas owns the pointer: a card is a shape you drag and select,\n * not a link you click. The url is still in the DOM as an `<a>` so\n * assistive tech can read and follow it, but it only takes the pointer\n * while the shape is being edited.\n */\n pointerEvents: isEditing ? \"auto\" : \"none\",\n userSelect: \"none\",\n }\n return (\n <a\n href={card.url || undefined}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n draggable={false}\n aria-label={card.title || card.hostname || card.url || \"bookmark\"}\n tabIndex={isEditing ? 0 : -1}\n style={{ ...frame, display: \"block\", color: \"inherit\", textDecoration: \"none\" }}\n >\n {card.hasAsset ? this.renderCard(card, layout) : this.renderPlaceholder(card, layout)}\n </a>\n )\n }\n\n /** The scraped card: banner, title, description, favicon and host. */\n private renderCard(card: BookmarkCard, layout: BookmarkLayout): ReactNode {\n return (\n <>\n <div style={{ position: \"absolute\", ...layout.banner, background: BOOKMARK_BANNER_FILL, overflow: \"hidden\" }}>\n {card.image ? (\n <img\n src={card.image}\n alt=\"\"\n draggable={false}\n style={{ width: \"100%\", height: \"100%\", objectFit: \"cover\", pointerEvents: \"none\" }}\n />\n ) : null}\n </div>\n <div\n style={{\n position: \"absolute\",\n ...layout.title,\n ...ELLIPSIS,\n fontSize: BOOKMARK_TITLE_FONT_SIZE,\n fontWeight: 600,\n lineHeight: 1.3,\n color: BOOKMARK_TITLE_COLOR,\n }}\n >\n {card.title}\n </div>\n <div\n style={{\n position: \"absolute\",\n ...layout.description,\n ...ELLIPSIS,\n fontSize: BOOKMARK_TEXT_FONT_SIZE,\n lineHeight: 1.4,\n color: BOOKMARK_TEXT_COLOR,\n }}\n >\n {card.description}\n </div>\n {card.favicon ? (\n <img\n src={card.favicon}\n alt=\"\"\n draggable={false}\n style={{ position: \"absolute\", ...layout.favicon, objectFit: \"contain\", pointerEvents: \"none\" }}\n />\n ) : null}\n <div\n style={{\n position: \"absolute\",\n ...layout.hostname,\n ...ELLIPSIS,\n whiteSpace: \"nowrap\",\n fontSize: BOOKMARK_META_FONT_SIZE,\n lineHeight: `${BOOKMARK_META_HEIGHT}px`,\n color: BOOKMARK_META_COLOR,\n }}\n >\n {card.hostname}\n </div>\n </>\n )\n }\n\n /** No asset: an empty banner and the host, so the shape still reads as a link to somewhere. */\n private renderPlaceholder(card: BookmarkCard, layout: BookmarkLayout): ReactNode {\n return (\n <>\n <div style={{ position: \"absolute\", ...layout.banner, background: BOOKMARK_BANNER_FILL }} />\n <div\n style={{\n position: \"absolute\",\n ...layout.title,\n ...ELLIPSIS,\n fontSize: BOOKMARK_TITLE_FONT_SIZE,\n lineHeight: 1.3,\n color: BOOKMARK_META_COLOR,\n }}\n >\n {card.hostname || card.url}\n </div>\n </>\n )\n }\n\n indicator(shape: BookmarkShape): ReactNode {\n const { w, h } = readBookmarkBox(shape)\n return <rect width={w} height={h} rx={BOOKMARK_RADIUS} />\n }\n}\n","import { BaseBoxShapeUtil, Rectangle2d, type BaseShape, type Geometry2d, type StyleWords } from \"@mocanvas/editor\"\nimport type { CSSProperties, ReactNode } from \"react\"\nimport { propsOf, readNumber, readString } from \"./prop-access\"\n\nexport interface EmbedShapeProps {\n w: number\n h: number\n /** The page being embedded, as the document stored it (not the iframe's src). */\n url: string\n}\n\nexport type EmbedShape = BaseShape<\"embed\", EmbedShapeProps>\n\nexport const EMBED_WIDTH = 720\nexport const EMBED_HEIGHT = 500\n\nexport const EMBED_PLACEHOLDER_FILL = \"#f5f6f8\"\nexport const EMBED_PLACEHOLDER_STROKE = \"#9fa8b2\"\nexport const EMBED_PLACEHOLDER_TEXT = \"#5f6670\"\nexport const EMBED_PLACEHOLDER_FONT_SIZE = 13\nexport const EMBED_PLACEHOLDER_PADDING = 16\nexport const EMBED_RADIUS = 6\n\n/**\n * The sandbox an embedded page runs in. Scripts and same-origin are what makes\n * a player work at all; popups let a \"watch on the site\" button escape. Nothing\n * else is granted — no forms, no top-level navigation, no pointer lock.\n */\nexport const EMBED_SANDBOX = \"allow-scripts allow-same-origin allow-popups\"\n\n// ---- the permit list ------------------------------------------------------\n\n/**\n * One embeddable service: the exact hosts it is recognised by, and how one of\n * its page urls becomes an embeddable one.\n *\n * `hostnames` are matched exactly (case-insensitively, with a leading `www.`\n * ignored), never as a suffix — `youtube.com.evil.test` is a different host and\n * is not on the list. `toEmbedUrl` receives the parsed url and returns an\n * absolute `https:` url, or `null` when this particular page of the service is\n * not embeddable (a channel page rather than a video, say).\n */\nexport interface EmbedDefinition {\n /** Stable id for the service, e.g. `\"youtube\"`. */\n type: string\n /** Human-readable name, shown on the placeholder card. */\n title: string\n hostnames: readonly string[]\n toEmbedUrl(url: URL): string | null\n}\n\n/** A url that matched the permit list. */\nexport interface EmbedMatch {\n definition: EmbedDefinition\n /** Absolute `https:` url for the iframe's `src`. */\n embedUrl: string\n}\n\n/** `https://` + host + path + query + hash of an already-permitted url, forcing the scheme. */\nfunction httpsUrl(host: string, url: URL, opts: { hash?: boolean } = {}): string {\n return `https://${host}${url.pathname}${url.search}${opts.hash ? url.hash : \"\"}`\n}\n\n/** A youtube video id: the opaque token youtube itself uses, nothing path-like. */\nfunction youTubeId(candidate: string | undefined | null): string | null {\n return candidate && /^[A-Za-z0-9_-]{6,20}$/.test(candidate) ? candidate : null\n}\n\nconst youtube: EmbedDefinition = {\n type: \"youtube\",\n title: \"YouTube\",\n hostnames: [\"youtube.com\", \"m.youtube.com\", \"youtube-nocookie.com\", \"youtu.be\"],\n toEmbedUrl(url) {\n const segments = url.pathname.split(\"/\").filter(Boolean)\n const host = url.hostname.toLowerCase().replace(/^www\\./, \"\")\n const id =\n host === \"youtu.be\"\n ? youTubeId(segments[0])\n : youTubeId(url.searchParams.get(\"v\")) ??\n (segments[0] === \"embed\" || segments[0] === \"shorts\" || segments[0] === \"live\" ? youTubeId(segments[1]) : null)\n // The no-cookie host is the same player without the tracking cookie.\n return id ? `https://www.youtube-nocookie.com/embed/${id}` : null\n },\n}\n\nconst vimeo: EmbedDefinition = {\n type: \"vimeo\",\n title: \"Vimeo\",\n hostnames: [\"vimeo.com\", \"player.vimeo.com\"],\n toEmbedUrl(url) {\n const id = url.pathname.split(\"/\").filter(Boolean).find((s) => /^\\d{6,12}$/.test(s))\n return id ? `https://player.vimeo.com/video/${id}` : null\n },\n}\n\nconst codesandbox: EmbedDefinition = {\n type: \"codesandbox\",\n title: \"CodeSandbox\",\n hostnames: [\"codesandbox.io\"],\n toEmbedUrl(url) {\n const segments = url.pathname.split(\"/\").filter(Boolean)\n // `/s/<id>`, `/embed/<id>` and `/p/sandbox/<id>` all name the same sandbox.\n const id = segments[0] === \"p\" && segments[1] === \"sandbox\" ? segments[2] : segments[0] === \"s\" || segments[0] === \"embed\" ? segments[1] : null\n return id && /^[A-Za-z0-9_-]{3,64}$/.test(id) ? `https://codesandbox.io/embed/${id}` : null\n },\n}\n\nconst figma: EmbedDefinition = {\n type: \"figma\",\n title: \"Figma\",\n hostnames: [\"figma.com\"],\n toEmbedUrl(url) {\n // Figma's viewer takes the file url as a parameter rather than a path.\n const target = `https://www.figma.com${url.pathname}${url.search}`\n return `https://www.figma.com/embed?embed_host=mocanvas&url=${encodeURIComponent(target)}`\n },\n}\n\nconst googleMaps: EmbedDefinition = {\n type: \"google-maps\",\n title: \"Google Maps\",\n hostnames: [\"google.com\", \"maps.google.com\"],\n toEmbedUrl(url) {\n if (!url.pathname.startsWith(\"/maps\")) return null\n if (url.pathname.startsWith(\"/maps/embed\")) return httpsUrl(\"www.google.com\", url)\n const params = new URLSearchParams(url.search)\n params.set(\"output\", \"embed\")\n return `https://www.google.com/maps?${params.toString()}`\n },\n}\n\nconst excalidraw: EmbedDefinition = {\n type: \"excalidraw\",\n title: \"Excalidraw\",\n hostnames: [\"excalidraw.com\"],\n // The scene lives in the fragment (`#json=`, `#room=`), so it has to survive.\n toEmbedUrl: (url) => httpsUrl(\"excalidraw.com\", url, { hash: true }),\n}\n\n/** The services recognised out of the box. */\nexport const DEFAULT_EMBED_DEFINITIONS: readonly EmbedDefinition[] = [youtube, vimeo, codesandbox, figma, googleMaps, excalidraw]\n\n/**\n * The permit list `getEmbedDefinition` consults. It starts as the defaults and\n * is meant to be extended by the app:\n *\n * ```ts\n * embedDefinitions.push({\n * type: \"intranet\",\n * title: \"Intranet\",\n * hostnames: [\"wiki.example.com\"],\n * toEmbedUrl: (url) => `https://wiki.example.com${url.pathname}?embed=1`,\n * })\n * ```\n *\n * Nothing outside the list is ever put in an iframe.\n */\nexport const embedDefinitions: EmbedDefinition[] = [...DEFAULT_EMBED_DEFINITIONS]\n\n/** Hosts are compared case-insensitively, and a leading `www.` never distinguishes one. */\nfunction normalizeHost(hostname: string): string {\n const host = hostname.toLowerCase()\n return host.startsWith(\"www.\") ? host.slice(4) : host\n}\n\n/**\n * The permit-list entry for `url`, with the url to actually put in the iframe,\n * or `null` when the url is not one we embed.\n *\n * Rejects anything that is not `http(s)` (a `javascript:` or `data:` url never\n * reaches an iframe), and matches hosts exactly, so a lookalike host that\n * merely *contains* a permitted one is not embedded.\n */\nexport function getEmbedDefinition(url: string, definitions: readonly EmbedDefinition[] = embedDefinitions): EmbedMatch | null {\n if (typeof url !== \"string\" || url.length === 0) return null\n let parsed: URL\n try {\n parsed = new URL(url)\n } catch {\n return null\n }\n if (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") return null\n const host = normalizeHost(parsed.hostname)\n for (const definition of definitions) {\n if (!definition.hostnames.some((h) => normalizeHost(h) === host)) continue\n const embedUrl = definition.toEmbedUrl(parsed)\n // A permitted host with an unembeddable page falls through to the placeholder.\n if (embedUrl && embedUrl.startsWith(\"https://\")) return { definition, embedUrl }\n return null\n }\n return null\n}\n\nfunction readEmbedBox(shape: { props?: unknown }): { w: number; h: number } {\n const p = propsOf(shape)\n return { w: readNumber(p, \"w\", EMBED_WIDTH), h: readNumber(p, \"h\", EMBED_HEIGHT) }\n}\n\nexport class EmbedShapeUtil extends BaseBoxShapeUtil<EmbedShape> {\n static override type = \"embed\" as const\n\n getDefaultProps(): EmbedShapeProps {\n return { w: EMBED_WIDTH, h: EMBED_HEIGHT, url: \"\" }\n }\n\n getGeometry(shape: EmbedShape): Geometry2d {\n const { w, h } = readEmbedBox(shape)\n return new Rectangle2d({ width: Math.max(1, w), height: Math.max(1, h), isFilled: true })\n }\n\n /** An iframe is not a quad: embeds always render through the DOM overlay. */\n override getRenderStyle(_shape: EmbedShape): StyleWords | null {\n return null\n }\n\n component(shape: EmbedShape): ReactNode {\n const { w, h } = readEmbedBox(shape)\n const url = readString(propsOf(shape), \"url\", \"\")\n const match = getEmbedDefinition(url)\n const box: CSSProperties = {\n position: \"absolute\",\n left: 0,\n top: 0,\n width: w,\n height: h,\n boxSizing: \"border-box\",\n overflow: \"hidden\",\n borderRadius: EMBED_RADIUS,\n }\n if (!match) {\n return (\n <div\n style={{\n ...box,\n background: EMBED_PLACEHOLDER_FILL,\n border: `1px dashed ${EMBED_PLACEHOLDER_STROKE}`,\n padding: EMBED_PLACEHOLDER_PADDING,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n textAlign: \"center\",\n fontFamily: 'system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n fontSize: EMBED_PLACEHOLDER_FONT_SIZE,\n color: EMBED_PLACEHOLDER_TEXT,\n wordBreak: \"break-all\",\n pointerEvents: \"none\",\n userSelect: \"none\",\n }}\n aria-label={url ? `embed: ${url}` : \"embed\"}\n >\n {url || \"No embed url\"}\n </div>\n )\n }\n /*\n * An iframe that takes the pointer swallows the gesture that was meant to\n * pan or select the canvas — the wheel and the drag never reach us. So the\n * frame is inert until the shape is being edited, and the canvas keeps its\n * own gestures the rest of the time.\n */\n const isEditing = this.editor.getEditingShapeId() === shape.id\n return (\n <div style={box}>\n <iframe\n src={match.embedUrl}\n title={`${match.definition.title} embed`}\n width={w}\n height={h}\n sandbox={EMBED_SANDBOX}\n referrerPolicy=\"no-referrer\"\n loading=\"lazy\"\n allowFullScreen\n style={{ display: \"block\", width: \"100%\", height: \"100%\", border: 0, pointerEvents: isEditing ? \"auto\" : \"none\" }}\n />\n </div>\n )\n }\n\n indicator(shape: EmbedShape): ReactNode {\n const { w, h } = readEmbedBox(shape)\n return <rect width={w} height={h} rx={EMBED_RADIUS} />\n }\n\n /** There is nothing to type into an embed; the shape has no text of its own. */\n override canEdit(_shape: EmbedShape): boolean {\n return false\n }\n}\n","import {\n BaseBoxShapeUtil,\n hexToRgba,\n Rectangle2d,\n type BaseShape,\n type DefaultColorStyle,\n type Geometry2d,\n type StyleWords,\n type UnknownShape,\n} from \"@mocanvas/editor\"\nimport type { ReactNode } from \"react\"\nimport { TextLabel } from \"../text/TextEditor\"\nimport { propsOf, readNumber, readString } from \"./prop-access\"\nimport {\n FRAME_FILL,\n FRAME_NAME_COLOR,\n FRAME_NAME_FONT_SIZE,\n FRAME_NAME_HEIGHT,\n FRAME_NAME_OFFSET,\n FRAME_STROKE,\n FRAME_STROKE_WIDTH,\n} from \"./shape-theme\"\n\nexport interface FrameShapeProps {\n w: number\n h: number\n name: string\n color?: DefaultColorStyle\n}\n\nexport type FrameShape = BaseShape<\"frame\", FrameShapeProps>\n\nexport class FrameShapeUtil extends BaseBoxShapeUtil<FrameShape> {\n static override type = \"frame\" as const\n\n getDefaultProps(): FrameShapeProps {\n return { w: 160, h: 90, name: \"\" }\n }\n\n getGeometry(shape: FrameShape): Geometry2d {\n const p = propsOf(shape)\n return new Rectangle2d({ width: readNumber(p, \"w\", 160), height: readNumber(p, \"h\", 90), isFilled: true })\n }\n\n override getRenderStyle(_shape: FrameShape): StyleWords {\n return { fill: hexToRgba(FRAME_FILL), stroke: hexToRgba(FRAME_STROKE), strokeWidth: FRAME_STROKE_WIDTH, dash: 0, opacity: 1 }\n }\n\n component(shape: FrameShape): ReactNode {\n const p = propsOf(shape)\n const name = readString(p, \"name\", \"\")\n const w = readNumber(p, \"w\", 160)\n return (\n <div\n style={{\n position: \"absolute\",\n top: -FRAME_NAME_OFFSET,\n left: 0,\n width: w,\n height: FRAME_NAME_HEIGHT,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n pointerEvents: \"none\",\n }}\n >\n <TextLabel\n shape={shape}\n text={name}\n isEditing={this.editor.getEditingShapeId() === shape.id}\n font=\"sans\"\n fontSize={FRAME_NAME_FONT_SIZE}\n color={FRAME_NAME_COLOR}\n align=\"start\"\n verticalAlign=\"end\"\n wrap={false}\n width={w}\n height={FRAME_NAME_HEIGHT}\n placeholder=\"Frame\"\n singleLine\n onChange={(next) => this.editor.updateShape<FrameShape>({ id: shape.id, type: \"frame\", props: { name: next } })}\n />\n </div>\n )\n }\n\n indicator(shape: FrameShape): ReactNode {\n const p = propsOf(shape)\n return <rect width={readNumber(p, \"w\", 160)} height={readNumber(p, \"h\", 90)} />\n }\n\n /** The GPU draws the frame body while its name is edited. */\n override needsOverlay(_shape: FrameShape): boolean {\n return false\n }\n\n override hasOverlayLabel(_shape: FrameShape): boolean {\n return true\n }\n\n /** Descendants are clipped to the frame's bounds, on the GPU and in the overlay. */\n override isClipShape(_shape: FrameShape): boolean {\n return true\n }\n\n override canEdit(_shape: FrameShape): boolean {\n return true\n }\n\n override canReceiveNewChildrenOfType(_shape: FrameShape, _type: string): boolean {\n return true\n }\n\n override canDropShapes(_shape: FrameShape, _shapes: UnknownShape[]): boolean {\n return true\n }\n\n override getText(shape: FrameShape): string {\n return readString(propsOf(shape), \"name\", \"\")\n }\n\n override onEditEnd(shape: FrameShape): void {\n const name = readString(propsOf(shape), \"name\", \"\")\n const trimmed = name.trim()\n if (trimmed !== name) this.editor.updateShape<FrameShape>({ id: shape.id, type: \"frame\", props: { name: trimmed } })\n }\n}\n","/**\n * Outline math for the `geo` shape. Every polygon is inscribed in the w×h box\n * so that its bounds are exactly the shape's bounds.\n */\nimport {\n CubicSpline2d,\n Ellipse2d,\n Group2d,\n Polygon2d,\n Polyline2d,\n Vec,\n type GeoShapeKind,\n type Geometry2d,\n type VecLike,\n} from \"@mocanvas/editor\"\nimport { arcToCubicSegments, lineSegment, type CubicSegment } from \"./spline-helpers\"\n\nconst TAU = Math.PI * 2\n\n/**\n * Inner radius of the five-pointed star, as a fraction of the outer radius.\n * Measured off a reference render (interior-IoU and outline least-squares fits\n * of the same star both put it at 0.51 ± 0.02, calibrated against a render of\n * known ratio); a plain half reads the same to well under a pixel at any\n * sensible size. A smaller ratio makes the arms too thin.\n */\nexport const STAR_INNER_RATIO = 0.5\n\n/**\n * Angle of the hexagon's first vertex. A vertex sits at the top and one at the\n * bottom, which leaves the left and right sides vertical and running the full\n * width of the box — that is the orientation the reference draws, and it is\n * what `HEXAGON_FLAT_SIDE_SPAN` describes.\n */\nconst HEXAGON_START_ANGLE = -Math.PI / 2\n\n/**\n * Fraction of the box height spanned by the hexagon's two vertical sides. They\n * are centred, so they run from `(1 - span) / 2` to `(1 + span) / 2` of the\n * height, and the distance across them is the full box width.\n */\nexport const HEXAGON_FLAT_SIDE_SPAN = 0.5\n\n/** Affinely stretch points so their bounding box becomes exactly [0,w]×[0,h]. */\nexport function fitPointsToBox(points: readonly VecLike[], w: number, h: number): VecLike[] {\n if (points.length === 0) return []\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const p of points) {\n if (p.x < minX) minX = p.x\n if (p.y < minY) minY = p.y\n if (p.x > maxX) maxX = p.x\n if (p.y > maxY) maxY = p.y\n }\n const sx = maxX - minX > 0 ? w / (maxX - minX) : 0\n const sy = maxY - minY > 0 ? h / (maxY - minY) : 0\n return points.map((p) => ({ x: (p.x - minX) * sx, y: (p.y - minY) * sy }))\n}\n\n/**\n * Regular polygon (or star when `innerRatio` is given) with `sides` outer\n * vertices, first vertex at `startAngle`, stretched to fill the box.\n */\nfunction regularPolygon(sides: number, startAngle: number, w: number, h: number, innerRatio?: number): VecLike[] {\n const count = innerRatio === undefined ? sides : sides * 2\n const raw: VecLike[] = []\n for (let i = 0; i < count; i++) {\n const a = startAngle + (i / count) * TAU\n const r = innerRatio !== undefined && i % 2 === 1 ? innerRatio : 1\n raw.push({ x: Math.cos(a) * r, y: Math.sin(a) * r })\n }\n return fitPointsToBox(raw, w, h)\n}\n\n/** Block arrow pointing +x inside a w×h box (7 vertices). */\nfunction blockArrowRight(w: number, h: number): VecLike[] {\n const headLen = Math.min(w / 2, h / 2)\n const shaftTop = h / 4\n const shaftBottom = (3 * h) / 4\n return [\n { x: 0, y: shaftTop },\n { x: w - headLen, y: shaftTop },\n { x: w - headLen, y: 0 },\n { x: w, y: h / 2 },\n { x: w - headLen, y: h },\n { x: w - headLen, y: shaftBottom },\n { x: 0, y: shaftBottom },\n ]\n}\n\n/**\n * Polygon vertices for the polygonal geo kinds, or `null` for the curved kinds\n * (ellipse, oval, cloud, heart). `x-box` and `check-box` return their frame;\n * see `getGeoDecorations` for the marks inside.\n */\nexport function getGeoPolygonPoints(kind: GeoShapeKind, w: number, h: number): VecLike[] | null {\n switch (kind) {\n case \"rectangle\":\n case \"x-box\":\n case \"check-box\":\n return [\n { x: 0, y: 0 },\n { x: w, y: 0 },\n { x: w, y: h },\n { x: 0, y: h },\n ]\n case \"triangle\":\n return [\n { x: w / 2, y: 0 },\n { x: w, y: h },\n { x: 0, y: h },\n ]\n case \"diamond\":\n return [\n { x: w / 2, y: 0 },\n { x: w, y: h / 2 },\n { x: w / 2, y: h },\n { x: 0, y: h / 2 },\n ]\n case \"pentagon\":\n return regularPolygon(5, -Math.PI / 2, w, h)\n case \"hexagon\":\n return regularPolygon(6, HEXAGON_START_ANGLE, w, h)\n case \"octagon\":\n return regularPolygon(8, Math.PI / 8, w, h)\n case \"star\":\n return regularPolygon(5, -Math.PI / 2, w, h, STAR_INNER_RATIO)\n case \"rhombus\": {\n const off = Math.min(w / 3, h)\n return [\n { x: off, y: 0 },\n { x: w, y: 0 },\n { x: w - off, y: h },\n { x: 0, y: h },\n ]\n }\n case \"rhombus-2\": {\n const off = Math.min(w / 3, h)\n return [\n { x: 0, y: 0 },\n { x: w - off, y: 0 },\n { x: w, y: h },\n { x: off, y: h },\n ]\n }\n case \"trapezoid\": {\n const off = Math.min(w / 4, h / 2)\n return [\n { x: off, y: 0 },\n { x: w - off, y: 0 },\n { x: w, y: h },\n { x: 0, y: h },\n ]\n }\n case \"arrow-right\":\n return blockArrowRight(w, h)\n case \"arrow-left\":\n return blockArrowRight(w, h).map((p) => ({ x: w - p.x, y: p.y }))\n case \"arrow-down\":\n return blockArrowRight(h, w).map((p) => ({ x: p.y, y: p.x }))\n case \"arrow-up\":\n return blockArrowRight(h, w).map((p) => ({ x: p.y, y: h - p.x }))\n case \"ellipse\":\n case \"oval\":\n case \"cloud\":\n case \"heart\":\n return null\n }\n}\n\n/** Open polylines drawn inside the outline (the X of an x-box, the tick of a check-box). */\nexport function getGeoDecorations(kind: GeoShapeKind, w: number, h: number): VecLike[][] {\n switch (kind) {\n case \"x-box\":\n return [\n [\n { x: 0, y: 0 },\n { x: w, y: h },\n ],\n [\n { x: w, y: 0 },\n { x: 0, y: h },\n ],\n ]\n case \"check-box\":\n return [\n [\n { x: w * 0.25, y: h * 0.52 },\n { x: w * 0.43, y: h * 0.72 },\n { x: w * 0.76, y: h * 0.3 },\n ],\n ]\n default:\n return []\n }\n}\n\n/** Stadium / capsule: two semicircles joined by straight sides. */\nexport function getStadiumSegments(w: number, h: number): CubicSegment[] {\n if (w >= h) {\n const r = h / 2\n return [\n lineSegment({ x: r, y: 0 }, { x: w - r, y: 0 }),\n ...arcToCubicSegments({ x: w - r, y: r }, r, -Math.PI / 2, Math.PI, 2),\n lineSegment({ x: w - r, y: h }, { x: r, y: h }),\n ...arcToCubicSegments({ x: r, y: r }, r, Math.PI / 2, Math.PI, 2),\n ]\n }\n const r = w / 2\n return [\n ...arcToCubicSegments({ x: r, y: r }, r, Math.PI, Math.PI, 2),\n lineSegment({ x: w, y: r }, { x: w, y: h - r }),\n ...arcToCubicSegments({ x: r, y: h - r }, r, 0, Math.PI, 2),\n lineSegment({ x: 0, y: h - r }, { x: 0, y: r }),\n ]\n}\n\n/** Stretch closed spline control points so the sampled outline fills [0,w]×[0,h]. */\nfunction fitSegmentsToBox(segments: CubicSegment[], w: number, h: number): CubicSegment[] {\n const b = new CubicSpline2d({ segments, isClosed: true }).bounds\n const sx = b.w > 0 ? w / b.w : 0\n const sy = b.h > 0 ? h / b.h : 0\n const map = (p: VecLike): VecLike => ({ x: (p.x - b.x) * sx, y: (p.y - b.y) * sy })\n return segments.map((s) => ({ p0: map(s.p0), c1: map(s.c1), c2: map(s.c2), p1: map(s.p1) }))\n}\n\n/** A ring of round bumps around an inner ellipse, fitted to the box. */\nexport function getCloudSegments(w: number, h: number): CubicSegment[] {\n const bumps = Math.max(5, Math.min(12, Math.round((w + h) / 40)))\n const center = { x: w / 2, y: h / 2 }\n const rx = (w / 2) * 0.75\n const ry = (h / 2) * 0.7\n const anchors: VecLike[] = []\n for (let i = 0; i < bumps; i++) {\n const a = -Math.PI / 2 + (i / bumps) * TAU\n anchors.push({ x: center.x + rx * Math.cos(a), y: center.y + ry * Math.sin(a) })\n }\n const segments: CubicSegment[] = []\n for (let i = 0; i < bumps; i++) {\n const a = anchors[i]!\n const b = anchors[(i + 1) % bumps]!\n const chord = Vec.Sub(b, a)\n const len = Vec.Len(chord)\n const mid = Vec.Lrp(a, b, 0.5)\n let outward = Vec.Per(Vec.Uni(chord))\n if (Vec.Dot(outward, Vec.Sub(mid, center)) < 0) outward = Vec.Mul(outward, -1)\n const k = len * 0.55\n segments.push({\n p0: a,\n c1: Vec.Add(a, Vec.Mul(outward, k)),\n c2: Vec.Add(b, Vec.Mul(outward, k)),\n p1: b,\n })\n }\n return fitSegmentsToBox(segments, w, h)\n}\n\n/** Classic two-lobed heart, six cubics, bounds exactly w×h. */\nexport function getHeartSegments(w: number, h: number): CubicSegment[] {\n const P = (x: number, y: number): VecLike => ({ x: x * w, y: y * h })\n return [\n { p0: P(0.5, 0.25), c1: P(0.5, 0.1), c2: P(0.35, 0), p1: P(0.25, 0) },\n { p0: P(0.25, 0), c1: P(0.1, 0), c2: P(0, 0.15), p1: P(0, 0.3) },\n { p0: P(0, 0.3), c1: P(0, 0.55), c2: P(0.25, 0.75), p1: P(0.5, 1) },\n { p0: P(0.5, 1), c1: P(0.75, 0.75), c2: P(1, 0.55), p1: P(1, 0.3) },\n { p0: P(1, 0.3), c1: P(1, 0.15), c2: P(0.9, 0), p1: P(0.75, 0) },\n { p0: P(0.75, 0), c1: P(0.65, 0), c2: P(0.5, 0.1), p1: P(0.5, 0.25) },\n ]\n}\n\n/** Build the outline geometry for a geo kind inside a w×h box. */\nexport function getGeoGeometry(kind: GeoShapeKind, w: number, h: number, isFilled: boolean): Geometry2d {\n switch (kind) {\n case \"ellipse\":\n return new Ellipse2d({ width: w, height: h, isFilled })\n case \"oval\":\n return new CubicSpline2d({ segments: getStadiumSegments(w, h), isClosed: true, isFilled })\n case \"cloud\":\n return new CubicSpline2d({ segments: getCloudSegments(w, h), isClosed: true, isFilled })\n case \"heart\":\n return new CubicSpline2d({ segments: getHeartSegments(w, h), isClosed: true, isFilled })\n default: {\n const points = getGeoPolygonPoints(kind, w, h) ?? []\n const body = new Polygon2d({ points, isFilled })\n const decorations = getGeoDecorations(kind, w, h)\n if (decorations.length === 0) return body\n return new Group2d({ children: [body, ...decorations.map((points) => new Polyline2d({ points }))] })\n }\n }\n}\n","import {\n BaseBoxShapeUtil,\n FONT_SIZES,\n Group2d,\n Rectangle2d,\n STROKE_SIZES,\n DefaultColorStyle,\n DefaultDashStyle,\n DefaultFillStyle,\n DefaultFontStyle,\n DefaultHorizontalAlignStyle,\n DefaultLabelColorStyle,\n DefaultSizeStyle,\n DefaultVerticalAlignStyle,\n GeoShapeGeoStyle,\n type BaseShape,\n type GeoShapeKind,\n type Geometry2d,\n type StyleWords,\n} from \"@mocanvas/editor\"\nimport type { CSSProperties, ReactNode } from \"react\"\nimport { alignToJustify, alignToTextAlign, TextLabel, verticalAlignToAlignItems } from \"../text/TextEditor\"\nimport { computeGrowY, measureLabel, trimTrailingWhitespace } from \"../text/text-layout\"\nimport { getGeoGeometry } from \"./geo-helpers\"\nimport { propsOf, readNumber, readString, readStyle, readText } from \"./prop-access\"\nimport { getDashId, getFillRgba, getStrokeRgba, getTextCssColor } from \"./shape-theme\"\nimport { pathWordsToSvgD } from \"./svg-path\"\n\nexport interface GeoShapeProps {\n geo: GeoShapeKind\n w: number\n h: number\n color: DefaultColorStyle\n labelColor: DefaultColorStyle\n fill: DefaultFillStyle\n dash: DefaultDashStyle\n size: DefaultSizeStyle\n font: DefaultFontStyle\n align: DefaultHorizontalAlignStyle\n verticalAlign: DefaultVerticalAlignStyle\n growY: number\n url: string\n text: string\n scale: number\n}\n\nexport type GeoShape = BaseShape<\"geo\", GeoShapeProps>\n\nexport const GEO_LABEL_PADDING = 16\nconst LABEL_PADDING = GEO_LABEL_PADDING\n\nexport function horizontalAlignToFlex(align: DefaultHorizontalAlignStyle): CSSProperties[\"justifyContent\"] {\n return alignToJustify(align)\n}\n\nexport function horizontalAlignToTextAlign(align: DefaultHorizontalAlignStyle): CSSProperties[\"textAlign\"] {\n return alignToTextAlign(align)\n}\n\nexport function verticalAlignToFlex(align: DefaultVerticalAlignStyle): CSSProperties[\"alignItems\"] {\n return verticalAlignToAlignItems(align)\n}\n\n/**\n * `shape.props` with every declared prop present and of the declared type.\n * Geometry and rendering read through this so a record that arrived without a\n * prop (or with a value from another editor's vocabulary) still draws.\n */\nexport function readGeoProps(shape: { props?: unknown }): GeoShapeProps {\n const p = propsOf(shape)\n return {\n geo: readStyle(p, \"geo\", GeoShapeGeoStyle),\n w: readNumber(p, \"w\", 100),\n h: readNumber(p, \"h\", 100),\n color: readStyle(p, \"color\", DefaultColorStyle),\n labelColor: readStyle(p, \"labelColor\", DefaultLabelColorStyle),\n fill: readStyle(p, \"fill\", DefaultFillStyle),\n dash: readStyle(p, \"dash\", DefaultDashStyle),\n size: readStyle(p, \"size\", DefaultSizeStyle),\n font: readStyle(p, \"font\", DefaultFontStyle),\n align: readStyle(p, \"align\", DefaultHorizontalAlignStyle),\n verticalAlign: readStyle(p, \"verticalAlign\", DefaultVerticalAlignStyle),\n growY: readNumber(p, \"growY\", 0),\n url: readString(p, \"url\", \"\"),\n text: readText(p),\n scale: readNumber(p, \"scale\", 1),\n }\n}\n\n/** Measured size of a geo label (padding included), wrapped at the shape width. */\nexport function measureGeoLabel(props: Pick<GeoShapeProps, \"text\" | \"font\" | \"size\" | \"scale\" | \"w\">) {\n const text = readText(props)\n const font = readStyle(props, \"font\", DefaultFontStyle)\n const size = readStyle(props, \"size\", DefaultSizeStyle)\n const scale = readNumber(props, \"scale\", 1)\n const w = readNumber(props, \"w\", 100)\n return measureLabel(text, { font, fontSize: FONT_SIZES[size] * scale, maxWidth: Math.max(1, w), padding: LABEL_PADDING * scale })\n}\n\n/** `growY` a geo shape needs so its label fits inside `h`. Empty labels never grow the shape. */\nexport function getGeoGrowY(props: Pick<GeoShapeProps, \"text\" | \"font\" | \"size\" | \"scale\" | \"w\" | \"h\">): number {\n if (!readText(props)) return 0\n return computeGrowY(measureGeoLabel(props).h, readNumber(props, \"h\", 100))\n}\n\nconst LABEL_KEYS: readonly (keyof GeoShapeProps)[] = [\"text\", \"font\", \"size\", \"scale\", \"w\", \"h\"]\n\nexport class GeoShapeUtil extends BaseBoxShapeUtil<GeoShape> {\n static override type = \"geo\" as const\n static override props = {\n geo: GeoShapeGeoStyle,\n color: DefaultColorStyle,\n labelColor: DefaultLabelColorStyle,\n fill: DefaultFillStyle,\n dash: DefaultDashStyle,\n size: DefaultSizeStyle,\n font: DefaultFontStyle,\n align: DefaultHorizontalAlignStyle,\n verticalAlign: DefaultVerticalAlignStyle,\n }\n\n getDefaultProps(): GeoShapeProps {\n return {\n geo: \"rectangle\",\n w: 100,\n h: 100,\n color: \"black\",\n labelColor: \"black\",\n fill: \"none\",\n dash: \"draw\",\n size: \"m\",\n font: \"draw\",\n align: \"middle\",\n verticalAlign: \"middle\",\n growY: 0,\n url: \"\",\n text: \"\",\n scale: 1,\n }\n }\n\n getGeometry(shape: GeoShape): Geometry2d {\n const props = readGeoProps(shape)\n const { geo, w, h, growY, fill, text } = props\n const height = h + growY\n const body = getGeoGeometry(geo, w, height, fill !== \"none\")\n if (!text) return body\n return new Group2d({ children: [body, this.getLabelRect(props)] })\n }\n\n /** Where the text label sits inside the body, in shape-local space. */\n private getLabelRect(props: GeoShapeProps): Rectangle2d {\n const { w, h, growY, align, verticalAlign } = props\n const height = h + growY\n const m = measureGeoLabel(props)\n const lw = Math.min(w, m.w)\n const lh = Math.min(height, m.h)\n const x = align === \"start\" || align === \"start-legacy\" ? 0 : align === \"end\" || align === \"end-legacy\" ? w - lw : (w - lw) / 2\n const y = verticalAlign === \"start\" ? 0 : verticalAlign === \"end\" ? height - lh : (height - lh) / 2\n return new Rectangle2d({ x, y, width: lw, height: lh, isFilled: false, isLabel: true })\n }\n\n override getRenderStyle(shape: GeoShape): StyleWords {\n const { color, fill, dash, size, scale } = readGeoProps(shape)\n return {\n stroke: getStrokeRgba(color),\n strokeWidth: STROKE_SIZES[size] * scale,\n fill: getFillRgba(color, fill),\n dash: getDashId(dash),\n opacity: 1,\n }\n }\n\n component(shape: GeoShape): ReactNode {\n const { text, font, size, scale, labelColor, align, verticalAlign, w, h, growY } = readGeoProps(shape)\n const isEditing = this.editor.getEditingShapeId() === shape.id\n if (!text && !isEditing) return null\n return (\n <TextLabel\n shape={shape}\n text={text}\n isEditing={isEditing}\n font={font}\n fontSize={FONT_SIZES[size] * scale}\n color={getTextCssColor(labelColor)}\n align={align}\n verticalAlign={verticalAlign}\n wrap\n width={w}\n height={h + growY}\n padding={LABEL_PADDING * scale}\n onChange={(next) => this.editor.updateShape<GeoShape>({ id: shape.id, type: \"geo\", props: { text: next } })}\n />\n )\n }\n\n indicator(shape: GeoShape): ReactNode {\n return <path d={pathWordsToSvgD(this.getGeometry(shape).toPathWords())} />\n }\n\n /** The GPU keeps drawing the body while editing; only the label lives in the DOM. */\n override needsOverlay(_shape: GeoShape): boolean {\n return false\n }\n\n override hasOverlayLabel(shape: GeoShape): boolean {\n return readText(shape.props).trim().length > 0 || this.editor.getEditingShapeId() === shape.id\n }\n\n override canEdit(_shape: GeoShape): boolean {\n return true\n }\n\n override getText(shape: GeoShape): string {\n return readText(shape.props)\n }\n\n override onBeforeCreate(next: GeoShape): GeoShape | void {\n const growY = getGeoGrowY(next.props)\n if (growY !== next.props.growY) return { ...next, props: { ...next.props, growY } }\n }\n\n override onBeforeUpdate(prev: GeoShape, next: GeoShape): GeoShape | void {\n if (!LABEL_KEYS.some((k) => propsOf(prev)[k] !== propsOf(next)[k])) return\n const growY = getGeoGrowY(next.props)\n if (growY !== next.props.growY) return { ...next, props: { ...next.props, growY } }\n }\n\n override onEditEnd(shape: GeoShape): void {\n const text = readText(shape.props)\n const trimmed = trimTrailingWhitespace(text)\n if (trimmed !== text) this.editor.updateShape<GeoShape>({ id: shape.id, type: \"geo\", props: { text: trimmed } })\n }\n}\n","import {\n FONT_SIZES,\n Rectangle2d,\n ShapeUtil,\n LIGHT_THEME,\n DefaultColorStyle,\n DefaultFontStyle,\n DefaultHorizontalAlignStyle,\n DefaultLabelColorStyle,\n DefaultSizeStyle,\n DefaultVerticalAlignStyle,\n type BaseShape,\n type Geometry2d,\n type StyleWords,\n} from \"@mocanvas/editor\"\nimport type { ReactNode } from \"react\"\nimport { TextLabel } from \"../text/TextEditor\"\nimport { computeGrowY, measureLabel, trimTrailingWhitespace } from \"../text/text-layout\"\nimport { propsOf, readNumber, readString, readStyle, readText } from \"./prop-access\"\nimport { getNoteBodyGradientCss, getNoteFillRgba, getNoteShadowCss, getNoteTextCssColor } from \"./shape-theme\"\n\nexport interface NoteShapeProps {\n color: DefaultColorStyle\n labelColor: DefaultColorStyle\n size: DefaultSizeStyle\n font: DefaultFontStyle\n fontSizeAdjustment: number\n align: DefaultHorizontalAlignStyle\n verticalAlign: DefaultVerticalAlignStyle\n growY: number\n url: string\n text: string\n scale: number\n}\n\nexport type NoteShape = BaseShape<\"note\", NoteShapeProps>\n\nexport const NOTE_SIZE = 200\nexport const NOTE_PADDING = 16\n\n/**\n * `shape.props` with every declared prop present and of the declared type, so\n * geometry and rendering survive a record that arrived without one.\n */\nexport function readNoteProps(shape: { props?: unknown }): NoteShapeProps {\n const p = propsOf(shape)\n return {\n color: readStyle(p, \"color\", DefaultColorStyle),\n labelColor: readStyle(p, \"labelColor\", DefaultLabelColorStyle),\n size: readStyle(p, \"size\", DefaultSizeStyle),\n font: readStyle(p, \"font\", DefaultFontStyle),\n fontSizeAdjustment: readNumber(p, \"fontSizeAdjustment\", 0),\n align: readStyle(p, \"align\", DefaultHorizontalAlignStyle),\n verticalAlign: readStyle(p, \"verticalAlign\", DefaultVerticalAlignStyle),\n growY: readNumber(p, \"growY\", 0),\n url: readString(p, \"url\", \"\"),\n text: readText(p),\n scale: readNumber(p, \"scale\", 1),\n }\n}\n\n/** Below this, a stored `fontSizeAdjustment` is not a font size anyone meant. */\nconst MIN_NOTE_FONT_SIZE = 4\n\n/**\n * Effective font size: an explicit adjustment (auto-shrunk text) wins over the\n * size style.\n *\n * `fontSizeAdjustment` is an absolute size in px, written when a label had to\n * shrink to fit; `0` means \"unset\". Files exist that write a small placeholder\n * there instead (a `1` on a note that was never shrunk), which would render the\n * label at one pixel, so anything too small to be a font size is also read as\n * unset and the size style takes over.\n */\nexport function getNoteFontSize(shape: NoteShape): number {\n const { size, scale, fontSizeAdjustment } = readNoteProps(shape)\n return (fontSizeAdjustment >= MIN_NOTE_FONT_SIZE ? fontSizeAdjustment : FONT_SIZES[size]) * scale\n}\n\n/** `growY` a note needs so its (centered) text fits; the note keeps its square width. */\nexport function getNoteGrowY(shape: NoteShape): number {\n const { text, font, scale } = readNoteProps(shape)\n if (!text) return 0\n const side = NOTE_SIZE * scale\n const m = measureLabel(text, { font, fontSize: getNoteFontSize(shape), maxWidth: side, padding: NOTE_PADDING * scale })\n return computeGrowY(m.h, side)\n}\n\nconst LABEL_KEYS: readonly (keyof NoteShapeProps)[] = [\"text\", \"font\", \"size\", \"scale\", \"fontSizeAdjustment\"]\n\nexport class NoteShapeUtil extends ShapeUtil<NoteShape> {\n static override type = \"note\" as const\n static override props = {\n color: DefaultColorStyle,\n labelColor: DefaultLabelColorStyle,\n size: DefaultSizeStyle,\n font: DefaultFontStyle,\n align: DefaultHorizontalAlignStyle,\n verticalAlign: DefaultVerticalAlignStyle,\n }\n\n getDefaultProps(): NoteShapeProps {\n return {\n color: \"black\",\n labelColor: \"black\",\n size: \"m\",\n font: \"draw\",\n fontSizeAdjustment: 0,\n align: \"middle\",\n verticalAlign: \"middle\",\n growY: 0,\n url: \"\",\n text: \"\",\n scale: 1,\n }\n }\n\n getGeometry(shape: NoteShape): Geometry2d {\n const { scale, growY } = readNoteProps(shape)\n return new Rectangle2d({ width: NOTE_SIZE * scale, height: NOTE_SIZE * scale + growY, isFilled: true })\n }\n\n override getRenderStyle(shape: NoteShape): StyleWords {\n return { fill: getNoteFillRgba(readNoteProps(shape).color), stroke: 0, strokeWidth: 0, dash: 0, opacity: 1 }\n }\n\n component(shape: NoteShape): ReactNode {\n const { text, font, color, labelColor, align, verticalAlign, scale, growY } = readNoteProps(shape)\n const textColor = labelColor === \"black\" ? getNoteTextCssColor(color) : LIGHT_THEME[labelColor].solid\n const w = NOTE_SIZE * scale\n const h = NOTE_SIZE * scale + growY\n return (\n <>\n {/*\n The note's trim: a vertical gradient over the body and a soft shadow\n under it. The GPU quad below this covers exactly the shape's bounds\n and can carry neither, so both are drawn here, beneath the label. The\n shadow falls outside the body and is decoration only — the geometry,\n bounds and hit-testing are the flat rectangle either way.\n */}\n <div\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n width: w,\n height: h,\n background: getNoteBodyGradientCss(color),\n boxShadow: getNoteShadowCss(scale),\n pointerEvents: \"none\",\n }}\n />\n <TextLabel\n shape={shape}\n text={text}\n isEditing={this.editor.getEditingShapeId() === shape.id}\n font={font}\n fontSize={getNoteFontSize(shape)}\n color={textColor}\n align={align}\n verticalAlign={verticalAlign}\n wrap\n width={w}\n height={h}\n padding={NOTE_PADDING * scale}\n onChange={(next) => this.editor.updateShape<NoteShape>({ id: shape.id, type: \"note\", props: { text: next } })}\n />\n </>\n )\n }\n\n indicator(shape: NoteShape): ReactNode {\n const { scale, growY } = readNoteProps(shape)\n return <rect width={NOTE_SIZE * scale} height={NOTE_SIZE * scale + growY} />\n }\n\n /**\n * The GPU draws the sticky background even while editing; the overlay adds\n * the gradient and the shadow over it (see `component`).\n */\n override needsOverlay(_shape: NoteShape): boolean {\n return false\n }\n\n override hasOverlayLabel(_shape: NoteShape): boolean {\n return true\n }\n\n override canEdit(_shape: NoteShape): boolean {\n return true\n }\n\n override hideResizeHandles(_shape: NoteShape): boolean {\n return true\n }\n\n override getText(shape: NoteShape): string {\n return readText(shape.props)\n }\n\n override onBeforeCreate(next: NoteShape): NoteShape | void {\n const growY = getNoteGrowY(next)\n if (growY !== next.props.growY) return { ...next, props: { ...next.props, growY } }\n }\n\n override onBeforeUpdate(prev: NoteShape, next: NoteShape): NoteShape | void {\n if (!LABEL_KEYS.some((k) => propsOf(prev)[k] !== propsOf(next)[k])) return\n const growY = getNoteGrowY(next)\n if (growY !== next.props.growY) return { ...next, props: { ...next.props, growY } }\n }\n\n override onEditEnd(shape: NoteShape): void {\n const text = readText(shape.props)\n const trimmed = trimTrailingWhitespace(text)\n if (trimmed !== text) this.editor.updateShape<NoteShape>({ id: shape.id, type: \"note\", props: { text: trimmed } })\n }\n}\n","/**\n * Rasterizes a text label to an offscreen canvas so the engine can draw it as a\n * textured quad instead of a DOM node.\n *\n * This is the pragmatic version of the phase-3 glyph atlas: one texture per\n * distinct label instead of one atlas of glyphs. Line breaking goes through the\n * shared `TextMeasure`, so a rasterized label wraps exactly where the DOM label\n * it replaces would.\n */\nimport { getTextMeasure } from \"./TextMeasure\"\n\nexport type TextTextureAlign = \"start\" | \"middle\" | \"end\"\n\nexport interface TextTextureSpec {\n text: string\n fontFamily: string\n fontSize: number\n /** Any CSS color string. */\n color: string\n align: TextTextureAlign\n verticalAlign: TextTextureAlign\n /** Unitless line-height multiplier. */\n lineHeight: number\n /** The box the texture covers, in page units — the shape's local geometry bounds. */\n width: number\n height: number\n /** Soft-wrap width in page units. Omit for no wrapping (one line per paragraph). */\n maxWidth?: number\n /**\n * Device pixels per page unit the canvas is rasterized at, i.e.\n * `dpr × min(4, zoom)`. Callers bucket it to a power of two\n * (`bucketTextureResolution` / `editor.getTextureResolution()`) so zooming\n * does not re-rasterize every frame.\n */\n resolution: number\n /** Padding inside the box, in page units. */\n padding?: number\n}\n\n/** Hard cap on either canvas dimension, so a huge label cannot blow up the GPU. */\nexport const MAX_TEXT_TEXTURE_PX = 4096\n\n/**\n * Cache key for a spec. Stable for equal specs and different for every field\n * that changes the pixels — the resolution bucket included.\n */\nexport function getTextTextureKey(spec: TextTextureSpec): string {\n return [\n \"text\",\n spec.fontFamily,\n spec.fontSize,\n spec.lineHeight,\n spec.color,\n spec.align,\n spec.verticalAlign,\n round(spec.width),\n round(spec.height),\n spec.maxWidth === undefined ? \"\" : round(spec.maxWidth),\n spec.padding ?? 0,\n spec.resolution,\n spec.text,\n ].join(\"|\")\n}\n\n/** Width of one unwrapped run, through the shared measurer (cached). */\nfunction runWidth(text: string, spec: TextTextureSpec): number {\n if (text.length === 0) return 0\n return getTextMeasure().measureText(text, {\n fontFamily: spec.fontFamily,\n fontSize: spec.fontSize,\n lineHeight: spec.lineHeight,\n }).w\n}\n\n/**\n * Break `spec.text` into the lines the label renders as: hard newlines always,\n * plus greedy word wrapping at `maxWidth` (breaking inside a word only when a\n * single word does not fit), mirroring `overflow-wrap: break-word`. Unlike the\n * SVG exporter's `wrapTextLines`, widths come from the shared `TextMeasure`, so\n * the raster matches the DOM label it replaces.\n */\nexport function wrapTextTextureLines(spec: TextTextureSpec): string[] {\n const padding = spec.padding ?? 0\n const max = spec.maxWidth === undefined ? undefined : Math.max(1, spec.maxWidth - padding * 2)\n const out: string[] = []\n for (const paragraph of spec.text.split(\"\\n\")) {\n if (max === undefined || paragraph.length === 0) {\n out.push(paragraph)\n continue\n }\n let line = \"\"\n for (const word of paragraph.split(\" \")) {\n const candidate = line.length === 0 ? word : `${line} ${word}`\n if (runWidth(candidate, spec) <= max || line.length === 0) {\n line = candidate\n // A single word wider than the box is split by characters.\n if (line.length > 0 && runWidth(line, spec) > max) {\n const parts = breakLongWord(line, spec, max)\n out.push(...parts.slice(0, -1))\n line = parts[parts.length - 1] ?? \"\"\n }\n continue\n }\n out.push(line)\n line = word\n }\n out.push(line)\n }\n return out\n}\n\nfunction breakLongWord(word: string, spec: TextTextureSpec, max: number): string[] {\n const parts: string[] = []\n let current = \"\"\n for (const char of word) {\n const next = current + char\n if (current.length > 0 && runWidth(next, spec) > max) {\n parts.push(current)\n current = char\n } else {\n current = next\n }\n }\n parts.push(current)\n return parts\n}\n\n/** Effective resolution after clamping the canvas to `MAX_TEXT_TEXTURE_PX`. */\nexport function getTextTextureScale(spec: TextTextureSpec): number {\n const longest = Math.max(1, spec.width, spec.height)\n return Math.max(0.05, Math.min(spec.resolution, MAX_TEXT_TEXTURE_PX / longest))\n}\n\n/**\n * Draw the label onto a canvas covering the whole `width × height` box, so the\n * engine's uv `0..1` quad over the shape's local bounds lands pixel-for-pixel.\n * Throws where there is no `document` (Node, SSR) — callers keep the DOM path.\n */\nexport function renderTextToCanvas(spec: TextTextureSpec): HTMLCanvasElement {\n if (typeof document === \"undefined\") throw new Error(\"mocanvas: no document to rasterize text with\")\n const scale = getTextTextureScale(spec)\n const canvas = document.createElement(\"canvas\")\n canvas.width = Math.max(1, Math.ceil(spec.width * scale))\n canvas.height = Math.max(1, Math.ceil(spec.height * scale))\n const ctx = canvas.getContext(\"2d\")\n if (!ctx) throw new Error(\"mocanvas: no 2d context to rasterize text with\")\n\n const padding = spec.padding ?? 0\n const lines = wrapTextTextureLines(spec)\n const lineHeightPx = spec.fontSize * spec.lineHeight\n const blockHeight = lines.length * lineHeightPx\n\n ctx.scale(scale, scale)\n ctx.font = `${spec.fontSize}px ${spec.fontFamily}`\n ctx.fillStyle = spec.color\n ctx.textBaseline = \"middle\"\n ctx.textAlign = spec.align === \"start\" ? \"left\" : spec.align === \"end\" ? \"right\" : \"center\"\n\n const innerH = Math.max(0, spec.height - padding * 2)\n const x = spec.align === \"start\" ? padding : spec.align === \"end\" ? spec.width - padding : spec.width / 2\n const top = padding + (spec.verticalAlign === \"start\" ? 0 : spec.verticalAlign === \"end\" ? innerH - blockHeight : (innerH - blockHeight) / 2)\n\n for (let i = 0; i < lines.length; i++) {\n // CSS centres a run inside its line box; the canvas baseline does the same.\n ctx.fillText(lines[i]!, x, top + i * lineHeightPx + lineHeightPx / 2)\n }\n return canvas\n}\n\nfunction round(v: number): number {\n return Math.round(v * 100) / 100\n}\n","import {\n FONT_SIZES,\n Rectangle2d,\n ShapeUtil,\n DefaultColorStyle,\n DefaultFontStyle,\n DefaultHorizontalAlignStyle,\n DefaultSizeStyle,\n type BaseShape,\n type Editor,\n type Geometry2d,\n type ResizeInfo,\n type StyleWords,\n} from \"@mocanvas/editor\"\nimport type { ReactNode } from \"react\"\nimport { TextLabel } from \"../text/TextEditor\"\nimport { getTextShapeSize } from \"../text/text-layout\"\nimport { getTextTextureKey, renderTextToCanvas, type TextTextureSpec } from \"../text/TextTexture\"\nimport { LINE_HEIGHT } from \"./text-helpers\"\nimport { propsOf, readBoolean, readEnum, readNumber, readStyle, readText } from \"./prop-access\"\nimport { getFontFamily, getStrokeRgba, getTextCssColor } from \"./shape-theme\"\n\nexport interface TextShapeProps {\n color: DefaultColorStyle\n size: DefaultSizeStyle\n font: DefaultFontStyle\n textAlign: \"start\" | \"middle\" | \"end\"\n w: number\n text: string\n scale: number\n autoSize: boolean\n}\n\nexport type TextShape = BaseShape<\"text\", TextShapeProps>\n\nconst TEXT_ALIGNS = [\"start\", \"middle\", \"end\"] as const\n\n/**\n * `shape.props` with every declared prop present and of the declared type, so\n * measuring and rendering survive a record that arrived without one.\n */\nexport function readTextProps(shape: { props?: unknown }): TextShapeProps {\n const p = propsOf(shape)\n return {\n color: readStyle(p, \"color\", DefaultColorStyle),\n size: readStyle(p, \"size\", DefaultSizeStyle),\n font: readStyle(p, \"font\", DefaultFontStyle),\n textAlign: readEnum(p, \"textAlign\", TEXT_ALIGNS, \"start\"),\n w: readNumber(p, \"w\", 100),\n text: readText(p),\n scale: readNumber(p, \"scale\", 1),\n autoSize: readBoolean(p, \"autoSize\", true),\n }\n}\n\n/** Measured size of a text shape: intrinsic when `autoSize`, else wrapped at `w`. */\nexport function getTextShapeSizeFor(shape: TextShape): { w: number; h: number; lineCount: number } {\n const { text, size, scale, w, font, autoSize } = readTextProps(shape)\n return getTextShapeSize({ text, font, fontSize: FONT_SIZES[size] * scale, autoSize, w })\n}\n\n/** Height of the text block at its current width. */\nexport function getTextShapeHeight(shape: TextShape): number {\n return getTextShapeSizeFor(shape).h\n}\n\n/** The box `getGeometry` produces: what a texture for this shape must cover. */\nexport function getTextShapeBox(shape: TextShape): { w: number; h: number } {\n const { w, h } = getTextShapeSizeFor(shape)\n const props = readTextProps(shape)\n return { w: Math.max(1, props.autoSize ? Math.max(w, props.w) : props.w), h }\n}\n\n/** The rasterization spec for a text shape at the editor's current resolution bucket. */\nexport function getTextShapeTextureSpec(editor: Editor, shape: TextShape): TextTextureSpec {\n const { text, font, size, scale, color, textAlign, autoSize } = readTextProps(shape)\n const box = getTextShapeBox(shape)\n return {\n text,\n fontFamily: getFontFamily(font),\n fontSize: FONT_SIZES[size] * scale,\n color: getTextCssColor(color),\n align: textAlign,\n verticalAlign: \"start\",\n lineHeight: LINE_HEIGHT,\n width: box.w,\n height: box.h,\n ...(autoSize ? {} : { maxWidth: box.w }),\n resolution: editor.getTextureResolution(),\n }\n}\n\n/** Whether this environment can rasterize text at all (no `document` in Node/SSR). */\nfunction canRasterizeText(): boolean {\n return typeof document !== \"undefined\"\n}\n\nconst SIZE_KEYS: readonly (keyof TextShapeProps)[] = [\"text\", \"font\", \"size\", \"scale\", \"autoSize\"]\n\nexport class TextShapeUtil extends ShapeUtil<TextShape> {\n static override type = \"text\" as const\n static override props = { color: DefaultColorStyle, size: DefaultSizeStyle, font: DefaultFontStyle, textAlign: DefaultHorizontalAlignStyle }\n\n getDefaultProps(): TextShapeProps {\n return { color: \"black\", size: \"m\", font: \"draw\", textAlign: \"start\", w: 100, text: \"\", scale: 1, autoSize: true }\n }\n\n getGeometry(shape: TextShape): Geometry2d {\n const box = getTextShapeBox(shape)\n return new Rectangle2d({ width: box.w, height: box.h, isFilled: true })\n }\n\n /**\n * A texture of the rasterized label, so the GPU draws the text instead of the\n * DOM. The shape being edited (and any environment without a canvas) keeps\n * the DOM path; `fill` is the text colour so the level-of-detail quad the\n * engine draws below a few pixels still looks right.\n */\n override getRenderStyle(shape: TextShape): StyleWords | null {\n const key = this.getTextureKey(shape)\n if (!key) return null\n const texture = this.editor.textures.acquire(key.key, async () => renderTextToCanvas(key.spec))\n if (!texture) return null\n return { fill: getStrokeRgba(readTextProps(shape).color), stroke: 0, strokeWidth: 0, dash: 0, opacity: 1, texture }\n }\n\n /** The DOM label stands in while editing and until the texture is ready. */\n override needsOverlay(shape: TextShape): boolean {\n const key = this.getTextureKey(shape)\n return key === null || !this.editor.textures.isReady(key.key)\n }\n\n private getTextureKey(shape: TextShape): { key: string; spec: TextTextureSpec } | null {\n if (this.editor.getEditingShapeId() === shape.id) return null\n if (readText(shape.props).length === 0) return null\n if (!canRasterizeText()) return null\n const spec = getTextShapeTextureSpec(this.editor, shape)\n return { key: getTextTextureKey(spec), spec }\n }\n\n component(shape: TextShape): ReactNode {\n const { text, font, size, scale, color, textAlign, w, autoSize } = readTextProps(shape)\n return (\n <TextLabel\n shape={shape}\n text={text}\n isEditing={this.editor.getEditingShapeId() === shape.id}\n font={font}\n fontSize={FONT_SIZES[size] * scale}\n color={getTextCssColor(color)}\n align={textAlign}\n verticalAlign=\"start\"\n wrap={!autoSize}\n width={Math.max(1, w)}\n onChange={(next) => this.editor.updateShape<TextShape>({ id: shape.id, type: \"text\", props: { text: next } })}\n />\n )\n }\n\n indicator(shape: TextShape): ReactNode {\n const b = this.getGeometry(shape).bounds\n return <rect width={b.w} height={b.h} />\n }\n\n override canEdit(_shape: TextShape): boolean {\n return true\n }\n\n override isAspectRatioLocked(_shape: TextShape): boolean {\n return false\n }\n\n override getText(shape: TextShape): string {\n return readText(shape.props)\n }\n\n /** Auto-sized text keeps `w` in sync with its measured width. */\n override onBeforeCreate(next: TextShape): TextShape | void {\n return this.fitWidth(next)\n }\n\n override onBeforeUpdate(prev: TextShape, next: TextShape): TextShape | void {\n if (!readTextProps(next).autoSize) return\n if (!SIZE_KEYS.some((k) => propsOf(prev)[k] !== propsOf(next)[k])) return\n return this.fitWidth(next)\n }\n\n private fitWidth(shape: TextShape): TextShape | void {\n const props = readTextProps(shape)\n if (!props.autoSize) return\n const { w } = getTextShapeSizeFor(shape)\n if (w !== props.w) return { ...shape, props: { ...shape.props, w } }\n }\n\n /** A text shape left empty after editing is removed. */\n override onEditEnd(shape: TextShape): void {\n if (readText(shape.props).trim().length === 0) this.editor.deleteShapes([shape.id])\n }\n\n /** Resizing a text shape changes its wrap width and turns auto-size off. */\n override onResize(shape: TextShape, info: ResizeInfo<TextShape>): Partial<TextShape> {\n const { scaleX, initialShape, newPoint } = info\n const w = Math.max(1, Math.abs(readTextProps(initialShape).w * scaleX))\n return { x: newPoint.x, y: newPoint.y, props: { ...shape.props, w, autoSize: false } }\n }\n}\n","import {\n BaseBoxShapeUtil,\n Rectangle2d,\n type AssetId,\n type BaseShape,\n type Editor,\n type Geometry2d,\n type StyleWords,\n type VideoAsset,\n} from \"@mocanvas/editor\"\nimport { useEffect, useRef, type CSSProperties, type ReactNode } from \"react\"\nimport { propsOf, readBoolean, readNumber, readString } from \"./prop-access\"\n\nexport interface VideoShapeProps {\n w: number\n h: number\n /** The `video` asset holding the file; `null` while nothing is attached. */\n assetId: AssetId | null\n /** Playhead position, in seconds. */\n time: number\n playing: boolean\n /** A hyperlink attached to the shape (not the video source). */\n url: string\n altText: string\n}\n\nexport type VideoShape = BaseShape<\"video\", VideoShapeProps>\n\nexport const VIDEO_WIDTH = 640\nexport const VIDEO_HEIGHT = 360\n\nexport const VIDEO_PLACEHOLDER_FILL = \"#eceff3\"\nexport const VIDEO_PLACEHOLDER_STROKE = \"#9fa8b2\"\n/** The play triangle drawn on the placeholder (and in an SVG export). */\nexport const VIDEO_PLAY_COLOR = \"#5f6670\"\nexport const VIDEO_PLAY_SIZE = 48\n\n/** Seeking to within this many seconds of the stored time is treated as already there. */\nexport const VIDEO_TIME_EPSILON = 0.1\n\n/**\n * The file the shape plays: the asset's `src`, or `null` when there is no\n * asset yet, the asset is still uploading, or it is not a video.\n */\nexport function getVideoSource(editor: Editor, shape: VideoShape): string | null {\n const assetId = readString(propsOf(shape), \"assetId\", \"\") as AssetId | \"\"\n if (!assetId) return null\n const asset = editor.getAsset<VideoAsset>(assetId)\n if (!asset || asset.type !== \"video\") return null\n return asset.props.src ?? null\n}\n\nfunction readVideoBox(shape: { props?: unknown }): { w: number; h: number } {\n const p = propsOf(shape)\n return { w: readNumber(p, \"w\", VIDEO_WIDTH), h: readNumber(p, \"h\", VIDEO_HEIGHT) }\n}\n\n/** The play triangle's points, centred in a `w`×`h` box. */\nexport function getVideoPlayTriangle(w: number, h: number, size = VIDEO_PLAY_SIZE): { x: number; y: number }[] {\n const s = Math.max(0, Math.min(size, w * 0.6, h * 0.6))\n const cx = w / 2\n const cy = h / 2\n // An equilateral-ish triangle pointing right, centred on its own area.\n const half = s / 2\n return [\n { x: cx - half * 0.6, y: cy - half },\n { x: cx - half * 0.6, y: cy + half },\n { x: cx + half * 0.9, y: cy },\n ]\n}\n\ninterface VideoPlayerProps {\n src: string\n time: number\n playing: boolean\n controls: boolean\n altText: string\n}\n\n/**\n * The `<video>` element, kept in step with the shape's `time` and `playing`\n * props. The props are the source of truth: the element is seeked and\n * played/paused from them, never the other way round, so two views of the same\n * document stay together.\n */\nfunction VideoPlayer({ src, time, playing, controls, altText }: VideoPlayerProps): ReactNode {\n const ref = useRef<HTMLVideoElement | null>(null)\n\n useEffect(() => {\n const el = ref.current\n if (!el) return\n // Seeking before metadata arrives is refused by some browsers, so it is\n // retried once the duration is known.\n const seek = (): void => {\n if (Math.abs(el.currentTime - time) <= VIDEO_TIME_EPSILON) return\n try {\n el.currentTime = time\n } catch {\n /* not seekable yet; `loadedmetadata` retries */\n }\n }\n seek()\n el.addEventListener(\"loadedmetadata\", seek)\n return () => el.removeEventListener(\"loadedmetadata\", seek)\n }, [time, src])\n\n useEffect(() => {\n const el = ref.current\n if (!el) return\n // Autoplay may be refused (a policy, a decode error); the shape stays put.\n if (playing) void el.play().catch(() => {})\n else el.pause()\n }, [playing, src])\n\n return (\n <video\n ref={ref}\n src={src}\n controls={controls}\n playsInline\n muted\n loop\n preload=\"metadata\"\n aria-label={altText || undefined}\n draggable={false}\n style={{\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n // Controls are only reachable while editing; otherwise the canvas\n // keeps the pointer so a drag over a video still pans.\n pointerEvents: controls ? \"auto\" : \"none\",\n userSelect: \"none\",\n }}\n />\n )\n}\n\nexport class VideoShapeUtil extends BaseBoxShapeUtil<VideoShape> {\n static override type = \"video\" as const\n\n getDefaultProps(): VideoShapeProps {\n return { w: VIDEO_WIDTH, h: VIDEO_HEIGHT, assetId: null, time: 0, playing: true, url: \"\", altText: \"\" }\n }\n\n getGeometry(shape: VideoShape): Geometry2d {\n const { w, h } = readVideoBox(shape)\n return new Rectangle2d({ width: Math.max(1, w), height: Math.max(1, h), isFilled: true })\n }\n\n /** A moving picture is not a texture the engine owns: video renders in the DOM overlay. */\n override getRenderStyle(_shape: VideoShape): StyleWords | null {\n return null\n }\n\n component(shape: VideoShape): ReactNode {\n const { w, h } = readVideoBox(shape)\n const p = propsOf(shape)\n const altText = readString(p, \"altText\", \"\")\n const src = getVideoSource(this.editor, shape)\n const box: CSSProperties = { position: \"absolute\", left: 0, top: 0, width: w, height: h, overflow: \"hidden\", boxSizing: \"border-box\" }\n if (!src) {\n const [a, b, c] = getVideoPlayTriangle(w, h)\n return (\n <div\n style={{ ...box, background: VIDEO_PLACEHOLDER_FILL, border: `1px dashed ${VIDEO_PLACEHOLDER_STROKE}`, pointerEvents: \"none\" }}\n aria-label={altText || \"video\"}\n >\n <svg width={w} height={h} viewBox={`0 0 ${Math.max(1, w)} ${Math.max(1, h)}`} style={{ display: \"block\" }} aria-hidden=\"true\">\n <polygon points={`${a!.x},${a!.y} ${b!.x},${b!.y} ${c!.x},${c!.y}`} fill={VIDEO_PLAY_COLOR} />\n </svg>\n </div>\n )\n }\n return (\n <div style={box}>\n <VideoPlayer\n src={src}\n time={readNumber(p, \"time\", 0)}\n playing={readBoolean(p, \"playing\", true)}\n controls={this.editor.getEditingShapeId() === shape.id}\n altText={altText}\n />\n </div>\n )\n }\n\n indicator(shape: VideoShape): ReactNode {\n const { w, h } = readVideoBox(shape)\n return <rect width={w} height={h} />\n }\n\n /** Editing a video means taking its controls, not typing into it. */\n override canEdit(_shape: VideoShape): boolean {\n return true\n }\n\n override isAspectRatioLocked(_shape: VideoShape): boolean {\n return true\n }\n}\n","/**\n * Small, DOM-free helpers shared by the SVG exporter: number formatting,\n * colour conversion from the engine's `0xRRGGBBAA` words, XML escaping and\n * dash patterns.\n */\nimport { PATH_OP, type Geometry2d, type Group2d, type StyleWords } from \"@mocanvas/editor\"\nimport { pathWordsToSvgD } from \"../shapes/svg-path\"\n\n/** Affine transform components as returned by `Editor.getShapePageTransform`. */\nexport interface SvgTransform {\n a: number\n b: number\n c: number\n d: number\n e: number\n f: number\n}\n\n/** Format a number for an SVG attribute: at most two decimals, no `-0`. */\nexport function svgNum(v: number): string {\n if (!Number.isFinite(v)) return \"0\"\n const r = Math.round(v * 100) / 100\n return String(r === 0 ? 0 : r)\n}\n\n/** Escape text for use inside an element or a double-quoted attribute. */\nexport function escapeXml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\")\n}\n\n/** Alpha channel (0..255) of an engine colour word. */\nexport function rgbaAlpha(word: number): number {\n return (word >>> 0) & 0xff\n}\n\n/**\n * Convert an engine `0xRRGGBBAA` word to `#rrggbb` (opaque) or `#rrggbbaa`.\n * Returns `undefined` when the colour is fully transparent (\"none\").\n */\nexport function rgbaToHex(word: number): string | undefined {\n const w = word >>> 0\n const a = w & 0xff\n if (a === 0) return undefined\n const r = (w >>> 24) & 0xff\n const g = (w >>> 16) & 0xff\n const b = (w >>> 8) & 0xff\n const hex = (n: number): string => n.toString(16).padStart(2, \"0\")\n return a === 0xff ? `#${hex(r)}${hex(g)}${hex(b)}` : `#${hex(r)}${hex(g)}${hex(b)}${hex(a)}`\n}\n\n/** `matrix(a b c d e f)` for a `transform` attribute. */\nexport function matrixAttr(m: SvgTransform): string {\n return `matrix(${svgNum(m.a)} ${svgNum(m.b)} ${svgNum(m.c)} ${svgNum(m.d)} ${svgNum(m.e)} ${svgNum(m.f)})`\n}\n\n/**\n * `stroke-dasharray` for an engine dash id (0 solid, 1 dashed, 2 dotted,\n * 3 draw). Solid and draw strokes have no dash array.\n */\nexport function dashArray(dash: number, strokeWidth: number): string | undefined {\n const sw = Math.max(0.5, strokeWidth)\n switch (dash) {\n case 1:\n return `${svgNum(sw * 2)} ${svgNum(sw * 2)}`\n case 2:\n // Zero-length dashes with round caps read as dots.\n return `0.1 ${svgNum(sw * 2)}`\n default:\n return undefined\n }\n}\n\n/** Build an attribute string from a record, skipping `undefined` values. */\nexport function attrs(values: Record<string, string | number | undefined>): string {\n const parts: string[] = []\n for (const [k, v] of Object.entries(values)) {\n if (v === undefined) continue\n parts.push(`${k}=\"${typeof v === \"number\" ? svgNum(v) : escapeXml(v)}\"`)\n }\n return parts.join(\" \")\n}\n\n/** Stroke presentation attributes shared by every stroked path. */\nexport function strokeAttrs(style: StyleWords): Record<string, string | number | undefined> {\n const stroke = rgbaToHex(style.stroke)\n if (!stroke || style.strokeWidth <= 0) return { stroke: \"none\" }\n return {\n stroke,\n \"stroke-width\": style.strokeWidth,\n \"stroke-linejoin\": \"round\",\n \"stroke-linecap\": \"round\",\n \"stroke-dasharray\": dashArray(style.dash, style.strokeWidth),\n }\n}\n\nfunction isGroup(g: Geometry2d): g is Group2d {\n return Array.isArray((g as Group2d).children)\n}\n\n/** Leaf geometries of a (possibly nested) group, label rectangles excluded. */\nexport function geometryLeaves(geometry: Geometry2d): Geometry2d[] {\n if (!isGroup(geometry)) return geometry.isLabel ? [] : [geometry]\n return geometry.children.flatMap((c) => geometryLeaves(c))\n}\n\n/** Label rectangles of a geometry (the boxes text labels occupy), in shape-local space. */\nexport function geometryLabels(geometry: Geometry2d): Geometry2d[] {\n if (!isGroup(geometry)) return geometry.isLabel ? [geometry] : []\n return geometry.children.flatMap((c) => geometryLabels(c))\n}\n\n/** Whether a flat path has at least one drawable command. */\nexport function hasPathWords(words: readonly number[]): boolean {\n return words.length > 0 && words[0] === PATH_OP.MOVE\n}\n\n/**\n * One `<path>` per leaf geometry, filled only where the leaf is a closed,\n * filled outline and stroked with the shape's stroke. Empty leaves are skipped.\n */\nexport function geometryToSvgPaths(geometry: Geometry2d, style: StyleWords): string {\n const fill = rgbaToHex(style.fill)\n const stroke = strokeAttrs(style)\n const out: string[] = []\n for (const leaf of geometryLeaves(geometry)) {\n const words = leaf.toPathWords()\n if (!hasPathWords(words)) continue\n const filled = fill !== undefined && leaf.isClosed && leaf.isFilled\n out.push(`<path ${attrs({ d: pathWordsToSvgD(words), fill: filled ? fill : \"none\", ...stroke })}/>`)\n }\n return out.join(\"\")\n}\n","/**\n * Text labels as `<text>` elements. Layout mirrors the DOM label: paragraphs\n * split on newlines, soft-wrapped at an average glyph advance (the same\n * estimate the Node-side text measurer uses), one `<tspan>` per line.\n */\nimport type { DefaultHorizontalAlignStyle, DefaultVerticalAlignStyle } from \"@mocanvas/editor\"\nimport { AVG_CHAR_WIDTH, LINE_HEIGHT } from \"../shapes/text-helpers\"\nimport { attrs, escapeXml, svgNum } from \"./svg-utils\"\n\nexport interface SvgTextBox {\n x: number\n y: number\n w: number\n h: number\n}\n\nexport interface SvgTextOptions {\n fontFamily: string\n fontSize: number\n /** CSS colour for the glyphs. */\n color: string\n align: DefaultHorizontalAlignStyle | \"start\" | \"middle\" | \"end\"\n verticalAlign: DefaultVerticalAlignStyle\n /** Inset from the box edges on every side. */\n padding?: number\n /** Soft-wrap paragraphs at the box width (minus padding). */\n wrap?: boolean\n fontWeight?: string | number\n}\n\n/** Split `text` into rendered lines: hard breaks on `\\n`, soft wraps at `maxWidth` when given. */\nexport function wrapTextLines(text: string, fontSize: number, maxWidth = Infinity): string[] {\n const charW = fontSize * AVG_CHAR_WIDTH\n const limit = Number.isFinite(maxWidth) && charW > 0 ? Math.max(1, Math.floor(maxWidth / charW)) : Infinity\n const lines: string[] = []\n for (const paragraph of text.split(\"\\n\")) {\n if (paragraph.length <= limit) {\n lines.push(paragraph)\n continue\n }\n let current = \"\"\n for (const word of paragraph.split(\" \")) {\n const candidate = current.length === 0 ? word : `${current} ${word}`\n if (candidate.length <= limit) {\n current = candidate\n continue\n }\n if (current.length > 0) lines.push(current)\n // A single word longer than the line breaks mid-word, like `overflow-wrap: break-word`.\n let rest = word\n while (rest.length > limit) {\n lines.push(rest.slice(0, limit))\n rest = rest.slice(limit)\n }\n current = rest\n }\n lines.push(current)\n }\n return lines\n}\n\nfunction anchorFor(align: SvgTextOptions[\"align\"]): \"start\" | \"middle\" | \"end\" {\n switch (align) {\n case \"start\":\n case \"start-legacy\":\n return \"start\"\n case \"end\":\n case \"end-legacy\":\n return \"end\"\n default:\n return \"middle\"\n }\n}\n\n/**\n * Render `text` inside `box`. Returns an empty string for empty text. Lines\n * are positioned with `dominant-baseline=\"central\"` so vertical centring does\n * not depend on font metrics.\n */\nexport function textToSvg(text: string, box: SvgTextBox, opts: SvgTextOptions): string {\n if (text.length === 0) return \"\"\n const padding = opts.padding ?? 0\n const innerX = box.x + padding\n const innerY = box.y + padding\n const innerW = Math.max(0, box.w - padding * 2)\n const innerH = Math.max(0, box.h - padding * 2)\n const lines = wrapTextLines(text, opts.fontSize, opts.wrap ? innerW : Infinity)\n const lineH = opts.fontSize * LINE_HEIGHT\n const blockH = lines.length * lineH\n\n const anchor = anchorFor(opts.align)\n const x = anchor === \"start\" ? innerX : anchor === \"end\" ? innerX + innerW : innerX + innerW / 2\n const top = opts.verticalAlign === \"start\" ? innerY : opts.verticalAlign === \"end\" ? innerY + innerH - blockH : innerY + (innerH - blockH) / 2\n\n const spans = lines\n .map((line, i) => {\n const y = top + lineH * i + lineH / 2\n // Preserve runs of spaces and keep empty lines from collapsing.\n const content = line.length === 0 ? \"​\" : escapeXml(line)\n return `<tspan x=\"${svgNum(x)}\" y=\"${svgNum(y)}\">${content}</tspan>`\n })\n .join(\"\")\n\n const a = attrs({\n \"font-family\": opts.fontFamily,\n \"font-size\": opts.fontSize,\n \"font-weight\": opts.fontWeight === undefined ? undefined : String(opts.fontWeight),\n fill: opts.color,\n \"text-anchor\": anchor,\n \"dominant-baseline\": \"central\",\n \"xml:space\": \"preserve\",\n })\n return `<text ${a}>${spans}</text>`\n}\n","/**\n * Per-type SVG renderers for the built-in shapes, keyed by shape type. Every\n * renderer returns markup in shape-local space; the exporter wraps it in a\n * `<g transform>` carrying the page transform.\n *\n * The registry is the middle rung of `shapeToSvg`'s precedence: a util's own\n * `toSvg` outranks it, and a type with neither falls back to its geometry\n * outline drawn with its render style.\n */\nimport type { ReactElement } from \"react\"\nimport { renderToStaticMarkup } from \"react-dom/server\"\nimport {\n FONT_SIZES,\n LIGHT_THEME,\n hexToRgba,\n type Editor,\n type ShapeSvgContext,\n type ShapeSvgResult,\n type StyleWords,\n type UnknownShape,\n} from \"@mocanvas/editor\"\nimport { ARROW_LABEL_PADDING, type ArrowShape } from \"../shapes/ArrowShapeUtil\"\nimport {\n BOOKMARK_BANNER_FILL,\n BOOKMARK_FILL,\n BOOKMARK_META_COLOR,\n BOOKMARK_META_FONT_SIZE,\n BOOKMARK_RADIUS,\n BOOKMARK_STROKE,\n BOOKMARK_STROKE_WIDTH,\n BOOKMARK_TEXT_COLOR,\n BOOKMARK_TEXT_FONT_SIZE,\n BOOKMARK_TITLE_COLOR,\n BOOKMARK_TITLE_FONT_SIZE,\n getBookmarkCard,\n getBookmarkLayout,\n type BookmarkShape,\n} from \"../shapes/BookmarkShapeUtil\"\nimport {\n EMBED_PLACEHOLDER_FILL,\n EMBED_PLACEHOLDER_FONT_SIZE,\n EMBED_PLACEHOLDER_PADDING,\n EMBED_PLACEHOLDER_STROKE,\n EMBED_PLACEHOLDER_TEXT,\n EMBED_RADIUS,\n getEmbedDefinition,\n type EmbedShape,\n} from \"../shapes/EmbedShapeUtil\"\nimport { type FrameShape } from \"../shapes/FrameShapeUtil\"\nimport { GEO_LABEL_PADDING, type GeoShape } from \"../shapes/GeoShapeUtil\"\nimport { getNoteFontSize, NOTE_PADDING, NOTE_SIZE, type NoteShape } from \"../shapes/NoteShapeUtil\"\nimport {\n FRAME_FILL,\n FRAME_NAME_COLOR,\n FRAME_NAME_FONT_SIZE,\n FRAME_NAME_HEIGHT,\n FRAME_NAME_OFFSET,\n FRAME_STROKE,\n FRAME_STROKE_WIDTH,\n NOTE_SHADOW_COLOR,\n NOTE_SHADOW_OPACITY,\n getFontFamily,\n getNoteFillCssColor,\n getNoteGradientTopFrom,\n getNoteShadowSvgRect,\n getNoteTextCssColor,\n getTextCssColor,\n} from \"../shapes/shape-theme\"\nimport { type TextShape } from \"../shapes/TextShapeUtil\"\nimport {\n getVideoPlayTriangle,\n getVideoSource,\n VIDEO_PLACEHOLDER_FILL,\n VIDEO_PLACEHOLDER_STROKE,\n VIDEO_PLAY_COLOR,\n type VideoShape,\n} from \"../shapes/VideoShapeUtil\"\nimport { attrs, escapeXml, geometryLabels, geometryToSvgPaths, rgbaToHex, svgNum } from \"./svg-utils\"\nimport { textToSvg } from \"./text-svg\"\n\n/**\n * Export-wide settings a renderer may consult. Same shape as the context a\n * `ShapeUtil.toSvg` receives, so the two paths cannot drift apart.\n */\nexport interface SvgExportContext extends ShapeSvgContext {}\n\n/** Renders one shape to SVG markup in shape-local coordinates. */\nexport type ShapeSvgRenderer<T extends UnknownShape = UnknownShape> = (editor: Editor, shape: T, ctx: SvgExportContext) => string\n\n/** Outline drawn with the render style, or a hairline in the theme text colour when the shape has none. */\nexport function geometryFallbackSvg(editor: Editor, shape: UnknownShape): string {\n const geometry = editor.getShapeGeometry(shape)\n const style: StyleWords = editor.getShapeUtil(shape).getRenderStyle(shape) ?? {\n fill: 0,\n stroke: hexToRgba(LIGHT_THEME.text),\n strokeWidth: 1,\n dash: 0,\n opacity: 1,\n }\n return geometryToSvgPaths(geometry, style)\n}\n\n/** Fallback renderer applied to shape types without a registry entry. */\nexport const defaultShapeSvgRenderer: ShapeSvgRenderer = (editor, shape) => geometryFallbackSvg(editor, shape)\n\n/** A shape id reduced to characters that are safe inside an SVG `id`. */\nfunction svgId(id: string): string {\n return id.replace(/[^a-zA-Z0-9_-]/g, \"-\")\n}\n\nfunction labelBox(editor: Editor, shape: UnknownShape): { x: number; y: number; w: number; h: number } | undefined {\n const label = geometryLabels(editor.getShapeGeometry(shape))[0]\n if (!label) return undefined\n const b = label.bounds\n return { x: b.x, y: b.y, w: b.w, h: b.h }\n}\n\nconst geoSvg: ShapeSvgRenderer<GeoShape> = (editor, shape) => {\n const { text, font, size, scale, labelColor, align, verticalAlign } = shape.props\n let out = geometryFallbackSvg(editor, shape)\n if (!text) return out\n const box = labelBox(editor, shape)\n if (!box) return out\n out += textToSvg(text, box, {\n fontFamily: getFontFamily(font),\n fontSize: FONT_SIZES[size] * scale,\n color: getTextCssColor(labelColor),\n align,\n verticalAlign,\n padding: GEO_LABEL_PADDING * scale,\n wrap: true,\n })\n return out\n}\n\nconst drawSvg: ShapeSvgRenderer = (editor, shape) => geometryFallbackSvg(editor, shape)\nconst lineSvg: ShapeSvgRenderer = (editor, shape) => geometryFallbackSvg(editor, shape)\n\nconst arrowSvg: ShapeSvgRenderer<ArrowShape> = (editor, shape, ctx) => {\n const { text, font, size, scale, labelColor } = shape.props\n let out = geometryFallbackSvg(editor, shape)\n if (!text) return out\n const box = labelBox(editor, shape)\n if (!box) return out\n // Knock the line out behind the label so the text stays legible.\n out += `<rect ${attrs({ x: box.x, y: box.y, width: box.w, height: box.h, rx: 4, fill: ctx.background })}/>`\n out += textToSvg(text, box, {\n fontFamily: getFontFamily(font),\n fontSize: FONT_SIZES[size] * scale,\n color: getTextCssColor(labelColor),\n align: \"middle\",\n verticalAlign: \"middle\",\n padding: ARROW_LABEL_PADDING * scale,\n wrap: false,\n })\n return out\n}\n\nconst textSvg: ShapeSvgRenderer<TextShape> = (editor, shape) => {\n const { text, font, size, scale, color, textAlign, autoSize } = shape.props\n const b = editor.getShapeGeometry(shape).bounds\n return textToSvg(text, { x: b.x, y: b.y, w: b.w, h: b.h }, {\n fontFamily: getFontFamily(font),\n fontSize: FONT_SIZES[size] * scale,\n color: getTextCssColor(color),\n align: textAlign,\n verticalAlign: \"start\",\n wrap: !autoSize,\n })\n}\n\n/**\n * A note's trim as SVG: a `<linearGradient>` for the body and an\n * `feDropShadow` under it, so an export carries the same trim the DOM overlay\n * paints over the GPU quad. Ids are namespaced by the shape id so several\n * notes in one document do not collide.\n */\nfunction noteTrimDefs(shape: NoteShape, bottom: string, ids: { gradient: string; shadow: string }): string {\n const scale = shape.props.scale\n const gradient =\n `<linearGradient ${attrs({ id: ids.gradient, x1: 0, y1: 0, x2: 0, y2: 1 })}>` +\n `<stop ${attrs({ offset: 0, \"stop-color\": getNoteGradientTopFrom(bottom) })}/>` +\n `<stop ${attrs({ offset: 1, \"stop-color\": bottom })}/>` +\n `</linearGradient>`\n // A generous filter region: the default -10%/120% box clips a soft shadow.\n // `feDropShadow` has no spread, so the shadow is its own inset, offset rect\n // (see `getNoteShadowSvgRect`) and the filter only blurs it.\n const filter =\n `<filter ${attrs({ id: ids.shadow, x: \"-50%\", y: \"-50%\", width: \"200%\", height: \"200%\" })}>` +\n `<feGaussianBlur ${attrs({ stdDeviation: getNoteShadowSvgRect(0, 0, scale).stdDeviation })}/>` +\n `</filter>`\n return `<defs>${gradient}${filter}</defs>`\n}\n\nconst noteSvg: ShapeSvgRenderer<NoteShape> = (editor, shape) => {\n const { text, font, color, labelColor, align, verticalAlign, scale, growY } = shape.props\n const w = NOTE_SIZE * scale\n const h = NOTE_SIZE * scale + growY\n const style = editor.getShapeUtil(shape).getRenderStyle(shape)\n // The engine's flat quad is the gradient's *bottom* colour; the top stop is\n // derived from it, so a custom fill still gradates.\n const bottom = (style && rgbaToHex(style.fill)) ?? getNoteFillCssColor(color)\n const suffix = svgId(shape.id)\n const ids = { gradient: `mc-note-fill-${suffix}`, shadow: `mc-note-shadow-${suffix}` }\n let out = noteTrimDefs(shape, bottom, ids)\n // The shadow first, as its own blurred rect behind the body: the body inset\n // by the spread and pushed down, which is what CSS `box-shadow` draws.\n const sh = getNoteShadowSvgRect(w, h, scale)\n if (sh.w > 0 && sh.h > 0) {\n out += `<rect ${attrs({\n x: sh.x,\n y: sh.y,\n width: sh.w,\n height: sh.h,\n fill: NOTE_SHADOW_COLOR,\n \"fill-opacity\": NOTE_SHADOW_OPACITY,\n filter: `url(#${ids.shadow})`,\n })}/>`\n }\n out += `<rect ${attrs({ x: 0, y: 0, width: w, height: h, fill: `url(#${ids.gradient})` })}/>`\n if (!text) return out\n const textColor = labelColor === \"black\" ? getNoteTextCssColor(color) : LIGHT_THEME[labelColor].solid\n out += textToSvg(text, { x: 0, y: 0, w, h }, {\n fontFamily: getFontFamily(font),\n fontSize: getNoteFontSize(shape),\n color: textColor,\n align,\n verticalAlign,\n padding: NOTE_PADDING * scale,\n wrap: true,\n })\n return out\n}\n\nconst frameSvg: ShapeSvgRenderer<FrameShape> = (_editor, shape) => {\n const { w, h, name } = shape.props\n let out = `<rect ${attrs({ x: 0, y: 0, width: w, height: h, fill: FRAME_FILL, stroke: FRAME_STROKE, \"stroke-width\": FRAME_STROKE_WIDTH })}/>`\n if (name) {\n // The single-line name sits in a strip just above the frame, like the DOM label.\n const [firstLine = \"\"] = name.split(\"\\n\")\n out += textToSvg(firstLine, { x: 0, y: -FRAME_NAME_OFFSET, w, h: FRAME_NAME_HEIGHT }, {\n fontFamily: getFontFamily(\"sans\"),\n fontSize: FRAME_NAME_FONT_SIZE,\n color: FRAME_NAME_COLOR,\n align: \"start\",\n verticalAlign: \"end\",\n wrap: false,\n })\n }\n return out\n}\n\n/**\n * A bookmark's card, drawn with rects and text. The banner is a plain block\n * rather than the scraped image: an export has to stand on its own, and a\n * remote `<image href>` would either fail to load or leak a request when the\n * file is opened somewhere else.\n */\nconst bookmarkSvg: ShapeSvgRenderer<BookmarkShape> = (editor, shape) => {\n const { w, h } = shape.props\n const card = getBookmarkCard(editor, shape)\n const layout = getBookmarkLayout(w, h)\n const sans = getFontFamily(\"sans\")\n let out = `<rect ${attrs({\n x: 0,\n y: 0,\n width: w,\n height: h,\n rx: BOOKMARK_RADIUS,\n fill: BOOKMARK_FILL,\n stroke: BOOKMARK_STROKE,\n \"stroke-width\": BOOKMARK_STROKE_WIDTH,\n })}/>`\n if (layout.banner.h > 0) {\n out += `<rect ${attrs({ x: 0, y: 0, width: layout.banner.w, height: layout.banner.h, fill: BOOKMARK_BANNER_FILL })}/>`\n }\n const title = card.hasAsset ? card.title : card.hostname || card.url\n out += textToSvg(title, layout.title, {\n fontFamily: sans,\n fontSize: BOOKMARK_TITLE_FONT_SIZE,\n color: card.hasAsset ? BOOKMARK_TITLE_COLOR : BOOKMARK_META_COLOR,\n align: \"start\",\n verticalAlign: \"start\",\n ...(card.hasAsset ? { fontWeight: 600 } : {}),\n wrap: true,\n })\n if (!card.hasAsset) return out\n out += textToSvg(card.description, layout.description, {\n fontFamily: sans,\n fontSize: BOOKMARK_TEXT_FONT_SIZE,\n color: BOOKMARK_TEXT_COLOR,\n align: \"start\",\n verticalAlign: \"start\",\n wrap: true,\n })\n if (card.favicon) {\n // The favicon's block, for the same reason the banner is one.\n out += `<rect ${attrs({ ...boxAttrs(layout.favicon), rx: 2, fill: BOOKMARK_BANNER_FILL })}/>`\n }\n out += textToSvg(card.hostname, layout.hostname, {\n fontFamily: sans,\n fontSize: BOOKMARK_META_FONT_SIZE,\n color: BOOKMARK_META_COLOR,\n align: \"start\",\n verticalAlign: \"middle\",\n wrap: false,\n })\n return out\n}\n\n/** `x`/`y`/`width`/`height` attributes for a shape-local rect. */\nfunction boxAttrs(box: { x: number; y: number; w: number; h: number }): Record<string, number> {\n return { x: box.x, y: box.y, width: box.w, height: box.h }\n}\n\n/**\n * An embed as a placeholder card: an `<iframe>` cannot go in an SVG, so the\n * export carries the frame and the url it pointed at.\n */\nconst embedSvg: ShapeSvgRenderer<EmbedShape> = (_editor, shape) => {\n const { w, h, url } = shape.props\n const match = getEmbedDefinition(url)\n const label = match ? `${match.definition.title}\\n${url}` : url\n let out = `<rect ${attrs({\n x: 0,\n y: 0,\n width: w,\n height: h,\n rx: EMBED_RADIUS,\n fill: EMBED_PLACEHOLDER_FILL,\n stroke: EMBED_PLACEHOLDER_STROKE,\n \"stroke-width\": 1,\n \"stroke-dasharray\": \"4 4\",\n })}/>`\n out += textToSvg(label, { x: 0, y: 0, w, h }, {\n fontFamily: getFontFamily(\"sans\"),\n fontSize: EMBED_PLACEHOLDER_FONT_SIZE,\n color: EMBED_PLACEHOLDER_TEXT,\n align: \"middle\",\n verticalAlign: \"middle\",\n padding: EMBED_PLACEHOLDER_PADDING,\n wrap: true,\n })\n return out\n}\n\n/** A video as its poster frame's stand-in: the box and a play triangle. */\nconst videoSvg: ShapeSvgRenderer<VideoShape> = (editor, shape) => {\n const { w, h, altText } = shape.props\n const hasSource = getVideoSource(editor, shape) !== null\n let out = `<rect ${attrs({\n x: 0,\n y: 0,\n width: w,\n height: h,\n fill: VIDEO_PLACEHOLDER_FILL,\n stroke: VIDEO_PLACEHOLDER_STROKE,\n \"stroke-width\": 1,\n \"stroke-dasharray\": hasSource ? undefined : \"4 4\",\n })}/>`\n const points = getVideoPlayTriangle(w, h)\n .map((p) => `${svgNum(p.x)},${svgNum(p.y)}`)\n .join(\" \")\n out += `<polygon ${attrs({ points, fill: VIDEO_PLAY_COLOR })}/>`\n if (altText) {\n out += `<title>${escapeXml(altText)}</title>`\n }\n return out\n}\n\n/**\n * Registry of per-type renderers. Custom shapes can register their own entry;\n * anything missing falls back to `defaultShapeSvgRenderer`.\n */\nexport const shapeSvgRenderers = new Map<string, ShapeSvgRenderer>([\n [\"geo\", geoSvg as ShapeSvgRenderer],\n [\"draw\", drawSvg],\n [\"line\", lineSvg],\n [\"arrow\", arrowSvg as ShapeSvgRenderer],\n [\"text\", textSvg as ShapeSvgRenderer],\n [\"note\", noteSvg as ShapeSvgRenderer],\n [\"frame\", frameSvg as ShapeSvgRenderer],\n [\"bookmark\", bookmarkSvg as ShapeSvgRenderer],\n [\"embed\", embedSvg as ShapeSvgRenderer],\n [\"video\", videoSvg as ShapeSvgRenderer],\n])\n\n/** Register (or replace) the SVG renderer for a shape type. */\nexport function registerShapeSvgRenderer<T extends UnknownShape>(type: T[\"type\"], renderer: ShapeSvgRenderer<T>): void {\n shapeSvgRenderers.set(type, renderer as ShapeSvgRenderer)\n}\n\n/**\n * Markup for a value returned by `toSvg` / `toBackgroundSvg`: a string is used\n * verbatim, a React node is serialized, and React's empty values become\n * `undefined` so the caller can fall through to the next renderer.\n */\nexport function svgResultToMarkup(value: ShapeSvgResult): string | undefined {\n if (value === undefined || value === null || typeof value === \"boolean\") return undefined\n if (typeof value === \"string\") return value\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value)\n return renderToStaticMarkup(value as ReactElement)\n}\n\n/**\n * Render a shape to SVG markup in shape-local space.\n *\n * Precedence, highest first:\n *\n * 1. `ShapeUtil.toSvg` — the shape's own opinion about itself. A custom shape\n * is exportable by implementing one method, with nothing to register.\n * 2. `shapeSvgRenderers` — the registry, which carries the built-in shapes and\n * lets an app override a type whose util it does not own (see\n * `registerShapeSvgRenderer`).\n * 3. The shape's geometry stroked with its render style — the last resort, so\n * an unknown type still exports as something rather than as nothing.\n */\nexport function shapeToSvg(editor: Editor, shape: UnknownShape, ctx: SvgExportContext): string {\n const util = editor.getShapeUtil(shape)\n const own = svgResultToMarkup(util.toSvg?.(shape, ctx))\n if (own !== undefined) return own\n const renderer = shapeSvgRenderers.get(shape.type) ?? defaultShapeSvgRenderer\n return renderer(editor, shape, ctx)\n}\n\n/**\n * A shape's backdrop in shape-local space, drawn behind *every* exported\n * shape. Only `ShapeUtil.toBackgroundSvg` produces one; there is no registry\n * behind it and no geometry fallback, because a shape that says nothing here\n * wants nothing drawn.\n */\nexport function shapeToBackgroundSvg(editor: Editor, shape: UnknownShape, ctx: SvgExportContext): string | undefined {\n return svgResultToMarkup(editor.getShapeUtil(shape).toBackgroundSvg?.(shape, ctx))\n}\n","/**\n * Export shapes to a standalone SVG document string.\n */\nimport { Box, type Editor, type ShapeId, type UnknownShape } from \"@mocanvas/editor\"\nimport { shapeToBackgroundSvg, shapeToSvg, type SvgExportContext } from \"./shape-svg\"\nimport { attrs, matrixAttr, svgNum } from \"./svg-utils\"\n\nexport interface SvgExportOptions {\n /** Page units added around the shapes' bounds. Default 32. */\n padding?: number\n /** Paint a full-size background rectangle. Default false. */\n background?: boolean\n /** Multiplier applied to the output `width`/`height`. Default 1. */\n scale?: number\n /** Use the dark background colour. Default false. */\n darkMode?: boolean\n}\n\nexport interface SvgExportResult {\n svg: string\n /** Output size in CSS pixels (bounds × scale). */\n width: number\n height: number\n}\n\nexport const SVG_EXPORT_DEFAULT_PADDING = 32\nexport const SVG_LIGHT_BACKGROUND = \"#f9fafb\"\nexport const SVG_DARK_BACKGROUND = \"#101011\"\n\n/**\n * The shapes an export covers: the given ids (or the selection, or the whole\n * page when nothing is selected) together with all of their descendants, in\n * page draw order.\n */\nexport function getExportShapes(editor: Editor, ids?: readonly ShapeId[]): UnknownShape[] {\n const sorted = editor.getCurrentPageShapesSorted()\n let roots: readonly ShapeId[] | undefined = ids\n if (!roots) {\n const selected = editor.getSelectedShapeIds()\n if (selected.length === 0) return sorted\n roots = selected\n }\n const included = new Set<ShapeId>()\n const visit = (id: ShapeId): void => {\n if (included.has(id)) return\n included.add(id)\n for (const child of editor.getSortedChildIdsForParent(id)) visit(child)\n }\n for (const id of roots) if (editor.getShape(id)) visit(id)\n return sorted.filter((s) => included.has(s.id))\n}\n\n/** Common page bounds of the shapes, or `undefined` when there are none. */\nexport function getExportBounds(editor: Editor, shapes: readonly UnknownShape[]): Box | undefined {\n const boxes: Box[] = []\n for (const shape of shapes) {\n const b = editor.getShapePageBounds(shape)\n if (b) boxes.push(b)\n }\n return boxes.length === 0 ? undefined : Box.Common(boxes)\n}\n\nlet clipCounter = 0\n\n/**\n * Serialize shapes to an SVG string. Returns `undefined` when there is\n * nothing to export.\n */\nexport function getSvgString(editor: Editor, ids?: readonly ShapeId[], opts: SvgExportOptions = {}): SvgExportResult | undefined {\n const padding = opts.padding ?? SVG_EXPORT_DEFAULT_PADDING\n const scale = opts.scale ?? 1\n const darkMode = opts.darkMode ?? false\n\n const shapes = getExportShapes(editor, ids)\n if (shapes.length === 0) return undefined\n const bounds = getExportBounds(editor, shapes)\n if (!bounds) return undefined\n\n const view = Box.Expand(bounds, padding)\n const width = Math.max(1, Math.ceil(view.w * scale))\n const height = Math.max(1, Math.ceil(view.h * scale))\n const background = darkMode ? SVG_DARK_BACKGROUND : SVG_LIGHT_BACKGROUND\n const ctx: SvgExportContext = { darkMode, background }\n\n const included = new Set(shapes.map((s) => s.id))\n const defs: string[] = []\n // `ShapeUtil.toBackgroundSvg` output, collected separately and emitted before\n // every shape so a backdrop stays behind the whole drawing rather than only\n // behind its own shape. It is not clipped by an ancestor frame.\n const backdrop: string[] = []\n const body: string[] = []\n const prefix = `mc${(clipCounter++).toString(36)}`\n\n const emit = (shape: UnknownShape): void => {\n const transform = editor.getShapePageTransform(shape)\n const g = attrs({\n transform: matrixAttr(transform),\n opacity: shape.opacity < 1 ? shape.opacity : undefined,\n \"data-shape-type\": shape.type,\n })\n const behind = shapeToBackgroundSvg(editor, shape, ctx)\n if (behind !== undefined) backdrop.push(`<g ${g} data-shape-background=\"true\">${behind}</g>`)\n const inner = shapeToSvg(editor, shape, ctx)\n body.push(`<g ${g}>${inner}</g>`)\n\n const children = editor.getSortedChildIdsForParent(shape.id).filter((id) => included.has(id))\n if (children.length === 0) return\n if (shape.type === \"frame\") {\n const b = editor.getShapeGeometry(shape).bounds\n const clipId = `${prefix}-clip-${defs.length}`\n defs.push(\n `<clipPath id=\"${clipId}\"><rect ${attrs({ transform: matrixAttr(transform), x: b.x, y: b.y, width: b.w, height: b.h })}/></clipPath>`,\n )\n body.push(`<g clip-path=\"url(#${clipId})\">`)\n for (const id of children) {\n const child = editor.getShape(id)\n if (child) emit(child)\n }\n body.push(`</g>`)\n return\n }\n for (const id of children) {\n const child = editor.getShape(id)\n if (child) emit(child)\n }\n }\n\n for (const shape of shapes) {\n // Descendants are emitted by their ancestors; only roots start here.\n const parentIncluded = included.has(shape.parentId as ShapeId)\n if (!parentIncluded) emit(shape)\n }\n\n const viewBox = `${svgNum(view.x)} ${svgNum(view.y)} ${svgNum(view.w)} ${svgNum(view.h)}`\n const parts: string[] = []\n parts.push(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"${viewBox}\">`)\n if (defs.length > 0) parts.push(`<defs>${defs.join(\"\")}</defs>`)\n if (opts.background) {\n parts.push(`<rect ${attrs({ x: view.x, y: view.y, width: view.w, height: view.h, fill: background })}/>`)\n }\n parts.push(...backdrop)\n parts.push(...body)\n parts.push(`</svg>`)\n return { svg: parts.join(\"\"), width, height }\n}\n","/**\n * Export shapes to a `Blob` (SVG or raster), plus small browser helpers to\n * download or copy the result. Raster export needs a DOM; the functions guard\n * for Node and fail with a clear error instead of a reference error.\n */\nimport type { Editor, ShapeId } from \"@mocanvas/editor\"\nimport { getSvgString, type SvgExportOptions } from \"./svg\"\n\nexport type ExportFormat = \"svg\" | \"png\" | \"jpeg\" | \"webp\"\n\nexport interface ExportToBlobOptions extends SvgExportOptions {\n ids?: readonly ShapeId[]\n format: ExportFormat\n /** Encoder quality for lossy formats (0..1). */\n quality?: number\n /** Device pixel ratio multiplier for raster output. Defaults to `window.devicePixelRatio`. */\n pixelRatio?: number\n}\n\nconst MIME: Record<ExportFormat, string> = {\n svg: \"image/svg+xml\",\n png: \"image/png\",\n jpeg: \"image/jpeg\",\n webp: \"image/webp\",\n}\n\nfunction hasDom(): boolean {\n return typeof document !== \"undefined\" && typeof window !== \"undefined\"\n}\n\n/** Render the export to a `Blob`. SVG works anywhere; raster formats need a browser. */\nexport async function exportToBlob(editor: Editor, opts: ExportToBlobOptions): Promise<Blob> {\n const { ids, format, quality, pixelRatio, ...svgOpts } = opts\n const result = getSvgString(editor, ids, svgOpts)\n if (!result) throw new Error(\"Nothing to export\")\n const svgBlob = new Blob([result.svg], { type: MIME.svg })\n if (format === \"svg\") return svgBlob\n\n if (!hasDom()) {\n throw new Error(`Raster export (\"${format}\") needs a browser environment; only \"svg\" is available here`)\n }\n\n const ratio = pixelRatio ?? (window.devicePixelRatio || 1)\n const url = URL.createObjectURL(svgBlob)\n try {\n const image = await loadImage(url)\n const canvas = document.createElement(\"canvas\")\n canvas.width = Math.max(1, Math.round(result.width * ratio))\n canvas.height = Math.max(1, Math.round(result.height * ratio))\n const ctx = canvas.getContext(\"2d\")\n if (!ctx) throw new Error(\"Could not create a 2D canvas context\")\n if (format === \"jpeg\" && !svgOpts.background) {\n // JPEG has no alpha; paint the page colour so transparent areas do not turn black.\n ctx.fillStyle = svgOpts.darkMode ? \"#101011\" : \"#f9fafb\"\n ctx.fillRect(0, 0, canvas.width, canvas.height)\n }\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height)\n return await canvasToBlob(canvas, MIME[format], quality)\n } finally {\n URL.revokeObjectURL(url)\n }\n}\n\nfunction loadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const image = new Image()\n image.decoding = \"sync\"\n image.onload = () => resolve(image)\n image.onerror = () => reject(new Error(\"Could not rasterize the SVG\"))\n image.src = url\n })\n}\n\nfunction canvasToBlob(canvas: HTMLCanvasElement, type: string, quality?: number): Promise<Blob> {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (blob) resolve(blob)\n else reject(new Error(`Canvas could not encode \"${type}\"`))\n },\n type,\n quality,\n )\n })\n}\n\n/** Trigger a download of `blob` as `filename`. No-op outside a browser. */\nexport function downloadBlob(blob: Blob, filename: string): void {\n if (!hasDom()) return\n const url = URL.createObjectURL(blob)\n const anchor = document.createElement(\"a\")\n anchor.href = url\n anchor.download = filename\n anchor.rel = \"noopener\"\n anchor.style.display = \"none\"\n document.body.appendChild(anchor)\n anchor.click()\n anchor.remove()\n // Give the browser a tick to start the download before the URL goes away.\n setTimeout(() => URL.revokeObjectURL(url), 1000)\n}\n\n/**\n * Copy `blob` to the system clipboard. Images go through `ClipboardItem`;\n * SVG (which clipboards do not accept as an image) is copied as text.\n */\nexport async function copyBlobToClipboard(blob: Blob): Promise<void> {\n const clipboard = typeof navigator === \"undefined\" ? undefined : navigator.clipboard\n if (!clipboard) throw new Error(\"Clipboard API is not available\")\n if (blob.type === MIME.svg || !(\"write\" in clipboard) || typeof ClipboardItem === \"undefined\") {\n if (blob.type !== MIME.svg && !(\"writeText\" in clipboard)) throw new Error(\"Clipboard does not accept images\")\n await clipboard.writeText(await blob.text())\n return\n }\n await clipboard.write([new ClipboardItem({ [blob.type]: blob })])\n}\n","import {\n registerExportImplementation,\n registerTextMeasureImplementation,\n type Editor,\n type ShapeId,\n} from \"@mocanvas/editor\"\nimport { exportToBlob, getSvgString } from \"./export\"\nimport { getTextMeasure } from \"./text\"\n\n/**\n * `@mocanvas/editor` declares `Editor.getSvgString`, `Editor.toImage` and\n * `Editor.textMeasure` but cannot implement them: exporting needs the default\n * shapes' SVG renderers and measuring text needs the DOM, both of which live\n * here, and this package depends on the editor rather than the other way round.\n *\n * Importing `mocanvas` runs this module and fills those three in. An app that\n * builds on `@mocanvas/editor` alone either imports this package or registers\n * its own through the same seam.\n */\nregisterExportImplementation({\n getSvgString,\n async toImage(editor: Editor, ids?: readonly ShapeId[], opts = {}) {\n const { format = \"png\", ...rest } = opts\n // Measure from the SVG so the caller learns the size without decoding the blob.\n const measured = getSvgString(editor, ids, rest)\n if (!measured) throw new Error(\"Nothing to export: the page has no shapes, and none were named.\")\n const blob = await exportToBlob(editor, { ...rest, ...(ids === undefined ? {} : { ids }), format })\n return { blob, width: measured.width, height: measured.height }\n },\n})\n\nregisterTextMeasureImplementation(getTextMeasure)\n","import type { VecLike } from \"@mocanvas/editor\"\n\n/**\n * One pass of a light 1-2-1 moving average over a freehand stroke. Endpoints\n * are kept fixed so the stroke still starts and ends where the pen did.\n * Extra properties on each point (e.g. pressure `z`) are preserved.\n */\nexport function smoothPoints<P extends VecLike>(points: readonly P[]): P[] {\n const n = points.length\n if (n < 4) return points.slice()\n const out: P[] = [points[0]!]\n for (let i = 1; i < n - 1; i++) {\n const prev = points[i - 1]!\n const p = points[i]!\n const next = points[i + 1]!\n out.push({ ...p, x: (prev.x + 2 * p.x + next.x) / 4, y: (prev.y + 2 * p.y + next.y) / 4 })\n }\n out.push(points[n - 1]!)\n return out\n}\n","import {\n Polygon2d,\n Polyline2d,\n ShapeUtil,\n STROKE_SIZES,\n DefaultColorStyle,\n DefaultDashStyle,\n DefaultFillStyle,\n DefaultSizeStyle,\n type BaseShape,\n type Geometry2d,\n type ResizeInfo,\n type StyleWords,\n type VecLike,\n} from \"@mocanvas/editor\"\nimport type { ReactNode } from \"react\"\nimport { smoothPoints } from \"./draw-helpers\"\nimport { propsOf, readArray, readBoolean, readEnum, readNumber, readStyle } from \"./prop-access\"\nimport { getFillRgba, getStrokeRgba, getDashId } from \"./shape-theme\"\n\nexport interface DrawPoint {\n x: number\n y: number\n z?: number\n}\n\nexport interface DrawSegment {\n type: \"free\" | \"straight\"\n points: DrawPoint[]\n}\n\nexport interface DrawShapeProps {\n segments: DrawSegment[]\n color: DefaultColorStyle\n fill: DefaultFillStyle\n dash: DefaultDashStyle\n size: DefaultSizeStyle\n isComplete: boolean\n isClosed: boolean\n isPen: boolean\n scale: number\n}\n\nexport type DrawShape = BaseShape<\"draw\", DrawShapeProps>\n\nconst SEGMENT_TYPES = [\"free\", \"straight\"] as const\n\n/**\n * The shape's segments in a usable form. A segment that carries no decoded\n * `points` array — an encoding the load path could not read, say — reads as an\n * empty run and contributes nothing, rather than throwing.\n */\nexport function readDrawSegments(shape: { props?: unknown }): DrawSegment[] {\n const out: DrawSegment[] = []\n for (const seg of readArray(propsOf(shape), \"segments\")) {\n const points: DrawPoint[] = readArray(seg, \"points\").map((p) => {\n const point: DrawPoint = { x: readNumber(p, \"x\", 0), y: readNumber(p, \"y\", 0) }\n // Pressure stays absent when the stored point has none, so a round trip\n // through here does not invent one.\n const z = (p as { z?: unknown } | null)?.z\n if (typeof z === \"number\" && Number.isFinite(z)) point.z = z\n return point\n })\n out.push({ type: readEnum(seg, \"type\", SEGMENT_TYPES, \"free\"), points })\n }\n return out\n}\n\n/** Flatten a draw shape's segments to one outline, smoothing freehand runs. */\nexport function getDrawOutlinePoints(shape: DrawShape): VecLike[] {\n const out: VecLike[] = []\n for (const seg of readDrawSegments(shape)) {\n const pts = seg.type === \"free\" && seg.points.length >= 4 ? smoothPoints(seg.points) : seg.points\n for (const p of pts) out.push({ x: p.x, y: p.y })\n }\n return out\n}\n\nexport class DrawShapeUtil extends ShapeUtil<DrawShape> {\n static override type = \"draw\" as const\n static override props = { color: DefaultColorStyle, fill: DefaultFillStyle, dash: DefaultDashStyle, size: DefaultSizeStyle }\n\n getDefaultProps(): DrawShapeProps {\n return {\n segments: [],\n color: \"black\",\n fill: \"none\",\n dash: \"draw\",\n size: \"m\",\n isComplete: false,\n isClosed: false,\n isPen: false,\n scale: 1,\n }\n }\n\n getGeometry(shape: DrawShape): Geometry2d {\n const points = getDrawOutlinePoints(shape)\n const p = propsOf(shape)\n if (readBoolean(p, \"isClosed\", false) && points.length > 2) {\n return new Polygon2d({ points, isFilled: readStyle(p, \"fill\", DefaultFillStyle) !== \"none\" })\n }\n return new Polyline2d({ points: points.length === 0 ? [{ x: 0, y: 0 }] : points })\n }\n\n override getRenderStyle(shape: DrawShape): StyleWords {\n const p = propsOf(shape)\n const color = readStyle(p, \"color\", DefaultColorStyle)\n const fill = readStyle(p, \"fill\", DefaultFillStyle)\n const size = readStyle(p, \"size\", DefaultSizeStyle)\n const scale = readNumber(p, \"scale\", 1)\n const isClosed = readBoolean(p, \"isClosed\", false)\n const dash = readStyle(p, \"dash\", DefaultDashStyle)\n return {\n stroke: getStrokeRgba(color),\n strokeWidth: STROKE_SIZES[size] * scale,\n fill: isClosed && fill !== \"none\" ? getFillRgba(color, fill) : 0,\n // `draw` asks the engine to replace an outline with a hand-drawn version of\n // it. A draw shape's points *are* a hand-drawn version already — a recorded\n // pen movement, smoothed — so putting them through it a second time only\n // adds bulges the hand never made. Ask for the solid stroke instead. The\n // record keeps `props.dash` exactly as it was, so the style panel still\n // shows \"draw\", a `.tldr` round trip is unaffected, and `dashed`/`dotted`\n // reach the engine untouched.\n dash: getDashId(dash === \"draw\" ? \"solid\" : dash),\n opacity: 1,\n }\n }\n\n component(_shape: DrawShape): ReactNode {\n return null\n }\n\n indicator(shape: DrawShape): ReactNode {\n const points = getDrawOutlinePoints(shape)\n if (readBoolean(propsOf(shape), \"isClosed\", false) && points.length > 2) points.push(points[0]!)\n const d = points.map((p) => `${Math.round(p.x * 100) / 100},${Math.round(p.y * 100) / 100}`).join(\" \")\n return <polyline points={d} fill=\"none\" />\n }\n\n override canResize(_shape: DrawShape): boolean {\n return true\n }\n\n override hideResizeHandles(_shape: DrawShape): boolean {\n return false\n }\n\n override onResize(shape: DrawShape, info: ResizeInfo<DrawShape>): Partial<DrawShape> {\n const { scaleX, scaleY, initialShape, newPoint } = info\n const segments = readDrawSegments(initialShape).map((seg) => ({\n ...seg,\n points: seg.points.map((p) => ({ ...p, x: p.x * scaleX, y: p.y * scaleY })),\n }))\n return { x: newPoint.x, y: newPoint.y, props: { ...shape.props, segments } }\n }\n}\n","import {\n BaseBoxShapeUtil,\n Rectangle2d,\n type AssetId,\n type BaseShape,\n type Editor,\n type Geometry2d,\n type ImageAsset,\n type StyleWords,\n} from \"@mocanvas/editor\"\nimport type { CSSProperties, ReactNode } from \"react\"\nimport { propsOf, readBoolean, readNumber, readString } from \"./prop-access\"\n\n/** Normalized crop window: both corners in [0, 1] of the source image. */\nexport interface ImageCrop {\n topLeft: { x: number; y: number }\n bottomRight: { x: number; y: number }\n isCircle?: boolean\n}\n\nexport interface ImageShapeProps {\n w: number\n h: number\n /** The image asset holding the pixels; `null` while nothing is attached. */\n assetId: AssetId | null\n /** Whether an animated image plays. */\n playing: boolean\n /** A hyperlink attached to the shape (not the image source). */\n url: string\n crop: ImageCrop | null\n flipX: boolean\n flipY: boolean\n altText: string\n}\n\nexport type ImageShape = BaseShape<\"image\", ImageShapeProps>\n\nexport const IMAGE_PLACEHOLDER_FILL = \"#eceff3\"\nexport const IMAGE_PLACEHOLDER_STROKE = \"#9fa8b2\"\n\n/**\n * The source the shape's pixels come from: the asset's `src` (a URL or data URL),\n * or `null` when the shape has no asset yet or the asset is still uploading.\n * `getImageTextureKey` turns it into a GPU texture; `component` draws the same\n * source in the DOM overlay while that texture loads (and for crops/flips).\n */\nexport function getImageTextureSource(editor: Editor, shape: ImageShape): string | null {\n const assetId = readString(propsOf(shape), \"assetId\", \"\") as AssetId | \"\"\n if (!assetId) return null\n const asset = editor.getAsset<ImageAsset>(assetId)\n if (!asset || asset.type !== \"image\") return null\n return asset.props.src ?? null\n}\n\n/**\n * Texture cache key for the shape's pixels, or `null` when it must stay on the\n * DOM overlay.\n *\n * The GPU path only covers the plain case. The engine maps uv `0..1` over the\n * shape's local geometry bounds, so a crop window or a flip would need the quad\n * to carry its own uvs; until the bridge does, cropped and flipped images (and\n * anything without a decoded source) are drawn by `component`.\n *\n * Assets are treated as immutable, so the key is the asset id: replacing an\n * asset's `src` in place keeps the cached texture.\n */\nexport function getImageTextureKey(editor: Editor, shape: ImageShape): string | null {\n const p = propsOf(shape)\n const assetId = readString(p, \"assetId\", \"\")\n if (!assetId || p[\"crop\"] || readBoolean(p, \"flipX\", false) || readBoolean(p, \"flipY\", false)) return null\n if (!canUploadImageTextures()) return null\n return getImageTextureSource(editor, shape) === null ? null : `asset:${assetId}`\n}\n\n/** Whether this environment can decode an image into a texture source at all. */\nexport function canUploadImageTextures(): boolean {\n return typeof createImageBitmap === \"function\" || typeof Image === \"function\"\n}\n\n/** Decode an image `src` (URL or data URL) into something the GPU can sample. */\nexport async function loadImageTextureSource(src: string): Promise<TexImageSource> {\n const isData = src.startsWith(\"data:\")\n if (!isData && typeof createImageBitmap === \"function\" && typeof fetch === \"function\") {\n const res = await fetch(src)\n if (!res.ok) throw new Error(`mocanvas: image asset request failed (${res.status})`)\n return await createImageBitmap(await res.blob())\n }\n return await loadHtmlImage(src, isData)\n}\n\nfunction loadHtmlImage(src: string, isData: boolean): Promise<HTMLImageElement> {\n if (typeof Image !== \"function\") return Promise.reject(new Error(\"mocanvas: no image decoder available\"))\n return new Promise((resolve, reject) => {\n const img = new Image()\n if (!isData) img.crossOrigin = \"anonymous\"\n img.onload = () => resolve(img)\n img.onerror = () => reject(new Error(\"mocanvas: image asset failed to decode\"))\n img.src = src\n })\n}\n\n/** CSS for the `<img>` so the crop window fills the shape's box; `null` crop shows the whole image. */\nexport function getImageCropStyle(shape: ImageShape): CSSProperties {\n const { w, h } = readImageBox(shape)\n const p = propsOf(shape)\n const crop = readImageCrop(shape)\n const flipX = readBoolean(p, \"flipX\", false)\n const flipY = readBoolean(p, \"flipY\", false)\n const transform = flipX || flipY ? `scale(${flipX ? -1 : 1}, ${flipY ? -1 : 1})` : undefined\n if (!crop) {\n return { position: \"absolute\", left: 0, top: 0, width: w, height: h, ...(transform ? { transform } : {}) }\n }\n const cw = Math.max(1e-6, crop.bottomRight.x - crop.topLeft.x)\n const ch = Math.max(1e-6, crop.bottomRight.y - crop.topLeft.y)\n const fullW = w / cw\n const fullH = h / ch\n return {\n position: \"absolute\",\n left: -crop.topLeft.x * fullW,\n top: -crop.topLeft.y * fullH,\n width: fullW,\n height: fullH,\n ...(transform ? { transform } : {}),\n }\n}\n\n/** The shape's box, with each side falling back to the util's default. */\nfunction readImageBox(shape: { props?: unknown }): { w: number; h: number } {\n const p = propsOf(shape)\n return { w: readNumber(p, \"w\", 100), h: readNumber(p, \"h\", 100) }\n}\n\n/** The crop window, or `null` when there is none or it is not shaped like one. */\nfunction readImageCrop(shape: { props?: unknown }): ImageCrop | null {\n const crop = propsOf(shape)[\"crop\"]\n if (typeof crop !== \"object\" || crop === null) return null\n const corners = crop as { topLeft?: unknown; bottomRight?: unknown }\n if (typeof corners.topLeft !== \"object\" || typeof corners.bottomRight !== \"object\") return null\n return {\n topLeft: { x: readNumber(corners.topLeft, \"x\", 0), y: readNumber(corners.topLeft, \"y\", 0) },\n bottomRight: { x: readNumber(corners.bottomRight, \"x\", 1), y: readNumber(corners.bottomRight, \"y\", 1) },\n isCircle: readBoolean(crop, \"isCircle\", false),\n }\n}\n\nexport class ImageShapeUtil extends BaseBoxShapeUtil<ImageShape> {\n static override type = \"image\" as const\n\n getDefaultProps(): ImageShapeProps {\n return { w: 100, h: 100, assetId: null, playing: true, url: \"\", crop: null, flipX: false, flipY: false, altText: \"\" }\n }\n\n getGeometry(shape: ImageShape): Geometry2d {\n const { w, h } = readImageBox(shape)\n return new Rectangle2d({ width: Math.max(1, w), height: Math.max(1, h), isFilled: true })\n }\n\n /** A white textured quad over the shape's bounds, or `null` for the DOM overlay path. */\n override getRenderStyle(shape: ImageShape): StyleWords | null {\n const key = getImageTextureKey(this.editor, shape)\n if (!key) return null\n const src = getImageTextureSource(this.editor, shape)\n if (!src) return null\n const texture = this.editor.textures.acquire(key, () => loadImageTextureSource(src))\n if (!texture) return null\n return { fill: 0xffffffff, stroke: 0, strokeWidth: 0, dash: 0, opacity: 1, texture }\n }\n\n /** The DOM overlay draws the image until (and unless) its texture is ready. */\n override needsOverlay(shape: ImageShape): boolean {\n if (super.needsOverlay(shape)) return true\n const key = getImageTextureKey(this.editor, shape)\n return key === null || !this.editor.textures.isReady(key)\n }\n\n component(shape: ImageShape): ReactNode {\n const { w, h } = readImageBox(shape)\n const crop = readImageCrop(shape)\n const altText = readString(propsOf(shape), \"altText\", \"\")\n const src = getImageTextureSource(this.editor, shape)\n const clip: CSSProperties = {\n position: \"absolute\",\n left: 0,\n top: 0,\n width: w,\n height: h,\n overflow: \"hidden\",\n ...(crop?.isCircle ? { borderRadius: \"50%\" } : {}),\n }\n if (!src) {\n return (\n <div\n style={{\n ...clip,\n boxSizing: \"border-box\",\n background: IMAGE_PLACEHOLDER_FILL,\n border: `1px dashed ${IMAGE_PLACEHOLDER_STROKE}`,\n }}\n aria-label={altText || \"image\"}\n />\n )\n }\n return (\n <div style={clip}>\n <img src={src} alt={altText} draggable={false} style={{ ...getImageCropStyle(shape), pointerEvents: \"none\", userSelect: \"none\" }} />\n </div>\n )\n }\n\n indicator(shape: ImageShape): ReactNode {\n const { w, h } = readImageBox(shape)\n return <rect width={w} height={h} />\n }\n\n override isAspectRatioLocked(_shape: ImageShape): boolean {\n return true\n }\n}\n","import {\n CubicSpline2d,\n Polyline2d,\n ShapeUtil,\n STROKE_SIZES,\n DefaultColorStyle,\n DefaultDashStyle,\n DefaultSizeStyle,\n type BaseShape,\n type Geometry2d,\n type ShapeHandle,\n type StyleWords,\n} from \"@mocanvas/editor\"\nimport { getIndexBetween, sortByIndex, type IndexKey } from \"@mocanvas/store\"\nimport type { ReactNode } from \"react\"\nimport { propsOf, readEnum, readNumber, readString, readStyle } from \"./prop-access\"\nimport { getStrokeRgba, getDashId } from \"./shape-theme\"\nimport { catmullRomToBezier } from \"./spline-helpers\"\nimport { pathWordsToSvgD } from \"./svg-path\"\n\nexport interface LinePoint {\n id: string\n index: string\n x: number\n y: number\n}\n\nexport interface LineShapeProps {\n color: DefaultColorStyle\n dash: DefaultDashStyle\n size: DefaultSizeStyle\n spline: \"line\" | \"cubic\"\n points: Record<string, LinePoint>\n scale: number\n}\n\nexport type LineShape = BaseShape<\"line\", LineShapeProps>\n\nconst SPLINES = [\"line\", \"cubic\"] as const\n\n/** The line's points in drawing order, skipping any entry that is not a point. */\nexport function getLinePoints(shape: { props?: unknown }): LinePoint[] {\n const stored = propsOf(shape)[\"points\"]\n if (typeof stored !== \"object\" || stored === null) return []\n const points: (LinePoint & { index: IndexKey })[] = []\n for (const [id, value] of Object.entries(stored as Record<string, unknown>)) {\n if (typeof value !== \"object\" || value === null) continue\n points.push({\n id: readString(value, \"id\", id),\n index: readString(value, \"index\", \"a1\") as IndexKey,\n x: readNumber(value, \"x\", 0),\n y: readNumber(value, \"y\", 0),\n })\n }\n return sortByIndex(points)\n}\n\nfunction midIndex(a: string, b: string): string {\n try {\n return getIndexBetween(a as IndexKey, b as IndexKey)\n } catch {\n return `${a}V`\n }\n}\n\nexport class LineShapeUtil extends ShapeUtil<LineShape> {\n static override type = \"line\" as const\n static override props = { color: DefaultColorStyle, dash: DefaultDashStyle, size: DefaultSizeStyle }\n\n getDefaultProps(): LineShapeProps {\n return {\n color: \"black\",\n dash: \"draw\",\n size: \"m\",\n spline: \"line\",\n points: {\n a1: { id: \"a1\", index: \"a1\", x: 0, y: 0 },\n a2: { id: \"a2\", index: \"a2\", x: 100, y: 100 },\n },\n scale: 1,\n }\n }\n\n getGeometry(shape: LineShape): Geometry2d {\n const points = getLinePoints(shape)\n if (points.length === 0) return new Polyline2d({ points: [{ x: 0, y: 0 }] })\n if (readEnum(propsOf(shape), \"spline\", SPLINES, \"line\") === \"cubic\" && points.length > 2) {\n return new CubicSpline2d({ segments: catmullRomToBezier(points), isClosed: false, isFilled: false })\n }\n return new Polyline2d({ points })\n }\n\n override getRenderStyle(shape: LineShape): StyleWords {\n const p = propsOf(shape)\n const color = readStyle(p, \"color\", DefaultColorStyle)\n const size = readStyle(p, \"size\", DefaultSizeStyle)\n return {\n stroke: getStrokeRgba(color),\n strokeWidth: STROKE_SIZES[size] * readNumber(p, \"scale\", 1),\n fill: 0,\n dash: getDashId(readStyle(p, \"dash\", DefaultDashStyle)),\n opacity: 1,\n }\n }\n\n component(_shape: LineShape): ReactNode {\n return null\n }\n\n indicator(shape: LineShape): ReactNode {\n return <path d={pathWordsToSvgD(this.getGeometry(shape).toPathWords())} />\n }\n\n override getHandles(shape: LineShape): ShapeHandle[] {\n const points = getLinePoints(shape)\n const handles: ShapeHandle[] = []\n for (let i = 0; i < points.length; i++) {\n const p = points[i]!\n handles.push({ id: p.id, type: \"vertex\", index: p.index, x: p.x, y: p.y })\n const next = points[i + 1]\n if (next) {\n handles.push({\n id: `mid:${p.id}:${next.id}`,\n type: \"virtual\",\n index: midIndex(p.index, next.index),\n x: (p.x + next.x) / 2,\n y: (p.y + next.y) / 2,\n })\n }\n }\n return handles\n }\n\n override onHandleDrag(shape: LineShape, info: { handle: ShapeHandle }): Partial<LineShape> {\n const { handle } = info\n const points: Record<string, LinePoint> = {}\n for (const p of getLinePoints(shape)) points[p.id] = p\n const existing = points[handle.id]\n if (existing) {\n points[handle.id] = { ...existing, x: handle.x, y: handle.y }\n } else {\n // Dragging a virtual midpoint promotes it to a real point.\n points[handle.id] = { id: handle.id, index: handle.index, x: handle.x, y: handle.y }\n }\n return { props: { ...shape.props, points } }\n }\n}\n","import { Rectangle2d, ShapeUtil, type BaseShape, type Geometry2d, type StyleWords } from \"@mocanvas/editor\"\n\nexport type GroupShape = BaseShape<\"group\", Record<string, never>>\n\n/** A container with no visuals of its own; its bounds are the union of its children. */\nexport class GroupShapeUtil extends ShapeUtil<GroupShape> {\n static override type = \"group\" as const\n\n getDefaultProps(): GroupShape[\"props\"] {\n return {}\n }\n\n getGeometry(shape: GroupShape): Geometry2d {\n const editor = this.editor\n const children = editor.getSortedChildIdsForParent(shape.id)\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const id of children) {\n const child = editor.getShape(id)\n if (!child) continue\n const b = editor.getShapeGeometryBounds(child)\n if (!b) continue\n // child bounds in group space\n for (const c of b.corners) {\n const r = child.rotation\n const x = child.x + c.x * Math.cos(r) - c.y * Math.sin(r)\n const y = child.y + c.x * Math.sin(r) + c.y * Math.cos(r)\n if (x < minX) minX = x\n if (y < minY) minY = y\n if (x > maxX) maxX = x\n if (y > maxY) maxY = y\n }\n }\n if (!Number.isFinite(minX)) return new Rectangle2d({ width: 1, height: 1, isFilled: false })\n return new Rectangle2d({ x: minX, y: minY, width: Math.max(1, maxX - minX), height: Math.max(1, maxY - minY), isFilled: false })\n }\n\n override getRenderStyle(_shape: GroupShape): StyleWords {\n // Invisible on the GPU; hit-testing goes through children.\n return { fill: 0, stroke: 0, strokeWidth: 0, dash: 0, opacity: 1 }\n }\n\n override canResize(): boolean {\n return false\n }\n override hideResizeHandles(): boolean {\n return true\n }\n override hideSelectionBoundsBg(): boolean {\n return true\n }\n override canReceiveNewChildrenOfType(): boolean {\n return true\n }\n\n component() {\n return null\n }\n\n indicator(shape: GroupShape) {\n const b = this.getGeometry(shape).bounds\n return <rect x={b.x} y={b.y} width={b.w} height={b.h} fill=\"none\" strokeDasharray=\"4 4\" />\n }\n}\n","import type { ShapeUtilConstructor } from \"@mocanvas/editor\"\nimport { ArrowShapeUtil } from \"./ArrowShapeUtil\"\nimport { BookmarkShapeUtil } from \"./BookmarkShapeUtil\"\nimport { DrawShapeUtil } from \"./DrawShapeUtil\"\nimport { EmbedShapeUtil } from \"./EmbedShapeUtil\"\nimport { FrameShapeUtil } from \"./FrameShapeUtil\"\nimport { GeoShapeUtil } from \"./GeoShapeUtil\"\nimport { ImageShapeUtil } from \"./ImageShapeUtil\"\nimport { LineShapeUtil } from \"./LineShapeUtil\"\nimport { NoteShapeUtil } from \"./NoteShapeUtil\"\nimport { TextShapeUtil } from \"./TextShapeUtil\"\nimport { VideoShapeUtil } from \"./VideoShapeUtil\"\n\nexport * from \"./GeoShapeUtil\"\nexport * from \"./DrawShapeUtil\"\nexport * from \"./LineShapeUtil\"\nexport * from \"./ArrowShapeUtil\"\nexport * from \"./TextShapeUtil\"\nexport * from \"./NoteShapeUtil\"\nexport * from \"./FrameShapeUtil\"\nexport * from \"./ImageShapeUtil\"\nexport * from \"./BookmarkShapeUtil\"\nexport * from \"./EmbedShapeUtil\"\nexport * from \"./VideoShapeUtil\"\nexport * from \"./shape-theme\"\nexport * from \"./geo-helpers\"\nexport * from \"./arrow-helpers\"\nexport * from \"./spline-helpers\"\nexport * from \"./draw-helpers\"\nexport * from \"./text-helpers\"\nexport * from \"./prop-access\"\nexport { pathWordsToSvgD } from \"./svg-path\"\n\n/** The built-in shape utils, in the order they are registered. */\nexport { GroupShapeUtil, type GroupShape } from \"./GroupShapeUtil\"\nimport { GroupShapeUtil } from \"./GroupShapeUtil\"\n\nexport const defaultShapeUtils: ShapeUtilConstructor[] = [\n GroupShapeUtil,\n GeoShapeUtil,\n DrawShapeUtil,\n LineShapeUtil,\n ArrowShapeUtil,\n TextShapeUtil,\n NoteShapeUtil,\n FrameShapeUtil,\n ImageShapeUtil,\n BookmarkShapeUtil,\n EmbedShapeUtil,\n VideoShapeUtil,\n]\nexport * from \"./elbow-helpers\"\n","import {\n BindingUtil,\n Vec,\n type BaseBinding,\n type BindingOnShapeChangeOptions,\n type BindingOnShapeDeleteOptions,\n type BindingOnShapeIsolateOptions,\n type VecLike,\n} from \"@mocanvas/editor\"\nimport type { ArrowShape } from \"../shapes/ArrowShapeUtil\"\nimport { getArrowTerminalsInArrowSpace } from \"./arrow-terminals\"\n\nexport type ArrowTerminal = \"start\" | \"end\"\n\n/**\n * Props of an `arrow` binding. The record layout matches what `.tldr` files\n * store for arrow bindings so documents round-trip.\n */\nexport interface ArrowBindingProps {\n /** Which end of the arrow (`fromId`) is attached to the bound shape (`toId`). */\n terminal: ArrowTerminal\n /** Anchor inside the bound shape's geometry bounds, normalized to `[0, 1]`. */\n normalizedAnchor: { x: number; y: number }\n /** When true the terminal sits exactly on the anchor instead of on the shape's outline. */\n isExact: boolean\n /** When true the anchor was placed deliberately (Alt or a lingering drag) rather than snapped to the center. */\n isPrecise: boolean\n}\n\nexport type ArrowBinding = BaseBinding<\"arrow\", ArrowBindingProps>\n\nconst EPS = 1e-6\n\nfunction samePoint(a: VecLike, b: VecLike): boolean {\n return Math.abs(a.x - b.x) < EPS && Math.abs(a.y - b.y) < EPS\n}\n\n/**\n * Keeps arrows attached to the shapes their terminals are bound to.\n *\n * - When the bound shape changes, the arrow is rewritten so its geometry is\n * re-derived (and its static fallback stays current).\n * - When the bound shape goes away, or the binding is deleted with\n * `isolateShapes`, the terminal is frozen at its current page position.\n */\nexport class ArrowBindingUtil extends BindingUtil<ArrowBinding> {\n static override type = \"arrow\" as const\n\n getDefaultProps(): ArrowBindingProps {\n return { terminal: \"end\", normalizedAnchor: { x: 0.5, y: 0.5 }, isExact: false, isPrecise: false }\n }\n\n override onAfterChangeToShape({ binding }: BindingOnShapeChangeOptions<ArrowBinding>): void {\n this.refreshArrow(binding)\n }\n\n override onAfterChangeFromShape({ binding, shapeBefore, shapeAfter }: BindingOnShapeChangeOptions<ArrowBinding>): void {\n // Moving the arrow itself does not change where its bound terminal resolves\n // to in page space; only a re-parent changes the arrow's local frame.\n if (shapeBefore.parentId !== shapeAfter.parentId) this.refreshArrow(binding)\n }\n\n override onBeforeDeleteToShape({ binding }: BindingOnShapeDeleteOptions<ArrowBinding>): void {\n this.freezeTerminal(binding)\n }\n\n override onBeforeIsolateFromShape({ binding }: BindingOnShapeIsolateOptions<ArrowBinding>): void {\n this.freezeTerminal(binding)\n }\n\n override onBeforeIsolateToShape({ binding }: BindingOnShapeIsolateOptions<ArrowBinding>): void {\n this.freezeTerminal(binding)\n }\n\n /** Write the resolved terminals into the arrow so its geometry is rebuilt. */\n private refreshArrow(binding: ArrowBinding): void {\n const arrow = this.editor.getShape<ArrowShape>(binding.fromId)\n if (!arrow || arrow.type !== \"arrow\") return\n const { start, end } = getArrowTerminalsInArrowSpace(this.editor, arrow)\n if (samePoint(start, arrow.props.start) && samePoint(end, arrow.props.end)) return\n this.editor.updateShape<ArrowShape>({ id: arrow.id, type: \"arrow\", props: { start: start.toJson(), end: end.toJson() } })\n }\n\n /**\n * Convert the bound terminal into a static point at its current resolved\n * position. Idempotent: calling it twice for the same binding is a no-op the\n * second time.\n */\n private freezeTerminal(binding: ArrowBinding): void {\n const arrow = this.editor.getShape<ArrowShape>(binding.fromId)\n if (!arrow || arrow.type !== \"arrow\") return\n if (!this.editor.getShape(binding.toId)) return\n const terminal = binding.props.terminal\n const resolved = getArrowTerminalsInArrowSpace(this.editor, arrow)[terminal]\n if (samePoint(resolved, arrow.props[terminal])) return\n this.editor.updateShape<ArrowShape>({ id: arrow.id, type: \"arrow\", props: { [terminal]: Vec.From(resolved).toJson() } })\n }\n}\n","import type { BindingUtilConstructor } from \"@mocanvas/editor\"\nimport { ArrowBindingUtil } from \"./ArrowBindingUtil\"\n\nexport * from \"./ArrowBindingUtil\"\nexport * from \"./arrow-terminals\"\n\n/** The built-in binding utils, in the order they are registered. */\nexport const defaultBindingUtils: BindingUtilConstructor[] = [ArrowBindingUtil]\n","import {\n createShapeId,\n StateNode,\n Vec,\n type PointerEventInfo,\n type ShapeHandle,\n type ShapeId,\n type StateNodeConstructor,\n} from \"@mocanvas/editor\"\nimport type { ArrowShape } from \"../shapes\"\n\n/** Length of the arrow created by a click without a drag, in page units. */\nconst DEFAULT_ARROW_LENGTH = 100\n/** Arrows shorter than this are discarded on pointer up. */\nconst MIN_ARROW_LENGTH = 4\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"pointing\", info)\n }\n\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\nclass Pointing extends StateNode {\n static override id = \"pointing\"\n private shapeId: ShapeId | null = null\n private markId = \"\"\n /** Set once the pointer travelled far enough to count as a drag. */\n private dragged = false\n\n override onEnter(): void {\n const editor = this.editor\n this.dragged = false\n this.markId = editor.markHistoryStoppingPoint(\"create arrow\")\n const id = createShapeId()\n const { originPagePoint } = editor.inputs\n editor.createShape<ArrowShape>({\n id,\n type: \"arrow\",\n x: originPagePoint.x,\n y: originPagePoint.y,\n props: { start: { x: 0, y: 0 }, end: { x: 1, y: 0 } },\n })\n editor.select(id)\n this.shapeId = id\n }\n\n override onPointerMove(): void {\n if (!this.editor.inputs.isDragging) return\n this.dragged = true\n this.updateEnd()\n }\n\n override onPointerUp(): void {\n // `inputs.isDragging` is already cleared by the time a pointer up arrives.\n if (this.dragged) this.updateEnd()\n else this.setDefaultEnd()\n this.finish()\n }\n\n override onComplete(): void {\n this.finish()\n }\n\n override onCancel(): void {\n if (this.markId) this.editor.bailToMark(this.markId)\n this.shapeId = null\n this.parent!.transition(\"idle\")\n }\n\n /**\n * Move the end terminal to the pointer, offering a binding the same way the\n * select tool's handle drag does: the shape util decides whether the point\n * lands on a bindable shape and returns the props to apply.\n */\n private updateEnd(): void {\n const editor = this.editor\n const shape = editor.getShape<ArrowShape>(this.shapeId!)\n if (!shape) return\n const local = editor.getPointInShapeSpace(shape, editor.inputs.currentPagePoint)\n const handle: ShapeHandle = { id: \"end\", type: \"vertex\", index: \"a3\", x: local.x, y: local.y }\n const change = editor.getShapeUtil<ArrowShape>(shape).onHandleDrag?.(shape, { handle, isPrecise: editor.inputs.altKey, initial: shape })\n if (change) editor.updateShape<ArrowShape>({ id: shape.id, type: \"arrow\", ...change })\n else editor.updateShape<ArrowShape>({ id: shape.id, type: \"arrow\", props: { end: { x: local.x, y: local.y } } })\n }\n\n /** A click without a drag makes a default arrow pointing to the right. */\n private setDefaultEnd(): void {\n const editor = this.editor\n const shape = editor.getShape<ArrowShape>(this.shapeId!)\n if (!shape) return\n editor.updateShape<ArrowShape>({ id: shape.id, type: \"arrow\", props: { end: { x: DEFAULT_ARROW_LENGTH, y: 0 } } })\n }\n\n private finish(): void {\n const editor = this.editor\n const shape = this.shapeId ? editor.getShape<ArrowShape>(this.shapeId) : undefined\n if (shape) {\n const { start, end } = shape.props\n // No zero-length arrows: undo the whole creation, bindings included.\n if (Vec.Dist(start, end) < MIN_ARROW_LENGTH) editor.bailToMark(this.markId)\n }\n this.shapeId = null\n const locked = editor.getInstanceState().isToolLocked\n this.parent!.transition(\"idle\")\n if (!locked) editor.setCurrentTool(\"select\")\n }\n}\n\n/** Drag to draw an arrow; dropping the end on a shape binds it to that shape. */\nexport class ArrowTool extends StateNode {\n static override id = \"arrow\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Pointing]\n}\n","import { createShapeId, StateNode, Vec, type PointerEventInfo, type ShapeId, type StateNodeConstructor } from \"@mocanvas/editor\"\n\ninterface DrawProps {\n segments: { type: \"free\" | \"straight\"; points: { x: number; y: number; z?: number }[] }[]\n isComplete: boolean\n isClosed: boolean\n isPen: boolean\n}\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"drawing\", info)\n }\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\nclass Drawing extends StateNode {\n static override id = \"drawing\"\n private shapeId: ShapeId | null = null\n private origin = new Vec()\n private points: { x: number; y: number; z: number }[] = []\n private markId = \"\"\n private lastFlush = 0\n\n override onEnter(info: Record<string, unknown>): void {\n const editor = this.editor\n const isPen = (info as { isPen?: boolean }).isPen ?? false\n this.markId = editor.markHistoryStoppingPoint(\"draw\")\n this.origin = editor.inputs.originPagePoint.clone()\n this.points = [{ x: 0, y: 0, z: 0.5 }]\n const id = createShapeId()\n this.shapeId = id\n editor.createShape({\n id,\n type: \"draw\",\n x: this.origin.x,\n y: this.origin.y,\n props: {\n segments: [{ type: \"free\", points: this.points.slice() }],\n isComplete: false,\n isClosed: false,\n isPen,\n },\n })\n editor.selectNone()\n }\n\n override onPointerMove(): void {\n const editor = this.editor\n const { currentPagePoint } = editor.inputs\n const p = Vec.Sub(currentPagePoint, this.origin)\n const last = this.points.at(-1)!\n if (Vec.Dist2(last, p) < 0.25) return\n this.points.push({ x: p.x, y: p.y, z: 0.5 })\n const now = performance.now()\n // Throttle store writes to ~120 Hz; the pointer may report far faster.\n if (now - this.lastFlush > 8) {\n this.lastFlush = now\n this.flush(false)\n }\n }\n\n override onPointerUp(): void {\n this.complete()\n }\n\n override onComplete(): void {\n this.complete()\n }\n\n override onCancel(): void {\n this.editor.bailToMark(this.markId)\n this.parent!.transition(\"idle\")\n }\n\n private flush(complete: boolean): void {\n const editor = this.editor\n const shape = editor.getShape(this.shapeId!)\n if (!shape) return\n const props = shape.props as DrawProps\n const first = this.points[0]!\n const last = this.points.at(-1)!\n const isClosed = complete && this.points.length > 3 && Vec.Dist(first, last) < 12 / editor.getZoomLevel()\n editor.updateShape({\n id: shape.id,\n type: \"draw\",\n props: {\n segments: [{ type: props.segments[0]?.type ?? \"free\", points: this.points.slice() }],\n isComplete: complete,\n isClosed,\n },\n })\n }\n\n private complete(): void {\n this.flush(true)\n const editor = this.editor\n this.parent!.transition(\"idle\")\n if (!editor.getInstanceState().isToolLocked && !editor.inputs.isPen) {\n // Stay in the draw tool: freehand drawing is usually repeated.\n }\n }\n}\n\n/** Freehand drawing. */\nexport class DrawTool extends StateNode {\n static override id = \"draw\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Drawing]\n}\n","import { StateNode, type PointerEventInfo, type ShapeId, type StateNodeConstructor } from \"@mocanvas/editor\"\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"erasing\", info)\n }\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\nclass Erasing extends StateNode {\n static override id = \"erasing\"\n private erasing = new Set<ShapeId>()\n private markId = \"\"\n\n override onEnter(): void {\n this.erasing.clear()\n this.markId = this.editor.markHistoryStoppingPoint(\"erase\")\n this.update()\n }\n\n override onPointerMove(): void {\n this.update()\n }\n\n override onPointerUp(): void {\n this.complete()\n }\n\n override onComplete(): void {\n this.complete()\n }\n\n override onCancel(): void {\n this.editor.setErasingShapes([])\n this.parent!.transition(\"idle\")\n }\n\n private update(): void {\n const editor = this.editor\n const { currentPagePoint, previousPagePoint } = editor.inputs\n const minX = Math.min(currentPagePoint.x, previousPagePoint.x)\n const minY = Math.min(currentPagePoint.y, previousPagePoint.y)\n const box = {\n x: minX,\n y: minY,\n w: Math.abs(currentPagePoint.x - previousPagePoint.x),\n h: Math.abs(currentPagePoint.y - previousPagePoint.y),\n }\n const margin = 8 / editor.getZoomLevel()\n const hits = editor.getShapesIntersectingBounds({ x: box.x - margin, y: box.y - margin, w: box.w + 2 * margin, h: box.h + 2 * margin })\n let changed = false\n for (const s of hits) {\n if (s.isLocked || this.erasing.has(s.id)) continue\n this.erasing.add(s.id)\n changed = true\n }\n if (changed) editor.setErasingShapes([...this.erasing])\n }\n\n private complete(): void {\n const editor = this.editor\n const ids = [...this.erasing]\n editor.setErasingShapes([])\n if (ids.length) editor.deleteShapes(ids)\n this.parent!.transition(\"idle\")\n }\n}\n\n/** Delete shapes by dragging over them. */\nexport class EraserTool extends StateNode {\n static override id = \"eraser\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Erasing]\n}\n","import {\n createShapeId,\n StateNode,\n type Editor,\n type PointerEventInfo,\n type ShapeId,\n type StateNodeConstructor,\n type UnknownShape,\n} from \"@mocanvas/editor\"\nimport type { FrameShape } from \"../shapes\"\n\n/** Size of the frame created by a click without a drag. */\nconst DEFAULT_FRAME_SIZE = { w: 640, h: 480 }\n/** Smallest frame a drag can produce. */\nconst MIN_FRAME_SIZE = 32\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"pointing\", info)\n }\n\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\nclass Pointing extends StateNode {\n static override id = \"pointing\"\n private shapeId: ShapeId | null = null\n private markId = \"\"\n\n override onEnter(): void {\n this.shapeId = null\n }\n\n override onPointerMove(): void {\n if (!this.editor.inputs.isDragging) return\n if (!this.shapeId) this.create()\n this.resize()\n }\n\n override onPointerUp(): void {\n if (!this.shapeId) {\n // Click without a drag: a default-sized frame centred on the point.\n this.create()\n const { originPagePoint } = this.editor.inputs\n this.editor.updateShape<FrameShape>({\n id: this.shapeId!,\n type: \"frame\",\n x: originPagePoint.x - DEFAULT_FRAME_SIZE.w / 2,\n y: originPagePoint.y - DEFAULT_FRAME_SIZE.h / 2,\n props: { ...DEFAULT_FRAME_SIZE },\n })\n }\n this.finish()\n }\n\n override onComplete(): void {\n this.finish()\n }\n\n override onCancel(): void {\n if (this.markId) this.editor.bailToMark(this.markId)\n this.shapeId = null\n this.parent!.transition(\"idle\")\n }\n\n private create(): void {\n const editor = this.editor\n this.markId = editor.markHistoryStoppingPoint(\"create frame\")\n const id = createShapeId()\n const { originPagePoint } = editor.inputs\n editor.createShape<FrameShape>({\n id,\n type: \"frame\",\n x: originPagePoint.x,\n y: originPagePoint.y,\n props: { w: MIN_FRAME_SIZE, h: MIN_FRAME_SIZE, name: nextFrameName(editor) },\n })\n editor.select(id)\n this.shapeId = id\n }\n\n private resize(): void {\n const editor = this.editor\n const shape = editor.getShape<FrameShape>(this.shapeId!)\n if (!shape) return\n const { originPagePoint, currentPagePoint, shiftKey } = editor.inputs\n let w = currentPagePoint.x - originPagePoint.x\n let h = currentPagePoint.y - originPagePoint.y\n if (shiftKey) {\n const m = Math.max(Math.abs(w), Math.abs(h))\n w = Math.sign(w || 1) * m\n h = Math.sign(h || 1) * m\n }\n let x = originPagePoint.x\n let y = originPagePoint.y\n if (w < 0) x += w\n if (h < 0) y += h\n editor.updateShape<FrameShape>({\n id: shape.id,\n type: \"frame\",\n x,\n y,\n props: { w: Math.max(MIN_FRAME_SIZE, Math.abs(w)), h: Math.max(MIN_FRAME_SIZE, Math.abs(h)) },\n })\n }\n\n private finish(): void {\n const editor = this.editor\n if (this.shapeId) adoptShapesInside(editor, this.shapeId)\n this.shapeId = null\n const locked = editor.getInstanceState().isToolLocked\n this.parent!.transition(\"idle\")\n if (!locked) editor.setCurrentTool(\"select\")\n }\n}\n\n/** `Frame 1`, `Frame 2`, ... counting the frames already on the page. */\nfunction nextFrameName(editor: Editor): string {\n const count = editor.getCurrentPageShapes().filter((s) => s.type === \"frame\").length\n return `Frame ${count + 1}`\n}\n\n/** Move shapes that sit entirely inside a fresh frame into it. */\nfunction adoptShapesInside(editor: Editor, frameId: ShapeId): void {\n const bounds = editor.getShapePageBounds(frameId)\n if (!bounds) return\n const pageId = editor.getCurrentPageId()\n const inside = editor\n .getShapesInsideBounds(bounds)\n .filter((s: UnknownShape) => s.id !== frameId && s.type !== \"frame\" && !s.isLocked && s.parentId === pageId)\n if (inside.length) editor.reparentShapes(inside.map((s) => s.id), frameId)\n}\n\n/** Drag out a frame, or click to place a default-sized one. */\nexport class FrameTool extends StateNode {\n static override id = \"frame\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Pointing]\n}\n","import {\n createShapeId,\n GeoShapeGeoStyle,\n StateNode,\n type GeoShapeKind,\n type PointerEventInfo,\n type ShapeId,\n type StateNodeConstructor,\n} from \"@mocanvas/editor\"\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"pointing\", info)\n }\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\nclass Pointing extends StateNode {\n static override id = \"pointing\"\n private shapeId: ShapeId | null = null\n private markId = \"\"\n\n override onEnter(): void {\n this.shapeId = null\n }\n\n override onPointerMove(): void {\n if (!this.editor.inputs.isDragging) return\n if (!this.shapeId) this.create()\n this.resize()\n }\n\n override onPointerUp(): void {\n if (!this.shapeId) {\n // click without drag: create a default-sized shape centered on the point\n this.create()\n const shape = this.editor.getShape(this.shapeId!)!\n const { w, h } = shape.props as { w: number; h: number }\n const { originPagePoint } = this.editor.inputs\n this.editor.updateShape({ id: shape.id, type: shape.type, x: originPagePoint.x - w / 2, y: originPagePoint.y - h / 2 })\n }\n this.finish()\n }\n\n override onCancel(): void {\n if (this.markId) this.editor.bailToMark(this.markId)\n this.parent!.transition(\"idle\")\n }\n\n override onComplete(): void {\n this.finish()\n }\n\n private create(): void {\n const editor = this.editor\n const geo = (this.parent as GeoTool).geo\n this.markId = editor.markHistoryStoppingPoint(\"create geo\")\n const id = createShapeId()\n const { originPagePoint } = editor.inputs\n editor.createShape({\n id,\n type: \"geo\",\n x: originPagePoint.x,\n y: originPagePoint.y,\n props: { geo, w: 100, h: 100 },\n })\n editor.select(id)\n this.shapeId = id\n }\n\n private resize(): void {\n const editor = this.editor\n const shape = editor.getShape(this.shapeId!)\n if (!shape) return\n const { originPagePoint, currentPagePoint, shiftKey, altKey } = editor.inputs\n let w = currentPagePoint.x - originPagePoint.x\n let h = currentPagePoint.y - originPagePoint.y\n if (shiftKey) {\n const m = Math.max(Math.abs(w), Math.abs(h))\n w = Math.sign(w || 1) * m\n h = Math.sign(h || 1) * m\n }\n let x = originPagePoint.x\n let y = originPagePoint.y\n if (altKey) {\n x -= Math.abs(w)\n y -= Math.abs(h)\n w = Math.abs(w) * 2\n h = Math.abs(h) * 2\n } else {\n if (w < 0) x += w\n if (h < 0) y += h\n }\n editor.updateShape({ id: shape.id, type: \"geo\", x, y, props: { w: Math.max(1, Math.abs(w)), h: Math.max(1, Math.abs(h)) } })\n }\n\n private finish(): void {\n const editor = this.editor\n const locked = editor.getInstanceState().isToolLocked\n this.parent!.transition(\"idle\")\n if (!locked) editor.setCurrentTool(\"select\")\n }\n}\n\n/** Draw a geo shape (rectangle, ellipse, ...) by dragging. Pick the kind with `editor.setCurrentTool('geo', { geo })`. */\nexport class GeoTool extends StateNode {\n static override id = \"geo\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Pointing]\n geo: GeoShapeKind = \"rectangle\"\n\n override onEnter(info: Record<string, unknown>): void {\n const geo = info[\"geo\"]\n if (typeof geo === \"string\") this.geo = geo as GeoShapeKind\n else this.geo = this.editor.getStyleForNextShape(GeoShapeGeoStyle)\n }\n}\n","import { StateNode, Vec, type PointerEventInfo, type StateNodeConstructor } from \"@mocanvas/editor\"\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"grab\", rotation: 0 } })\n }\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"pointing\", info)\n }\n}\n\nclass Pointing extends StateNode {\n static override id = \"pointing\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"grabbing\", rotation: 0 } })\n }\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) this.parent!.transition(\"dragging\")\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass Dragging extends StateNode {\n static override id = \"dragging\"\n override onPointerMove(): void {\n const { currentScreenPoint, previousScreenPoint } = this.editor.inputs\n this.editor.pan(Vec.Sub(currentScreenPoint, previousScreenPoint))\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\n/** Pan the camera by dragging. */\nexport class HandTool extends StateNode {\n static override id = \"hand\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Pointing, Dragging]\n}\n","import {\n createShapeId,\n StateNode,\n Vec,\n type ClickEventInfo,\n type KeyboardEventInfo,\n type PointerEventInfo,\n type ShapeId,\n type StateNodeConstructor,\n} from \"@mocanvas/editor\"\nimport { getIndexAbove, type IndexKey } from \"@mocanvas/store\"\nimport { getLinePoints, type LinePoint, type LineShape } from \"../shapes\"\n\n/** Segments shorter than this are treated as a repeated click, not a new point. */\nconst MIN_SEGMENT_LENGTH = 4\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"pointing\", info)\n }\n\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\n/**\n * Draws a line. A drag makes a straight two-point line; a click starts a\n * multi-segment line where every further click commits another point and the\n * last point follows the pointer. Enter or a double click finishes it.\n */\nclass Pointing extends StateNode {\n static override id = \"pointing\"\n private shapeId: ShapeId | null = null\n private markId = \"\"\n /** Id of the point that follows the pointer. */\n private draftId = \"a2\"\n /** Set once the pointer travelled far enough to count as a drag. */\n private dragged = false\n\n override onEnter(): void {\n const editor = this.editor\n this.dragged = false\n this.markId = editor.markHistoryStoppingPoint(\"create line\")\n const id = createShapeId()\n const { originPagePoint } = editor.inputs\n this.draftId = \"a2\"\n editor.createShape<LineShape>({\n id,\n type: \"line\",\n x: originPagePoint.x,\n y: originPagePoint.y,\n props: {\n points: {\n a1: { id: \"a1\", index: \"a1\", x: 0, y: 0 },\n a2: { id: \"a2\", index: \"a2\", x: 0, y: 0 },\n },\n },\n })\n editor.select(id)\n this.shapeId = id\n }\n\n /** A further click commits the draft point and starts a new one. */\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button !== 0) return\n const shape = this.getShape()\n if (!shape) return\n this.dragged = false\n this.moveDraftToPointer()\n this.addPoint()\n }\n\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) this.dragged = true\n this.moveDraftToPointer()\n }\n\n override onPointerUp(): void {\n // A drag finishes the line right away; a click keeps the tool going so the\n // next click adds another segment. `inputs.isDragging` is already cleared\n // by the time a pointer up arrives, hence the flag.\n if (this.dragged) this.finish()\n }\n\n override onDoubleClick(_info: ClickEventInfo): void {\n this.finish()\n }\n\n override onKeyDown(info: KeyboardEventInfo): void {\n if (info.key === \"Enter\") this.finish()\n }\n\n override onComplete(): void {\n this.finish()\n }\n\n override onCancel(): void {\n if (this.markId) this.editor.bailToMark(this.markId)\n this.shapeId = null\n this.parent!.transition(\"idle\")\n }\n\n private getShape(): LineShape | undefined {\n return this.shapeId ? this.editor.getShape<LineShape>(this.shapeId) : undefined\n }\n\n private moveDraftToPointer(): void {\n const editor = this.editor\n const shape = this.getShape()\n if (!shape) return\n const local = editor.getPointInShapeSpace(shape, editor.inputs.currentPagePoint)\n const draft = shape.props.points[this.draftId]\n if (!draft) return\n const points: Record<string, LinePoint> = { ...shape.props.points, [this.draftId]: { ...draft, x: local.x, y: local.y } }\n editor.updateShape<LineShape>({ id: shape.id, type: \"line\", props: { points } })\n }\n\n private addPoint(): void {\n const shape = this.getShape()\n if (!shape) return\n const ordered = getLinePoints(shape)\n const last = ordered.at(-1)\n const prev = ordered.at(-2)\n if (!last) return\n // Clicking the same spot twice would add a degenerate segment; finish instead.\n if (prev && Vec.Dist(prev, last) < MIN_SEGMENT_LENGTH) {\n this.finish()\n return\n }\n const index = getIndexAbove(last.index as IndexKey)\n const points: Record<string, LinePoint> = { ...shape.props.points, [index]: { id: index, index, x: last.x, y: last.y } }\n this.draftId = index\n this.editor.updateShape<LineShape>({ id: shape.id, type: \"line\", props: { points } })\n }\n\n private finish(): void {\n const editor = this.editor\n const shape = this.getShape()\n if (shape) {\n const ordered = getLinePoints(shape)\n const last = ordered.at(-1)\n const prev = ordered.at(-2)\n if (ordered.length > 2 && last && prev && Vec.Dist(prev, last) < MIN_SEGMENT_LENGTH) {\n // Drop the trailing draft point left over from the finishing click.\n const points = { ...shape.props.points }\n delete points[last.id]\n editor.updateShape<LineShape>({ id: shape.id, type: \"line\", props: { points } })\n } else if (ordered.length <= 2 && last && prev && Vec.Dist(prev, last) < MIN_SEGMENT_LENGTH) {\n // A line of no length at all: undo the whole creation.\n editor.bailToMark(this.markId)\n }\n }\n this.shapeId = null\n const locked = editor.getInstanceState().isToolLocked\n this.parent!.transition(\"idle\")\n if (!locked) editor.setCurrentTool(\"select\")\n }\n}\n\n/** Drag for a straight line, or click repeatedly for a multi-segment one. */\nexport class LineTool extends StateNode {\n static override id = \"line\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Pointing]\n}\n","import { createShapeId, StateNode, type PointerEventInfo, type StateNodeConstructor } from \"@mocanvas/editor\"\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button !== 0) return\n const editor = this.editor\n const { originPagePoint } = editor.inputs\n editor.markHistoryStoppingPoint(\"create note\")\n const id = createShapeId()\n editor.createShape({\n id,\n type: \"note\",\n x: originPagePoint.x - 100,\n y: originPagePoint.y - 100,\n })\n editor.select(id)\n editor.setEditingShape(id)\n if (!editor.getInstanceState().isToolLocked) editor.setCurrentTool(\"select\")\n }\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\n/** Click to place a sticky note. */\nexport class NoteTool extends StateNode {\n static override id = \"note\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle]\n}\n","import {\n Box,\n StateNode,\n Vec,\n type ClickEventInfo,\n type KeyboardEventInfo,\n type PointerEventInfo,\n type SelectionHandle,\n type ShapeHandle,\n type ShapeId,\n type ShapePartial,\n type StateNodeConstructor,\n type UnknownShape,\n} from \"@mocanvas/editor\"\n\nconst RESIZE_CURSORS: Partial<Record<SelectionHandle, string>> = {\n top: \"ns-resize\",\n bottom: \"ns-resize\",\n left: \"ew-resize\",\n right: \"ew-resize\",\n top_left: \"nwse-resize\",\n bottom_right: \"nwse-resize\",\n top_right: \"nesw-resize\",\n bottom_left: \"nesw-resize\",\n rotate: \"grab\",\n}\n\nfunction setCursor(editor: { updateInstanceState(p: { cursor: { type: string; rotation: number } }): unknown }, type: string): void {\n editor.updateInstanceState({ cursor: { type, rotation: 0 } })\n}\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"default\", rotation: 0 } })\n }\n\n override onPointerMove(info: PointerEventInfo): void {\n const hovered = info.target === \"shape\" ? info.shape : undefined\n this.editor.setHoveredShape(hovered && !this.editor.isShapeOrAncestorLocked(hovered) ? hovered.id : null)\n if (info.target === \"selection\" && info.handle) setCursor(this.editor, RESIZE_CURSORS[info.handle] ?? \"default\")\n else if (info.target === \"handle\") setCursor(this.editor, \"pointer\")\n else setCursor(this.editor, \"default\")\n }\n\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button !== 0) return\n switch (info.target) {\n case \"canvas\": {\n this.parent!.transition(\"pointing_canvas\", info)\n break\n }\n case \"selection\": {\n if (info.handle === \"rotate\") this.parent!.transition(\"pointing_rotate_handle\", info)\n else if (info.handle) this.parent!.transition(\"pointing_resize_handle\", info)\n else this.parent!.transition(\"pointing_selection\", info)\n break\n }\n case \"handle\": {\n this.parent!.transition(\"pointing_handle\", info)\n break\n }\n case \"shape\": {\n if (this.editor.isShapeOrAncestorLocked(info.shape)) {\n this.parent!.transition(\"pointing_canvas\", info)\n return\n }\n const outer = this.editor.getOutermostSelectableShape(info.shape) ?? info.shape\n this.parent!.transition(\"pointing_shape\", { ...info, shape: outer })\n break\n }\n default:\n break\n }\n }\n\n override onDoubleClick(info: ClickEventInfo): void {\n if (info.target !== \"shape\") return\n const outer = this.editor.getOutermostSelectableShape(info.shape) ?? info.shape\n if (outer.type === \"group\" && outer.id !== info.shape.id) {\n // Focus into the group so its children become selectable.\n this.editor.updateCurrentPageState({ focusedGroupId: outer.id })\n const inner = this.editor.getOutermostSelectableShape(info.shape) ?? info.shape\n this.editor.select(inner.id)\n return\n }\n const shape = info.shape\n const util = this.editor.getShapeUtil(shape)\n if (util.canEdit(shape) && !this.editor.isShapeOrAncestorLocked(shape)) {\n this.editor.select(shape.id)\n this.editor.setEditingShape(shape.id)\n } else {\n const change = util.onDoubleClick?.(shape)\n if (change) this.editor.updateShape({ id: shape.id, type: shape.type, ...change })\n }\n }\n\n override onKeyDown(info: KeyboardEventInfo): void {\n const editor = this.editor\n switch (info.key) {\n case \"Delete\":\n case \"Backspace\": {\n const ids = editor.getSelectedShapeIds()\n if (ids.length) {\n editor.markHistoryStoppingPoint(\"delete\")\n editor.deleteShapes(ids)\n }\n break\n }\n case \"ArrowLeft\":\n case \"ArrowRight\":\n case \"ArrowUp\":\n case \"ArrowDown\": {\n const ids = editor.getSelectedShapeIds()\n if (!ids.length) return\n const step = info.shiftKey ? 10 : 1\n const d = new Vec(\n info.key === \"ArrowLeft\" ? -step : info.key === \"ArrowRight\" ? step : 0,\n info.key === \"ArrowUp\" ? -step : info.key === \"ArrowDown\" ? step : 0,\n )\n editor.markHistoryStoppingPoint(\"nudge\")\n editor.updateShapes(\n ids.map((id) => {\n const s = editor.getShape(id)!\n return { id, type: s.type, x: s.x + d.x, y: s.y + d.y }\n }),\n )\n break\n }\n case \"Escape\": {\n if (editor.getEditingShapeId()) editor.setEditingShape(null)\n else if (editor.getCurrentPageState().focusedGroupId) {\n const g = editor.getCurrentPageState().focusedGroupId!\n editor.updateCurrentPageState({ focusedGroupId: null })\n editor.select(g)\n } else editor.selectNone()\n break\n }\n default:\n break\n }\n }\n\n override onCancel(): void {\n if (this.editor.getEditingShapeId()) this.editor.setEditingShape(null)\n else this.editor.selectNone()\n }\n}\n\nclass PointingCanvas extends StateNode {\n static override id = \"pointing_canvas\"\n\n override onEnter(): void {\n if (!this.editor.inputs.shiftKey) {\n if (this.editor.getEditingShapeId()) this.editor.setEditingShape(null)\n if (this.editor.getCurrentPageState().focusedGroupId) this.editor.updateCurrentPageState({ focusedGroupId: null })\n this.editor.selectNone()\n }\n }\n\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) this.parent!.transition(\"brushing\")\n }\n\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass Brushing extends StateNode {\n static override id = \"brushing\"\n private initialSelection: ShapeId[] = []\n\n override onEnter(): void {\n this.initialSelection = this.editor.inputs.shiftKey ? this.editor.getSelectedShapeIds() : []\n this.update()\n }\n\n override onPointerMove(): void {\n this.update()\n }\n\n override onPointerUp(): void {\n this.finish()\n }\n\n override onCancel(): void {\n this.editor.setSelectedShapes(this.initialSelection)\n this.finish()\n }\n\n override onExit(): void {\n this.editor.updateInstanceState({ brush: null })\n }\n\n private update(): void {\n const { originPagePoint, currentPagePoint, ctrlKey } = this.editor.inputs\n const box = Box.FromPoints([originPagePoint, currentPagePoint])\n this.editor.updateInstanceState({ brush: box.toJson() })\n const hits = ctrlKey ? this.editor.getShapesInsideBounds(box) : this.editor.getShapesIntersectingBounds(box)\n const pageId = this.editor.getCurrentPageId()\n const ids = new Set<ShapeId>(this.initialSelection)\n for (const s of hits) {\n if (s.isLocked) continue\n // select top-level ancestors only\n let top: UnknownShape = s\n while (top.parentId !== pageId) {\n const p = this.editor.getShape(top.parentId as ShapeId)\n if (!p) break\n top = p\n }\n ids.add(top.id)\n }\n this.editor.setSelectedShapes([...ids])\n }\n\n private finish(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass PointingShape extends StateNode {\n static override id = \"pointing_shape\"\n private hitShape: UnknownShape | undefined\n private wasSelected = false\n\n override onEnter(info: Record<string, unknown>): void {\n const shape = (info as { shape?: UnknownShape }).shape\n this.hitShape = shape\n if (!shape) return\n const editor = this.editor\n const selected = editor.getSelectedShapeIds()\n this.wasSelected = selected.includes(shape.id)\n if (editor.inputs.shiftKey) {\n if (!this.wasSelected) editor.setSelectedShapes([...selected, shape.id])\n } else if (!this.wasSelected) {\n editor.setSelectedShapes([shape.id])\n }\n }\n\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) {\n this.parent!.transition(\"translating\")\n }\n }\n\n override onPointerUp(): void {\n const editor = this.editor\n if (editor.inputs.shiftKey && this.wasSelected && this.hitShape) {\n editor.setSelectedShapes(editor.getSelectedShapeIds().filter((id) => id !== this.hitShape!.id))\n }\n this.parent!.transition(\"idle\")\n }\n\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass Translating extends StateNode {\n static override id = \"translating\"\n private initialShapes = new Map<ShapeId, UnknownShape>()\n private markId = \"\"\n\n override onEnter(): void {\n const editor = this.editor\n this.markId = editor.markHistoryStoppingPoint(\"translate\")\n this.initialShapes.clear()\n for (const s of editor.getSelectedShapes()) {\n this.initialShapes.set(s.id, s)\n editor.getShapeUtil(s).onTranslateStart?.(s)\n }\n editor.updateInstanceState({ cursor: { type: \"move\", rotation: 0 } })\n this.update()\n }\n\n override onPointerMove(): void {\n this.update()\n }\n\n override onPointerUp(): void {\n this.complete()\n }\n\n override onComplete(): void {\n this.complete()\n }\n\n override onCancel(): void {\n this.editor.bailToMark(this.markId)\n this.parent!.transition(\"idle\")\n }\n\n override onKeyDown(info: KeyboardEventInfo): void {\n if (info.key === \"Shift\" || info.key === \"Alt\") this.update()\n }\n\n override onKeyUp(info: KeyboardEventInfo): void {\n if (info.key === \"Shift\" || info.key === \"Alt\") this.update()\n }\n\n private initialBounds: Box | undefined\n\n private update(): void {\n const editor = this.editor\n const { originPagePoint, currentPagePoint, shiftKey, ctrlKey } = editor.inputs\n let delta = Vec.Sub(currentPagePoint, originPagePoint)\n let lockX = false\n let lockY = false\n if (shiftKey) {\n // lock to the dominant axis\n if (Math.abs(delta.x) > Math.abs(delta.y)) {\n delta = new Vec(delta.x, 0)\n lockY = true\n } else {\n delta = new Vec(0, delta.y)\n lockX = true\n }\n }\n if (!ctrlKey && editor.inputs.isDragging) {\n this.initialBounds ??= Box.Common(\n [...this.initialShapes.values()].map((s) => editor.getShapePageBounds(s)).filter((b): b is Box => !!b),\n )\n if (this.initialBounds) {\n const moving = new Box(this.initialBounds.x + delta.x, this.initialBounds.y + delta.y, this.initialBounds.w, this.initialBounds.h)\n const { nudge } = editor.snaps.snapTranslate(moving, new Set(this.initialShapes.keys()), { lockX, lockY })\n delta = Vec.Add(delta, nudge)\n }\n } else {\n editor.snaps.clearLines()\n }\n const updates: ShapePartial[] = []\n for (const [id, initial] of this.initialShapes) {\n // delta is in page space; convert to parent space for nested shapes\n const parent = editor.getShapeParent(initial)\n let d = delta\n if (parent) {\n const m = editor.getShapePageTransform(parent)\n const det = m.a * m.d - m.b * m.c || 1\n d = new Vec((m.d * delta.x - m.c * delta.y) / det, (-m.b * delta.x + m.a * delta.y) / det)\n }\n const next = { ...initial, x: initial.x + d.x, y: initial.y + d.y }\n const change = editor.getShapeUtil(initial).onTranslate?.(initial, next)\n updates.push({ id, type: initial.type, x: next.x, y: next.y, ...(change ?? {}) })\n }\n editor.updateShapes(updates)\n }\n\n private complete(): void {\n const editor = this.editor\n for (const [id, initial] of this.initialShapes) {\n const current = editor.getShape(id)\n if (current) {\n const change = editor.getShapeUtil(initial).onTranslateEnd?.(initial, current)\n if (change) editor.updateShape({ id, type: initial.type, ...change })\n }\n }\n this.parent!.transition(\"idle\")\n }\n\n override onExit(): void {\n this.editor.snaps.clearLines()\n this.initialBounds = undefined\n }\n}\n\nclass PointingSelection extends StateNode {\n static override id = \"pointing_selection\"\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) this.parent!.transition(\"translating\")\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass PointingResizeHandle extends StateNode {\n static override id = \"pointing_resize_handle\"\n private handle: SelectionHandle = \"bottom_right\"\n override onEnter(info: Record<string, unknown>): void {\n this.handle = (info as { handle?: SelectionHandle }).handle ?? \"bottom_right\"\n }\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) this.parent!.transition(\"resizing\", { handle: this.handle })\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass PointingRotateHandle extends StateNode {\n static override id = \"pointing_rotate_handle\"\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) this.parent!.transition(\"rotating\")\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass PointingHandle extends StateNode {\n static override id = \"pointing_handle\"\n private info: { shape: UnknownShape; handle: ShapeHandle } | null = null\n override onEnter(info: Record<string, unknown>): void {\n const i = info as { shape?: UnknownShape; handle?: ShapeHandle }\n this.info = i.shape && i.handle ? { shape: i.shape, handle: i.handle } : null\n }\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging && this.info) this.parent!.transition(\"dragging_handle\", this.info)\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\ninterface ResizeSnapshot {\n shape: UnknownShape\n /** Shape-local geometry bounds. */\n bounds: Box\n /** Page position of the shape origin. */\n pagePos: Vec\n}\n\nclass Resizing extends StateNode {\n static override id = \"resizing\"\n private handle: SelectionHandle = \"bottom_right\"\n private markId = \"\"\n private snapshots: ResizeSnapshot[] = []\n private initialSelectionBounds = new Box()\n private single: UnknownShape | undefined\n private singleRotation = 0\n\n override onEnter(info: Record<string, unknown>): void {\n const editor = this.editor\n this.handle = (info as { handle?: SelectionHandle }).handle ?? \"bottom_right\"\n this.markId = editor.markHistoryStoppingPoint(\"resize\")\n const selected = editor.getSelectedShapes()\n this.snapshots = selected.map((shape) => {\n const m = editor.getShapePageTransform(shape)\n return { shape, bounds: editor.getShapeGeometryBounds(shape)!.clone(), pagePos: new Vec(m.e, m.f) }\n })\n this.single = selected.length === 1 ? selected[0] : undefined\n this.singleRotation = this.single ? editor.getSelectionRotation() : 0\n this.initialSelectionBounds = this.single ? this.snapshots[0]!.bounds.clone() : editor.getSelectionPageBounds()!.clone()\n for (const s of this.snapshots) editor.getShapeUtil(s.shape).onResizeStart?.(s.shape)\n setCursor(editor, RESIZE_CURSORS[this.handle] ?? \"default\")\n this.update()\n }\n\n override onPointerMove(): void {\n this.update()\n }\n override onKeyDown(): void {\n this.update()\n }\n override onKeyUp(): void {\n this.update()\n }\n override onPointerUp(): void {\n this.complete()\n }\n override onComplete(): void {\n this.complete()\n }\n override onCancel(): void {\n this.editor.bailToMark(this.markId)\n this.parent!.transition(\"idle\")\n }\n\n /** Pointer position in the resize frame (shape-local for a single shape, page for many). */\n private framePoint(pagePoint: Vec): Vec {\n if (!this.single) return pagePoint\n const s = this.snapshots[0]!\n // inverse of the initial page transform (rotation + translation only)\n const d = Vec.Sub(pagePoint, s.pagePos)\n return Vec.Rot(d, -this.singleRotation)\n }\n\n private update(): void {\n const editor = this.editor\n const { currentPagePoint, originPagePoint, shiftKey, altKey } = editor.inputs\n const b0 = this.initialSelectionBounds\n const p = this.framePoint(currentPagePoint)\n const p0 = this.framePoint(originPagePoint)\n const delta = Vec.Sub(p, p0)\n const h = this.handle\n\n // New frame bounds from the dragged handle.\n let minX = b0.x\n let minY = b0.y\n let maxX = b0.maxX\n let maxY = b0.maxY\n if (h.includes(\"left\")) minX += delta.x\n if (h.includes(\"right\")) maxX += delta.x\n if (h.includes(\"top\")) minY += delta.y\n if (h.includes(\"bottom\")) maxY += delta.y\n if (altKey) {\n // symmetric about the center\n if (h.includes(\"left\")) maxX -= delta.x\n if (h.includes(\"right\")) minX -= delta.x\n if (h.includes(\"top\")) maxY -= delta.y\n if (h.includes(\"bottom\")) minY -= delta.y\n }\n let scaleX = b0.w === 0 ? 1 : (maxX - minX) / b0.w\n let scaleY = b0.h === 0 ? 1 : (maxY - minY) / b0.h\n const lockAspect = shiftKey || (this.single ? editor.getShapeUtil(this.single).isAspectRatioLocked(this.single) : false)\n if (lockAspect && h.includes(\"_\")) {\n const s = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n scaleX = Math.sign(scaleX || 1) * s\n scaleY = Math.sign(scaleY || 1) * s\n // recompute the moving edges from the anchored ones\n if (h.includes(\"left\")) minX = maxX - b0.w * scaleX\n else maxX = minX + b0.w * scaleX\n if (h.includes(\"top\")) minY = maxY - b0.h * scaleY\n else maxY = minY + b0.h * scaleY\n }\n // Flipping is not supported yet: clamp to a minimum size.\n const MIN = 1\n if (maxX - minX < MIN) {\n if (h.includes(\"left\")) minX = maxX - MIN\n else maxX = minX + MIN\n scaleX = MIN / (b0.w || MIN)\n }\n if (maxY - minY < MIN) {\n if (h.includes(\"top\")) minY = maxY - MIN\n else maxY = minY + MIN\n scaleY = MIN / (b0.h || MIN)\n }\n const anchorX = minX - b0.x * scaleX\n const anchorY = minY - b0.y * scaleY\n\n const updates: ShapePartial[] = []\n for (const snap of this.snapshots) {\n const { shape, bounds } = snap\n const util = editor.getShapeUtil(shape)\n if (!util.canResize(shape)) continue\n let newOriginFrame: Vec\n if (this.single) {\n // frame == shape local space; local origin (0,0) maps to (anchorX, anchorY)\n newOriginFrame = new Vec(anchorX, anchorY)\n } else {\n const rel = Vec.Sub(snap.pagePos, new Vec(b0.x, b0.y))\n newOriginFrame = new Vec(minX + rel.x * scaleX, minY + rel.y * scaleY)\n }\n // frame → page → parent\n const pagePoint = this.single ? Vec.Add(Vec.Rot(newOriginFrame, this.singleRotation), snap.pagePos) : newOriginFrame\n const parentPoint = editor.getPointInParentSpace(shape, pagePoint)\n const change = util.onResize?.(shape, {\n newPoint: parentPoint,\n handle: h,\n mode: \"scale_shape\",\n scaleX,\n scaleY,\n initialBounds: bounds.toJson(),\n initialShape: shape,\n })\n updates.push({ id: shape.id, type: shape.type, x: parentPoint.x, y: parentPoint.y, ...(change ?? {}) })\n }\n editor.updateShapes(updates)\n }\n\n private complete(): void {\n const editor = this.editor\n for (const snap of this.snapshots) {\n const current = editor.getShape(snap.shape.id)\n if (current) editor.getShapeUtil(snap.shape).onResizeEnd?.(snap.shape, current)\n }\n this.parent!.transition(\"idle\")\n }\n}\n\nclass Rotating extends StateNode {\n static override id = \"rotating\"\n private markId = \"\"\n private center = new Vec()\n private startAngle = 0\n private initialShapes: { shape: UnknownShape; pagePos: Vec; pageRotation: number }[] = []\n\n override onEnter(): void {\n const editor = this.editor\n this.markId = editor.markHistoryStoppingPoint(\"rotate\")\n this.center = editor.getSelectionPageBounds()!.center\n this.startAngle = Vec.Angle(this.center, editor.inputs.originPagePoint)\n this.initialShapes = editor.getSelectedShapes().map((shape) => {\n const m = editor.getShapePageTransform(shape)\n return { shape, pagePos: new Vec(m.e, m.f), pageRotation: Math.atan2(m.b, m.a) }\n })\n for (const i of this.initialShapes) editor.getShapeUtil(i.shape).onRotateStart?.(i.shape)\n setCursor(editor, \"grabbing\")\n }\n\n override onPointerMove(): void {\n this.update()\n }\n override onKeyDown(): void {\n this.update()\n }\n override onKeyUp(): void {\n this.update()\n }\n override onPointerUp(): void {\n this.complete()\n }\n override onComplete(): void {\n this.complete()\n }\n override onCancel(): void {\n this.editor.bailToMark(this.markId)\n this.parent!.transition(\"idle\")\n }\n\n private update(): void {\n const editor = this.editor\n let delta = Vec.Angle(this.center, editor.inputs.currentPagePoint) - this.startAngle\n if (editor.inputs.shiftKey) {\n const step = Math.PI / 12\n // snap the resulting page rotation of the first shape to 15° steps\n const base = this.initialShapes[0]?.pageRotation ?? 0\n delta = Math.round((base + delta) / step) * step - base\n }\n const updates: ShapePartial[] = []\n for (const i of this.initialShapes) {\n const newPagePos = Vec.RotWith(i.pagePos, this.center, delta)\n const parentPoint = editor.getPointInParentSpace(i.shape, newPagePos)\n const next = { ...i.shape, x: parentPoint.x, y: parentPoint.y, rotation: i.shape.rotation + delta }\n const change = editor.getShapeUtil(i.shape).onRotate?.(i.shape, next)\n updates.push({ id: i.shape.id, type: i.shape.type, x: next.x, y: next.y, rotation: next.rotation, ...(change ?? {}) })\n }\n editor.updateShapes(updates)\n }\n\n private complete(): void {\n const editor = this.editor\n for (const i of this.initialShapes) {\n const current = editor.getShape(i.shape.id)\n if (current) editor.getShapeUtil(i.shape).onRotateEnd?.(i.shape, current)\n }\n this.parent!.transition(\"idle\")\n }\n}\n\nclass DraggingHandle extends StateNode {\n static override id = \"dragging_handle\"\n private markId = \"\"\n private shape!: UnknownShape\n private handle!: ShapeHandle\n private startedAt = 0\n\n override onEnter(info: Record<string, unknown>): void {\n const i = info as { shape: UnknownShape; handle: ShapeHandle }\n this.shape = this.editor.getShape(i.shape.id) ?? i.shape\n this.handle = i.handle\n this.startedAt = performance.now()\n this.markId = this.editor.markHistoryStoppingPoint(\"drag handle\")\n setCursor(this.editor, \"grabbing\")\n this.update()\n }\n\n override onPointerMove(): void {\n this.update()\n }\n override onKeyDown(): void {\n this.update()\n }\n override onKeyUp(): void {\n this.update()\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onComplete(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.editor.bailToMark(this.markId)\n this.parent!.transition(\"idle\")\n }\n\n private update(): void {\n const editor = this.editor\n const current = editor.getShape(this.shape.id)\n if (!current) return\n const local = editor.getPointInShapeSpace(current, editor.inputs.currentPagePoint)\n const handle: ShapeHandle = { ...this.handle, x: local.x, y: local.y }\n const isPrecise = editor.inputs.altKey || performance.now() - this.startedAt > 1200\n const change = editor.getShapeUtil(current).onHandleDrag?.(current, { handle, isPrecise, initial: this.shape })\n if (change) editor.updateShape({ id: current.id, type: current.type, ...change })\n }\n}\n\n/** Selection, brush select, drag-to-move, resize, rotate, and shape handle dragging. */\nexport class SelectTool extends StateNode {\n static override id = \"select\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [\n Idle,\n PointingCanvas,\n Brushing,\n PointingShape,\n PointingSelection,\n PointingResizeHandle,\n PointingRotateHandle,\n PointingHandle,\n Translating,\n Resizing,\n Rotating,\n DraggingHandle,\n ]\n}\n","import { createShapeId, StateNode, type PointerEventInfo, type StateNodeConstructor } from \"@mocanvas/editor\"\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button !== 0) return\n const editor = this.editor\n const { originPagePoint } = editor.inputs\n editor.markHistoryStoppingPoint(\"create text\")\n const id = createShapeId()\n editor.createShape({\n id,\n type: \"text\",\n x: originPagePoint.x,\n y: originPagePoint.y,\n props: { text: \"\", autoSize: true },\n })\n editor.select(id)\n editor.setEditingShape(id)\n if (!editor.getInstanceState().isToolLocked) editor.setCurrentTool(\"select\")\n }\n\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\n/** Click to place a text shape and start typing. */\nexport class TextTool extends StateNode {\n static override id = \"text\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle]\n}\n","import type { StateNodeConstructor } from \"@mocanvas/editor\"\nimport { ArrowTool } from \"./ArrowTool\"\nimport { DrawTool } from \"./DrawTool\"\nimport { EraserTool } from \"./EraserTool\"\nimport { FrameTool } from \"./FrameTool\"\nimport { GeoTool } from \"./GeoTool\"\nimport { HandTool } from \"./HandTool\"\nimport { LineTool } from \"./LineTool\"\nimport { NoteTool } from \"./NoteTool\"\nimport { SelectTool } from \"./SelectTool\"\nimport { TextTool } from \"./TextTool\"\n\nexport { ArrowTool, DrawTool, EraserTool, FrameTool, GeoTool, HandTool, LineTool, NoteTool, SelectTool, TextTool }\n\nexport const defaultTools: StateNodeConstructor[] = [\n SelectTool,\n HandTool,\n GeoTool,\n DrawTool,\n EraserTool,\n NoteTool,\n TextTool,\n ArrowTool,\n LineTool,\n FrameTool,\n]\n","/**\n * The default UI icon set: original artwork drawn on a 24×24 grid with a\n * 1.75px stroke, round caps and joins, painted with `currentColor` so buttons\n * control their own colour.\n *\n * Grid rules, enforced by `icons.test.tsx` where they are checkable statically\n * and by the gallery pass otherwise:\n *\n * - the artwork lives on a 24×24 viewBox; ink (stroke included) stays inside it\n * - ink is optically centred on (12, 12) and spans about 17.75 units at its\n * widest, so no icon reads heavier than its neighbour in the same row\n * - stroke is 1.75 with round caps and joins; only texture marks (hatching,\n * dotted rules, the mono rails) deviate, and they say so at the call site\n * - deliberate asymmetry is allowed only when it carries meaning, e.g. the\n * vertical-align icons sit high or low on purpose\n *\n * Geo icons are generated from the same geometry the canvas draws, so a toolbar\n * button matches the shape it creates.\n */\nimport { GEO_SHAPE_KINDS, type GeoShapeKind } from \"@mocanvas/editor\"\nimport type { ReactElement } from \"react\"\nimport { getGeoGeometry } from \"../shapes/geo-helpers\"\nimport { pathWordsToSvgD } from \"../shapes/svg-path\"\n\n/** Side of the drawing grid. */\nexport const ICON_GRID = 24\n/** Longest side of the box a geo outline is fitted into, centred in the grid. */\nexport const GEO_BOX = 16\n\nconst solid = { fill: \"currentColor\", stroke: \"none\" } as const\n\n// ---------------------------------------------------------------------------\n// Tools\n// ---------------------------------------------------------------------------\n\nconst TOOL_ICONS = {\n select: <path d=\"M6.65 4.05v13.95l3.54-3.35 2.41 5.3 2.33-1.02-2.42-5.21 4.84-.19z\" />,\n hand: (\n <path d=\"M8.35 14.6V9.5a1.3 1.3 0 0 1 2.6 0V5.3a1.3 1.3 0 0 1 2.6 0v.5a1.3 1.3 0 0 1 2.6 0v1.9a1.3 1.3 0 0 1 2.6 0v6.75c0 3.15-2.55 5.7-5.7 5.7h-.6c-1.9 0-3.68-.96-4.72-2.55l-1.75-2.65a1.3 1.3 0 0 1 2.17-1.42z\" />\n ),\n draw: (\n <>\n <path d=\"M4.4 19.6l1.05-3.8L15.5 5.75a2 2 0 0 1 2.83 2.83L8.2 18.55z\" />\n <path d=\"M13.55 7.7l2.83 2.83\" />\n </>\n ),\n eraser: (\n <>\n <g transform=\"translate(12 10.5) rotate(-45)\">\n <rect x=\"-5.75\" y=\"-3.5\" width=\"11.5\" height=\"7\" rx=\"1.6\" />\n <path d=\"M0 -3.5V3.5\" />\n </g>\n <path d=\"M7 19.4h10.5\" />\n </>\n ),\n text: (\n <>\n <path d=\"M5 6.25V4.5h14v1.75\" />\n <path d=\"M12 4.5v15\" />\n <path d=\"M8.75 19.5h6.5\" />\n </>\n ),\n note: (\n <>\n <path d=\"M4.5 5.75A1.75 1.75 0 0 1 6.25 4h11.5a1.75 1.75 0 0 1 1.75 1.75v8L13.5 20H6.25A1.75 1.75 0 0 1 4.5 18.25z\" />\n <path d=\"M19.5 13.75h-4.25a1.75 1.75 0 0 0-1.75 1.75V20\" />\n </>\n ),\n frame: (\n <>\n <path d=\"M8 4.5v15M16 4.5v15\" />\n <path d=\"M4.5 8h15M4.5 16h15\" />\n </>\n ),\n arrow: (\n <>\n <path d=\"M5.15 18.85L18.85 5.15\" />\n <path d=\"M12 5.15h6.85V12\" />\n </>\n ),\n line: (\n <>\n <path d=\"M7.6 16.4L16.4 7.6\" />\n <circle cx=\"5.85\" cy=\"18.15\" r=\"1.85\" />\n <circle cx=\"18.15\" cy=\"5.85\" r=\"1.85\" />\n </>\n ),\n image: (\n <>\n <rect x=\"3.9\" y=\"5.25\" width=\"16.2\" height=\"13.5\" rx=\"2.25\" />\n <circle cx=\"8.9\" cy=\"10\" r=\"1.55\" />\n <path d=\"M4 16.2l4.75-4.2 3.75 3.25 3-2.5 4.6 4.05\" />\n </>\n ),\n} as const\n\n// ---------------------------------------------------------------------------\n// View, history and object actions\n// ---------------------------------------------------------------------------\n\nconst ACTION_ICONS = {\n \"zoom-in\": (\n <>\n <circle cx=\"10.75\" cy=\"10.75\" r=\"6.25\" />\n <path d=\"M15.4 15.4l5.1 5.1\" />\n <path d=\"M8 10.75h5.5M10.75 8v5.5\" />\n </>\n ),\n \"zoom-out\": (\n <>\n <circle cx=\"10.75\" cy=\"10.75\" r=\"6.25\" />\n <path d=\"M15.4 15.4l5.1 5.1\" />\n <path d=\"M8 10.75h5.5\" />\n </>\n ),\n \"zoom-fit\": (\n <path d=\"M4 9V5.5A1.5 1.5 0 0 1 5.5 4H9M15 4h3.5A1.5 1.5 0 0 1 20 5.5V9M20 15v3.5a1.5 1.5 0 0 1-1.5 1.5H15M9 20H5.5A1.5 1.5 0 0 1 4 18.5V15\" />\n ),\n undo: (\n <>\n <path d=\"M4.25 8.75h10.25a5.25 5.25 0 0 1 0 10.5H10\" />\n <path d=\"M8.25 4.75L4.25 8.75l4 4\" />\n </>\n ),\n redo: (\n <>\n <path d=\"M19.75 8.75H9.5a5.25 5.25 0 0 0 0 10.5H14\" />\n <path d=\"M15.75 4.75l4 4-4 4\" />\n </>\n ),\n lock: (\n <>\n <rect x=\"4.75\" y=\"10.5\" width=\"14.5\" height=\"9.5\" rx=\"2.25\" />\n <path d=\"M8.25 10.5V7.75a3.75 3.75 0 0 1 7.5 0v2.75\" />\n </>\n ),\n unlock: (\n <>\n <rect x=\"4.75\" y=\"10.5\" width=\"14.5\" height=\"9.5\" rx=\"2.25\" />\n <path d=\"M8.25 10.5V7.75a3.75 3.75 0 0 1 7.15-1.5\" />\n </>\n ),\n duplicate: (\n <>\n <rect x=\"8.5\" y=\"8.5\" width=\"11.5\" height=\"11.5\" rx=\"2.25\" />\n <path d=\"M15.5 4H6.25A2.25 2.25 0 0 0 4 6.25V15.5\" />\n </>\n ),\n trash: (\n <>\n <path d=\"M4.5 7h15\" />\n <path d=\"M9.5 7V5.75A1.5 1.5 0 0 1 11 4.25h2a1.5 1.5 0 0 1 1.5 1.5V7\" />\n <path d=\"M6.75 7l.75 11.5A1.5 1.5 0 0 0 9 20h6a1.5 1.5 0 0 0 1.5-1.5L17.25 7\" />\n <path d=\"M10.25 10.5v6M13.75 10.5v6\" />\n </>\n ),\n group: (\n <>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" strokeDasharray=\"3 3\" />\n <rect x=\"7\" y=\"7\" width=\"4.5\" height=\"4.5\" rx=\"1\" />\n <rect x=\"12.5\" y=\"12.5\" width=\"4.5\" height=\"4.5\" rx=\"1\" />\n </>\n ),\n ungroup: (\n <>\n <path d=\"M4 8V5.25A1.25 1.25 0 0 1 5.25 4H8M16 4h2.75A1.25 1.25 0 0 1 20 5.25V8M20 16v2.75A1.25 1.25 0 0 1 18.75 20H16M8 20H5.25A1.25 1.25 0 0 1 4 18.75V16\" />\n <rect x=\"7\" y=\"7\" width=\"4.5\" height=\"4.5\" rx=\"1\" />\n <rect x=\"12.5\" y=\"12.5\" width=\"4.5\" height=\"4.5\" rx=\"1\" />\n </>\n ),\n \"bring-forward\": (\n <>\n <rect x=\"4.75\" y=\"11.25\" width=\"14.5\" height=\"8.75\" rx=\"2.25\" />\n <path d=\"M12 9V4M8.75 7.25L12 4l3.25 3.25\" />\n </>\n ),\n \"send-backward\": (\n <>\n <rect x=\"4.75\" y=\"4\" width=\"14.5\" height=\"8.75\" rx=\"2.25\" />\n <path d=\"M12 15v5M8.75 16.75L12 20l3.25-3.25\" />\n </>\n ),\n \"chevron-down\": <path d=\"M6.75 9.75L12 15l5.25-5.25\" />,\n \"chevron-up\": <path d=\"M6.75 14.25L12 9l5.25 5.25\" />,\n check: <path d=\"M5 12.5l4.9 4.9L19 6.75\" />,\n close: <path d=\"M6.5 6.5l11 11M17.5 6.5l-11 11\" />,\n mixed: <circle cx=\"12\" cy=\"12\" r=\"7.25\" strokeDasharray=\"2.6 2.8\" />,\n} as const\n\n// ---------------------------------------------------------------------------\n// Style properties\n// ---------------------------------------------------------------------------\n\nconst FILL_BOX = { x: 4.25, y: 4.25, width: 15.5, height: 15.5, rx: 3 } as const\n\nconst STYLE_ICONS = {\n \"fill-none\": <rect {...FILL_BOX} />,\n \"fill-semi\": (\n <>\n <rect {...FILL_BOX} fill=\"currentColor\" fillOpacity={0.22} />\n </>\n ),\n \"fill-solid\": <rect {...FILL_BOX} fill=\"currentColor\" />,\n // Hatching is texture, not outline: a lighter stroke keeps the block's weight\n // level with the other three fill icons.\n \"fill-pattern\": (\n <>\n <rect {...FILL_BOX} />\n <path d=\"M6.2 12.6l6.4-6.4M6.2 17.1l10.9-10.9M9.4 18.3l8.9-8.9M14.6 18.4l3.7-3.7\" strokeWidth={1.25} />\n </>\n ),\n \"dash-draw\": <path d=\"M4 14.9c1.6-3.4 3.2-4.9 4.9-4.4 1.7.4 2.4 4 4.2 4.4 1.9.4 3.9-1.9 6.9-5.9\" />,\n \"dash-solid\": <path d=\"M4.25 12h15.5\" />,\n \"dash-dashed\": <path d=\"M4.5 12h15\" strokeDasharray=\"3.1 2.8\" />,\n // Round caps on a zero-length dash draw the dots; the wider stroke is the dot.\n \"dash-dotted\": <path d=\"M5 12h14\" strokeDasharray=\"0.01 4.35\" strokeWidth={2.6} />,\n \"size-s\": <circle cx=\"12\" cy=\"12\" r=\"2\" {...solid} />,\n \"size-m\": <circle cx=\"12\" cy=\"12\" r=\"3.4\" {...solid} />,\n \"size-l\": <circle cx=\"12\" cy=\"12\" r=\"4.9\" {...solid} />,\n \"size-xl\": <circle cx=\"12\" cy=\"12\" r=\"6.6\" {...solid} />,\n \"align-left\": <path d=\"M4.5 6.5h15M4.5 12h7.5M4.5 17.5h11.5\" />,\n \"align-center\": <path d=\"M4.5 6.5h15M8.25 12h7.5M6.25 17.5h11.5\" />,\n \"align-right\": <path d=\"M4.5 6.5h15M12 12h7.5M8 17.5h11.5\" />,\n \"valign-top\": (\n <>\n <path d=\"M4.5 4.5h15\" />\n <rect x=\"7.5\" y=\"7.75\" width=\"9\" height=\"6.25\" rx=\"1.5\" />\n </>\n ),\n \"valign-middle\": (\n <>\n <path d=\"M4.5 12h15\" />\n <rect x=\"7.5\" y=\"8.9\" width=\"9\" height=\"6.25\" rx=\"1.5\" />\n </>\n ),\n \"valign-bottom\": (\n <>\n <path d=\"M4.5 19.5h15\" />\n <rect x=\"7.5\" y=\"10\" width=\"9\" height=\"6.25\" rx=\"1.5\" />\n </>\n ),\n // A single-storey script \"a\": the other three fonts share the capital-A\n // silhouette, so the handwriting option needs a different letter to stay\n // legible at 20px.\n \"font-draw\": (\n <>\n <circle cx=\"10.6\" cy=\"12.6\" r=\"4.4\" />\n <path d=\"M15 6.3v8.9c0 1.5 1 2.5 2.5 2.5\" />\n </>\n ),\n \"font-sans\": (\n <>\n <path d=\"M5.5 19L12 5l6.5 14\" />\n <path d=\"M8 14.5h8\" />\n </>\n ),\n \"font-serif\": (\n <>\n <path d=\"M6.75 19L12 5l5.25 14\" />\n <path d=\"M8.7 14.5h6.6\" />\n <path d=\"M4.9 19h3.6M15.5 19h3.6\" />\n </>\n ),\n \"font-mono\": (\n <>\n <path d=\"M8 19l4-13 4 13\" />\n <path d=\"M9.6 14.9h4.8\" />\n {/* The rails are a frame, not a letter stroke: keep them lighter. */}\n <path d=\"M4.75 5.75v12.5M19.25 5.75v12.5\" strokeWidth={1.4} />\n </>\n ),\n} as const\n\n// ---------------------------------------------------------------------------\n// Geo kinds, derived from the canvas geometry\n// ---------------------------------------------------------------------------\n\n/**\n * Box each geo outline is fitted into. Square by default; kinds whose name\n * implies a proportion get one, so that e.g. \"oval\" does not draw the same\n * circle as \"ellipse\". The longest side is always `GEO_BOX`, which keeps every\n * geo icon at the same optical weight as the rest of the set.\n */\nconst GEO_ICON_BOX: Partial<Record<GeoShapeKind, readonly [number, number]>> = {\n rectangle: [GEO_BOX, 12],\n oval: [GEO_BOX, 10.5],\n \"arrow-left\": [GEO_BOX, 13],\n \"arrow-right\": [GEO_BOX, 13],\n \"arrow-up\": [13, GEO_BOX],\n \"arrow-down\": [13, GEO_BOX],\n}\n\n/** The box a geo icon's outline is fitted into, in grid units. */\nexport function getGeoIconBox(kind: GeoShapeKind): readonly [number, number] {\n return GEO_ICON_BOX[kind] ?? [GEO_BOX, GEO_BOX]\n}\n\n/** `d` attribute for each geo kind, fitted to its icon box. */\nexport const GEO_ICON_PATHS: Record<GeoShapeKind, string> = Object.fromEntries(\n GEO_SHAPE_KINDS.map((kind) => {\n const [w, h] = getGeoIconBox(kind)\n return [kind, pathWordsToSvgD(getGeoGeometry(kind, w, h, false).toPathWords())]\n }),\n) as Record<GeoShapeKind, string>\n\ntype GeoIconName = `geo-${GeoShapeKind}`\n\nconst GEO_ICONS = Object.fromEntries(\n GEO_SHAPE_KINDS.map((kind) => {\n const [w, h] = getGeoIconBox(kind)\n return [\n `geo-${kind}`,\n <g transform={`translate(${(ICON_GRID - w) / 2} ${(ICON_GRID - h) / 2})`}>\n <path d={GEO_ICON_PATHS[kind]} />\n </g>,\n ]\n }),\n) as Record<GeoIconName, ReactElement>\n\n/** Every icon in the set, keyed by name. */\nexport const ICONS = { ...TOOL_ICONS, ...ACTION_ICONS, ...STYLE_ICONS, ...GEO_ICONS }\n\nexport type IconName = keyof typeof ICONS\n\n/** All icon names, sorted — handy for tests and galleries. */\nexport const ICON_NAMES = Object.keys(ICONS).sort() as IconName[]\n\nexport interface IconProps {\n name: IconName\n /** Rendered size in px; the artwork is scaled from the 24×24 grid. */\n size?: number\n className?: string\n}\n\n/** Renders one icon from the set. Decorative by default: label the button instead. */\nexport function Icon({ name, size = 20, className }: IconProps) {\n return (\n <svg\n className={className ? `mocanvas-icon ${className}` : \"mocanvas-icon\"}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.75}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {ICONS[name]}\n </svg>\n )\n}\n","/**\n * Floating layers shared by the default UI: the tooltip and the popover.\n *\n * Both are `position: fixed` and clamped to the viewport. Absolutely positioned\n * versions cannot do either job: a tooltip on the leftmost zoom button runs off\n * the left edge of the window, and anything anchored inside the style panel is\n * clipped by that panel's own scroll container.\n */\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState, type ReactNode, type RefObject } from \"react\"\n\n/** Gap between an anchor and the layer floating beside it. */\nconst GAP = 8\n/** Smallest distance a floating layer keeps from the viewport edge. */\nconst EDGE = 8\n\nexport interface Placement {\n left: number\n top: number\n}\n\n/**\n * Centre `box` on `anchor`, on the preferred side if it fits there and on the\n * other side if it does not, then clamp the result inside the viewport.\n */\nexport function placeNear(anchor: DOMRect, box: { width: number; height: number }, prefer: \"above\" | \"below\", vw: number, vh: number): Placement {\n const above = anchor.top - box.height - GAP\n const below = anchor.bottom + GAP\n let top = prefer === \"above\" ? above : below\n if (prefer === \"above\" && above < EDGE && below + box.height <= vh - EDGE) top = below\n if (prefer === \"below\" && below + box.height > vh - EDGE && above >= EDGE) top = above\n top = Math.min(Math.max(top, EDGE), Math.max(EDGE, vh - box.height - EDGE))\n let left = anchor.left + anchor.width / 2 - box.width / 2\n left = Math.min(Math.max(left, EDGE), Math.max(EDGE, vw - box.width - EDGE))\n return { left, top }\n}\n\nfunction useClamped(getAnchor: () => DOMRect | null, prefer: \"above\" | \"below\", deps: unknown[]): [RefObject<HTMLDivElement | null>, Placement | null] {\n const ref = useRef<HTMLDivElement>(null)\n const [pos, setPos] = useState<Placement | null>(null)\n useLayoutEffect(() => {\n const el = ref.current\n const anchor = getAnchor()\n if (!el || !anchor) {\n setPos(null)\n return\n }\n const box = el.getBoundingClientRect()\n setPos(placeNear(anchor, box, prefer, window.innerWidth, window.innerHeight))\n // getAnchor is recreated per render on purpose; the caller's deps drive this.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps)\n return [ref, pos]\n}\n\n// ---------------------------------------------------------------------------\n// Tooltip\n// ---------------------------------------------------------------------------\n\ninterface TipState {\n label: string\n shortcut: string | null\n anchor: DOMRect\n}\n\n/** How long the pointer must rest on a control before its tooltip appears. */\nconst HOVER_DELAY = 500\n\n/**\n * The single tooltip for the whole UI. Mount it once; it labels any element\n * carrying `data-tooltip` (and, optionally, `data-shortcut`) by delegation, so\n * buttons stay plain buttons.\n */\nexport function UiTooltip() {\n const [tip, setTip] = useState<TipState | null>(null)\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n\n const clear = useCallback(() => {\n clearTimeout(timer.current)\n setTip(null)\n }, [])\n\n useEffect(() => {\n const read = (el: HTMLElement): TipState | null => {\n const label = el.dataset[\"tooltip\"]\n if (!label) return null\n return { label, shortcut: el.dataset[\"shortcut\"] ?? null, anchor: el.getBoundingClientRect() }\n }\n const target = (e: Event): HTMLElement | null => {\n const el = (e.target as HTMLElement | null)?.closest?.<HTMLElement>(\"[data-tooltip]\")\n if (!el || el.matches(\":disabled\") || el.getAttribute(\"aria-disabled\") === \"true\") return null\n return el\n }\n const onOver = (e: PointerEvent) => {\n const el = target(e)\n clearTimeout(timer.current)\n if (!el) {\n setTip(null)\n return\n }\n timer.current = setTimeout(() => setTip(read(el)), HOVER_DELAY)\n }\n // Keyboard focus is deliberate, so it skips the hover delay.\n const onFocus = (e: FocusEvent) => {\n const el = target(e)\n clearTimeout(timer.current)\n setTip(el && el.matches(\":focus-visible\") ? read(el) : null)\n }\n document.addEventListener(\"pointerover\", onOver, true)\n document.addEventListener(\"pointerdown\", clear, true)\n document.addEventListener(\"focusin\", onFocus, true)\n document.addEventListener(\"focusout\", clear, true)\n window.addEventListener(\"scroll\", clear, true)\n return () => {\n clearTimeout(timer.current)\n document.removeEventListener(\"pointerover\", onOver, true)\n document.removeEventListener(\"pointerdown\", clear, true)\n document.removeEventListener(\"focusin\", onFocus, true)\n document.removeEventListener(\"focusout\", clear, true)\n window.removeEventListener(\"scroll\", clear, true)\n }\n }, [clear])\n\n // Above the control by default, so the tooltip never covers what it names.\n const [ref, pos] = useClamped(() => tip?.anchor ?? null, \"above\", [tip])\n if (!tip) return null\n return (\n <div\n ref={ref}\n className=\"mocanvas-tooltip mocanvas-layer\"\n role=\"tooltip\"\n style={pos ? { left: pos.left, top: pos.top } : { left: 0, top: 0, visibility: \"hidden\" }}\n >\n {tip.label}\n {tip.shortcut ? <kbd>{tip.shortcut}</kbd> : null}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Popover\n// ---------------------------------------------------------------------------\n\nexport interface PopoverProps {\n /** The control the popover belongs to; also the click target that keeps it open. */\n anchorRef: RefObject<HTMLElement | null>\n open: boolean\n onClose: () => void\n label: string\n /** Columns in the popover grid. */\n cols?: number\n prefer?: \"above\" | \"below\"\n children: ReactNode\n}\n\n/** A dismissable floating grid anchored to a button. */\nexport function Popover({ anchorRef, open, onClose, label, cols = 5, prefer = \"above\", children }: PopoverProps) {\n const [ref, pos] = useClamped(() => anchorRef.current?.getBoundingClientRect() ?? null, prefer, [open, anchorRef])\n\n useEffect(() => {\n if (!open) return\n const onDown = (e: PointerEvent) => {\n const t = e.target as Node\n if (ref.current?.contains(t) || anchorRef.current?.contains(t)) return\n onClose()\n }\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation()\n onClose()\n anchorRef.current?.focus()\n }\n }\n document.addEventListener(\"pointerdown\", onDown, true)\n document.addEventListener(\"keydown\", onKey, true)\n return () => {\n document.removeEventListener(\"pointerdown\", onDown, true)\n document.removeEventListener(\"keydown\", onKey, true)\n }\n }, [open, onClose, anchorRef, ref])\n\n if (!open) return null\n return (\n <div\n ref={ref}\n className=\"mocanvas-popover mocanvas-layer\"\n role=\"menu\"\n aria-label={label}\n style={{\n [\"--mocanvas-popover-cols\" as string]: cols,\n ...(pos ? { left: pos.left, top: pos.top } : { left: 0, top: 0, visibility: \"hidden\" as const }),\n }}\n onPointerDown={(e) => e.stopPropagation()}\n >\n {children}\n </div>\n )\n}\n","import {\n DEFAULT_COLORS,\n DefaultColorStyle,\n DefaultDashStyle,\n DefaultFillStyle,\n DefaultFontStyle,\n DefaultHorizontalAlignStyle,\n DefaultLabelColorStyle,\n DefaultSizeStyle,\n DefaultVerticalAlignStyle,\n GEO_SHAPE_KINDS,\n GeoShapeGeoStyle,\n LIGHT_THEME,\n track,\n useEditor,\n type DefaultColorStyle as ColorValue,\n type DefaultDashStyle as DashValue,\n type DefaultFillStyle as FillValue,\n type DefaultFontStyle as FontValue,\n type DefaultHorizontalAlignStyle as HAlignValue,\n type DefaultSizeStyle as SizeValue,\n type DefaultVerticalAlignStyle as VAlignValue,\n type Editor,\n type GeoShapeKind,\n type SharedStyle,\n type StyleProp,\n} from \"@mocanvas/editor\"\nimport { useRef, useState, type ReactNode } from \"react\"\nimport { Icon, type IconName } from \"./icons\"\nimport { Popover } from \"./overlays\"\n\n/** Tools whose id doubles as the type of the shape they create. */\nconst CREATING_TOOLS = new Set([\"geo\", \"draw\", \"note\", \"text\", \"arrow\", \"line\"])\n\nconst SWATCH_COLORS = DEFAULT_COLORS.filter((c) => c !== \"white\")\nconst FILLS: FillValue[] = [\"none\", \"semi\", \"solid\", \"pattern\"]\nconst DASHES: DashValue[] = [\"draw\", \"solid\", \"dashed\", \"dotted\"]\nconst SIZES: SizeValue[] = [\"s\", \"m\", \"l\", \"xl\"]\nconst FONTS: FontValue[] = [\"draw\", \"sans\", \"serif\", \"mono\"]\nconst H_ALIGNS: HAlignValue[] = [\"start\", \"middle\", \"end\"]\nconst V_ALIGNS: VAlignValue[] = [\"start\", \"middle\", \"end\"]\n\nconst FILL_ICON: Record<string, IconName> = { none: \"fill-none\", semi: \"fill-semi\", solid: \"fill-solid\", pattern: \"fill-pattern\" }\nconst H_ALIGN_ICON: Record<string, IconName> = { start: \"align-left\", middle: \"align-center\", end: \"align-right\" }\nconst V_ALIGN_ICON: Record<string, IconName> = { start: \"valign-top\", middle: \"valign-middle\", end: \"valign-bottom\" }\nconst H_ALIGN_LABEL: Record<string, string> = { start: \"Align left\", middle: \"Align centre\", end: \"Align right\" }\nconst V_ALIGN_LABEL: Record<string, string> = { start: \"Align top\", middle: \"Align middle\", end: \"Align bottom\" }\n\nfunction titleCase(s: string): string {\n return s.replace(/-/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\n// ---------------------------------------------------------------------------\n// Which rows the panel shows\n// ---------------------------------------------------------------------------\n\n/**\n * The style rows the panel renders, in order, grouped as the panel groups them.\n *\n * With a selection this is exactly what the selected shapes declare, so a line\n * (colour, dash, size) never offers Font or Align; with nothing selected it is\n * what the active drawing tool is about to create. Exported so the rule can be\n * tested without a DOM.\n */\nexport interface StylePanelSections {\n /** The geo picker. */\n shape: boolean\n /** Colour swatch grids. */\n color: boolean\n labelColor: boolean\n /** Stroke and fill. */\n fill: boolean\n dash: boolean\n size: boolean\n /** Text. */\n font: boolean\n align: boolean\n verticalAlign: boolean\n /** Shape-level, not a style: only with a selection. */\n opacity: boolean\n}\n\nconst NOTHING: StylePanelSections = {\n shape: false,\n color: false,\n labelColor: false,\n fill: false,\n dash: false,\n size: false,\n font: false,\n align: false,\n verticalAlign: false,\n opacity: false,\n}\n\n/** Decide which rows the style panel shows for the editor's current state. */\nexport function getStylePanelSections(editor: Editor): StylePanelSections {\n const hasSelection = editor.getSelectedShapeIds().length > 0\n const toolId = editor.getCurrentToolId()\n // With a selection the selection decides, full stop: falling back to the\n // active tool's styles would offer rows the selected shapes cannot carry.\n const visible: Set<StyleProp<unknown>> = hasSelection\n ? new Set(editor.getSharedStyles().keys())\n : CREATING_TOOLS.has(toolId)\n ? new Set(editor.getStylePropsForType(toolId).values())\n : new Set()\n if (visible.size === 0 && !hasSelection) return NOTHING\n return {\n shape: visible.has(GeoShapeGeoStyle),\n color: visible.has(DefaultColorStyle),\n labelColor: visible.has(DefaultLabelColorStyle),\n fill: visible.has(DefaultFillStyle),\n dash: visible.has(DefaultDashStyle),\n size: visible.has(DefaultSizeStyle),\n font: visible.has(DefaultFontStyle),\n align: visible.has(DefaultHorizontalAlignStyle),\n verticalAlign: visible.has(DefaultVerticalAlignStyle),\n opacity: hasSelection,\n }\n}\n\n/** Whether any row at all is on. */\nexport function hasAnyStyleSection(s: StylePanelSections): boolean {\n return Object.values(s).some(Boolean)\n}\n\n// ---------------------------------------------------------------------------\n// Pieces\n// ---------------------------------------------------------------------------\n\n/** The dashed ring shown beside a row whose selection has differing values. */\nfunction MixedRing() {\n return (\n <span className=\"mocanvas-mixed\">\n <Icon name=\"mixed\" size={11} />\n mixed\n </span>\n )\n}\n\nfunction Row({ label, mixed, children }: { label: string; mixed: boolean; children: ReactNode }) {\n return (\n <div>\n <div className=\"mocanvas-row-label\">\n <span>{label}</span>\n {mixed ? <MixedRing /> : null}\n </div>\n <div className=\"mocanvas-seg\" role=\"radiogroup\" aria-label={label}>\n {children}\n </div>\n </div>\n )\n}\n\n/** A titled band of related rows, separated from its neighbours by a hairline. */\nfunction Group({ children }: { children: ReactNode }) {\n return <div className=\"mocanvas-group\">{children}</div>\n}\n\ninterface ChoiceProps<T> {\n value: T\n current: SharedStyle<T> | undefined\n label: string\n onPick: (value: T) => void\n children: ReactNode\n}\n\nfunction Choice<T>({ value, current, label, onPick, children }: ChoiceProps<T>) {\n const active = current?.type === \"shared\" && current.value === value\n return (\n <button type=\"button\" role=\"radio\" className=\"mocanvas-btn\" aria-label={label} aria-checked={active} data-tooltip={label} onClick={() => onPick(value)}>\n {children}\n </button>\n )\n}\n\nfunction ColorRow({ label, current, onPick }: { label: string; current: SharedStyle<ColorValue> | undefined; onPick: (c: ColorValue) => void }) {\n return (\n <div>\n <div className=\"mocanvas-row-label\">\n <span>{label}</span>\n {current?.type === \"mixed\" ? <MixedRing /> : null}\n </div>\n <div className=\"mocanvas-swatches\" role=\"radiogroup\" aria-label={label}>\n {SWATCH_COLORS.map((c) => (\n <button\n key={c}\n type=\"button\"\n role=\"radio\"\n className=\"mocanvas-swatch\"\n aria-label={titleCase(c)}\n aria-checked={current?.type === \"shared\" && current.value === c}\n data-tooltip={titleCase(c)}\n onClick={() => onPick(c)}\n >\n <span style={{ [\"--mocanvas-swatch-color\" as string]: LIGHT_THEME[c].solid }} />\n </button>\n ))}\n </div>\n </div>\n )\n}\n\n/**\n * The geo kind, as one button that opens a grid. Twenty always-visible cells\n * cost more vertical space than the rest of the panel put together, and the\n * kind rarely changes once a shape exists.\n */\nfunction ShapePicker({ current, onPick }: { current: SharedStyle<GeoShapeKind> | undefined; onPick: (geo: GeoShapeKind) => void }) {\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLButtonElement>(null)\n const value = current?.type === \"shared\" ? current.value : null\n return (\n <div>\n <div className=\"mocanvas-row-label\">\n <span>Shape</span>\n {current?.type === \"mixed\" ? <MixedRing /> : null}\n </div>\n <button\n ref={ref}\n type=\"button\"\n className=\"mocanvas-picker\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={value ? `Shape: ${titleCase(value)}` : \"Shape\"}\n onClick={() => setOpen((v) => !v)}\n >\n <span>\n {value ? <Icon name={`geo-${value}`} /> : <Icon name=\"mixed\" />}\n {value ? titleCase(value) : \"Mixed\"}\n </span>\n <Icon name={open ? \"chevron-up\" : \"chevron-down\"} size={16} />\n </button>\n <Popover anchorRef={ref} open={open} onClose={() => setOpen(false)} label=\"Shape\" prefer=\"below\">\n {GEO_SHAPE_KINDS.map((kind) => (\n <button\n key={kind}\n type=\"button\"\n role=\"menuitemradio\"\n className=\"mocanvas-btn\"\n aria-label={titleCase(kind)}\n aria-checked={value === kind}\n data-tooltip={titleCase(kind)}\n onClick={() => {\n onPick(kind)\n setOpen(false)\n }}\n >\n <Icon name={`geo-${kind}`} />\n </button>\n ))}\n </Popover>\n </div>\n )\n}\n\nfunction OpacityRow({ editor }: { editor: Editor }) {\n const shapes = editor.getSelectedShapes()\n if (shapes.length === 0) return null\n const first = shapes[0]!.opacity\n const mixed = shapes.some((s) => s.opacity !== first)\n const value = mixed ? 1 : first\n return (\n <div>\n <div className=\"mocanvas-row-label\">\n <span>Opacity</span>\n {mixed ? <MixedRing /> : <span>{Math.round(value * 100)}%</span>}\n </div>\n <input\n type=\"range\"\n className=\"mocanvas-slider\"\n min={0.1}\n max={1}\n step={0.05}\n value={value}\n aria-label=\"Opacity\"\n onPointerDown={() => editor.markHistoryStoppingPoint(\"opacity\")}\n onChange={(e) => {\n const opacity = Number(e.currentTarget.value)\n editor.updateShapes(editor.getSelectedShapes().map((s) => ({ id: s.id, type: s.type, opacity })))\n }}\n />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Panel\n// ---------------------------------------------------------------------------\n\n/**\n * Style controls for the selection (or, with nothing selected, for the next\n * shape the active drawing tool creates). Sits in the top-right corner.\n *\n * Rows are grouped — shape, colour, stroke and fill, text, opacity — and every\n * group is omitted when the selection cannot carry it.\n */\nexport const StylePanel = track(function StylePanel() {\n const editor = useEditor()\n const sections = getStylePanelSections(editor)\n const styles = editor.getSharedStyles()\n if (!hasAnyStyleSection(sections)) return null\n\n const setStyle = <T,>(style: StyleProp<T>, value: T) => {\n editor.markHistoryStoppingPoint(\"style\")\n editor.setStyleForSelectedShapes(style, value)\n editor.setStyleForNextShapes(style, value)\n }\n const pickGeo = (geo: GeoShapeKind) => {\n setStyle(GeoShapeGeoStyle, geo)\n // The geo tool reads its kind on enter; re-enter so the change takes effect immediately.\n if (editor.getCurrentToolId() === \"geo\") editor.setCurrentTool(\"geo\", { geo, force: true })\n }\n\n const strokeGroup = sections.fill || sections.dash || sections.size\n const textGroup = sections.font || sections.align || sections.verticalAlign\n\n return (\n <div className=\"mocanvas-panel mocanvas-stylepanel\" aria-label=\"Style\" onPointerDown={(e) => e.stopPropagation()}>\n {sections.shape ? (\n <Group>\n <ShapePicker current={styles.get(GeoShapeGeoStyle)} onPick={pickGeo} />\n </Group>\n ) : null}\n\n {sections.color || sections.labelColor ? (\n <Group>\n {sections.color ? <ColorRow label=\"Color\" current={styles.get(DefaultColorStyle)} onPick={(c) => setStyle(DefaultColorStyle, c)} /> : null}\n {sections.labelColor ? <ColorRow label=\"Label\" current={styles.get(DefaultLabelColorStyle)} onPick={(c) => setStyle(DefaultLabelColorStyle, c)} /> : null}\n </Group>\n ) : null}\n\n {strokeGroup ? (\n <Group>\n {sections.fill ? (\n <Row label=\"Fill\" mixed={styles.get(DefaultFillStyle)?.type === \"mixed\"}>\n {FILLS.map((f) => (\n <Choice key={f} value={f} current={styles.get(DefaultFillStyle)} label={`${titleCase(f)} fill`} onPick={(v) => setStyle(DefaultFillStyle, v)}>\n <Icon name={FILL_ICON[f]!} />\n </Choice>\n ))}\n </Row>\n ) : null}\n {sections.dash ? (\n <Row label=\"Dash\" mixed={styles.get(DefaultDashStyle)?.type === \"mixed\"}>\n {DASHES.map((d) => (\n <Choice key={d} value={d} current={styles.get(DefaultDashStyle)} label={`${titleCase(d)} line`} onPick={(v) => setStyle(DefaultDashStyle, v)}>\n <Icon name={`dash-${d}`} />\n </Choice>\n ))}\n </Row>\n ) : null}\n {sections.size ? (\n <Row label=\"Size\" mixed={styles.get(DefaultSizeStyle)?.type === \"mixed\"}>\n {SIZES.map((s) => (\n <Choice key={s} value={s} current={styles.get(DefaultSizeStyle)} label={`Size ${s.toUpperCase()}`} onPick={(v) => setStyle(DefaultSizeStyle, v)}>\n <Icon name={`size-${s}`} />\n </Choice>\n ))}\n </Row>\n ) : null}\n </Group>\n ) : null}\n\n {textGroup ? (\n <Group>\n {sections.font ? (\n <Row label=\"Font\" mixed={styles.get(DefaultFontStyle)?.type === \"mixed\"}>\n {FONTS.map((f) => (\n <Choice key={f} value={f} current={styles.get(DefaultFontStyle)} label={`${titleCase(f)} font`} onPick={(v) => setStyle(DefaultFontStyle, v)}>\n <Icon name={`font-${f}`} />\n </Choice>\n ))}\n </Row>\n ) : null}\n {/* The two alignments are one idea and three buttons each, so they\n share a row rather than costing two labels' worth of height. */}\n {sections.align || sections.verticalAlign ? (\n <div>\n <div className=\"mocanvas-row-label\">\n <span>Align</span>\n {styles.get(DefaultHorizontalAlignStyle)?.type === \"mixed\" || styles.get(DefaultVerticalAlignStyle)?.type === \"mixed\" ? <MixedRing /> : null}\n </div>\n <div className=\"mocanvas-seg mocanvas-seg--split\">\n {sections.align ? (\n <div className=\"mocanvas-seg\" role=\"radiogroup\" aria-label=\"Horizontal align\">\n {H_ALIGNS.map((a) => (\n <Choice key={a} value={a} current={styles.get(DefaultHorizontalAlignStyle)} label={H_ALIGN_LABEL[a]!} onPick={(v) => setStyle(DefaultHorizontalAlignStyle, v)}>\n <Icon name={H_ALIGN_ICON[a]!} />\n </Choice>\n ))}\n </div>\n ) : null}\n {sections.verticalAlign ? (\n <div className=\"mocanvas-seg\" role=\"radiogroup\" aria-label=\"Vertical align\">\n {V_ALIGNS.map((a) => (\n <Choice key={a} value={a} current={styles.get(DefaultVerticalAlignStyle)} label={V_ALIGN_LABEL[a]!} onPick={(v) => setStyle(DefaultVerticalAlignStyle, v)}>\n <Icon name={V_ALIGN_ICON[a]!} />\n </Choice>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n ) : null}\n </Group>\n ) : null}\n\n {sections.opacity ? (\n <Group>\n <OpacityRow editor={editor} />\n </Group>\n ) : null}\n </div>\n )\n})\n","import { useEffect } from \"react\"\nimport { atom } from \"@mocanvas/state\"\nimport type { Editor } from \"@mocanvas/editor\"\n\n/** Whether the frame-statistics chip is visible. Toggled with ⌥D. */\nexport const debugStatsOpen = atom(\"debugStatsOpen\", false)\n\nfunction isEditable(t: EventTarget | null): boolean {\n return t instanceof HTMLElement && (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable)\n}\n\nlet clipboardFallback = \"\"\n\n/** Default keyboard shortcuts: tool switching, undo/redo, select all, zoom, clipboard. */\nexport function useKeyboardShortcuts(editor: Editor | null): void {\n useEffect(() => {\n if (!editor) return\n const isMac = /Mac|iPhone|iPad/.test(navigator.platform ?? \"\")\n const onKeyDown = (e: KeyboardEvent) => {\n if (isEditable(e.target)) return\n if (editor.getEditingShapeId()) return\n const accel = isMac ? e.metaKey : e.ctrlKey\n const key = e.key.toLowerCase()\n if (accel) {\n switch (key) {\n case \"z\":\n e.preventDefault()\n if (e.shiftKey) editor.redo()\n else editor.undo()\n return\n case \"y\":\n e.preventDefault()\n editor.redo()\n return\n case \"a\":\n e.preventDefault()\n editor.selectAll()\n return\n case \"g\": {\n e.preventDefault()\n const ids = editor.getSelectedShapeIds()\n if (!ids.length) return\n editor.markHistoryStoppingPoint(e.shiftKey ? \"ungroup\" : \"group\")\n if (e.shiftKey) editor.ungroupShapes(ids)\n else editor.groupShapes(ids)\n return\n }\n case \"l\": {\n e.preventDefault()\n if (e.shiftKey) {\n editor.markHistoryStoppingPoint(\"lock\")\n editor.toggleLock()\n }\n return\n }\n case \"d\": {\n e.preventDefault()\n const ids = editor.getSelectedShapeIds()\n if (ids.length) {\n editor.markHistoryStoppingPoint(\"duplicate\")\n const copies = editor.duplicateShapes(ids)\n editor.setSelectedShapes(copies)\n }\n return\n }\n case \"c\":\n case \"x\": {\n const ids = editor.getSelectedShapeIds()\n if (!ids.length) return\n e.preventDefault()\n const content = editor.getContentFromCurrentPage(ids)\n if (content) {\n const text = JSON.stringify({ type: \"application/mocanvas\", ...content })\n navigator.clipboard?.writeText(text).catch(() => {})\n clipboardFallback = text\n }\n if (key === \"x\") {\n editor.markHistoryStoppingPoint(\"cut\")\n editor.deleteShapes(ids)\n }\n return\n }\n case \"v\": {\n e.preventDefault()\n const paste = (text: string) => {\n try {\n const data = JSON.parse(text) as { type?: string; shapes?: unknown[]; bindings?: unknown[] }\n if (data.type !== \"application/mocanvas\" || !Array.isArray(data.shapes)) return\n editor.markHistoryStoppingPoint(\"paste\")\n editor.putContentOntoCurrentPage(data as never, { point: editor.getViewportPageCenter() })\n } catch {\n // not our content\n }\n }\n if (navigator.clipboard?.readText) navigator.clipboard.readText().then(paste, () => clipboardFallback && paste(clipboardFallback))\n else if (clipboardFallback) paste(clipboardFallback)\n return\n }\n case \"=\":\n case \"+\":\n e.preventDefault()\n editor.zoomIn()\n return\n case \"-\":\n e.preventDefault()\n editor.zoomOut()\n return\n case \"0\":\n e.preventDefault()\n editor.resetZoom()\n return\n case \"1\":\n e.preventDefault()\n editor.zoomToFit()\n return\n case \"2\":\n e.preventDefault()\n editor.zoomToSelection()\n return\n case \"]\":\n e.preventDefault()\n if (e.altKey) editor.bringToFront()\n else editor.bringForward()\n return\n case \"[\":\n e.preventDefault()\n if (e.altKey) editor.sendToBack()\n else editor.sendBackward()\n return\n default:\n return\n }\n }\n if (e.altKey) {\n // ⌥D toggles the debug stats chip. On macOS Alt+D types \"∂\", so match the physical key too.\n if (e.code === \"KeyD\" || key === \"d\" || key === \"\\u2202\") {\n e.preventDefault()\n debugStatsOpen.set(!debugStatsOpen.get())\n }\n return\n }\n switch (key) {\n case \"v\":\n editor.setCurrentTool(\"select\")\n break\n case \"h\":\n editor.setCurrentTool(\"hand\")\n break\n case \"r\":\n editor.setCurrentTool(\"geo\", { geo: \"rectangle\" })\n break\n case \"o\":\n editor.setCurrentTool(\"geo\", { geo: \"ellipse\" })\n break\n case \"d\":\n case \"p\":\n case \"b\":\n editor.setCurrentTool(\"draw\")\n break\n case \"e\":\n editor.setCurrentTool(\"eraser\")\n break\n case \"n\":\n editor.setCurrentTool(\"note\")\n break\n case \"t\":\n editor.setCurrentTool(\"text\")\n break\n // arrow/line/frame are optional tools: apps may register a smaller set.\n case \"a\":\n if (editor.root.children?.[\"arrow\"]) editor.setCurrentTool(\"arrow\")\n break\n case \"l\":\n if (editor.root.children?.[\"line\"]) editor.setCurrentTool(\"line\")\n break\n case \"f\":\n if (editor.root.children?.[\"frame\"]) editor.setCurrentTool(\"frame\")\n break\n case \"q\":\n editor.updateInstanceState({ isToolLocked: !editor.getInstanceState().isToolLocked })\n break\n default:\n break\n }\n }\n window.addEventListener(\"keydown\", onKeyDown)\n return () => window.removeEventListener(\"keydown\", onKeyDown)\n }, [editor])\n}\n","import { GeoShapeGeoStyle, GEO_SHAPE_KINDS, track, useEditor, useValue, type Editor, type GeoShapeKind } from \"@mocanvas/editor\"\nimport { Fragment, useEffect, useRef, useState, type Ref } from \"react\"\nimport { Icon, type IconName } from \"./icons\"\nimport { Popover, UiTooltip } from \"./overlays\"\nimport { StylePanel } from \"./StylePanel\"\nimport { debugStatsOpen } from \"./useKeyboardShortcuts\"\nimport \"./ui.css\"\n\nconst IS_MAC = typeof navigator !== \"undefined\" && /Mac|iPhone|iPad|iPod/.test(navigator.platform || navigator.userAgent || \"\")\n/** Accelerator prefix for tooltips: `⌘` on Apple platforms, `Ctrl+` elsewhere. */\nexport const MOD_KEY = IS_MAC ? \"⌘\" : \"Ctrl+\"\n\nconst stopPointer = (e: { stopPropagation: () => void }) => e.stopPropagation()\n\nfunction titleCase(s: string): string {\n return s.replace(/-/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\n// ---------------------------------------------------------------------------\n// Toolbar configuration\n// ---------------------------------------------------------------------------\n\nexport interface ToolbarItem {\n /** Unique key; also the geo kind for geo entries. */\n id: string\n /** Tool id that must be registered for this entry to appear. */\n tool: string\n icon: IconName\n label: string\n /** Displayed in the tooltip, next to the label. */\n shortcut?: string\n /** Geo kind the entry selects, for entries driving the `geo` tool. */\n geo?: GeoShapeKind\n /** Tools outside the default set: shown only when the app registers them. */\n optional?: boolean\n}\n\n/** Toolbar entries, grouped; groups are separated by a divider. */\nexport const TOOLBAR_GROUPS: readonly (readonly ToolbarItem[])[] = [\n [\n { id: \"select\", tool: \"select\", icon: \"select\", label: \"Select\", shortcut: \"V\" },\n { id: \"hand\", tool: \"hand\", icon: \"hand\", label: \"Hand\", shortcut: \"H\" },\n ],\n [\n { id: \"draw\", tool: \"draw\", icon: \"draw\", label: \"Draw\", shortcut: \"D\" },\n { id: \"eraser\", tool: \"eraser\", icon: \"eraser\", label: \"Eraser\", shortcut: \"E\" },\n ],\n [\n { id: \"rectangle\", tool: \"geo\", icon: \"geo-rectangle\", label: \"Rectangle\", shortcut: \"R\", geo: \"rectangle\" },\n { id: \"ellipse\", tool: \"geo\", icon: \"geo-ellipse\", label: \"Ellipse\", shortcut: \"O\", geo: \"ellipse\" },\n { id: \"triangle\", tool: \"geo\", icon: \"geo-triangle\", label: \"Triangle\", geo: \"triangle\" },\n { id: \"diamond\", tool: \"geo\", icon: \"geo-diamond\", label: \"Diamond\", geo: \"diamond\" },\n { id: \"star\", tool: \"geo\", icon: \"geo-star\", label: \"Star\", geo: \"star\" },\n ],\n [\n { id: \"text\", tool: \"text\", icon: \"text\", label: \"Text\", shortcut: \"T\" },\n { id: \"note\", tool: \"note\", icon: \"note\", label: \"Note\", shortcut: \"N\" },\n { id: \"arrow\", tool: \"arrow\", icon: \"arrow\", label: \"Arrow\", shortcut: \"A\", optional: true },\n { id: \"line\", tool: \"line\", icon: \"line\", label: \"Line\", shortcut: \"L\", optional: true },\n { id: \"frame\", tool: \"frame\", icon: \"frame\", label: \"Frame\", shortcut: \"F\", optional: true },\n ],\n]\n\n/** Geo kinds that live behind the \"more shapes\" popover. */\nexport const PRIMARY_GEO_KINDS: readonly GeoShapeKind[] = TOOLBAR_GROUPS.flat()\n .map((t) => t.geo)\n .filter((g): g is GeoShapeKind => g !== undefined)\n\nexport const MORE_GEO_KINDS: readonly GeoShapeKind[] = GEO_SHAPE_KINDS.filter((k) => !PRIMARY_GEO_KINDS.includes(k))\n\n/** Tool ids the editor currently has registered. */\nfunction registeredTools(editor: Editor): Set<string> {\n return new Set(Object.keys(editor.root.children ?? {}))\n}\n\n// ---------------------------------------------------------------------------\n// Shared button\n// ---------------------------------------------------------------------------\n\ninterface UiButtonProps {\n icon: IconName\n label: string\n shortcut?: string\n pressed?: boolean\n expanded?: boolean\n disabled?: boolean\n className?: string\n ref?: Ref<HTMLButtonElement>\n onClick: () => void\n}\n\nfunction UiButton({ icon, label, shortcut, pressed, expanded, disabled, className, ref, onClick }: UiButtonProps) {\n return (\n <button\n ref={ref}\n type=\"button\"\n className={className ? `mocanvas-btn ${className}` : \"mocanvas-btn\"}\n aria-label={label}\n data-tooltip={label}\n {...(shortcut ? { \"data-shortcut\": shortcut } : {})}\n {...(pressed === undefined ? {} : { \"aria-pressed\": pressed })}\n {...(expanded === undefined ? {} : { \"aria-expanded\": expanded })}\n {...(disabled ? { disabled: true } : {})}\n onClick={onClick}\n >\n <Icon name={icon} />\n </button>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Toolbar\n// ---------------------------------------------------------------------------\n\n/** Bottom toolbar: tools, grouped, plus a popover with the rest of the shapes. */\nexport const Toolbar = track(function Toolbar() {\n const editor = useEditor()\n const [moreOpen, setMoreOpen] = useState(false)\n const moreRef = useRef<HTMLButtonElement>(null)\n\n const available = registeredTools(editor)\n const toolId = editor.getCurrentToolId()\n const geo = toolId === \"geo\" ? ((editor.getStateDescendant(\"geo\") as { geo?: GeoShapeKind } | undefined)?.geo ?? \"rectangle\") : null\n\n const pickGeo = (kind: GeoShapeKind) => {\n editor.setStyleForNextShapes(GeoShapeGeoStyle, kind)\n editor.setCurrentTool(\"geo\", { geo: kind, force: true })\n }\n\n const groups = TOOLBAR_GROUPS.map((group) => group.filter((item) => available.has(item.tool))).filter((group) => group.length > 0)\n const hasGeo = available.has(\"geo\") && MORE_GEO_KINDS.length > 0\n const moreActive = toolId === \"geo\" && geo !== null && !PRIMARY_GEO_KINDS.includes(geo)\n\n return (\n <div className=\"mocanvas-panel mocanvas-toolbar\" role=\"toolbar\" aria-label=\"Tools\" onPointerDown={stopPointer}>\n {groups.map((group, i) => (\n <Fragment key={group[0]!.id}>\n {i > 0 ? <span className=\"mocanvas-divider\" aria-hidden=\"true\" /> : null}\n {group.map((item) => (\n <UiButton\n key={item.id}\n icon={item.icon}\n label={item.label}\n {...(item.shortcut ? { shortcut: item.shortcut } : {})}\n pressed={item.tool === toolId && (item.geo === undefined || item.geo === geo)}\n onClick={() => (item.geo ? pickGeo(item.geo) : editor.setCurrentTool(item.tool))}\n />\n ))}\n {hasGeo && group.some((item) => item.geo) ? (\n <span className=\"mocanvas-more\">\n <UiButton\n ref={moreRef}\n icon=\"chevron-down\"\n label=\"More shapes\"\n pressed={moreActive}\n expanded={moreOpen}\n onClick={() => setMoreOpen((v) => !v)}\n />\n <Popover anchorRef={moreRef} open={moreOpen} onClose={() => setMoreOpen(false)} label=\"More shapes\" prefer=\"above\">\n {MORE_GEO_KINDS.map((kind) => (\n <button\n key={kind}\n type=\"button\"\n role=\"menuitemradio\"\n className=\"mocanvas-btn\"\n aria-label={titleCase(kind)}\n aria-checked={geo === kind}\n data-tooltip={titleCase(kind)}\n onClick={() => {\n pickGeo(kind)\n setMoreOpen(false)\n }}\n >\n <Icon name={`geo-${kind}`} />\n </button>\n ))}\n </Popover>\n </span>\n ) : null}\n </Fragment>\n ))}\n </div>\n )\n})\n\n// ---------------------------------------------------------------------------\n// Zoom bar\n// ---------------------------------------------------------------------------\n\n/** Zoom controls and undo/redo. */\nexport const ZoomBar = track(function ZoomBar() {\n const editor = useEditor()\n const zoom = Math.round(editor.getZoomLevel() * 100)\n return (\n <div className=\"mocanvas-panel mocanvas-zoombar\" role=\"toolbar\" aria-label=\"View\" onPointerDown={stopPointer}>\n <UiButton icon=\"zoom-out\" label=\"Zoom out\" shortcut={`${MOD_KEY}−`} onClick={() => editor.zoomOut()} />\n <button\n type=\"button\"\n className=\"mocanvas-btn mocanvas-btn--wide\"\n aria-label={`Reset zoom, currently ${zoom}%`}\n data-tooltip=\"Reset zoom\"\n data-shortcut={`${MOD_KEY}0`}\n onClick={() => editor.resetZoom()}\n >\n {zoom}%\n </button>\n <UiButton icon=\"zoom-in\" label=\"Zoom in\" shortcut={`${MOD_KEY}+`} onClick={() => editor.zoomIn()} />\n <UiButton icon=\"zoom-fit\" label=\"Zoom to fit\" shortcut={`${MOD_KEY}1`} onClick={() => editor.zoomToFit()} />\n <span className=\"mocanvas-divider\" aria-hidden=\"true\" />\n <UiButton icon=\"undo\" label=\"Undo\" shortcut={`${MOD_KEY}Z`} disabled={!editor.getCanUndo()} onClick={() => editor.undo()} />\n <UiButton icon=\"redo\" label=\"Redo\" shortcut={`${MOD_KEY}⇧Z`} disabled={!editor.getCanRedo()} onClick={() => editor.redo()} />\n </div>\n )\n})\n\n// ---------------------------------------------------------------------------\n// Debug stats\n// ---------------------------------------------------------------------------\n\n/** Compact frame-statistics chip. Toggled with ⌥D. */\nexport const DebugStats = track(function DebugStats({ editor }: { editor: Editor }) {\n const stats = editor.getLastFrameStats()\n const count = editor.getCurrentPageShapeIds().size\n return (\n <div className=\"mocanvas-panel mocanvas-stats\" role=\"status\" aria-label=\"Frame statistics\" onPointerDown={stopPointer}>\n <span>\n <b>{count}</b> shapes · <b>{editor.engine.shapeCount}</b> engine\n </span>\n <span>\n <b>{stats.drawn}</b> drawn · <b>{stats.culled}</b> culled\n </span>\n <span>\n <b>{stats.ms.toFixed(2)}</b> ms/frame\n </span>\n </div>\n )\n})\n\nexport function DefaultUi({ editor, showStats = true }: { editor: Editor; showStats?: boolean }) {\n const statsOpen = useValue(debugStatsOpen)\n useEffect(() => {\n debugStatsOpen.set(showStats)\n }, [showStats])\n return (\n <>\n <Toolbar />\n <ZoomBar />\n <StylePanel />\n {statsOpen ? <DebugStats editor={editor} /> : null}\n <UiTooltip />\n </>\n )\n}\n","import { normalizeLoadedRecords, type Editor } from \"@mocanvas/editor\"\nimport { parseTldrFile, serializeTldrFile, type ParseTldrFileResult } from \"@mocanvas/store\"\n\n/** Serialize the editor's document to `.tldr` JSON text. */\nexport function serializeMocanvasFile(editor: Editor): string {\n const snapshot = editor.store.getStoreSnapshot(\"document\")\n return serializeTldrFile(snapshot.schema, Object.values(snapshot.store))\n}\n\n/**\n * The parse result plus whatever the load could not read cleanly.\n *\n * `warnings` is always present (empty when the file needed nothing unusual)\n * and is worth surfacing: it names shapes whose props were repaired, segments\n * that had to be dropped, and shape types with no registered util.\n */\nexport type LoadMocanvasFileResult = ParseTldrFileResult & { warnings: string[] }\n\n/**\n * Load a `.tldr` file (text or parsed JSON) into the editor, replacing the\n * document.\n *\n * Records are normalized before they reach the store, so shapes written by\n * another generation of the format — a rich-text label, a packed freehand\n * path, a prop this build did not exist for — arrive in the form the shape\n * utils expect. `records` in the result are the normalized ones.\n */\nexport function loadMocanvasFile(editor: Editor, json: unknown): LoadMocanvasFileResult {\n const parsed = parseTldrFile(json)\n if (!parsed.ok) return { ...parsed, warnings: [] }\n const { records, warnings } = normalizeLoadedRecords(parsed.records, { shapeUtils: editor.shapeUtils })\n const store: Record<string, unknown> = {}\n for (const r of records) store[r.id] = r\n editor.run(\n () => {\n editor.store.loadStoreSnapshot({ schema: parsed.schema, store: store as never })\n },\n { history: \"ignore\" },\n )\n editor.history.clear()\n // The instance record may point at a page that no longer exists.\n const pages = editor.getPages()\n const current = editor.getCurrentPageId()\n if (pages.length && !pages.some((p) => p.id === current)) editor.setCurrentPage(pages[0]!.id)\n else editor.setCurrentPage(editor.getCurrentPageId())\n editor.zoomToFit()\n for (const warning of warnings) console.warn(`mocanvas: ${warning}`)\n return { ...parsed, records, warnings }\n}\n","import { AssetRecordType, createShapeId, type Editor, type ExternalContent, type ImageAsset, type ShapeId, type VecLike } from \"@mocanvas/editor\"\nimport type { ImageShape } from \"../shapes/ImageShapeUtil\"\nimport type { TextShape } from \"../shapes/TextShapeUtil\"\n\nexport interface ImageSize {\n w: number\n h: number\n}\n\n/** Resolves an image's pixel size from its source; injectable so tests can run without a DOM. */\nexport type ImageSizeLoader = (src: string, file?: File) => Promise<ImageSize>\n\nexport interface ExternalContentOptions {\n /** Longest side an inserted image may have, in page units. */\n maxImageDimension?: number\n /** Fallback size when an image's dimensions cannot be read. */\n fallbackImageSize?: ImageSize\n loadImageSize?: ImageSizeLoader\n readFileAsDataUrl?: (file: File) => Promise<string>\n /** Offset between shapes when several are inserted at the same point. */\n stackOffset?: number\n}\n\nexport const DEFAULT_MAX_IMAGE_DIMENSION = 1000\nconst DEFAULT_FALLBACK_IMAGE_SIZE: ImageSize = { w: 100, h: 100 }\nconst DEFAULT_STACK_OFFSET = 20\n\n/** Scale `size` down (never up) so both sides fit within `max`, keeping the aspect ratio. */\nexport function fitImageSize(size: ImageSize, max = DEFAULT_MAX_IMAGE_DIMENSION): ImageSize {\n const w = Math.max(1, size.w)\n const h = Math.max(1, size.h)\n const scale = Math.min(1, max / Math.max(w, h))\n return { w: Math.round(w * scale), h: Math.round(h * scale) }\n}\n\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith(\"image/\")\n}\n\nexport function isSvgFile(file: File): boolean {\n return file.type === \"image/svg+xml\" || /\\.svg$/i.test(file.name)\n}\n\nexport function isAnimatedImageType(mimeType: string): boolean {\n return mimeType === \"image/gif\" || mimeType === \"image/apng\" || mimeType === \"image/webp\"\n}\n\nconst URL_RE = /^(https?:\\/\\/|mailto:)\\S+$/i\n\nexport function looksLikeUrl(text: string): boolean {\n return URL_RE.test(text.trim())\n}\n\nexport function looksLikeSvg(text: string): boolean {\n return /^\\s*(<\\?xml[^>]*>\\s*)?(<!DOCTYPE[^>]*>\\s*)?<svg[\\s>]/i.test(text)\n}\n\n/** Read a file into a `data:` URL, via `FileReader` where present and `arrayBuffer()` elsewhere. */\nexport async function readFileAsDataUrl(file: File): Promise<string> {\n if (typeof FileReader !== \"undefined\") {\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(String(reader.result))\n reader.onerror = () => reject(reader.error ?? new Error(\"Could not read file\"))\n reader.readAsDataURL(file)\n })\n }\n const bytes = new Uint8Array(await file.arrayBuffer())\n let binary = \"\"\n const chunk = 0x8000\n for (let i = 0; i < bytes.length; i += chunk) binary += String.fromCharCode(...bytes.subarray(i, i + chunk))\n return `data:${file.type || \"application/octet-stream\"};base64,${btoa(binary)}`\n}\n\n/** A `data:` URL for an SVG document string. */\nexport function svgTextToDataUrl(text: string): string {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(text)}`\n}\n\n/** Pixel size declared by an SVG's root `width`/`height` or `viewBox`, or `null` when neither is usable. */\nexport function getSvgTextSize(text: string): ImageSize | null {\n const root = /<svg\\b[^>]*>/i.exec(text)?.[0]\n if (!root) return null\n const attr = (name: string) => new RegExp(`\\\\s${name}\\\\s*=\\\\s*[\"']([^\"']+)[\"']`, \"i\").exec(root)?.[1]\n const px = (v: string | undefined) => {\n if (!v || /%$/.test(v)) return undefined\n const n = parseFloat(v)\n return Number.isFinite(n) && n > 0 ? n : undefined\n }\n const w = px(attr(\"width\"))\n const h = px(attr(\"height\"))\n if (w && h) return { w, h }\n const viewBox = attr(\"viewBox\")\n ?.split(/[\\s,]+/)\n .map(Number)\n if (viewBox && viewBox.length === 4 && viewBox[2]! > 0 && viewBox[3]! > 0) return { w: viewBox[2]!, h: viewBox[3]! }\n return null\n}\n\n/** Default size loader: `createImageBitmap` when available, else an `Image` element. */\nexport const loadImageSizeInBrowser: ImageSizeLoader = async (src, file) => {\n if (file && typeof createImageBitmap === \"function\" && !isSvgFile(file)) {\n try {\n const bitmap = await createImageBitmap(file)\n const size = { w: bitmap.width, h: bitmap.height }\n bitmap.close()\n return size\n } catch {\n // fall through to the Image element (e.g. unsupported type)\n }\n }\n if (typeof Image === \"undefined\") throw new Error(\"No image decoder available\")\n return new Promise<ImageSize>((resolve, reject) => {\n const img = new Image()\n img.onload = () => resolve({ w: img.naturalWidth, h: img.naturalHeight })\n img.onerror = () => reject(new Error(\"Could not decode image\"))\n img.src = src\n })\n}\n\ntype ResolvedOptions = Required<ExternalContentOptions>\n\nfunction resolveOptions(opts: ExternalContentOptions): ResolvedOptions {\n return {\n maxImageDimension: opts.maxImageDimension ?? DEFAULT_MAX_IMAGE_DIMENSION,\n fallbackImageSize: opts.fallbackImageSize ?? DEFAULT_FALLBACK_IMAGE_SIZE,\n loadImageSize: opts.loadImageSize ?? loadImageSizeInBrowser,\n readFileAsDataUrl: opts.readFileAsDataUrl ?? readFileAsDataUrl,\n stackOffset: opts.stackOffset ?? DEFAULT_STACK_OFFSET,\n }\n}\n\n/** Build (without storing) an image asset for a file; `undefined` for non-image files. */\nexport async function createImageAssetFromFile(file: File, opts: ExternalContentOptions = {}): Promise<ImageAsset | undefined> {\n if (!isImageFile(file) && !isSvgFile(file)) return undefined\n const o = resolveOptions(opts)\n const src = await o.readFileAsDataUrl(file)\n let size: ImageSize\n try {\n size = await o.loadImageSize(src, file)\n } catch {\n size = o.fallbackImageSize\n }\n const mimeType = file.type || (isSvgFile(file) ? \"image/svg+xml\" : null)\n return {\n id: AssetRecordType.createId(),\n typeName: \"asset\",\n type: \"image\",\n props: {\n ...fitImageSize(size, o.maxImageDimension),\n name: file.name,\n isAnimated: mimeType ? isAnimatedImageType(mimeType) : false,\n mimeType,\n src,\n fileSize: file.size,\n },\n meta: {},\n }\n}\n\n/** Build (without storing) an image asset from SVG markup. */\nexport function createImageAssetFromSvgText(text: string, opts: ExternalContentOptions = {}): ImageAsset {\n const o = resolveOptions(opts)\n const size = getSvgTextSize(text) ?? o.fallbackImageSize\n return {\n id: AssetRecordType.createId(),\n typeName: \"asset\",\n type: \"image\",\n props: { ...fitImageSize(size, o.maxImageDimension), name: \"image.svg\", isAnimated: false, mimeType: \"image/svg+xml\", src: svgTextToDataUrl(text) },\n meta: {},\n }\n}\n\nfunction pointOrCenter(editor: Editor, point: VecLike | undefined): VecLike {\n return point ?? editor.getViewportPageCenter()\n}\n\n/** Store `assets` and create one image shape per asset, centered on `point` and stacked by `stackOffset`. */\nexport function createImageShapesForAssets(editor: Editor, assets: readonly ImageAsset[], point: VecLike | undefined, stackOffset = DEFAULT_STACK_OFFSET): ShapeId[] {\n if (assets.length === 0) return []\n const p = pointOrCenter(editor, point)\n const ids: ShapeId[] = []\n editor.run(() => {\n editor.createAssets(assets.map((a) => ({ id: a.id, type: a.type, props: a.props, meta: a.meta })))\n editor.createShapes<ImageShape>(\n assets.map((asset, i) => {\n const id = createShapeId()\n ids.push(id)\n const { w, h } = asset.props\n return {\n id,\n type: \"image\",\n x: p.x - w / 2 + i * stackOffset,\n y: p.y - h / 2 + i * stackOffset,\n props: { w, h, assetId: asset.id },\n }\n }),\n )\n editor.setSelectedShapes(ids)\n })\n return ids\n}\n\n/** Create a text shape whose bounds are centered on `point`. */\nexport function createTextShapeAt(editor: Editor, text: string, point: VecLike | undefined): ShapeId {\n const p = pointOrCenter(editor, point)\n const id = createShapeId()\n editor.run(() => {\n editor.createShape<TextShape>({ id, type: \"text\", x: p.x, y: p.y, props: { text } })\n const shape = editor.getShape<TextShape>(id)\n const bounds = shape ? editor.getShapeGeometry(shape).bounds : undefined\n if (bounds) editor.updateShape<TextShape>({ id, type: \"text\", x: p.x - bounds.w / 2, y: p.y - bounds.h / 2 })\n editor.setSelectedShapes([id])\n })\n return id\n}\n\n/**\n * Install the default drop/paste behaviour: image files become image assets +\n * image shapes, SVG markup becomes an image asset, text and urls become text\n * shapes. Types that already have a handler are left alone. Returns a function\n * that removes the handlers this call installed.\n */\nexport function registerDefaultExternalContentHandlers(editor: Editor, opts: ExternalContentOptions = {}): () => void {\n const o = resolveOptions(opts)\n const disposers: (() => void)[] = []\n\n if (!editor.hasExternalAssetHandler(\"file\")) {\n disposers.push(editor.registerExternalAssetHandler(\"file\", ({ file }) => createImageAssetFromFile(file, o)))\n }\n\n if (!editor.hasExternalContentHandler(\"files\")) {\n disposers.push(\n editor.registerExternalContentHandler(\"files\", async ({ files, point }) => {\n const assets: ImageAsset[] = []\n for (const file of files) {\n const asset = await editor.getAssetForExternalContent({ type: \"file\", file })\n if (asset?.type === \"image\") assets.push(asset)\n }\n if (assets.length === 0) return\n editor.markHistoryStoppingPoint(\"insert images\")\n createImageShapesForAssets(editor, assets, point, o.stackOffset)\n }),\n )\n }\n\n if (!editor.hasExternalContentHandler(\"text\")) {\n disposers.push(\n editor.registerExternalContentHandler(\"text\", ({ text, point }) => {\n const trimmed = text.trim()\n if (!trimmed) return\n editor.markHistoryStoppingPoint(\"insert text\")\n createTextShapeAt(editor, trimmed, point)\n }),\n )\n }\n\n if (!editor.hasExternalContentHandler(\"url\")) {\n disposers.push(\n editor.registerExternalContentHandler(\"url\", ({ url, point }) => {\n editor.markHistoryStoppingPoint(\"insert url\")\n createTextShapeAt(editor, url.trim(), point)\n }),\n )\n }\n\n if (!editor.hasExternalContentHandler(\"svg-text\")) {\n disposers.push(\n editor.registerExternalContentHandler(\"svg-text\", ({ text, point }) => {\n editor.markHistoryStoppingPoint(\"insert svg\")\n createImageShapesForAssets(editor, [createImageAssetFromSvgText(text, o)], point, o.stackOffset)\n }),\n )\n }\n\n return () => {\n for (const dispose of disposers) dispose()\n }\n}\n\n/** Classify pasted or dropped plain text as our own clipboard JSON (`null`), a url, svg markup, or text. */\nexport function classifyExternalText(text: string, point?: VecLike): ExternalContent | null {\n if (!text.trim()) return null\n if (text.trimStart().startsWith(\"{\")) {\n try {\n const data = JSON.parse(text) as { type?: unknown }\n if (data && data.type === \"application/mocanvas\") return null\n } catch {\n // ordinary text that happens to start with a brace\n }\n }\n const at = point ? { point } : {}\n if (looksLikeSvg(text)) return { type: \"svg-text\", text, ...at }\n if (looksLikeUrl(text)) return { type: \"url\", url: text.trim(), ...at }\n return { type: \"text\", text, ...at }\n}\n","import type { Editor } from \"@mocanvas/editor\"\nimport { useEffect, type RefObject } from \"react\"\nimport { classifyExternalText, registerDefaultExternalContentHandlers, type ExternalContentOptions } from \"./defaultExternalContentHandlers\"\n\nfunction isEditable(t: EventTarget | null): boolean {\n return t instanceof HTMLElement && (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable)\n}\n\n/**\n * Drop and paste support for the canvas container: files, images, svg markup,\n * urls and plain text are routed to `editor.putExternalContent`. Plain text is\n * only taken when nothing is being edited and it is not our own\n * `application/mocanvas` clipboard JSON (the keyboard shortcuts handle that).\n * Also installs the default handlers for any content type without one.\n */\nexport function useExternalContent(editor: Editor | null, containerRef: RefObject<HTMLElement | null>, options?: ExternalContentOptions): void {\n useEffect(() => {\n if (!editor) return\n const unregister = registerDefaultExternalContentHandlers(editor, options ?? {})\n return unregister\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editor])\n\n useEffect(() => {\n const el = containerRef.current\n if (!editor || !el) return\n\n const pagePoint = (e: MouseEvent) => editor.screenToPage({ x: e.clientX, y: e.clientY })\n\n const handleText = (text: string | undefined, point?: { x: number; y: number }) => {\n if (!text || isEditableContext()) return false\n const info = classifyExternalText(text, point)\n if (!info) return false\n void editor.putExternalContent(info)\n return true\n }\n\n const isEditableContext = () => !!editor.getEditingShapeId() || isEditable(document.activeElement)\n\n const onDragOver = (e: DragEvent) => {\n if (!e.dataTransfer) return\n e.preventDefault()\n e.dataTransfer.dropEffect = \"copy\"\n }\n\n const onDrop = (e: DragEvent) => {\n const dt = e.dataTransfer\n if (!dt) return\n e.preventDefault()\n const point = pagePoint(e)\n const files = Array.from(dt.files)\n if (files.length) {\n void editor.putExternalContent({ type: \"files\", files, point })\n return\n }\n const url = dt.getData(\"text/uri-list\").split(/\\r?\\n/).find((l) => l && !l.startsWith(\"#\"))\n if (url) {\n void editor.putExternalContent({ type: \"url\", url, point })\n return\n }\n handleText(dt.getData(\"text/plain\"), point)\n }\n\n const onPaste = (e: ClipboardEvent) => {\n if (isEditable(e.target) || isEditableContext()) return\n const cd = e.clipboardData\n if (!cd) return\n const files = Array.from(cd.files)\n if (files.length) {\n e.preventDefault()\n void editor.putExternalContent({ type: \"files\", files })\n return\n }\n if (handleText(cd.getData(\"text/plain\"))) e.preventDefault()\n }\n\n // The default shortcuts call preventDefault on ⌘V (to paste our own JSON),\n // which suppresses the `paste` event. When that happened, read the clipboard\n // through the async API instead; images are the main thing gained here.\n const onKeyDown = (e: KeyboardEvent) => {\n const isMac = /Mac|iPhone|iPad/.test(navigator.platform ?? \"\")\n const accel = isMac ? e.metaKey : e.ctrlKey\n if (!accel || e.key.toLowerCase() !== \"v\" || isEditable(e.target) || isEditableContext()) return\n setTimeout(() => {\n if (!e.defaultPrevented || !navigator.clipboard?.read) return\n navigator.clipboard.read().then(\n async (items) => {\n const files: File[] = []\n let text: string | undefined\n for (const item of items) {\n const imageType = item.types.find((t) => t.startsWith(\"image/\"))\n if (imageType) {\n const blob = await item.getType(imageType)\n files.push(new File([blob], `pasted.${imageType.split(\"/\")[1] ?? \"png\"}`, { type: imageType }))\n } else if (item.types.includes(\"text/plain\") && text === undefined) {\n text = await (await item.getType(\"text/plain\")).text()\n }\n }\n if (files.length) void editor.putExternalContent({ type: \"files\", files })\n else handleText(text)\n },\n () => {\n // clipboard permission denied or unsupported; nothing to paste\n },\n )\n }, 0)\n }\n\n el.addEventListener(\"dragover\", onDragOver)\n el.addEventListener(\"drop\", onDrop)\n window.addEventListener(\"paste\", onPaste)\n window.addEventListener(\"keydown\", onKeyDown, { capture: true })\n return () => {\n el.removeEventListener(\"dragover\", onDragOver)\n el.removeEventListener(\"drop\", onDrop)\n window.removeEventListener(\"paste\", onPaste)\n window.removeEventListener(\"keydown\", onKeyDown, { capture: true })\n }\n }, [editor, containerRef])\n}\n","import {\n Canvas,\n createStore,\n Editor,\n loadEngine,\n type CanvasProps,\n type BindingUtilConstructor,\n type EditorStore,\n type ShapeUtilConstructor,\n type StateNodeConstructor,\n} from \"@mocanvas/editor\"\nimport { useEffect, useRef, useState, type CSSProperties, type ReactNode } from \"react\"\nimport { defaultBindingUtils } from \"./bindings\"\nimport { defaultShapeUtils } from \"./shapes\"\nimport { defaultTools } from \"./tools\"\nimport { DefaultUi } from \"./ui/DefaultUi\"\nimport { useKeyboardShortcuts } from \"./ui/useKeyboardShortcuts\"\nimport { useExternalContent } from \"./external/useExternalContent\"\n\nexport interface MocanvasProps {\n /** Reuse a store (e.g. for persistence or collaboration). */\n store?: EditorStore\n /** Extra shape utils beyond the defaults. */\n shapeUtils?: readonly ShapeUtilConstructor[]\n /** Extra binding utils beyond the defaults. */\n bindingUtils?: readonly BindingUtilConstructor[]\n /** Extra tools beyond the defaults. */\n tools?: readonly StateNodeConstructor[]\n initialState?: string\n onMount?: (editor: Editor) => void | (() => void)\n /** Hide the default toolbar and zoom bar. */\n hideUi?: boolean\n showStats?: boolean\n className?: string\n style?: CSSProperties\n children?: ReactNode\n components?: CanvasProps[\"components\"]\n /** Editor config overrides. */\n options?: ConstructorParameters<typeof Editor>[0][\"options\"]\n}\n\n/** Batteries-included canvas: default shapes, tools, shortcuts and UI. */\nexport function Mocanvas(props: MocanvasProps) {\n const { store, shapeUtils, bindingUtils, tools, initialState, onMount, hideUi, showStats, className, style, children, components, options } = props\n const containerRef = useRef<HTMLDivElement>(null)\n const [editor, setEditor] = useState<Editor | null>(null)\n\n useEffect(() => {\n let disposed = false\n let ed: Editor | null = null\n let cleanup: void | (() => void)\n loadEngine().then((engine) => {\n if (disposed) {\n engine.dispose()\n return\n }\n ed = new Editor({\n store: store ?? createStore(),\n shapeUtils: [...defaultShapeUtils, ...(shapeUtils ?? [])],\n bindingUtils: [...defaultBindingUtils, ...(bindingUtils ?? [])],\n tools: [...defaultTools, ...(tools ?? [])],\n engine,\n ...(initialState ? { initialState } : {}),\n getContainer: () => containerRef.current!,\n ...(options ? { options } : {}),\n })\n setEditor(ed)\n cleanup = onMount?.(ed)\n ed.emit(\"mount\")\n })\n return () => {\n disposed = true\n cleanup?.()\n ed?.dispose()\n setEditor(null)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [store])\n\n useKeyboardShortcuts(editor)\n useExternalContent(editor, containerRef)\n\n return (\n <div ref={containerRef} className={className} style={{ position: \"relative\", width: \"100%\", height: \"100%\", ...style }}>\n {editor ? (\n <Canvas editor={editor} {...(components ? { components } : {})}>\n {hideUi ? null : <DefaultUi editor={editor} showStats={showStats ?? true} />}\n {children}\n </Canvas>\n ) : (\n <div style={{ position: \"absolute\", inset: 0, display: \"grid\", placeItems: \"center\", color: \"#9ca3af\", fontFamily: \"system-ui\" }}>loading engine…</div>\n )}\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/text/rich-text-render.ts","../src/text/tiptap-defaults.ts","../src/text/useEditableText.ts","../src/text/tiptap-editor.ts","../src/install.ts","../src/indicators/ShapeIndicatorOverlayUtil.ts","../src/indicators/paint.ts","../src/indicators/ArrowHintOverlayUtil.ts","../src/indicators/BrushOverlayUtil.ts","../src/indicators/CollaboratorOverlayUtils.ts","../src/indicators/ScribbleOverlayUtil.ts","../src/indicators/SelectionForegroundOverlayUtil.ts","../src/indicators/ShapeHandleOverlayUtil.ts","../src/indicators/SnapIndicatorOverlayUtil.ts","../src/indicators/defaultOverlayUtils.ts","../src/ui/DefaultToolbar.tsx","../src/ui/StylePanel.tsx","../src/ui/toolbar-config.ts","../src/ui/tools-context.ts","../src/ui/useToolShortcuts.ts","../src/ui/useKeyboardShortcuts.ts","../src/ui/DefaultUi.tsx","../src/ui/ui-breakpoint.tsx","../src/ui/ui-orientation.tsx","../src/ui/ui-a11y.tsx","../src/ui/ui-toasts.tsx","../src/ui/ui-components.tsx","../src/ui/ui-tooltip.tsx","../src/ui/ui-context-provider.tsx","../src/ui/ui-lists-provider.tsx","../src/ui/ui-input.tsx","../src/ui/ui-slider.tsx","../src/ui/ui-layout.tsx","../src/ui/ui-popover.tsx","../src/ui/ui-select.tsx","../src/ui/ui-toolbar.tsx","../src/ui/ui-contextual-toolbar.tsx","../src/ui/ui-clipboard.ts","../src/ui/menu-items.tsx","../src/ui/ui-hooks.ts","../src/ui/panel-menus.tsx","../src/ui/panel-page.tsx","../src/ui/panel-navigation.tsx","../src/ui/style-pickers.tsx","../src/ui/panel-style.tsx","../src/ui/panel-people.tsx","../src/ui/panel-richtext.tsx","../src/ui/panel-debug.tsx","../src/ui/toolbar-items.tsx","../src/ui/asset-toolbars.tsx","../src/ui/text-labels.tsx","../src/ui/TldrawUi.tsx","../src/bindings/ArrowBindingUtil.ts","../src/bindings/arrow-info.ts","../src/bindings/arrow-target.ts","../src/bindings/index.ts","../src/shapes/draw-helpers.ts","../src/shapes/DrawShapeUtil.tsx","../src/shapes/HighlightShapeUtil.tsx","../src/shapes/crop-box.ts","../src/shapes/ImageShapeUtil.tsx","../src/shapes/LineShapeUtil.tsx","../src/shapes/GroupShapeUtil.tsx","../src/shapes/elbow-arrow-types.ts","../src/shapes/index.ts","../src/ui/TldrawImage.tsx","../src/ui/ui-clipboard-hooks.ts","../src/ui/ui-icon-types.ts","../src/tools/ArrowTool.ts","../src/tools/DrawTool.ts","../src/tools/EraserTool.ts","../src/tools/BaseBoxShapeTool.ts","../src/tools/FrameTool.ts","../src/tools/GeoTool.ts","../src/tools/HighlightShapeTool.ts","../src/tools/LaserTool.ts","../src/tools/HandTool.ts","../src/tools/LineTool.ts","../src/tools/NoteTool.ts","../src/tools/SelectTool.ts","../src/tools/TextTool.ts","../src/tools/index.ts","../src/external/useExternalContent.ts","../src/Mocanvas.tsx","../src/assets/media.ts","../src/external/sanitizeSvg.ts","../src/external/defaultHandlers.ts","../src/external/bookmarks.ts","../src/external/excalidraw.ts","../src/external/embeds.ts","../src/assets/AssetUtils.ts","../src/config.ts","../src/interaction/frames.ts","../src/interaction/pointer.ts","../src/interaction/toolbar-drag.ts","../src/interaction/side-effects.ts","../src/interaction/ZoomTool.ts","../src/fonts/index.ts","../src/path/commands.ts","../src/path/PathBuilderGeometry2d.ts","../src/path/PathBuilder.tsx","../src/stroke/getStroke.ts","../src/stroke/draw-segments.ts"],"names":["range","TipTapEditor","n","OverlayUtil","getOverlayDisplayValues","Rectangle2d","useRef","useState","useEffect","jsxs","jsx","StylePanel","useEditor","GEO_SHAPE_KINDS","titleCase","GeoShapeGeoStyle","isEditable","useTools","track","Toolbar","Fragment","ZoomBar","DebugStats","GridLayer","useValue","createContext","useContext","useCallback","value","useMemo","NOOP","useId","serializeMocanvasFile","downloadBlob","GroupOrUngroupMenuItem","EditLinkMenuItem","ConvertToEmbedMenuItem","createEmbedShape","ConvertToBookmarkMenuItem","createBookmarkShape","FitFrameToContentMenuItem","RemoveFrameMenuItem","ToggleAutoSizeMenuItem","MoveToPageMenu","ToggleInvertZoomItem","ColorSchemeMenu","LanguageMenu","InputModeMenu","KeyboardShortcutsDialogContents","DefaultPageMenu","useGlobalMenuIsOpen","DefaultMinimap","StylePanelContextProvider","DEFAULT_COLORS","LIGHT_THEME","DefaultColorStyle","DefaultFillStyle","DefaultDashStyle","DefaultSizeStyle","DefaultFontStyle","DefaultHorizontalAlignStyle","DefaultVerticalAlignStyle","StylePanelOpacityPicker","DefaultStylePanel","MobileStylePanel","DefaultPeopleMenuContent","DefaultPeopleMenu","DefaultUserPresenceEditor","DefaultFollowingIndicator","DefaultRichTextToolbar","atom","DefaultDebugPanel","TldrawUiToolbarItem","useIsToolSelected","GeoToolbarItem","ToggleToolLockedButton","Children","DefaultImageToolbar","DefaultVideoToolbar","Layout","Canvas","Vec","getDefaultDisplayValues","ShapeUtil","Polyline2d","STROKE_SIZES","Editor","Idle","StateNode","createShapeId","Pointing","Box","dropShapesOnFrameLike","createStore","DEFAULT_MAX_IMAGE_DIMENSION","AssetRecordType","arcToCubicSegments","DIM_2D","b64Vecs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAsBO,SAAS,sBAAA,CAAuB,QAAgB,QAAA,EAAkC;AACvF,EAAA,OAAO,eAAe,QAAA,EAAU,EAAE,YAAY,qBAAA,CAAsB,MAAM,GAAG,CAAA;AAC/E;AASO,SAAS,2BAAA,CAA4B,SAAiB,QAAA,EAAkC;AAC7F,EAAA,OAAO,eAAe,QAAQ,CAAA;AAChC;AAIA,IAAM,WAAA,GAAgD;AAAA,EACpD,CAAA,EAAG,MAAA;AAAA,EACH,MAAA,EAAQ,MAAA;AAAA,EACR,CAAA,EAAG,QAAA;AAAA,EACH,EAAA,EAAI,QAAA;AAAA,EACJ,CAAA,EAAG,WAAA;AAAA,EACH,CAAA,EAAG,QAAA;AAAA,EACH,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,QAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAEA,IAAM,YAAA,GAAiD;AAAA,EACrD,CAAA,EAAG,WAAA;AAAA,EACH,GAAA,EAAK,WAAA;AAAA,EACL,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,YAAA;AAAA,EACJ,EAAA,EAAI,aAAA;AAAA,EACJ,EAAA,EAAI,UAAA;AAAA,EACJ,UAAA,EAAY,YAAA;AAAA,EACZ,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,SAAA,GAAY,2CAAA;AAcX,SAAS,sBAAA,CAAuB,SAAiB,IAAA,EAAwB;AAC9E,EAAA,IAAI,OAAO,cAAc,WAAA,EAAa;AAIpC,IAAA,OAAO,WAAW,EAAE,CAAA;AAAA,EACtB;AAEA,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,EAAU,CAAE,gBAAgB,CAAA,MAAA,EAAS,IAAI,WAAW,WAAW,CAAA;AACrF,EAAA,MAAM,SAAyB,EAAC;AAChC,EAAA,UAAA,CAAW,SAAA,CAAU,IAAA,EAAM,MAAA,EAAQ,EAAE,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,CAAC,KAAA,KAAU,MAAM,OAAA,EAAS,MAAA,IAAU,KAAA,CAAM,IAAA,KAAS,WAAW,CAAA;AAC7F,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,WAAW,EAAE,CAAA;AAC/C,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,QAAA,EAAS;AAC1C;AAGA,SAAS,UAAA,CAAW,OAAA,EAAe,GAAA,EAAqB,KAAA,EAA6B;AACnF,EAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,EAAG;AAClD,IAAA,IAAI,KAAA,CAAM,aAAa,CAAA,EAAc;AACnC,MAAA,MAAM,IAAA,GAAO,MAAM,SAAA,IAAa,EAAA;AAChC,MAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAClB,MAAA,YAAA,CAAa,gBAAA,CAAiB,GAAG,CAAA,EAAG,IAAA,EAAM,KAAK,CAAA;AAC/C,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,CAAM,aAAa,CAAA,EAAiB;AAExC,IAAA,MAAM,EAAA,GAAK,KAAA;AACX,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AACnC,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,gBAAA,CAAiB,GAAG,CAAA,CAAE,OAAA,EAAS,KAAK,EAAE,IAAA,EAAM,aAAa,CAAA;AACzD,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,CAAA;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA;AAC5B,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,UAAA,CAAW,IAAI,GAAA,EAAK,CAAC,GAAG,KAAA,EAAO,IAAI,CAAC,CAAA;AACpC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,aAAa,GAAG,CAAA;AAC9B,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,OAAqB,EAAE,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,EAAC,EAAE;AACtD,MAAA,IAAI,KAAA,KAAU,SAAA,EAAW,IAAA,CAAK,KAAA,GAAQ,EAAE,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA,IAAK,CAAA,EAAE;AACzE,MAAA,MAAM,QAAwB,EAAC;AAC/B,MAAA,UAAA,CAAW,EAAA,EAAI,OAAO,KAAK,CAAA;AAG3B,MAAA,IAAI,KAAA,KAAU,YAAA,IAAgB,KAAA,KAAU,aAAA,OAAoB,OAAA,GAAU,KAAA;AAAA,WACjE,IAAA,CAAK,UAAU,KAAA,CAAM,OAAA,CAAQ,CAAC,MAAA,KAAW,MAAA,CAAO,OAAA,IAAW,EAAE,CAAA;AAClE,MAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACb,MAAA;AAAA,IACF;AAGA,IAAA,UAAA,CAAW,EAAA,EAAI,KAAK,KAAK,CAAA;AAAA,EAC3B;AACF;AAGA,SAAS,iBAAiB,GAAA,EAAmC;AAC3D,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC/B,EAAA,IAAI,IAAA,IAAQ,KAAK,OAAA,IAAW,IAAA,CAAK,SAAS,YAAA,IAAgB,IAAA,CAAK,IAAA,KAAS,aAAA,EAAe,OAAO,IAAA;AAC9F,EAAA,MAAM,YAA0B,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,EAAC,EAAE;AACjE,EAAA,GAAA,CAAI,KAAK,SAAS,CAAA;AAClB,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,YAAA,CAAa,IAAA,EAAoB,IAAA,EAAc,KAAA,EAA6B;AACnF,EAAA,IAAA,CAAK,YAAY,EAAC;AAClB,EAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,IAAI,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,OAAM,GAAI,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAC7F;AAGA,SAAS,OAAA,CAAQ,KAAa,OAAA,EAAuC;AACnE,EAAA,IAAI,QAAQ,GAAA,EAAK;AACf,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,MAAM,GAAG,IAAA,EAAK;AAIhD,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,UAAU,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA;AAC3C,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,EAAE,MAAK,EAAE;AAAA,EACzC;AACA,EAAA,MAAM,IAAA,GAAO,YAAY,GAAG,CAAA;AAC5B,EAAA,OAAO,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,IAAA;AACjC;;;AC1IO,SAAS,0BAAA,CAA2B,iBAAA,GAAsD,EAAC,EAAiC;AACjI,EAAA,MAAM,UAAA,GAAa,gBAAA;AACnB,EAAA,IAAI,CAAC,UAAA,EAAY,OAAO,CAAC,GAAG,eAAA,EAAiB,GAAG,eAAe,CAAA;AAC/D,EAAA,MAAM,UAAA,GAAa,OAAO,UAAA,CAAW,SAAA,KAAc,aAAa,UAAA,CAAW,SAAA,CAAU,iBAAiB,CAAA,GAAI,UAAA;AAC1G,EAAA,OAAO,CAAC,YAAiC,gCAAgC,CAAA;AAC3E;AAMA,IAAI,gBAAA,GAAiD,IAAA;AAWrD,eAAsB,2BAAA,GAAqE;AACzF,EAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,IAAA,MAAM,QAAA,GAAW,qBAAA;AACjB,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,MAAM;AAAA;AAAA;AAAA,QAAoD;AAAA,OAAA;AAAA,IACrE,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,wMAAA;AAAA,QACA,EAAE,KAAA;AAAM,OACV;AAAA,IACF;AACA,IAAA,gBAAA,GAAqB,OAAiC,OAAA,IAAW,MAAA;AAAA,EACnE;AACA,EAAA,OAAO,0BAAA,EAA2B;AACpC;AAeO,IAAM,gCAAA,GAGT;AAAA,EACF,IAAA,EAAM,yBAAA;AAAA,EACN,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,EAAE,aAAA,EAAe,cAAA;AACzB;AC3CA,SAAS,mBAAA,CAAoB,OAAA,EAAkB,OAAA,EAA8B,UAAA,EAAyC;AACpH,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,MAAA,GAAS,OAA8B,IAAI,CAAA;AACjD,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,gBAAA,EAAkB,MAAM,MAAA,CAAO,iBAAA,EAAkB,KAAM,OAAA,EAAS,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AAC5G,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAS,KAAK,CAAA;AAEhE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,MAAM,oBAAA,CAAqB,IAAI,CAAC,CAAA;AAClE,IAAA,OAAO,MAAM,qBAAqB,GAAG,CAAA;AAAA,EACvC,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,UAAA,GAAa,YAAY,MAAM;AACnC,IAAA,IAAI,OAAO,iBAAA,EAAkB,KAAM,OAAA,EAAS,MAAA,CAAO,gBAAgB,IAAI,CAAA;AAAA,EACzE,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AAEpB,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,IAAA,IAAI,CAAC,OAAA,IAAW,OAAO,MAAA,KAAW,WAAA,EAAa;AAC/C,IAAA,MAAM,SAAA,GAAY,OAAO,YAAA,IAAe;AACxC,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAMA,MAAAA,GAAQ,SAAS,WAAA,EAAY;AACnC,IAAAA,MAAAA,CAAM,mBAAmB,OAAO,CAAA;AAChC,IAAA,SAAA,CAAU,eAAA,EAAgB;AAC1B,IAAA,SAAA,CAAU,SAASA,MAAK,CAAA;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,iBAAA,GAAoB,WAAA;AAAA,IACxB,CAAC,CAAA,KAAsC;AACrC,MAAA,MAAM,MAAA,GAAS,aAAA,IAAiB,CAAA,GAAI,CAAA,CAAE,WAAA,GAAc,CAAA;AACpD,MAAA,MAAA,CAAO,eAAA,IAAkB;AACzB,MAAA,MAAA,CAAO,gBAAgB,OAAO,CAAA;AAAA,IAChC,CAAA;AAAA,IACA,CAAC,QAAQ,OAAO;AAAA,GAClB;AAEA,EAAA,MAAM,sBAAA,GAAyB,WAAA,CAAY,CAAC,CAAA,KAAyB;AAGnE,IAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,CAAA,KAAqB;AACpB,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAA,CAAO,gBAAgB,IAAI,CAAA;AAC3B,QAAA;AAAA,MACF;AACA,MAAA,IAAI,cAAc,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AAClD,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAA,CAAO,gBAAgB,IAAI,CAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,UAAU;AAAA,GACrB;AAEA,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,CAAC,CAAA,KAAiE;AAEhG,IAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,UAAA,EAAY,WAAA,EAAa,iBAAA,EAAmB,sBAAA,EAAwB,eAAe,WAAA,EAAa,SAAA,EAAW,OAAA,EAAS,iBAAA,EAAmB,MAAA,EAAO;AACzJ;AAGO,SAAS,mBAAA,CACd,OAAA,EACA,IAAA,EACA,QAAA,EAC+E;AAC/E,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,OAAA,EAAS,QAAA,KAAa,MAAA,GAAY,MAAA,GAAY,cAAA,CAAe,QAAQ,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG,KAAK,CAAA;AAE3H,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,CAAC,EAAE,QAAA,EAAU,IAAA,EAAK,KAA8B;AAC9C,MAAA,MAAA,CAAO,WAAA,CAAY,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,OAAO,EAAE,QAAA,EAAU,IAAA,EAAK,EAAY,CAAA;AAAA,IAC9E,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,OAAA,EAAS,IAAI;AAAA,GACxB;AAEA,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,YAAA,EAAa;AACjC;AAGO,SAAS,oBAAA,CACd,OAAA,EACA,IAAA,EACA,IAAA,EACyE;AACzE,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,IAAA,GAAO,oBAAoB,OAAA,EAAS,IAAA,KAAS,SAAY,MAAA,GAAY,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,IAAI,CAAA;AAElG,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,CAAC,EAAE,IAAA,EAAM,IAAA,EAAK,KAAwB;AACpC,MAAA,MAAA,CAAO,WAAA,CAAY,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,OAAO,EAAE,IAAA,EAAM,IAAA,EAAK,EAAY,CAAA;AAAA,IAC1E,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,OAAA,EAAS,IAAI;AAAA,GACxB;AAEA,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,YAAA,EAAa;AACjC;AAUO,SAAS,6BAAA,CACd,MAAA,EACA,SAAA,EACA,OAAA,GAAmC,EAAC,EAC9B;AACN,EAAA,MAAM,EAAA,GAAK,OAAO,SAAA,KAAc,QAAA,GAAW,YAAY,SAAA,CAAU,EAAA;AACjE,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAChC,EAAA,IAAI,CAAC,KAAA,EAAO;AACZ,EAAA,MAAA,CAAO,IAAI,MAAM;AACf,IAAA,MAAA,CAAO,iBAAA,CAAkB,CAAC,EAAE,CAAC,CAAA;AAC7B,IAAA,MAAA,CAAO,gBAAgB,EAAE,CAAA;AAAA,EAC3B,CAAC,CAAA;AACD,EAAA,IAAI,OAAA,CAAQ,cAAc,KAAA,EAAO;AAGnC;ACjJA,IAAM,6BAA6B,EAAE,UAAA,EAAY,OAAO,SAAA,EAAW,KAAA,EAAO,gBAAgB,KAAA,EAAM;AAWhG,SAAS,kBAAkB,KAAA,EAAmC;AAC5D,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,OAAO,OAAO,EAAE,IAAA,KAAS,QAAA,IAAY,OAAO,CAAA,CAAE,MAAA,KAAW,QAAA,IAAY,CAAA,CAAE,MAAA,KAAW,IAAA;AACpF;AAGO,IAAM,2BAAA,GAAqD,CAAC,OAAA,KAA8D;AAC/H,EAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAc,YAAY,UAAA,EAAY,QAAA,EAAU,UAAS,GAAI,OAAA;AAEhF,EAAA,MAAM,MAAA,GAAS,IAAIC,MAAA,CAAa;AAAA,IAC9B,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,YAAA;AAAA,IACT,UAAA,EAAY,CAAC,UAAA,CAAW,SAAA,CAAU,0BAA0B,GAAG,GAAG,UAAA,CAAW,MAAA,CAAO,iBAAiB,CAAC,CAAA;AAAA,IACtG,WAAA,EAAa;AAAA,MACX,aAAA,EAAe,CAAC,KAAA,EAAO,KAAA,KAAU;AAC/B,QAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,UAAA,QAAA,EAAS;AACT,UAAA,OAAO,IAAA;AAAA,QACT;AAGA,QAAA,IAAI,MAAM,GAAA,KAAQ,OAAA,IAAW,UAAA,IAAc,CAAC,MAAM,QAAA,EAAU;AAC1D,UAAA,QAAA,EAAS;AACT,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,KACF;AAAA,IACA,QAAA,EAAU,CAAC,EAAE,MAAA,EAAQ,GAAE,KAAM;AAC3B,MAAA,QAAA,CAAS,CAAA,CAAE,SAA2C,CAAA;AAAA,IACxD;AAAA,GACD,CAAA;AAQD,EAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,GAAA;AACxB,EAAA,GAAA,CAAI,MAAM,OAAA,GAAU,MAAA;AAEpB,EAAA,OAAO;AAAA,IACL,KAAA,GAAQ;AACN,MAAA,MAAA,CAAO,QAAA,CAAS,MAAM,KAAK,CAAA;AAAA,IAC7B,CAAA;AAAA,IACA,OAAA,GAAU;AAGR,MAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,IACjB;AAAA,GACF;AACF,CAAA;AAUO,SAAS,4BAAA,GAA2C;AACzD,EAAA,OAAO,8BAA8B,2BAA2B,CAAA;AAClE;;;ACvFA,4BAAA,CAA6B;AAAA,EAC3B,YAAA;AAAA,EACA,MAAM,OAAA,CAAQ,MAAA,EAAgB,GAAA,EAA0B,IAAA,GAAO,EAAC,EAAG;AACjE,IAAA,MAAM,EAAE,MAAA,GAAS,KAAA,EAAO,GAAG,MAAK,GAAI,IAAA;AAEpC,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,MAAA,EAAQ,GAAA,EAAK,IAAI,CAAA;AAC/C,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAChG,IAAA,MAAM,OAAO,MAAM,YAAA,CAAa,MAAA,EAAQ,EAAE,GAAG,IAAA,EAAM,GAAI,GAAA,KAAQ,MAAA,GAAY,EAAC,GAAI,EAAE,GAAA,EAAI,EAAI,QAAQ,CAAA;AAClG,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,SAAS,KAAA,EAAO,MAAA,EAAQ,SAAS,MAAA,EAAO;AAAA,EAChE;AACF,CAAC,CAAA;AAED,iCAAA,CAAkC,cAAc,CAAA;AAYhD,4BAAA,EAA6B;AAO7B,sBAAA,CAAuB,eAAe,CAAA;ACvB/B,IAAM,yBAAA,GAAN,cAEG,wBAAA,CAA4B;AAAC;;;ACVhC,SAAS,UAAA,CACd,GAAA,EACA,MAAA,EACA,IAAA,EACM;AACN,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,IAAI;AACF,IAAA,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,GAAG,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,OAAO,CAAC,CAAA;AAChF,IAAA,IAAA,CAAK,GAAG,CAAA;AAAA,EACV,CAAA,SAAE;AACA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EACd;AACF;AAOO,SAAS,QAAA,CAAS,WAAmB,IAAA,EAAsB;AAChE,EAAA,OAAO,aAAa,IAAA,IAAQ,CAAA,CAAA;AAC9B;AAGO,SAAS,OAAA,CAAQ,KAA+B,IAAA,EAAqD;AAC1G,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,IAAI;AACF,IAAA,IAAA,CAAK,GAAG,CAAA;AAAA,EACV,CAAA,SAAE;AACA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EACd;AACF;AASO,SAAS,iBACd,GAAA,EACA,CAAA,EACA,CAAA,EACA,CAAA,EACA,GACA,MAAA,EACM;AACN,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAC,CAAA,GAAI,CAAC,CAAC,CAAA;AACxE,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACnB,IAAA;AAAA,EACF;AACA,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AACnB,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AACvB,EAAA,GAAA,CAAI,iBAAiB,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,GAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAC3C,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAI,CAAC,CAAA;AAC3B,EAAA,GAAA,CAAI,gBAAA,CAAiB,IAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AACnD,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AACvB,EAAA,GAAA,CAAI,iBAAiB,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAG,CAAA,GAAI,IAAI,CAAC,CAAA;AAC3C,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AACnB,EAAA,GAAA,CAAI,gBAAA,CAAiB,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,GAAG,CAAC,CAAA;AACnC,EAAA,GAAA,CAAI,SAAA,EAAU;AAChB;AAGO,SAAS,aAAA,CAAc,KAA+B,MAAA,EAAmD;AAC9G,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,EAAA,IAAI,CAAC,KAAA,IAAS,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACjC,EAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA;AAC3B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,GAAA,CAAI,MAAA,CAAO,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AAAA,EACrB;AACF;AAgBO,SAAS,kBAAA,CACd,GAAA,EACA,MAAA,EACA,KAAA,EACA,KAAA,EACM;AACN,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACvB,EAAA,MAAM,OAAO,KAAA,GAAQ,CAAA;AACrB,EAAA,MAAMC,KAAI,MAAA,CAAO,MAAA;AACjB,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAsB;AACrC,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAIA,EAAAA,GAAI,CAAA,IAAK,GAAG,CAAC,CAAA;AACpD,IAAA,OAAO,IAAA,GAAO,CAAA;AAAA,EAChB,CAAA;AACA,EAAA,MAAM,OAAmC,EAAC;AAC1C,EAAA,MAAM,QAAoC,EAAC;AAC3C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,EAAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AACtC,IAAA,MAAM,IAAA,GAAO,OAAO,IAAA,CAAK,GAAA,CAAIA,KAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAC1C,IAAA,IAAI,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA;AACvB,IAAA,IAAI,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA;AACvB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC7B,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,EAAA,GAAK,CAAA;AACL,MAAA,EAAA,GAAK,CAAA;AAAA,IACP,CAAA,MAAO;AACL,MAAA,EAAA,IAAM,GAAA;AACN,MAAA,EAAA,IAAM,GAAA;AAAA,IACR;AACA,IAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,CAAA;AAC9C,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,CAAA;AAAA,EACjD;AACA,EAAA,GAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA,CAAG,GAAG,IAAA,CAAK,CAAC,EAAG,CAAC,CAAA;AACjC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAG,CAAA,EAAG,IAAA,CAAK,CAAC,EAAG,CAAC,CAAA;AACvE,EAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,CAAG,CAAA,EAAG,KAAA,CAAM,CAAC,EAAG,CAAC,CAAA;AAC/E,EAAA,GAAA,CAAI,SAAA,EAAU;AAChB;AAQO,SAAS,UAAA,CAAW,GAAA,EAA+B,CAAA,EAAW,CAAA,EAAW,GAAA,EAAmB;AACjG,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,GAAA,EAAK,CAAA,GAAI,GAAG,CAAA;AAC3B,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,GAAA,EAAK,CAAA,GAAI,GAAG,CAAA;AAC3B,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,GAAA,EAAK,CAAA,GAAI,GAAG,CAAA;AAC3B,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,GAAA,EAAK,CAAA,GAAI,GAAG,CAAA;AAC7B;AAUO,SAAS,aAAA,CACd,GAAA,EACA,IAAA,EACA,CAAA,EACA,GACA,IAAA,EACQ;AACR,EAAA,GAAA,CAAI,OAAO,IAAA,CAAK,IAAA;AAChB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AACnB,EAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,WAAA,CAAY,IAAI,CAAA;AAGpC,EAAA,MAAM,SAAS,OAAA,CAAQ,uBAAA;AACvB,EAAA,MAAM,UAAU,OAAA,CAAQ,wBAAA;AACxB,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,IAAK,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,IAAK,MAAA,GAAS,OAAA,GAAU,CAAA,GAAI,SAAS,OAAA,GAAU,EAAA;AACpH,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,KAAA,GAAQ,IAAA,CAAK,QAAA,GAAW,CAAA;AAC1C,EAAA,MAAM,CAAA,GAAI,UAAA,GAAa,IAAA,CAAK,QAAA,GAAW,CAAA;AACvC,EAAA,GAAA,CAAI,YAAY,IAAA,CAAK,UAAA;AACrB,EAAA,gBAAA,CAAiB,KAAK,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAK,MAAM,CAAA;AAC7C,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,YAAY,IAAA,CAAK,KAAA;AACrB,EAAA,GAAA,CAAI,SAAS,IAAA,EAAM,CAAA,GAAI,KAAK,QAAA,EAAU,CAAA,GAAI,KAAK,QAAQ,CAAA;AACvD,EAAA,OAAO,CAAA;AACT;;;ACtJO,IAAM,kCAAA,GAAkE;AAAA,EAC7E,SAAA,EAAW,CAAA;AAAA,EACX,QAAA,EAAU,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,EACf,KAAA,EAAO,EAAA;AAAA,EACP,uBAAA,EAAyB,CAAC,OAAA,EAAkB,KAAA,EAAgB,SAAA,MAA4B;AAAA,IACtF,MAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA,CAAE;AAAA,GAClC;AACF;AAgBO,IAAM,oBAAA,GAAN,cAAmC,WAAA,CAAiD;AAAA,EACzF,OAAgB,IAAA,GAAO,WAAA;AAAA,EACvB,OAAgB,MAAA,GAAS,EAAA;AAAA,EACzB,OAAgB,OAAA,GAAuC,kCAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS7C,oBAAA,GAAgC;AACxC,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAI,MAAA,CAAO,gBAAA,EAAiB,KAAM,OAAA,EAAS,OAAO,IAAA;AAClD,IAAA,MAAM,KAAA,GAAQ,OAAO,oBAAA,EAAqB;AAC1C,IAAA,OAAO,OAAO,IAAA,KAAS,OAAA;AAAA,EACzB;AAAA,EAES,QAAA,GAAoB;AAC3B,IAAA,OAAO,KAAK,oBAAA,EAAqB,IAAK,KAAK,MAAA,CAAO,kBAAA,GAAqB,MAAA,GAAS,CAAA;AAAA,EAClF;AAAA,EAES,WAAA,GAAoC;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,oBAAA,EAAqB,SAAU,EAAC;AAC1C,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,MAA4B,EAAC;AACnC,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,gBAAA,EAAiB,EAAG;AAE7C,MAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC5B,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,kBAAA,CAAmB,KAAK,CAAA;AAC9C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,IAAI,KAAA,CAAM,EAAA;AAAA,QACV,IAAA,EAAM,WAAA;AAAA,QACN,SAAS,KAAA,CAAM,EAAA;AAAA,QACf,MAAA,EAAQ,EAAE,CAAA,EAAG,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA;AAAE,OAC9D,CAAA;AAAA,IACH;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAGS,WAAA,GAAsC;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,gBAAA,GAAsD;AACpD,IAAA,OAAO,wBAA2D,IAAI,CAAA;AAAA,EACxE;AAAA,EAES,OAAO,GAAA,EAAqC;AACnD,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU;AACrC,IAAA,MAAM,IAAA,GAAO,OAAO,CAAA,IAAK,CAAA;AACzB,IAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAU,KAAA,KAAU,IAAA,CAAK,OAAA;AAC5C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,gBAAA,EAAiB,CAAE,MAAA;AACvC,IAAA,UAAA,CAAW,GAAA,EAAK,MAAA,EAAQ,CAAC,CAAA,KAAM;AAC7B,MAAA,CAAA,CAAE,WAAA,GAAc,MAAA;AAChB,MAAA,CAAA,CAAE,SAAA,GAAY,QAAA,CAAS,SAAA,EAAW,IAAI,CAAA;AAGtC,MAAA,CAAA,CAAE,WAAA,CAAY,SAAS,GAAA,CAAI,CAAC,MAAM,QAAA,CAAS,CAAA,EAAG,IAAI,CAAC,CAAC,CAAA;AACpD,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,KAAA,EAAO,IAAI,CAAA;AAChC,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,KAAM,OAAA,CAAQ,MAAA;AAC/B,QAAA,CAAA,CAAE,SAAA,EAAU;AACZ,QAAA,CAAA,CAAE,IAAA,CAAK,CAAA,GAAI,GAAA,EAAK,CAAA,GAAI,GAAA,EAAK,IAAI,GAAA,GAAM,CAAA,EAAG,CAAA,GAAI,GAAA,GAAM,CAAC,CAAA;AACjD,QAAA,CAAA,CAAE,MAAA,EAAO;AAAA,MACX;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF;AAoBO,IAAM,0CAAA,GAAiF;AAAA,EAC5F,MAAA,EAAQ,GAAA;AAAA,EACR,SAAA,EAAW,GAAA;AAAA,EACX,uBAAA,EAAyB,CAAC,OAAA,EAAkB,KAAA,EAAgB,SAAA,KAA2B;AACrF,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AACrC,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,MAAA,EAAQ,OAAO,KAAA,EAAM;AAAA,EACnD;AACF;AAmBO,IAAM,2BAAA,GAAN,cAA0C,WAAA,CAAwD;AAAA,EACvG,OAAgB,IAAA,GAAO,kBAAA;AAAA,EACvB,OAAgB,MAAA,GAAS,EAAA;AAAA,EACzB,OAAgB,OAAA,GAA8C,0CAAA;AAAA;AAAA,EAGpD,SAAA,GAA4B;AACpC,IAAA,OAAO,IAAA,CAAK,OAAO,iBAAA,EAAkB,CAAE,OAAO,CAAC,KAAA,KAAU,KAAA,CAAM,IAAA,KAAS,OAAO,CAAA;AAAA,EACjF;AAAA,EAES,QAAA,GAAoB;AAC3B,IAAA,OAAO,IAAA,CAAK,SAAA,EAAU,CAAE,MAAA,GAAS,CAAA;AAAA,EACnC;AAAA,EAES,WAAA,GAA2C;AAClD,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,MAAmC,EAAC;AAC1C,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,SAAA,EAAU,EAAG;AACpC,MAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,oBAAA,CAAuC,KAAA,EAAO,OAAO,CAAA,EAAG;AACnF,QAAA,MAAM,QAAA,GAAW,QAAQ,KAAA,EAAO,QAAA;AAChC,QAAA,MAAM,MAAA,GAAS,QAAQ,KAAA,EAAO,gBAAA;AAC9B,QAAA,IAAI,CAAC,QAAA,IAAY,CAAC,MAAA,EAAQ;AAC1B,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA;AAC3C,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,sBAAA,CAAuB,MAAM,CAAA;AAClD,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,qBAAA,CAAsB,MAAM,CAAA;AAC7C,QAAA,IAAI,CAAC,KAAA,EAAO;AAGZ,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,IAAI,MAAA,CAAO,CAAA;AACrC,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,IAAI,MAAA,CAAO,CAAA;AACrC,QAAA,GAAA,CAAI,IAAA,CAAK;AAAA,UACP,EAAA,EAAI,CAAA,EAAG,KAAA,CAAM,EAAE,IAAI,QAAQ,CAAA,CAAA;AAAA,UAC3B,IAAA,EAAM,kBAAA;AAAA,UACN,SAAS,KAAA,CAAM,EAAA;AAAA,UACf,cAAc,MAAA,CAAO,EAAA;AAAA,UACrB,QAAA;AAAA,UACA,OAAO,EAAE,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA,GAAI,EAAE,CAAA,GAAI,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA,GAAI,EAAE,CAAA,GAAI,CAAA,GAAI,EAAE,CAAA;AAAE,SACjE,CAAA;AAAA,MACH;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAGS,WAAA,GAAsC;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,gBAAA,GAA6D;AAC3D,IAAA,OAAO,wBAAkE,IAAI,CAAA;AAAA,EAC/E;AAAA,EAES,OAAO,GAAA,EAAqC;AACnD,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU;AACrC,IAAA,MAAM,IAAA,GAAO,OAAO,CAAA,IAAK,CAAA;AACzB,IAAA,MAAM,OAAA,GAAU,KAAK,gBAAA,EAAiB;AACtC,IAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAU,GAAI,IAAA,CAAK,OAAA;AACnC,IAAA,UAAA,CAAW,GAAA,EAAK,MAAA,EAAQ,CAAC,CAAA,KAAM;AAC7B,MAAA,CAAA,CAAE,YAAY,OAAA,CAAQ,IAAA;AACtB,MAAA,CAAA,CAAE,cAAc,OAAA,CAAQ,MAAA;AACxB,MAAA,CAAA,CAAE,SAAA,GAAY,QAAA,CAAS,SAAA,EAAW,IAAI,CAAA;AACtC,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,MAAA,EAAQ,IAAI,CAAA;AAC/B,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,CAAA,CAAE,SAAA,EAAU;AACZ,QAAA,CAAA,CAAE,GAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AACzD,QAAA,CAAA,CAAE,IAAA,EAAK;AACP,QAAA,CAAA,CAAE,MAAA,EAAO;AAAA,MACX;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF;ACxNA,SAAS,yBAAA,CACP,OAAA,EACA,KAAA,EACA,SAAA,EAC+B;AAC/B,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AACrC,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,UAAA,EAAY,MAAA,EAAQ,OAAO,YAAA,EAAa;AAChE;AAGO,IAAM,6BAAA,GAAyD;AAAA,EACpE,SAAA,EAAW,GAAA;AAAA,EACX,MAAA,EAAQ,CAAA;AAAA,EACR,uBAAA,EAAyB;AAC3B;AAUA,IAAe,oBAAA,GAAf,cAA2FC,WAAAA,CAGzF;AAAA,EAIS,QAAA,GAAoB;AAC3B,IAAA,OAAO,IAAA,CAAK,gBAAe,KAAM,IAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAQS,WAAA,GAAsC;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,gBAAA,GAAkD;AAChD,IAAA,OAAOC,wBAAuD,IAAI,CAAA;AAAA,EACpE;AAAA,EAES,OAAO,GAAA,EAAqC;AACnD,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU;AACrC,IAAA,MAAM,IAAA,GAAO,OAAO,CAAA,IAAK,CAAA;AACzB,IAAA,MAAM,OAAA,GAAU,KAAK,gBAAA,EAAiB;AACtC,IAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,IAAA,CAAK,OAAA;AACnC,IAAA,UAAA,CAAW,GAAA,EAAK,MAAA,EAAQ,CAAC,CAAA,KAAM;AAC7B,MAAA,CAAA,CAAE,YAAY,OAAA,CAAQ,IAAA;AACtB,MAAA,CAAA,CAAE,cAAc,OAAA,CAAQ,MAAA;AACxB,MAAA,CAAA,CAAE,YAAY,SAAA,GAAY,IAAA;AAC1B,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,KAAM,OAAA,CAAQ,MAAA;AAC/B,QAAA,gBAAA,CAAiB,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,SAAS,IAAI,CAAA;AAC7C,QAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,aAAA,EAAe,CAAA,CAAE,IAAA,EAAK;AAC3C,QAAA,CAAA,CAAE,MAAA,EAAO;AAAA,MACX;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF,CAAA;AAWO,IAAM,gBAAA,GAAN,cAA+B,oBAAA,CAAqC;AAAA,EACzE,OAAgB,IAAA,GAAO,OAAA;AAAA,EACvB,OAAgB,MAAA,GAAS,EAAA;AAAA,EACzB,OAAgB,OAAA,GAAmC,6BAAA;AAAA,EAEhC,cAAA,GAAoC;AACrD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAiB,CAAE,KAAA;AAAA,EACxC;AAAA,EAES,WAAA,GAAgC;AACvC,IAAA,MAAM,MAAA,GAAS,KAAK,cAAA,EAAe;AACnC,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,IAAA,OAAO,CAAC,EAAE,EAAA,EAAI,SAAS,IAAA,EAAM,OAAA,EAAS,QAAQ,CAAA;AAAA,EAChD;AACF;AAQO,IAAM,oBAAA,GAAN,cAAmC,oBAAA,CAAyC;AAAA,EACjF,OAAgB,IAAA,GAAO,WAAA;AAAA,EACvB,OAAgB,MAAA,GAAS,EAAA;AAAA,EACzB,OAAgB,OAAA,GAAmC;AAAA,IACjD,GAAG,6BAAA;AAAA,IACH,MAAA,EAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKR,uBAAA,EAAyB,CAAC,OAAA,EAAS,KAAA,EAAO,SAAA,MAAe;AAAA,MACvD,IAAA,EAAM,aAAA;AAAA,MACN,MAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA,CAAE;AAAA,KAClC;AAAA,GACF;AAAA,EAEmB,cAAA,GAAoC;AACrD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAiB,CAAE,SAAA;AAAA,EACxC;AAAA,EAES,WAAA,GAAoC;AAC3C,IAAA,MAAM,MAAA,GAAS,KAAK,cAAA,EAAe;AACnC,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,IAAA,OAAO,CAAC,EAAE,EAAA,EAAI,aAAa,IAAA,EAAM,WAAA,EAAa,QAAQ,CAAA;AAAA,EACxD;AACF;AC3IO,IAAM,oCAAA,GAAuE;AAAA,EAClF,WAAA,EAAa;AACf;AAQA,IAAe,uBAAA,GAAf,cAEUD,WAAAA,CAAuB;AAAA;AAAA,EAErB,SAAA,GAAgC;AACxC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,oCAAA,EAAqC;AAAA,EACxE;AAAA;AAAA,EAGU,WAAW,QAAA,EAKnB;AACA,IAAA,OAAO;AAAA,MACL,YAAY,QAAA,CAAS,EAAA;AAAA,MACrB,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,mBAAmB,QAAQ;AAAA,KAC/D;AAAA,EACF;AAAA;AAAA,EAGS,WAAA,GAAsC;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;AASO,IAAM,6BAAA,GAAN,cAA4C,uBAAA,CAAwB;AAAA,EACzE,OAAgB,IAAA,GAAO,oBAAA;AAAA,EACvB,OAAgB,MAAA,GAAS,EAAA;AAAA,EACzB,OAAgB,OAAA,GAA0C,oCAAA;AAAA,EAEjD,QAAA,GAAoB;AAC3B,IAAA,OAAO,IAAA,CAAK,WAAA,EAAY,CAAE,MAAA,GAAS,CAAA;AAAA,EACrC;AAAA,EAES,WAAA,GAA6C;AACpD,IAAA,MAAM,MAAqC,EAAC;AAC5C,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,EAAU,EAAG;AAGvC,MAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACtB,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,IAAI,QAAA,CAAS,EAAA;AAAA,QACb,IAAA,EAAM,oBAAA;AAAA,QACN,GAAG,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAAA,QAC3B,KAAA,EAAO,EAAE,CAAA,EAAG,QAAA,CAAS,OAAO,CAAA,EAAG,CAAA,EAAG,QAAA,CAAS,MAAA,CAAO,CAAA,EAAE;AAAA,QACpD,QAAA,EAAU,SAAS,MAAA,CAAO,QAAA;AAAA,QAC1B,aAAa,QAAA,CAAS;AAAA,OACvB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAES,OAAO,GAAA,EAAqC;AACnD,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,WAAA,GAAc,KAAK,OAAA,CAAQ,WAAA;AACjC,IAAA,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA,KAAM;AAClB,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,MAAM,EAAA,GAAK,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAC9C,QAAA,CAAA,CAAE,WAAA,GAAc,OAAA,CAAQ,MAAA,GAAS,WAAA,GAAc,CAAA;AAC/C,QAAA,CAAA,CAAE,IAAA,EAAK;AACP,QAAA,CAAA,CAAE,SAAA,CAAU,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA;AACtB,QAAA,IAAI,OAAA,CAAQ,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAK/C,QAAA,CAAA,CAAE,SAAA,EAAU;AACZ,QAAA,CAAA,CAAE,MAAA,CAAO,GAAG,CAAC,CAAA;AACb,QAAA,CAAA,CAAE,MAAA,CAAO,GAAG,EAAE,CAAA;AACd,QAAA,CAAA,CAAE,MAAA,CAAO,KAAK,IAAI,CAAA;AAClB,QAAA,CAAA,CAAE,MAAA,CAAO,KAAK,IAAI,CAAA;AAClB,QAAA,CAAA,CAAE,MAAA,CAAO,KAAK,IAAI,CAAA;AAClB,QAAA,CAAA,CAAE,MAAA,CAAO,GAAG,GAAG,CAAA;AACf,QAAA,CAAA,CAAE,MAAA,CAAO,MAAM,GAAG,CAAA;AAClB,QAAA,CAAA,CAAE,SAAA,EAAU;AACZ,QAAA,CAAA,CAAE,YAAY,OAAA,CAAQ,KAAA;AACtB,QAAA,CAAA,CAAE,WAAA,GAAc,qBAAA;AAChB,QAAA,CAAA,CAAE,SAAA,GAAY,CAAA;AACd,QAAA,CAAA,CAAE,IAAA,EAAK;AACP,QAAA,CAAA,CAAE,MAAA,EAAO;AACT,QAAA,CAAA,CAAE,OAAA,EAAQ;AAEV,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,QAAA;AAC7C,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,aAAA,CAAc,GAAG,KAAA,EAAO,EAAA,CAAG,IAAI,EAAA,EAAI,EAAA,CAAG,IAAI,EAAA,EAAI;AAAA,YAC5C,YAAY,OAAA,CAAQ,KAAA;AAAA;AAAA;AAAA,YAGpB,KAAA,EAAO,SAAA;AAAA,YACP,IAAA,EAAM,uDAAA;AAAA,YACN,QAAA,EAAU,CAAA;AAAA,YACV,QAAA,EAAU,CAAA;AAAA,YACV,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AAAA,MACF;AACA,MAAA,CAAA,CAAE,WAAA,GAAc,CAAA;AAAA,IAClB,CAAC,CAAA;AAAA,EACH;AACF;AAGO,IAAM,4BAAA,GAAN,cAA2C,uBAAA,CAAwB;AAAA,EACxE,OAAgB,IAAA,GAAO,mBAAA;AAAA,EACvB,OAAgB,MAAA,GAAS,EAAA;AAAA,EACzB,OAAgB,OAAA,GAA0C,oCAAA;AAAA,EAEjD,QAAA,GAAoB;AAC3B,IAAA,OAAO,IAAA,CAAK,WAAA,EAAY,CAAE,MAAA,GAAS,CAAA;AAAA,EACrC;AAAA,EAES,WAAA,GAA4C;AACnD,IAAA,MAAM,MAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,EAAU,EAAG;AACvC,MAAA,IAAI,CAAC,SAAS,KAAA,EAAO;AACrB,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,IAAI,QAAA,CAAS,EAAA;AAAA,QACb,IAAA,EAAM,mBAAA;AAAA,QACN,GAAG,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAAA,QAC3B,QAAQ,QAAA,CAAS;AAAA,OAClB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAES,OAAO,GAAA,EAAqC;AACnD,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU;AACrC,IAAA,MAAM,IAAA,GAAO,OAAO,CAAA,IAAK,CAAA;AACzB,IAAA,MAAM,WAAA,GAAc,KAAK,OAAA,CAAQ,WAAA;AACjC,IAAA,UAAA,CAAW,GAAA,EAAK,MAAA,EAAQ,CAAC,CAAA,KAAM;AAC7B,MAAA,CAAA,CAAE,SAAA,GAAY,QAAA,CAAS,GAAA,EAAK,IAAI,CAAA;AAChC,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,KAAM,OAAA,CAAQ,MAAA;AAC/B,QAAA,CAAA,CAAE,cAAc,OAAA,CAAQ,KAAA;AACxB,QAAA,gBAAA,CAAiB,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,QAAA,CAAS,CAAA,EAAG,IAAI,CAAC,CAAA;AAIjD,QAAA,CAAA,CAAE,WAAA,GAAA,CAAe,OAAA,CAAQ,MAAA,GAAS,WAAA,GAAc,CAAA,IAAK,IAAA;AACrD,QAAA,CAAA,CAAE,YAAY,OAAA,CAAQ,KAAA;AACtB,QAAA,CAAA,CAAE,IAAA,EAAK;AACP,QAAA,CAAA,CAAE,WAAA,GAAc,OAAA,CAAQ,MAAA,GAAS,WAAA,GAAc,CAAA;AAC/C,QAAA,CAAA,CAAE,MAAA,EAAO;AAAA,MACX;AACA,MAAA,CAAA,CAAE,WAAA,GAAc,CAAA;AAAA,IAClB,CAAC,CAAA;AAAA,EACH;AACF;AAGO,IAAM,+BAAA,GAAN,cAA8C,uBAAA,CAAwB;AAAA,EAC3E,OAAgB,IAAA,GAAO,sBAAA;AAAA,EACvB,OAAgB,MAAA,GAAS,EAAA;AAAA,EACzB,OAAgB,OAAA,GAA0C,oCAAA;AAAA,EAEjD,QAAA,GAAoB;AAC3B,IAAA,OAAO,IAAA,CAAK,WAAA,EAAY,CAAE,MAAA,GAAS,CAAA;AAAA,EACrC;AAAA,EAES,WAAA,GAA+C;AACtD,IAAA,MAAM,MAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,EAAU,EAAG;AACvC,MAAA,KAAA,MAAW,QAAA,IAAY,SAAS,SAAA,EAAW;AACzC,QAAA,GAAA,CAAI,IAAA,CAAK;AAAA,UACP,IAAI,CAAA,EAAG,QAAA,CAAS,EAAE,CAAA,CAAA,EAAI,SAAS,EAAE,CAAA,CAAA;AAAA,UACjC,IAAA,EAAM,sBAAA;AAAA,UACN,GAAG,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAAA,UAC3B;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAES,OAAO,GAAA,EAAqC;AACnD,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU;AACrC,IAAA,MAAM,WAAA,GAAc,KAAK,OAAA,CAAQ,WAAA;AACjC,IAAA,UAAA,CAAW,GAAA,EAAK,MAAA,EAAQ,CAAC,CAAA,KAAM;AAC7B,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,MAAM,WAAqB,OAAA,CAAQ,QAAA;AACnC,QAAA,IAAI,QAAA,CAAS,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAGhC,QAAA,CAAA,CAAE,YAAY,OAAA,CAAQ,KAAA;AACtB,QAAA,CAAA,CAAE,WAAA,GAAc,QAAA,CAAS,OAAA,IAAW,OAAA,CAAQ,SAAS,WAAA,GAAc,CAAA,CAAA;AACnE,QAAA,kBAAA,CAAmB,GAAG,QAAA,CAAS,MAAA,EAAQ,QAAA,CAAS,IAAA,EAAM,SAAS,KAAK,CAAA;AACpE,QAAA,CAAA,CAAE,IAAA,EAAK;AAAA,MACT;AACA,MAAA,CAAA,CAAE,WAAA,GAAc,CAAA;AAAA,IAClB,CAAC,CAAA;AAAA,EACH;AACF;AAGO,IAAM,qCAAA,GAAN,cAAoD,uBAAA,CAAwB;AAAA,EACjF,OAAgB,IAAA,GAAO,4BAAA;AAAA,EACvB,OAAgB,MAAA,GAAS,CAAA;AAAA,EACzB,OAAgB,OAAA,GAA0C,oCAAA;AAAA,EAEjD,QAAA,GAAoB;AAC3B,IAAA,OAAO,IAAA,CAAK,WAAA,EAAY,CAAE,MAAA,GAAS,CAAA;AAAA,EACrC;AAAA,EAES,WAAA,GAAqD;AAC5D,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,MAA6C,EAAC;AACpD,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,EAAU,EAAG;AACvC,MAAA,KAAA,MAAW,OAAA,IAAW,SAAS,gBAAA,EAAkB;AAC/C,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA;AACrC,QAAA,IAAI,CAAC,KAAA,EAAO;AACZ,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,sBAAA,CAAuB,KAAK,CAAA;AAClD,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,qBAAA,CAAsB,KAAK,CAAA;AAC5C,QAAA,GAAA,CAAI,IAAA,CAAK;AAAA,UACP,EAAA,EAAI,CAAA,EAAG,QAAA,CAAS,EAAE,IAAI,OAAO,CAAA,CAAA;AAAA,UAC7B,IAAA,EAAM,4BAAA;AAAA,UACN,GAAG,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAAA,UAC3B,OAAA;AAAA,UACA,WAAW,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE;AAAA,UAC5D,MAAA,EAAQ,EAAE,CAAA,EAAG,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA;AAAE,SAC9D,CAAA;AAAA,MACH;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAES,OAAO,GAAA,EAAqC;AACnD,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU;AACrC,IAAA,MAAM,IAAA,GAAO,OAAO,CAAA,IAAK,CAAA;AACzB,IAAA,MAAM,WAAA,GAAc,KAAK,OAAA,CAAQ,WAAA;AACjC,IAAA,UAAA,CAAW,GAAA,EAAK,MAAA,EAAQ,CAAC,CAAA,KAAM;AAC7B,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,CAAA,CAAE,IAAA,EAAK;AACP,QAAA,MAAM,IAAI,OAAA,CAAQ,SAAA;AAClB,QAAA,CAAA,CAAE,SAAA,CAAU,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AACxC,QAAA,CAAA,CAAE,cAAc,OAAA,CAAQ,KAAA;AACxB,QAAA,CAAA,CAAE,WAAA,GAAc,OAAA,CAAQ,MAAA,GAAS,WAAA,GAAc,CAAA;AAC/C,QAAA,CAAA,CAAE,SAAA,GAAY,QAAA,CAAS,GAAA,EAAK,IAAI,CAAA;AAChC,QAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,KAAM,OAAA,CAAQ,MAAA;AAC/B,QAAA,CAAA,CAAE,UAAA,CAAW,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACvB,QAAA,CAAA,CAAE,OAAA,EAAQ;AAAA,MACZ;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF;AAUO,IAAM,2BAAA,GAAN,MAAM,4BAAA,SAAoC,uBAAA,CAAwB;AAAA,EACvE,OAAgB,IAAA,GAAO,kBAAA;AAAA,EACvB,OAAgB,MAAA,GAAS,EAAA;AAAA,EACzB,OAAgB,OAAA,GAA0C,oCAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO1D,OAAgB,UAAA,GAAa,EAAA;AAAA,EAEpB,QAAA,GAAoB;AAC3B,IAAA,OAAO,IAAA,CAAK,WAAA,EAAY,CAAE,MAAA,GAAS,CAAA;AAAA,EACrC;AAAA,EAES,WAAA,GAA2C;AAClD,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,QAAA,GAAW,OAAO,uBAAA,EAAwB;AAChD,IAAA,MAAM,QAAQ,4BAAA,CAA4B,UAAA;AAC1C,IAAA,MAAM,MAAmC,EAAC;AAC1C,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,EAAU,EAAG;AACvC,MAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACtB,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,cAAA,CAAe,QAAA,CAAS,MAAM,CAAA;AAChD,MAAA,MAAM,QAAA,GAAW,EAAA,CAAG,CAAA,IAAK,CAAA,IAAK,EAAA,CAAG,CAAA,IAAK,CAAA,IAAK,EAAA,CAAG,CAAA,IAAK,QAAA,CAAS,CAAA,IAAK,EAAA,CAAG,KAAK,QAAA,CAAS,CAAA;AAGlF,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,MAAM,EAAA,GAAK,SAAS,CAAA,GAAI,CAAA;AACxB,MAAA,MAAM,EAAA,GAAK,SAAS,CAAA,GAAI,CAAA;AACxB,MAAA,MAAM,KAAA,GAAQ;AAAA,QACZ,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,EAAA,CAAG,CAAA,EAAG,KAAK,CAAA,EAAG,KAAK,GAAA,CAAI,KAAA,EAAO,QAAA,CAAS,CAAA,GAAI,KAAK,CAAC,CAAA;AAAA,QACtE,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,EAAA,CAAG,CAAA,EAAG,KAAK,CAAA,EAAG,KAAK,GAAA,CAAI,KAAA,EAAO,QAAA,CAAS,CAAA,GAAI,KAAK,CAAC;AAAA,OACxE;AACA,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,IAAI,QAAA,CAAS,EAAA;AAAA,QACb,IAAA,EAAM,kBAAA;AAAA,QACN,GAAG,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAAA,QAC3B,KAAA;AAAA,QACA,QAAA,EAAU,KAAK,KAAA,CAAM,EAAA,CAAG,IAAI,EAAA,EAAI,EAAA,CAAG,IAAI,EAAE;AAAA,OAC1C,CAAA;AAAA,IACH;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAES,OAAO,GAAA,EAAqC;AACnD,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,WAAA,GAAc,KAAK,OAAA,CAAQ,WAAA;AACjC,IAAA,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA,KAAM;AAClB,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,CAAA,CAAE,IAAA,EAAK;AACP,QAAA,CAAA,CAAE,UAAU,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC5C,QAAA,CAAA,CAAE,MAAA,CAAO,QAAQ,QAAQ,CAAA;AACzB,QAAA,CAAA,CAAE,WAAA,GAAc,OAAA,CAAQ,MAAA,GAAS,WAAA,GAAc,CAAA;AAC/C,QAAA,CAAA,CAAE,YAAY,OAAA,CAAQ,KAAA;AAEtB,QAAA,CAAA,CAAE,SAAA,EAAU;AACZ,QAAA,CAAA,CAAE,MAAA,CAAO,GAAG,CAAC,CAAA;AACb,QAAA,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AACf,QAAA,CAAA,CAAE,MAAA,CAAO,IAAI,CAAC,CAAA;AACd,QAAA,CAAA,CAAE,SAAA,EAAU;AACZ,QAAA,CAAA,CAAE,IAAA,EAAK;AACP,QAAA,CAAA,CAAE,OAAA,EAAQ;AAAA,MACZ;AACA,MAAA,CAAA,CAAE,WAAA,GAAc,CAAA;AAAA,IAClB,CAAC,CAAA;AAAA,EACH;AACF;ACxVO,SAAS,oBAAA,CAAqB,KAAA,EAAe,KAAA,EAAgB,SAAA,EAAgC;AAClG,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AACrC,EAAA,IAAI,KAAA,KAAU,QAAA,EAAU,OAAO,MAAA,CAAO,YAAA;AACtC,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC1B,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,CAAM,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA,CAAM,KAAA;AACxF,EAAA,OAAO,KAAA;AACT;AAGO,IAAM,gCAAA,GAA+D;AAAA,EAC1E,KAAA,EAAO,IAAA;AAAA,EACP,uBAAA,EAAyB,CAAC,OAAA,EAAS,KAAA,EAAO,SAAA,MAAe;AAAA,IACvD,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA,CAAE;AAAA,GACjC;AACF;AASO,IAAM,mBAAA,GAAN,cAAkCA,WAAAA,CAAgD;AAAA,EACvF,OAAgB,IAAA,GAAO,UAAA;AAAA,EACvB,OAAgB,MAAA,GAAS,EAAA;AAAA,EACzB,OAAgB,OAAA,GAAsC,gCAAA;AAAA;AAAA,EAG5C,YAAA,GAA2B;AACnC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAiB,CAAE,SAAA;AAAA,EACxC;AAAA,EAES,QAAA,GAAoB;AAC3B,IAAA,OAAO,IAAA,CAAK,YAAA,EAAa,CAAE,MAAA,GAAS,CAAA;AAAA,EACtC;AAAA,EAES,WAAA,GAAmC;AAC1C,IAAA,OAAO,IAAA,CAAK,YAAA,EAAa,CAAE,GAAA,CAAI,CAAC,QAAA,MAAc;AAAA,MAC5C,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,IAAA,EAAM,UAAA;AAAA,MACN;AAAA,KACF,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA,EAGS,WAAA,GAAsC;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAES,OAAO,GAAA,EAAqC;AACnD,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU;AACrC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,eAAA,EAAgB;AAChD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,YAAA,EAAa;AACjD,IAAA,MAAM,QAAA,GAAWC,uBAAAA,CAA0D,IAAI,CAAA,CAAE,KAAA;AACjF,IAAA,MAAM,YAAA,GAAe,KAAK,OAAA,CAAQ,KAAA;AAClC,IAAA,UAAA,CAAW,GAAA,EAAK,MAAA,EAAQ,CAAC,CAAA,KAAM;AAC7B,MAAA,KAAA,MAAW,EAAE,QAAA,EAAS,IAAK,QAAA,EAAU;AACnC,QAAA,IAAI,QAAA,CAAS,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAChC,QAAA,CAAA,CAAE,cAAc,QAAA,CAAS,OAAA;AACzB,QAAA,CAAA,CAAE,SAAA,GAAY,SAAS,KAAA,GAAQ,oBAAA,CAAqB,SAAS,KAAA,EAAO,KAAA,EAAO,SAAS,CAAA,GAAI,QAAA;AACxF,QAAA,kBAAA,CAAmB,GAAG,QAAA,CAAS,MAAA,EAAQ,SAAS,IAAA,EAAM,YAAA,IAAgB,SAAS,KAAK,CAAA;AACpF,QAAA,CAAA,CAAE,IAAA,EAAK;AAAA,MACT;AACA,MAAA,CAAA,CAAE,WAAA,GAAc,CAAA;AAAA,IAClB,CAAC,CAAA;AAAA,EACH;AACF;AC9DO,IAAM,4CAAA,GAAsF;AAAA,EACjG,SAAA,EAAW,GAAA;AAAA,EACX,UAAA,EAAY,CAAA;AAAA,EACZ,YAAA,EAAc,CAAA;AAAA,EACd,YAAA,EAAc,GAAA;AAAA,EACd,UAAA,EAAY,CAAA;AAAA,EACZ,uBAAA,EAAyB,CAAC,OAAA,EAAkB,KAAA,EAAgB,SAAA,KAA2B;AACrF,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AACrC,IAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,YAAA,EAAc,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,EAC3D;AACF;AAGA,SAAS,eAAe,MAAA,EAAyB;AAC/C,EAAA,OAAO,MAAA,KAAW,QAAA;AACpB;AAWA,IAAM,cAAA,GAAyC;AAAA,EAC7C,GAAA,EAAK,WAAA;AAAA,EACL,MAAA,EAAQ,WAAA;AAAA,EACR,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO,WAAA;AAAA,EACP,QAAA,EAAU,aAAA;AAAA,EACV,YAAA,EAAc,aAAA;AAAA,EACd,SAAA,EAAW,aAAA;AAAA,EACX,WAAA,EAAa,aAAA;AAAA,EACb,MAAA,EAAQ;AACV,CAAA;AAGO,IAAM,8BAAA,GAAN,cAA6CD,WAAAA,CAA2D;AAAA,EAC7G,OAAgB,IAAA,GAAO,qBAAA;AAAA,EACvB,OAAgB,MAAA,GAAS,EAAA;AAAA,EACzB,OAAgB,OAAA,GAAiD,4CAAA;AAAA,EAExD,QAAA,GAAoB;AAC3B,IAAA,OAAO,IAAA,CAAK,OAAO,gBAAA,EAAiB,KAAM,YAAY,IAAA,CAAK,MAAA,CAAO,wBAAuB,KAAM,IAAA;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQS,WAAA,GAA8C;AACrD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAS,SAAU,EAAC;AAC9B,IAAA,MAAM,IAAA,GAAO,2BAAA,CAA4B,IAAA,CAAK,MAAM,CAAA;AACpD,IAAA,MAAM,GAAA,GAAsC;AAAA,MAC1C,EAAE,IAAI,WAAA,EAAa,IAAA,EAAM,uBAAuB,MAAA,EAAQ,IAAA,EAAM,OAAO,IAAA;AAAK,KAC5E;AACA,IAAA,IAAI,CAAC,MAAM,OAAO,GAAA;AAClB,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,OAAA,EAAS;AAC5B,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,EAAA,EAAI,CAAA,OAAA,EAAU,EAAE,MAAM,CAAA,CAAA,EAAI,IAAA,EAAM,qBAAA,EAAuB,QAAQ,CAAA,CAAE,MAAA,EAAQ,KAAA,EAAO,CAAA,CAAE,OAAO,CAAA;AAAA,IACtG;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWS,YAAY,OAAA,EAA4C;AAC/D,IAAA,MAAM,MAAA,GAAS,OAAA;AACf,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,IAAU,CAAC,MAAA,CAAO,OAAO,OAAO,MAAA;AAC5C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,YAAA,EAAa,IAAK,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,MAAA,CAAO,MAAM,CAAA,GAAI,KAAK,OAAA,CAAQ,UAAA,GAAa,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,YAAA;AAC1F,IAAA,MAAM,CAAA,GAAA,CAAK,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,UAAA,IAAc,IAAA;AAC/C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,OAAO,KAAK,CAAA;AACtD,IAAA,OAAO,IAAI,WAAA,CAAY,EAAE,GAAG,MAAA,CAAO,CAAA,GAAI,GAAG,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,EAAG,KAAA,EAAO,IAAI,CAAA,EAAG,MAAA,EAAQ,IAAI,CAAA,EAAG,QAAA,EAAU,MAAM,CAAA;AAAA,EAC1G;AAAA,EAES,UAAU,OAAA,EAAwC;AACzD,IAAA,MAAM,MAAA,GAAS,OAAA;AACf,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAO,MAAA;AAC3B,IAAA,OAAO,cAAA,CAAe,OAAO,MAAM,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,gBAAA,GAAgE;AAC9D,IAAA,OAAOC,wBAAqE,IAAI,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASS,OAAO,GAAA,EAAqC;AACnD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAS,EAAG;AACtB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,OAAA,GAAU,KAAK,gBAAA,EAAiB;AACtC,IAAA,MAAM,EAAE,SAAA,EAAW,UAAA,EAAY,YAAA,EAAc,YAAA,KAAiB,IAAA,CAAK,OAAA;AACnE,IAAA,MAAM,MAAA,GAAS,OAAO,sBAAA,EAAuB;AAC7C,IAAA,MAAM,IAAA,GAAO,4BAA4B,MAAM,CAAA;AAE/C,IAAA,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA,KAAM;AAClB,MAAA,CAAA,CAAE,cAAc,OAAA,CAAQ,MAAA;AACxB,MAAA,CAAA,CAAE,YAAY,OAAA,CAAQ,IAAA;AACtB,MAAA,CAAA,CAAE,SAAA,GAAY,SAAA;AAkBd,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,MAAM,QAAA,GAAW,OAAO,iBAAA,EAAkB;AAC1C,QAAA,MAAM,SAAS,QAAA,CAAS,MAAA,KAAW,CAAA,GAAI,QAAA,CAAS,CAAC,CAAA,GAAI,KAAA,CAAA;AACrD,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAM,OAAA,GAAU,MAAA,CAAO,cAAA,CAAe,EAAE,CAAA,EAAG,OAAO,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,CAAA,EAAG,CAAA;AAClE,UAAA,MAAM,WAAA,GAAc,MAAA,CAAO,cAAA,CAAe,EAAE,CAAA,EAAG,OAAO,IAAA,EAAM,CAAA,EAAG,MAAA,CAAO,IAAA,EAAM,CAAA;AAC5E,UAAA,CAAA,CAAE,SAAA,EAAU;AACZ,UAAA,CAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,WAAA,CAAY,CAAA,GAAI,OAAA,CAAQ,CAAA,EAAG,WAAA,CAAY,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA;AACjF,UAAA,CAAA,CAAE,MAAA,EAAO;AAAA,QACX;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,KAAA,MAAW,CAAA,IAAK,KAAK,OAAA,EAAS;AAC5B,QAAA,IAAI,cAAA,CAAe,CAAA,CAAE,MAAM,CAAA,EAAG;AAC5B,UAAA,gBAAA,CAAiB,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAA,GAAI,UAAA,GAAa,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAA,GAAI,UAAA,GAAa,CAAA,EAAG,UAAA,EAAY,YAAY,YAAY,CAAA;AAAA,QAClH,CAAA,MAAO;AACL,UAAA,CAAA,CAAE,SAAA,EAAU;AACZ,UAAA,CAAA,CAAE,GAAA,CAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,YAAA,EAAc,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAAA,QAC1D;AACA,QAAA,CAAA,CAAE,IAAA,EAAK;AACP,QAAA,CAAA,CAAE,MAAA,EAAO;AAAA,MACX;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF;AC5JO,IAAM,oCAAA,GAAsE;AAAA,EACjF,MAAA,EAAQ,CAAA;AAAA,EACR,aAAA,EAAe,CAAA;AAAA,EACf,SAAA,EAAW,GAAA;AAAA,EACX,cAAA,EAAgB,GAAA;AAAA,EAChB,UAAA,EAAY,CAAA;AAAA,EACZ,uBAAA,EAAyB,CAAC,OAAA,EAAkB,KAAA,EAAgB,SAAA,KAA2B;AACrF,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AACrC,IAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,YAAA,EAAc,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,EAC3D;AACF;AAGO,IAAM,sBAAA,GAAN,cAAqCD,WAAAA,CAAmD;AAAA,EAC7F,OAAgB,IAAA,GAAO,aAAA;AAAA,EACvB,OAAgB,MAAA,GAAS,EAAA;AAAA,EACzB,OAAgB,OAAA,GAAyC,oCAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS/C,cAAA,GAA2C;AACnD,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAiB,KAAM,UAAU,OAAO,MAAA;AACxD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,oBAAA,EAAqB;AAC/C,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,QAAA,EAAU,OAAO,MAAA;AACrC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAES,QAAA,GAAoB;AAC3B,IAAA,OAAO,IAAA,CAAK,WAAA,EAAY,CAAE,MAAA,GAAS,CAAA;AAAA,EACrC;AAAA,EAES,WAAA,GAAsC;AAC7C,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,KAAK,cAAA,EAAe;AAClC,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,OAAO,YAAA,CAAa,KAAK,EAAE,UAAA,GAAa,KAAK,KAAK,EAAC;AAAA,IAC/D,CAAA,CAAA,MAAQ;AAGN,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,qBAAA,CAAsB,KAAK,CAAA;AAC5C,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,MAC9B,IAAI,CAAA,EAAG,KAAA,CAAM,EAAE,CAAA,CAAA,EAAI,OAAO,EAAE,CAAA,CAAA;AAAA,MAC5B,IAAA,EAAM,aAAA;AAAA,MACN,SAAS,KAAA,CAAM,EAAA;AAAA,MACf,UAAU,MAAA,CAAO,EAAA;AAAA,MACjB,YAAY,MAAA,CAAO,IAAA;AAAA,MACnB,KAAA,EAAO,EAAE,CAAA,EAAG,CAAA,CAAE,IAAI,MAAA,CAAO,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,EAAE,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,CAAA,CAAE,CAAA;AAAE,KAC9F,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASS,YAAY,OAAA,EAA4C;AAC/D,IAAA,MAAM,MAAA,GAAS,OAAA;AACf,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,EAAO,OAAO,MAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,YAAA,EAAa,IAAK,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,OAAO,UAAA,KAAe,SAAA,GAAY,KAAK,OAAA,CAAQ,aAAA,GAAgB,KAAK,OAAA,CAAQ,MAAA;AAC3F,IAAA,MAAM,CAAA,GAAA,CAAK,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,UAAA,IAAc,IAAA;AAC/C,IAAA,OAAO,IAAIE,WAAAA,CAAY;AAAA,MACrB,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,CAAA,GAAI,CAAA;AAAA,MACpB,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,CAAA,GAAI,CAAA;AAAA,MACpB,OAAO,CAAA,GAAI,CAAA;AAAA,MACX,QAAQ,CAAA,GAAI,CAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAAA,EAES,SAAA,GAAoB;AAC3B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,gBAAA,GAAwD;AACtD,IAAA,OAAOD,wBAA6D,IAAI,CAAA;AAAA,EAC1E;AAAA,EAES,OAAO,GAAA,EAAqC;AACnD,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU;AACrC,IAAA,MAAM,IAAA,GAAO,OAAO,CAAA,IAAK,CAAA;AACzB,IAAA,MAAM,OAAA,GAAU,KAAK,gBAAA,EAAiB;AACtC,IAAA,MAAM,EAAE,MAAA,EAAQ,aAAA,EAAe,SAAA,EAAW,cAAA,KAAmB,IAAA,CAAK,OAAA;AAClE,IAAA,UAAA,CAAW,GAAA,EAAK,MAAA,EAAQ,CAAC,CAAA,KAAM;AAC7B,MAAA,CAAA,CAAE,YAAY,SAAA,GAAY,IAAA;AAC1B,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,MAAM,SAAA,GAAY,QAAQ,UAAA,KAAe,SAAA;AACzC,QAAA,MAAM,CAAA,GAAA,CAAK,SAAA,GAAY,aAAA,GAAgB,MAAA,IAAU,IAAA;AACjD,QAAA,CAAA,CAAE,WAAA,GAAc,YAAY,cAAA,GAAiB,CAAA;AAG7C,QAAA,CAAA,CAAE,SAAA,GAAY,SAAA,GAAY,OAAA,CAAQ,MAAA,GAAS,OAAA,CAAQ,IAAA;AACnD,QAAA,CAAA,CAAE,cAAc,OAAA,CAAQ,MAAA;AACxB,QAAA,CAAA,CAAE,SAAA,EAAU;AACZ,QAAA,CAAA,CAAE,GAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AACzD,QAAA,CAAA,CAAE,IAAA,EAAK;AACP,QAAA,IAAI,CAAC,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO;AAAA,MAC3B;AACA,MAAA,CAAA,CAAE,WAAA,GAAc,CAAA;AAAA,IAClB,CAAC,CAAA;AAAA,EACH;AACF;ACnIO,IAAM,sCAAA,GAA0E;AAAA,EACrF,SAAA,EAAW,CAAA;AAAA,EACX,QAAA,EAAU,CAAA;AAAA,EACV,uBAAA,EAAyB,CAAC,OAAA,EAAkB,KAAA,EAAgB,SAAA,MAA4B;AAAA,IACtF,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA,CAAE;AAAA,GACjC;AACF;AAGO,IAAM,wBAAA,GAAN,cAAuCD,WAAAA,CAAqD;AAAA,EACjG,OAAgB,IAAA,GAAO,eAAA;AAAA,EACvB,OAAgB,MAAA,GAAS,EAAA;AAAA,EACzB,OAAgB,OAAA,GAA2C,sCAAA;AAAA,EAElD,QAAA,GAAoB;AAC3B,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,QAAA,GAAW,MAAA,GAAS,CAAA;AAAA,EAC/C;AAAA,EAES,WAAA,GAAwC;AAC/C,IAAA,OAAO,KAAK,MAAA,CAAO,KAAA,CAAM,UAAS,CAAE,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MACjD,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,IAAA,EAAM,eAAA;AAAA,MACN,QAAQ,IAAA,CAAK;AAAA,KACf,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA,EAGS,WAAA,GAAsC;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,gBAAA,GAA0D;AACxD,IAAA,OAAOC,wBAA+D,IAAI,CAAA;AAAA,EAC5E;AAAA,EAES,OAAO,GAAA,EAAqC;AACnD,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU;AACrC,IAAA,MAAM,IAAA,GAAO,OAAO,CAAA,IAAK,CAAA;AACzB,IAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAS,GAAI,IAAA,CAAK,OAAA;AACrC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,EAAiB,CAAE,KAAA;AACtC,IAAA,UAAA,CAAW,GAAA,EAAK,MAAA,EAAQ,CAAC,CAAA,KAAM;AAC7B,MAAA,CAAA,CAAE,WAAA,GAAc,KAAA;AAChB,MAAA,CAAA,CAAE,SAAA,GAAY,QAAA,CAAS,SAAA,EAAW,IAAI,CAAA;AACtC,MAAA,CAAA,CAAE,OAAA,GAAU,OAAA;AACZ,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,EAAU,IAAI,CAAA;AACnC,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,aAAA,CAAc,CAAA,EAAG,QAAQ,MAAM,CAAA;AAC/B,QAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,MAAA,EAAQ,UAAA,CAAW,GAAG,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACvE,QAAA,CAAA,CAAE,MAAA,EAAO;AAAA,MACX;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF;;;AClDO,IAAM,mBAAA,GAA8D;AAAA,EACzE,qCAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,yBAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,4BAAA;AAAA,EACA,wBAAA;AAAA,EACA,oBAAA;AAAA,EACA,2BAAA;AAAA,EACA,mBAAA;AAAA,EACA,+BAAA;AAAA,EACA,8BAAA;AAAA,EACA,sBAAA;AAAA,EACA,6BAAA;AAAA,EACA;AACF;ACjDA,SAAS,QAAA,CAAS,OAAe,CAAC,KAAA,EAAO,KAAK,CAAA,EAAqB,CAAC,MAAA,EAAQ,MAAM,CAAA,EAA6B;AAC7G,EAAA,IAAI,KAAA,KAAU,OAAO,OAAO,MAAA;AAC5B,EAAA,MAAM,CAAA,GAAA,CAAK,KAAA,GAAQ,KAAA,KAAU,KAAA,GAAQ,KAAA,CAAA;AACrC,EAAA,MAAM,GAAA,GAAM,MAAA,GAAS,CAAA,IAAK,MAAA,GAAS,MAAA,CAAA;AACnC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,QAAQ,MAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAK,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AACnF;AA6BA,IAAM,cAAA,GAAiB,EAAE,QAAA,EAAU,CAAA,EAAG,UAAU,EAAA,EAAI,SAAA,EAAW,GAAA,EAAK,SAAA,EAAW,GAAA,EAAI;AAO5E,SAAS,cAAA,CAAe;AAAA,EAC7B,WAAW,cAAA,CAAe,QAAA;AAAA,EAC1B,WAAW,cAAA,CAAe,QAAA;AAAA,EAC1B,YAAY,cAAA,CAAe,SAAA;AAAA,EAC3B,YAAY,cAAA,CAAe,SAAA;AAAA,EAC3B,KAAA,GAAQ,OAAA;AAAA,EACR;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,MAAA,GAASE,OAAuB,IAAI,CAAA;AAC1C,EAAA,MAAM,OAAA,GAAUA,OAA0B,IAAI,CAAA;AAC9C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,KAAK,MAAA,CAAO,OAAA;AAClB,IAAA,IAAI,CAAC,EAAA,IAAM,OAAO,cAAA,KAAmB,WAAA,EAAa;AAClD,IAAA,MAAM,SAAS,MAAM,QAAA,CAAS,EAAA,CAAG,qBAAA,GAAwB,KAAK,CAAA;AAC9D,IAAA,MAAA,EAAO;AACP,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,MAAM,CAAA;AACpC,IAAA,EAAA,CAAG,QAAQ,EAAE,CAAA;AACb,IAAA,OAAO,MAAM,GAAG,UAAA,EAAW;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AAIvC,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,SAAS,SAAA,EAAW,CAAC,SAAA,EAAW,SAAS,CAAA,EAAG,CAAC,QAAA,EAAU,QAAQ,CAAC,CAAC,CAAA;AACzG,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,cAAc,CAAC,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,WAAA,GAAc,CAAC,CAAA;AAE5C,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,MAAA;AAAA,MACL,SAAA,EAAU,iCAAA;AAAA,MACV,IAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAe,oBAAA;AAAA,MAEd,QAAA,EAAA;AAAA,QAAA,MAAA;AAAA,QACA,SAAS,MAAA,GAAS,CAAA,mBACjB,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,eAAA,EACd,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,cAAA;AAAA,cACV,YAAA,EAAW,YAAA;AAAA,cACX,cAAA,EAAa,YAAA;AAAA,cACb,eAAA,EAAe,QAAA;AAAA,cACf,SAAS,MAAM,WAAA,CAAY,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,cAEpC,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,cAAA,EAAe;AAAA;AAAA,WAC5B;AAAA,0BACA,GAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAW,OAAA,EAAS,IAAA,EAAM,UAAU,OAAA,EAAS,MAAM,WAAA,CAAY,KAAK,CAAA,EAAG,KAAA,EAAM,cAAa,MAAA,EAAO,OAAA,EACxG,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,OAAA,EAAS,MAAM,WAAA,CAAY,KAAK,CAAA,EACxE,QAAA,EAAA,QAAA,EACH,CAAA,EACF;AAAA,SAAA,EACF,CAAA,GACE;AAAA;AAAA;AAAA,GACN;AAEJ;AAiBO,SAAS,kBAAA,CAAmB,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,QAAA,EAAU,UAAA,EAAY,MAAA,GAAS,SAAA,EAAW,QAAA,EAAU,IAAA,EAAK,EAA4B;AAE9I,EAAA,MAAM,QAAQ,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,OAAO,IAAI,CAAA;AAC9D,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU,cAAA;AAAA,MACV,WAAA,EAAW,EAAA;AAAA,MACX,YAAA,EAAY,KAAA;AAAA,MACZ,cAAA,EAAc,KAAA;AAAA,MACb,GAAI,MAAM,EAAE,eAAA,EAAiB,SAAS,GAAG,CAAA,KAAM,EAAC;AAAA,MAChD,GAAI,UAAA,KAAe,MAAA,GAAY,EAAC,GAAI,EAAE,gBAAgB,UAAA,EAAW;AAAA,MACjE,GAAI,QAAA,GAAW,EAAE,QAAA,EAAU,IAAA,KAAS,EAAC;AAAA,MACtC,OAAA,EAAS,MAAM,QAAA,CAAS,MAAM,CAAA;AAAA,MAE7B,kCAAQ,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,IAAA,EAAkB,oBAAK,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAsB,gBAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,aAAY,EAAE;AAAA;AAAA,GACpH;AAEJ;AAGA,SAAS,SAAS,GAAA,EAAqB;AACrC,EAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA,EAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AACtD;AChIA,IAAM,cAAA,mBAAiB,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,QAAQ,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAC,CAAA;AAE/E,IAAM,gBAAgB,cAAA,CAAe,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,OAAO,CAAA;AAChE,IAAM,KAAA,GAAqB,CAAC,MAAA,EAAQ,MAAA,EAAQ,SAAS,SAAS,CAAA;AAC9D,IAAM,MAAA,GAAsB,CAAC,MAAA,EAAQ,OAAA,EAAS,UAAU,QAAQ,CAAA;AAChE,IAAM,KAAA,GAAqB,CAAC,GAAA,EAAK,GAAA,EAAK,KAAK,IAAI,CAAA;AAC/C,IAAM,KAAA,GAAqB,CAAC,MAAA,EAAQ,MAAA,EAAQ,SAAS,MAAM,CAAA;AAC3D,IAAM,QAAA,GAA0B,CAAC,OAAA,EAAS,QAAA,EAAU,KAAK,CAAA;AACzD,IAAM,QAAA,GAA0B,CAAC,OAAA,EAAS,QAAA,EAAU,KAAK,CAAA;AAEzD,IAAM,SAAA,GAAsC,EAAE,IAAA,EAAM,WAAA,EAAa,MAAM,WAAA,EAAa,KAAA,EAAO,YAAA,EAAc,OAAA,EAAS,cAAA,EAAe;AACjI,IAAM,eAAyC,EAAE,KAAA,EAAO,cAAc,MAAA,EAAQ,cAAA,EAAgB,KAAK,aAAA,EAAc;AACjH,IAAM,eAAyC,EAAE,KAAA,EAAO,cAAc,MAAA,EAAQ,eAAA,EAAiB,KAAK,eAAA,EAAgB;AACpH,IAAM,gBAAwC,EAAE,KAAA,EAAO,cAAc,MAAA,EAAQ,cAAA,EAAgB,KAAK,aAAA,EAAc;AAChH,IAAM,gBAAwC,EAAE,KAAA,EAAO,aAAa,MAAA,EAAQ,cAAA,EAAgB,KAAK,cAAA,EAAe;AAEhH,SAAS,UAAU,CAAA,EAAmB;AACpC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAA;AACrE;AAgCA,IAAM,OAAA,GAA8B;AAAA,EAClC,KAAA,EAAO,KAAA;AAAA,EACP,KAAA,EAAO,KAAA;AAAA,EACP,UAAA,EAAY,KAAA;AAAA,EACZ,IAAA,EAAM,KAAA;AAAA,EACN,IAAA,EAAM,KAAA;AAAA,EACN,IAAA,EAAM,KAAA;AAAA,EACN,IAAA,EAAM,KAAA;AAAA,EACN,KAAA,EAAO,KAAA;AAAA,EACP,aAAA,EAAe,KAAA;AAAA,EACf,OAAA,EAAS;AACX,CAAA;AAGO,SAAS,sBAAsB,MAAA,EAAoC;AACxE,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,mBAAA,EAAoB,CAAE,MAAA,GAAS,CAAA;AAC3D,EAAA,MAAM,MAAA,GAAS,OAAO,gBAAA,EAAiB;AAGvC,EAAA,MAAM,OAAA,GAAmC,YAAA,GACrC,IAAI,GAAA,CAAI,MAAA,CAAO,iBAAgB,CAAE,IAAA,EAAM,CAAA,GACvC,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA,GACvB,IAAI,GAAA,CAAI,MAAA,CAAO,oBAAA,CAAqB,MAAM,EAAE,MAAA,EAAQ,CAAA,mBACpD,IAAI,GAAA,EAAI;AACd,EAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,CAAA,IAAK,CAAC,cAAc,OAAO,OAAA;AAChD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AAAA,IACnC,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,iBAAiB,CAAA;AAAA,IACpC,UAAA,EAAY,OAAA,CAAQ,GAAA,CAAI,sBAAsB,CAAA;AAAA,IAC9C,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AAAA,IAClC,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AAAA,IAClC,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AAAA,IAClC,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AAAA,IAClC,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,2BAA2B,CAAA;AAAA,IAC9C,aAAA,EAAe,OAAA,CAAQ,GAAA,CAAI,yBAAyB,CAAA;AAAA,IACpD,OAAA,EAAS;AAAA,GACX;AACF;AAGO,SAAS,mBAAmB,CAAA,EAAgC;AACjE,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAE,KAAK,OAAO,CAAA;AACtC;AAOA,SAAS,SAAA,GAAY;AACnB,EAAA,uBACEC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,MAAM,EAAA,EAAI,CAAA;AAAA,IAAE;AAAA,GAAA,EAEjC,CAAA;AAEJ;AAEA,SAAS,GAAA,CAAI,EAAE,KAAA,EAAO,KAAA,EAAO,UAAS,EAA2D;AAC/F,EAAA,uBACED,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,UAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MACZ,KAAA,mBAAQA,GAAAA,CAAC,SAAA,EAAA,EAAU,CAAA,GAAK;AAAA,KAAA,EAC3B,CAAA;AAAA,oBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAe,IAAA,EAAK,YAAA,EAAa,YAAA,EAAY,KAAA,EACzD,QAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAGA,SAAS,KAAA,CAAM,EAAE,QAAA,EAAS,EAA4B;AACpD,EAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAkB,QAAA,EAAS,CAAA;AACnD;AAUA,SAAS,OAAU,EAAE,KAAA,EAAO,SAAS,KAAA,EAAO,MAAA,EAAQ,UAAS,EAAmB;AAC9E,EAAA,MAAM,MAAA,GAAS,OAAA,EAAS,IAAA,KAAS,QAAA,IAAY,QAAQ,KAAA,KAAU,KAAA;AAC/D,EAAA,uBACEA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,IAAA,EAAK,OAAA,EAAQ,WAAU,cAAA,EAAe,YAAA,EAAY,OAAO,cAAA,EAAc,MAAA,EAAQ,gBAAc,KAAA,EAAO,OAAA,EAAS,MAAM,MAAA,CAAO,KAAK,GAClJ,QAAA,EACH,CAAA;AAEJ;AAEA,SAAS,QAAA,CAAS,EAAE,KAAA,EAAO,OAAA,EAAS,QAAO,EAAqG;AAC9I,EAAA,uBACED,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,UAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MACZ,SAAS,IAAA,KAAS,OAAA,mBAAUA,GAAAA,CAAC,aAAU,CAAA,GAAK;AAAA,KAAA,EAC/C,CAAA;AAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAoB,IAAA,EAAK,YAAA,EAAa,YAAA,EAAY,KAAA,EAC9D,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,sBAClBA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,OAAA;AAAA,QACL,SAAA,EAAU,iBAAA;AAAA,QACV,YAAA,EAAY,UAAU,CAAC,CAAA;AAAA,QACvB,cAAA,EAAc,OAAA,EAAS,IAAA,KAAS,QAAA,IAAY,QAAQ,KAAA,KAAU,CAAA;AAAA,QAC9D,cAAA,EAAc,UAAU,CAAC,CAAA;AAAA,QACzB,OAAA,EAAS,MAAM,MAAA,CAAO,CAAC,CAAA;AAAA,QAEvB,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,CAAC,yBAAmC,GAAG,WAAA,CAAY,CAAC,CAAA,CAAE,KAAA,EAAM,EAAG;AAAA,OAAA;AAAA,MATzE;AAAA,KAWR,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAOA,SAAS,WAAA,CAAY,EAAE,OAAA,EAAS,MAAA,EAAO,EAA4F;AACjI,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIH,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,GAAA,GAAMD,OAA0B,IAAI,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,IAAA,KAAS,QAAA,GAAW,QAAQ,KAAA,GAAQ,IAAA;AAC3D,EAAA,uBACEG,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,MACV,SAAS,IAAA,KAAS,OAAA,mBAAUA,GAAAA,CAAC,aAAU,CAAA,GAAK;AAAA,KAAA,EAC/C,CAAA;AAAA,oBACAD,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,iBAAA;AAAA,QACV,eAAA,EAAc,MAAA;AAAA,QACd,eAAA,EAAe,IAAA;AAAA,QACf,cAAY,KAAA,GAAQ,CAAA,OAAA,EAAU,SAAA,CAAU,KAAK,CAAC,CAAA,CAAA,GAAK,OAAA;AAAA,QACnD,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QAEhC,QAAA,EAAA;AAAA,0BAAAA,KAAC,MAAA,EAAA,EACE,QAAA,EAAA;AAAA,YAAA,KAAA,mBAAQC,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,CAAA,mBAAKA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,CAAA;AAAA,YAC5D,KAAA,GAAQ,SAAA,CAAU,KAAK,CAAA,GAAI;AAAA,WAAA,EAC9B,CAAA;AAAA,0BACAA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAM,OAAO,YAAA,GAAe,cAAA,EAAgB,MAAM,EAAA,EAAI;AAAA;AAAA;AAAA,KAC9D;AAAA,oBACAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,WAAW,GAAA,EAAK,IAAA,EAAY,SAAS,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,KAAA,EAAM,SAAQ,MAAA,EAAO,OAAA,EACtF,0BAAgB,GAAA,CAAI,CAAC,yBACpBA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,eAAA;AAAA,QACL,SAAA,EAAU,cAAA;AAAA,QACV,YAAA,EAAY,UAAU,IAAI,CAAA;AAAA,QAC1B,gBAAc,KAAA,KAAU,IAAA;AAAA,QACxB,cAAA,EAAc,UAAU,IAAI,CAAA;AAAA,QAC5B,SAAS,MAAM;AACb,UAAA,MAAA,CAAO,IAAI,CAAA;AACX,UAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,QACf,CAAA;AAAA,QAEA,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,CAAA,IAAA,EAAO,IAAI,CAAA,CAAA,EAAI;AAAA,OAAA;AAAA,MAZtB;AAAA,KAcR,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,MAAA,EAAO,EAAuB;AAClD,EAAA,MAAM,MAAA,GAAS,OAAO,iBAAA,EAAkB;AACxC,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,CAAC,CAAA,CAAG,OAAA;AACzB,EAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,KAAK,CAAA;AACpD,EAAA,MAAM,KAAA,GAAQ,QAAQ,CAAA,GAAI,KAAA;AAC1B,EAAA,uBACED,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,MACZ,wBAAQA,GAAAA,CAAC,aAAU,CAAA,mBAAKD,KAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,KAAA,CAAM,QAAQ,GAAG,CAAA;AAAA,QAAE;AAAA,OAAA,EAAC;AAAA,KAAA,EAC3D,CAAA;AAAA,oBACAC,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,OAAA;AAAA,QACL,SAAA,EAAU,iBAAA;AAAA,QACV,GAAA,EAAK,GAAA;AAAA,QACL,GAAA,EAAK,CAAA;AAAA,QACL,IAAA,EAAM,IAAA;AAAA,QACN,KAAA;AAAA,QACA,YAAA,EAAW,SAAA;AAAA,QACX,aAAA,EAAe,MAAM,MAAA,CAAO,wBAAA,CAAyB,SAAS,CAAA;AAAA,QAC9D,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,UAAA,MAAM,OAAA,GAAU,MAAA,CAAO,CAAA,CAAE,aAAA,CAAc,KAAK,CAAA;AAC5C,UAAA,MAAA,CAAO,aAAa,MAAA,CAAO,iBAAA,EAAkB,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,EAAA,EAAI,CAAA,CAAE,IAAI,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,OAAA,GAAU,CAAC,CAAA;AAAA,QAClG;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAaO,IAAM,UAAA,GAAa,KAAA,CAAM,SAASC,WAAAA,GAAa;AACpD,EAAA,MAAM,SAASC,SAAAA,EAAU;AACzB,EAAA,MAAM,QAAA,GAAW,sBAAsB,MAAM,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,OAAO,eAAA,EAAgB;AACtC,EAAA,IAAI,CAAC,kBAAA,CAAmB,QAAQ,CAAA,EAAG,OAAO,IAAA;AAE1C,EAAA,MAAM,QAAA,GAAW,CAAK,KAAA,EAAqB,KAAA,KAAa;AACtD,IAAA,MAAA,CAAO,yBAAyB,OAAO,CAAA;AACvC,IAAA,MAAA,CAAO,yBAAA,CAA0B,OAAO,KAAK,CAAA;AAC7C,IAAA,MAAA,CAAO,qBAAA,CAAsB,OAAO,KAAK,CAAA;AAAA,EAC3C,CAAA;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,GAAA,KAAsB;AACrC,IAAA,QAAA,CAAS,kBAAkB,GAAG,CAAA;AAE9B,IAAA,IAAI,MAAA,CAAO,gBAAA,EAAiB,KAAM,KAAA,EAAO,MAAA,CAAO,cAAA,CAAe,KAAA,EAAO,EAAE,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,EAC5F,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,IAAA,IAAQ,QAAA,CAAS,QAAQ,QAAA,CAAS,IAAA;AAC/D,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,IAAA,IAAQ,QAAA,CAAS,SAAS,QAAA,CAAS,aAAA;AAE9D,EAAA,uBACEH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EAAqC,YAAA,EAAW,OAAA,EAAQ,aAAA,EAAe,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB,EAC5G,QAAA,EAAA;AAAA,IAAA,QAAA,CAAS,KAAA,mBACRC,GAAAA,CAAC,KAAA,EAAA,EACC,0BAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,OAAA,EAAS,MAAA,CAAO,IAAI,gBAAgB,CAAA,EAAG,MAAA,EAAQ,OAAA,EAAS,GACvE,CAAA,GACE,IAAA;AAAA,IAEH,SAAS,KAAA,IAAS,QAAA,CAAS,UAAA,mBAC1BD,KAAC,KAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,QAAA,CAAS,wBAAQC,GAAAA,CAAC,YAAS,KAAA,EAAM,OAAA,EAAQ,SAAS,MAAA,CAAO,GAAA,CAAI,iBAAiB,CAAA,EAAG,QAAQ,CAAC,CAAA,KAAM,SAAS,iBAAA,EAAmB,CAAC,GAAG,CAAA,GAAK,IAAA;AAAA,MACrI,SAAS,UAAA,mBAAaA,IAAC,QAAA,EAAA,EAAS,KAAA,EAAM,SAAQ,OAAA,EAAS,MAAA,CAAO,IAAI,sBAAsB,CAAA,EAAG,QAAQ,CAAC,CAAA,KAAM,SAAS,sBAAA,EAAwB,CAAC,GAAG,CAAA,GAAK;AAAA,KAAA,EACvJ,CAAA,GACE,IAAA;AAAA,IAEH,WAAA,mBACCD,IAAAA,CAAC,KAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,QAAA,CAAS,IAAA,mBACRC,GAAAA,CAAC,GAAA,EAAA,EAAI,OAAM,MAAA,EAAO,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,gBAAgB,CAAA,EAAG,SAAS,OAAA,EAC7D,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBACVA,IAAC,MAAA,EAAA,EAAe,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,gBAAgB,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,SAAA,CAAU,CAAC,CAAC,SAAS,MAAA,EAAQ,CAAC,CAAA,KAAM,QAAA,CAAS,gBAAA,EAAkB,CAAC,GACzI,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,SAAA,CAAU,CAAC,GAAI,CAAA,EAAA,EADhB,CAEb,CACD,CAAA,EACH,CAAA,GACE,IAAA;AAAA,MACH,QAAA,CAAS,IAAA,mBACRA,GAAAA,CAAC,GAAA,EAAA,EAAI,OAAM,MAAA,EAAO,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,gBAAgB,CAAA,EAAG,SAAS,OAAA,EAC7D,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,qBACXA,IAAC,MAAA,EAAA,EAAe,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,gBAAgB,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,SAAA,CAAU,CAAC,CAAC,SAAS,MAAA,EAAQ,CAAC,CAAA,KAAM,QAAA,CAAS,gBAAA,EAAkB,CAAC,GACzI,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,CAAA,KAAA,EAAQ,CAAC,IAAI,CAAA,EAAA,EADd,CAEb,CACD,CAAA,EACH,CAAA,GACE,IAAA;AAAA,MACH,QAAA,CAAS,IAAA,mBACRA,GAAAA,CAAC,GAAA,EAAA,EAAI,OAAM,MAAA,EAAO,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,gBAAgB,CAAA,EAAG,SAAS,OAAA,EAC7D,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBACVA,IAAC,MAAA,EAAA,EAAe,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,gBAAgB,CAAA,EAAG,KAAA,EAAO,CAAA,KAAA,EAAQ,CAAA,CAAE,WAAA,EAAa,IAAI,MAAA,EAAQ,CAAC,CAAA,KAAM,QAAA,CAAS,gBAAA,EAAkB,CAAC,GAC5I,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,CAAA,KAAA,EAAQ,CAAC,IAAI,CAAA,EAAA,EADd,CAEb,CACD,CAAA,EACH,CAAA,GACE;AAAA,KAAA,EACN,CAAA,GACE,IAAA;AAAA,IAEH,SAAA,mBACCD,IAAAA,CAAC,KAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,QAAA,CAAS,IAAA,mBACRC,GAAAA,CAAC,GAAA,EAAA,EAAI,OAAM,MAAA,EAAO,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,gBAAgB,CAAA,EAAG,SAAS,OAAA,EAC7D,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBACVA,IAAC,MAAA,EAAA,EAAe,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,gBAAgB,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,SAAA,CAAU,CAAC,CAAC,SAAS,MAAA,EAAQ,CAAC,CAAA,KAAM,QAAA,CAAS,gBAAA,EAAkB,CAAC,GACzI,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,CAAA,KAAA,EAAQ,CAAC,IAAI,CAAA,EAAA,EADd,CAEb,CACD,CAAA,EACH,CAAA,GACE,IAAA;AAAA,MAGH,SAAS,KAAA,IAAS,QAAA,CAAS,aAAA,mBAC1BD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,UACV,MAAA,CAAO,GAAA,CAAI,2BAA2B,CAAA,EAAG,SAAS,OAAA,IAAW,MAAA,CAAO,GAAA,CAAI,yBAAyB,GAAG,IAAA,KAAS,OAAA,mBAAUA,GAAAA,CAAC,aAAU,CAAA,GAAK;AAAA,SAAA,EAC1I,CAAA;AAAA,wBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACZ,QAAA,EAAA;AAAA,UAAA,QAAA,CAAS,KAAA,mBACRC,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,cAAA,EAAe,IAAA,EAAK,cAAa,YAAA,EAAW,kBAAA,EACxD,mBAAS,GAAA,CAAI,CAAC,sBACbA,GAAAA,CAAC,UAAe,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,2BAA2B,GAAG,KAAA,EAAO,aAAA,CAAc,CAAC,CAAA,EAAI,MAAA,EAAQ,CAAC,CAAA,KAAM,QAAA,CAAS,6BAA6B,CAAC,CAAA,EAC1J,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,MAAM,YAAA,CAAa,CAAC,GAAI,CAAA,EAAA,EADnB,CAEb,CACD,CAAA,EACH,CAAA,GACE,IAAA;AAAA,UACH,QAAA,CAAS,gCACRA,GAAAA,CAAC,SAAI,SAAA,EAAU,cAAA,EAAe,MAAK,YAAA,EAAa,YAAA,EAAW,kBACxD,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,qBACbA,IAAC,MAAA,EAAA,EAAe,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,yBAAyB,CAAA,EAAG,KAAA,EAAO,cAAc,CAAC,CAAA,EAAI,QAAQ,CAAC,CAAA,KAAM,QAAA,CAAS,yBAAA,EAA2B,CAAC,CAAA,EACtJ,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,MAAM,YAAA,CAAa,CAAC,GAAI,CAAA,EAAA,EADnB,CAEb,CACD,CAAA,EACH,CAAA,GACE;AAAA,SAAA,EACN;AAAA,OAAA,EACF,CAAA,GACE;AAAA,KAAA,EACN,CAAA,GACE,IAAA;AAAA,IAEH,QAAA,CAAS,OAAA,mBACRA,GAAAA,CAAC,KAAA,EAAA,EACC,0BAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,MAAA,EAAgB,CAAA,EAC9B,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ,CAAC;AC7XM,IAAM,cAAA,GAAsD;AAAA,EACjE;AAAA,IACE,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,UAAU,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,YAAY,IAAA,EAAK;AAAA,IAC3G,EAAE,EAAA,EAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,YAAY,IAAA;AAAK,GACrG;AAAA,EACA;AAAA,IACE,EAAE,EAAA,EAAI,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,GAAA,EAAK,GAAA,EAAK,OAAA,EAAQ;AAAA,IACrF,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,GAAA,EAAK,GAAA,EAAK,GAAA;AAAI,GAC3F;AAAA,EACA;AAAA,IACE,EAAE,EAAA,EAAI,WAAA,EAAa,IAAA,EAAM,OAAO,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,WAAA,EAAa,QAAA,EAAU,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAK,WAAA,EAAY;AAAA,IACrH,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,OAAO,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAK,SAAA,EAAU;AAAA,IAC7G,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,KAAA,EAAO,MAAM,cAAA,EAAgB,KAAA,EAAO,UAAA,EAAY,GAAA,EAAK,UAAA,EAAW;AAAA,IACxF,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,aAAA,EAAe,KAAA,EAAO,SAAA,EAAW,GAAA,EAAK,SAAA,EAAU;AAAA,IACpF,EAAE,EAAA,EAAI,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,MAAM,UAAA,EAAY,KAAA,EAAO,MAAA,EAAQ,GAAA,EAAK,MAAA;AAAO,GAC1E;AAAA,EACA;AAAA,IACE,EAAE,EAAA,EAAI,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,GAAA,EAAK,GAAA,EAAK,GAAA,EAAI;AAAA,IACjF,EAAE,EAAA,EAAI,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,GAAA,EAAK,GAAA,EAAK,GAAA,EAAI;AAAA,IACjF,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,SAAS,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,UAAU,IAAA,EAAK;AAAA,IACrG,EAAE,EAAA,EAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,UAAU,IAAA,EAAK;AAAA,IACjG,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,SAAS,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,UAAU,IAAA;AAAK;AAEzG;AAGO,IAAM,iBAAA,GAA6C,cAAA,CAAe,IAAA,EAAK,CAC3E,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,GAAG,CAAA,CAChB,MAAA,CAAO,CAAC,CAAA,KAAyB,MAAM,MAAS;AAG5C,IAAM,cAAA,GAA0CG,gBAAgB,MAAA,CAAO,CAAC,MAAM,CAAC,iBAAA,CAAkB,QAAA,CAAS,CAAC,CAAC;AC9CnH,SAASC,WAAU,CAAA,EAAmB;AACpC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAA;AACrE;AAGO,SAAS,kBAAkB,MAAA,EAA6B;AAC7D,EAAA,OAAO,IAAI,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,IAAA,CAAK,QAAA,IAAY,EAAE,CAAC,CAAA;AACxD;AAEA,SAAS,QAAA,CAAS,QAAgB,IAAA,EAAiC;AACjE,EAAA,OAAO;AAAA,IACL,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,GAAI,KAAK,GAAA,KAAQ,MAAA,GAAY,EAAC,GAAI,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAI;AAAA,IAClD,GAAI,KAAK,UAAA,KAAe,MAAA,GAAY,EAAC,GAAI,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAW;AAAA,IACvE,GAAI,IAAA,CAAK,GAAA,KAAQ,MAAA,GAAY,EAAC,GAAI,EAAE,IAAA,EAAM,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAI,EAAE;AAAA,IAC5D,UAAU,MAAM;AACd,MAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAW;AAC1B,QAAA,MAAA,CAAO,cAAA,CAAe,KAAK,IAAI,CAAA;AAC/B,QAAA;AAAA,MACF;AAGA,MAAA,MAAA,CAAO,qBAAA,CAAsBC,gBAAAA,EAAkB,IAAA,CAAK,GAAG,CAAA;AACvD,MAAA,MAAA,CAAO,cAAA,CAAe,OAAO,EAAE,GAAA,EAAK,KAAK,GAAA,EAAK,KAAA,EAAO,MAAM,CAAA;AAAA,IAC7D;AAAA,GACF;AACF;AAQO,SAAS,sBAAsB,MAAA,EAAsC;AAC1E,EAAA,MAAM,SAAA,GAAY,kBAAkB,MAAM,CAAA;AAC1C,EAAA,MAAM,QAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,IAAA,IAAQ,cAAA,CAAe,IAAA,EAAK,EAAG;AACxC,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AAC/B,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,GAAI,QAAA,CAAS,QAAQ,IAAI,CAAA;AAAA,EACxC;AACA,EAAA,IAAI,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG;AACxB,IAAA,KAAA,MAAW,QAAQ,cAAA,EAAgB;AACjC,MAAA,KAAA,CAAM,IAAI,CAAA,GAAI,QAAA,CAAS,QAAQ,EAAE,EAAA,EAAI,MAAM,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA,IAAA,EAAO,IAAI,IAAI,KAAA,EAAOD,UAAAA,CAAU,IAAI,CAAA,EAAG,GAAA,EAAK,MAAM,CAAA;AAAA,IAClH;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAkBO,SAAS,wBAAwB,MAAA,EAAwC;AAC9E,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,mBAAA,EAAoB;AAElD,EAAA,MAAM,IAAA,GAAO,CACX,EAAA,EACA,KAAA,EACA,QAAA,EACA,KAAA,GAAoE,EAAC,MACjD,EAAE,EAAA,EAAI,KAAA,EAAO,QAAA,EAAU,GAAG,KAAA,EAAM,CAAA;AAEtD,EAAA,MAAM,KAAA,GAA0B;AAAA;AAAA,IAE9B,IAAA,CAAK,MAAA,EAAQ,MAAA,EAAQ,MAAM,KAAK,MAAA,CAAO,IAAA,EAAK,EAAG,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,SAAS,CAAA;AAAA,IAC7E,IAAA,CAAK,MAAA,EAAQ,MAAA,EAAQ,MAAM,KAAK,MAAA,CAAO,IAAA,EAAK,EAAG,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,eAAe,CAAA;AAAA;AAAA,IAGnF,IAAA,CAAK,SAAA,EAAW,SAAA,EAAW,MAAM,KAAK,MAAA,CAAO,MAAA,EAAO,EAAG,EAAE,MAAM,SAAA,EAAW,GAAA,EAAK,OAAA,EAAS,UAAA,EAAY,MAAM,CAAA;AAAA,IAC1G,IAAA,CAAK,UAAA,EAAY,UAAA,EAAY,MAAM,KAAK,MAAA,CAAO,OAAA,EAAQ,EAAG,EAAE,MAAM,UAAA,EAAY,GAAA,EAAK,OAAA,EAAS,UAAA,EAAY,MAAM,CAAA;AAAA,IAC9G,IAAA,CAAK,YAAA,EAAc,YAAA,EAAc,MAAM,KAAK,MAAA,CAAO,SAAA,EAAU,EAAG,EAAE,MAAM,UAAA,EAAY,GAAA,EAAK,OAAA,EAAS,UAAA,EAAY,MAAM,CAAA;AAAA,IACpH,IAAA,CAAK,aAAA,EAAe,aAAA,EAAe,MAAM,KAAK,MAAA,CAAO,SAAA,EAAU,EAAG,EAAE,MAAM,UAAA,EAAY,GAAA,EAAK,OAAA,EAAS,UAAA,EAAY,MAAM,CAAA;AAAA,IACtH,IAAA,CAAK,mBAAA,EAAqB,mBAAA,EAAqB,MAAM,KAAK,MAAA,CAAO,eAAA,EAAgB,EAAG,EAAE,MAAM,UAAA,EAAY,GAAA,EAAK,OAAA,EAAS,UAAA,EAAY,MAAM,CAAA;AAAA;AAAA,IAGxI,IAAA,CAAK,YAAA,EAAc,YAAA,EAAc,MAAM,KAAK,MAAA,CAAO,SAAA,EAAU,EAAG,EAAE,GAAA,EAAK,OAAA,EAAS,UAAA,EAAY,MAAM,CAAA;AAAA,IAClG,IAAA,CAAK,aAAA,EAAe,aAAA,EAAe,MAAM,KAAK,MAAA,CAAO,UAAA,EAAW,EAAG,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA;AAAA,IACvF,IAAA,CAAK,QAAA,EAAU,QAAA,EAAU,MAAM,KAAK,MAAA,CAAO,YAAA,CAAa,QAAA,EAAU,GAAG,EAAE,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,oBAAoB,CAAA;AAAA,IAC/G,IAAA,CAAK,WAAA,EAAa,WAAA,EAAa,MAAM,KAAK,MAAA,CAAO,eAAA,CAAgB,QAAA,EAAU,GAAG,EAAE,IAAA,EAAM,WAAA,EAAa,GAAA,EAAK,SAAS,CAAA;AAAA,IACjH,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,MAAM,KAAK,MAAA,CAAO,WAAA,CAAY,QAAA,EAAU,GAAG,EAAE,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,SAAS,CAAA;AAAA,IACjG,IAAA,CAAK,SAAA,EAAW,SAAA,EAAW,MAAM,KAAK,MAAA,CAAO,aAAA,CAAc,QAAA,EAAU,GAAG,EAAE,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,eAAe,CAAA;AAAA,IAC/G,IAAA,CAAK,aAAA,EAAe,aAAA,EAAe,MAAM,KAAK,MAAA,CAAO,UAAA,CAAW,QAAA,EAAU,GAAG,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,WAAW,CAAA;AAAA,IAC7G,IAAA,CAAK,YAAA,EAAc,YAAA,EAAc,MAAM;AACrC,MAAA,MAAM,MAAA,GAAS,OAAO,oBAAA,EAAqB,CAAE,OAAO,CAAC,KAAA,KAAU,MAAM,QAAQ,CAAA;AAC7E,MAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,EAAE,CAAC,CAAA;AAAA,IAC1E,CAAA,EAAG,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA;AAAA,IACrB,IAAA,CAAK,WAAA,EAAa,kBAAA,EAAoB,MAAM,KAAK,MAAA,CAAO,cAAA,CAAe,QAAA,EAAS,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAC,CAAA;AAAA,IAC/F,IAAA,CAAK,YAAA,EAAc,0BAAA,EAA4B,MAAM,KAAK,MAAA,CAAO,cAAA,CAAe,QAAA,EAAS,EAAG,CAAC,IAAA,CAAK,EAAA,GAAK,CAAC,CAAC,CAAA;AAAA;AAAA,IAGzG,IAAA,CAAK,gBAAA,EAAkB,gBAAA,EAAkB,MAAM,KAAK,MAAA,CAAO,YAAA,CAAa,QAAA,EAAU,CAAA,EAAG,EAAE,GAAA,EAAK,KAAK,CAAA;AAAA,IACjG,IAAA,CAAK,eAAA,EAAiB,eAAA,EAAiB,MAAM,KAAK,MAAA,CAAO,YAAA,CAAa,QAAA,EAAU,GAAG,EAAE,IAAA,EAAM,eAAA,EAAiB,GAAA,EAAK,SAAS,CAAA;AAAA,IAC1H,IAAA,CAAK,eAAA,EAAiB,eAAA,EAAiB,MAAM,KAAK,MAAA,CAAO,YAAA,CAAa,QAAA,EAAU,GAAG,EAAE,IAAA,EAAM,eAAA,EAAiB,GAAA,EAAK,SAAS,CAAA;AAAA,IAC1H,IAAA,CAAK,cAAA,EAAgB,cAAA,EAAgB,MAAM,KAAK,MAAA,CAAO,UAAA,CAAW,QAAA,EAAU,CAAA,EAAG,EAAE,GAAA,EAAK,KAAK,CAAA;AAAA;AAAA,IAG3F,KAAK,YAAA,EAAc,YAAA,EAAc,MAAM,KAAK,OAAO,WAAA,CAAY,QAAA,EAAS,EAAG,MAAM,GAAG,EAAE,IAAA,EAAM,YAAA,EAAc,GAAA,EAAK,SAAS,CAAA;AAAA,IACxH,KAAK,yBAAA,EAA2B,2BAAA,EAA6B,MAAM,KAAK,OAAO,WAAA,CAAY,QAAA,EAAS,EAAG,mBAAmB,GAAG,EAAE,IAAA,EAAM,cAAA,EAAgB,GAAA,EAAK,SAAS,CAAA;AAAA,IACnK,KAAK,aAAA,EAAe,aAAA,EAAe,MAAM,KAAK,OAAO,WAAA,CAAY,QAAA,EAAS,EAAG,OAAO,GAAG,EAAE,IAAA,EAAM,aAAA,EAAe,GAAA,EAAK,SAAS,CAAA;AAAA,IAC5H,KAAK,WAAA,EAAa,WAAA,EAAa,MAAM,KAAK,OAAO,WAAA,CAAY,QAAA,EAAS,EAAG,KAAK,GAAG,EAAE,IAAA,EAAM,YAAA,EAAc,GAAA,EAAK,SAAS,CAAA;AAAA,IACrH,KAAK,uBAAA,EAAyB,yBAAA,EAA2B,MAAM,KAAK,OAAO,WAAA,CAAY,QAAA,EAAS,EAAG,iBAAiB,GAAG,EAAE,IAAA,EAAM,eAAA,EAAiB,GAAA,EAAK,SAAS,CAAA;AAAA,IAC9J,KAAK,cAAA,EAAgB,cAAA,EAAgB,MAAM,KAAK,OAAO,WAAA,CAAY,QAAA,EAAS,EAAG,QAAQ,GAAG,EAAE,IAAA,EAAM,eAAA,EAAiB,GAAA,EAAK,SAAS,CAAA;AAAA,IACjI,IAAA,CAAK,uBAAA,EAAyB,yBAAA,EAA2B,MAAM,KAAK,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAS,EAAG,YAAY,CAAA,EAAG,EAAE,GAAA,EAAK,eAAe,CAAA;AAAA,IAC7I,IAAA,CAAK,qBAAA,EAAuB,uBAAA,EAAyB,MAAM,KAAK,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAS,EAAG,UAAU,CAAA,EAAG,EAAE,GAAA,EAAK,eAAe,CAAA;AAAA,IACvI,IAAA,CAAK,kBAAA,EAAoB,oBAAA,EAAsB,MAAM,KAAK,OAAO,WAAA,CAAY,QAAA,EAAS,EAAG,YAAY,CAAC,CAAA;AAAA,IACtG,IAAA,CAAK,gBAAA,EAAkB,kBAAA,EAAoB,MAAM,KAAK,OAAO,WAAA,CAAY,QAAA,EAAS,EAAG,UAAU,CAAC,CAAA;AAAA,IAChG,IAAA,CAAK,oBAAA,EAAsB,sBAAA,EAAwB,MAAM,KAAK,OAAO,aAAA,CAAc,QAAA,EAAS,EAAG,YAAY,CAAC,CAAA;AAAA,IAC5G,IAAA,CAAK,kBAAA,EAAoB,oBAAA,EAAsB,MAAM,KAAK,OAAO,aAAA,CAAc,QAAA,EAAS,EAAG,UAAU,CAAC,CAAA;AAAA,IACtG,IAAA,CAAK,iBAAA,EAAmB,mBAAA,EAAqB,MAAM,KAAK,MAAA,CAAO,UAAA,CAAW,QAAA,EAAS,EAAG,YAAY,CAAA,EAAG,EAAE,GAAA,EAAK,WAAW,CAAA;AAAA,IACvH,IAAA,CAAK,eAAA,EAAiB,iBAAA,EAAmB,MAAM,KAAK,MAAA,CAAO,UAAA,CAAW,QAAA,EAAS,EAAG,UAAU,CAAA,EAAG,EAAE,GAAA,EAAK,WAAW,CAAA;AAAA,IACjH,IAAA,CAAK,QAAQ,MAAA,EAAQ,MAAM,KAAK,MAAA,CAAO,UAAA,CAAW,QAAA,EAAU,CAAC,CAAA;AAAA;AAAA,IAG7D,IAAA,CAAK,eAAe,WAAA,EAAa,MAAM,OAAO,mBAAA,CAAoB,EAAE,YAAY,CAAC,MAAA,CAAO,kBAAiB,CAAE,UAAA,EAAY,CAAA,EAAG,EAAE,KAAK,OAAA,EAAS,UAAA,EAAY,MAAM,CAAA;AAAA,IAC5J,IAAA,CAAK,qBAAqB,YAAA,EAAc,MAAM,OAAO,mBAAA,CAAoB,EAAE,aAAa,CAAC,MAAA,CAAO,kBAAiB,CAAE,WAAA,EAAa,CAAA,EAAG,EAAE,KAAK,OAAA,EAAS,UAAA,EAAY,MAAM,CAAA;AAAA,IACrK,KAAK,mBAAA,EAAqB,YAAA,EAAc,MAAM,MAAA,CAAO,mBAAA,CAAoB,EAAE,WAAA,EAAa,CAAC,MAAA,CAAO,gBAAA,GAAmB,WAAA,EAAa,GAAG,EAAE,UAAA,EAAY,MAAM,CAAA;AAAA,IACvJ,KAAK,kBAAA,EAAoB,WAAA,EAAa,MAAM,MAAA,CAAO,mBAAA,CAAoB,EAAE,YAAA,EAAc,CAAC,MAAA,CAAO,gBAAA,GAAmB,YAAA,EAAc,GAAG,EAAE,GAAA,EAAK,KAAK,CAAA;AAAA,IAC/I,KAAK,oBAAA,EAAsB,wBAAA,EAA0B,MAAM,MAAA,CAAO,mBAAA,CAAoB,EAAE,gBAAA,EAAkB,CAAC,MAAA,CAAO,gBAAA,GAAmB,gBAAA,EAAkB,GAAG,EAAE,UAAA,EAAY,MAAM,CAAA;AAAA,IAC9K,KAAK,kBAAA,EAAoB,aAAA,EAAe,MAAM,MAAA,CAAO,IAAA,CAAK,sBAAsB,EAAE,UAAA,EAAY,CAAC,MAAA,CAAO,IAAA,CAAK,eAAc,EAAG,GAAG,EAAE,UAAA,EAAY,MAAM,CAAA;AAAA,IACnJ,KAAK,kBAAA,EAAoB,WAAA,EAAa,MAAM,MAAA,CAAO,IAAA,CAAK,sBAAsB,EAAE,UAAA,EAAY,CAAC,MAAA,CAAO,IAAA,CAAK,eAAc,EAAG,GAAG,EAAE,UAAA,EAAY,MAAM,CAAA;AAAA,IACjJ,KAAK,0BAAA,EAA4B,cAAA,EAAgB,MAAM,MAAA,CAAO,IAAA,CAAK,sBAAsB,EAAE,iBAAA,EAAmB,CAAC,MAAA,CAAO,IAAA,CAAK,sBAAqB,EAAG,GAAG,EAAE,UAAA,EAAY,MAAM,CAAA;AAAA,IAC1K,KAAK,wBAAA,EAA0B,iBAAA,EAAmB,MAAM,MAAA,CAAO,IAAA,CAAK,sBAAsB,EAAE,mBAAA,EAAqB,CAAC,MAAA,CAAO,IAAA,CAAK,wBAAuB,EAAG,GAAG,EAAE,UAAA,EAAY,MAAM,CAAA;AAAA,IAC/K,IAAA,CAAK,yBAAyB,gBAAA,EAAkB,MAAM,OAAO,IAAA,CAAK,qBAAA,CAAsB,EAAE,eAAA,EAAiB,MAAA,CAAO,KAAK,kBAAA,EAAmB,KAAM,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA;AAAA,IAClL,IAAA,CAAK,wBAAwB,eAAA,EAAiB,MAAM,OAAO,IAAA,CAAK,qBAAA,CAAsB,EAAE,cAAA,EAAgB,MAAA,CAAO,KAAK,iBAAA,EAAkB,KAAM,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA;AAAA,IAC9K,KAAK,kBAAA,EAAoB,WAAA,EAAa,MAAM,MAAA,CAAO,aAAa,MAAA,CAAO,YAAA,EAAa,KAAM,MAAA,GAAS,UAAU,MAAM,CAAA,EAAG,EAAE,UAAA,EAAY,MAAM,CAAA;AAAA,IAC1I,KAAK,2BAAA,EAA6B,oBAAA,EAAsB,MAAM,MAAA,CAAO,IAAA,CAAK,sBAAsB,EAAE,2BAAA,EAA6B,CAAC,MAAA,CAAO,IAAA,CAAK,gCAA+B,EAAG,GAAG,EAAE,UAAA,EAAY,MAAM,CAAA;AAAA;AAAA,IAGrM,KAAK,UAAA,EAAY,UAAA,EAAY,MAAM,KAAK,OAAO,UAAA,CAAW,EAAE,IAAA,EAAM,CAAA,KAAA,EAAQ,OAAO,QAAA,EAAS,CAAE,SAAS,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,IAC3G,IAAA,CAAK,gBAAA,EAAkB,gBAAA,EAAkB,MAAM,KAAK,OAAO,aAAA,CAAc,MAAA,CAAO,gBAAA,EAAkB,CAAC,CAAA;AAAA,IACnG,IAAA,CAAK,aAAA,EAAe,aAAA,EAAe,MAAM,KAAK,OAAO,UAAA,CAAW,MAAA,CAAO,gBAAA,EAAkB,CAAC;AAAA,GAC5F;AAEA,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,KAAA,IAAS,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,EAAE,CAAA,GAAI,KAAA;AAC/C,EAAA,OAAO,OAAA;AACT;AC3JA,SAAS,WAAW,CAAA,EAAgC;AAClD,EAAA,OAAO,CAAA,YAAa,gBAAgB,CAAA,CAAE,OAAA,KAAY,WAAW,CAAA,CAAE,OAAA,KAAY,cAAc,CAAA,CAAE,iBAAA,CAAA;AAC7F;AAGO,SAAS,UAAA,CAAW,OAA6B,UAAA,EAA0C;AAChG,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,EAAG;AACvC,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,IAAI,UAAA,IAAc,CAAC,IAAA,CAAK,UAAA,EAAY;AACpC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,EAAG;AACrC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AACnC,MAAA,IAAI,GAAA,KAAQ,EAAA,IAAM,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AAGrC,MAAA,IAAI,CAAC,IAAI,GAAA,CAAI,GAAG,GAAG,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,EAAE,CAAA;AAAA,IACzC;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,gBAAA,GAAyB;AACvC,EAAA,MAAM,SAASF,SAAAA,EAAU;AACzB,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,QAAA,GAAWN,OAAO,KAAK,CAAA;AAC7B,EAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAEnB,EAAAE,UAAU,MAAM;AACd,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AACtC,MAAA,IAAI,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,IAAW,EAAE,MAAA,EAAQ;AACxC,MAAA,IAAI,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA,EAAG;AAC1B,MAAA,IAAI,MAAA,CAAO,mBAAkB,EAAG;AAChC,MAAA,MAAM,MAAM,UAAA,CAAW,QAAA,CAAS,SAAS,MAAA,CAAO,gBAAA,GAAmB,UAAU,CAAA;AAC7E,MAAA,MAAM,KAAK,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,GAAA,CAAI,aAAa,CAAA;AACtC,MAAA,IAAI,OAAO,MAAA,EAAW;AACtB,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,EAAE,CAAA;AAChC,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,IACrB,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC5C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,SAAS,CAAA;AAAA,EAC9D,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACb;AAGO,SAAS,aAAA,GAAgB;AAC9B,EAAA,gBAAA,EAAiB;AACjB,EAAA,OAAO,IAAA;AACT;AC7DO,IAAM,cAAA,GAAiB,IAAA,CAAK,gBAAA,EAAkB,KAAK;AAE1D,SAASQ,YAAW,CAAA,EAAgC;AAClD,EAAA,OAAO,CAAA,YAAa,gBAAgB,CAAA,CAAE,OAAA,KAAY,WAAW,CAAA,CAAE,OAAA,KAAY,cAAc,CAAA,CAAE,iBAAA,CAAA;AAC7F;AAEA,IAAI,iBAAA,GAAoB,EAAA;AAcjB,SAAS,oBAAA,CAAqB,MAAA,EAAuB,OAAA,GAAmC,EAAC,EAAS;AACvG,EAAA,MAAM,SAAA,GAAY,QAAQ,KAAA,IAAS,IAAA;AACnC,EAAAR,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,IAAA,CAAK,SAAA,CAAU,YAAY,EAAE,CAAA;AAC7D,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AACtC,MAAA,IAAIQ,WAAAA,CAAW,CAAA,CAAE,MAAM,CAAA,EAAG;AAC1B,MAAA,IAAI,MAAA,CAAO,mBAAkB,EAAG;AAChC,MAAA,MAAM,KAAA,GAAQ,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,OAAA;AACpC,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY;AAC9B,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,QAAQ,GAAA;AAAK,UACX,KAAK,GAAA;AACH,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,IAAI,CAAA,CAAE,QAAA,EAAU,MAAA,CAAO,IAAA,EAAK;AAAA,wBAChB,IAAA,EAAK;AACjB,YAAA;AAAA,UACF,KAAK,GAAA;AACH,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,MAAA,CAAO,IAAA,EAAK;AACZ,YAAA;AAAA,UACF,KAAK,GAAA;AACH,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,MAAA,CAAO,SAAA,EAAU;AACjB,YAAA;AAAA,UACF,KAAK,GAAA,EAAK;AACR,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,MAAM,GAAA,GAAM,OAAO,mBAAA,EAAoB;AACvC,YAAA,IAAI,CAAC,IAAI,MAAA,EAAQ;AACjB,YAAA,MAAA,CAAO,wBAAA,CAAyB,CAAA,CAAE,QAAA,GAAW,SAAA,GAAY,OAAO,CAAA;AAChE,YAAA,IAAI,CAAA,CAAE,QAAA,EAAU,MAAA,CAAO,aAAA,CAAc,GAAG,CAAA;AAAA,iBACnC,MAAA,CAAO,YAAY,GAAG,CAAA;AAC3B,YAAA;AAAA,UACF;AAAA,UACA,KAAK,GAAA,EAAK;AACR,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,IAAI,EAAE,QAAA,EAAU;AACd,cAAA,MAAA,CAAO,yBAAyB,MAAM,CAAA;AACtC,cAAA,MAAA,CAAO,UAAA,EAAW;AAAA,YACpB;AACA,YAAA;AAAA,UACF;AAAA,UACA,KAAK,GAAA,EAAK;AACR,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,MAAM,GAAA,GAAM,OAAO,mBAAA,EAAoB;AACvC,YAAA,IAAI,IAAI,MAAA,EAAQ;AACd,cAAA,MAAA,CAAO,yBAAyB,WAAW,CAAA;AAC3C,cAAA,MAAM,MAAA,GAAS,MAAA,CAAO,eAAA,CAAgB,GAAG,CAAA;AACzC,cAAA,MAAA,CAAO,kBAAkB,MAAM,CAAA;AAAA,YACjC;AACA,YAAA;AAAA,UACF;AAAA,UACA,KAAK,GAAA;AAAA,UACL,KAAK,GAAA,EAAK;AACR,YAAA,MAAM,GAAA,GAAM,OAAO,mBAAA,EAAoB;AACvC,YAAA,IAAI,CAAC,IAAI,MAAA,EAAQ;AACjB,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,MAAM,OAAA,GAAU,MAAA,CAAO,yBAAA,CAA0B,GAAG,CAAA;AACpD,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU,EAAE,MAAM,sBAAA,EAAwB,GAAG,SAAS,CAAA;AACxE,cAAA,SAAA,CAAU,SAAA,EAAW,SAAA,CAAU,IAAI,CAAA,CAAE,MAAM,MAAM;AAAA,cAAC,CAAC,CAAA;AACnD,cAAA,iBAAA,GAAoB,IAAA;AAAA,YACtB;AACA,YAAA,IAAI,QAAQ,GAAA,EAAK;AACf,cAAA,MAAA,CAAO,yBAAyB,KAAK,CAAA;AACrC,cAAA,MAAA,CAAO,aAAa,GAAG,CAAA;AAAA,YACzB;AACA,YAAA;AAAA,UACF;AAAA,UACA,KAAK,GAAA,EAAK;AACR,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAiB;AAC9B,cAAA,IAAI;AACF,gBAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC5B,gBAAA,IAAI,IAAA,CAAK,SAAS,sBAAA,IAA0B,CAAC,MAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG;AACzE,gBAAA,MAAA,CAAO,yBAAyB,OAAO,CAAA;AACvC,gBAAA,MAAA,CAAO,0BAA0B,IAAA,EAAe,EAAE,OAAO,MAAA,CAAO,qBAAA,IAAyB,CAAA;AAAA,cAC3F,CAAA,CAAA,MAAQ;AAAA,cAER;AAAA,YACF,CAAA;AACA,YAAA,IAAI,SAAA,CAAU,SAAA,EAAW,QAAA,EAAU,SAAA,CAAU,SAAA,CAAU,QAAA,EAAS,CAAE,IAAA,CAAK,KAAA,EAAO,MAAM,iBAAA,IAAqB,KAAA,CAAM,iBAAiB,CAAC,CAAA;AAAA,iBAAA,IACxH,iBAAA,QAAyB,iBAAiB,CAAA;AACnD,YAAA;AAAA,UACF;AAAA,UACA,KAAK,GAAA;AAAA,UACL,KAAK,GAAA;AACH,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,MAAA,CAAO,MAAA,EAAO;AACd,YAAA;AAAA,UACF,KAAK,GAAA;AACH,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,MAAA,CAAO,OAAA,EAAQ;AACf,YAAA;AAAA,UACF,KAAK,GAAA;AACH,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,MAAA,CAAO,SAAA,EAAU;AACjB,YAAA;AAAA,UACF,KAAK,GAAA;AACH,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,MAAA,CAAO,SAAA,EAAU;AACjB,YAAA;AAAA,UACF,KAAK,GAAA;AACH,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,MAAA,CAAO,eAAA,EAAgB;AACvB,YAAA;AAAA,UACF,KAAK,GAAA;AACH,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,IAAI,CAAA,CAAE,MAAA,EAAQ,MAAA,CAAO,YAAA,EAAa;AAAA,wBACtB,YAAA,EAAa;AACzB,YAAA;AAAA,UACF,KAAK,GAAA;AACH,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,IAAI,CAAA,CAAE,MAAA,EAAQ,MAAA,CAAO,UAAA,EAAW;AAAA,wBACpB,YAAA,EAAa;AACzB,YAAA;AAAA,UACF;AACE,YAAA;AAAA;AACJ,MACF;AACA,MAAA,IAAI,EAAE,MAAA,EAAQ;AAEZ,QAAA,IAAI,EAAE,IAAA,KAAS,MAAA,IAAU,GAAA,KAAQ,GAAA,IAAO,QAAQ,QAAA,EAAU;AACxD,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,cAAA,CAAe,GAAA,CAAI,CAAC,cAAA,CAAe,GAAA,EAAK,CAAA;AAAA,QAC1C;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,MAAA,CAAO,mBAAA,CAAoB,EAAE,YAAA,EAAc,CAAC,OAAO,gBAAA,EAAiB,CAAE,cAAc,CAAA;AACpF,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AAChB,MAAA,QAAQ,GAAA;AAAK,QACX,KAAK,GAAA;AACH,UAAA,MAAA,CAAO,eAAe,QAAQ,CAAA;AAC9B,UAAA;AAAA,QACF,KAAK,GAAA;AACH,UAAA,MAAA,CAAO,eAAe,MAAM,CAAA;AAC5B,UAAA;AAAA,QACF,KAAK,GAAA;AACH,UAAA,MAAA,CAAO,cAAA,CAAe,KAAA,EAAO,EAAE,GAAA,EAAK,aAAa,CAAA;AACjD,UAAA;AAAA,QACF,KAAK,GAAA;AACH,UAAA,MAAA,CAAO,cAAA,CAAe,KAAA,EAAO,EAAE,GAAA,EAAK,WAAW,CAAA;AAC/C,UAAA;AAAA,QACF,KAAK,GAAA;AAAA,QACL,KAAK,GAAA;AAAA,QACL,KAAK,GAAA;AACH,UAAA,MAAA,CAAO,eAAe,MAAM,CAAA;AAC5B,UAAA;AAAA,QACF,KAAK,GAAA;AACH,UAAA,MAAA,CAAO,eAAe,QAAQ,CAAA;AAC9B,UAAA;AAAA,QACF,KAAK,GAAA;AACH,UAAA,MAAA,CAAO,eAAe,MAAM,CAAA;AAC5B,UAAA;AAAA,QACF,KAAK,GAAA;AACH,UAAA,MAAA,CAAO,eAAe,MAAM,CAAA;AAC5B,UAAA;AAAA;AAAA,QAEF,KAAK,GAAA;AACH,UAAA,IAAI,OAAO,IAAA,CAAK,QAAA,GAAW,OAAO,CAAA,EAAG,MAAA,CAAO,eAAe,OAAO,CAAA;AAClE,UAAA;AAAA,QACF,KAAK,GAAA;AACH,UAAA,IAAI,OAAO,IAAA,CAAK,QAAA,GAAW,MAAM,CAAA,EAAG,MAAA,CAAO,eAAe,MAAM,CAAA;AAChE,UAAA;AAAA,QACF,KAAK,GAAA;AACH,UAAA,IAAI,OAAO,IAAA,CAAK,QAAA,GAAW,OAAO,CAAA,EAAG,MAAA,CAAO,eAAe,OAAO,CAAA;AAClE,UAAA;AAEA;AACJ,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC5C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,SAAS,CAAA;AAAA,EAC9D,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAS,CAAC,CAAA;AACxB;AC3KA,IAAM,MAAA,GAAS,OAAO,SAAA,KAAc,WAAA,IAAe,sBAAA,CAAuB,KAAK,SAAA,CAAU,QAAA,IAAY,SAAA,CAAU,SAAA,IAAa,EAAE,CAAA;AAEvH,IAAM,OAAA,GAAU,SAAS,QAAA,GAAM;AAEtC,IAAM,WAAA,GAAc,CAAC,CAAA,KAAuC,CAAA,CAAE,eAAA,EAAgB;AAE9E,SAASF,WAAU,CAAA,EAAmB;AACpC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAA;AACrE;AAkBA,SAAS,QAAA,CAAS,EAAE,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,SAAA,EAAW,GAAA,EAAK,OAAA,EAAQ,EAAkB;AAChH,EAAA,uBACEJ,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAW,SAAA,GAAY,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAA,GAAK,cAAA;AAAA,MACrD,YAAA,EAAY,KAAA;AAAA,MACZ,cAAA,EAAc,KAAA;AAAA,MACb,GAAI,QAAA,GAAW,EAAE,eAAA,EAAiB,QAAA,KAAa,EAAC;AAAA,MAChD,GAAI,OAAA,KAAY,MAAA,GAAY,EAAC,GAAI,EAAE,gBAAgB,OAAA,EAAQ;AAAA,MAC3D,GAAI,QAAA,KAAa,MAAA,GAAY,EAAC,GAAI,EAAE,iBAAiB,QAAA,EAAS;AAAA,MAC9D,GAAI,QAAA,GAAW,EAAE,QAAA,EAAU,IAAA,KAAS,EAAC;AAAA,MACtC,OAAA;AAAA,MAEA,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,IAAA,EAAM;AAAA;AAAA,GACpB;AAEJ;AAWA,SAAS,QAAA,CAAS,EAAE,EAAA,EAAG,EAAmB;AACxC,EAAA,MAAM,QAAQO,QAAAA,EAAS;AACvB,EAAA,MAAM,IAAA,GAAO,MAAM,EAAE,CAAA;AACrB,EAAA,MAAM,UAAA,GAAa,kBAAkB,IAAI,CAAA;AACzC,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,uBAAOP,GAAAA,CAAC,kBAAA,EAAA,EAAoB,GAAG,MAAM,UAAA,EAAwB,CAAA;AAC/D;AAUO,IAAM,OAAA,GAAUQ,KAAAA,CAAM,SAASC,QAAAA,GAAU;AAC9C,EAAA,MAAM,SAASP,SAAAA,EAAU;AACzB,EAAA,MAAM,QAAQK,QAAAA,EAAS;AACvB,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIV,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAUD,OAA0B,IAAI,CAAA;AAE9C,EAAA,MAAM,MAAA,GAAS,OAAO,gBAAA,EAAiB;AACvC,EAAA,MAAM,GAAA,GAAM,WAAW,KAAA,GAAU,MAAA,CAAO,mBAAmB,KAAK,CAAA,EAA0C,OAAO,WAAA,GAAe,IAAA;AAIhI,EAAA,MAAM,MAAA,GAAS,eAAe,GAAA,CAAI,CAAC,UAAU,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,KAAA,CAAM,KAAK,EAAE,CAAA,KAAM,MAAS,CAAC,CAAA,CAAE,OAAO,CAAC,KAAA,KAAU,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACrI,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA,CAAE,IAAI,KAAK,CAAA,IAAK,eAAe,MAAA,GAAS,CAAA;AAC/E,EAAA,MAAM,UAAA,GAAa,WAAW,KAAA,IAAS,GAAA,KAAQ,QAAQ,CAAC,iBAAA,CAAkB,SAAS,GAAG,CAAA;AAKtF,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,cAAA,CAAe,IAAA,EAAK,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAClE,EAAA,MAAM,SAAS,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,OAAO,CAAC,EAAA,KAAO,CAAC,KAAA,CAAM,IAAI,EAAE,CAAA,IAAK,CAAC,cAAA,CAAe,QAAA,CAAS,EAAkB,CAAC,CAAA;AAE/G,EAAA,uBACEG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EAAkC,MAAK,SAAA,EAAU,YAAA,EAAW,OAAA,EAAQ,aAAA,EAAe,WAAA,EAC/F,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,IAAI,CAAC,KAAA,EAAO,CAAA,qBAClBA,KAAC,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,CAAA,GAAI,CAAA,mBAAIC,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kBAAA,EAAmB,aAAA,EAAY,QAAO,CAAA,GAAK,IAAA;AAAA,MACnE,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVA,GAAAA,CAAC,QAAA,EAAA,EAAuB,EAAA,EAAI,IAAA,CAAK,EAAA,EAAA,EAAlB,IAAA,CAAK,EAAiB,CACtC,CAAA;AAAA,MACA,MAAA,IAAU,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,GAAG,CAAA,mBACtCD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EACd,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,OAAA;AAAA,YACL,IAAA,EAAK,cAAA;AAAA,YACL,KAAA,EAAM,aAAA;AAAA,YACN,OAAA,EAAS,UAAA;AAAA,YACT,QAAA,EAAU,QAAA;AAAA,YACV,SAAS,MAAM,WAAA,CAAY,CAAC,CAAA,KAAM,CAAC,CAAC;AAAA;AAAA,SACtC;AAAA,wBACAA,IAAC,OAAA,EAAA,EAAQ,SAAA,EAAW,SAAS,IAAA,EAAM,QAAA,EAAU,SAAS,MAAM,WAAA,CAAY,KAAK,CAAA,EAAG,KAAA,EAAM,eAAc,MAAA,EAAO,OAAA,EACxG,yBAAe,GAAA,CAAI,CAAC,yBACnBA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,IAAA,EAAK,eAAA;AAAA,YACL,SAAA,EAAU,cAAA;AAAA,YACV,YAAA,EAAYI,WAAU,IAAI,CAAA;AAAA,YAC1B,gBAAc,GAAA,KAAQ,IAAA;AAAA,YACtB,cAAA,EAAcA,WAAU,IAAI,CAAA;AAAA,YAC5B,SAAS,MAAM;AACb,cAAA,MAAA,CAAO,qBAAA,CAAsBC,kBAAkB,IAAI,CAAA;AACnD,cAAA,MAAA,CAAO,eAAe,KAAA,EAAO,EAAE,KAAK,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACvD,cAAA,WAAA,CAAY,KAAK,CAAA;AAAA,YACnB,CAAA;AAAA,YAEA,0BAAAL,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,CAAA,IAAA,EAAO,IAAI,CAAA,CAAA,EAAI;AAAA,WAAA;AAAA,UAbtB;AAAA,SAeR,CAAA,EACH;AAAA,OAAA,EACF,CAAA,GACE;AAAA,KAAA,EAAA,EApCS,KAAA,CAAM,CAAC,CAAA,CAAG,EAqCzB,CACD,CAAA;AAAA,IACA,OAAO,MAAA,GAAS,CAAA,mBACfD,IAAAA,CAAAW,YAAA,EACE,QAAA,EAAA;AAAA,sBAAAV,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB,eAAY,MAAA,EAAO,CAAA;AAAA,MACrD,MAAA,CAAO,IAAI,CAAC,EAAA,qBACXA,GAAAA,CAAC,QAAA,EAAA,EAAkB,EAAA,EAAA,EAAJ,EAAY,CAC5B;AAAA,KAAA,EACH,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ,CAAC;AAOM,IAAM,OAAA,GAAUQ,KAAAA,CAAM,SAASG,QAAAA,GAAU;AAC9C,EAAA,MAAM,SAAST,SAAAA,EAAU;AACzB,EAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,YAAA,KAAiB,GAAG,CAAA;AACnD,EAAA,uBACEH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EAAkC,MAAK,SAAA,EAAU,YAAA,EAAW,MAAA,EAAO,aAAA,EAAe,WAAA,EAC/F,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAK,UAAA,EAAW,OAAM,UAAA,EAAW,QAAA,EAAU,CAAA,EAAG,OAAO,CAAA,MAAA,CAAA,EAAK,OAAA,EAAS,MAAM,MAAA,CAAO,SAAQ,EAAG,CAAA;AAAA,oBACrGD,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,iCAAA;AAAA,QACV,YAAA,EAAY,yBAAyB,IAAI,CAAA,CAAA,CAAA;AAAA,QACzC,cAAA,EAAa,YAAA;AAAA,QACb,eAAA,EAAe,GAAG,OAAO,CAAA,CAAA,CAAA;AAAA,QACzB,OAAA,EAAS,MAAM,MAAA,CAAO,SAAA,EAAU;AAAA,QAE/B,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,UAAK;AAAA;AAAA;AAAA,KACR;AAAA,oBACAC,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAK,WAAU,KAAA,EAAM,SAAA,EAAU,QAAA,EAAU,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA,EAAK,OAAA,EAAS,MAAM,MAAA,CAAO,QAAO,EAAG,CAAA;AAAA,oBAClGA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAK,YAAW,KAAA,EAAM,aAAA,EAAc,QAAA,EAAU,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA,EAAK,OAAA,EAAS,MAAM,MAAA,CAAO,WAAU,EAAG,CAAA;AAAA,oBAC1GA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB,eAAY,MAAA,EAAO,CAAA;AAAA,oBACtDA,IAAC,QAAA,EAAA,EAAS,IAAA,EAAK,QAAO,KAAA,EAAM,MAAA,EAAO,UAAU,CAAA,EAAG,OAAO,KAAK,QAAA,EAAU,CAAC,OAAO,UAAA,EAAW,EAAG,SAAS,MAAM,MAAA,CAAO,MAAK,EAAG,CAAA;AAAA,oBAC1HA,IAAC,QAAA,EAAA,EAAS,IAAA,EAAK,QAAO,KAAA,EAAM,MAAA,EAAO,UAAU,CAAA,EAAG,OAAO,WAAM,QAAA,EAAU,CAAC,OAAO,UAAA,EAAW,EAAG,SAAS,MAAM,MAAA,CAAO,MAAK,EAAG;AAAA,GAAA,EAC7H,CAAA;AAEJ,CAAC;AAOM,IAAM,UAAA,GAAaQ,KAAAA,CAAM,SAASI,WAAAA,GAAa;AACpD,EAAA,MAAM,SAASV,SAAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,OAAO,iBAAA,EAAkB;AACvC,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,sBAAA,EAAuB,CAAE,IAAA;AAC9C,EAAA,uBACEH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAgC,MAAK,QAAA,EAAS,YAAA,EAAW,kBAAA,EAAmB,aAAA,EAAe,WAAA,EACxG,QAAA,EAAA;AAAA,oBAAAA,KAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,OAAG,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAAI,eAAA;AAAA,sBAAUA,GAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,MAAA,CAAO,OAAO,UAAA,EAAW,CAAA;AAAA,MAAI;AAAA,KAAA,EAC3D,CAAA;AAAA,oBACAD,KAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,KAAA,CAAM,KAAA,EAAM,CAAA;AAAA,MAAI,cAAA;AAAA,sBAASA,GAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,KAAA,CAAM,MAAA,EAAO,CAAA;AAAA,MAAI;AAAA,KAAA,EACpD,CAAA;AAAA,oBACAD,KAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,GAAA,EAAA,EAAG,QAAA,EAAA,KAAA,CAAM,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAA,EAAE,CAAA;AAAA,MAAI;AAAA,KAAA,EAC9B;AAAA,GAAA,EACF,CAAA;AAEJ,CAAC;AAUM,IAAM,iBAAA,GAAkC;AAAA,EAC7C,OAAA;AAAA,EACA,eAAA,EAAiB,OAAA;AAAA,EACjB,UAAA;AAAA,EACA,UAAA,EAAY,UAAA;AAAA,EACZ,OAAA,EAAS;AACX;AAUA,IAAM,YAAYQ,KAAAA,CAAM,SAASK,UAAAA,CAAU,EAAE,MAAK,EAAwD;AACxG,EAAA,MAAM,SAASX,SAAAA,EAAU;AACzB,EAAA,IAAI,CAAC,MAAA,CAAO,gBAAA,EAAiB,CAAE,YAAY,OAAO,IAAA;AAClD,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,uBAAOF,GAAAA,CAAC,IAAA,EAAA,EAAK,CAAA,EAAG,MAAA,CAAO,GAAG,CAAA,EAAG,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA,EAAG,IAAA,EAAM,MAAA,CAAO,mBAAA,GAAsB,QAAA,EAAU,CAAA;AACnG,CAAC,CAAA;AAiBD,SAAS,MAAA,CAAO,EAAE,SAAA,EAAW,UAAA,EAAW,EAAgD;AACtF,EAAA,MAAM,IAAI,mBAAA,EAAoB;AAC9B,EAAA,MAAM,SAAA,GAAYc,SAAS,cAAc,CAAA;AACzC,EAAAhB,UAAU,MAAM;AACd,IAAA,cAAA,CAAe,IAAI,SAAS,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AACd,EAAA,MAAM,SAAS,CAAA,CAAE,WAAA,mBAAcE,GAAAA,CAAC,EAAE,WAAA,EAAF,EAAc,CAAA,GAAK,CAAA,CAAE,yBAASA,GAAAA,CAAC,CAAA,CAAE,MAAA,EAAF,EAAS,CAAA,GAAK,IAAA;AAC7E,EAAA,IAAI,YAAY,OAAO,MAAA;AACvB,EAAA,uBACED,IAAAA,CAAAW,UAAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,MAAA;AAAA,IACA,EAAE,UAAA,mBAAaV,IAAC,CAAA,CAAE,UAAA,EAAF,EAAa,CAAA,GAAK,IAAA;AAAA,IAClC,CAAA,CAAE,uBAAOA,GAAAA,CAAC,aAAU,IAAA,EAAM,CAAA,CAAE,MAAM,CAAA,GAAK,IAAA;AAAA,IACvC,EAAE,WAAA,mBAAcA,IAAC,CAAA,CAAE,WAAA,EAAF,EAAc,CAAA,GAAK,IAAA;AAAA,IACpC,EAAE,OAAA,mBAAUA,IAAC,CAAA,CAAE,OAAA,EAAF,EAAU,CAAA,GAAK,IAAA;AAAA,IAC5B,EAAE,eAAA,mBAAkBA,IAAC,CAAA,CAAE,eAAA,EAAF,EAAkB,CAAA,GAAK,IAAA;AAAA,IAC5C,EAAE,UAAA,mBAAaA,IAAC,CAAA,CAAE,UAAA,EAAF,EAAa,CAAA,GAAK,IAAA;AAAA,IAClC,EAAE,SAAA,mBAAYA,IAAC,CAAA,CAAE,SAAA,EAAF,EAAY,CAAA,GAAK,IAAA;AAAA,IAChC,EAAE,QAAA,mBAAWA,IAAC,CAAA,CAAE,QAAA,EAAF,EAAW,CAAA,GAAK,IAAA;AAAA,IAC9B,EAAE,WAAA,mBAAcA,IAAC,CAAA,CAAE,WAAA,EAAF,EAAc,CAAA,GAAK,IAAA;AAAA,IACpC,EAAE,YAAA,mBAAeA,IAAC,CAAA,CAAE,YAAA,EAAF,EAAe,CAAA,GAAK,IAAA;AAAA,IACtC,EAAE,aAAA,mBAAgBA,IAAC,CAAA,CAAE,aAAA,EAAF,EAAgB,CAAA,GAAK,IAAA;AAAA,IACxC,EAAE,YAAA,mBAAeA,IAAC,CAAA,CAAE,YAAA,EAAF,EAAe,CAAA,GAAK,IAAA;AAAA,IACtC,EAAE,YAAA,mBAAeA,IAAC,CAAA,CAAE,YAAA,EAAF,EAAe,CAAA,GAAK,IAAA;AAAA,IACtC,EAAE,eAAA,mBAAkBA,IAAC,CAAA,CAAE,eAAA,EAAF,EAAkB,CAAA,GAAK,IAAA;AAAA,IAC5C,EAAE,UAAA,mBAAaA,IAAC,CAAA,CAAE,UAAA,EAAF,EAAa,CAAA,GAAK,IAAA;AAAA,IAClC,EAAE,QAAA,mBAAWA,IAAC,CAAA,CAAE,QAAA,EAAF,EAAW,CAAA,GAAK,IAAA;AAAA,IAI9B,EAAE,QAAA,mBAAWA,IAAC,CAAA,CAAE,QAAA,EAAF,EAAW,CAAA,GAAK,IAAA;AAAA,IAC9B,EAAE,QAAA,mBAAWA,IAAC,CAAA,CAAE,QAAA,EAAF,EAAW,CAAA,GAAK,IAAA;AAAA,IAC9B,EAAE,OAAA,mBAAUA,IAAC,CAAA,CAAE,OAAA,EAAF,EAAU,CAAA,GAAK,IAAA;AAAA,IAC5B,EAAE,UAAA,mBAAaA,IAAC,CAAA,CAAE,UAAA,EAAF,EAAa,CAAA,GAAK,IAAA;AAAA,IAClC,EAAE,kBAAA,mBAAqBA,IAAC,CAAA,CAAE,kBAAA,EAAF,EAAqB,CAAA,GAAK,IAAA;AAAA,IAClD,EAAE,kBAAA,mBAAqBA,IAAC,CAAA,CAAE,kBAAA,EAAF,EAAqB,CAAA,GAAK,IAAA;AAAA,IAClD,EAAE,gBAAA,mBAAmBA,IAAC,CAAA,CAAE,gBAAA,EAAF,EAAmB,CAAA,GAAK,IAAA;AAAA,IAC9C,EAAE,SAAA,mBAAYA,IAAC,CAAA,CAAE,SAAA,EAAF,EAAY,CAAA,GAAK,IAAA;AAAA,IAChC,SAAA,IAAa,EAAE,UAAA,mBAAaA,IAAC,CAAA,CAAE,UAAA,EAAF,EAAa,CAAA,GAAK,IAAA;AAAA,IAC/C,EAAE,kBAAA,mBAAqBA,IAAC,CAAA,CAAE,kBAAA,EAAF,EAAqB,CAAA,GAAK,IAAA;AAAA,IAClD,EAAE,MAAA,mBAASA,IAAC,CAAA,CAAE,MAAA,EAAF,EAAS,CAAA,GAAK,IAAA;AAAA,IAC1B,EAAE,OAAA,mBAAUA,IAAC,CAAA,CAAE,OAAA,EAAF,EAAU,CAAA,GAAK,IAAA;AAAA,IAC5B,EAAE,IAAA,mBAAOA,IAAC,CAAA,CAAE,IAAA,EAAF,EAAO,CAAA,GAAK,IAAA;AAAA,IACtB,EAAE,OAAA,mBAAUA,IAAC,CAAA,CAAE,OAAA,EAAF,EAAU,CAAA,GAAK,IAAA;AAAA,oBAC7BA,IAAC,aAAA,EAAA,EAAc;AAAA,GAAA,EACjB,CAAA;AAEJ;AAkCO,SAAS,SAAA,CAAU,EAAE,MAAA,EAAQ,UAAA,EAAY,SAAA,EAAW,SAAA,GAAY,IAAA,EAAM,MAAA,EAAQ,UAAA,GAAa,KAAA,EAAO,QAAA,EAAS,EAAmB;AAKnI,EAAA,MAAM,QAAA,GAAW,QAAsB,MAAM;AAC3C,IAAA,IAAI,MAAA,KAAW,QAAW,OAAO,iBAAA;AACjC,IAAA,MAAM,aAAa,sBAAMA,GAAAA,CAAAU,UAAAA,EAAA,EAAG,QAAA,EAAA,MAAA,EAAO,CAAA;AACnC,IAAA,UAAA,CAAW,WAAA,GAAc,oBAAA;AACzB,IAAA,OAAO,EAAE,GAAG,iBAAA,EAAmB,MAAA,EAAQ,UAAA,EAAW;AAAA,EACpD,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,uBACEX,IAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,iBAAA,EAAmB,QAAA;AAAA,MACnB,YAAA,EAAc,qBAAA;AAAA,MACd,cAAA,EAAgB,uBAAA;AAAA,MACf,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe,EAAC;AAAA,MACnC,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,MAElC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAsB,UAAA,EAAwB,CAAA;AAAA,QACrD;AAAA;AAAA;AAAA,GACH;AAEJ;AChXO,IAAM,mBAAA,GAAsB;AAAA,EACjC,IAAA,EAAM,CAAA;AAAA,EACN,UAAA,EAAY,CAAA;AAAA,EACZ,SAAA,EAAW,CAAA;AAAA,EACX,SAAA,EAAW,CAAA;AAAA,EACX,MAAA,EAAQ,CAAA;AAAA,EACR,SAAA,EAAW,CAAA;AAAA,EACX,MAAA,EAAQ,CAAA;AAAA,EACR,OAAA,EAAS;AACX;AAMA,IAAM,iBAAA,GAAuC,CAAC,CAAA,EAAG,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,IAAI,CAAA;AAG5E,SAAS,sBAAsB,KAAA,EAA+B;AACnE,EAAA,IAAI,SAAiB,mBAAA,CAAoB,IAAA;AACzC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,iBAAA,CAAkB,QAAQ,CAAA,EAAA,EAAK;AACjD,IAAA,IAAI,KAAA,IAAU,iBAAA,CAAkB,CAAC,CAAA,EAAc,MAAA,GAAS,CAAA;AAAA,EAC1D;AACA,EAAA,OAAO,MAAA;AACT;AAEA,IAAM,iBAAA,GAAoB,aAAA,CAA8B,mBAAA,CAAoB,OAAO,CAAA;AAe5E,SAAS,kBAAA,CAAmB,EAAE,WAAA,GAAc,KAAA,EAAO,UAAS,EAA4B;AAC7F,EAAA,MAAM,YAAY,oBAAA,EAAqB;AACvC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIH,QAAAA,CAAyB,oBAAoB,OAAO,CAAA;AAExF,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,IAAa,OAAO,cAAA,KAAmB,WAAA,EAAa;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,qBAAA,CAAsB,UAAU,qBAAA,EAAsB,CAAE,KAAK,CAAC,CAAA;AACjG,IAAA,MAAA,EAAO;AACP,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,MAAM,CAAA;AACpC,IAAA,EAAA,CAAG,QAAQ,SAAS,CAAA;AACpB,IAAA,OAAO,MAAM,GAAG,UAAA,EAAW;AAAA,EAC7B,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,KAAA,GAAQ,WAAA,GAAc,mBAAA,CAAoB,UAAA,GAAa,UAAA;AAC7D,EAAA,uBAAOE,GAAAA,CAAC,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,OAAe,QAAA,EAAS,CAAA;AAC7D;AAGO,SAAS,aAAA,GAAgC;AAC9C,EAAA,OAAO,WAAW,iBAAiB,CAAA;AACrC;AC1DA,IAAM,qBAAqBe,aAAAA,CAA0C,EAAE,aAAa,YAAA,EAAc,GAAA,EAAK,OAAO,CAAA;AAOvG,SAAS,4BAA4B,EAAE,WAAA,GAAc,cAAc,GAAA,GAAM,KAAA,EAAO,UAAS,EAAqC;AACnI,EAAA,uBAAOf,GAAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,OAAO,EAAE,WAAA,EAAa,GAAA,EAAI,EAAI,QAAA,EAAS,CAAA;AAC7E;AASO,SAAS,sBAAA,GAA4F;AAC1G,EAAA,MAAM,KAAA,GAAQgB,WAAW,kBAAkB,CAAA;AAC3C,EAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,UAAA,EAAY,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAS,SAAA,EAAW,OAAA,EAAS,WAAA,EAAY;AAClG,EAAA,MAAM,GAAA,GAAM,MAAM,GAAA,KAAQ,KAAA;AAC1B,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAS,GAAA,GAAM,eAAe,WAAA,EAAa,OAAA,EAAS,GAAA,GAAM,WAAA,GAAc,YAAA,EAAa;AAC1G;ACVA,IAAM,WAAA,GAAcD,cAA0C,IAAI,CAAA;AAElE,IAAM,IAAA,GAA4B,EAAE,QAAA,EAAU,MAAM;AAAC,CAAA,EAAG,YAAY,IAAA,EAAK;AAOlE,SAAS,oBAAA,CAAqB,EAAE,QAAA,EAAS,EAAsB;AACpE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIlB,SAA0B,IAAI,CAAA;AAIlE,EAAA,MAAM,GAAA,GAAMD,OAAO,CAAC,CAAA;AACpB,EAAA,MAAM,QAAA,GAAWqB,WAAAA,CAAY,CAACC,MAAAA,KAAoB;AAChD,IAAA,GAAA,CAAI,OAAA,IAAW,CAAA;AACf,IAAA,aAAA,CAAc,EAAE,GAAGA,MAAAA,EAAO,GAAA,EAAK,IAAI,OAAA,GAAU,CAAA,KAAM,CAAA,GAAI,CAAA,EAAGA,MAAAA,CAAM,GAAG,CAAA,MAAA,CAAA,GAAMA,MAAAA,CAAM,KAAK,CAAA;AAAA,EACtF,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,KAAA,GAAQC,OAAAA,CAA6B,OAAO,EAAE,QAAA,EAAU,YAAW,CAAA,EAAI,CAAC,QAAA,EAAU,UAAU,CAAC,CAAA;AACnG,EAAA,uBAAOnB,GAAAA,CAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,OAAe,QAAA,EAAS,CAAA;AACvD;AAMO,SAAS,OAAA,GAA+B;AAC7C,EAAA,OAAOgB,UAAAA,CAAW,WAAW,CAAA,IAAK,IAAA;AACpC;AASO,SAAS,oBAAA,GAAuB;AACrC,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,OAAA,EAAQ;AAC/B,EAAA,MAAM,QAAA,GAAW,YAAY,QAAA,IAAY,QAAA;AACzC,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,QAAA,EAAU,UAAA;AAAA,IACV,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,CAAA;AAAA,IACR,MAAA,EAAQ,EAAA;AAAA,IACR,OAAA,EAAS,CAAA;AAAA,IACT,QAAA,EAAU,QAAA;AAAA,IACV,IAAA,EAAM,eAAA;AAAA,IACN,UAAA,EAAY,QAAA;AAAA,IACZ,MAAA,EAAQ;AAAA,GACV;AACA,EAAA,uBACEjB,IAAAA,CAAAW,UAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAV,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA0B,IAAA,EAAK,UAAS,WAAA,EAAU,QAAA,EAAS,aAAA,EAAY,MAAA,EAAO,OAAO,MAAA,EACjG,QAAA,EAAA,QAAA,KAAa,QAAA,GAAW,UAAA,EAAY,MAAM,EAAA,EAC7C,CAAA;AAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA0B,MAAK,OAAA,EAAQ,WAAA,EAAU,WAAA,EAAY,aAAA,EAAY,QAAO,KAAA,EAAO,MAAA,EACnG,uBAAa,WAAA,GAAc,UAAA,EAAY,MAAM,EAAA,EAChD;AAAA,GAAA,EACF,CAAA;AAEJ;AASO,SAAS,0BAAA,GAAmC;AACjD,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,OAAA,EAAQ;AAC7B,EAAA,MAAM,OAAA,GAAUY,QAAAA;AAAA,IACd,mBAAA;AAAA,IACA,MAAM;AACJ,MAAA,MAAM,MAAA,GAAS,OAAO,iBAAA,EAAkB;AACxC,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAChC,MAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG,OAAO,GAAG,MAAA,CAAO,CAAC,EAAG,IAAI,CAAA,SAAA,CAAA;AAClD,MAAA,OAAO,CAAA,EAAG,OAAO,MAAM,CAAA,gBAAA,CAAA;AAAA,IACzB,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AACA,EAAAhB,UAAU,MAAM;AACd,IAAA,IAAI,SAAS,QAAA,CAAS,EAAE,KAAK,OAAA,EAAS,QAAA,EAAU,UAAU,CAAA;AAAA,EAG5D,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AACd;AAOO,SAAS,uBAAA,GAAmC;AACjD,EAAA,MAAM,CAAC,EAAA,EAAI,KAAK,CAAA,GAAID,SAAS,KAAK,CAAA;AAClC,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,UAAA,EAAY;AACzD,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA;AAC/D,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,EAAA,CAAG,OAAO,CAAA;AACrC,IAAA,MAAA,EAAO;AACP,IAAA,EAAA,CAAG,gBAAA,CAAiB,UAAU,MAAM,CAAA;AACpC,IAAA,OAAO,MAAM,EAAA,CAAG,mBAAA,CAAoB,QAAA,EAAU,MAAM,CAAA;AAAA,EACtD,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,OAAO,EAAA;AACT;ACrGA,IAAM,aAAA,GAAgBiB,cAA4C,IAAI,CAAA;AAEtE,IAAMK,QAA8B,EAAE,QAAA,EAAU,MAAM,EAAA,EAAI,aAAa,MAAM;AAAC,CAAA,EAAG,aAAa,MAAM;AAAC,CAAA,EAAG,MAAA,EAAQ,EAAC,EAAE;AAMnH,IAAI,WAAA,GAAc,CAAA;AAGX,SAAS,sBAAA,CAAuB,EAAE,QAAA,EAAS,EAA4B;AAC5E,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIvB,QAAAA,CAAsB,EAAE,CAAA;AAEpD,EAAA,MAAM,WAAA,GAAcoB,WAAAA,CAAY,CAAC,EAAA,KAAe;AAC9C,IAAA,SAAA,CAAU,CAAC,YAAY,OAAA,CAAQ,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,EAAA,KAAO,EAAE,CAAC,CAAA;AAAA,EACnE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAWA,WAAAA,CAAY,CAAC,KAAA,KAAmD;AAC/E,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,IAAM,CAAA,MAAA,EAAS,WAAA,EAAa,CAAA,CAAA;AAC7C,IAAA,SAAA,CAAU,CAAC,OAAA,KAAY,CAAC,GAAG,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA,EAAG,EAAE,GAAG,KAAA,EAAO,EAAA,EAAI,CAAC,CAAA;AAChF,IAAA,OAAO,EAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAcA,YAAY,MAAM,SAAA,CAAU,EAAE,CAAA,EAAG,EAAE,CAAA;AAEvD,EAAA,MAAM,KAAA,GAAQE,OAAAA;AAAA,IACZ,OAAO,EAAE,QAAA,EAAU,WAAA,EAAa,aAAa,MAAA,EAAO,CAAA;AAAA,IACpD,CAAC,QAAA,EAAU,WAAA,EAAa,WAAA,EAAa,MAAM;AAAA,GAC7C;AACA,EAAA,uBAAOnB,GAAAA,CAAC,aAAA,CAAc,QAAA,EAAd,EAAuB,OAAe,QAAA,EAAS,CAAA;AACzD;AAGO,SAAS,SAAA,GAAmC;AACjD,EAAA,OAAOgB,UAAAA,CAAW,aAAa,CAAA,IAAKI,KAAAA;AACtC;AAGA,IAAM,iBAAA,GAAoB,GAAA;AAE1B,SAAS,KAAA,CAAM,EAAE,KAAA,EAAO,OAAA,EAAQ,EAA8C;AAC5E,EAAAtB,UAAU,MAAM;AACd,IAAA,IAAI,MAAM,QAAA,EAAU;AACpB,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,EAAS,iBAAiB,CAAA;AACnD,IAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,EACjC,CAAA,EAAG,CAAC,KAAA,CAAM,QAAA,EAAU,OAAO,CAAC,CAAA;AAE5B,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAgC,MAAK,OAAA,EAAQ,eAAA,EAAe,KAAA,CAAM,QAAA,IAAY,MAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,CAAM,KAAA,mBAAQC,GAAAA,CAAC,QAAA,EAAA,EAAO,WAAU,sBAAA,EAAwB,QAAA,EAAA,KAAA,CAAM,OAAM,CAAA,GAAY,IAAA;AAAA,MAChF,KAAA,CAAM,8BAAcA,GAAAA,CAAC,UAAK,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,KAAA,CAAM,WAAA,EAAY,CAAA,GAAU;AAAA,KAAA,EAC1F,CAAA;AAAA,IACC,KAAA,CAAM,OAAA,EAAS,MAAA,mBACdA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBAClBA,GAAAA,CAAC,QAAA,EAAA,EAA0B,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,iCAAA,EAAkC,WAAA,EAAW,MAAA,CAAO,MAAM,OAAA,EAAS,MAAA,CAAO,OAAA,EAC1H,QAAA,EAAA,MAAA,CAAO,KAAA,EAAA,EADG,MAAA,CAAO,KAEpB,CACD,GACH,CAAA,GACE,IAAA;AAAA,oBACJA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,cAAA,EAAe,YAAA,EAAY,KAAA,CAAM,UAAA,IAAc,SAAA,EAAW,OAAA,EAAS,SAAS,QAAA,EAAA,MAAA,EAE5G;AAAA,GAAA,EACF,CAAA;AAEJ;AASO,SAAS,aAAA,GAAgB;AAC9B,EAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAI,SAAA,EAAU;AAC1C,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAkB,IAAA,EAAK,KAAA,EAAM,YAAA,EAAW,eAAA,EACpD,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,qBACXA,GAAAA,CAAC,KAAA,EAAA,EAAqB,KAAA,EAAc,OAAA,EAAS,MAAM,WAAA,CAAY,KAAA,CAAM,EAAE,CAAA,EAAA,EAA3D,KAAA,CAAM,EAAwD,CAC3E,CAAA,EACH,CAAA;AAEJ;ACqCA,IAAM,iBAAA,GAAoBe,aAAAA,CAA8B,EAAE,CAAA;AAenD,SAAS,0BAAA,CAA2B,EAAE,SAAA,EAAW,QAAA,EAAS,EAAgC;AAC/F,EAAA,MAAM,KAAA,GAAQC,WAAW,iBAAiB,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQG,QAAwB,MAAM;AAC1C,IAAA,IAAI,CAAC,WAAW,OAAO,KAAA;AACvB,IAAA,MAAM,MAAA,GAAkC,EAAE,GAAG,KAAA,EAAM;AACnD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACnD,MAAA,IAAI,SAAS,MAAA,EAAW;AACxB,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA;AAAA,IAChB;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAA,EAAO,SAAS,CAAC,CAAA;AACrB,EAAA,uBAAOnB,GAAAA,CAAC,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,OAAe,QAAA,EAAS,CAAA;AAC7D;AASO,SAAS,qBAAA,GAAwC;AACtD,EAAA,OAAOgB,WAAW,iBAAiB,CAAA;AACrC;ACpLA,IAAM,cAAA,GAAiBD,cAA0C,IAAI,CAAA;AAc9D,SAAS,uBAAA,CAAwB,EAAE,QAAA,EAAS,EAAiC;AAClF,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIlB,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQsB,QAA6B,OAAO,EAAE,YAAY,aAAA,EAAc,CAAA,EAAI,CAAC,UAAU,CAAC,CAAA;AAC9F,EAAA,uBACEpB,IAAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EAAwB,KAAA,EACtB,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,UAAA,GAAa,IAAA,mBAAOC,GAAAA,CAAC,SAAA,EAAA,EAAU;AAAA,GAAA,EAClC,CAAA;AAEJ;AAkBO,SAAS,gBAAgB,EAAE,OAAA,EAAS,GAAA,EAAK,QAAA,EAAU,UAAS,EAAyB;AAC1F,EAAA,IAAI,CAAC,WAAW,QAAA,EAAU,uBAAOA,GAAAA,CAAAU,UAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AAC7C,EAAA,uBACEV,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAA0B,KAAA,EAAO,EAAE,SAAS,UAAA,EAAW,EAAG,gBAAc,OAAA,EAAU,GAAI,MAAM,EAAE,eAAA,EAAiB,KAAI,GAAI,IACpI,QAAA,EACH,CAAA;AAEJ;AAUO,SAAS,eAAA,GAAwB;AACtC,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,QAAA,CAAS,aAAA,CAAc,IAAI,YAAA,CAAa,aAAA,EAAe,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC3E;AAGO,SAAS,qBAAA,GAAuD;AACrE,EAAA,MAAM,GAAA,GAAMgB,WAAW,cAAc,CAAA;AACrC,EAAA,OAAOC,WAAAA;AAAA,IACL,CAAC,UAAA,KAAwB;AACvB,MAAA,GAAA,EAAK,cAAc,UAAU,CAAA;AAAA,IAC/B,CAAA;AAAA,IACA,CAAC,GAAG;AAAA,GACN;AACF;ACzDO,SAAS,wBAAwB,EAAE,SAAA,EAAW,YAAY,SAAA,EAAW,WAAA,EAAa,UAAS,EAA6B;AAC7H,EAAA,MAAM,eAA6C,SAAA,EAAW,YAAA;AAC9D,EAAA,uBACEjB,GAAAA,CAAC,sBAAA,EAAA,EAAwB,GAAI,SAAA,GAAY,EAAE,OAAA,EAAS,SAAA,EAAU,GAAI,EAAC,EACjE,QAAA,kBAAAA,GAAAA,CAAC,2BAAA,EAAA,EAA6B,GAAI,YAAA,GAAe,EAAE,SAAA,EAAW,YAAA,EAAa,GAAI,EAAC,EAC9E,QAAA,kBAAAA,GAAAA,CAAC,kBAAA,EAAA,EAAoB,GAAI,WAAA,GAAc,EAAE,aAAY,GAAI,EAAC,EACxD,QAAA,kBAAAA,GAAAA,CAAC,oBAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,sBAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,uBAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,0BAAA,EAAA,EAA4B,GAAI,UAAA,GAAa,EAAE,SAAA,EAAW,UAAA,EAAW,GAAI,EAAC,EACzE,QAAA,kBAAAA,GAAAA,CAAC,uBAAA,EAAA,EAAyB,QAAA,EAAS,CAAA,EACrC,CAAA,EACF,CAAA,EACF,CAAA,EACF,CAAA,EACF,GACF,CAAA,EACF,CAAA;AAEJ;AAUO,SAAS,iBAAA,GAAoB;AAClC,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAa,WAAA,KAAgB,SAAA,EAAU;AACzD,EAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAc,YAAA,KAAiB,UAAA,EAAW;AAC7D,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,OAAA,EAAQ;AAC7B,EAAA,MAAM,MAAM,cAAA,EAAe;AAE3B,EAAA,OAAOiB,OAAAA;AAAA,IACL,OAAO;AAAA,MACL,QAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAA;AAAA;AAAA,MAEA,aAAa,MAAM;AACjB,QAAA,MAAM,GAAA,GAAM,OAAO,oBAAA,EAAqB;AACxC,QAAA,IAAI,CAAC,GAAA,EAAK;AACV,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,OAAO,CAAA;AACvC,QAAA,KAAA,CAAM,IAAA,GAAO,MAAA;AACb,QAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AACjB,QAAA,KAAA,CAAM,MAAA,GAAS,iBAAA;AACf,QAAA,KAAA,CAAM,MAAM,OAAA,GAAU,MAAA;AACtB,QAAA,KAAA,CAAM,gBAAA,CAAiB,UAAU,MAAM;AACrC,UAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,KAAA,IAAS,EAAE,CAAA;AAC1C,UAAA,KAAA,CAAM,MAAA,EAAO;AACb,UAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,UAAA,KAAK,MAAA,CAAO,kBAAA,CAAmB,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,KAAA,EAAO,MAAA,CAAO,qBAAA,EAAsB,EAAG,CAAA;AAAA,QAChG,CAAC,CAAA;AACD,QAAA,GAAA,CAAI,IAAA,CAAK,YAAY,KAAK,CAAA;AAC1B,QAAA,KAAA,CAAM,KAAA,EAAM;AAAA,MACd;AAAA,KACF,CAAA;AAAA,IACA,CAAC,QAAQ,QAAA,EAAU,WAAA,EAAa,aAAa,SAAA,EAAW,YAAA,EAAc,YAAA,EAAc,QAAA,EAAU,GAAG;AAAA,GACnG;AACF;ACrFA,IAAM,oBAAA,GAAuBJ,cAA2C,IAAI,CAAA;AAC5E,IAAM,sBAAA,GAAyBA,cAA6C,IAAI,CAAA;AASzE,SAAS,qBAAA,CAAsB,EAAE,KAAA,EAAO,QAAA,EAAS,EAA2B;AACjF,EAAA,MAAM,SAAA,GAAYC,UAAAA,CAAW,oBAAoB,CAAA,IAAK,EAAC;AACvD,EAAA,MAAM,KAAA,GAAQG,OAAAA,CAAQ,MAAO,OAAO,KAAA,KAAU,UAAA,GAAa,KAAA,CAAM,SAAS,CAAA,GAAI,KAAA,EAAQ,CAAC,KAAA,EAAO,SAAS,CAAC,CAAA;AACxG,EAAA,uBAAOnB,GAAAA,CAAC,oBAAA,CAAqB,QAAA,EAArB,EAA8B,OAAe,QAAA,EAAS,CAAA;AAChE;AASO,SAAS,uBAAA,CAAwB,EAAE,OAAA,EAAS,QAAA,EAAS,EAAyB;AACnF,EAAA,MAAM,SAAA,GAAYgB,UAAAA,CAAW,sBAAsB,CAAA,IAAK,EAAC;AACzD,EAAA,MAAM,KAAA,GAAQG,OAAAA,CAAQ,MAAO,OAAO,OAAA,KAAY,UAAA,GAAa,OAAA,CAAQ,SAAS,CAAA,GAAI,OAAA,EAAU,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAChH,EAAA,uBAAOnB,GAAAA,CAAC,sBAAA,CAAuB,QAAA,EAAvB,EAAgC,OAAe,QAAA,EAAS,CAAA;AAClE;AAGO,SAAS,gBAAA,GAAgD;AAC9D,EAAA,OAAOgB,WAAW,oBAAoB,CAAA;AACxC;AAGO,SAAS,kBAAA,GAAoD;AAClE,EAAA,OAAOA,WAAW,sBAAsB,CAAA;AAC1C;AAOO,SAAS,iBAAA,GAA6B;AAC3C,EAAA,MAAM,SAASd,SAAAA,EAAU;AACzB,EAAA,OAAOY,QAAAA,CAAS,kBAAkB,MAAM,CAAC,OAAO,aAAA,EAAc,EAAG,CAAC,MAAM,CAAC,CAAA;AAC3E;AC1BO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAIjB,QAAAA,CAAS,KAAA,IAAS,gBAAgB,EAAE,CAAA;AAC9D,EAAA,MAAM,SAAA,GAAYD,OAAO,KAAK,CAAA;AAE9B,EAAAE,UAAU,MAAM;AACd,IAAA,IAAI,UAAU,MAAA,EAAW;AACzB,IAAA,QAAA,CAAS,KAAK,CAAA;AACd,IAAA,SAAA,CAAU,OAAA,GAAU,KAAA;AAAA,EACtB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAC,gBAAA,EAAkB,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,GAAG,KAAA,EACtE,QAAA,EAAA;AAAA,IAAA,IAAA,mBAAOC,GAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAY,KAAA,EAAK,MAAC,CAAA,GAAK,IAAA;AAAA,oBAC7CA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,EAAA;AAAA,QACA,IAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,WAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACC,GAAI,KAAA,GAAQ,EAAE,YAAA,EAAc,KAAA,KAAU,EAAC;AAAA,QACxC,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,UAAA,IAAI,UAAA,EAAY,KAAA,CAAM,aAAA,CAAc,MAAA,EAAO;AAC3C,UAAA,OAAA,IAAU;AAAA,QACZ,CAAA;AAAA,QACA,QAAQ,MAAM;AACZ,UAAA,UAAA,GAAa,KAAK,CAAA;AAClB,UAAA,SAAA,CAAU,OAAA,GAAU,KAAA;AACpB,UAAA,MAAA,IAAS;AAAA,QACX,CAAA;AAAA,QACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,QAAA,CAAS,KAAA,CAAM,OAAO,KAAK,CAAA;AAC3B,UAAA,aAAA,GAAgB,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,QACpC,CAAA;AAAA,QACA,SAAA,EAAW,CAAC,KAAA,KAAU;AACpB,UAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,EAAS;AACzB,YAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,YAAA,SAAA,CAAU,OAAA,GAAU,KAAA;AACpB,YAAA,UAAA,GAAa,KAAK,CAAA;AAClB,YAAA,KAAA,CAAM,cAAc,IAAA,EAAK;AAAA,UAC3B,CAAA,MAAA,IAAW,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAU;AACjC,YAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,YAAA,QAAA,CAAS,UAAU,OAAO,CAAA;AAC1B,YAAA,QAAA,GAAW,UAAU,OAAO,CAAA;AAC5B,YAAA,KAAA,CAAM,cAAc,IAAA,EAAK;AAAA,UAC3B;AAAA,QACF;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;ACxEO,SAAS,cAAA,CAAe;AAAA,EAC7B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAoB;AAClB,EAAA,MAAM,MAAA,GAASJ,OAAO,KAAK,CAAA;AAC3B,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,IAAI,OAAO,OAAA,EAAS;AACpB,IAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AACjB,IAAA,aAAA,GAAgB,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAA;AAAA,EACnC,CAAA;AACA,EAAA,uBACEI,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAW,CAAC,iBAAA,EAAmB,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MAClE,KAAA;AAAA,MACA,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,KAAA;AAAA,MACL,IAAA,EAAM,CAAA;AAAA,MAGN,OAAO,KAAA,IAAS,CAAA;AAAA,MAChB,QAAA;AAAA,MACA,YAAA,EAAY,KAAA;AAAA,MACX,GAAI,KAAA,GAAQ,EAAE,cAAA,EAAgB,KAAA,KAAU,EAAC;AAAA,MACzC,GAAI,KAAA,KAAU,IAAA,GAAO,EAAE,gBAAA,EAAkB,OAAA,KAAY,EAAC;AAAA,MACtD,GAAI,IAAA,CAAK,aAAa,CAAA,GAAI,EAAE,eAAe,IAAA,CAAK,aAAa,CAAA,EAAE,GAAI,EAAC;AAAA,MACrE,aAAA,EAAe,IAAA;AAAA,MACf,SAAA,EAAW,IAAA;AAAA,MACX,WAAA,EAAa,MAAO,MAAA,CAAO,OAAA,GAAU,KAAA;AAAA,MACrC,MAAA,EAAQ,MAAO,MAAA,CAAO,OAAA,GAAU,KAAA;AAAA,MAChC,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,IAAA,EAAK;AACL,QAAA,aAAA,CAAc,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MAC1C;AAAA;AAAA,GACF;AAEJ;ACvDA,IAAM,KAAA,GAAgC,EAAE,KAAA,EAAO,YAAA,EAAc,QAAQ,QAAA,EAAU,GAAA,EAAK,UAAA,EAAY,OAAA,EAAS,SAAA,EAAU;AACnH,IAAM,OAAA,GAAkC,EAAE,KAAA,EAAO,YAAA,EAAc,QAAQ,QAAA,EAAU,GAAA,EAAK,UAAA,EAAY,OAAA,EAAS,eAAA,EAAgB;AAGpH,SAAS,WAAA,CAAY,EAAE,KAAA,GAAQ,QAAA,EAAU,OAAA,GAAU,OAAA,EAAS,GAAA,GAAM,CAAA,EAAG,SAAA,EAAW,KAAA,EAAO,QAAA,EAAS,EAAoB;AACzH,EAAA,uBACEA,GAAAA,CAAC,2BAAA,EAAA,EAA4B,WAAA,EAAY,cACvC,QAAA,kBAAAA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAC,cAAA,EAAgB,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MAC/D,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,OAAO,UAAA,EAAY,KAAA,CAAM,KAAK,CAAA,EAAG,gBAAgB,OAAA,CAAQ,OAAO,CAAA,EAAG,GAAA,EAAK,GAAG,KAAA,EAAM;AAAA,MAEzH;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAGO,SAAS,cAAA,CAAe,EAAE,KAAA,GAAQ,SAAA,EAAW,OAAA,GAAU,OAAA,EAAS,GAAA,GAAM,CAAA,EAAG,SAAA,EAAW,KAAA,EAAO,QAAA,EAAS,EAAoB;AAC7H,EAAA,uBACEA,GAAAA,CAAC,2BAAA,EAAA,EAA4B,WAAA,EAAY,YACvC,QAAA,kBAAAA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAC,iBAAA,EAAmB,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MAClE,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,UAAU,UAAA,EAAY,KAAA,CAAM,KAAK,CAAA,EAAG,gBAAgB,OAAA,CAAQ,OAAO,CAAA,EAAG,GAAA,EAAK,GAAG,KAAA,EAAM;AAAA,MAE5H;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAcO,SAAS,YAAA,CAAa,EAAE,OAAA,GAAU,CAAA,EAAG,MAAM,CAAA,EAAG,SAAA,EAAW,KAAA,EAAO,QAAA,EAAS,EAAkB;AAChG,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAC,eAAA,EAAiB,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MAChE,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,mBAAA,EAAqB,UAAU,OAAO,CAAA,iBAAA,CAAA,EAAqB,GAAA,EAAK,GAAG,KAAA,EAAM;AAAA,MAElG;AAAA;AAAA,GACH;AAEJ;ACvDA,IAAM,cAAA,GAAiBe,cAA0C,IAAI,CAAA;AAErE,SAAS,kBAAkB,SAAA,EAAwC;AACjE,EAAA,MAAM,KAAA,GAAQC,WAAW,cAAc,CAAA;AACvC,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,kCAAA,CAAoC,CAAA;AAC5E,EAAA,OAAO,KAAA;AACT;AAcO,SAAS,eAAA,CAAgB,EAAE,EAAA,EAAI,IAAA,EAAM,YAAY,YAAA,EAAc,IAAA,GAAO,OAAA,EAAS,QAAA,EAAS,EAAqB;AAClH,EAAA,MAAM,YAAY,KAAA,EAAM;AACxB,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAInB,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,SAAA,GAAYD,OAA2B,IAAI,CAAA;AACjD,EAAA,MAAM,OAAO,UAAA,IAAc,YAAA;AAE3B,EAAA,MAAM,OAAA,GAAUqB,WAAAA;AAAA,IACd,CAAC,IAAA,KAAkB;AACjB,MAAA,IAAI,UAAA,KAAe,MAAA,EAAW,eAAA,CAAgB,IAAI,CAAA;AAClD,MAAA,YAAA,GAAe,IAAI,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,CAAC,YAAY,YAAY;AAAA,GAC3B;AAEA,EAAA,MAAM,KAAA,GAAQE,OAAAA;AAAA,IACZ,OAAO,EAAE,EAAA,EAAI,EAAA,IAAM,WAAW,IAAA,EAAM,OAAA,EAAS,WAAW,IAAA,EAAK,CAAA;AAAA,IAC7D,CAAC,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAS,IAAI;AAAA,GACrC;AACA,EAAA,uBAAOnB,GAAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EAAwB,OAAe,QAAA,EAAS,CAAA;AAC1D;AAcO,SAAS,sBAAA,CAAuB,EAAE,SAAA,EAAW,QAAA,EAAS,EAA4B;AACvF,EAAA,MAAM,EAAE,EAAA,EAAI,IAAA,EAAM,SAAS,SAAA,EAAU,GAAI,kBAAkB,wBAAwB,CAAA;AACnF,EAAA,uBACEA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,CAAC,IAAA,KAAS;AACb,QAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,MACtB,CAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAW,CAAC,cAAA,EAAgB,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MAC/D,eAAA,EAAc,QAAA;AAAA,MACd,eAAA,EAAe,IAAA;AAAA,MACf,eAAA,EAAe,GAAG,EAAE,CAAA,QAAA,CAAA;AAAA,MACpB,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAC,IAAI,CAAA;AAAA,MAE3B;AAAA;AAAA,GACH;AAEJ;AAYO,SAAS,uBAAuB,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,UAAS,EAA4B;AACpG,EAAA,MAAM,GAAA,GAAM,kBAAkB,wBAAwB,CAAA;AACtD,EAAA,MAAM,KAAA,GAAQiB,YAAY,MAAM,GAAA,CAAI,QAAQ,KAAK,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AACzD,EAAA,uBACEjB,GAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,QAAQ,GAAA,CAAI,IAAA;AAAA,MACpB,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAa,KAAA;AAAA,MACb,SAAA,EAAW,CAAC,kBAAA,EAAoB,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MAClE,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU,EAAC;AAAA,MAE1B,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,EAAA,EAAI,GAAG,GAAA,CAAI,EAAE,YAAa,QAAA,EAAS;AAAA;AAAA,GAC1C;AAEJ;AC9FA,IAAM,aAAA,GAAgBe,cAAgD,IAAI,CAAA;AAE1E,SAAS,UAAa,SAAA,EAA0C;AAC9D,EAAA,MAAM,KAAA,GAAQC,WAAW,aAAa,CAAA;AACtC,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,iCAAA,CAAmC,CAAA;AAC3E,EAAA,OAAO,KAAA;AACT;AAYO,SAAS,cAAA,CAA2B,EAAE,EAAA,EAAI,KAAA,EAAO,eAAe,IAAA,EAAM,UAAA,EAAY,YAAA,EAAc,QAAA,EAAS,EAAuB;AACrI,EAAA,MAAM,YAAYK,KAAAA,EAAM;AACxB,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIxB,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,SAAA,GAAYD,OAA2B,IAAI,CAAA;AACjD,EAAA,MAAM,MAAA,GAASA,MAAAA,iBAAO,IAAI,GAAA,EAAmB,CAAA,CAAE,OAAA;AAC/C,EAAA,MAAM,OAAO,UAAA,IAAc,YAAA;AAC3B,EAAA,MAAM,OAAA,GAAUqB,WAAAA;AAAA,IACd,CAAC,IAAA,KAAkB;AACjB,MAAA,IAAI,UAAA,KAAe,MAAA,EAAW,eAAA,CAAgB,IAAI,CAAA;AAClD,MAAA,YAAA,GAAe,IAAI,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,CAAC,YAAY,YAAY;AAAA,GAC3B;AACA,EAAA,MAAM,GAAA,GAAME,OAAAA;AAAA,IACV,OAAO,EAAE,EAAA,EAAI,EAAA,IAAM,SAAA,EAAW,MAAM,OAAA,EAAS,KAAA,EAAO,aAAA,EAAe,SAAA,EAAW,MAAA,EAAO,CAAA;AAAA,IACrF,CAAC,EAAA,EAAI,SAAA,EAAW,MAAM,OAAA,EAAS,KAAA,EAAO,eAAe,MAAM;AAAA,GAC7D;AACA,EAAA,uBAAOnB,GAAAA,CAAC,aAAA,CAAc,UAAd,EAAuB,KAAA,EAAO,KAA8C,QAAA,EAAS,CAAA;AAC/F;AAUO,SAAS,sBAAsB,EAAE,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,UAAS,EAA2B;AACtG,EAAA,MAAM,GAAA,GAAM,UAAkB,uBAAuB,CAAA;AACrD,EAAA,uBACED,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,CAAC,IAAA,KAAS;AACb,QAAA,GAAA,CAAI,UAAU,OAAA,GAAU,IAAA;AAAA,MAC1B,CAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,IAAA,EAAK,UAAA;AAAA,MACL,eAAA,EAAc,SAAA;AAAA,MACd,iBAAe,GAAA,CAAI,IAAA;AAAA,MACnB,eAAA,EAAe,CAAA,EAAG,GAAA,CAAI,EAAE,CAAA,QAAA,CAAA;AAAA,MACxB,SAAA,EAAW,CAAC,iBAAA,EAAmB,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MAClE,QAAA;AAAA,MACC,GAAI,KAAA,GAAQ,EAAE,YAAA,EAAc,KAAA,KAAU,EAAC;AAAA,MACxC,SAAS,MAAM,GAAA,CAAI,OAAA,CAAQ,CAAC,IAAI,IAAI,CAAA;AAAA,MAEnC,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBACDC,GAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAK,cAAA,EAAe,OAAK,IAAA,EAAC;AAAA;AAAA;AAAA,GAC1C;AAEJ;AASO,SAAS,mBAAA,CAAoB,EAAE,WAAA,EAAa,SAAA,EAAU,EAAyB;AACpF,EAAA,MAAM,GAAA,GAAM,UAAkB,qBAAqB,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,KAAU,MAAA,GAAY,SAAY,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AAC5E,EAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,CAAC,uBAAA,EAAyB,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA,EAAI,mBAAS,WAAA,IAAe,GAAA,CAAI,SAAS,EAAA,EAAG,CAAA;AACnI;AAUO,SAAS,sBAAsB,EAAE,KAAA,EAAO,WAAW,IAAA,GAAO,OAAA,EAAS,UAAS,EAA2B;AAC5G,EAAA,MAAM,GAAA,GAAM,UAAkB,uBAAuB,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQiB,YAAY,MAAM,GAAA,CAAI,QAAQ,KAAK,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AACzD,EAAA,uBACEjB,GAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,IAAA;AAAA,MACR,IAAA,EAAK,SAAA;AAAA,MACL,SAAA,EAAW,CAAC,eAAA,EAAiB,sBAAA,EAAwB,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MACvF,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU,EAAC;AAAA,MAE1B,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,EAAA,EAAI,GAAG,GAAA,CAAI,EAAE,YAAa,QAAA,EAAS;AAAA;AAAA,GAC1C;AAEJ;AAgBO,SAAS,mBAA+B,EAAE,KAAA,EAAO,QAAA,EAAU,SAAA,EAAW,UAAS,EAA2B;AAC/G,EAAA,MAAM,GAAA,GAAM,UAAa,oBAAoB,CAAA;AAC7C,EAAA,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,QAAQ,CAAA;AAC9B,EAAA,MAAM,QAAA,GAAW,IAAI,KAAA,KAAU,KAAA;AAC/B,EAAA,uBACEA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,IAAA,EAAK,QAAA;AAAA,MACL,eAAA,EAAe,QAAA;AAAA,MACf,SAAA,EAAW,CAAC,oBAAA,EAAsB,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MACrE,QAAA;AAAA,MACA,SAAS,MAAM;AACb,QAAA,GAAA,CAAI,gBAAgB,KAAK,CAAA;AACzB,QAAA,GAAA,CAAI,QAAQ,KAAK,CAAA;AAAA,MACnB,CAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AChJO,SAAS,eAAA,CAAgB,EAAE,KAAA,EAAO,WAAA,GAAc,cAAc,SAAA,EAAW,KAAA,EAAO,GAAA,EAAK,QAAA,EAAS,EAAqB;AACxH,EAAA,MAAM,GAAA,GAAMJ,OAAuB,IAAI,CAAA;AAEvC,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAA+C;AAChE,IAAA,MAAM,OAAO,GAAA,CAAI,OAAA;AACjB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,aAAa,WAAA,KAAgB,YAAA;AACnC,IAAA,MAAM,IAAA,GAAO,aAAa,YAAA,GAAe,WAAA;AACzC,IAAA,MAAM,IAAA,GAAO,aAAa,WAAA,GAAc,SAAA;AACxC,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,IAAA,IAAQ,KAAA,CAAM,GAAA,KAAQ,IAAA,IAAQ,KAAA,CAAM,GAAA,KAAQ,MAAA,IAAU,KAAA,CAAM,GAAA,KAAQ,KAAA,EAAO;AAC7F,IAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAA8B,mEAAmE,CAAC,CAAA;AAChI,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,cAAc,aAA4B,CAAA;AAC3E,IAAA,IAAI,MAAM,GAAA,KAAQ,MAAA,EAAQ,KAAA,CAAM,CAAC,GAAG,KAAA,EAAM;AAAA,SAAA,IACjC,KAAA,CAAM,QAAQ,KAAA,EAAO,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,GAAG,KAAA,EAAM;AAAA,SAAA,IACpD,KAAA,CAAM,QAAQ,IAAA,EAAM,KAAA,CAAA,CAAO,QAAQ,CAAA,IAAK,KAAA,CAAM,MAAM,CAAA,EAAG,KAAA,EAAM;AAAA,SACjE,KAAA,CAAA,CAAO,QAAQ,CAAA,GAAI,KAAA,CAAM,UAAU,KAAA,CAAM,MAAM,GAAG,KAAA,EAAM;AAAA,EAC/D,CAAA;AAEA,EAAA,uBACEI,GAAAA,CAAC,2BAAA,EAAA,EAA4B,WAAA,EAC3B,QAAA,kBAAAA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,CAAC,IAAA,KAAS;AACb,QAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AACd,QAAA,IAAI,OAAO,GAAA,KAAQ,UAAA,EAAY,GAAA,CAAI,IAAI,CAAA;AAAA,aAAA,IAC9B,GAAA,EAAM,GAAA,CAA2C,OAAA,GAAU,IAAA;AAAA,MACtE,CAAA;AAAA,MACA,IAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAY,KAAA;AAAA,MACZ,kBAAA,EAAkB,WAAA;AAAA,MAClB,SAAA,EAAW,CAAC,gBAAA,EAAkB,kBAAA,EAAoB,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MACrF,KAAA;AAAA,MACA,SAAA;AAAA,MAEC;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAeO,SAAS,qBAAA,CAAsB,EAAE,IAAA,GAAO,MAAA,EAAQ,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,SAAA,EAAW,GAAA,EAAK,OAAA,EAAS,QAAA,EAAU,GAAG,MAAK,EAA2B;AACtJ,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAY,CAAA,IAAK,KAAA;AACpC,EAAA,uBACEA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAW,CAAC,cAAA,EAAgB,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MACxF,QAAA;AAAA,MACC,GAAI,QAAQ,EAAE,YAAA,EAAc,OAAO,cAAA,EAAgB,KAAA,IAAS,KAAA,EAAM,GAAI,EAAC;AAAA,MACvE,GAAI,QAAA,KAAa,MAAA,GAAY,EAAC,GAAI,EAAE,gBAAgB,QAAA,EAAS;AAAA,MAC9D,OAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AASA,IAAM,kBAAA,GAAqBe,cAAuC,IAAI,CAAA;AAmB/D,SAAS,0BAAA,CAA2B,EAAE,KAAA,EAAO,IAAA,GAAO,QAAA,EAAU,KAAA,EAAO,MAAA,GAAS,EAAC,EAAG,aAAA,EAAe,SAAA,EAAW,QAAA,EAAS,EAAgC;AAC1J,EAAA,uBACEf,GAAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,OAAO,EAAE,KAAA,EAAO,aAAA,EAAe,aAAA,IAAiB,QAAW,IAAA,EAAM,MAAA,EAAO,EACnG,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAC,cAAA,EAAgB,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA,EAAG,IAAA,EAAM,IAAA,KAAS,WAAW,YAAA,GAAe,OAAA,EAAS,YAAA,EAAY,KAAA,EAClI,UACH,CAAA,EACF,CAAA;AAEJ;AAYO,SAAS,yBAAA,CAA0B,EAAE,KAAA,EAAO,IAAA,GAAO,QAAQ,QAAA,EAAU,KAAA,EAAO,SAAA,EAAW,QAAA,EAAS,EAA+B;AACpI,EAAA,MAAM,KAAA,GAAQgB,WAAW,kBAAkB,CAAA;AAC3C,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,sBAAA,EAAuB;AACpD,EAAA,MAAM,MAAA,GAAS,OAAO,IAAA,KAAS,UAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,MAAA,GAAS,KAAA,EAAO,KAAA,KAAU,KAAA,GAAA,CAAS,OAAO,MAAA,IAAU,EAAC,EAAG,QAAA,CAAS,KAAK,CAAA;AACtF,EAAA,uBACEhB,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,IAAA,EAAM,SAAS,OAAA,GAAU,UAAA;AAAA,MACzB,cAAA,EAAc,OAAA;AAAA,MAGd,QAAA,EAAU,MAAA,GAAU,OAAA,GAAU,CAAA,GAAI,EAAA,GAAM,CAAA;AAAA,MACxC,SAAA,EAAW,CAAC,cAAA,EAAgB,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MACxF,QAAA;AAAA,MACC,GAAI,QAAQ,EAAE,YAAA,EAAc,OAAO,cAAA,EAAgB,KAAA,KAAU,EAAC;AAAA,MAC/D,OAAA,EAAS,MAAM,KAAA,EAAO,aAAA,GAAgB,KAAK,CAAA;AAAA,MAC3C,SAAA,EAAW,CAAC,KAAA,KAAU;AACpB,QAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,OAAA,IAAW,KAAA,CAAM,QAAQ,OAAA,EAAS;AACpD,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,aAAA;AACnC,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,MAAA,EAAQ,iBAA8B,kCAAkC,CAAA,IAAK,EAAE,CAAA;AACxG,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,aAAa,CAAA;AAC/C,QAAA,MAAM,MAAA,GAAS,KAAA,CAAA,CAAO,KAAA,IAAS,KAAA,CAAM,GAAA,KAAQ,OAAA,GAAU,CAAA,GAAI,EAAA,CAAA,GAAM,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAM,CAAA;AAC7F,QAAA,MAAA,EAAQ,KAAA,EAAM;AACd,QAAA,MAAA,EAAQ,KAAA,EAAM;AAAA,MAChB,CAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AC1JA,IAAM,GAAA,GAAM,EAAA;AAaL,SAAS,0BAA0B,EAAE,KAAA,EAAO,oBAAoB,MAAA,EAAQ,SAAA,EAAW,UAAS,EAA+B;AAChI,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,MAAM,GAAA,GAAMN,OAAuB,IAAI,CAAA;AACvC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIC,QAAAA,CAAS,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AAE/C,EAAA,MAAM,MAAA,GAASiB,QAAAA,CAAS,2BAAA,EAA6B,MAAM,kBAAA,IAAqB,IAAK,MAAA,CAAO,sBAAA,EAAuB,IAAK,MAAA,EAAW,CAAC,MAAA,EAAQ,kBAAkB,CAAC,CAAA;AAC/J,EAAA,MAAM,MAAA,GAASA,SAAS,2BAAA,EAA6B,MAAM,OAAO,SAAA,EAAU,EAAG,CAAC,MAAM,CAAC,CAAA;AACvF,EAAA,MAAM,QAAA,GAAWA,SAAS,6BAAA,EAA+B,MAAM,OAAO,uBAAA,EAAwB,EAAG,CAAC,MAAM,CAAC,CAAA;AAEzG,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,IAAA,GAAO,GAAG,qBAAA,EAAsB;AACtC,IAAA,OAAA,CAAQ,CAAC,OAAA,KAAa,OAAA,CAAQ,MAAM,IAAA,CAAK,KAAA,IAAS,QAAQ,CAAA,KAAM,IAAA,CAAK,MAAA,GAAS,OAAA,GAAU,EAAE,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAA,CAAK,QAAS,CAAA;AAAA,EAC5H,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAErB,EAAA,IAAI,MAAA,IAAU,CAAC,MAAA,EAAQ,OAAO,IAAA;AAE9B,EAAA,MAAM,IAAA,GAAA,CAAQ,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,CAAA,GAAI,MAAA,CAAO,CAAA,IAAK,MAAA,CAAO,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,CAAA;AACxE,EAAA,MAAM,KAAA,GAAA,CAAS,OAAO,CAAA,GAAI,MAAA,CAAO,KAAK,MAAA,CAAO,CAAA,GAAI,KAAK,CAAA,GAAI,GAAA;AAC1D,EAAA,MAAM,KAAA,GAAA,CAAS,OAAO,CAAA,GAAI,MAAA,CAAO,IAAI,MAAA,CAAO,CAAA,IAAK,OAAO,CAAA,GAAI,GAAA;AAC5D,EAAA,MAAM,GAAA,GAAM,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,KAAA;AAChC,EAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,IAAI,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,SAAS,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,GAAG,CAAC,CAAC,CAAA;AAE1F,EAAA,uBACEd,GAAAA,CAAC,YAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,SAAI,SAAA,EAAU,6BAAA,EAA8B,KAAA,EAAO,EAAE,UAAU,UAAA,EAAY,IAAA,EAAM,aAAa,GAAA,EAAK,MAAA,EAAQ,IAAG,EAC7G,QAAA,kBAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,KAAU,KAAA,EAAc,SAAA,EAAsB,OAAO,EAAE,QAAA,EAAU,YAAY,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAG,MAAA,EAAQ,GAAE,EACnI,QAAA,EACH,GACF,CAAA,EACF,CAAA;AAEJ;;;AChDO,IAAM,uBAAA,GAA0B;AAGvC,IAAI,cAAA,GAAiB,EAAA;AAGd,SAAS,yBAAA,CAA0B,MAAA,EAAgB,GAAA,GAA0B,MAAA,CAAO,qBAAoB,EAAkB;AAC/H,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,yBAAA,CAA0B,GAAG,CAAA;AACpD,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,OAAO,KAAK,SAAA,CAAU,EAAE,MAAM,uBAAA,EAAyB,GAAG,SAAS,CAAA;AACrE;AAGA,eAAsB,wBAAA,CAAyB,MAAA,EAAgB,GAAA,GAA0B,MAAA,CAAO,qBAAoB,EAAqB;AACvI,EAAA,MAAM,IAAA,GAAO,yBAAA,CAA0B,MAAA,EAAQ,GAAG,CAAA;AAClD,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,cAAA,GAAiB,IAAA;AACjB,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,CAAU,SAAA,EAAW,SAAA,CAAU,IAAI,CAAA;AAAA,EAC3C,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,IAAA;AACT;AAGA,eAAsB,uBAAA,CAAwB,MAAA,EAAgB,GAAA,GAA0B,MAAA,CAAO,qBAAoB,EAAqB;AACtI,EAAA,MAAM,MAAA,GAAS,MAAM,wBAAA,CAAyB,MAAA,EAAQ,GAAG,CAAA;AACzD,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,EAAA,MAAA,CAAO,yBAAyB,KAAK,CAAA;AACrC,EAAA,MAAA,CAAO,YAAA,CAAa,CAAC,GAAG,GAAG,CAAC,CAAA;AAC5B,EAAA,OAAO,IAAA;AACT;AAGA,eAAsB,kBAAA,CAAmB,MAAA,EAAgB,KAAA,GAAQ,MAAA,CAAO,uBAAsB,EAAqB;AACjH,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI;AACF,IAAA,IAAA,GAAQ,MAAM,SAAA,CAAU,SAAA,EAAW,QAAA,EAAS,IAAM,EAAA;AAAA,EACpD,CAAA,CAAA,MAAQ;AACN,IAAA,IAAA,GAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,MAAM,IAAA,GAAO,cAAA;AAClB,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC5B,IAAA,IAAI,IAAA,CAAK,SAAS,uBAAA,IAA2B,CAAC,MAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG,OAAO,KAAA;AACjF,IAAA,MAAA,CAAO,yBAAyB,OAAO,CAAA;AACvC,IAAA,MAAA,CAAO,yBAAA,CAA0B,IAAA,EAAe,EAAE,KAAA,EAAO,CAAA;AACzD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAwBA,eAAsB,MAAA,CACpB,MAAA,EACA,MAAA,GAAgC,KAAA,EAChC,GAAA,GAA0B,OAAO,mBAAA,EAAoB,EACrD,IAAA,GAAsB,EAAC,EACR;AACf,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,MAAM,wBAAA,CAAyB,QAAQ,GAAG,CAAA;AAC1C,IAAA;AAAA,EACF;AACA,EAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,MAAA,EAAQ,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,CAAC,GAAG,GAAG,GAAG,CAAA;AAC1E,EAAA,MAAM,oBAAoB,IAAI,CAAA;AAChC;AAGA,eAAsB,QAAA,CACpB,MAAA,EACA,MAAA,GAAuB,KAAA,EACvB,GAAA,GAA0B,OAAO,mBAAA,EAAoB,EACrD,IAAA,GAAwB,EAAC,EACV;AACf,EAAA,MAAM,EAAE,IAAA,EAAM,GAAG,IAAA,EAAK,GAAI,IAAA;AAC1B,EAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,MAAA,EAAQ,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,CAAC,GAAG,GAAG,GAAG,CAAA;AAC1E,EAAA,MAAM,IAAA,GAAO,OAAO,cAAA,EAAe;AACnC,EAAA,YAAA,CAAa,IAAA,EAAM,GAAG,IAAA,IAAQ,IAAA,EAAM,QAAQ,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AACnE;AASO,SAAS,eAAe,MAAA,EAAsB;AACnD,EAAA,MAAA,CAAO,kBAAA,IAAsB,KAAA,EAAM;AACrC;AC7FO,SAAS,WAAA,GAAc;AAC5B,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,MAAM,UAAU,0BAAA,EAA2B;AAC3C,EAAA,uBAAOF,GAAAA,CAAC,gBAAA,EAAA,EAAiB,IAAG,KAAA,EAAM,KAAA,EAAM,OAAM,IAAA,EAAK,OAAA,EAAQ,KAAI,OAAA,EAAQ,QAAA,EAAU,CAAC,OAAA,EAAS,QAAA,EAAU,MAAM,KAAK,uBAAA,CAAwB,MAAM,CAAA,EAAG,CAAA;AACnJ;AAGO,SAAS,YAAA,GAAe;AAC7B,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,MAAM,UAAU,0BAAA,EAA2B;AAC3C,EAAA,uBAAOF,GAAAA,CAAC,gBAAA,EAAA,EAAiB,IAAG,MAAA,EAAO,KAAA,EAAM,QAAO,IAAA,EAAK,WAAA,EAAY,KAAI,OAAA,EAAQ,QAAA,EAAU,CAAC,OAAA,EAAS,QAAA,EAAU,MAAM,KAAK,wBAAA,CAAyB,MAAM,CAAA,EAAG,CAAA;AAC1J;AAGO,SAAS,aAAA,GAAgB;AAC9B,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,uBAAOF,GAAAA,CAAC,gBAAA,EAAA,EAAiB,EAAA,EAAG,OAAA,EAAQ,OAAM,OAAA,EAAQ,GAAA,EAAI,OAAA,EAAQ,QAAA,EAAU,UAAU,QAAA,EAAU,MAAM,KAAK,kBAAA,CAAmB,MAAM,CAAA,EAAG,CAAA;AACrI;AAGO,SAAS,kBAAA,GAAqB;AACnC,EAAA,uBACED,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,WAAA,EACpB,QAAA,EAAA;AAAA,oBAAAC,IAAC,WAAA,EAAA,EAAY,CAAA;AAAA,oBACbA,IAAC,YAAA,EAAA,EAAa,CAAA;AAAA,oBACdA,IAAC,aAAA,EAAA,EAAc,CAAA;AAAA,oBACfA,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,oBACnBA,IAAC,cAAA,EAAA,EAAe;AAAA,GAAA,EAClB,CAAA;AAEJ;AAEA,IAAM,YAAA,GAAe,CAAC,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AAGnC,SAAS,eAAA,GAAkB;AAChC,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,MAAM,UAAU,0BAAA,EAA2B;AAC3C,EAAA,uBACEF,GAAAA,CAAC,mBAAA,EAAA,EAAoB,IAAG,SAAA,EAAU,KAAA,EAAM,WAAU,QAAA,EAAU,CAAC,OAAA,EAC3D,QAAA,kBAAAA,IAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,iBACnB,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,MAAA,qBACjBA,GAAAA,CAAC,gBAAA,EAAA,EAA8B,IAAI,CAAA,QAAA,EAAW,MAAM,IAAI,KAAA,EAAO,MAAA,CAAO,aAAY,EAAG,QAAA,EAAU,MAAM,KAAK,OAAO,MAAA,EAAQ,MAAM,KAAxG,MAA2G,CACnI,GACH,CAAA,EACF,CAAA;AAEJ;AAEA,IAAM,cAAA,GAAiB,CAAC,KAAA,EAAO,KAAA,EAAO,QAAQ,MAAM,CAAA;AAG7C,SAAS,iBAAA,GAAoB;AAClC,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,uBACEH,IAAAA,CAAC,mBAAA,EAAA,EAAoB,EAAA,EAAG,WAAA,EAAY,OAAM,WAAA,EACxC,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,iBAAA,EACnB,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,MAAA,qBACnBA,GAAAA,CAAC,gBAAA,EAAA,EAA8B,EAAA,EAAI,CAAA,UAAA,EAAa,MAAM,CAAA,CAAA,EAAI,KAAA,EAAO,MAAA,CAAO,WAAA,EAAY,EAAG,QAAA,EAAU,MAAM,KAAK,QAAA,CAAS,MAAA,EAAQ,MAAM,CAAA,EAAA,EAA5G,MAA+G,CACvI,CAAA,EACH,CAAA;AAAA,oBACAA,IAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,gBACpB,QAAA,kBAAAA,GAAAA,CAAC,+BAA4B,CAAA,EAC/B;AAAA,GAAA,EACF,CAAA;AAEJ;AAGO,SAAS,wBAAA,GAA2B;AACzC,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,uBACEF,GAAAA,CAAC,mBAAA,EAAA,EAAoB,EAAA,EAAG,MAAA,EAAO,KAAA,EAAM,MAAA,EACnC,QAAA,kBAAAD,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,YAAA,EACpB,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAG,gBAAA;AAAA,QACH,KAAA,EAAM,aAAA;AAAA,QACN,GAAA,EAAI,OAAA;AAAA,QACJ,UAAU,MAAM;AACd,UAAA,KAAK,OAAO,oBAAS,CAAA,CAAE,IAAA,CAAK,CAAC,EAAE,qBAAA,EAAAsB,wBAAsB,KAAM;AACzD,YAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAACA,sBAAAA,CAAsB,MAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,kBAAA,EAAoB,CAAA;AACnF,YAAA,KAAK,OAAO,sBAAW,CAAA,CAAE,KAAK,CAAC,EAAE,cAAAC,aAAAA,EAAa,KAAMA,aAAAA,CAAa,IAAA,EAAM,GAAG,MAAA,CAAO,cAAA,IAAkB,IAAA,IAAQ,SAAS,WAAW,CAAC,CAAA;AAAA,UAClI,CAAC,CAAA;AAAA,QACH;AAAA;AAAA,KACF;AAAA,oBACAvB,IAAC,SAAA,EAAA,EAAU;AAAA,GAAA,EACb,CAAA,EACF,CAAA;AAEJ;AAGO,SAAS,SAAA,GAAY;AAC1B,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,uBAAOF,GAAAA,CAAC,gBAAA,EAAA,EAAiB,EAAA,EAAG,OAAA,EAAQ,KAAA,EAAM,OAAA,EAAQ,GAAA,EAAI,OAAA,EAAQ,QAAA,EAAU,MAAM,cAAA,CAAe,MAAM,CAAA,EAAG,CAAA;AACxG;AAGO,SAAS,oBAAA,GAAuB;AACrC,EAAA,uBACED,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,aAAA,EACpB,QAAA,EAAA;AAAA,oBAAAC,IAAC,eAAA,EAAA,EAAgB,CAAA;AAAA,oBACjBA,IAAC,iBAAA,EAAA,EAAkB;AAAA,GAAA,EACrB,CAAA;AAEJ;AAOO,SAAS,cAAA,GAAiB;AAC/B,EAAA,uBAAOA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,QAAA,EAAS,CAAA;AACnD;AAGO,SAAS,iBAAA,GAAoB;AAClC,EAAA,uBAAOA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,WAAA,EAAY,CAAA;AACtD;AAGO,SAAS,aAAA,GAAgB;AAC9B,EAAA,uBAAOA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,OAAA,EAAQ,CAAA;AAClD;AAGO,SAAS,eAAA,GAAkB;AAChC,EAAA,uBAAOA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,SAAA,EAAU,CAAA;AACpD;AASO,IAAM,sBAAA,GAAyBQ,KAAAA,CAAM,SAASgB,uBAAAA,GAAyB;AAC5E,EAAA,MAAM,SAAStB,SAAAA,EAAU;AACzB,EAAA,MAAM,OAAA,GAAU,OAAO,iBAAA,EAAkB,CAAE,KAAK,CAAC,KAAA,KAAU,KAAA,CAAM,IAAA,KAAS,OAAO,CAAA;AACjF,EAAA,OAAO,0BAAUF,GAAAA,CAAC,mBAAgB,CAAA,mBAAKA,IAAC,aAAA,EAAA,EAAc,CAAA;AACxD,CAAC;AAGM,SAAS,iBAAA,GAAoB;AAClC,EAAA,uBAAOA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,YAAA,EAAa,CAAA;AACvD;AAGO,SAAS,gBAAA,GAAmB;AACjC,EAAA,uBAAOA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,WAAA,EAAY,CAAA;AACtD;AAGO,SAAS,kBAAA,GAAqB;AACnC,EAAA,uBAAOA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,aAAA,EAAc,CAAA;AACxD;AAGO,SAAS,iBAAA,GAAoB;AAClC,EAAA,MAAM,YAAY,kBAAA,EAAmB;AACrC,EAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AACvB,EAAA,uBAAOA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,YAAA,EAAa,CAAA;AACvD;AAGO,SAAS,SAAA,GAAY;AAC1B,EAAA,uBACED,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,MAAA,EACpB,QAAA,EAAA;AAAA,oBAAAC,IAAC,kBAAA,EAAA,EAAmB,CAAA;AAAA,oBACpBA,IAAC,iBAAA,EAAA,EAAkB;AAAA,GAAA,EACrB,CAAA;AAEJ;AAOO,SAAS,cAAA,GAAiB;AAC/B,EAAA,uBACED,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,OAAA,EACpB,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,YAAA,EAAa,CAAA;AAAA,oBAC9CA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,yBAAA,EAA0B,CAAA;AAAA,oBAC3DA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,aAAA,EAAc,CAAA;AAAA,oBAC/CA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,WAAA,EAAY,CAAA;AAAA,oBAC7CA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,uBAAA,EAAwB,CAAA;AAAA,oBACzDA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,cAAA,EAAe;AAAA,GAAA,EAClD,CAAA;AAEJ;AAGO,SAAS,mBAAA,GAAsB;AACpC,EAAA,uBACED,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,YAAA,EACpB,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,uBAAA,EAAwB,CAAA;AAAA,oBACzDA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,qBAAA,EAAsB;AAAA,GAAA,EACzD,CAAA;AAEJ;AAGO,SAAS,cAAA,GAAiB;AAC/B,EAAA,uBACED,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,OAAA,EACpB,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,kBAAA,EAAmB,CAAA;AAAA,oBACpDA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,gBAAA,EAAiB;AAAA,GAAA,EACpD,CAAA;AAEJ;AAGO,SAAS,gBAAA,GAAmB;AACjC,EAAA,uBACED,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,SAAA,EACpB,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,gBAAA,EAAiB,CAAA;AAAA,oBAClDA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,eAAA,EAAgB,CAAA;AAAA,oBACjDA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,eAAA,EAAgB,CAAA;AAAA,oBACjDA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,cAAA,EAAe;AAAA,GAAA,EAClD,CAAA;AAEJ;AAGO,SAAS,kBAAA,GAAqB;AACnC,EAAA,uBACEA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,EAAA,EAAG,SAAA,EAAU,OAAM,SAAA,EACtC,QAAA,kBAAAA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,CAAA,EACpB,CAAA;AAEJ;AAGO,SAAS,kBAAA,GAAqB;AACnC,EAAA,uBACED,IAAAA,CAAC,mBAAA,EAAA,EAAoB,EAAA,EAAG,SAAA,EAAU,OAAM,SAAA,EACtC,QAAA,EAAA;AAAA,oBAAAC,IAAC,cAAA,EAAA,EAAe,CAAA;AAAA,oBAChBA,IAAC,mBAAA,EAAA,EAAoB,CAAA;AAAA,oBACrBA,IAAC,cAAA,EAAA,EAAe,CAAA;AAAA,oBAChBD,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,SAAA,EACpB,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,oBAAA,EAAqB,CAAA;AAAA,sBACtDA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,kBAAA,EAAmB;AAAA,KAAA,EACtD,CAAA;AAAA,oBACAD,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,MAAA,EACpB,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,iBAAA,EAAkB,CAAA;AAAA,sBACnDA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,eAAA,EAAgB,CAAA;AAAA,sBACjDA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,MAAA,EAAO;AAAA,KAAA,EAC1C;AAAA,GAAA,EACF,CAAA;AAEJ;AAOO,IAAM,gBAAA,GAAmBQ,KAAAA,CAAM,SAASiB,iBAAAA,GAAmB;AAChE,EAAA,MAAM,SAASvB,SAAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,OAAO,oBAAA,EAAqB;AAC1C,EAAA,IAAI,CAAC,KAAA,IAAS,OAAQ,MAAM,KAAA,CAA4B,GAAA,KAAQ,UAAU,OAAO,IAAA;AACjF,EAAA,MAAM,KAAK,KAAA,CAAM,EAAA;AACjB,EAAA,uBAAOF,GAAAA,CAAC,gBAAA,EAAA,EAAiB,EAAA,EAAG,WAAA,EAAY,KAAA,EAAM,WAAA,EAAY,QAAA,EAAU,MAAM,MAAA,CAAO,eAAA,CAAgB,EAAE,CAAA,EAAG,CAAA;AACxG,CAAC;AAQM,IAAM,sBAAA,GAAyBQ,KAAAA,CAAM,SAASkB,uBAAAA,GAAyB;AAC5E,EAAA,MAAM,SAASxB,SAAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,OAAO,oBAAA,EAAqB;AAC1C,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,UAAA,IAAc,CAAC,MAAA,CAAO,YAAA,CAAa,OAAO,CAAA,EAAG,OAAO,IAAA;AACjF,EAAA,uBACEF,GAAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAG,kBAAA;AAAA,MACH,KAAA,EAAM,kBAAA;AAAA,MACN,UAAU,MAAM;AACd,QAAA,MAAM,GAAA,GAAO,MAAM,KAAA,CAA2B,GAAA;AAC9C,QAAA,IAAI,CAAC,GAAA,EAAK;AACV,QAAA,MAAA,CAAO,yBAAyB,kBAAkB,CAAA;AAClD,QAAA,KAAK,OAAO,0BAAwB,CAAA,CAAE,IAAA,CAAK,CAAC,EAAE,gBAAA,EAAA2B,mBAAiB,KAAM;AACnE,UAAA,MAAA,CAAO,YAAA,CAAa,CAAC,KAAA,CAAM,EAAE,CAAC,CAAA;AAC9B,UAAAA,iBAAAA,CAAiB,MAAA,EAAQ,GAAA,EAAK,EAAE,CAAA,EAAG,MAAM,CAAA,EAAG,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,CAAA;AAAA,QAC1D,CAAC,CAAA;AAAA,MACH;AAAA;AAAA,GACF;AAEJ,CAAC;AAGM,IAAM,yBAAA,GAA4BnB,KAAAA,CAAM,SAASoB,0BAAAA,GAA4B;AAClF,EAAA,MAAM,SAAS1B,SAAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,OAAO,oBAAA,EAAqB;AAC1C,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,OAAA,IAAW,CAAC,MAAA,CAAO,YAAA,CAAa,UAAU,CAAA,EAAG,OAAO,IAAA;AACjF,EAAA,uBACEF,GAAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAG,qBAAA;AAAA,MACH,KAAA,EAAM,qBAAA;AAAA,MACN,UAAU,MAAM;AACd,QAAA,MAAM,GAAA,GAAO,MAAM,KAAA,CAA2B,GAAA;AAC9C,QAAA,IAAI,CAAC,GAAA,EAAK;AACV,QAAA,MAAA,CAAO,yBAAyB,qBAAqB,CAAA;AACrD,QAAA,KAAK,OAAO,0BAAwB,CAAA,CAAE,IAAA,CAAK,CAAC,EAAE,mBAAA,EAAA6B,sBAAoB,KAAM;AACtE,UAAA,MAAA,CAAO,YAAA,CAAa,CAAC,KAAA,CAAM,EAAE,CAAC,CAAA;AAC9B,UAAAA,oBAAAA,CAAoB,MAAA,EAAQ,GAAA,EAAK,MAAA,EAAW,EAAE,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,CAAA;AAAA,QACxE,CAAC,CAAA;AAAA,MACH;AAAA;AAAA,GACF;AAEJ,CAAC;AAGM,IAAM,yBAAA,GAA4BrB,KAAAA,CAAM,SAASsB,0BAAAA,GAA4B;AAClF,EAAA,MAAM,SAAS5B,SAAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,OAAO,oBAAA,EAAqB;AAC1C,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,OAAO,gBAAA,CAAiB,KAAK,GAAG,OAAO,IAAA;AACtD,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,0BAAA,CAA2B,KAAA,CAAM,EAAE,CAAA;AAC3D,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAClC,EAAA,uBACEF,GAAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAG,sBAAA;AAAA,MACH,KAAA,EAAM,gBAAA;AAAA,MACN,UAAU,MAAM;AACd,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,mBAAA,CAAoB,QAAQ,CAAA;AAClD,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,MAAA,CAAO,yBAAyB,sBAAsB,CAAA;AACtD,QAAA,MAAA,CAAO,WAAA,CAAY,EAAE,EAAA,EAAI,KAAA,CAAM,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAA,EAAG,MAAA,CAAO,IAAA,EAAM,GAAG,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO,EAAE,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,EAAG,MAAA,CAAO,MAAA,EAAO,EAAY,CAAA;AAAA,MAC9I;AAAA;AAAA,GACF;AAEJ,CAAC;AAGM,IAAM,mBAAA,GAAsBQ,KAAAA,CAAM,SAASuB,oBAAAA,GAAsB;AACtE,EAAA,MAAM,SAAS7B,SAAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,OAAO,oBAAA,EAAqB;AAC1C,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,OAAO,gBAAA,CAAiB,KAAK,GAAG,OAAO,IAAA;AACtD,EAAA,uBACEF,GAAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAG,cAAA;AAAA,MACH,KAAA,EAAM,cAAA;AAAA,MACN,UAAU,MAAM;AACd,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,0BAAA,CAA2B,KAAA,CAAM,EAAE,CAAA;AAC3D,QAAA,MAAA,CAAO,yBAAyB,cAAc,CAAA;AAC9C,QAAA,IAAI,SAAS,MAAA,GAAS,CAAA,SAAU,cAAA,CAAe,QAAA,EAAU,MAAM,QAAQ,CAAA;AACvE,QAAA,MAAA,CAAO,YAAA,CAAa,CAAC,KAAA,CAAM,EAAE,CAAC,CAAA;AAAA,MAChC;AAAA;AAAA,GACF;AAEJ,CAAC;AAGM,IAAM,sBAAA,GAAyBQ,KAAAA,CAAM,SAASwB,uBAAAA,GAAyB;AAC5E,EAAA,MAAM,SAAS9B,SAAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,OAAO,oBAAA,EAAqB;AAC1C,EAAA,IAAI,CAAC,SAAS,KAAA,CAAM,IAAA,KAAS,UAAW,KAAA,CAAM,KAAA,CAAiC,QAAA,KAAa,KAAA,EAAO,OAAO,IAAA;AAC1G,EAAA,uBACEF,GAAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAG,kBAAA;AAAA,MACH,KAAA,EAAM,WAAA;AAAA,MACN,UAAU,MAAM;AACd,QAAA,MAAA,CAAO,yBAAyB,WAAW,CAAA;AAC3C,QAAA,MAAA,CAAO,WAAA,CAAY,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,EAAE,QAAA,EAAU,IAAA,IAAiB,CAAA;AAAA,MAC3F;AAAA;AAAA,GACF;AAEJ,CAAC;AAGM,IAAM,cAAA,GAAiBQ,KAAAA,CAAM,SAASyB,eAAAA,GAAiB;AAC5D,EAAA,MAAM,SAAS/B,SAAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,EAAA,MAAM,SAAA,GAAY,OAAO,gBAAA,EAAiB;AAC1C,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,mBAAA,EAAoB,CAAE,MAAA,GAAS,CAAA;AACtD,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,CAAC,SAAS,OAAO,IAAA;AACzC,EAAA,uBACEF,IAAC,mBAAA,EAAA,EAAoB,EAAA,EAAG,gBAAe,KAAA,EAAM,cAAA,EAC3C,QAAA,kBAAAA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,sBACnB,QAAA,EAAA,KAAA,CACE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,EAAA,KAAO,SAAS,CAAA,CACtC,GAAA,CAAI,CAAC,IAAA,qBACJA,GAAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MAEC,EAAA,EAAI,CAAA,aAAA,EAAgB,IAAA,CAAK,EAAE,CAAA,CAAA;AAAA,MAC3B,OAAO,IAAA,CAAK,IAAA;AAAA,MACZ,UAAU,MAAM;AACd,QAAA,MAAA,CAAO,yBAAyB,cAAc,CAAA;AAC9C,QAAA,MAAA,CAAO,gBAAA,CAAiB,MAAA,CAAO,mBAAA,EAAoB,EAAG,KAAK,EAAE,CAAA;AAAA,MAC/D;AAAA,KAAA;AAAA,IANK,IAAA,CAAK;AAAA,GAQb,GACL,CAAA,EACF,CAAA;AAEJ,CAAC;AAOM,SAAS,iBAAA,GAAoB;AAClC,EAAA,uBAAOA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,YAAA,EAAa,CAAA;AACvD;AAGO,SAAS,iBAAA,GAAoB;AAClC,EAAA,uBAAOA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,aAAA,EAAc,CAAA;AACxD;AAGO,SAAS,uBAAA,GAA0B;AACxC,EAAA,uBAAOA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,mBAAA,EAAoB,CAAA;AAC9D;AAUO,SAAS,oBAAA,GAAuB;AACrC,EAAA,uBAAOA,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAC5B;AAOO,SAAS,cAAA,GAAiB;AAC/B,EAAA,uBAAOA,GAAAA,CAAC,8BAAA,EAAA,EAA+B,QAAA,EAAS,aAAA,EAAc,CAAA;AAChE;AAGO,SAAS,kBAAA,GAAqB;AACnC,EAAA,uBAAOA,GAAAA,CAAC,8BAAA,EAAA,EAA+B,QAAA,EAAS,kBAAA,EAAmB,CAAA;AACrE;AAGO,SAAS,kBAAA,GAAqB;AACnC,EAAA,uBAAOA,GAAAA,CAAC,8BAAA,EAAA,EAA+B,QAAA,EAAS,kBAAA,EAAmB,CAAA;AACrE;AAGO,SAAS,mBAAA,GAAsB;AACpC,EAAA,uBAAOA,GAAAA,CAAC,8BAAA,EAAA,EAA+B,QAAA,EAAS,mBAAA,EAAoB,CAAA;AACtE;AAGO,SAAS,mBAAA,GAAsB;AACpC,EAAA,uBAAOA,GAAAA,CAAC,8BAAA,EAAA,EAA+B,QAAA,EAAS,mBAAA,EAAoB,CAAA;AACtE;AAGO,SAAS,kBAAA,GAAqB;AACnC,EAAA,uBAAOA,GAAAA,CAAC,8BAAA,EAAA,EAA+B,QAAA,EAAS,kBAAA,EAAmB,CAAA;AACrE;AAGO,SAAS,yBAAA,GAA4B;AAC1C,EAAA,uBAAOA,GAAAA,CAAC,8BAAA,EAAA,EAA+B,QAAA,EAAS,0BAAA,EAA2B,CAAA;AAC7E;AAGO,SAAS,uBAAA,GAA0B;AACxC,EAAA,uBAAOA,GAAAA,CAAC,8BAAA,EAAA,EAA+B,QAAA,EAAS,wBAAA,EAAyB,CAAA;AAC3E;AAGO,SAAS,uBAAA,GAA0B;AACxC,EAAA,uBAAOA,GAAAA,CAAC,8BAAA,EAAA,EAA+B,QAAA,EAAS,uBAAA,EAAwB,CAAA;AAC1E;AAGO,SAAS,2BAAA,GAA8B;AAC5C,EAAA,uBAAOA,GAAAA,CAAC,8BAAA,EAAA,EAA+B,QAAA,EAAS,2BAAA,EAA4B,CAAA;AAC9E;AAGO,SAAS,2BAAA,GAA8B;AAC5C,EAAA,uBAAOA,GAAAA,CAAC,8BAAA,EAAA,EAA+B,QAAA,EAAS,oBAAA,EAAqB,CAAA;AACvE;AASO,SAAS,sBAAA,GAAyB;AACvC,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,MAAM,KAAK,uBAAA,EAAwB;AACnC,EAAA,MAAM,GAAA,GAAMY,QAAAA,CAAS,cAAA,EAAgB,MAAM,MAAA,CAAO,IAAA,CAAK,iBAAA,EAAkB,KAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAC1F,EAAA,uBACEd,GAAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAG,sBAAA;AAAA,MACH,KAAA,EAAM,eAAA;AAAA,MACN,SAAS,GAAA,IAAO,EAAA;AAAA,MAChB,QAAA,EAAU,MAAM,MAAA,CAAO,IAAA,CAAK,qBAAA,CAAsB,EAAE,cAAA,EAAgB,GAAA,GAAM,CAAA,GAAI,CAAA,EAAG;AAAA;AAAA,GACnF;AAEJ;AASO,IAAM,oBAAA,GAAuBQ,KAAAA,CAAM,SAAS0B,qBAAAA,GAAuB;AACxE,EAAA,MAAM,SAAShC,SAAAA,EAAU;AACzB,EAAA,MAAM,OAAA,GAAU,OAAO,gBAAA,EAAiB;AACxC,EAAA,MAAM,QAAA,GAAW,QAAQ,aAAA,KAAkB,MAAA;AAC3C,EAAA,uBACEF,GAAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAG,oBAAA;AAAA,MACH,KAAA,EAAM,uBAAA;AAAA,MACN,OAAA,EAAS,QAAA;AAAA,MACT,QAAA,EAAU,MAAM,MAAA,CAAO,gBAAA,CAAiB,EAAE,GAAG,OAAA,EAAS,aAAA,EAAe,QAAA,GAAW,KAAA,GAAQ,MAAA,EAAQ;AAAA;AAAA,GAClG;AAEJ,CAAC;AASD,IAAI,YAAA,GAAe,KAAA;AAGZ,SAAS,mBAAA,GAA2D;AACzE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,SAAS,YAAY,CAAA;AAC/C,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,CAAC,IAAA,KAAkB;AACjB,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf;AAAA,GACF;AACF;AAGO,SAAS,0BAAA,GAA6B;AAC3C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,mBAAA,EAAoB;AAClD,EAAA,uBAAOG,GAAAA,CAAC,wBAAA,EAAA,EAAyB,EAAA,EAAG,wBAAuB,KAAA,EAAM,wBAAA,EAAyB,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,MAAM,UAAA,CAAW,CAAC,OAAO,CAAA,EAAG,CAAA;AACpJ;AAGO,SAAS,gBAAA,GAAmB;AACjC,EAAA,uBACED,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,aAAA,EAAc,OAAM,aAAA,EACxC,QAAA,EAAA;AAAA,oBAAAC,IAAC,kBAAA,EAAA,EAAmB,CAAA;AAAA,oBACpBA,IAAC,kBAAA,EAAA,EAAmB,CAAA;AAAA,oBACpBA,IAAC,cAAA,EAAA,EAAe,CAAA;AAAA,oBAChBA,IAAC,kBAAA,EAAA,EAAmB,CAAA;AAAA,oBACpBA,IAAC,yBAAA,EAAA,EAA0B,CAAA;AAAA,oBAC3BA,IAAC,uBAAA,EAAA,EAAwB,CAAA;AAAA,oBACzBA,IAAC,uBAAA,EAAA,EAAwB,CAAA;AAAA,oBACzBA,IAAC,sBAAA,EAAA,EAAuB,CAAA;AAAA,oBACxBA,IAAC,0BAAA,EAAA,EAA2B,CAAA;AAAA,oBAC5BA,IAAC,mBAAA,EAAA,EAAoB,CAAA;AAAA,oBACrBA,IAAC,mBAAA,EAAA,EAAoB,CAAA;AAAA,oBACrBA,IAAC,eAAA,EAAA,EAAgB,CAAA;AAAA,oBACjBA,IAAC,YAAA,EAAA,EAAa;AAAA,GAAA,EAChB,CAAA;AAEJ;AAGO,IAAM,eAAA,GAAkBQ,KAAAA,CAAM,SAAS2B,gBAAAA,GAAkB;AAC9D,EAAA,MAAM,SAASjC,SAAAA,EAAU;AACzB,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,kBAAA,GAAqB,WAAA,IAAe,QAAA;AAChE,EAAA,uBACEF,IAAC,mBAAA,EAAA,EAAoB,EAAA,EAAG,gBAAe,KAAA,EAAM,OAAA,EAC3C,0BAAAA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,IAAG,oBAAA,EAClB,QAAA,EAAA,CAAC,SAAS,MAAA,EAAQ,QAAQ,EAAY,GAAA,CAAI,CAAC,2BAC3CA,GAAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MAEC,EAAA,EAAI,gBAAgB,MAAM,CAAA,CAAA;AAAA,MAC1B,KAAA,EAAO,OAAO,CAAC,CAAA,CAAG,aAAY,GAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,MAChD,SAAS,OAAA,KAAY,MAAA;AAAA,MACrB,QAAA,EAAU,MAAM,MAAA,CAAO,IAAA,CAAK,sBAAsB,EAAE,WAAA,EAAa,QAAQ;AAAA,KAAA;AAAA,IAJpE;AAAA,GAMR,GACH,CAAA,EACF,CAAA;AAEJ,CAAC;AAGM,IAAM,YAAA,GAAeQ,KAAAA,CAAM,SAAS4B,aAAAA,GAAe;AACxD,EAAA,MAAM,SAASlC,SAAAA,EAAU;AACzB,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,SAAA,EAAU;AACtC,EAAA,uBACEF,GAAAA,CAAC,mBAAA,EAAA,EAAoB,EAAA,EAAG,UAAA,EAAW,OAAM,UAAA,EACvC,QAAA,kBAAAA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,IAAG,gBAAA,EACnB,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,6BACdA,GAAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MAEC,EAAA,EAAI,CAAA,SAAA,EAAY,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,MAC/B,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,OAAA,EAAS,YAAY,QAAA,CAAS,MAAA;AAAA,MAC9B,QAAA,EAAU,MAAM,MAAA,CAAO,IAAA,CAAK,sBAAsB,EAAE,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAQ;AAAA,KAAA;AAAA,IAJxE,QAAA,CAAS;AAAA,GAMjB,GACH,CAAA,EACF,CAAA;AAEJ,CAAC;AASM,IAAM,aAAA,GAAgBQ,KAAAA,CAAM,SAAS6B,cAAAA,GAAgB;AAC1D,EAAA,MAAM,SAASnC,SAAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,gBAAA,EAAiB,CAAE,SAAA;AACxC,EAAA,uBACEF,GAAAA,CAAC,mBAAA,EAAA,EAAoB,EAAA,EAAG,YAAA,EAAa,KAAA,EAAM,OAAA,EACzC,QAAA,kBAAAD,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,kBAAA,EACpB,QAAA,EAAA;AAAA,oBAAAC,IAAC,wBAAA,EAAA,EAAyB,EAAA,EAAG,kBAAA,EAAmB,KAAA,EAAM,mBAAkB,OAAA,EAAS,CAAC,KAAA,EAAO,QAAA,EAAU,MAAM,MAAA,CAAO,mBAAA,CAAoB,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA,EAAG,CAAA;AAAA,oBAC3JA,GAAAA,CAAC,wBAAA,EAAA,EAAyB,EAAA,EAAG,gBAAA,EAAiB,OAAM,UAAA,EAAW,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,MAAM,MAAA,CAAO,mBAAA,CAAoB,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA,EAAG;AAAA,GAAA,EAClJ,CAAA,EACF,CAAA;AAEJ,CAAC;AAGM,SAAS,iBAAA,GAAoB;AAClC,EAAA,uBACEA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,EAAA,EAAG,eAAA,EAAgB,KAAA,EAAM,eAAA,EAC5C,QAAA,kBAAAD,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,qBAAA,EACpB,QAAA,EAAA;AAAA,oBAAAC,IAAC,0BAAA,EAAA,EAA2B,CAAA;AAAA,oBAC5BA,IAAC,sBAAA,EAAA,EAAuB,CAAA;AAAA,oBACxBA,IAAC,2BAAA,EAAA,EAA4B;AAAA,GAAA,EAC/B,CAAA,EACF,CAAA;AAEJ;AAOO,SAAS,aAAA,GAAgB;AAC9B,EAAA,uBACED,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,WAAA,EACpB,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,MAAA,EAAO,CAAA;AAAA,oBACxCA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,MAAA,EAAO;AAAA,GAAA,EAC1C,CAAA;AAEJ;AAGO,SAAS,eAAA,GAAkB;AAChC,EAAA,uBACED,IAAAA,CAAC,mBAAA,EAAA,EAAoB,EAAA,EAAG,MAAA,EAAO,OAAM,MAAA,EACnC,QAAA,EAAA;AAAA,oBAAAC,IAAC,aAAA,EAAA,EAAc,CAAA;AAAA,oBACfA,IAAC,kBAAA,EAAA,EAAmB,CAAA;AAAA,oBACpBA,IAAC,oBAAA,EAAA,EAAqB,CAAA;AAAA,oBACtBD,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,aAAA,EACpB,QAAA,EAAA;AAAA,sBAAAC,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,sBACnBA,IAAC,sBAAA,EAAA,EAAuB;AAAA,KAAA,EAC1B,CAAA;AAAA,oBACAA,IAAC,SAAA,EAAA,EAAU;AAAA,GAAA,EACb,CAAA;AAEJ;AAGO,IAAM,WAAA,GAAc;AAGpB,SAAS,WAAA,GAAc;AAC5B,EAAA,uBACED,IAAAA,CAAC,mBAAA,EAAA,EAAoB,EAAA,EAAG,MAAA,EAAO,OAAM,MAAA,EACnC,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,WAAA,EACpB,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,SAAA,EAAU,CAAA;AAAA,sBAC3CA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,UAAA,EAAW,CAAA;AAAA,sBAC5CA,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,sBACnBA,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,sBACnBA,IAAC,uBAAA,EAAA,EAAwB;AAAA,KAAA,EAC3B,CAAA;AAAA,oBACAD,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,YAAA,EACpB,QAAA,EAAA;AAAA,sBAAAC,IAAC,cAAA,EAAA,EAAe,CAAA;AAAA,sBAChBA,IAAC,mBAAA,EAAA,EAAoB;AAAA,KAAA,EACvB;AAAA,GAAA,EACF,CAAA;AAEJ;AAGO,SAAS,yBAAA,GAA4B;AAC1C,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,UAAA,EAAW;AACjC,EAAA,uBACEA,GAAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAG,oBAAA;AAAA,MACH,KAAA,EAAM,oBAAA;AAAA,MACN,GAAA,EAAI,OAAA;AAAA,MACJ,UAAU,MAAM;AACd,QAAA,KAAK,OAAO,+BAAmB,CAAA,CAAE,IAAA,CAAK,CAAC,EAAE,+BAAA,EAAAsC,kCAAgC,KAAM;AAC7E,UAAA,SAAA,CAAU,EAAE,SAAA,EAAWA,gCAAAA,EAAiC,CAAA;AAAA,QAC1D,CAAC,CAAA;AAAA,MACH;AAAA;AAAA,GACF;AAEJ;AAGO,SAAS,WAAA,GAAc;AAC5B,EAAA,uBACEvC,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,QAAA,EACpB,QAAA,EAAA;AAAA,oBAAAC,IAAC,SAAA,EAAA,EAAU,CAAA;AAAA,oBACXA,IAAC,yBAAA,EAAA,EAA0B;AAAA,GAAA,EAC7B,CAAA;AAEJ;AAGO,SAAS,aAAA,GAAgB;AAC9B,EAAA,uBACED,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,MAAA,EACpB,QAAA,EAAA;AAAA,oBAAAC,IAAC,cAAA,EAAA,EAAe,CAAA;AAAA,oBAChBA,IAAC,gBAAA,EAAA,EAAiB,CAAA;AAAA,oBAClBA,IAAC,sBAAA,EAAA,EAAuB,CAAA;AAAA,oBACxBA,IAAC,yBAAA,EAAA,EAA0B,CAAA;AAAA,oBAC3BA,IAAC,yBAAA,EAAA,EAA0B,CAAA;AAAA,oBAC3BA,IAAC,mBAAA,EAAA,EAAoB,CAAA;AAAA,oBACrBA,IAAC,sBAAA,EAAA,EAAuB;AAAA,GAAA,EAC1B,CAAA;AAEJ;AClwBO,SAAS,oBAAA,CAAwB,KAAa,YAAA,EAA0C;AAC7F,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,SAAY,MAAM;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,YAAA,EAAc,OAAA,CAAQ,GAAG,CAAA;AACnD,MAAA,OAAO,WAAW,IAAA,IAAQ,MAAA,KAAW,SAAY,YAAA,GAAgB,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,IACpF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,YAAA;AAAA,IACT;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,GAAA,GAAMoB,WAAAA;AAAA,IACV,CAAC,IAAA,KAAY;AACX,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,UAAA,CAAW,cAAc,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,MAC5D,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAAA,IACA,CAAC,GAAG;AAAA,GACN;AAEA,EAAA,OAAO,CAAC,OAAO,GAAG,CAAA;AACpB;AASO,SAAS,cAAc,EAAA,EAAgD;AAC5E,EAAA,MAAM,SAASf,SAAAA,EAAU;AACzB,EAAA,MAAM,MAAA,GAASY,QAAAA,CAAS,YAAA,EAAc,MAAM,MAAA,CAAO,KAAA,CAAM,UAAA,CAAW,EAAE,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAE,CAAC,CAAA;AACrF,EAAA,MAAM,SAAA,GAAYG,WAAAA;AAAA,IAChB,CAAC,IAAA,KAAkB;AACjB,MAAA,IAAI,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,WAAA,CAAY,EAAE,CAAA;AAAA,WAChC,MAAA,CAAO,KAAA,CAAM,cAAA,CAAe,EAAE,CAAA;AAAA,IACrC,CAAA;AAAA,IACA,CAAC,QAAQ,EAAE;AAAA,GACb;AAEA,EAAAnB,SAAAA,CAAU,MAAM,MAAM,KAAK,MAAA,CAAO,KAAA,CAAM,cAAA,CAAe,EAAE,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAE,CAAC,CAAA;AACxE,EAAA,OAAO,CAAC,QAAQ,SAAS,CAAA;AAC3B;AAGO,SAAS,gBAAA,GAA4B;AAC1C,EAAA,MAAM,SAASI,SAAAA,EAAU;AACzB,EAAA,OAAOY,QAAAA,CAAS,eAAA,EAAiB,MAAM,MAAA,CAAO,KAAA,CAAM,YAAA,EAAa,CAAE,MAAA,GAAS,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACzF;AAQO,SAAS,0BAAA,CAA2B,OAAe,GAAA,EAAqB;AAC7E,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,GAAA,EAAK,OAAO,KAAA;AAChC,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAClC,EAAA,IAAI,SAAA,CAAU,MAAA,IAAU,GAAA,EAAK,OAAO,KAAA;AACpC,EAAA,OAAO,CAAA,EAAG,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,MAAA,CAAA;AAC7D;AAQO,SAAS,WAAA,CAAY,OAAgB,GAAA,EAAsB;AAChE,EAAA,MAAM,OAAO,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,MAAA,IAAU,QAAQ,MAAA,CAAQ,KAAA,CAA4B,IAAI,CAAA,GAAI,MAAA,CAAO,SAAS,EAAE,CAAA;AAChL,EAAA,OAAO,GAAA,KAAQ,MAAA,GAAY,IAAA,GAAO,0BAAA,CAA2B,MAAM,GAAG,CAAA;AACxE;AClCO,SAAS,sBAAA,GAAyB;AACvC,EAAA,uBACEf,IAAAA,CAAAW,UAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAV,IAAC,eAAA,EAAA,EAAgB,CAAA;AAAA,oBACjBA,IAAC,WAAA,EAAA,EAAY,CAAA;AAAA,oBACbA,IAAC,wBAAA,EAAA,EAAyB,CAAA;AAAA,oBAC1BA,IAAC,WAAA,EAAA,EAAY,CAAA;AAAA,oBACbA,IAAC,gBAAA,EAAA,EAAiB;AAAA,GAAA,EACpB,CAAA;AAEJ;AAGO,SAAS,eAAA,CAAgB,EAAE,QAAA,EAAS,EAAsB;AAC/D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,oBAAoB,WAAW,CAAA;AAC3D,EAAA,uBACED,KAAC,wBAAA,EAAA,EAAyB,EAAA,EAAG,aAAY,IAAA,EAAM,MAAA,EAAQ,cAAc,SAAA,EACnE,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,+BAA4B,KAAA,EAAM,MAAA,EACjC,0BAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAK,cAAA,EAAe,CAAA,EACpC,CAAA;AAAA,oBACAA,GAAAA,CAAC,2BAAA,EAAA,EAA4B,OAAM,MAAA,EAAO,IAAA,EAAK,SAC7C,QAAA,kBAAAA,GAAAA,CAAC,+BAA4B,IAAA,EAAK,MAAA,EAAO,UAAS,MAAA,EAC/C,QAAA,EAAA,QAAA,oBAAYA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,GACvC,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAOO,SAAS,yBAAA,GAA4B;AAC1C,EAAA,uBACED,IAAAA,CAAAW,UAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAV,IAAC,aAAA,EAAA,EAAc,CAAA;AAAA,oBACfA,IAAC,kBAAA,EAAA,EAAmB,CAAA;AAAA,oBACpBA,IAAC,oBAAA,EAAA,EAAqB,CAAA;AAAA,oBACtBD,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,WAAA,EACpB,QAAA,EAAA;AAAA,sBAAAC,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,sBACnBA,IAAC,sBAAA,EAAA,EAAuB;AAAA,KAAA,EAC1B,CAAA;AAAA,oBACAA,IAAC,kBAAA,EAAA,EAAmB,CAAA;AAAA,oBACpBA,IAAC,kBAAA,EAAA,EAAmB,CAAA;AAAA,oBACpBA,IAAC,SAAA,EAAA,EAAU,CAAA;AAAA,oBACXA,IAAC,aAAA,EAAA,EAAc;AAAA,GAAA,EACjB,CAAA;AAEJ;AAUO,SAAS,kBAAA,CAAmB,EAAE,QAAA,EAAU,QAAA,EAAS,EAAyB;AAC/E,EAAA,MAAM,SAAA,GAAYJ,OAAuB,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,oBAAoB,cAAc,CAAA;AAC9D,EAAA,MAAM,KAAA,GAAQqB,YAAY,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAE7D,EAAA,uBACElB,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,SAAA;AAAA,MACL,SAAA,EAAU,8BAAA;AAAA,MACV,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,OAAO,CAAA,EAAE;AAAA,MACxC,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,QAAA,IAAI,QAAA,EAAU;AACd,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,SAAA,CAAU,IAAI,CAAA;AAAA,MAChB,CAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBACDC,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAsB,IAAA,EAAM,MAAA,IAAU,CAAC,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO,IAAA,EAAK,MAAA,EAAO,KAAA,EAAM,SAAA,EAAU,SAAA,EAAU,eAAA,EACpH,QAAA,kBAAAA,GAAAA,CAAC,2BAAA,EAAA,EAA4B,IAAA,EAAK,cAAA,EAAe,QAAA,EAAS,cAAA,EACxD,QAAA,kBAAAA,GAAAA,CAAC,yBAAA,EAAA,EAA0B,CAAA,EAC7B,CAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAOO,SAAS,yBAAA,GAA4B;AAC1C,EAAA,uBACED,IAAAA,CAAAW,UAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAX,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,OAAA,EAAQ,OAAM,OAAA,EAClC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,YAAA,EAAa,CAAA;AAAA,sBAC9CA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,yBAAA,EAA0B,CAAA;AAAA,sBAC3DA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,aAAA,EAAc,CAAA;AAAA,sBAC/CA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,WAAA,EAAY,CAAA;AAAA,sBAC7CA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,uBAAA,EAAwB,CAAA;AAAA,sBACzDA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,cAAA,EAAe;AAAA,KAAA,EAClD,CAAA;AAAA,oBACAD,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,SAAA,EAAU,OAAM,SAAA,EACpC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,eAAA,EAAgB,CAAA;AAAA,sBACjDA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,eAAA,EAAgB;AAAA,KAAA,EACnD,CAAA;AAAA,oBACAD,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,MAAA,EAAO,OAAM,MAAA,EACjC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,OAAA,EAAQ,CAAA;AAAA,sBACzCA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,SAAA,EAAU,CAAA;AAAA,sBAC3CA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,WAAA,EAAY,CAAA;AAAA,sBAC7CA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,aAAA,EAAc,CAAA;AAAA,sBAC/CA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,QAAA,EAAS;AAAA,KAAA,EAC5C;AAAA,GAAA,EACF,CAAA;AAEJ;AAGO,SAAS,kBAAA,CAAmB,EAAE,QAAA,EAAS,EAAyB;AACrE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,oBAAoB,cAAc,CAAA;AAC9D,EAAA,uBACED,KAAC,wBAAA,EAAA,EAAyB,EAAA,EAAG,gBAAe,IAAA,EAAM,MAAA,EAAQ,cAAc,SAAA,EACtE,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,+BAA4B,KAAA,EAAM,SAAA,EACjC,0BAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAK,WAAA,EAAY,CAAA,EACjC,CAAA;AAAA,oBACAA,IAAC,2BAAA,EAAA,EAA4B,KAAA,EAAM,WAAU,IAAA,EAAK,OAAA,EAAQ,WAAU,sBAAA,EAClE,QAAA,kBAAAA,IAAC,2BAAA,EAAA,EAA4B,IAAA,EAAK,eAAc,QAAA,EAAS,MAAA,EACtD,sCAAYA,GAAAA,CAAC,yBAAA,EAAA,EAA0B,CAAA,EAC1C,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAOO,SAAS,0BAAA,GAA6B;AAC3C,EAAA,uBACED,IAAAA,CAAAW,UAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAV,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,MAAA,EAAO,CAAA;AAAA,oBACxCA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,MAAA,EAAO,CAAA;AAAA,oBACxCA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,QAAA,EAAS,CAAA;AAAA,oBAC1CA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,WAAA,EAAY;AAAA,GAAA,EAC/C,CAAA;AAEJ;AAGO,SAAS,mBAAA,CAAoB,EAAE,QAAA,EAAS,EAA0B;AACvE,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAyB,IAAA,EAAK,SAAA,EAAU,cAAW,eAAA,EAChE,QAAA,kBAAAA,IAAC,2BAAA,EAAA,EAA4B,IAAA,EAAK,SAAQ,QAAA,EAAS,MAAA,EAChD,sCAAYA,GAAAA,CAAC,0BAAA,EAAA,EAA2B,CAAA,EAC3C,CAAA,EACF,CAAA;AAEJ;AAOO,SAAS,sBAAA,GAAyB;AACvC,EAAA,uBACED,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,MAAA,EACpB,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,SAAA,EAAU,CAAA;AAAA,oBAC3CA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,UAAA,EAAW,CAAA;AAAA,oBAC5CA,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,oBACnBA,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,oBACnBA,IAAC,uBAAA,EAAA,EAAwB;AAAA,GAAA,EAC3B,CAAA;AAEJ;AAGO,SAAS,eAAA,CAAgB,EAAE,QAAA,EAAS,EAAsB;AAC/D,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,MAAM,IAAA,GAAOY,QAAAA,CAAS,MAAA,EAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,YAAA,EAAa,GAAI,GAAG,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACrF,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,oBAAoB,WAAW,CAAA;AAC3D,EAAA,uBACEf,KAAC,wBAAA,EAAA,EAAyB,EAAA,EAAG,aAAY,IAAA,EAAM,MAAA,EAAQ,cAAc,SAAA,EACnE,QAAA,EAAA;AAAA,oBAAAA,KAAC,2BAAA,EAAA,EAA4B,KAAA,EAAO,mBAAmB,IAAI,CAAA,CAAA,CAAA,EAAK,WAAU,oBAAA,EACvE,QAAA,EAAA;AAAA,MAAA,IAAA;AAAA,MAAK;AAAA,KAAA,EACR,CAAA;AAAA,oBACAC,GAAAA,CAAC,2BAAA,EAAA,EAA4B,OAAM,MAAA,EAAO,IAAA,EAAK,SAC7C,QAAA,kBAAAA,GAAAA,CAAC,+BAA4B,IAAA,EAAK,MAAA,EAAO,UAAS,MAAA,EAC/C,QAAA,EAAA,QAAA,oBAAYA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,GACvC,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAOO,SAAS,sBAAA,GAAyB;AACvC,EAAA,uBACED,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,MAAA,EACpB,QAAA,EAAA;AAAA,oBAAAC,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,oBACnBA,IAAC,WAAA,EAAA,EAAY;AAAA,GAAA,EACf,CAAA;AAEJ;AAGO,SAAS,eAAA,CAAgB,EAAE,QAAA,EAAS,EAAsB;AAC/D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,oBAAoB,WAAW,CAAA;AAC3D,EAAA,uBACED,KAAC,wBAAA,EAAA,EAAyB,EAAA,EAAG,aAAY,IAAA,EAAM,MAAA,EAAQ,cAAc,SAAA,EACnE,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,2BAAA,EAAA,EAA4B,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,oBAC3CA,GAAAA,CAAC,2BAAA,EAAA,EAA4B,OAAM,MAAA,EAAO,IAAA,EAAK,SAC7C,QAAA,kBAAAA,GAAAA,CAAC,+BAA4B,IAAA,EAAK,MAAA,EAAO,UAAS,MAAA,EAC/C,QAAA,EAAA,QAAA,oBAAYA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,GACvC,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAcO,SAAS,2BAAA,GAA8B;AAC5C,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,MAAM,MAAA,GAASY,QAAAA;AAAA,IACb,eAAA;AAAA,IACA,MAAM;AACJ,MAAA,MAAM,GAAA,GAAM,OAAO,sBAAA,EAAuB;AAC1C,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,CAAA,EAAG,OAAO,KAAA;AAC3B,MAAA,MAAM,MAAA,GAAS,OAAO,oBAAA,EAAqB;AAC3C,MAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,MAAA,MAAM,QAAA,GAAW,OAAO,qBAAA,EAAsB;AAC9C,MAAA,OAAO,CAAC,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AACA,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,uBACEd,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,iCAAA,EAAkC,OAAA,EAAS,MAAM,MAAA,CAAO,SAAA,EAAU,EAAG,QAAA,EAAA,iBAAA,EAErG,CAAA;AAEJ;AAGO,SAAS,oBAAA,CAAqB,EAAE,QAAA,EAAS,EAA2B;AACzE,EAAA,uBAAOA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAA2B,QAAA,EAAA,QAAA,oBAAYA,GAAAA,CAAC,2BAAA,EAAA,EAA4B,CAAA,EAAG,CAAA;AAC/F;AAOO,SAAS,uBAAA,GAA0B;AACxC,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,uBACEH,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,OAAA,EACpB,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,mBAAA,EAAoB,CAAA;AAAA,oBACrDA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,aAAA,EAAc,CAAA;AAAA,oBAC/CA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,oBAAA,EAAqB,CAAA;AAAA,oBACtDA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAS,uBAAA,EAAwB,CAAA;AAAA,oBACzDA,IAAC,2BAAA,EAAA,EAA4B,IAAA,EAAK,QAChC,QAAA,kBAAAA,GAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,MAAK,UAAA,EAAW,SAAA,EAAU,sBAAqB,OAAA,EAAS,MAAM,OAAO,YAAA,EAAa,EAAG,2BAE3G,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAGO,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAS,EAAuB;AACjE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,oBAAoB,YAAY,CAAA;AAC5D,EAAA,uBACED,KAAC,wBAAA,EAAA,EAAyB,EAAA,EAAG,cAAa,IAAA,EAAM,MAAA,EAAQ,cAAc,SAAA,EACpE,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,+BAA4B,KAAA,EAAM,OAAA,EACjC,0BAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAK,YAAA,EAAa,CAAA,EAClC,CAAA;AAAA,oBACAA,GAAAA,CAAC,2BAAA,EAAA,EAA4B,OAAM,OAAA,EAAQ,IAAA,EAAK,SAC9C,QAAA,kBAAAA,GAAAA,CAAC,+BAA4B,IAAA,EAAK,MAAA,EAAO,UAAS,MAAA,EAC/C,QAAA,EAAA,QAAA,oBAAYA,GAAAA,CAAC,uBAAA,EAAA,EAAwB,GACxC,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACxUO,SAAS,aAAA,CAAc,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAAuB;AACxE,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,uBACEF,GAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,IAAA;AAAA,MACP,KAAA,EAAM,WAAA;AAAA,MACN,SAAA,EAAS,IAAA;AAAA,MACT,UAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,CAAC,IAAA,KAAS;AACpB,QAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,QAAA,IAAI,OAAA,IAAW,YAAY,IAAA,EAAM;AAC/B,UAAA,MAAA,CAAO,yBAAyB,aAAa,CAAA;AAC7C,UAAA,MAAA,CAAO,UAAA,CAAW,IAAI,OAAO,CAAA;AAAA,QAC/B;AACA,QAAA,QAAA,IAAW;AAAA,MACb,CAAA;AAAA,MACA,QAAA,EAAU,MAAM,QAAA;AAAW;AAAA,GAC7B;AAEJ;AAWO,SAAS,eAAA,CAAgB,EAAE,EAAA,EAAI,KAAA,EAAO,UAAS,EAAyB;AAC7E,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,uBACEH,IAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAI,CAAA,aAAA,EAAgB,EAAE,CAAA,CAAA,EACvC,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,gBAAA,EAAA,EAAiB,EAAA,EAAI,CAAA,YAAA,EAAe,EAAE,CAAA,CAAA,EAAI,KAAA,EAAM,QAAA,EAAS,QAAA,EAAU,MAAM,QAAA,IAAW,EAAG,CAAA;AAAA,oBACxFA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,EAAA,EAAI,kBAAkB,EAAE,CAAA,CAAA,EAAI,KAAA,EAAM,WAAA,EAAY,QAAA,EAAU,MAAM,MAAA,CAAO,aAAA,CAAc,EAAE,CAAA,EAAG,CAAA;AAAA,oBAC1GA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,EAAA,EAAI,CAAA,YAAA,EAAe,EAAE,CAAA,CAAA,EAAI,KAAA,EAAM,QAAA,EAAS,QAAA,EAAU,QAAQ,CAAA,EAAG,QAAA,EAAU,MAAM,MAAA,CAAO,UAAA,CAAW,EAAE,CAAA,EAAG;AAAA,GAAA,EACxH,CAAA;AAEJ;AASO,IAAM,eAAA,GAAkBQ,KAAAA,CAAM,SAAS+B,gBAAAA,GAAkB;AAC9D,EAAA,MAAM,SAASrC,SAAAA,EAAU;AACzB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIsC,oBAAoB,WAAW,CAAA;AAC3D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI3C,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,EAAA,MAAM,SAAA,GAAY,OAAO,gBAAA,EAAiB;AAC1C,EAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,SAAS,CAAA;AAE1D,EAAA,uBACEE,KAAC,wBAAA,EAAA,EAAyB,EAAA,EAAG,aAAY,IAAA,EAAM,MAAA,EAAQ,cAAc,SAAA,EACnE,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,2BAAA,EAAA,EAA4B,KAAA,EAAO,CAAA,MAAA,EAAS,OAAA,EAAS,IAAA,IAAQ,UAAU,CAAA,CAAA,EAAI,SAAA,EAAU,oBAAA,EACnF,QAAA,EAAA,OAAA,EAAS,IAAA,IAAQ,UAAA,EACpB,CAAA;AAAA,oBACAA,GAAAA,CAAC,2BAAA,EAAA,EAA4B,KAAA,EAAM,OAAA,EAAQ,IAAA,EAAK,OAAA,EAC9C,QAAA,kBAAAD,IAAAA,CAAC,2BAAA,EAAA,EAA4B,IAAA,EAAK,MAAA,EAAO,UAAS,MAAA,EAChD,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,oBAAA,EAAqB,MAAK,YAAA,EAAa,YAAA,EAAW,SAC9D,QAAA,EAAA,KAAA,CAAM,GAAA;AAAA,QAAI,CAAC,IAAA,EAAM,KAAA,KAChB,QAAA,KAAa,IAAA,CAAK,EAAA,mBAChBA,GAAAA,CAAC,aAAA,EAAA,EAA4B,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,QAAA,EAAU,MAAM,WAAA,CAAY,IAAI,CAAA,EAAA,EAAvE,IAAA,CAAK,EAAqE,CAAA,mBAE9FD,IAAAA,CAAC,KAAA,EAAA,EAAkB,SAAA,EAAU,mBAAA,EAC3B,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,IAAA,EAAK,eAAA;AAAA,cACL,cAAA,EAAc,KAAK,EAAA,KAAO,SAAA;AAAA,cAC1B,SAAA,EAAU,oBAAA;AAAA,cACV,aAAA,EAAe,MAAM,WAAA,CAAY,IAAA,CAAK,EAAE,CAAA;AAAA,cACxC,SAAS,MAAM;AACb,gBAAA,MAAA,CAAO,cAAA,CAAe,KAAK,EAAE,CAAA;AAC7B,gBAAA,SAAA,CAAU,KAAK,CAAA;AAAA,cACjB,CAAA;AAAA,cAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,WACR;AAAA,0BACAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,EAAA,EAAI,KAAK,EAAA,EAAI,KAAA,EAAc,KAAA,EAAO,KAAA,CAAM,QAAQ,QAAA,EAAU,MAAM,WAAA,CAAY,IAAA,CAAK,EAAE,CAAA,EAAG;AAAA,SAAA,EAAA,EAd/F,KAAK,EAef;AAAA,OAEJ,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,qBACpB,QAAA,kBAAAA,GAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAG,UAAA;AAAA,UACH,KAAA,EAAM,UAAA;AAAA,UACN,IAAA,EAAK,WAAA;AAAA,UACL,UAAU,MAAM;AACd,YAAA,MAAA,CAAO,yBAAyB,UAAU,CAAA;AAC1C,YAAA,MAAA,CAAO,UAAA,CAAW,EAAE,IAAA,EAAM,CAAA,KAAA,EAAQ,MAAM,MAAA,GAAS,CAAC,IAAI,CAAA;AAAA,UACxD;AAAA;AAAA,OACF,EACF;AAAA,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAC;ACjHM,IAAM,cAAA,GAAiBQ,KAAAA,CAAM,SAASiC,eAAAA,GAAiB;AAC5D,EAAA,MAAM,SAASvC,SAAAA,EAAU;AACzB,EAAA,MAAM,GAAA,GAAMN,OAA0B,IAAI,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,OAAO,oBAAA,EAAqB;AAC3C,EAAA,MAAM,QAAA,GAAW,OAAO,qBAAA,EAAsB;AAC9C,EAAA,MAAM,MAAA,GAAS,OAAO,oBAAA,EAAqB;AAE3C,EAAAE,UAAU,MAAM;AACd,IAAA,MAAM,SAAS,GAAA,CAAI,OAAA;AACnB,IAAA,MAAM,GAAA,GAAM,MAAA,EAAQ,UAAA,CAAW,IAAI,CAAA;AACnC,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,GAAA,EAAK;AACrB,IAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,IAAoB,CAAA;AACvC,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,OAAO,qBAAA,EAAsB;AACvD,IAAA,MAAA,CAAO,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAC,CAAA;AAClD,IAAA,MAAA,CAAO,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,MAAA,GAAS,GAAG,CAAC,CAAA;AACpD,IAAA,GAAA,CAAI,aAAa,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,GAAG,CAAC,CAAA;AACrC,IAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,UAAU,CAAA,IAAK,MAAA,CAAO,WAAW,CAAA,EAAG;AAI1D,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,SAAS,IAAI,CAAA;AAChD,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,SAAS,IAAI,CAAA;AAChD,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,SAAS,IAAI,CAAA;AAChD,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,SAAS,IAAI,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,IAAS,IAAA,GAAO,IAAA,IAAQ,CAAA,CAAA,EAAI,MAAA,IAAU,IAAA,GAAO,IAAA,IAAQ,CAAA,CAAE,CAAA,GAAI,GAAA;AAClF,IAAA,MAAM,MAAM,KAAA,GAAA,CAAS,IAAA,GAAO,IAAA,IAAQ,KAAA,IAAS,IAAI,IAAA,GAAO,KAAA;AACxD,IAAA,MAAM,MAAM,MAAA,GAAA,CAAU,IAAA,GAAO,IAAA,IAAQ,KAAA,IAAS,IAAI,IAAA,GAAO,KAAA;AAEzD,IAAA,GAAA,CAAI,SAAA,GAAY,uBAAA;AAChB,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,kBAAA,CAAmB,KAAK,CAAA;AAC3C,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,GAAA,CAAI,QAAA,CAAS,IAAI,IAAA,GAAO,KAAA,GAAQ,IAAI,GAAA,CAAI,IAAA,GAAO,KAAA,GAAQ,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,GAAG,GAAA,CAAI,KAAA,GAAQ,KAAK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,GAAA,CAAI,MAAA,GAAS,KAAK,CAAC,CAAA;AAAA,IAC5H;AACA,IAAA,GAAA,CAAI,WAAA,GAAc,oCAAA;AAClB,IAAA,GAAA,CAAI,WAAA,GAAc,SAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,UAAA,CAAW,QAAA,CAAS,IAAA,GAAO,KAAA,GAAQ,IAAI,QAAA,CAAS,IAAA,GAAO,KAAA,GAAQ,EAAA,EAAI,QAAA,CAAS,KAAA,GAAQ,KAAA,EAAO,QAAA,CAAS,SAAS,KAAK,CAAA;AAAA,EACxH,CAAC,CAAA;AAED,EAAA,uBAAOE,GAAAA,CAAC,QAAA,EAAA,EAAO,GAAA,EAAU,SAAA,EAAU,oBAAmB,aAAA,EAAY,MAAA,EAAO,KAAA,EAAO,EAAE,OAAO,MAAA,EAAQ,MAAA,EAAQ,EAAA,EAAI,OAAA,EAAS,SAAQ,EAAG,CAAA;AACnI,CAAC;AASM,SAAS,sBAAA,GAAyB;AACvC,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,MAAM,aAAa,aAAA,EAAc;AACjC,EAAA,MAAM,WAAA,GAAc,cAAc,mBAAA,CAAoB,MAAA;AACtD,EAAA,uBACEH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACZ,QAAA,EAAA;AAAA,IAAA,WAAA,mBAAcC,GAAAA,CAAC,cAAA,EAAA,EAAe,CAAA,GAAK,IAAA;AAAA,oBACpCD,KAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAA0B,IAAA,EAAK,SAAA,EAAU,cAAW,MAAA,EACjE,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,cAAA,EAAe,YAAA,EAAW,YAAW,cAAA,EAAa,UAAA,EAAW,SAAS,MAAM,MAAA,CAAO,SAAQ,EACzH,QAAA,kBAAAA,IAAC,YAAA,EAAA,EAAa,IAAA,EAAK,YAAW,CAAA,EAChC,CAAA;AAAA,sBACAA,IAAC,eAAA,EAAA,EAAgB,CAAA;AAAA,sBACjBA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,cAAA,EAAe,cAAW,SAAA,EAAU,cAAA,EAAa,WAAU,OAAA,EAAS,MAAM,OAAO,MAAA,EAAO,EACtH,0BAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAK,SAAA,EAAU,CAAA,EAC/B;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAGO,SAAS,gBAAA,GAAmB;AACjC,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,IAAC,eAAA,EAAA,EAAgB,CAAA;AAAA,oBACjBA,IAAC,eAAA,EAAA,EAAgB;AAAA,GAAA,EACnB,CAAA;AAEJ;AAgBO,SAAS,0BAA0B,EAAE,QAAA,GAAW,GAAA,EAAK,SAAA,EAAW,UAAS,EAAmC;AACjH,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAC,oBAAA,EAAsB,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MACrE,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,GAAA,EAAK,gCAAA;AAAA,QACL,IAAA,EAAM,qEAAA;AAAA,QACN,KAAA,EAAO,qEAAA;AAAA,QACP,QAAA;AAAA,QACA,YAAA,EAAc,MAAA;AAAA,QACd,OAAA,EAAS,MAAA;AAAA,QACT,cAAA,EAAgB,QAAA;AAAA,QAChB,aAAA,EAAe;AAAA,OACjB;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AASO,SAAS,gBAAA,GAAmB;AACjC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIH,QAAAA,CAAS,OAAO,SAAA,KAAc,WAAA,GAAc,IAAA,GAAO,SAAA,CAAU,MAAM,CAAA;AAC/F,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,SAAA,CAAU,MAAM,CAAA;AAC/C,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,MAAM,CAAA;AACxC,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,MAAM,CAAA;AACzC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,MAAM,CAAA;AAC3C,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,MAAM,CAAA;AAAA,IAC9C,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,IAAI,QAAQ,OAAO,IAAA;AACnB,EAAA,uBACEE,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EAAkC,IAAA,EAAK,UAAS,QAAA,EAAA,SAAA,EAE/D,CAAA;AAEJ;AC5FA,IAAM,aAAA,GAAgBe,cAAwC,IAAI,CAAA;AAQ3D,IAAM,yBAAA,GAA4BP,MAAM,SAASkC,0BAAAA,CAA0B,EAAE,QAAA,GAAW,KAAA,EAAO,UAAS,EAAmC;AAChJ,EAAA,MAAM,SAASxC,SAAAA,EAAU;AACzB,EAAA,MAAM,SAAS,iBAAA,EAAkB;AACjC,EAAA,MAAM,QAAA,GAAW,OAAO,aAAA,EAAc;AACtC,EAAA,MAAM,KAAA,GAAQiB,OAAAA;AAAA,IACZ,OAAO;AAAA,MACL,MAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA,CAAY,OAAqB,IAAA,EAAS;AACxC,QAAA,MAAA,CAAO,yBAAyB,cAAc,CAAA;AAC9C,QAAA,IAAI,MAAA,CAAO,qBAAoB,CAAE,MAAA,GAAS,GAAG,MAAA,CAAO,yBAAA,CAA0B,OAAO,IAAI,CAAA;AACzF,QAAA,MAAA,CAAO,qBAAA,CAAsB,OAAO,IAAI,CAAA;AAAA,MAC1C;AAAA,KACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,QAAQ;AAAA,GACrC;AACA,EAAA,uBAAOnB,GAAAA,CAAC,aAAA,CAAc,QAAA,EAAd,EAAuB,OAAe,QAAA,EAAS,CAAA;AACzD,CAAC;AAGM,SAAS,oBAAA,GAA0C;AACxD,EAAA,MAAM,KAAA,GAAQgB,WAAW,aAAa,CAAA;AACtC,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAC9F,EAAA,OAAO,KAAA;AACT;AAeA,SAASZ,WAAU,KAAA,EAAuB;AACxC,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAA;AACzE;AAGO,SAAS,kBAAA,GAAiD;AAC/D,EAAA,OAAOuC,cAAAA,CAAe,OAAO,CAAC,KAAA,KAAU,UAAU,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,IACzE,KAAA,EAAO,KAAA;AAAA,IACP,KAAA,EAAOvC,WAAU,KAAK,CAAA;AAAA,IACtB,MAAA,EAAQwC,WAAAA,CAAY,KAAK,CAAA,EAAG;AAAA,GAC9B,CAAE,CAAA;AACJ;AAGO,SAAS,iBAAA,GAAgD;AAC9D,EAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,EAAQ,MAAA,EAAQ,SAAS,MAAM,CAAA;AAC9C,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAOxC,UAAAA,CAAU,IAAI,CAAA,EAAG,IAAA,EAAM,CAAA,KAAA,EAAQ,IAAI,IAAe,CAAE,CAAA;AACxG;AAGO,SAAS,oBAAA,CAAuC,OAAyB,IAAA,EAAkE;AAChJ,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AACjC,IAAA,MAAM,IAAA,GAAO,OAAO,KAAK,CAAA;AACzB,IAAA,OAAO,IAAA,GAAO,EAAE,KAAA,EAAO,KAAA,EAAOA,WAAU,KAAK,CAAA,EAAG,IAAA,EAAM,IAAA,KAAS,EAAE,KAAA,EAAO,KAAA,EAAOA,UAAAA,CAAU,KAAK,CAAA,EAAE;AAAA,EAClG,CAAC,CAAA;AACH;AAGA,SAAS,eAAkB,KAAA,EAAiD;AAC1E,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,oBAAA,EAAqB;AACxC,EAAA,OAAO,MAAA,EAAQ,IAAI,KAAK,CAAA;AAC1B;AAaO,SAAS,iBAAA,CAAkB,EAAE,KAAA,EAAO,SAAA,EAAW,UAAS,EAA2B;AACxF,EAAA,uBACEJ,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAC,kBAAkB,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,EAAI,GAAI,KAAA,GAAQ,EAAE,IAAA,EAAM,OAAA,EAAS,cAAc,KAAA,EAAM,GAAI,EAAC,EAC7H,QAAA,EACH,CAAA;AAEJ;AAWO,SAAS,oBAAA,CAAqB,EAAE,KAAA,EAAO,KAAA,EAAO,UAAS,EAA8B;AAC1F,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,UAAM,QAAA,EAAS,CAAA;AAAA,IACf,KAAA,mBACCD,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gBAAA,EACd,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,MAAM,EAAA,EAAI,CAAA;AAAA,MAAE;AAAA,KAAA,EAEjC,CAAA,GAEA;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAoBO,SAAS,6BAA+C,EAAE,KAAA,EAAO,OAAO,KAAA,EAAO,QAAA,EAAU,WAAU,EAAmC;AAC3I,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,oBAAA,EAAqB;AACpD,EAAA,MAAM,MAAA,GAAS,eAAe,KAAK,CAAA;AACnC,EAAA,MAAM,aAAa,WAAA,EAAY;AAC/B,EAAA,MAAM,OAAA,GAAU,MAAA,EAAQ,IAAA,KAAS,QAAA,GAAY,OAAO,KAAA,GAAmB,MAAA;AACvE,EAAA,uBACEA,GAAAA;AAAA,IAAC,0BAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACJ,GAAI,OAAA,KAAY,MAAA,GAAY,EAAC,GAAI,EAAE,OAAO,OAAA,EAAQ;AAAA,MACnD,SAAA,EAAW,CAAC,QAAA,GAAW,mBAAA,GAAsB,cAAA,EAAgB,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MAChG,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,QAAA,QAAA,CAAS,OAAO,KAAU,CAAA;AAC1B,QAAA,UAAA,CAAW,aAAa,EAAE,MAAA,EAAQ,QAAQ,EAAA,EAAI,KAAA,EAAO,OAAO,CAAA;AAAA,MAC9D,CAAA;AAAA,MAEC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVA,GAAAA;AAAA,QAAC,yBAAA;AAAA,QAAA;AAAA,UAEC,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,QAAA;AAAA,UACC,GAAI,QAAA,GAAW,EAAE,SAAA,EAAW,iBAAA,KAAsB,EAAC;AAAA,UAEnD,QAAA,EAAA,QAAA,mBAAWA,GAAAA,CAAC,MAAA,EAAA,EAAK,OAAO,EAAE,CAAC,yBAAmC,GAAG,IAAA,CAAK,MAAA,IAAU,CAAA,GAAK,IAAA,CAAK,uBAAOA,GAAAA,CAAC,QAAK,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,CAAA,GAAK,IAAA,CAAK;AAAA,SAAA;AAAA,QAN9H,IAAA,CAAK;AAAA,OAQb;AAAA;AAAA,GACH;AAEJ;AAGO,SAAS,uBAAyC,KAAA,EAAuC;AAC9F,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,CAAM,KAAK,CAAA;AACzC,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,IAAC,oBAAA,EAAA,EAAqB,KAAA,EAAO,QAAQ,IAAA,KAAS,OAAA,EAAU,gBAAM,KAAA,EAAM,CAAA;AAAA,oBACpEA,GAAAA,CAAC,4BAAA,EAAA,EAA8B,GAAG,KAAA,EAAO;AAAA,GAAA,EAC3C,CAAA;AAEJ;AAeO,SAAS,8BAAA,CAAiD,EAAE,KAAA,EAAO,KAAA,EAAO,OAAO,OAAA,GAAU,CAAA,EAAG,IAAG,EAAqC;AAC3I,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,oBAAA,EAAqB;AACpD,EAAA,MAAM,MAAA,GAAS,eAAe,KAAK,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,MAAA,EAAQ,IAAA,KAAS,QAAA,GAAY,OAAO,KAAA,GAAc,IAAA;AAClE,EAAA,MAAM,cAAc,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,UAAU,OAAO,CAAA;AAC/D,EAAA,uBACED,IAAAA,CAAC,eAAA,EAAA,EAAiB,GAAI,EAAA,GAAK,EAAE,EAAA,EAAG,GAAI,EAAC,EAAI,IAAA,EAAK,OAAA,EAC5C,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,sBAAA,EAAA,EAAuB,SAAA,EAAU,iBAAA,EAChC,QAAA,EAAA;AAAA,sBAAAA,KAAC,MAAA,EAAA,EACE,QAAA,EAAA;AAAA,QAAA,WAAA,EAAa,IAAA,mBAAOC,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,WAAA,CAAY,IAAA,EAAM,CAAA,mBAAKA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,CAAA;AAAA,QAC1E,aAAa,KAAA,IAAS;AAAA,OAAA,EACzB,CAAA;AAAA,sBACAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,cAAA,EAAe,MAAM,EAAA,EAAI;AAAA,KAAA,EACtC,CAAA;AAAA,oBACAA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,KAAA,EACtB,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAwB,IAAA,EAAK,YAAA,EAAa,YAAA,EAAY,OAAO,KAAA,EAAO,EAAE,CAAC,yBAAmC,GAAG,OAAA,IACzH,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,OAAA;AAAA,QACL,SAAA,EAAU,cAAA;AAAA,QACV,cAAA,EAAc,YAAY,IAAA,CAAK,KAAA;AAAA,QAC/B,cAAY,IAAA,CAAK,KAAA;AAAA,QACjB,gBAAc,IAAA,CAAK,KAAA;AAAA,QACnB,QAAA;AAAA,QACA,OAAA,EAAS,MAAM,QAAA,CAAS,KAAA,EAAO,KAAK,KAAK,CAAA;AAAA,QAExC,QAAA,EAAA,IAAA,CAAK,uBAAOA,GAAAA,CAAC,QAAK,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,CAAA,GAAK,IAAA,CAAK;AAAA,OAAA;AAAA,MAVzC,IAAA,CAAK;AAAA,KAYb,GACH,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAGO,SAAS,yBAA2C,KAAA,EAAyC;AAClG,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,CAAM,KAAK,CAAA;AACzC,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,IAAC,oBAAA,EAAA,EAAqB,KAAA,EAAO,QAAQ,IAAA,KAAS,OAAA,EAAU,gBAAM,KAAA,EAAM,CAAA;AAAA,oBACpEA,GAAAA,CAAC,8BAAA,EAAA,EAAgC,GAAG,KAAA,EAAO;AAAA,GAAA,EAC7C,CAAA;AAEJ;AAeO,SAAS,qCAAuD,EAAE,MAAA,EAAQ,QAAQ,MAAA,EAAQ,MAAA,EAAQ,OAAM,EAA2C;AACxJ,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,IAAC,8BAAA,EAAA,EAA+B,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,QAAQ,KAAA,EAAc,CAAA;AAAA,oBAC5EA,GAAAA,CAAC,8BAAA,EAAA,EAA+B,OAAO,MAAA,EAAQ,KAAA,EAAO,QAAQ,KAAA,EAAc;AAAA,GAAA,EAC9E,CAAA;AAEJ;AAGO,SAAS,+BAAiD,KAAA,EAA+C;AAC9G,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,oBAAA,EAAA,EAAsB,QAAA,EAAA,KAAA,CAAM,KAAA,EAAM,CAAA;AAAA,oBACnCA,GAAAA,CAAC,oCAAA,EAAA,EAAsC,GAAG,KAAA,EAAO;AAAA,GAAA,EACnD,CAAA;AAEJ;AAOO,SAAS,qBAAA,GAAwB;AACtC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,oBAAA,EAAqB;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ,GAAA,CAAI6C,iBAAiB,GAAG,OAAO,IAAA;AAC5C,EAAA,uBAAO7C,GAAAA,CAAC,sBAAA,EAAA,EAAuB,KAAA,EAAO6C,iBAAAA,EAAmB,KAAA,EAAM,QAAA,EAAS,KAAA,EAAO,kBAAA,EAAmB,EAAG,QAAA,EAAQ,IAAA,EAAC,CAAA;AAChH;AAEA,IAAM,UAAA,GAAuC,EAAE,IAAA,EAAM,WAAA,EAAa,MAAM,WAAA,EAAa,KAAA,EAAO,YAAA,EAAc,OAAA,EAAS,cAAA,EAAe;AAClI,IAAM,UAAA,GAAuC,EAAE,IAAA,EAAM,WAAA,EAAa,OAAO,YAAA,EAAc,MAAA,EAAQ,aAAA,EAAe,MAAA,EAAQ,aAAA,EAAc;AACpI,IAAM,UAAA,GAAuC,EAAE,CAAA,EAAG,QAAA,EAAU,GAAG,QAAA,EAAU,CAAA,EAAG,QAAA,EAAU,EAAA,EAAI,SAAA,EAAU;AACpG,IAAM,gBAA0C,EAAE,KAAA,EAAO,cAAc,MAAA,EAAQ,cAAA,EAAgB,KAAK,aAAA,EAAc;AAClH,IAAM,gBAA0C,EAAE,KAAA,EAAO,cAAc,MAAA,EAAQ,eAAA,EAAiB,KAAK,eAAA,EAAgB;AAG9G,SAAS,oBAAA,GAAuB;AACrC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,oBAAA,EAAqB;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ,GAAA,CAAIC,gBAAgB,GAAG,OAAO,IAAA;AAC3C,EAAA,uBAAO9C,GAAAA,CAAC,sBAAA,EAAA,EAAuB,KAAA,EAAO8C,kBAAkB,KAAA,EAAM,MAAA,EAAO,KAAA,EAAO,oBAAA,CAAqBA,kBAAkB,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,CAAC,CAAA,EAAG,CAAA;AAC5I;AAGO,SAAS,oBAAA,GAAuB;AACrC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,oBAAA,EAAqB;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ,GAAA,CAAIC,gBAAgB,GAAG,OAAO,IAAA;AAC3C,EAAA,uBAAO/C,GAAAA,CAAC,sBAAA,EAAA,EAAuB,KAAA,EAAO+C,kBAAkB,KAAA,EAAM,MAAA,EAAO,KAAA,EAAO,oBAAA,CAAqBA,kBAAkB,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,CAAC,CAAA,EAAG,CAAA;AAC5I;AAGO,SAAS,oBAAA,GAAuB;AACrC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,oBAAA,EAAqB;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ,GAAA,CAAIC,gBAAgB,GAAG,OAAO,IAAA;AAC3C,EAAA,uBAAOhD,GAAAA,CAAC,sBAAA,EAAA,EAAuB,KAAA,EAAOgD,kBAAkB,KAAA,EAAM,MAAA,EAAO,KAAA,EAAO,oBAAA,CAAqBA,kBAAkB,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,CAAC,CAAA,EAAG,CAAA;AAC5I;AAGO,SAAS,oBAAA,GAAuB;AACrC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,oBAAA,EAAqB;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ,GAAA,CAAIC,gBAAgB,GAAG,OAAO,IAAA;AAC3C,EAAA,uBAAOjD,IAAC,sBAAA,EAAA,EAAuB,KAAA,EAAOiD,kBAAkB,KAAA,EAAM,MAAA,EAAO,KAAA,EAAO,iBAAA,EAAkB,EAAiC,CAAA;AACjI;AAGO,SAAS,0BAAA,GAA6B;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,oBAAA,EAAqB;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ,GAAA,CAAIC,2BAA2B,GAAG,OAAO,IAAA;AACtD,EAAA,uBACEnD,IAAAA,CAAAW,UAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAV,GAAAA,CAAC,sBAAA,EAAA,EAAuB,KAAA,EAAOkD,2BAAAA,EAA6B,OAAM,OAAA,EAAQ,KAAA,EAAO,oBAAA,CAAqBA,2BAAAA,EAA6B,CAAC,CAAA,KAAM,aAAA,CAAc,CAAC,CAAC,CAAA,EAAG,CAAA;AAAA,IAC5J,MAAA,EAAQ,IAAIC,yBAAyB,CAAA,mBACpCnD,GAAAA,CAAC,sBAAA,EAAA,EAAuB,OAAOmD,yBAAAA,EAA2B,KAAA,EAAM,kBAAiB,KAAA,EAAO,oBAAA,CAAqBA,2BAA2B,CAAC,CAAA,KAAM,cAAc,CAAC,CAAC,GAAG,CAAA,GAChK;AAAA,GAAA,EACN,CAAA;AAEJ;AAGO,SAAS,yBAAA,GAA4B;AAC1C,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,oBAAA,EAAqB;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ,GAAA,CAAI,qBAAqB,GAAG,OAAO,IAAA;AAChD,EAAA,uBAAOnD,GAAAA,CAAC,sBAAA,EAAA,EAAuB,KAAA,EAAO,uBAAuB,KAAA,EAAM,YAAA,EAAa,KAAA,EAAO,oBAAA,CAAqB,uBAAuB,CAAC,CAAA,KAAM,aAAA,CAAc,CAAC,CAAC,CAAA,EAAG,CAAA;AAC/J;AAGO,SAAS,wBAAA,GAA2B;AACzC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,oBAAA,EAAqB;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ,GAAA,CAAIK,gBAAgB,GAAG,OAAO,IAAA;AAC3C,EAAA,MAAM,QAAQF,eAAAA,CAAgB,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAOC,UAAAA,CAAU,IAAI,CAAA,EAAG,IAAA,EAAM,CAAA,IAAA,EAAO,IAAI,IAAe,CAAE,CAAA;AACtH,EAAA,uBAAOJ,IAAC,wBAAA,EAAA,EAAyB,KAAA,EAAOK,kBAAkB,KAAA,EAAM,OAAA,EAAQ,KAAA,EAAc,EAAA,EAAG,YAAA,EAAa,CAAA;AACxG;AAGO,SAAS,sBAAA,GAAyB;AACvC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,oBAAA,EAAqB;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ,GAAA,CAAI,oBAAoB,GAAG,OAAO,IAAA;AAC/C,EAAA,uBAAOL,GAAAA,CAAC,wBAAA,EAAA,EAAyB,KAAA,EAAO,oBAAA,EAAsB,KAAA,EAAM,QAAA,EAAS,KAAA,EAAO,oBAAA,CAAqB,oBAAoB,CAAA,EAAG,EAAA,EAAG,eAAA,EAAgB,CAAA;AACrJ;AAGO,SAAS,yBAAA,GAA4B;AAC1C,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,oBAAA,EAAqB;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ,GAAA,CAAI,mBAAmB,GAAG,OAAO,IAAA;AAC9C,EAAA,uBAAOA,GAAAA,CAAC,wBAAA,EAAA,EAAyB,KAAA,EAAO,mBAAA,EAAqB,KAAA,EAAM,YAAA,EAAa,KAAA,EAAO,oBAAA,CAAqB,mBAAmB,CAAA,EAAG,EAAA,EAAG,mBAAA,EAAoB,CAAA;AAC3J;AAGO,SAAS,yBAAA,GAA4B;AAC1C,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,oBAAA,EAAqB;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ,GAAA,CAAI,6BAA6B,GAAG,OAAO,IAAA;AACxD,EAAA,uBACEA,GAAAA;AAAA,IAAC,8BAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,YAAA;AAAA,MACN,MAAA,EAAO,OAAA;AAAA,MACP,MAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ,6BAAA;AAAA,MACR,MAAA,EAAQ,2BAAA;AAAA,MACR,KAAA,EAAO,qBAAqB,6BAA6B;AAAA;AAAA,GAC3D;AAEJ;AAGA,IAAM,aAAA,GAAgB,CAAA;AACtB,IAAM,iBAAiB,CAAC,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,MAAM,CAAC,CAAA;AASxC,IAAM,uBAAA,GAA0BQ,KAAAA,CAAM,SAAS4C,wBAAAA,GAA0B;AAC9E,EAAA,MAAM,SAASlD,SAAAA,EAAU;AACzB,EAAA,MAAM,MAAA,GAAS,OAAO,iBAAA,EAAkB;AACxC,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,CAAC,CAAA,CAAG,OAAA;AACzB,EAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,YAAY,KAAK,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,SAAA,CAAU,CAAC,KAAA,KAAU,KAAK,GAAA,CAAI,KAAA,GAAQ,KAAK,CAAA,GAAI,IAAK,CAAA;AACjF,EAAA,uBACEH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,IAAC,oBAAA,EAAA,EAAqB,KAAA,EAAc,KAAA,kBAAOD,KAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,MAAA,IAAA,CAAK,KAAA,CAAM,QAAQ,GAAG,CAAA;AAAA,MAAE;AAAA,KAAA,EAAC,GAAS,QAAA,EAAA,SAAA,EAEpF,CAAA;AAAA,oBACAC,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,KAAA,GAAQ,IAAA,GAAO,KAAA,GAAQ,IAAI,aAAA,GAAgB,KAAA;AAAA,QAClD,KAAA,EAAO,aAAA;AAAA,QACP,KAAA,EAAM,SAAA;AAAA,QACN,aAAA,EAAe,CAAC,EAAA,KAAO,MAAA,CAAO,yBAAyB,EAAE,CAAA;AAAA,QACzD,aAAA,EAAe,CAAC,KAAA,KAAU,MAAA,CAAO,4BAA4B,cAAA,CAAe,KAAK,KAAK,CAAC;AAAA;AAAA;AACzF,GAAA,EACF,CAAA;AAEJ,CAAC;AChcM,SAAS,wBAAA,GAA2B;AACzC,EAAA,uBACED,IAAAA,CAAAW,UAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAX,IAAAA,CAAC,iBAAA,EAAA,EAAkB,KAAA,EAAM,OAAA,EACvB,QAAA,EAAA;AAAA,sBAAAC,IAAC,wBAAA,EAAA,EAAyB,CAAA;AAAA,sBAC1BA,IAAC,sBAAA,EAAA,EAAuB,CAAA;AAAA,sBACxBA,IAAC,yBAAA,EAAA,EAA0B;AAAA,KAAA,EAC7B,CAAA;AAAA,oBACAA,IAAC,iBAAA,EAAA,EAAkB,KAAA,EAAM,UACvB,QAAA,kBAAAA,GAAAA,CAAC,yBAAsB,CAAA,EACzB,CAAA;AAAA,oBACAD,IAAAA,CAAC,iBAAA,EAAA,EAAkB,KAAA,EAAM,QAAA,EACvB,QAAA,EAAA;AAAA,sBAAAC,IAAC,oBAAA,EAAA,EAAqB,CAAA;AAAA,sBACtBA,IAAC,oBAAA,EAAA,EAAqB,CAAA;AAAA,sBACtBA,IAAC,oBAAA,EAAA,EAAqB,CAAA;AAAA,sBACtBA,IAAC,yBAAA,EAAA,EAA0B;AAAA,KAAA,EAC7B,CAAA;AAAA,oBACAD,IAAAA,CAAC,iBAAA,EAAA,EAAkB,KAAA,EAAM,MAAA,EACvB,QAAA,EAAA;AAAA,sBAAAC,IAAC,oBAAA,EAAA,EAAqB,CAAA;AAAA,sBACtBA,IAAC,yBAAA,EAAA,EAA0B,CAAA;AAAA,sBAC3BA,IAAC,0BAAA,EAAA,EAA2B;AAAA,KAAA,EAC9B,CAAA;AAAA,oBACAA,IAAC,iBAAA,EAAA,EAAkB,KAAA,EAAM,iBACvB,QAAA,kBAAAA,GAAAA,CAAC,2BAAwB,CAAA,EAC3B;AAAA,GAAA,EACF,CAAA;AAEJ;AASO,IAAM,iBAAA,GAAoBQ,MAAM,SAAS6C,kBAAAA,CAAkB,EAAE,QAAA,GAAW,KAAA,EAAO,UAAS,EAAwB;AACrH,EAAA,MAAM,SAAS,iBAAA,EAAkB;AACjC,EAAA,MAAM,SAASnD,SAAAA,EAAU;AACzB,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,mBAAA,EAAoB,CAAE,MAAA,GAAS,CAAA;AAC3D,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,YAAA,EAAc,OAAO,IAAA;AACrC,EAAA,uBACEF,GAAAA,CAAC,yBAAA,EAAA,EAA0B,UACzB,QAAA,kBAAAA,GAAAA,CAAC,SAAI,SAAA,EAAU,oCAAA,EAAqC,IAAA,EAAK,QAAA,EAAS,cAAW,OAAA,EAC1E,QAAA,EAAA,QAAA,oBAAYA,GAAAA,CAAC,wBAAA,EAAA,EAAyB,GACzC,CAAA,EACF,CAAA;AAEJ,CAAC;AASM,IAAM,gBAAA,GAAmBQ,KAAAA,CAAM,SAAS8C,iBAAAA,GAAmB;AAChE,EAAA,MAAM,SAASpD,SAAAA,EAAU;AACzB,EAAA,MAAM,SAAS,iBAAA,EAAkB;AACjC,EAAA,MAAM,QAAA,GAAW,OAAO,aAAA,EAAc;AACtC,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,uBACEH,IAAAA,CAAC,eAAA,EAAA,EAAgB,EAAA,EAAG,oBAAA,EAAqB,MAAK,OAAA,EAC5C,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,sBAAA,EAAA,EAAuB,SAAA,EAAW,QAAA,GAAW,qCAAA,GAAwC,cAAA,EACpF,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,YAAA,EAAa,CAAA,EAC1B,CAAA;AAAA,oBACAA,IAAC,sBAAA,EAAA,EAAuB,KAAA,EAAM,SAC5B,QAAA,kBAAAA,GAAAA,CAAC,6BAA0B,QAAA,EAAQ,IAAA,EACjC,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iDAAA,EACb,QAAA,kBAAAA,IAAC,wBAAA,EAAA,EAAyB,CAAA,EAC5B,GACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAC;AASM,SAAS,oBAAA,GAAuB;AACrC,EAAA,MAAM,aAAa,aAAA,EAAc;AACjC,EAAA,OAAO,UAAA,GAAa,oBAAoB,SAAA,mBAAYA,IAAC,gBAAA,EAAA,EAAiB,CAAA,mBAAKA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,CAAA;AAChG;ACnGO,SAAS,UAAA,GAAuB;AACrC,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,OAAOY,QAAAA,CAAS,SAAA,EAAW,MAAM,MAAA,CAAO,sCAAqC,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACrH;AAGO,SAAS,YAAY,MAAA,EAAyC;AACnE,EAAA,MAAM,SAASZ,SAAAA,EAAU;AACzB,EAAA,OAAOY,SAAS,UAAA,EAAY,MAAM,MAAA,CAAO,oCAAA,GAAuC,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,WAAW,MAAM,CAAA,IAAK,MAAM,CAAC,MAAA,EAAQ,MAAM,CAAC,CAAA;AAClJ;AAGO,SAAS,QAAA,GAA+B;AAC7C,EAAA,MAAM,SAASZ,SAAAA,EAAU;AACzB,EAAA,OAAOY,QAAAA,CAAS,SAAS,MAAM,MAAA,CAAO,sCAAqC,EAAG,CAAC,MAAM,CAAC,CAAA;AACxF;AAQO,SAAS,sBAAA,GAAkC;AAChD,EAAA,OAAO,QAAA,GAAW,MAAA,GAAS,CAAA;AAC7B;AAUO,SAAS,sBAAA,GAA+C;AAC7D,EAAA,OAAO,sBAAA,KAA2B,QAAA,GAAW,SAAA;AAC/C;AAGA,SAAS,SAAS,IAAA,EAAsB;AACtC,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AACrD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,GAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAG,CAAC,CAAA,IAAK,EAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAK,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAG,CAAC,CAAA,IAAK,EAAA,GAAM,EAAA;AACtE,EAAA,OAAA,CAAQ,KAAA,GAAQ,MAAM,WAAA,EAAY;AACpC;AAGO,SAAS,wBAAwB,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,GAAO,IAAG,EAA8B;AAC7F,EAAA,uBACEd,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iBAAA;AAAA,MACV,KAAA,EAAO,IAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,aAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,KAAA,EAAO,IAAA;AAAA,QACP,MAAA,EAAQ,IAAA;AAAA,QACR,YAAA,EAAc,KAAA;AAAA,QACd,UAAA,EAAY,KAAA;AAAA,QACZ,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,IAAI,CAAA;AAAA,QAChC,UAAA,EAAY;AAAA,OACd;AAAA,MACA,aAAA,EAAY,MAAA;AAAA,MAEX,mBAAS,IAAI;AAAA;AAAA,GAChB;AAEJ;AAQO,SAAS,yBAAA,CAA0B,EAAE,KAAA,EAAO,GAAA,GAAM,GAAE,EAAgC;AACzF,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,MAAA;AACnC,EAAA,uBACED,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAqB,KAAA,EAAO,EAAE,OAAA,EAAS,aAAA,EAAc,EAAG,aAAA,EAAY,MAAA,EACjF,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBAChBC,GAAAA,CAAC,MAAA,EAAA,EAAuB,KAAA,EAAO,EAAE,UAAA,EAAY,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,EAAA,EAAG,EAC5D,QAAA,kBAAAA,GAAAA,CAAC,uBAAA,EAAA,EAAwB,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,CAAA,EAAA,EAD9D,IAAA,CAAK,MAEhB,CACD,CAAA;AAAA,IACA,QAAQ,CAAA,mBAAID,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,yBAAA,EAA0B,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MAAE;AAAA,KAAA,EAAM,CAAA,GAAU;AAAA,GAAA,EAC3E,CAAA;AAEJ;AAGO,SAAS,sBAAsB,EAAE,KAAA,EAAO,IAAA,EAAM,WAAA,EAAa,UAAS,EAA4B;AACrG,EAAA,uBACEA,IAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,IAAA,EAAK,kBAAA,EAAmB,cAAA,EAAc,WAAA,IAAe,OAAO,SAAA,EAAU,oBAAA,EAAqB,OAAA,EAAS,MAAM,YAAW,EACzI,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,uBAAA,EAAA,EAAwB,KAAA,EAAc,IAAA,EAAY,MAAM,EAAA,EAAI,CAAA;AAAA,oBAC7DA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAA4B,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,IAChD,8BAAcA,GAAAA,CAAC,UAAK,SAAA,EAAU,yBAAA,EAA0B,uBAAS,CAAA,GAAU;AAAA,GAAA,EAC9E,CAAA;AAEJ;AAGO,IAAM,2BAA2BQ,KAAAA,CAAM,SAAS+C,yBAAAA,CAAyB,EAAE,UAAS,EAAkC;AAC3H,EAAA,MAAM,SAASrD,SAAAA,EAAU;AACzB,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,WAAA,GAAc,OAAO,kBAAA,EAAmB;AAC9C,EAAA,uBACEH,IAAAA,CAAAW,UAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAV,IAAC,yBAAA,EAAA,EAA0B,CAAA;AAAA,oBAC3BA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,IAAA,EAAK,MAAA,EAAO,YAAA,EAAW,QAAA,EAC1D,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,yBACVA,GAAAA;AAAA,MAAC,qBAAA;AAAA,MAAA;AAAA,QAEC,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAM,IAAA,CAAK,QAAA;AAAA,QACX,WAAA,EAAa,gBAAgB,IAAA,CAAK,MAAA;AAAA,QAClC,QAAA,EAAU,MAAO,WAAA,KAAgB,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,iBAAA,EAAkB,GAAI,MAAA,CAAO,kBAAA,CAAmB,IAAA,CAAK,MAAM;AAAA,OAAA;AAAA,MAL5G,IAAA,CAAK;AAAA,KAOb,CAAA,EACH,CAAA;AAAA,IACC;AAAA,GAAA,EACH,CAAA;AAEJ,CAAC;AAGM,IAAM,oBAAoBQ,KAAAA,CAAM,SAASgD,kBAAAA,CAAkB,EAAE,UAAS,EAA2B;AACtG,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,UAAU,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAkB,OAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,UAAS,CAAE,CAAA;AAC7G,EAAA,uBACEzD,IAAAA,CAAC,eAAA,EAAA,EAAgB,EAAA,EAAG,aAAA,EAAc,MAAK,OAAA,EACrC,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,sBAAA,EAAA,EAAuB,SAAA,EAAU,iCAAA,EAChC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,6BAA0B,KAAA,EAAc,CAAA;AAAA,sBACzCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAW,QAAA,EAAA,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,OAAA,EAAU,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,QAAA,GAAW,QAAQ,CAAA,KAAA,CAAA,EAAQ;AAAA,KAAA,EACtG,CAAA;AAAA,oBACAA,IAAC,sBAAA,EAAA,EAAuB,KAAA,EAAM,UAC5B,QAAA,kBAAAA,GAAAA,CAAC,wBAAA,EAAA,EAA0B,QAAA,EAAS,CAAA,EACtC;AAAA,GAAA,EACF,CAAA;AAEJ,CAAC;AAGM,IAAM,yBAAA,GAA4BQ,KAAAA,CAAM,SAASiD,0BAAAA,GAA4B;AAClF,EAAA,MAAM,SAASvD,SAAAA,EAAU;AACzB,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,OAAA,EAAQ;AACjC,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,QAAA,EAAS;AACnC,EAAA,uBACEH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yBAAA,EACf,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,sBACrCA,GAAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,OAAA,EAAQ,OAAO,KAAA,EAAO,QAAA,EAAU,CAAC,KAAA,KAAU,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA,EAAG;AAAA,KAAA,EACnG,CAAA;AAAA,oBACAA,GAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAO,IAAA,EAAM,OAAM,WAAA,EAAY,WAAA,EAAY,WAAA,EAAY,UAAA,EAAY,CAAC,IAAA,KAAS,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,EAAG;AAAA,GAAA,EACzH,CAAA;AAEJ,CAAC;AAQM,IAAM,yBAAA,GAA4BQ,KAAAA,CAAM,SAASkD,0BAAAA,GAA4B;AAClF,EAAA,MAAM,SAASxD,SAAAA,EAAU;AACzB,EAAA,MAAM,WAAA,GAAc,OAAO,kBAAA,EAAmB;AAC9C,EAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AACzB,EAAA,MAAM,IAAA,GAAO,OAAO,oCAAA,EAAqC,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA;AAC/F,EAAA,uBACEH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EAA+B,IAAA,EAAK,QAAA,EAAS,KAAA,EAAO,EAAE,WAAA,EAAa,IAAA,EAAM,KAAA,EAAM,EAC5F,QAAA,EAAA;AAAA,oBAAAA,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,MAAA,YAAA;AAAA,MAAW,MAAM,QAAA,IAAY;AAAA,KAAA,EAAU,CAAA;AAAA,oBAC7CC,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,cAAA,EAAe,OAAA,EAAS,MAAM,MAAA,CAAO,iBAAA,EAAkB,EAAG,QAAA,EAAA,MAAA,EAE1F;AAAA,GAAA,EACF,CAAA;AAEJ,CAAC;AAGM,SAAS,iBAAA,GAAoB;AAClC,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCACb,QAAA,kBAAAA,GAAAA,CAAC,qBAAkB,CAAA,EACrB,CAAA;AAEJ;AAUO,SAAS,cAAA,CAAe,EAAE,QAAA,EAAS,EAAiD;AACzF,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIH,SAAS,EAAE,CAAA;AACnC,EAAA,uBACEG,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBACb,QAAA,kBAAAA,GAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,IAAA;AAAA,MACP,KAAA,EAAM,aAAA;AAAA,MACN,WAAA,EAAY,eAAA;AAAA,MACZ,aAAA,EAAe,OAAA;AAAA,MACf,UAAA,EAAY,CAAC,KAAA,KAAU;AACrB,QAAA,IAAI,MAAM,IAAA,EAAK,EAAG,QAAA,GAAW,KAAA,CAAM,MAAM,CAAA;AACzC,QAAA,OAAA,CAAQ,EAAE,CAAA;AAAA,MACZ;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;AC5NO,SAAS,8BAA8B,EAAE,KAAA,EAAO,IAAA,EAAK,GAAwC,EAAC,EAAG;AACtG,EAAA,MAAM,SAASE,SAAAA,EAAU;AAKzB,EAAA,MAAM,IAAA,GAAO,OAAO,iBAAA,EAAkB;AAItC,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,EAAE,IAAI,MAAA,EAAQ,KAAA,EAAO,QAAQ,KAAA,EAAO,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,IACrD,EAAE,IAAI,QAAA,EAAU,KAAA,EAAO,UAAU,KAAA,EAAO,GAAA,EAAK,OAAO,QAAA,EAAkB;AAAA,IACtE,EAAE,IAAI,QAAA,EAAU,KAAA,EAAO,iBAAiB,KAAA,EAAO,GAAA,EAAK,YAAY,cAAA,EAAwB;AAAA,IACxF,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,OAAO,IAAA;AAAK,GAC3C;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,EAAE,CAAC,CAAA,GAAI,KAAA;AAEtE,EAAA,uBACEH,IAAAA,CAAAW,UAAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVV,GAAAA;AAAA,MAAC,qBAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,MAAA;AAAA,QACL,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,QAAA,EAAU,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,EAAE,CAAA,IAAK,KAAA;AAAA,QACtC,OAAA,EAAS,MAAM,IAAA,CAAK,UAAA,GAAa,KAAK,EAAE,CAAA;AAAA,QAExC,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,YAAY,IAAA,CAAK,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,OAAO,cAAA,EAAgB,IAAA,CAAK,UAAA,EAAW,EAAI,eAAK,KAAA,EAAM;AAAA,OAAA;AAAA,MANzG,IAAA,CAAK;AAAA,KAQb,CAAA;AAAA,oBACDA,GAAAA,CAAC,qBAAA,EAAA,EAAsB,IAAA,EAAK,MAAA,EAAO,OAAM,MAAA,EAAO,QAAA,EAAU,IAAA,CAAK,QAAA,GAAW,MAAM,CAAA,IAAK,OAAO,OAAA,EAAS,MAAM,IAAA,CAAK,UAAA,GAAa,MAAM,CAAA,EACjI,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,MAAA,EAAO,CAAA,EACpB;AAAA,GAAA,EACF,CAAA;AAEJ;AAMO,IAAM,yBAAyBQ,KAAAA,CAAM,SAASmD,uBAAAA,CAAuB,EAAE,UAAS,EAA6B;AAClH,EAAA,MAAM,SAASzD,SAAAA,EAAU;AACzB,EAAA,MAAM,SAAA,GAAY,OAAO,iBAAA,EAAkB;AAC3C,EAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AACvB,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,kBAAA,CAAmB,SAAS,CAAA;AAClD,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,uBACEF,GAAAA,CAAC,yBAAA,EAAA,EAA0B,KAAA,EAAM,iBAAA,EAAkB,oBAAoB,OAAO,EAAE,CAAA,EAAG,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG,OAAO,IAAA,EAAM,CAAA,EAAG,MAAA,CAAO,KAAA,EAAO,CAAA,EAAG,MAAA,CAAO,MAAA,EAAO,CAAA,EAC/I,QAAA,EAAA,QAAA,oBAAYA,GAAAA,CAAC,6BAAA,EAAA,EAA8B,CAAA,EAC9C,CAAA;AAEJ,CAAC;AClDD,IAAM,WAAoC,EAAC;AAGpC,SAAS,gBAAA,CAAoB,IAAA,EAAc,YAAA,EAAiB,WAAA,GAAc,IAAA,EAAuB;AACtG,EAAA,MAAM,IAAA,GAAwB,EAAE,IAAA,EAAM,YAAA,EAAc,WAAA,EAAa,KAAA,EAAO4D,MAAAA,CAAK,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,EAAI,YAAY,CAAA,EAAE;AAC5G,EAAA,QAAA,CAAS,KAAK,IAA6B,CAAA;AAC3C,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,eAAA,CAAgB,IAAA,EAAc,YAAA,GAAe,KAAA,EAAkB;AAC7E,EAAA,OAAO,gBAAA,CAAiB,MAAM,YAAY,CAAA;AAC5C;AAGO,SAAS,aAAA,GAAkD;AAChE,EAAA,OAAO,QAAA;AACT;AAGO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,QAAA,EAAU,KAAA;AAAA,EACV,aAAA,EAAe,KAAA;AAAA,EACf,mBAAA,EAAqB,KAAA;AAAA,EACrB,gBAAA,EAAkB,KAAA;AAAA,EAClB,WAAA,EAAa;AACf;AAGO,IAAM,UAAA,GAAa;AAAA,EACxB,QAAA,EAAU,gBAAgB,UAAU,CAAA;AAAA,EACpC,aAAA,EAAe,gBAAgB,eAAe,CAAA;AAAA,EAC9C,mBAAA,EAAqB,gBAAgB,qBAAqB,CAAA;AAAA,EAC1D,gBAAA,EAAkB,gBAAgB,kBAAkB,CAAA;AAAA,EACpD,WAAA,EAAa,gBAAgB,aAAa;AAC5C;AAQO,IAAM,eAAiC;AAGvC,SAAS,iBAAA,CAAkB,IAAA,EAAc,YAAA,GAAe,KAAA,EAAkB;AAC/E,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,IAAA,EAAM,YAAY,CAAA;AAC/C,EAAA,YAAA,CAAa,IAAI,CAAA,GAAI,IAAA;AACrB,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,OAAA,CAAQ,EAAE,IAAA,EAAK,EAAoC;AAC1D,EAAA,MAAM,KAAA,GAAQ9C,QAAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACjC,EAAA,IAAI,OAAO,KAAA,KAAU,SAAA,EAAW,OAAO,IAAA;AACvC,EAAA,uBACEf,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EACf,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,UAAA,EAAW,SAAS,KAAA,EAAO,QAAA,EAAU,CAAC,KAAA,KAAU,KAAK,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA,EAAG,CAAA;AAAA,IACjG,IAAA,CAAK;AAAA,GAAA,EACR,CAAA;AAEJ;AAOO,SAAS,UAAA,CAAW,EAAE,QAAA,EAAS,EAAoB;AACxD,EAAA,MAAM,KAAA,GAAQ,aAAA,EAAc,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,WAAA,IAAe,EAAE,IAAA,CAAK,IAAA,IAAQ,YAAA,CAAa,CAAA;AAC/F,EAAA,uBACED,KAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAuB,IAAA,EAAK,OAAA,EAAQ,cAAW,aAAA,EAC3D,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVC,IAAC,OAAA,EAAA,EAAwB,IAAA,EAAA,EAAX,IAAA,CAAK,IAAkB,CACtC,CAAA;AAAA,IACA;AAAA,GAAA,EACH,CAAA;AAEJ;AAOO,SAAS,YAAA,CAAa,EAAE,QAAA,EAAS,EAAsB;AAC5D,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA;AACxC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,uBACED,KAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAuB,IAAA,EAAK,OAAA,EAAQ,cAAW,eAAA,EAC3D,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVC,IAAC,OAAA,EAAA,EAAwB,IAAA,EAAA,EAAX,IAAA,CAAK,IAAkB,CACtC,CAAA;AAAA,IACA;AAAA,GAAA,EACH,CAAA;AAEJ;AAUO,IAAM,iBAAA,GAAoBQ,KAAAA,CAAM,SAASqD,kBAAAA,GAAoB;AAClE,EAAA,MAAM,SAAS3D,SAAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,OAAO,iBAAA,EAAkB;AACvC,EAAA,uBACEH,KAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAgC,IAAA,EAAK,QAAA,EAAS,cAAW,kBAAA,EACtE,QAAA,EAAA;AAAA,oBAAAA,KAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,MAAA,CAAO,sBAAA,GAAyB,IAAA,EAAK,CAAA;AAAA,MAAI;AAAA,KAAA,EAC/C,CAAA;AAAA,oBACAD,KAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,KAAA,CAAM,KAAA,EAAM,CAAA;AAAA,MAAI,cAAA;AAAA,sBAASA,GAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,KAAA,CAAM,MAAA,EAAO,CAAA;AAAA,MAAI;AAAA,KAAA,EACpD,CAAA;AAAA,oBACAD,KAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,GAAA,EAAA,EAAG,QAAA,EAAA,KAAA,CAAM,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAA,EAAE,CAAA;AAAA,MAAI;AAAA,KAAA,EAC9B;AAAA,GAAA,EACF,CAAA;AAEJ,CAAC;AC9GM,IAAM,mBAAA,GAAsBQ,MAAM,SAASsD,oBAAAA,CAAoB,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAK,EAAqB;AACrH,EAAA,MAAM,QAAQvD,QAAAA,EAAS;AACvB,EAAA,MAAM,IAAA,GAAO,MAAM,MAAM,CAAA;AACzB,EAAA,MAAM,UAAA,GAAawD,kBAAkB,IAAI,CAAA;AACzC,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,CAAK,IAAA;AAC1B,EAAA,MAAM,IAAA,GAAO,SAAS,IAAA,CAAK,KAAA;AAC3B,EAAA,MAAM,QAAQ,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,OAAO,IAAI,CAAA;AAC9D,EAAA,uBACE/D,GAAAA;AAAA,IAAC,qBAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MACL,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,IAAA;AAAA,MACN,GAAI,IAAA,CAAK,QAAA,GAAW,EAAE,QAAA,EAAU,IAAA,KAAS,EAAC;AAAA,MAC3C,OAAA,EAAS,MAAM,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AAAA,MAErC,kCAAQA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAwB,oBAAKA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAsB,QAAA,EAAA,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,aAAY,EAAE;AAAA;AAAA,GACnH;AAEJ,CAAC;AAGM,IAAM,iBAAiBQ,KAAAA,CAAM,SAASwD,gBAAe,EAAE,GAAA,EAAK,OAAM,EAA0C;AACjH,EAAA,MAAM,SAAS9D,SAAAA,EAAU;AACzB,EAAA,MAAM,QAAQK,QAAAA,EAAS;AACvB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAG,CAAA,IAAK,MAAM,KAAK,CAAA;AACtC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,gBAAA,EAAiB,KAAM,KAAA,GAAU,OAAO,kBAAA,CAAmB,KAAK,CAAA,EAA0C,GAAA,IAAO,WAAA,GAAe,IAAA;AACvJ,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,MAAM,IAAA,GAAO,KAAA,IAAS,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA;AACpF,EAAA,uBACEP,GAAAA;AAAA,IAAC,qBAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MACL,UAAU,OAAA,KAAY,GAAA;AAAA,MACtB,KAAA,EAAO,IAAA;AAAA,MACP,SAAS,MAAM;AACb,QAAA,MAAA,CAAO,qBAAA,CAAsBK,kBAAkB,GAAG,CAAA;AAClD,QAAA,MAAA,CAAO,eAAe,KAAA,EAAO,EAAE,GAAA,EAAK,KAAA,EAAO,MAAM,CAAA;AAAA,MACnD,CAAA;AAAA,MAEA,0BAAAL,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,CAAA,IAAA,EAAO,GAAG,CAAA,CAAA,EAAI;AAAA;AAAA,GAC5B;AAEJ,CAAC;AAKM,IAAM,oBAAoB,sBAAMA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,MAAK,QAAA,EAAS;AAEnE,IAAM,kBAAkB,sBAAMA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,MAAK,MAAA,EAAO;AAE/D,IAAM,kBAAkB,sBAAMA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,MAAK,MAAA,EAAO;AAE/D,IAAM,oBAAoB,sBAAMA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,MAAK,QAAA,EAAS;AAEnE,IAAM,mBAAmB,sBAAMA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,MAAK,OAAA,EAAQ;AAEjE,IAAM,kBAAkB,sBAAMA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,MAAK,MAAA,EAAO;AAE/D,IAAM,kBAAkB,sBAAMA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,MAAK,MAAA,EAAO;AAE/D,IAAM,kBAAkB,sBAAMA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,MAAK,MAAA,EAAO;AAE/D,IAAM,mBAAmB,sBAAMA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,MAAK,OAAA,EAAQ;AAEjE,IAAM,uBAAuB,sBAAMA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,MAAK,WAAA,EAAY;AAEzE,IAAM,mBAAmB,sBAAMA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,MAAK,OAAA,EAAQ;AAEjE,IAAM,gBAAA,GAAmB,sBAAMA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,MAAK,OAAA,EAAQ,KAAA,EAAM,OAAA,EAAQ,IAAA,EAAK,OAAA,EAAQ;AAE5F,IAAM,qBAAqB,sBAAMA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,MAAK,SAAA,EAAU;AAKrE,IAAM,uBAAuB,sBAAMA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAI,WAAA,EAAY;AAEnE,IAAM,qBAAqB,sBAAMA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAI,SAAA,EAAU;AAE/D,IAAM,sBAAsB,sBAAMA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAI,UAAA,EAAW;AAEjE,IAAM,qBAAqB,sBAAMA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAI,SAAA,EAAU;AAE/D,IAAM,qBAAqB,sBAAMA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAI,SAAA,EAAU;AAE/D,IAAM,kBAAkB,sBAAMA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAI,MAAA,EAAO;AAEzD,IAAM,qBAAqB,sBAAMA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAI,SAAA,EAAU;AAE/D,IAAM,kBAAkB,sBAAMA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAI,MAAA,EAAO;AAEzD,IAAM,uBAAuB,sBAAMA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAI,WAAA,EAAY;AAEnE,IAAM,mBAAmB,sBAAMA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAI,OAAA,EAAQ;AAE3D,IAAM,mBAAmB,sBAAMA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAI,OAAA,EAAQ;AAE3D,IAAM,kBAAkB,sBAAMA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAI,OAAA,EAAQ;AAE1D,IAAM,sBAAsB,sBAAMA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAI,WAAA,EAAY;AAElE,IAAM,wBAAwB,sBAAMA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAI,aAAA,EAAc;AAEtE,IAAM,uBAAuB,sBAAMA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAI,YAAA,EAAa;AAEpE,IAAM,qBAAqB,sBAAMA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAI,UAAA,EAAW;AAEhE,IAAM,uBAAuB,sBAAMA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAI,YAAA,EAAa;AAgBpE,IAAM,yBAAyBQ,KAAAA,CAAM,SAASyD,uBAAAA,CAAuB,EAAE,WAAU,EAAgC;AACtH,EAAA,MAAM,SAAS/D,SAAAA,EAAU;AACzB,EAAA,MAAM,MAAA,GAAS,OAAO,gBAAA,EAAiB;AACvC,EAAA,IAAI,WAAW,QAAA,IAAY,MAAA,KAAW,MAAA,IAAU,MAAA,KAAW,UAAU,OAAO,IAAA;AAC5E,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,gBAAA,EAAiB,CAAE,YAAA;AACzC,EAAA,uBACEF,GAAAA;AAAA,IAAC,qBAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MACL,QAAA,EAAU,MAAA;AAAA,MACV,KAAA,EAAM,WAAA;AAAA,MACL,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,MAClC,OAAA,EAAS,MAAM,MAAA,CAAO,mBAAA,CAAoB,EAAE,YAAA,EAAc,CAAC,QAAQ,CAAA;AAAA,MAEnE,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,MAAA,GAAS,SAAS,QAAA,EAAU;AAAA;AAAA,GAC1C;AAEJ,CAAC;AAUM,SAAS,qBAAA,GAAwB;AACtC,EAAA,uBACED,IAAAA,CAAAW,UAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAV,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,oBACnBA,IAAC,eAAA,EAAA,EAAgB,CAAA;AAAA,oBACjBA,IAAC,eAAA,EAAA,EAAgB,CAAA;AAAA,oBACjBA,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,oBACnBA,IAAC,gBAAA,EAAA,EAAiB,CAAA;AAAA,oBAClBA,IAAC,eAAA,EAAA,EAAgB,CAAA;AAAA,oBACjBA,IAAC,eAAA,EAAA,EAAgB,CAAA;AAAA,oBACjBA,IAAC,oBAAA,EAAA,EAAqB,CAAA;AAAA,oBACtBA,IAAC,kBAAA,EAAA,EAAmB,CAAA;AAAA,oBACpBA,IAAC,mBAAA,EAAA,EAAoB,CAAA;AAAA,oBACrBA,IAAC,kBAAA,EAAA,EAAmB,CAAA;AAAA,oBACpBA,IAAC,eAAA,EAAA,EAAgB,CAAA;AAAA,oBACjBA,IAAC,eAAA,EAAA,EAAgB,CAAA;AAAA,oBACjBA,IAAC,gBAAA,EAAA,EAAiB,CAAA;AAAA,oBAClBA,IAAC,oBAAA,EAAA,EAAqB,CAAA;AAAA,oBACtBA,IAAC,gBAAA,EAAA,EAAiB,CAAA;AAAA,oBAClBA,IAAC,gBAAA,EAAA,EAAiB;AAAA,GAAA,EACpB,CAAA;AAEJ;AAmBO,SAAS,mBAAmB,EAAE,KAAA,GAAQ,OAAA,EAAS,SAAA,EAAW,UAAS,EAA4B;AACpG,EAAA,MAAM,MAAA,GAASJ,OAAuB,IAAI,CAAA;AAC1C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,SAAwB,IAAI,CAAA;AAEtD,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,KAAK,MAAA,CAAO,OAAA;AAClB,IAAA,IAAI,CAAC,EAAA,IAAM,OAAO,cAAA,KAAmB,WAAA,EAAa;AAClD,IAAA,MAAM,SAAS,MAAM,QAAA,CAAS,EAAA,CAAG,qBAAA,GAAwB,KAAK,CAAA;AAC9D,IAAA,MAAA,EAAO;AACP,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,MAAM,CAAA;AACpC,IAAA,EAAA,CAAG,QAAQ,EAAE,CAAA;AACb,IAAA,OAAO,MAAM,GAAG,UAAA,EAAW;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQoE,QAAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AAIvC,EAAA,MAAM,IAAA,GAAO,KAAA,KAAU,IAAA,GAAO,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAA,CAAO,KAAA,GAAQ,EAAA,IAAM,EAAE,CAAC,CAAA;AACtF,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,SAAA,IAAa,KAAA,CAAM,QAAQ,IAAI,CAAA;AACtD,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AACnC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAElC,EAAA,uBACEnE,IAAAA,CAAC,eAAA,EAAA,EAAgB,GAAA,EAAK,QAAQ,KAAA,EAC3B,QAAA,EAAA;AAAA,IAAA,MAAA;AAAA,IACA,QAAA,CAAS,SAAS,CAAA,mBACjBA,KAAC,eAAA,EAAA,EAAgB,EAAA,EAAG,kBAAA,EAAmB,IAAA,EAAK,OAAA,EAC1C,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,0BAAuB,SAAA,EAAU,cAAA,EAChC,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,cAAA,EAAe,CAAA,EAC5B,CAAA;AAAA,sBACAA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,KAAA,EAAM,YAAA,EAC5B,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA6B,QAAA,EAAA,QAAA,EAAS,CAAA,EACvD;AAAA,KAAA,EACF,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAQO,SAAS,0BAAA,GAA6B;AAC3C,EAAA,MAAM,aAAa,aAAA,EAAc;AACjC,EAAA,uBACED,IAAAA,CAAC,kBAAA,EAAA,EAAmB,KAAA,EAAM,OAAA,EACxB,QAAA,EAAA;AAAA,oBAAAC,IAAC,qBAAA,EAAA,EAAsB,CAAA;AAAA,oBACvBA,IAAC,sBAAA,EAAA,EAAuB,CAAA;AAAA,IACvB,aAAa,mBAAA,CAAoB,SAAA,mBAAYA,GAAAA,CAAC,oBAAiB,CAAA,GAAK;AAAA,GAAA,EACvE,CAAA;AAEJ;ACjQO,SAAS,cAAA,CAAe,KAAqB,SAAA,EAA2C;AAC7F,EAAA,IAAI,GAAA,CAAI,KAAK,SAAA,CAAU,CAAA,IAAK,IAAI,CAAA,IAAK,SAAA,CAAU,GAAG,OAAO,GAAA;AACzD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,CAAA,GAAI,IAAI,CAAA,EAAG,SAAA,CAAU,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA;AAC/D,EAAA,OAAO,EAAE,GAAG,GAAA,CAAI,CAAA,GAAI,OAAO,CAAA,EAAG,GAAA,CAAI,IAAI,KAAA,EAAM;AAC9C;AASO,IAAM,oBAAA,GAAqD;AAAA,EAChE,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,EACvC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,EACnC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,EACnC,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,WAAA,EAAY;AAAA,EACzC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,EACvC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAC1B;AAMO,IAAM,qBAAA,GAAiE;AAAA,EAC5E,QAAA,EAAU,IAAA;AAAA,EACV,MAAA,EAAQ,CAAA;AAAA,EACR,MAAA,EAAQ,CAAA;AAAA,EACR,WAAW,CAAA,GAAI,CAAA;AAAA,EACf,UAAU,CAAA,GAAI,CAAA;AAAA,EACd,MAAM,EAAA,GAAK;AACb;AAmBO,SAAS,oBAAA,CAAqB,EAAE,OAAA,EAAS,KAAA,EAAO,yBAAwB,EAI7E;AACA,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQY,SAAS,OAAA,EAAS,MAAO,UAAW,MAAA,CAAO,SAAA,GAAY,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,OAAO,CAAA,IAAK,IAAA,GAAQ,MAAO,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AACtI,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIjB,SAAwB,IAAI,CAAA;AAElD,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAA,CAAO,IAAI,CAAA;AACX,MAAA;AAAA,IACF;AAOA,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,eAAA,CAAgB,OAAO,CAAA;AAC/C,IAAA,KAAK,QAAQ,OAAA,CAAQ,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS;AAC5C,MAAA,IAAI,CAAC,SAAA,EAAW,MAAA,CAAO,IAAA,IAAQ,IAAI,CAAA;AAAA,IACrC,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,uBAAuB,CAAC,CAAA;AAEpD,EAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,aAAA,EAAe,QAAQ,IAAA,EAAK;AACnD;AAGO,SAAS,aAAa,KAAA,EAAgH;AAC3I,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,MAAM,CAAA,IAAK,CAAA;AAAA,IACd,CAAA,EAAG,MAAM,CAAA,IAAK,CAAA;AAAA,IACd,QAAA,EAAU,MAAM,QAAA,IAAY,IAAA;AAAA,IAC5B,UAAA,EAAY,MAAM,UAAA,IAAc;AAAA,GAClC;AACF;AASO,SAAS,0BAAA,CAA2B,EAAE,KAAA,EAAO,aAAA,EAAc,EAAoC;AACpG,EAAA,MAAM,SAASI,SAAAA,EAAU;AACzB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIL,SAAiB,UAAU,CAAA;AACrD,EAAA,uBACEE,IAAAA,CAAAW,UAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAV,GAAAA;AAAA,MAAC,0BAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,cAAA;AAAA,QACN,IAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,UAAA,QAAA,CAAS,KAAK,CAAA;AACd,UAAA,aAAA,GAAgB,KAAK,CAAA;AACrB,UAAA,MAAM,MAAA,GAAS,sBAAsB,KAAK,CAAA;AAC1C,UAAA,IAAI,CAAC,MAAA,EAAQ;AACb,UAAA,MAAM,MAAA,GAAS,MAAA,CAAO,kBAAA,CAAmB,KAAA,CAAM,EAAE,CAAA;AACjD,UAAA,IAAI,CAAC,MAAA,EAAQ;AACb,UAAA,MAAA,CAAO,yBAAyB,cAAc,CAAA;AAC9C,UAAA,MAAA,CAAO,YAAY,EAAE,EAAA,EAAI,MAAM,EAAA,EAAI,IAAA,EAAM,MAAM,IAAA,EAAM,KAAA,EAAO,EAAE,CAAA,EAAG,OAAO,KAAA,EAAO,CAAA,EAAG,OAAO,KAAA,GAAQ,MAAA,IAAmB,CAAA;AAAA,QACtH,CAAA;AAAA,QAEC,+BAAqB,GAAA,CAAI,CAAC,MAAA,qBACzBA,IAAC,yBAAA,EAAA,EAA6C,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,OAAO,MAAA,CAAO,KAAA,EAC9E,iBAAO,KAAA,EAAA,EADsB,MAAA,CAAO,KAEvC,CACD;AAAA;AAAA,KACH;AAAA,oBACAA,GAAAA,CAAC,qBAAA,EAAA,EAAsB,MAAK,MAAA,EAAO,KAAA,EAAM,iBAAgB,OAAA,EAAS,MAAM,MAAA,CAAO,gBAAA,CAAiB,IAAI,CAAA,EAClG,QAAA,kBAAAA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,SAAQ,CAAA,EACrB;AAAA,GAAA,EACF,CAAA;AAEJ;AAGO,IAAM,sBAAsBQ,KAAAA,CAAM,SAAS2D,oBAAAA,CAAoB,EAAE,UAAS,EAA0B;AACzG,EAAA,MAAM,SAASjE,SAAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,OAAO,oBAAA,EAAqB;AAC1C,EAAA,IAAI,CAAC,SAAS,KAAA,CAAM,IAAA,KAAS,WAAW,MAAA,CAAO,iBAAA,IAAqB,OAAO,IAAA;AAC3E,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,kBAAA,CAAmB,KAAA,CAAM,EAAE,CAAA;AACjD,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,uBACEF,GAAAA,CAAC,yBAAA,EAAA,EAA0B,KAAA,EAAM,OAAA,EAAQ,kBAAA,EAAoB,OAAO,EAAE,CAAA,EAAG,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,EAAG,MAAA,CAAO,KAAA,EAAO,CAAA,EAAG,MAAA,CAAO,MAAA,EAAO,CAAA,EACrI,QAAA,EAAA,QAAA,oBAAYA,GAAAA,CAAC,0BAAA,EAAA,EAA2B,KAAA,EAAc,CAAA,EACzD,CAAA;AAEJ,CAAC;AAOM,SAAS,0BAAA,CAA2B,EAAE,KAAA,EAAM,EAAoC;AACrF,EAAA,MAAM,SAASE,SAAAA,EAAU;AACzB,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,EAAA,uBACEH,IAAAA,CAAAW,UAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAV,GAAAA;AAAA,MAAC,qBAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,KAAA,CAAM,OAAA,GAAU,OAAA,GAAU,MAAA;AAAA,QACjC,SAAS,MAAM,MAAA,CAAO,YAAY,EAAE,EAAA,EAAI,MAAM,EAAA,EAAI,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,OAAO,EAAE,OAAA,EAAS,CAAC,KAAA,CAAM,OAAA,IAAoB,CAAA;AAAA,QAEhH,QAAA,EAAA,KAAA,CAAM,UAAU,cAAA,GAAO;AAAA;AAAA,KAC1B;AAAA,oBACAA,GAAAA;AAAA,MAAC,qBAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,QAAA,EAAU,MAAM,QAAA,IAAY,KAAA;AAAA,QAC5B,KAAA,EAAM,UAAA;AAAA,QACN,SAAS,MAAM,MAAA,CAAO,YAAY,EAAE,EAAA,EAAI,MAAM,EAAA,EAAI,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,OAAO,EAAE,QAAA,EAAU,CAAC,KAAA,CAAM,QAAA,IAAqB,CAAA;AAAA,QACpH,QAAA,EAAA;AAAA;AAAA;AAED,GAAA,EACF,CAAA;AAEJ;AAGO,IAAM,sBAAsBQ,KAAAA,CAAM,SAAS4D,oBAAAA,CAAoB,EAAE,UAAS,EAA0B;AACzG,EAAA,MAAM,SAASlE,SAAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,OAAO,oBAAA,EAAqB;AAC1C,EAAA,IAAI,CAAC,SAAS,KAAA,CAAM,IAAA,KAAS,WAAW,MAAA,CAAO,iBAAA,IAAqB,OAAO,IAAA;AAC3E,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,kBAAA,CAAmB,KAAA,CAAM,EAAE,CAAA;AACjD,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,uBACEF,GAAAA,CAAC,yBAAA,EAAA,EAA0B,KAAA,EAAM,OAAA,EAAQ,kBAAA,EAAoB,OAAO,EAAE,CAAA,EAAG,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,EAAG,MAAA,CAAO,KAAA,EAAO,CAAA,EAAG,MAAA,CAAO,MAAA,EAAO,CAAA,EACrI,QAAA,EAAA,QAAA,oBAAYA,GAAAA,CAAC,0BAAA,EAAA,EAA2B,KAAA,EAAc,CAAA,EACzD,CAAA;AAEJ,CAAC;ACvLM,SAAS,eAAe,KAAA,EAAuC;AACpE,EAAA,uBAAOA,GAAAA,CAAC,SAAA,EAAA,EAAW,GAAG,KAAA,EAAO,CAAA;AAC/B;AAUO,SAAS,cAAc,EAAE,QAAA,EAAU,IAAA,EAAM,GAAG,MAAK,EAAkC;AACxF,EAAA,uBAAOA,GAAAA,CAAC,SAAA,EAAA,EAAW,GAAG,IAAA,EAAM,MAAM,IAAA,IAAQ,cAAA,CAAe,QAAQ,CAAA,EAAI,GAAI,QAAA,KAAa,MAAA,GAAY,EAAC,GAAI,EAAE,UAAS,EAAI,CAAA;AACxH;AAwBO,SAAS,WAAA,CAAY,EAAE,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAU,UAAA,GAAa,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,aAAA,EAAe,OAAA,EAAS,IAAA,EAAM,YAAW,EAAqB;AAC7J,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,QAAA,EAAU,MAAA,EAAQ;AAAA,IACzC,UAAA,EAAY,cAAc,UAAU,CAAA;AAAA,IACpC,QAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,IACjC,GAAI,OAAA,KAAY,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAQ;AAAA,IAC3C,GAAI,IAAA,KAAS,MAAA,GAAY,EAAC,GAAI,EAAE,IAAA,EAAK;AAAA,IACrC,GAAI,UAAA,KAAe,MAAA,GAAY,EAAC,GAAI,EAAE,UAAA;AAAW,GAClD,CAAA;AAGD,EAAA,uBAAOA,GAAAA,CAAC,GAAA,EAAA,EAAE,yBAAyB,EAAE,MAAA,EAAQ,QAAO,EAAG,CAAA;AACzD;AA2BO,SAAS,aAAA,CAAc,EAAE,IAAA,EAAM,SAAA,EAAW,UAAA,EAAY,WAAA,EAAa,SAAA,EAAW,KAAA,EAAO,GAAA,EAAK,QAAA,EAAU,UAAA,EAAY,QAAA,EAAU,WAAU,EAAkB;AAC3J,EAAA,MAAM,GAAA,GAAMJ,OAA4B,IAAI,CAAA;AAE5C,EAAAE,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,EAAA,CAAG,KAAA,EAAM;AACT,IAAA,EAAA,CAAG,MAAA,EAAO;AAAA,EACZ,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AACvB,EAAA,uBACEE,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,CAAC,IAAA,KAAS;AACb,QAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AACd,QAAA,IAAI,OAAO,GAAA,KAAQ,UAAA,EAAY,GAAA,CAAI,IAAI,CAAA;AAAA,aAAA,IAC9B,GAAA,EAAM,GAAA,CAAgD,OAAA,GAAU,IAAA;AAAA,MAC3E,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,mBAAA,EAAqB,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MACpE,KAAA;AAAA,MACA,KAAA,EAAO,IAAA;AAAA,MACP,WAAA;AAAA,MACA,UAAA,EAAY,KAAA;AAAA,MAGZ,aAAA,EAAe,CAAC,KAAA,KAAU,KAAA,CAAM,eAAA,EAAgB;AAAA,MAChD,QAAA,EAAU,CAAC,KAAA,KAAU,QAAA,CAAS,aAAa,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,MACrG,MAAA,EAAQ,MAAM,UAAA,GAAa,IAAI,CAAA;AAAA,MAC/B,SAAA,EAAW,CAAC,KAAA,KAAU;AACpB,QAAA,SAAA,GAAY,KAAK,CAAA;AACjB,QAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,UAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,UAAA,QAAA,IAAW;AAAA,QACb,WAAW,KAAA,CAAM,GAAA,KAAQ,WAAW,UAAA,IAAc,CAAC,MAAM,QAAA,EAAU;AACjE,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,UAAA,UAAA,GAAa,IAAI,CAAA;AAAA,QACnB;AAAA,MACF;AAAA;AAAA,GACF;AAEJ;AAeO,SAAS,aAAa,EAAE,QAAA,EAAU,MAAM,gBAAA,EAAkB,GAAG,MAAK,EAAsB;AAE7F,EAAA,uBAAOA,IAAC,aAAA,EAAA,EAAe,GAAG,MAAM,IAAA,EAAM,IAAA,IAAQ,cAAA,CAAe,QAAQ,CAAA,EAAG,CAAA;AAC1E;AC9HO,SAAS,0BAAA,CAA2B,EAAE,QAAA,EAAS,EAA6B;AACjF,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAA8B,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,CAAA,EAAG,aAAA,EAAe,MAAA,IAClG,QAAA,EACH,CAAA;AAEJ;AAGA,IAAM,SAASQ,KAAAA,CAAM,SAAS6D,OAAAA,CAAO,EAAE,UAAS,EAA6B;AAC3E,EAAA,MAAM,SAASnE,SAAAA,EAAU;AACzB,EAAA,MAAM,IAAI,qBAAA,EAAsB;AAChC,EAAA,MAAM,QAAA,GAAW,OAAO,gBAAA,EAAiB;AAKzC,EAAA,MAAM,QAAQ,QAAA,CAAS,WAAA;AAEvB,EAAA,MAAMoE,UAAS,CAAA,CAAE,WAAA,KAAgB,IAAA,GAAO,IAAA,GAAQ,EAAE,WAAA,IAAe,kBAAA;AACjE,EAAA,MAAM,SAASA,OAAAA,mBAAStE,IAACsE,OAAAA,EAAA,EAAQ,UAAS,CAAA,GAAY,QAAA;AAEtD,EAAA,MAAM,OAAO,CAAK,KAAA,EAA6C,aAC7D,KAAA,KAAU,IAAA,GAAO,OAAS,KAAA,IAAgD,QAAA;AAE5E,EAAA,MAAM7D,QAAAA,GAAU,IAAA,CAAa,CAAA,CAAE,OAAA,EAAS,0BAA0B,CAAA;AAClE,EAAA,MAAMR,WAAAA,GAAa,IAAA,CAAa,CAAA,CAAE,UAAA,EAAY,oBAAoB,CAAA;AAClE,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAa,CAAA,CAAE,eAAA,EAAiB,sBAAsB,CAAA;AAC9E,EAAA,MAAM,SAAA,GAAY,IAAA,CAAa,CAAA,CAAE,SAAA,EAAW,gBAAgB,CAAA;AAC5D,EAAA,MAAM,WAAA,GAAc,IAAA,CAAa,CAAA,CAAE,WAAA,EAAa,kBAAkB,CAAA;AAClE,EAAA,MAAM,YAAA,GAAe,IAAA,CAAa,CAAA,CAAE,YAAA,EAAc,mBAAmB,CAAA;AACrE,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAa,CAAA,CAAE,aAAA,EAAe,oBAAoB,CAAA;AACxE,EAAA,MAAM,QAAA,GAAW,IAAA,CAAa,CAAA,CAAE,QAAA,EAAU,eAAe,CAAA;AACzD,EAAA,MAAM,UAAA,GAAa,IAAA,CAAa,CAAA,CAAE,UAAA,EAAY,iBAAiB,CAAA;AAC/D,EAAA,MAAM,YAAA,GAAe,IAAA,CAAa,CAAA,CAAE,YAAA,EAAc,mBAAmB,CAAA;AACrE,EAAA,MAAM,YAAA,GAAe,IAAA,CAAa,CAAA,CAAE,YAAA,EAAc,mBAAmB,CAAA;AACrE,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAa,CAAA,CAAE,eAAA,EAAiB,sBAAsB,CAAA;AAC9E,EAAA,MAAM,kBAAA,GAAqB,IAAA,CAAa,CAAA,CAAE,kBAAA,EAAoB,yBAAyB,CAAA;AACvF,EAAA,MAAM,MAAA,GAAS,IAAA,CAAa,CAAA,CAAE,MAAA,EAAQ,aAAa,CAAA;AACnD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAa,CAAA,CAAE,OAAA,EAAS,cAAc,CAAA;AACtD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAa,CAAA,CAAE,IAAA,EAAM,oBAAoB,CAAA;AACtD,EAAA,MAAM,UAAA,GAAa,IAAA,CAAa,CAAA,CAAE,UAAA,EAAY,iBAAiB,CAAA;AAC/D,EAAA,MAAM,QAAA,GAAW,IAAA,CAAa,CAAA,CAAE,QAAA,EAAU,IAAI,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,IAAA,CAAa,CAAA,CAAE,QAAA,EAAU,IAAI,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,IAAA,CAAa,CAAA,CAAE,OAAA,EAAS,IAAI,CAAA;AAC5C,EAAA,MAAM,gBAAA,GAAmB,IAAA,CAAa,CAAA,CAAE,gBAAA,EAAkB,IAAI,CAAA;AAC9D,EAAA,MAAM,kBAAA,GAAqB,IAAA,CAAa,CAAA,CAAE,kBAAA,EAAoB,IAAI,CAAA;AAClE,EAAA,MAAM,UAAA,GAAa,IAAA,CAAa,CAAA,CAAE,UAAA,EAAY,IAAI,CAAA;AAClD,EAAA,MAAM,uBAAA,GAA0B,IAAA,CAAa,CAAA,CAAE,uBAAA,EAAyB,IAAI,CAAA;AAC5E,EAAA,MAAM,SAAA,GAAY,IAAA,CAAa,CAAA,CAAE,SAAA,EAAW,IAAI,CAAA;AAEhD,EAAA,uBACEF,IAAAA,CAAAW,UAAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,MAAA;AAAA,IACA,KAAA,GAAQ,IAAA,mBACPX,IAAAA,CAAAW,YAAA,EACG,QAAA,EAAA;AAAA,MAAA,SAAA,mBAAYV,GAAAA,CAAC,SAAA,EAAA,EAAU,CAAA,GAAK,IAAA;AAAA,MAC5B,QAAA,mBAAWA,GAAAA,CAAC,QAAA,EAAA,EAAS,CAAA,GAAK,IAAA;AAAA,MAC1B,QAAA,mBAAWA,GAAAA,CAAC,QAAA,EAAA,EAAS,CAAA,GAAK,IAAA;AAAA,MAC1B,YAAA,mBAAeA,GAAAA,CAAC,YAAA,EAAA,EAAa,CAAA,GAAK,IAAA;AAAA,MAClC,WAAA,mBAAcA,GAAAA,CAAC,WAAA,EAAA,EAAY,CAAA,GAAK,IAAA;AAAA,MAChC,aAAA,mBAAgBA,GAAAA,CAAC,aAAA,EAAA,EAAc,CAAA,GAAK,IAAA;AAAA,MACpCS,QAAAA,mBAAUT,GAAAA,CAACS,QAAAA,EAAA,EAAQ,CAAA,GAAK,IAAA;AAAA,MACxBR,WAAAA,mBAAaD,GAAAA,CAACC,WAAAA,EAAA,EAAW,CAAA,GAAK,IAAA;AAAA,MAC9B,eAAA,mBAAkBD,GAAAA,CAAC,eAAA,EAAA,EAAgB,CAAA,GAAK,IAAA;AAAA,MACxC,OAAA,mBAAUA,GAAAA,CAAC,OAAA,EAAA,EAAQ,CAAA,GAAK,IAAA;AAAA,MACxB,QAAA,mBAAWA,GAAAA,CAAC,QAAA,EAAA,EAAS,CAAA,GAAK,IAAA;AAAA,MAC1B,UAAA,mBAAaA,GAAAA,CAAC,UAAA,EAAA,EAAW,CAAA,GAAK,IAAA;AAAA,MAC9B,UAAA,mBAAaA,GAAAA,CAAC,UAAA,EAAA,EAAW,CAAA,GAAK,IAAA;AAAA,MAC9B,kBAAA,mBAAqBA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,CAAA,GAAK,IAAA;AAAA,MAC9C,YAAA,mBAAeA,GAAAA,CAAC,YAAA,EAAA,EAAa,CAAA,GAAK,IAAA;AAAA,MAClC,YAAA,mBAAeA,GAAAA,CAAC,YAAA,EAAA,EAAa,CAAA,GAAK,IAAA;AAAA,MAClC,eAAA,mBAAkBA,GAAAA,CAAC,eAAA,EAAA,EAAgB,CAAA,GAAK,IAAA;AAAA,MACxC,gBAAA,mBAAmBA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,CAAA,GAAK,IAAA;AAAA,MAC1C,kBAAA,mBAAqBA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,CAAA,GAAK,IAAA;AAAA,MAC9C,uBAAA,mBAA0BA,GAAAA,CAAC,uBAAA,EAAA,EAAwB,CAAA,GAAK,IAAA;AAAA,MACxD,SAAS,WAAA,IAAe,SAAA,mBAAYA,GAAAA,CAAC,aAAU,CAAA,GAAK,IAAA;AAAA,MACpD,SAAS,WAAA,IAAe,UAAA,mBAAaA,GAAAA,CAAC,cAAW,CAAA,GAAK,IAAA;AAAA,sBACvDA,IAAC,gBAAA,EAAA,EAAiB;AAAA,KAAA,EACpB,CAAA;AAAA,IAED,MAAA,mBAASA,GAAAA,CAAC,MAAA,EAAA,EAAO,CAAA,GAAK,IAAA;AAAA,IACtB,OAAA,mBAAUA,GAAAA,CAAC,OAAA,EAAA,EAAQ,CAAA,GAAK,IAAA;AAAA,IACxB,IAAA,mBAAOA,GAAAA,CAAC,IAAA,EAAA,EAAK,CAAA,GAAK;AAAA,GAAA,EACrB,CAAA;AAEJ,CAAC,CAAA;AASM,SAAS,QAAA,CAAS,EAAE,UAAA,EAAY,SAAA,EAAW,WAAW,MAAA,EAAQ,WAAA,EAAa,UAAS,EAAkB;AAC3G,EAAA,uBACEA,GAAAA;AAAA,IAAC,uBAAA;AAAA,IAAA;AAAA,MACE,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe,EAAC;AAAA,MACnC,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,MACjC,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,MACjC,GAAI,WAAA,GAAc,EAAE,WAAA,KAAgB,EAAC;AAAA,MAErC,QAAA,EAAA,MAAA,GAAS,QAAA,mBAAWA,GAAAA,CAAC,UAAQ,QAAA,EAAS;AAAA;AAAA,GACzC;AAEJ;AC5HA,IAAM,GAAA,GAAM,IAAA;AAEZ,SAAS,SAAA,CAAU,GAAY,CAAA,EAAqB;AAClD,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA,GAAI,GAAA,IAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,GAAA;AAC5D;AAUO,IAAM,gBAAA,GAAN,cAA+B,WAAA,CAA0B;AAAA,EAC9D,OAAgB,IAAA,GAAO,OAAA;AAAA,EAEvB,eAAA,GAAqC;AACnC,IAAA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,gBAAA,EAAkB,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EAAG,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,EACnG;AAAA,EAES,oBAAA,CAAqB,EAAE,OAAA,EAAQ,EAAoD;AAC1F,IAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,EAC3B;AAAA,EAES,sBAAA,CAAuB,EAAE,OAAA,EAAS,WAAA,EAAa,YAAW,EAAoD;AAGrH,IAAA,IAAI,YAAY,QAAA,KAAa,UAAA,CAAW,QAAA,EAAU,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,EAC7E;AAAA,EAES,qBAAA,CAAsB,EAAE,OAAA,EAAQ,EAAoD;AAC3F,IAAA,IAAA,CAAK,eAAe,OAAO,CAAA;AAAA,EAC7B;AAAA,EAES,wBAAA,CAAyB,EAAE,OAAA,EAAQ,EAAqD;AAC/F,IAAA,IAAA,CAAK,eAAe,OAAO,CAAA;AAAA,EAC7B;AAAA,EAES,sBAAA,CAAuB,EAAE,OAAA,EAAQ,EAAqD;AAC7F,IAAA,IAAA,CAAK,eAAe,OAAO,CAAA;AAAA,EAC7B;AAAA;AAAA,EAGQ,aAAa,OAAA,EAA6B;AAChD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,QAAA,CAAqB,QAAQ,MAAM,CAAA;AAC7D,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AACtC,IAAA,MAAM,EAAE,KAAA,EAAO,GAAA,KAAQ,6BAAA,CAA8B,IAAA,CAAK,QAAQ,KAAK,CAAA;AACvE,IAAA,IAAI,SAAA,CAAU,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,IAAK,SAAA,CAAU,GAAA,EAAK,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG;AAC5E,IAAA,IAAA,CAAK,OAAO,WAAA,CAAwB,EAAE,IAAI,KAAA,CAAM,EAAA,EAAI,MAAM,OAAA,EAAS,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,QAAO,EAAG,GAAA,EAAK,IAAI,MAAA,EAAO,IAAK,CAAA;AAAA,EAC1H;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,eAAe,OAAA,EAA6B;AAClD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,QAAA,CAAqB,QAAQ,MAAM,CAAA;AAC7D,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AACtC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,EAAG;AACzC,IAAA,MAAM,QAAA,GAAW,QAAQ,KAAA,CAAM,QAAA;AAC/B,IAAA,MAAM,WAAW,6BAAA,CAA8B,IAAA,CAAK,MAAA,EAAQ,KAAK,EAAE,QAAQ,CAAA;AAC3E,IAAA,IAAI,UAAU,QAAA,EAAU,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAC,CAAA,EAAG;AAChD,IAAA,IAAA,CAAK,MAAA,CAAO,YAAwB,EAAE,EAAA,EAAI,MAAM,EAAA,EAAI,IAAA,EAAM,SAAS,KAAA,EAAO,EAAE,CAAC,QAAQ,GAAG,IAAI,IAAA,CAAK,QAAQ,EAAE,MAAA,EAAO,IAAK,CAAA;AAAA,EACzH;AACF;ACnBA,SAAS,QAAQ,IAAA,EAA0B;AACzC,EAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAClB,EAAA,OAAO;AAAA,IACL,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,IAAA;AAAA,IACA,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,IAAI,IAAA,CAAK,MAAA;AAAA,IAC9B,cAAc,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA,CAAK,KAAK,CAAA,GAAI,CAAA;AAAA,IAC7C,SAAA,EAAW,IAAA,GAAO,CAAA,GAAI,CAAA,GAAI;AAAA,GAC5B;AACF;AAQO,SAAS,YAAA,CAAa,QAAgB,KAAA,EAAsD;AACjG,EAAA,MAAM,QAAQ,OAAO,KAAA,KAAU,WAAW,MAAA,CAAO,QAAA,CAAqB,KAAK,CAAA,GAAI,KAAA;AAC/E,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,SAAS,OAAO,MAAA;AAE7C,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,MAAA,EAAQ,KAAK,CAAA;AAC/C,EAAA,MAAM,SAAA,GAAY,6BAAA,CAA8B,MAAA,EAAQ,KAAK,CAAA;AAC7D,EAAA,MAAM,KAAA,GAAQuE,GAAAA,CAAI,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACtC,EAAA,MAAM,GAAA,GAAMA,GAAAA,CAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAKlC,EAAA,MAAM,UAAA,GACJ,MAAM,KAAA,CAAM,IAAA,KAAS,UACjB,YAAA,CAAa,KAAA,EAAO,KAAK,EAAE,QAAA,EAAU,MAAM,KAAA,CAAM,aAAA,EAAe,CAAA,GAChE,YAAA,CAAa,OAAO,GAAA,EAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,cAAc,UAAU,CAAA;AAK3C,EAAA,MAAM,WAAA,GAAc,CAAA;AACpB,EAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,WAAA,EAAa,UAAU,CAAA;AAC7D,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,KAAA,CAAM,KAAA,CAAM,gBAAgB,UAAU,CAAA;AAC3E,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,KAAA,CAAM,KAAA,CAAM,cAAc,UAAU,CAAA;AACvE,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,UAAA,EAAY,UAAA,EAAY,QAAQ,CAAA;AAE9D,EAAA,MAAM,OAAA,GAAU,UAAA,GAAa,UAAA,GAAa,QAAA,GAAW,CAAA;AAErD,EAAA,IAAI,SAAA,CAAU,IAAA,KAAS,KAAA,IAAS,UAAA,CAAW,SAAS,KAAA,EAAO;AACzD,IAAA,MAAM,OAAA,GAAU,QAAQ,SAAS,CAAA;AACjC,IAAA,MAAM,SAAA,GAAY,QAAQ,UAAU,CAAA;AACpC,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,SAAA,EAAW,CAAC,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,SAAA,EAAW,CAAC,CAAA;AACxC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,QAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA,CAAM,MAAM,cAAA,EAAgB,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,UAAA,EAAW;AAAA,MACjF,GAAA,EAAK,EAAE,SAAA,EAAW,KAAA,CAAM,MAAM,YAAA,EAAc,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,QAAA,EAAS;AAAA,MACzE,MAAA,EAAQ,UAAA,CAAW,SAAA,EAAW,GAAG,CAAA;AAAA,MACjC;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,CAAW,SAAS,OAAA,EAAS;AAC/B,IAAA,MAAM,MAAA,GAAS,cAAc,KAAA,EAAO,GAAA,EAAK,EAAE,QAAA,EAAU,KAAA,CAAM,KAAA,CAAM,aAAA,EAAe,CAAA;AAChF,IAAA,MAAM,KAAA,GAAyB;AAAA,MAC7B,IAAA,EAAM,MAAA;AAAA,MACN,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,QAAA,EAAU,cAAc,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA,MAIlC,KAAA,EAAO,IAAA;AAAA,MACP,KAAA,EAAO,IAAA;AAAA,MACP,cAAA,EAAgB;AAAA,KAClB;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,GAAA,EAAK,OAAO,OAAA,EAAQ;AAAA,EACrD;AAEA,EAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,IAAA,KAAS,UAAA,GAAa,UAAU,KAAA,GAAQ,KAAA;AACxE,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,IAAA,KAAS,UAAA,GAAa,UAAU,GAAA,GAAM,GAAA;AACpE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,QAAA;AAAA,IACA,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA,CAAM,MAAM,cAAA,EAAgB,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,aAAA,EAAc;AAAA,IACpF,GAAA,EAAK,EAAE,SAAA,EAAW,KAAA,CAAM,MAAM,YAAA,EAAc,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,WAAA,EAAY;AAAA,IAC5E,MAAA,EAAQA,GAAAA,CAAI,GAAA,CAAI,aAAA,EAAe,aAAa,GAAG,CAAA;AAAA,IAC/C,MAAA,EAAQA,GAAAA,CAAI,IAAA,CAAK,aAAA,EAAe,WAAW,CAAA;AAAA,IAC3C;AAAA,GACF;AACF;AAGA,SAAS,UAAA,CAAW,MAAe,CAAA,EAAgB;AACjD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,KAAA,GAAQ,CAAA;AAC7C,EAAA,OAAO,IAAIA,GAAAA,CAAI,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,IAAI,KAAK,CAAA,GAAI,KAAK,MAAA,EAAQ,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,IAAI,KAAK,CAAA,GAAI,KAAK,MAAM,CAAA;AAC7G;AClGA,IAAM,YAAA,uBAAmB,OAAA,EAA4B;AAErD,SAAS,UAAU,MAAA,EAA4B;AAC7C,EAAA,IAAI,QAAA,GAAW,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AACtC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,QAAA,GAAWX,MAAAA,CAA8B,oBAAoB,IAAI,CAAA;AACjE,IAAA,YAAA,CAAa,GAAA,CAAI,QAAQ,QAAQ,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,QAAA;AACT;AASO,SAAS,oBAAoB,MAAA,EAAyC;AAC3E,EAAA,OAAO,SAAA,CAAU,MAAM,CAAA,CAAE,GAAA,EAAI;AAC/B;AAUO,SAAS,uBAAuB,IAAA,EAA2D;AAChG,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,gBAAA,EAAkB,SAAA,EAAW,iBAAgB,GAAI,IAAA;AAMxE,EAAA,MAAM,IAAA,GACJ,KAAA,IAAU,EAAE,EAAA,EAAI,qBAAA,EAAuB,MAAM,OAAA,EAAS,QAAA,EAAU,MAAA,CAAO,gBAAA,EAAiB,EAAE;AAC5F,EAAA,MAAM,MAAA,GAAS,4BAAA,CAA6B,MAAA,EAAQ,IAAA,EAAM,gBAAgB,CAAA;AAC1E,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,SAAA,CAAU,MAAM,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,kBAAA,CAAmB,MAAM,CAAA;AAC/C,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,SAAA,CAAU,MAAM,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,MAAA,EAAQ,MAAA,EAAQ,gBAAgB,CAAA;AAC7E,EAAA,MAAM,oBAAoB,SAAA,GACtBW,GAAAA,CAAI,IAAA,CAAK,gBAAgB,IACzB,IAAIA,GAAAA,CAAI,MAAA,CAAO,IAAA,GAAO,OAAO,CAAA,GAAI,CAAA,EAAG,OAAO,IAAA,GAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAKlE,EAAA,MAAM,QAAA,GAAW,eAAA,EAAiB,KAAA,CAAM,QAAA,MAAc,KAAK,cAAA,EAAgB,KAAA,CAAM,QAAA,KAAa,OAAA,GAAU,KAAA,GAAQ,OAAA,CAAA,GAAW,MAAA,CAAO,MAAA,EAAQ,eAAe,CAAA,GAAI,IAAA;AAE7J,EAAA,MAAM,kBAAA,GAAqB;AAAA,IACzB,GAAA,EAAK,EAAE,SAAA,EAAW,QAAA,KAAa,KAAA,EAAO,KAAA,EAAO,IAAIA,GAAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,EAAE;AAAA,IACnF,MAAA,EAAQ,EAAE,SAAA,EAAW,QAAA,KAAa,QAAA,EAAU,KAAA,EAAO,IAAIA,GAAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,EAAE;AAAA,IACzF,IAAA,EAAM,EAAE,SAAA,EAAW,QAAA,KAAa,MAAA,EAAQ,KAAA,EAAO,IAAIA,GAAAA,CAAI,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAE;AAAA,IACrF,KAAA,EAAO,EAAE,SAAA,EAAW,QAAA,KAAa,OAAA,EAAS,KAAA,EAAO,IAAIA,GAAAA,CAAI,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA;AAAE,GACzF;AAEA,EAAA,MAAM,IAAA,GAAyB;AAAA,IAC7B,iBAAA;AAAA,IACA,SAAA,EAAW,KAAA,EAAO,KAAA,CAAM,IAAA,IAAQ,KAAA;AAAA,IAChC,iBAAA,EAAmB,IAAIA,GAAAA,CAAI,MAAA,CAAO,OAAO,CAAA,EAAG,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,IAC3D,kBAAA;AAAA,IACA,OAAA,EAAS,MAAA,CAAO,aAAA,CAAc,gBAAgB,CAAA;AAAA,IAC9C,SAAA;AAAA,IACA,gBAAA;AAAA,IACA,IAAA,EAAM,YAAY,YAAA,GAAe,MAAA;AAAA,IACjC;AAAA,GACF;AAEA,EAAA,SAAA,CAAU,MAAM,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA;AAC1B,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,sBAAsB,MAAA,EAAsB;AAC1D,EAAA,IAAI,SAAA,CAAU,MAAM,CAAA,CAAE,GAAA,EAAI,KAAM,MAAM,SAAA,CAAU,MAAM,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA;AAClE;AAGA,SAAS,MAAA,CAAO,QAAgB,OAAA,EAA+E;AAC7G,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA;AAC1C,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,QAAQ,KAAA,CAAM,gBAAA;AAC/B,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAC5B,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAG5B,EAAA,IAAI,KAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAI,MAAM,OAAO,IAAA;AACpC,EAAA,IAAI,EAAA,GAAK,EAAA,EAAI,OAAO,CAAA,GAAI,MAAM,MAAA,GAAS,OAAA;AACvC,EAAA,OAAO,CAAA,GAAI,MAAM,KAAA,GAAQ,QAAA;AAC3B;;;AChLO,IAAM,mBAAA,GAAgD,CAAC,gBAAgB;;;ACFvE,SAAS,aAAgC,MAAA,EAA2B;AACzE,EAAA,MAAM/E,KAAI,MAAA,CAAO,MAAA;AACjB,EAAA,IAAIA,EAAAA,GAAI,CAAA,EAAG,OAAO,MAAA,CAAO,KAAA,EAAM;AAC/B,EAAA,MAAM,GAAA,GAAW,CAAC,MAAA,CAAO,CAAC,CAAE,CAAA;AAC5B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,EAAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACzB,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACzB,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,GAAG,CAAA,EAAG,IAAI,IAAA,CAAK,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,KAAK,CAAA,EAAG,CAAA,EAAA,CAAI,KAAK,CAAA,GAAI,CAAA,GAAI,EAAE,CAAA,GAAI,IAAA,CAAK,CAAA,IAAK,CAAA,EAAG,CAAA;AAAA,EAC3F;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,MAAA,CAAOA,EAAAA,GAAI,CAAC,CAAE,CAAA;AACvB,EAAA,OAAO,GAAA;AACT;;;AC4CA,IAAM,aAAA,GAAgB,CAAC,MAAA,EAAQ,UAAU,CAAA;AAmBlC,SAAS,iBAAiB,KAAA,EAA2C;AAC1E,EAAA,MAAM,MAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,OAAO,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA,EAAG,UAAU,CAAA,EAAG;AACvD,IAAA,MAAM,SAAU,GAAA,EAAqC,MAAA;AACrD,IAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAG9B,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,GAAA,EAAK,KAAA,EAAO,MAAM,CAAA;AACzC,MAAA,MAAM,UACJ,GAAA,KAAQ,MAAA,GACJ,OAAA,CAAQ,cAAA,CAAe,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE,CAAe,CAAA,GAC3E,OAAA,CAAQ,aAAa,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,GAAE,CAAe,CAAA;AACvF,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,CAAS,GAAA,EAAK,MAAA,EAAQ,aAAA,EAAe,MAAM,CAAA,EAAG,MAAA,EAAQ,OAAA,EAAS,CAAA;AAChF,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAsB,SAAA,CAAU,GAAA,EAAK,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM;AAC9D,MAAA,MAAM,KAAA,GAAmB,EAAE,CAAA,EAAG,UAAA,CAAW,CAAA,EAAG,GAAA,EAAK,CAAC,CAAA,EAAG,CAAA,EAAG,UAAA,CAAW,CAAA,EAAG,GAAA,EAAK,CAAC,CAAA,EAAE;AAG9E,MAAA,MAAM,IAAK,CAAA,EAA8B,CAAA;AACzC,MAAA,IAAI,OAAO,MAAM,QAAA,IAAY,MAAA,CAAO,SAAS,CAAC,CAAA,QAAS,CAAA,GAAI,CAAA;AAC3D,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,CAAS,GAAA,EAAK,QAAQ,aAAA,EAAe,MAAM,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,GAAA;AACT;AAuBO,SAAS,oBAAA,CACd,MAAA,EACA,KAAA,EACA,KAAA,EACA,SAAA,EAC4B;AAC5B,EAAA,MAAM,IAAA,GAAO,uBAAA,CAAwB,MAAA,EAAQ,KAAA,EAAwB,OAAO,SAAS,CAAA;AACrF,EAAA,MAAM,CAAA,GAAI,QAAQ,KAAK,CAAA;AACvB,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,mBAAmB,IAAA,CAAK,WAAA,GAAc,UAAA,CAAW,CAAA,EAAG,SAAS,CAAC,CAAA;AAAA,IAC9D,QAAA,EAAU,WAAA,CAAY,CAAA,EAAG,UAAA,EAAY,KAAK,KAAK,SAAA,CAAU,CAAA,EAAG,MAAA,EAAQsD,gBAAgB,CAAA,KAAM;AAAA,GAC5F;AACF;AAGO,SAAS,qBAAqB,KAAA,EAAuC;AAC1E,EAAA,MAAM,MAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,GAAA,IAAO,gBAAA,CAAiB,KAAK,CAAA,EAAG;AACzC,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,GAAA,CAAI,MAAA,CAAO,MAAA,IAAU,CAAA,GAAI,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,GAAI,GAAA,CAAI,MAAA;AAC3F,IAAA,KAAA,MAAW,CAAA,IAAK,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,GAAA;AACT;AAEO,IAAM,aAAA,GAAN,cAA4B,SAAA,CAAiD;AAAA,EAClF,OAAgB,IAAA,GAAO,MAAA;AAAA,EACvB,OAAgB,KAAA,GAAQ,cAAA;AAAA,EACxB,OAAgB,UAAA,GAAa,mBAAA;AAAA,EAC7B,OAAgB,OAAA,GAA4B,EAAE,uBAAA,EAAyB,oBAAA,EAAqB;AAAA,EAG5F,eAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,UAAU,EAAC;AAAA,MACX,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,GAAA;AAAA,MACN,UAAA,EAAY,KAAA;AAAA,MACZ,QAAA,EAAU,KAAA;AAAA,MACV,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASS,kBAAkB,KAAA,EAAkC;AAC3D,IAAA,MAAM,CAAA,GAAI,QAAQ,KAAK,CAAA;AACvB,IAAA,MAAM,WAAW,gBAAA,CAAiB,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MACrD,MAAA,EAAQ,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,MAC5C,QAAA,EAAU,IAAI,IAAA,KAAS;AAAA,KACzB,CAAE,CAAA;AACF,IAAA,IAAI,IAAA,GAAO,QAAA;AACX,IAAA,IAAI,IAAA,GAAO,QAAA;AACX,IAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,IAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA,EAAG;AAC7C,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA;AACtB,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AAC1B,QAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AACrB,QAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AACrB,QAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AACrB,QAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AAAA,MACvB;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAA,EAAG,UAAA,EAAY,KAAK,CAAA;AACjD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,QAAA;AAAA,MACA,MAAA,EAAQ,QAAA;AAAA,MACR,GAAG,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,GAAI,OAAO,IAAA,GAAO,CAAA;AAAA,MACzC,GAAG,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,GAAI,OAAO,IAAA,GAAO,CAAA;AAAA,MACzC,QAAA;AAAA,MACA,UAAU,QAAA,IAAY,SAAA,CAAU,CAAA,EAAG,MAAA,EAAQA,gBAAgB,CAAA,KAAM;AAAA,KACnE;AAAA,EACF;AAAA,EAEA,YAAY,KAAA,EAA8B;AACxC,IAAA,MAAM,MAAA,GAAS,qBAAqB,KAAK,CAAA;AACzC,IAAA,MAAM,CAAA,GAAI,QAAQ,KAAK,CAAA;AACvB,IAAA,IAAI,YAAY,CAAA,EAAG,UAAA,EAAY,KAAK,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AAC1D,MAAA,OAAO,IAAI,SAAA,CAAU,EAAE,MAAA,EAAQ,QAAA,EAAU,SAAA,CAAU,CAAA,EAAG,MAAA,EAAQA,gBAAgB,CAAA,KAAM,MAAA,EAAQ,CAAA;AAAA,IAC9F;AACA,IAAA,OAAO,IAAI,UAAA,CAAW,EAAE,MAAA,EAAQ,MAAA,CAAO,WAAW,CAAA,GAAI,CAAC,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,QAAQ,CAAA;AAAA,EACnF;AAAA,EAES,eAAe,KAAA,EAA8B;AACpD,IAAA,MAAM,CAAA,GAAI,QAAQ,KAAK,CAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,CAAA,EAAG,OAAA,EAASD,iBAAiB,CAAA;AACrD,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAA,EAAG,MAAA,EAAQC,gBAAgB,CAAA;AAClD,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAA,EAAG,MAAA,EAAQE,gBAAgB,CAAA;AAClD,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAA,EAAG,OAAA,EAAS,CAAC,CAAA;AACtC,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAA,EAAG,UAAA,EAAY,KAAK,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAA,EAAG,MAAA,EAAQD,gBAAgB,CAAA;AAClD,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA;AACzC,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,aAAA,CAAc,KAAA,EAAO,MAAM,CAAA;AAAA,MACnC,WAAA,EAAa,YAAA,CAAa,IAAI,CAAA,GAAI,KAAA;AAAA,MAClC,IAAA,EAAM,YAAY,IAAA,KAAS,MAAA,GAAS,YAAY,KAAA,EAAO,IAAA,EAAM,MAAM,CAAA,GAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQvE,IAAA,EAAM,SAAA,CAAU,IAAA,KAAS,MAAA,GAAS,UAAU,IAAI,CAAA;AAAA,MAChD,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAAA,EAEA,UAAU,MAAA,EAA8B;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAES,iBAAiB,KAAA,EAA0B;AAClD,IAAA,MAAM,MAAA,GAAS,qBAAqB,KAAK,CAAA;AACzC,IAAA,MAAM,QAAA,GAAW,YAAY,OAAA,CAAQ,KAAK,GAAG,UAAA,EAAY,KAAK,CAAA,IAAK,MAAA,CAAO,MAAA,GAAS,CAAA;AACnF,IAAA,OAAO,YAAA,CAAa,QAAQ,QAAQ,CAAA;AAAA,EACtC;AAAA,EAES,UAAU,MAAA,EAA4B;AAC7C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAES,kBAAkB,MAAA,EAA4B;AACrD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAES,QAAA,CAAS,OAAkB,IAAA,EAAiD;AACnF,IAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,YAAA,EAAc,UAAS,GAAI,IAAA;AACnD,IAAA,MAAM,WAAW,gBAAA,CAAiB,YAAY,CAAA,CAAE,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MAC5D,GAAG,GAAA;AAAA,MACH,QAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA,EAAQ,GAAG,CAAA,CAAE,CAAA,GAAI,QAAO,CAAE;AAAA,KAC5E,CAAE,CAAA;AACF,IAAA,OAAO,EAAE,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,KAAA,EAAO,EAAE,GAAG,KAAA,CAAM,KAAA,EAAO,UAAS,EAAE;AAAA,EAC7E;AACF;AC/NO,IAAM,sBAAA,GAA8C,EAAE,CAAA,EAAG,KAAA,EAAO,GAAG,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,EAAA,EAAI,KAAA;AAUxF,IAAM,iBAAA,GAAoB;AAiD1B,SAAS,0BACd,MAAA,EACA,KAAA,EACA,OACA,SAAA,EACA,OAAA,GAAiC,EAAC,EACD;AACjC,EAAA,MAAM,IAAA,GAAOyB,uBAAAA,CAAwB,MAAA,EAAQ,KAAA,EAAwB,OAAO,SAAS,CAAA;AACrF,EAAA,MAAM,CAAA,GAAI,QAAQ,KAAK,CAAA;AACvB,EAAA,MAAM,SAAS,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA,IAAK,MAAM,MAAA,CAAO,KAAA;AACvD,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAA,EAAG,MAAA,EAAQxB,gBAAgB,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAA,EAAG,OAAA,EAAS,CAAC,CAAA;AACtC,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,cAAA,EAAgB,cAAc,MAAA,EAAQ,SAAA,CAAU,GAAG,OAAA,EAASH,iBAAiB,GAAG,eAAe,CAAA;AAAA,IAC/F,sBAAsB,sBAAA,CAAuB,IAAI,CAAA,IAAK,OAAA,CAAQ,eAAe,CAAA,CAAA,GAAK,KAAA;AAAA,IAClF,gBAAA,EAAkB,QAAQ,OAAA,IAAW;AAAA,GACvC;AACF;AAGO,SAAS,0BAA0B,KAAA,EAAuC;AAC/E,EAAA,MAAM,MAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,GAAA,IAAO,gBAAA,CAAiB,KAAK,CAAA,EAAG;AACzC,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,GAAA,CAAI,MAAA,CAAO,MAAA,IAAU,CAAA,GAAI,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,GAAI,GAAA,CAAI,MAAA;AAC3F,IAAA,KAAA,MAAW,CAAA,IAAK,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,GAAA;AACT;AAGO,IAAM,kBAAA,GAAN,cAAiC4B,SAAAA,CAA2D;AAAA,EACjG,OAAgB,IAAA,GAAO,WAAA;AAAA,EACvB,OAAgB,KAAA,GAAQ,mBAAA;AAAA,EACxB,OAAgB,UAAA,GAAa,wBAAA;AAAA;AAAA;AAAA,EAG7B,OAAgB,OAAA,GAAiC;AAAA,IAC/C,uBAAA,CAAwB,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW;AACvD,MAAA,OAAO,yBAAA,CAA0B,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,WAAW,IAAI,CAAA;AAAA,IACxE;AAAA,GACF;AAAA,EAGA,eAAA,GAAuC;AACrC,IAAA,OAAO,EAAE,QAAA,EAAU,EAAC,EAAG,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAO,CAAA,EAAE;AAAA,EAC9F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOS,kBAAkB,KAAA,EAAuC;AAChE,IAAA,MAAM,WAAW,gBAAA,CAAiB,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MACrD,MAAA,EAAQ,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,MAC5C,QAAA,EAAU,IAAI,IAAA,KAAS;AAAA,KACzB,CAAE,CAAA;AACF,IAAA,IAAI,IAAA,GAAO,QAAA;AACX,IAAA,IAAI,IAAA,GAAO,QAAA;AACX,IAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,IAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA,EAAG;AAC7C,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA;AACtB,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AAC1B,QAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AACrB,QAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AACrB,QAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AACrB,QAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AAAA,MACvB;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,QAAA;AAAA,MACA,MAAA,EAAQ,KAAA;AAAA,MACR,GAAG,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,GAAI,OAAO,IAAA,GAAO,CAAA;AAAA,MACzC,GAAG,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,GAAI,OAAO,IAAA,GAAO,CAAA;AAAA,MACzC,QAAA,EAAU,KAAA;AAAA,MACV,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA,EAEA,YAAY,KAAA,EAAmC;AAC7C,IAAA,MAAM,MAAA,GAAS,0BAA0B,KAAK,CAAA;AAC9C,IAAA,OAAO,IAAIC,UAAAA,CAAW,EAAE,MAAA,EAAQ,MAAA,CAAO,WAAW,CAAA,GAAI,CAAC,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,QAAQ,CAAA;AAAA,EACnF;AAAA,EAES,eAAe,KAAA,EAAmC;AACzD,IAAA,MAAM,CAAA,GAAI,QAAQ,KAAK,CAAA;AACvB,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA;AACzC,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAA,EAAG,MAAA,EAAQ1B,gBAAgB,CAAA;AAClD,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAA,EAAG,OAAA,EAAS,CAAC,CAAA;AACtC,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,SAAA,CAAU,aAAA,CAAc,MAAA,EAAQ,SAAA,CAAU,GAAG,OAAA,EAASH,iBAAiB,CAAA,EAAG,eAAe,CAAC,CAAA;AAAA,MAClG,aAAa,sBAAA,CAAuB,IAAI,KAAK,IAAA,CAAK,OAAA,CAAQ,eAAe,CAAA,CAAA,GAAK,KAAA;AAAA,MAC9E,IAAA,EAAM,CAAA;AAAA;AAAA;AAAA;AAAA,MAIN,IAAA,EAAM,CAAA;AAAA,MACN,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW;AAAA,KACnC;AAAA,EACF;AAAA,EAEA,UAAU,MAAA,EAAmC;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,oBAAoB,MAAA,EAAmC;AACrD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAES,iBAAiB,KAAA,EAA+B;AACvD,IAAA,OAAO,YAAA,CAAa,yBAAA,CAA0B,KAAK,CAAA,EAAG,KAAK,CAAA;AAAA,EAC7D;AAAA,EAES,UAAU,MAAA,EAAiC;AAClD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAES,kBAAkB,MAAA,EAAiC;AAC1D,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAES,QAAA,CAAS,OAAuB,IAAA,EAA2D;AAClG,IAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,YAAA,EAAc,UAAS,GAAI,IAAA;AACnD,IAAA,MAAM,WAAW,gBAAA,CAAiB,YAAY,CAAA,CAAE,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MAC5D,GAAG,GAAA;AAAA,MACH,QAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA,EAAQ,GAAG,CAAA,CAAE,CAAA,GAAI,QAAO,CAAE;AAAA,KAC5E,CAAE,CAAA;AACF,IAAA,OAAO,EAAE,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,KAAA,EAAO,EAAE,GAAG,KAAA,CAAM,KAAA,EAAO,UAAS,EAAE;AAAA,EAC7E;AACF;AC9NA,IAAM,qBAAA,GAAwB,CAAA;AAE9B,SAAS,QAAQ,KAAA,EAAuB;AACtC,EAAA,OAAO,KAAA,GAAQ,CAAA,GAAI,CAAA,GAAI,KAAA,GAAQ,IAAI,CAAA,GAAI,KAAA;AACzC;AAqBO,SAAS,UAAA,CACd,KAAA,EACA,IAAA,EACA,OAAA,GAA0B,EAAC,EACH;AACxB,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,YAAA,EAAa,GAAI,IAAA;AACzC,EAAA,MAAM,OAAoB,IAAA,CAAK,IAAA,IAAQ,EAAE,OAAA,EAAS,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,IAAK,WAAA,EAAa,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAE,EAAE;AAC9F,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,qBAAA;AACrC,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,qBAAA;AAIvC,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,EAAE,CAAA,EAAG,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,CAAA,EAAG,YAAA,CAAa,KAAA,CAAM,CAAA,EAAE,EAAG,IAAI,CAAA;AAC7F,EAAA,IAAI,UAAU,CAAA,IAAK,CAAA,IAAK,SAAA,CAAU,CAAA,IAAK,GAAG,OAAO,MAAA;AAEjD,EAAA,MAAM,SAAA,GAAY,MAAA,KAAW,MAAA,IAAU,MAAA,KAAW,cAAc,MAAA,KAAW,aAAA;AAC3E,EAAA,MAAM,UAAA,GAAa,MAAA,KAAW,OAAA,IAAW,MAAA,KAAW,eAAe,MAAA,KAAW,cAAA;AAC9E,EAAA,MAAM,QAAA,GAAW,MAAA,KAAW,KAAA,IAAS,MAAA,KAAW,cAAc,MAAA,KAAW,WAAA;AACzE,EAAA,MAAM,WAAA,GAAc,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,iBAAiB,MAAA,KAAW,cAAA;AAClF,EAAA,IAAI,CAAC,aAAa,CAAC,UAAA,IAAc,CAAC,QAAA,IAAY,CAAC,aAAa,OAAO,MAAA;AAEnE,EAAA,IAAI,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,KAAO,IAAA,CAAK,OAAA;AAC5B,EAAA,IAAI,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,KAAO,IAAA,CAAK,WAAA;AAG5B,EAAA,MAAM,QAAA,GAAW,WAAW,SAAA,CAAU,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,YAAY,SAAA,CAAU,CAAA;AAEvC,EAAA,IAAI,SAAA,EAAW,EAAA,GAAK,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,SAAA,CAAU,CAAA,EAAG,EAAA,GAAK,QAAQ,CAAC,CAAA;AAChF,EAAA,IAAI,UAAA,EAAY,EAAA,GAAK,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,SAAA,CAAU,CAAA,EAAG,EAAA,GAAK,QAAQ,CAAC,CAAA;AACjF,EAAA,IAAI,QAAA,EAAU,EAAA,GAAK,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,SAAA,CAAU,CAAA,EAAG,EAAA,GAAK,QAAQ,CAAC,CAAA;AAC/E,EAAA,IAAI,WAAA,EAAa,EAAA,GAAK,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,SAAA,CAAU,CAAA,EAAG,EAAA,GAAK,QAAQ,CAAC,CAAA;AAElF,EAAA,MAAM,CAAA,GAAA,CAAK,EAAA,GAAK,EAAA,IAAM,SAAA,CAAU,CAAA;AAChC,EAAA,MAAM,CAAA,GAAA,CAAK,EAAA,GAAK,EAAA,IAAM,SAAA,CAAU,CAAA;AAChC,EAAA,IAAI,CAAA,IAAK,CAAA,IAAK,CAAA,IAAK,CAAA,EAAG,OAAO,MAAA;AAI7B,EAAA,MAAM,KAAK,SAAA,GAAA,CAAa,EAAA,GAAK,KAAK,OAAA,CAAQ,CAAA,IAAK,UAAU,CAAA,GAAI,CAAA;AAC7D,EAAA,MAAM,KAAK,QAAA,GAAA,CAAY,EAAA,GAAK,KAAK,OAAA,CAAQ,CAAA,IAAK,UAAU,CAAA,GAAI,CAAA;AAE5D,EAAA,MAAM,IAAA,GAAoB;AAAA,IACxB,OAAA,EAAS,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAAA,IACxB,WAAA,EAAa,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAAA,IAC5B,GAAI,KAAK,QAAA,KAAa,MAAA,GAAY,EAAC,GAAI,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA;AAAS,GACnE;AAEA,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,aAAa,CAAA,GAAI,EAAA;AAAA,IACpB,CAAA,EAAG,aAAa,CAAA,GAAI,EAAA;AAAA,IACpB,KAAA,EAAO,EAAE,GAAG,KAAA,CAAM,OAAO,CAAA,EAAG,CAAA,EAAG,MAAM,IAAA;AAAK,GAC5C;AACF;AC7DO,IAAM,sBAAA,GAAyB;AAC/B,IAAM,wBAAA,GAA2B;AAQjC,SAAS,qBAAA,CAAsB,QAAgB,KAAA,EAAkC;AACtF,EAAA,MAAM,UAAU,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAA,EAAG,WAAW,EAAE,CAAA;AACxD,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAqB,OAAO,CAAA;AACjD,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,SAAS,OAAO,IAAA;AAC7C,EAAA,OAAO,KAAA,CAAM,MAAM,GAAA,IAAO,IAAA;AAC5B;AAcO,SAAS,kBAAA,CAAmB,QAAgB,KAAA,EAAkC;AACnF,EAAA,MAAM,CAAA,GAAI,QAAQ,KAAK,CAAA;AACvB,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,CAAA,EAAG,SAAA,EAAW,EAAE,CAAA;AAC3C,EAAA,IAAI,CAAC,OAAA,IAAW,CAAA,CAAE,MAAM,KAAK,WAAA,CAAY,CAAA,EAAG,OAAA,EAAS,KAAK,KAAK,WAAA,CAAY,CAAA,EAAG,OAAA,EAAS,KAAK,GAAG,OAAO,IAAA;AACtG,EAAA,IAAI,CAAC,sBAAA,EAAuB,EAAG,OAAO,IAAA;AACtC,EAAA,OAAO,sBAAsB,MAAA,EAAQ,KAAK,MAAM,IAAA,GAAO,IAAA,GAAO,SAAS,OAAO,CAAA,CAAA;AAChF;AAGO,SAAS,sBAAA,GAAkC;AAChD,EAAA,OAAO,OAAO,iBAAA,KAAsB,UAAA,IAAc,OAAO,KAAA,KAAU,UAAA;AACrE;AAGA,eAAsB,uBAAuB,GAAA,EAAsC;AACjF,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,UAAA,CAAW,OAAO,CAAA;AACrC,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,sBAAsB,UAAA,IAAc,OAAO,UAAU,UAAA,EAAY;AACrF,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAG,CAAA;AAC3B,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyC,GAAA,CAAI,MAAM,CAAA,CAAA,CAAG,CAAA;AACnF,IAAA,OAAO,MAAM,iBAAA,CAAkB,MAAM,GAAA,CAAI,MAAM,CAAA;AAAA,EACjD;AACA,EAAA,OAAO,MAAM,aAAA,CAAc,GAAA,EAAK,MAAM,CAAA;AACxC;AAEA,SAAS,aAAA,CAAc,KAAa,MAAA,EAA4C;AAC9E,EAAA,IAAI,OAAO,UAAU,UAAA,EAAY,OAAO,QAAQ,MAAA,CAAO,IAAI,KAAA,CAAM,sCAAsC,CAAC,CAAA;AACxG,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,IAAA,IAAI,CAAC,MAAA,EAAQ,GAAA,CAAI,WAAA,GAAc,WAAA;AAC/B,IAAA,GAAA,CAAI,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,GAAA,CAAI,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,wCAAwC,CAAC,CAAA;AAC9E,IAAA,GAAA,CAAI,GAAA,GAAM,GAAA;AAAA,EACZ,CAAC,CAAA;AACH;AAGO,SAAS,kBAAkB,KAAA,EAAkC;AAClE,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,aAAa,KAAK,CAAA;AACnC,EAAA,MAAM,CAAA,GAAI,QAAQ,KAAK,CAAA;AACvB,EAAA,MAAM,IAAA,GAAO,cAAc,KAAK,CAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAA,EAAG,OAAA,EAAS,KAAK,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAA,EAAG,OAAA,EAAS,KAAK,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,KAAA,IAAS,KAAA,GAAQ,CAAA,MAAA,EAAS,KAAA,GAAQ,EAAA,GAAK,CAAC,CAAA,EAAA,EAAK,KAAA,GAAQ,EAAA,GAAK,CAAC,CAAA,CAAA,CAAA,GAAM,MAAA;AACnF,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAE,QAAA,EAAU,UAAA,EAAY,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,GAAG,GAAI,SAAA,GAAY,EAAE,SAAA,EAAU,GAAI,EAAC,EAAG;AAAA,EAC3G;AACA,EAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,IAAA,EAAM,KAAK,WAAA,CAAY,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA;AAC7D,EAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,IAAA,EAAM,KAAK,WAAA,CAAY,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA;AAC7D,EAAA,MAAM,QAAQ,CAAA,GAAI,EAAA;AAClB,EAAA,MAAM,QAAQ,CAAA,GAAI,EAAA;AAClB,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,UAAA;AAAA,IACV,IAAA,EAAM,CAAC,IAAA,CAAK,OAAA,CAAQ,CAAA,GAAI,KAAA;AAAA,IACxB,GAAA,EAAK,CAAC,IAAA,CAAK,OAAA,CAAQ,CAAA,GAAI,KAAA;AAAA,IACvB,KAAA,EAAO,KAAA;AAAA,IACP,MAAA,EAAQ,KAAA;AAAA,IACR,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc;AAAC,GACnC;AACF;AAGA,SAAS,aAAa,KAAA,EAAsD;AAC1E,EAAA,MAAM,CAAA,GAAI,QAAQ,KAAK,CAAA;AACvB,EAAA,OAAO,EAAE,CAAA,EAAG,UAAA,CAAW,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAG,CAAA,EAAG,UAAA,CAAW,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAE;AAClE;AAGA,SAAS,cAAc,KAAA,EAA8C;AACnE,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,MAAM,CAAA;AAClC,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,MAAM,OAAO,IAAA;AACtD,EAAA,MAAM,OAAA,GAAU,IAAA;AAChB,EAAA,IAAI,OAAO,QAAQ,OAAA,KAAY,QAAA,IAAY,OAAO,OAAA,CAAQ,WAAA,KAAgB,UAAU,OAAO,IAAA;AAC3F,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,EAAE,CAAA,EAAG,UAAA,CAAW,QAAQ,OAAA,EAAS,GAAA,EAAK,CAAC,CAAA,EAAG,GAAG,UAAA,CAAW,OAAA,CAAQ,OAAA,EAAS,GAAA,EAAK,CAAC,CAAA,EAAE;AAAA,IAC1F,WAAA,EAAa,EAAE,CAAA,EAAG,UAAA,CAAW,QAAQ,WAAA,EAAa,GAAA,EAAK,CAAC,CAAA,EAAG,GAAG,UAAA,CAAW,OAAA,CAAQ,WAAA,EAAa,GAAA,EAAK,CAAC,CAAA,EAAE;AAAA,IACtG,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,UAAA,EAAY,KAAK;AAAA,GAC/C;AACF;AAwBO,SAAS,qBAAA,CACd,MAAA,EACA,KAAA,EACA,KAAA,EACA,SAAA,EAC6B;AAC7B,EAAA,OAAO;AAAA,IACL,GAAG2B,uBAAAA,CAAwB,MAAA,EAAQ,KAAA,EAAwB,OAAO,SAAS,CAAA;AAAA,IAC3E,eAAA,EAAiB,sBAAA;AAAA,IACjB,iBAAA,EAAmB;AAAA,GACrB;AACF;AAEO,IAAM,cAAA,GAAN,cAA6B,gBAAA,CAA6B;AAAA,EAC/D,OAAgB,IAAA,GAAO,OAAA;AAAA,EACvB,OAAgB,KAAA,GAAQ,eAAA;AAAA,EACxB,OAAgB,UAAA,GAAa,oBAAA;AAAA,EAC7B,OAAgB,OAAA,GAA6B,EAAE,uBAAA,EAAyB,qBAAA,EAAsB;AAAA;AAAA;AAAA;AAAA;AAAA,EAO9F,MAAA,CAAO,OAAmB,IAAA,EAA+D;AACvF,IAAA,OAAO,UAAA,CAAuB,OAAO,IAAA,EAAM;AAAA,MACzC,GAAI,IAAA,CAAK,OAAA,CAAQ,YAAA,KAAiB,MAAA,GAAY,EAAC,GAAI,EAAE,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAa;AAAA,MACzF,GAAI,IAAA,CAAK,OAAA,CAAQ,aAAA,KAAkB,MAAA,GAAY,EAAC,GAAI,EAAE,SAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,aAAA;AAAc,KAC7F,CAAA;AAAA,EACH;AAAA,EAEA,eAAA,GAAmC;AACjC,IAAA,OAAO,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAK,OAAA,EAAS,MAAM,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,EAAA,EAAI,MAAM,IAAA,EAAM,KAAA,EAAO,OAAO,KAAA,EAAO,KAAA,EAAO,SAAS,EAAA,EAAG;AAAA,EACtH;AAAA,EAES,YAAY,KAAA,EAA+B;AAClD,IAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,aAAa,KAAK,CAAA;AACnC,IAAA,OAAO,IAAI7E,WAAAA,CAAY,EAAE,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA,EAAG,CAAC,CAAA,EAAG,MAAA,EAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,EAAG,QAAA,EAAU,MAAM,CAAA;AAAA,EAC1F;AAAA;AAAA,EAGS,eAAe,KAAA,EAAsC;AAC5D,IAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AACjD,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AACpD,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,QAAA,CAAS,QAAQ,GAAA,EAAK,MAAM,sBAAA,CAAuB,GAAG,CAAC,CAAA;AACnF,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,MAAA,EAAQ,CAAA,EAAG,WAAA,EAAa,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,OAAA,EAAQ;AAAA,EACrF;AAAA;AAAA,EAGS,aAAa,KAAA,EAA4B;AAChD,IAAA,IAAI,KAAA,CAAM,YAAA,CAAa,KAAK,CAAA,EAAG,OAAO,IAAA;AACtC,IAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AACjD,IAAA,OAAO,QAAQ,IAAA,IAAQ,CAAC,KAAK,MAAA,CAAO,QAAA,CAAS,QAAQ,GAAG,CAAA;AAAA,EAC1D;AAAA,EAEA,UAAU,KAAA,EAA8B;AACtC,IAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,aAAa,KAAK,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,cAAc,KAAK,CAAA;AAChC,IAAA,MAAM,UAAU,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAA,EAAG,WAAW,EAAE,CAAA;AACxD,IAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AACpD,IAAA,MAAM,IAAA,GAAsB;AAAA,MAC1B,QAAA,EAAU,UAAA;AAAA,MACV,IAAA,EAAM,CAAA;AAAA,MACN,GAAA,EAAK,CAAA;AAAA,MACL,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,QAAA,EAAU,QAAA;AAAA,MACV,GAAI,IAAA,EAAM,QAAA,GAAW,EAAE,YAAA,EAAc,KAAA,KAAU;AAAC,KAClD;AACA,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,uBACEK,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO;AAAA,YACL,GAAG,IAAA;AAAA,YACH,SAAA,EAAW,YAAA;AAAA,YACX,UAAA,EAAY,sBAAA;AAAA,YACZ,MAAA,EAAQ,cAAc,wBAAwB,CAAA;AAAA,WAChD;AAAA,UACA,cAAY,OAAA,IAAW;AAAA;AAAA,OACzB;AAAA,IAEJ;AACA,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,IAAA,EACV,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,GAAA,EAAK,OAAA,EAAS,SAAA,EAAW,OAAO,KAAA,EAAO,EAAE,GAAG,iBAAA,CAAkB,KAAK,CAAA,EAAG,eAAe,MAAA,EAAQ,UAAA,EAAY,MAAA,EAAO,EAAG,CAAA,EACpI,CAAA;AAAA,EAEJ;AAAA,EAES,iBAAiB,KAAA,EAA2B;AACnD,IAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,aAAa,KAAK,CAAA;AACnC,IAAA,OAAO,QAAA,CAAS,GAAG,CAAC,CAAA;AAAA,EACtB;AAAA,EAES,oBAAoB,MAAA,EAA6B;AACxD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AC5OO,SAAS,oBAAA,CACd,MAAA,EACA,KAAA,EACA,KAAA,EACA,SAAA,EAC4B;AAC5B,EAAA,MAAM,IAAA,GAAOwE,uBAAAA,CAAwB,MAAA,EAAQ,KAAA,EAAwB,OAAO,SAAS,CAAA;AACrF,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,iBAAA,EAAmB,IAAA,CAAK,WAAA,GAAc,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAA,EAAS,CAAC,CAAA,EAAE;AACjG;AAuBA,IAAM,OAAA,GAAU,CAAC,MAAA,EAAQ,OAAO,CAAA;AAGzB,SAAS,cAAc,KAAA,EAAyC;AACrE,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAK,CAAA,CAAE,QAAQ,CAAA;AACtC,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,IAAA,SAAa,EAAC;AAC3D,EAAA,MAAM,SAA8C,EAAC;AACrD,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAiC,CAAA,EAAG;AAC3E,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AACjD,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,EAAA,EAAI,UAAA,CAAW,KAAA,EAAO,IAAA,EAAM,EAAE,CAAA;AAAA,MAC9B,KAAA,EAAO,UAAA,CAAW,KAAA,EAAO,OAAA,EAAS,IAAI,CAAA;AAAA,MACtC,CAAA,EAAG,UAAA,CAAW,KAAA,EAAO,GAAA,EAAK,CAAC,CAAA;AAAA,MAC3B,CAAA,EAAG,UAAA,CAAW,KAAA,EAAO,GAAA,EAAK,CAAC;AAAA,KAC5B,CAAA;AAAA,EACH;AACA,EAAA,OAAO,YAAY,MAAM,CAAA;AAC3B;AAEA,SAAS,QAAA,CAAS,GAAW,CAAA,EAAmB;AAC9C,EAAA,IAAI;AACF,IAAA,OAAO,eAAA,CAAgB,GAAe,CAAa,CAAA;AAAA,EACrD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,EACb;AACF;AAEO,IAAM,aAAA,GAAN,cAA4BC,SAAAA,CAAiD;AAAA,EAClF,OAAgB,IAAA,GAAO,MAAA;AAAA,EACvB,OAAgB,KAAA,GAAQ,cAAA;AAAA,EACxB,OAAgB,UAAA,GAAa,mBAAA;AAAA,EAC7B,OAAgB,OAAA,GAA4B,EAAE,uBAAA,EAAyB,oBAAA,EAAqB;AAAA,EAG5F,eAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,GAAA;AAAA,MACN,MAAA,EAAQ,MAAA;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,EAAA,EAAI,EAAE,EAAA,EAAI,IAAA,EAAM,OAAO,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AAAA,QACxC,EAAA,EAAI,EAAE,EAAA,EAAI,IAAA,EAAM,OAAO,IAAA,EAAM,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA;AAAI,OAC9C;AAAA,MACA,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQS,kBAAkB,KAAA,EAAkC;AAC3D,IAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,IAAI,IAAA,GAAO,QAAA;AACX,IAAA,IAAI,IAAA,GAAO,QAAA;AACX,IAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,IAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,IAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AACpB,MAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,MAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,MAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,MAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AAAA,IAC3B;AACA,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,EAAG,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA,KAAM,OAAA,IAAW,GAAA,CAAI,MAAA,GAAS,CAAA;AAC9F,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAQ,QAAA,GAAW,MAAA;AAAA,MACzB,MAAA;AAAA,MACA,MAAA,EAAQ,KAAA;AAAA,MACR,GAAG,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,GAAI,OAAO,IAAA,GAAO,CAAA;AAAA,MACzC,GAAG,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,GAAI,OAAO,IAAA,GAAO,CAAA;AAAA,MACzC,QAAA,EAAU,KAAA;AAAA,MACV,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA,EAEA,YAAY,KAAA,EAA8B;AACxC,IAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,IAAA,IAAI,OAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAIC,WAAW,EAAE,MAAA,EAAQ,CAAC,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAC3E,IAAA,IAAI,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,EAAG,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA,KAAM,OAAA,IAAW,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACxF,MAAA,OAAO,IAAI,aAAA,CAAc,EAAE,QAAA,EAAU,kBAAA,CAAmB,MAAM,CAAA,EAAG,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,CAAA;AAAA,IACrG;AACA,IAAA,OAAO,IAAIA,UAAAA,CAAW,EAAE,MAAA,EAAQ,CAAA;AAAA,EAClC;AAAA,EAES,eAAe,KAAA,EAA8B;AACpD,IAAA,MAAM,CAAA,GAAI,QAAQ,KAAK,CAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,CAAA,EAAG,OAAA,EAAS7B,iBAAiB,CAAA;AACrD,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAA,EAAG,MAAA,EAAQG,gBAAgB,CAAA;AAClD,IAAA,OAAO;AAAA,MACL,QAAQ,aAAA,CAAc,KAAA,EAAO,cAAA,CAAe,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,MACxD,aAAa2B,YAAAA,CAAa,IAAI,IAAI,UAAA,CAAW,CAAA,EAAG,SAAS,CAAC,CAAA;AAAA,MAC1D,IAAA,EAAM,CAAA;AAAA,MACN,MAAM,SAAA,CAAU,SAAA,CAAU,CAAA,EAAG,MAAA,EAAQ5B,gBAAgB,CAAC,CAAA;AAAA,MACtD,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAAA,EAEA,UAAU,MAAA,EAA8B;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAES,iBAAiB,KAAA,EAA0B;AAClD,IAAA,OAAO,OAAA,CAAQ,gBAAgB,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcS,sBAAsB,MAAA,EAA4B;AACzD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAES,sBAAsB,MAAA,EAA4B;AACzD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAES,kBAAkB,MAAA,EAA4B;AACrD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAES,iBAAiB,MAAA,EAA4B;AACpD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAES,WAAW,KAAA,EAAiC;AACnD,IAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,IAAA,MAAM,UAAyB,EAAC;AAChC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,MAAA,OAAA,CAAQ,KAAK,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,MAAM,QAAA,EAAU,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,GAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA;AACzE,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACzB,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,IAAI,CAAA,IAAA,EAAO,CAAA,CAAE,EAAE,CAAA,CAAA,EAAI,KAAK,EAAE,CAAA,CAAA;AAAA,UAC1B,IAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAO,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,KAAK,KAAK,CAAA;AAAA,UACnC,CAAA,EAAA,CAAI,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,CAAA,IAAK,CAAA;AAAA,UACpB,CAAA,EAAA,CAAI,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,CAAA,IAAK;AAAA,SACrB,CAAA;AAAA,MACH;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAES,YAAA,CAAa,OAAkB,IAAA,EAAmD;AACzF,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AACnB,IAAA,MAAM,SAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,KAAK,aAAA,CAAc,KAAK,GAAG,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,GAAI,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AACjC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA,GAAI,EAAE,GAAG,QAAA,EAAU,CAAA,EAAG,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,CAAA,EAAE;AAAA,IAC9D,CAAA,MAAO;AAEL,MAAA,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA,GAAI,EAAE,IAAI,MAAA,CAAO,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA,EAAG,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,IACrF;AACA,IAAA,OAAO,EAAE,KAAA,EAAO,EAAE,GAAG,KAAA,CAAM,KAAA,EAAO,QAAO,EAAE;AAAA,EAC7C;AACF;AC/OA,IAAM,oBAAA,GAAuB,CAAC,CAAA,EAAG,CAAC,CAAA;AAc3B,IAAM,cAAA,GAAN,cAA6B0B,SAAAA,CAAsB;AAAA,EACxD,OAAgB,IAAA,GAAO,OAAA;AAAA,EACvB,OAAgB,KAAA,GAAQ,eAAA;AAAA,EACxB,OAAgB,UAAA,GAAa,oBAAA;AAAA,EAE7B,eAAA,GAAuC;AACrC,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEA,YAAY,KAAA,EAA+B;AACzC,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,0BAAA,CAA2B,KAAA,CAAM,EAAE,CAAA;AAC3D,IAAA,IAAI,IAAA,GAAO,QAAA;AACX,IAAA,IAAI,IAAA,GAAO,QAAA;AACX,IAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,IAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAChC,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,sBAAA,CAAuB,KAAK,CAAA;AAC7C,MAAA,IAAI,CAAC,CAAA,EAAG;AAER,MAAA,KAAA,MAAW,CAAA,IAAK,EAAE,OAAA,EAAS;AACzB,QAAA,MAAM,IAAI,KAAA,CAAM,QAAA;AAChB,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AACxD,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AACxD,QAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AACrB,QAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AACrB,QAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AACrB,QAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AAAA,MACvB;AAAA,IACF;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,GAAG,OAAO,IAAI9E,WAAAA,CAAY,EAAE,OAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,OAAO,CAAA;AAC3F,IAAA,OAAO,IAAIA,YAAY,EAAE,CAAA,EAAG,MAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,IAAI,CAAA,EAAG,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,IAAI,CAAA,EAAG,QAAA,EAAU,KAAA,EAAO,CAAA;AAAA,EACjI;AAAA,EAES,eAAe,MAAA,EAAgC;AAEtD,IAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,aAAa,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,CAAA,EAAE;AAAA,EACnE;AAAA,EAES,SAAA,GAAqB;AAC5B,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EACS,iBAAA,GAA6B;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EACS,qBAAA,GAAiC;AACxC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EACS,2BAAA,GAAuC;AAC9C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGS,iBAAiB,KAAA,EAAoC;AAC5D,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA,CAAE,MAAM,CAAA,EAAG,QAAA,EAAU,oBAAA,EAAqB;AAAA,EACzF;AACF;ACtDO,IAAM,iBAAA,GAA+C,CAAC,KAAA,EAAO,OAAA,EAAS,UAAU,MAAM;AAGtF,SAAS,sBAAsB,IAAA,EAAiC;AACrE,EAAA,OAAO,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,OAAA,GAAU,GAAA,GAAM,GAAA;AACrD;AA6FO,IAAM,2BAAA,GAAiD;AAAA,EAC5D,cAAA,EAAgB,EAAA;AAAA,EAChB,iBAAA,EAAmB,EAAA;AAAA,EACnB,0BAAA,EAA4B,IAAA;AAAA,EAC5B,YAAA,EAAc;AAChB;AA+EA,SAAS,KAAA,CAAM,GAAW,CAAA,EAA4B;AACpD,EAAA,OAAO,CAAA,IAAK,CAAA,GAAI,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE,GAAI,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AACxD;AAGO,SAAS,mBAAA,CAAoB,MAAuB,KAAA,EAAwB;AACjF,EAAA,OAAO,KAAA,IAAS,IAAA,CAAK,GAAA,IAAO,KAAA,IAAS,IAAA,CAAK,GAAA;AAC5C;AAUO,SAAS,sBACd,GAAA,EACA,MAAA,GAAkB,GAAA,CAAI,MAAA,EACtB,UAA6B,2BAAA,EACT;AACpB,EAAA,MAAM,QAAQ,OAAA,CAAQ,0BAAA;AACtB,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAA0B;AACxC,IAAA,MAAM,MAAA,GAAS,IAAI,KAAA,GAAQ,KAAA;AAC3B,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,IAAA,GAAO,MAAM,CAAA,EAAG,GAAA,CAAI,IAAA,GAAO,MAAM,CAAA;AAAA,EACvE,CAAA;AACA,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAA0B;AACxC,IAAA,MAAM,MAAA,GAAS,IAAI,MAAA,GAAS,KAAA;AAC5B,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,IAAA,GAAO,MAAM,CAAA,EAAG,GAAA,CAAI,IAAA,GAAO,MAAM,CAAA;AAAA,EACvE,CAAA;AACA,EAAA,MAAM,SAAS,OAAA,CAAQ,cAAA;AACvB,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,EAAE,KAAA,EAAO,GAAA,CAAI,MAAM,KAAA,EAAO,KAAA,CAAM,IAAI,IAAA,EAAM,GAAA,CAAI,IAAI,CAAA,EAAG,WAAA,EAAa,OAAO,MAAA,CAAO,CAAC,GAAG,QAAA,EAAU,GAAA,CAAI,OAAO,MAAA,EAAO;AAAA,IACrH,MAAA,EAAQ,EAAE,KAAA,EAAO,GAAA,CAAI,MAAM,KAAA,EAAO,KAAA,CAAM,IAAI,IAAA,EAAM,GAAA,CAAI,IAAI,CAAA,EAAG,WAAA,EAAa,OAAO,MAAA,CAAO,CAAC,GAAG,QAAA,EAAU,GAAA,CAAI,OAAO,MAAA,EAAO;AAAA,IACxH,IAAA,EAAM,EAAE,KAAA,EAAO,GAAA,CAAI,MAAM,KAAA,EAAO,KAAA,CAAM,IAAI,IAAA,EAAM,GAAA,CAAI,IAAI,CAAA,EAAG,WAAA,EAAa,OAAO,MAAA,CAAO,CAAC,GAAG,QAAA,EAAU,GAAA,CAAI,OAAO,MAAA,EAAO;AAAA,IACtH,KAAA,EAAO,EAAE,KAAA,EAAO,GAAA,CAAI,MAAM,KAAA,EAAO,KAAA,CAAM,IAAI,IAAA,EAAM,GAAA,CAAI,IAAI,CAAA,EAAG,WAAA,EAAa,OAAO,MAAA,CAAO,CAAC,GAAG,QAAA,EAAU,GAAA,CAAI,OAAO,MAAA;AAAO,GACzH;AACF;AAGA,SAAS,SAAA,CAAU,KAAU,QAAA,EAAuB;AAClD,EAAA,OAAO,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,IAAA,GAAO,QAAA,EAAU,GAAA,CAAI,IAAA,GAAO,QAAA,EAAU,GAAA,CAAI,IAAA,GAAO,QAAA,EAAU,GAAA,CAAI,OAAO,QAAQ,CAAA;AAC1G;AASO,SAAS,uBACd,UAAA,EACA,OAAA,GAA6B,2BAAA,EAC7B,KAAA,GAAiD,EAAC,EAC7B;AACrB,EAAA,MAAM,OAAA,GAAU,EAAE,UAAA,YAAsB,GAAA,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,OAAA,GACb,GAAA,CAAI,UAAA,CAAW,UAAA,CAAW,CAAA,EAAG,UAAA,CAAW,CAAA,EAAG,UAAA,CAAW,CAAA,EAAG,UAAA,CAAW,CAAC,CAAA,GACpE,UAAA;AACL,EAAA,MAAM,SAAS4E,GAAAA,CAAI,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,SAAS,MAAM,CAAA;AACvD,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,QAAA,EAAU,SAAA,CAAU,QAAA,EAAU,OAAA,CAAQ,cAAc,CAAA;AAAA,IACpD,KAAA,EAAO,OAAA,GAAU,EAAE,GAAA,EAAK,MAAM,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAM,IAAA,EAAK,GAAI,qBAAA,CAAsB,QAAA,EAAU,QAAQ,OAAO,CAAA;AAAA,IACvH,MAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA,EAAS,MAAM,OAAA,IAAW;AAAA,GAC5B;AACF;AAGO,SAAS,kBAAA,CAAmB,GAAwB,CAAA,EAAyC;AAClG,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAQ,CAAA,KAAgB,IAAI,UAAA,CAAW,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAE,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAC5J,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,QAAQ,EAAE,QAAA,EAAU,MAAM,CAAA,CAAE,QAAA,EAAU,EAAE,QAAQ,CAAA,EAAG,UAAU,KAAA,CAAM,CAAA,CAAE,UAAU,CAAA,CAAE,QAAQ,GAAE,EAAE;AAC9G;AAGO,SAAS,wBAAA,CAAyB,KAAU,EAAA,EAAoC;AACrF,EAAA,MAAM,KAAK,EAAA,CAAG,CAAA,GAAI,GAAA,CAAI,IAAA,GAAO,GAAG,CAAA,GAAI,GAAA,CAAI,IAAA,GAAO,EAAA,CAAG,IAAI,GAAA,CAAI,IAAA,GAAO,EAAA,CAAG,CAAA,GAAI,IAAI,IAAA,GAAO,CAAA;AACnF,EAAA,MAAM,KAAK,EAAA,CAAG,CAAA,GAAI,GAAA,CAAI,IAAA,GAAO,GAAG,CAAA,GAAI,GAAA,CAAI,IAAA,GAAO,EAAA,CAAG,IAAI,GAAA,CAAI,IAAA,GAAO,EAAA,CAAG,CAAA,GAAI,IAAI,IAAA,GAAO,CAAA;AACnF,EAAA,IAAI,EAAA,KAAO,CAAA,IAAK,EAAA,KAAO,CAAA,EAAG,OAAO,IAAA;AACjC,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG,OAAO,EAAA,GAAK,CAAA,GAAI,MAAA,GAAS,OAAA;AAC3D,EAAA,OAAO,EAAA,GAAK,IAAI,KAAA,GAAQ,QAAA;AAC1B;AAGA,SAAS,cAAc,OAAA,EAAiC;AACtD,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK,KAAA,IAASA,GAAAA,CAAI,IAAA,CAAK,QAAQ,CAAA,GAAI,CAAC,CAAA,EAAI,OAAA,CAAQ,CAAC,CAAE,CAAA;AACvF,EAAA,OAAO,KAAA;AACT;AAUO,SAAS,iBAAA,CACd,KAAA,EACA,IAAA,GAAkG,EAAC,EAClF;AACjB,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA;AAC7B,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AACzB,IAAA,IAAA,CAAK,KAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,MAAM,GAAG,CAAA;AAAA,EAClE;AACA,EAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,MAAA,IAAU,IAAI,UAAA,GAAa,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,IAClD,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,QAAA,EAAU,aAAA,CAAc,KAAA,CAAM,OAAO,CAAA;AAAA,IACrC,KAAA,EAAO,KAAK,KAAA,IAAS,IAAA;AAAA,IACrB,KAAA,EAAO,KAAK,KAAA,IAAS,IAAA;AAAA,IACrB,cAAA,EACE,MAAA,IAAU,KAAA,CAAM,SAAA,GACZ;AAAA,MACE,MAAM,KAAA,CAAM,SAAA;AAAA,MACZ,KAAA,EAAOA,IAAI,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MACnC,OAAO,IAAA,CAAK,KAAA,IAAS,MAAM,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,CAAG,KAAA,CAAM,SAAS,CAAA,EAAG,MAAM,OAAA,CAAQ,EAAA,CAAG,EAAE,CAAA,CAAG,KAAA,CAAM,SAAS,CAAC;AAAA,KACvG,GACA;AAAA,GACR;AACF;AAUO,SAAS,kBACd,CAAA,EACA,CAAA,EACA,UAA6B,2BAAA,EAC7B,YAAA,GAAoD,EAAC,EACrC;AAChB,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,CAAA,EAAG,CAAC,CAAA;AACrC,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,EAAE,QAAA,CAAS,IAAA,GAAO,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA;AACvG,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,EAAE,QAAA,CAAS,IAAA,GAAO,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA;AAIvG,EAAA,MAAM,IAAA,GAAO,OAAO,CAAA,GAAA,CAAK,IAAA,CAAK,IAAI,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,IAAK,CAAA,GAAI,IAAA;AACxH,EAAA,MAAM,IAAA,GAAO,OAAO,CAAA,GAAA,CAAK,IAAA,CAAK,IAAI,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,IAAK,CAAA,GAAI,IAAA;AAExH,EAAA,MAAM,KAAA,GAAQ,EAAE,OAAA,GAAU,IAAA,GAAO,yBAAyB,CAAA,CAAE,QAAA,EAAU,EAAE,MAAM,CAAA;AAC9E,EAAA,MAAM,KAAA,GAAQ,EAAE,OAAA,GAAU,IAAA,GAAO,yBAAyB,CAAA,CAAE,QAAA,EAAU,EAAE,MAAM,CAAA;AAC9E,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,CAAA,CAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ;AAAA,IAC/C,GAAI,aAAa,QAAA,KAAa,MAAA,GAAY,EAAC,GAAI,EAAE,QAAA,EAAU,YAAA,CAAa,QAAA,EAAS;AAAA,IACjF,GAAI,QAAQ,EAAE,SAAA,EAAW,sBAAsB,KAAK,CAAA,KAAM,EAAC;AAAA,IAC3D,GAAI,QAAQ,EAAE,OAAA,EAAS,sBAAsB,KAAK,CAAA,KAAM,EAAC;AAAA,IACzD,cAAc,OAAA,CAAQ;AAAA,GACvB,CAAA;AACD,EAAA,MAAM,aAAaA,GAAAA,CAAI,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAM,CAAA,GAAI,IAAA;AAClD,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA,IACA,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA,EAAO,aAAa,IAAA,GAAO,iBAAA,CAAkB,QAAQ,EAAE,KAAA,EAAO,OAAO;AAAA,GACvE;AACF;;;ACrVO,IAAM,iBAAA,GAA4C;AAAA,EACvD,cAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF;ACTO,SAAS,WAAA,CAAY;AAAA,EAC1B,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI1E,SAAwB,IAAI,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAkB,IAAI,CAAA;AAEhD,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,IAAI,MAAA,GAAwB,IAAA;AAC5B,IAAA,MAAM,YAAY,OAAO,QAAA,KAAa,cAAe,IAAA,GAAkC,QAAA,CAAS,cAAc,KAAK,CAAA;AACnH,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,WAAA,CAAY;AAAA,QACxB,YAAY,CAAC,GAAG,mBAAmB,GAAI,UAAA,IAAc,EAAG,CAAA;AAAA,QACxD,cAAc,CAAC,GAAG,qBAAqB,GAAI,YAAA,IAAgB,EAAG;AAAA,OAC/D,CAAA;AACD,MAAA,MAAA,GAAS,IAAI8E,QAAA,CAAO;AAAA,QAClB,KAAA;AAAA,QACA,YAAY,CAAC,GAAG,mBAAmB,GAAI,UAAA,IAAc,EAAG,CAAA;AAAA,QACxD,cAAc,CAAC,GAAG,qBAAqB,GAAI,YAAA,IAAgB,EAAG,CAAA;AAAA;AAAA;AAAA;AAAA,QAI9D,OAAO,EAAC;AAAA,QACR,cAAc,MAAM,SAAA;AAAA,QACpB,GAAI,IAAA,GAAO,EAAE,IAAA,KAAS;AAAC,OACxB,CAAA;AACD,MAAA,MAAA,CAAO,aAAa,QAAQ,CAAA;AAC5B,MAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,cAAA,CAAe,MAAe,CAAA;AACjD,MAAA,MAAM,GAAA,GAAM,WAAY,QAAA,GAAuB,KAAA,CAAA;AAC/C,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,CAAa,GAAA,EAAK;AAAA,QACtC,GAAI,OAAA,KAAY,KAAA,CAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAQ;AAAA,QAC3C,GAAI,UAAA,KAAe,KAAA,CAAA,GAAY,EAAC,GAAI,EAAE,UAAA,EAAW;AAAA,QACjD,GAAI,QAAA,KAAa,KAAA,CAAA,GAAY,EAAC,GAAI,EAAE,QAAA;AAAS,OAC9C,CAAA;AACD,MAAA,IAAI,CAAC,QAAA,EAAU,MAAA,CAAO,MAAA,EAAQ,OAAO,IAAI,CAAA;AAAA,IAC3C,SAAS,MAAA,EAAQ;AACf,MAAA,IAAI,CAAC,QAAA,EAAU,QAAA,CAAS,MAAM,CAAA;AAAA,IAChC,CAAA,SAAE;AACA,MAAA,MAAA,EAAQ,OAAA,EAAQ;AAAA,IAClB;AACA,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,GAAW,IAAA;AAAA,IACb,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,UAAA,EAAY,QAAA,EAAU,UAAA,EAAY,YAAA,EAAc,IAAI,CAAC,CAAA;AAE9F,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBACE5E,IAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAC,gBAAA,EAAkB,uBAAA,EAAyB,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,EAAG,KAAA,EAAc,MAAK,KAAA,EAAM,YAAA,EAAY,OAAO,0BAAA,EAA4B,CAAA;AAAA,EAE9K;AACA,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAC,gBAAA,EAAkB,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MACjE,KAAA;AAAA,MACC,GAAI,GAAA,GAAM,EAAE,IAAA,EAAM,KAAA,EAAO,cAAc,GAAA,EAAI,GAAI,EAAE,aAAA,EAAe,IAAA,EAAK;AAAA,MAItE,uBAAA,EAAyB,EAAE,MAAA,EAAQ,GAAA,IAAO,EAAA;AAAG;AAAA,GAC/C;AAEJ;AC9FA,IAAM,oBAAA,GAAuB,eAAA;AAgB7B,eAAsB,uBAAuB,MAAA,EAAgB,KAAA,EAAwB,GAAA,GAA0B,MAAA,CAAO,qBAAoB,EAAqB;AAC7J,EAAA,MAAM,UAAA,GAAa,yBAAA,CAA0B,MAAA,EAAQ,GAAG,CAAA;AACxD,EAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AAExB,EAAA,MAAM,SAAA,GAAY,GAAA,CACf,GAAA,CAAI,CAAC,EAAA,KAAO;AACX,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAChC,IAAA,OAAO,KAAA,GAAS,OAAO,YAAA,CAAa,KAAK,EAAE,OAAA,GAAU,KAAK,KAAK,EAAA,GAAM,EAAA;AAAA,EACvE,CAAC,CAAA,CACA,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,IAAI,CAAA;AAEZ,EAAA,IAAI,OAAO,aAAA,EAAe;AAGxB,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,KAAA,CAAM,aAAA,CAAc,QAAQ,WAAA,EAAa,CAAA,KAAA,EAAQ,oBAAoB,CAAA,CAAA,EAAI,oBAAA,CAAqB,UAAU,CAAC,CAAA,MAAA,CAAQ,CAAA;AACjH,IAAA,KAAA,CAAM,aAAA,CAAc,OAAA,CAAQ,YAAA,EAAc,SAAA,IAAa,UAAU,CAAA;AACjE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAM,wBAAA,CAAyB,MAAA,EAAQ,GAAG,CAAA;AACnD;AAEA,SAAS,qBAAqB,KAAA,EAAuB;AACnD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AAChF;AAkBO,SAAS,sBAAA,GAA8C;AAC5D,EAAA,MAAM,SAASE,SAAAA,EAAU;AAEzB,EAAA,MAAM,IAAA,GAAOe,YAAY,YAAY;AACnC,IAAA,MAAM,uBAAuB,MAAM,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,GAAA,GAAMA,YAAY,YAAY;AAClC,IAAA,MAAM,wBAAwB,MAAM,CAAA;AAAA,EACtC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,KAAA,GAAQA,WAAAA;AAAA,IACZ,OAAO,OAAwC,KAAA,KAAqC;AAClF,MAAA,MAAM,kBAAA,CAAmB,MAAA,EAAQ,KAAA,GAAQ,IAAIsD,GAAAA,CAAI,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,CAAO,qBAAA,EAAuB,CAAA;AAAA,IACrG,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,GAAA,EAAK,KAAA,EAAM;AAC5B;AAWO,SAAS,wBAAA,GAAgD;AAC9D,EAAA,MAAM,SAASrE,SAAAA,EAAU;AACzB,EAAA,MAAM,OAAO,sBAAA,EAAuB;AAEpC,EAAAJ,UAAU,MAAM;AACd,IAAA,MAAM,SAAA,GAAY,OAAO,oBAAA,IAAuB;AAChD,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,aAAA,GAAgB,CAAC,MAAA,KAAwC;AAC7D,MAAA,MAAM,OAAA,GAAU,MAAA;AAChB,MAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,CAAQ,OAAA,KAAY,YAAY,OAAO,KAAA;AAC9D,MAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,+DAA+D,CAAA,KAAM,IAAA;AAAA,IAC9F,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAAiB;AAC/B,MAAA,IAAI,aAAA,CAAc,KAAA,CAAM,MAAM,CAAA,EAAG;AACjC,MAAA,KAAK,sBAAA,CAAuB,QAAQ,KAAuB,CAAA;AAAA,IAC7D,CAAA;AAEA,IAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAAiB;AAC9B,MAAA,IAAI,aAAA,CAAc,KAAA,CAAM,MAAM,CAAA,EAAG;AACjC,MAAA,MAAM,GAAA,GAAM,OAAO,mBAAA,EAAoB;AACvC,MAAA,KAAK,uBAAuB,MAAA,EAAQ,KAAuB,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AAC5E,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,MAAA,CAAO,yBAAyB,KAAK,CAAA;AACrC,QAAA,MAAA,CAAO,YAAA,CAAa,CAAC,GAAG,GAAG,CAAC,CAAA;AAAA,MAC9B,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAiB;AAChC,MAAA,IAAI,aAAA,CAAc,KAAA,CAAM,MAAM,CAAA,EAAG;AACjC,MAAA,KAAK,KAAK,KAAA,EAAM;AAAA,IAClB,CAAA;AAEA,IAAA,SAAA,CAAU,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AACzC,IAAA,SAAA,CAAU,gBAAA,CAAiB,OAAO,KAAK,CAAA;AACvC,IAAA,SAAA,CAAU,gBAAA,CAAiB,SAAS,OAAO,CAAA;AAC3C,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,CAAU,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AAC5C,MAAA,SAAA,CAAU,mBAAA,CAAoB,OAAO,KAAK,CAAA;AAC1C,MAAA,SAAA,CAAU,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAAA,IAChD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAI,CAAC,CAAA;AAEjB,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,SAAA,GAAmG;AACjH,EAAA,MAAM,SAASI,SAAAA,EAAU;AACzB,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,MAAM,cAAA,EAAe;AAE3B,EAAA,OAAOe,WAAAA;AAAA,IACL,OAAO,GAAA,EAAyB,MAAA,GAAqB,KAAA,EAAO,IAAA,GAAsB,EAAC,KAAM;AACvF,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,MAAA,EAAQ,MAAA,KAAW,SAAS,MAAA,GAAU,MAAA,EAAyB,KAAK,IAAI,CAAA;AAAA,MACvF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,QAAA,CAAS,EAAE,KAAA,EAAO,GAAA,CAAI,6BAA6B,CAAA,EAAG,WAAA,EAAa,MAAA,CAAO,KAAK,CAAA,EAAG,QAAA,EAAU,OAAA,EAAS,CAAA;AAAA,MAC9G;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,MAAA,EAAQ,GAAG;AAAA,GACtB;AACF;AAQO,SAAS,WAAA,GAA8G;AAC5H,EAAA,MAAM,SAASf,SAAAA,EAAU;AACzB,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,MAAM,cAAA,EAAe;AAE3B,EAAA,OAAOe,WAAAA;AAAA,IACL,OAAO,GAAA,EAAyB,IAAA,GAAoD,EAAC,KAAM;AACzF,MAAA,MAAM,EAAE,MAAA,GAAS,KAAA,EAAO,GAAG,MAAK,GAAI,IAAA;AACpC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,CAAS,MAAA,EAAQ,MAAA,EAAQ,GAAA,EAAK,IAAI,CAAA;AAAA,MAC1C,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,QAAA,CAAS,EAAE,KAAA,EAAO,GAAA,CAAI,+BAA+B,CAAA,EAAG,WAAA,EAAa,MAAA,CAAO,KAAK,CAAA,EAAG,QAAA,EAAU,OAAA,EAAS,CAAA;AAAA,MAChH;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,MAAA,EAAQ,GAAG;AAAA,GACtB;AACF;;;AChLO,IAAM,SAAA,GAAqC;ACpBlD,IAAM,oBAAA,GAAuB,GAAA;AAE7B,IAAM,gBAAA,GAAmB,CAAA;AAEzB,IAAM,IAAA,GAAN,cAAmB,SAAA,CAAU;AAAA,EAC3B,OAAgB,EAAA,GAAK,MAAA;AAAA,EAEZ,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,MAAA,EAAQ,EAAE,MAAM,OAAA,EAAS,QAAA,EAAU,CAAA,EAAE,EAAG,CAAA;AAAA,EAC5E;AAAA,EAES,cAAc,IAAA,EAA8B;AACnD,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,OAAQ,MAAA,CAAQ,UAAA,CAAW,YAAY,IAAI,CAAA;AAAA,EACjE;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,eAAe,QAAQ,CAAA;AAAA,EACrC;AACF,CAAA;AAEA,IAAM,QAAA,GAAN,cAAuB,SAAA,CAAU;AAAA,EAC/B,OAAgB,EAAA,GAAK,UAAA;AAAA,EACb,OAAA,GAA0B,IAAA;AAAA,EAC1B,MAAA,GAAS,EAAA;AAAA;AAAA,EAET,OAAA,GAAU,KAAA;AAAA,EAET,OAAA,GAAgB;AACvB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,wBAAA,CAAyB,cAAc,CAAA;AAC5D,IAAA,MAAM,KAAK,aAAA,EAAc;AACzB,IAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,MAAA,CAAO,MAAA;AACnC,IAAA,MAAA,CAAO,WAAA,CAAwB;AAAA,MAC7B,EAAA;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,GAAG,eAAA,CAAgB,CAAA;AAAA,MACnB,GAAG,eAAA,CAAgB,CAAA;AAAA,MACnB,KAAA,EAAO,EAAE,KAAA,EAAO,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE,EAAG,KAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAE;AAAE,KACrD,CAAA;AACD,IAAA,MAAA,CAAO,OAAO,EAAE,CAAA;AAChB,IAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AAAA,EACjB;AAAA,EAES,aAAA,GAAsB;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY;AACpC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,SAAA,EAAU;AAAA,EACjB;AAAA,EAES,WAAA,GAAoB;AAE3B,IAAA,IAAI,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,SAAA,EAAU;AAAA,cACvB,aAAA,EAAc;AACxB,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,UAAA,GAAmB;AAC1B,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAI,KAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,KAAK,MAAM,CAAA;AACnD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,SAAA,GAAkB;AACxB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAqB,IAAA,CAAK,OAAQ,CAAA;AACvD,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,QAAQ,MAAA,CAAO,oBAAA,CAAqB,KAAA,EAAO,MAAA,CAAO,OAAO,gBAAgB,CAAA;AAC/E,IAAA,MAAM,MAAA,GAAsB,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,CAAA,EAAG,MAAM,CAAA,EAAE;AAC7F,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,CAAyB,KAAK,EAAE,YAAA,GAAe,KAAA,EAAO,EAAE,MAAA,EAAQ,WAAW,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AACvI,IAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,WAAA,CAAwB,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,GAAG,MAAA,EAAQ,CAAA;AAAA,SAChF,MAAA,CAAO,YAAwB,EAAE,EAAA,EAAI,MAAM,EAAA,EAAI,IAAA,EAAM,SAAS,KAAA,EAAO,EAAE,KAAK,EAAE,CAAA,EAAG,MAAM,CAAA,EAAG,CAAA,EAAG,MAAM,CAAA,EAAE,IAAK,CAAA;AAAA,EACjH;AAAA;AAAA,EAGQ,aAAA,GAAsB;AAC5B,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAqB,IAAA,CAAK,OAAQ,CAAA;AACvD,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAA,CAAO,YAAwB,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,MAAM,OAAA,EAAS,KAAA,EAAO,EAAE,GAAA,EAAK,EAAE,CAAA,EAAG,oBAAA,EAAsB,GAAG,CAAA,EAAE,IAAK,CAAA;AAAA,EACnH;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,QAAQ,IAAA,CAAK,OAAA,GAAU,OAAO,QAAA,CAAqB,IAAA,CAAK,OAAO,CAAA,GAAI,MAAA;AACzE,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,KAAA,CAAM,KAAA;AAE7B,MAAA,IAAIsD,GAAAA,CAAI,KAAK,KAAA,EAAO,GAAG,IAAI,gBAAA,EAAkB,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AAAA,IAC5E;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,gBAAA,EAAiB,CAAE,YAAA;AACzC,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAC9B,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAA,CAAO,cAAA,CAAe,QAAQ,CAAA;AAAA,EAC7C;AACF,CAAA;AAGO,IAAM,SAAA,GAAN,cAAwB,SAAA,CAAU;AAAA,EACvC,OAAgB,EAAA,GAAK,OAAA;AAAA,EACrB,OAAgB,OAAA,GAAU,MAAA;AAAA,EAC1B,OAAgB,QAAA,GAAW,MAA8B,CAAC,MAAM,QAAQ,CAAA;AAC1E;AClHA,IAAMM,KAAAA,GAAN,cAAmBC,SAAAA,CAAU;AAAA,EAC3B,OAAgB,EAAA,GAAK,MAAA;AAAA,EACZ,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,MAAA,EAAQ,EAAE,MAAM,OAAA,EAAS,QAAA,EAAU,CAAA,EAAE,EAAG,CAAA;AAAA,EAC5E;AAAA,EACS,cAAc,IAAA,EAA8B;AACnD,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,OAAQ,MAAA,CAAQ,UAAA,CAAW,WAAW,IAAI,CAAA;AAAA,EAChE;AAAA,EACS,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,eAAe,QAAQ,CAAA;AAAA,EACrC;AACF,CAAA;AAEA,IAAM,OAAA,GAAN,cAAsBA,SAAAA,CAAU;AAAA,EAC9B,OAAgB,EAAA,GAAK,SAAA;AAAA,EACb,OAAA,GAA0B,IAAA;AAAA,EAC1B,MAAA,GAAS,IAAIP,GAAAA,EAAI;AAAA,EACjB,SAAgD,EAAC;AAAA,EACjD,MAAA,GAAS,EAAA;AAAA,EACT,SAAA,GAAY,CAAA;AAAA,EAEX,QAAQ,IAAA,EAAqC;AACpD,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,KAAA,GAAS,KAA6B,KAAA,IAAS,KAAA;AACrD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,wBAAA,CAAyB,MAAM,CAAA;AACpD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,eAAA,CAAgB,KAAA,EAAM;AAClD,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,CAAA;AACrC,IAAA,MAAM,KAAKQ,aAAAA,EAAc;AACzB,IAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AACf,IAAA,MAAA,CAAO,WAAA,CAAY;AAAA,MACjB,EAAA;AAAA,MACA,IAAA,EAAM,MAAA;AAAA,MACN,CAAA,EAAG,KAAK,MAAA,CAAO,CAAA;AAAA,MACf,CAAA,EAAG,KAAK,MAAA,CAAO,CAAA;AAAA,MACf,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,EAAM,EAAG,CAAA;AAAA,QACxD,UAAA,EAAY,KAAA;AAAA,QACZ,QAAA,EAAU,KAAA;AAAA,QACV;AAAA;AACF,KACD,CAAA;AACD,IAAA,MAAA,CAAO,UAAA,EAAW;AAAA,EACpB;AAAA,EAES,aAAA,GAAsB;AAC7B,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,EAAE,gBAAA,EAAiB,GAAI,MAAA,CAAO,MAAA;AACpC,IAAA,MAAM,CAAA,GAAIR,GAAAA,CAAI,GAAA,CAAI,gBAAA,EAAkB,KAAK,MAAM,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,EAAE,CAAA;AAC9B,IAAA,IAAIA,GAAAA,CAAI,KAAA,CAAM,IAAA,EAAM,CAAC,IAAI,IAAA,EAAM;AAC/B,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,CAAA;AAC3C,IAAA,MAAM,GAAA,GAAM,YAAY,GAAA,EAAI;AAE5B,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,SAAA,GAAY,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAK,SAAA,GAAY,GAAA;AACjB,MAAA,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,IAClB;AAAA,EACF;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAES,UAAA,GAAmB;AAC1B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AAClC,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EAEQ,MAAM,QAAA,EAAyB;AACrC,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,OAAQ,CAAA;AAC3C,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AAC3B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,EAAE,CAAA;AAC9B,IAAA,MAAM,QAAA,GAAW,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,IAAKA,GAAAA,CAAI,IAAA,CAAK,KAAA,EAAO,IAAI,CAAA,GAAI,EAAA,GAAK,OAAO,YAAA,EAAa;AACxG,IAAA,MAAA,CAAO,WAAA,CAAY;AAAA,MACjB,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,CAAC,EAAE,IAAA,EAAM,MAAM,QAAA,CAAS,CAAC,CAAA,EAAG,IAAA,IAAQ,QAAQ,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,CAAA;AAAA,QACnF,UAAA,EAAY,QAAA;AAAA,QACZ;AAAA;AACF,KACD,CAAA;AAAA,EACH;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,IAAA,CAAK,MAAM,IAAI,CAAA;AACf,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAC9B,IAAA,IAAI,CAAC,OAAO,gBAAA,EAAiB,CAAE,gBAAgB,CAAC,MAAA,CAAO,OAAO,KAAA,EAAO;AAErE,EACF;AACF,CAAA;AAGO,IAAM,QAAA,GAAN,cAAuBO,SAAAA,CAAU;AAAA,EACtC,OAAgB,EAAA,GAAK,MAAA;AAAA,EACrB,OAAgB,OAAA,GAAU,MAAA;AAAA,EAC1B,OAAgB,QAAA,GAAW,MAA8B,CAACD,OAAM,OAAO,CAAA;AACzE;ACjHA,IAAMA,KAAAA,GAAN,cAAmBC,SAAAA,CAAU;AAAA,EAC3B,OAAgB,EAAA,GAAK,MAAA;AAAA,EACZ,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,MAAA,EAAQ,EAAE,MAAM,OAAA,EAAS,QAAA,EAAU,CAAA,EAAE,EAAG,CAAA;AAAA,EAC5E;AAAA,EACS,cAAc,IAAA,EAA8B;AACnD,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,OAAQ,MAAA,CAAQ,UAAA,CAAW,WAAW,IAAI,CAAA;AAAA,EAChE;AAAA,EACS,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,eAAe,QAAQ,CAAA;AAAA,EACrC;AACF,CAAA;AAEA,IAAM,OAAA,GAAN,cAAsBA,SAAAA,CAAU;AAAA,EAC9B,OAAgB,EAAA,GAAK,SAAA;AAAA,EACb,OAAA,uBAAc,GAAA,EAAa;AAAA,EAC3B,MAAA,GAAS,EAAA;AAAA,EAER,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,wBAAA,CAAyB,OAAO,CAAA;AAC1D,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,aAAA,GAAsB;AAC7B,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAES,UAAA,GAAmB;AAC1B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,EAAE,CAAA;AAC/B,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,EAAE,gBAAA,EAAkB,iBAAA,EAAkB,GAAI,MAAA,CAAO,MAAA;AACvD,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,gBAAA,CAAiB,CAAA,EAAG,kBAAkB,CAAC,CAAA;AAC7D,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,gBAAA,CAAiB,CAAA,EAAG,kBAAkB,CAAC,CAAA;AAC7D,IAAA,MAAM,GAAA,GAAM;AAAA,MACV,CAAA,EAAG,IAAA;AAAA,MACH,CAAA,EAAG,IAAA;AAAA,MACH,GAAG,IAAA,CAAK,GAAA,CAAI,gBAAA,CAAiB,CAAA,GAAI,kBAAkB,CAAC,CAAA;AAAA,MACpD,GAAG,IAAA,CAAK,GAAA,CAAI,gBAAA,CAAiB,CAAA,GAAI,kBAAkB,CAAC;AAAA,KACtD;AACA,IAAA,MAAM,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,YAAA,EAAa;AACvC,IAAA,MAAM,IAAA,GAAO,OAAO,2BAAA,CAA4B,EAAE,GAAG,GAAA,CAAI,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,QAAQ,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,GAAI,MAAA,EAAQ,GAAG,GAAA,CAAI,CAAA,GAAI,CAAA,GAAI,MAAA,EAAQ,CAAA;AACtI,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,IAAI,EAAE,QAAA,IAAY,IAAA,CAAK,QAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AAC1C,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACrB,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AACA,IAAA,IAAI,SAAS,MAAA,CAAO,gBAAA,CAAiB,CAAC,GAAG,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACxD;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,GAAA,GAAM,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA;AAC5B,IAAA,MAAA,CAAO,gBAAA,CAAiB,EAAE,CAAA;AAC1B,IAAA,IAAI,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,YAAA,CAAa,GAAG,CAAA;AACvC,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AACF,CAAA;AAGO,IAAM,UAAA,GAAN,cAAyBA,SAAAA,CAAU;AAAA,EACxC,OAAgB,EAAA,GAAK,QAAA;AAAA,EACrB,OAAgB,OAAA,GAAU,MAAA;AAAA,EAC1B,OAAgB,QAAA,GAAW,MAA8B,CAACD,OAAM,OAAO,CAAA;AACzE;ACrEA,IAAM,oBAAA,GAAuB,CAAA;AAQ7B,IAAM,OAAA,GAAN,cAAsBC,SAAAA,CAAU;AAAA,EAC9B,OAAgB,EAAA,GAAK,MAAA;AAAA,EAEZ,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,MAAA,EAAQ,EAAE,MAAM,OAAA,EAAS,QAAA,EAAU,CAAA,EAAE,EAAG,CAAA;AAAA,EAC5E;AAAA,EAES,cAAc,IAAA,EAA8B;AACnD,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,OAAQ,MAAA,CAAQ,UAAA,CAAW,YAAY,IAAI,CAAA;AAAA,EACjE;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,eAAe,QAAQ,CAAA;AAAA,EACrC;AACF,CAAA;AAEA,IAAM,WAAA,GAAN,cAA0BA,SAAAA,CAAU;AAAA,EAClC,OAAgB,EAAA,GAAK,UAAA;AAAA,EACb,OAAA,GAA0B,IAAA;AAAA,EAC1B,MAAA,GAAS,EAAA;AAAA,EAEjB,IAAY,IAAA,GAAyB;AACnC,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAES,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AAAA,EAES,aAAA,GAAsB;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY;AACpC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,MAAA,EAAO;AAC/B,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,WAAA,GAAoB;AAI3B,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,IAAA,CAAK,MAAA,EAAO;AACZ,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,cAAA,EAAe;AACtC,MAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,IAAA,CAAK,MAAA,CAAO,MAAA;AACxC,MAAA,IAAA,CAAK,OAAO,WAAA,CAAY;AAAA,QACtB,IAAI,IAAA,CAAK,OAAA;AAAA,QACT,IAAA,EAAM,KAAK,IAAA,CAAK,SAAA;AAAA,QAChB,CAAA,EAAG,eAAA,CAAgB,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,CAAA;AAAA,QAChC,CAAA,EAAG,eAAA,CAAgB,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,CAAA;AAAA;AAAA;AAAA,QAGhC,KAAA,EAAO,EAAE,GAAG,IAAA;AAAK,OAClB,CAAA;AAAA,IACH;AACA,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,UAAA,GAAmB;AAC1B,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAI,KAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,KAAK,MAAM,CAAA;AACnD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,wBAAA,CAAyB,CAAA,OAAA,EAAU,IAAA,CAAK,SAAS,CAAA,CAAE,CAAA;AACxE,IAAA,MAAM,KAAKC,aAAAA,EAAc;AACzB,IAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,MAAA,CAAO,MAAA;AACnC,IAAA,MAAM,MAAM,IAAA,CAAK,OAAA;AACjB,IAAA,MAAA,CAAO,WAAA,CAAY;AAAA,MACjB,EAAA;AAAA,MACA,MAAM,IAAA,CAAK,SAAA;AAAA,MACX,GAAG,eAAA,CAAgB,CAAA;AAAA,MACnB,GAAG,eAAA,CAAgB,CAAA;AAAA,MACnB,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,gBAAe,EAAG,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA;AAAI,KACnD,CAAA;AACD,IAAA,MAAA,CAAO,OAAO,EAAE,CAAA;AAChB,IAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AAAA,EACjB;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,OAAQ,CAAA;AAC3C,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,EAAE,eAAA,EAAiB,gBAAA,EAAkB,QAAA,KAAa,MAAA,CAAO,MAAA;AAC/D,IAAA,IAAI,CAAA,GAAI,gBAAA,CAAiB,CAAA,GAAI,eAAA,CAAgB,CAAA;AAC7C,IAAA,IAAI,CAAA,GAAI,gBAAA,CAAiB,CAAA,GAAI,eAAA,CAAgB,CAAA;AAC7C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAC3C,MAAA,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,IAAK,CAAC,CAAA,GAAI,CAAA;AACxB,MAAA,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,IAAK,CAAC,CAAA,GAAI,CAAA;AAAA,IAC1B;AACA,IAAA,IAAI,IAAI,eAAA,CAAgB,CAAA;AACxB,IAAA,IAAI,IAAI,eAAA,CAAgB,CAAA;AAExB,IAAA,IAAI,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AAChB,IAAA,IAAI,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AAChB,IAAA,MAAM,MAAM,IAAA,CAAK,OAAA;AACjB,IAAA,MAAA,CAAO,WAAA,CAAY;AAAA,MACjB,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,CAAA;AAAA,MACA,CAAA;AAAA,MACA,OAAO,EAAE,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAAE,KACvE,CAAA;AAAA,EACH;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,KAAK,IAAA,CAAK,OAAA;AAChB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAC9B,IAAA,IAAA,CAAK,IAAA,CAAK,SAAS,EAAA,GAAM,IAAA,CAAK,OAAO,QAAA,CAAS,EAAE,CAAA,IAAK,IAAA,GAAQ,IAAI,CAAA;AAAA,EACnE;AACF,CAAA;AAsBO,IAAe,gBAAA,GAAf,cAAwCD,SAAAA,CAAU;AAAA,EACvD,OAAgB,EAAA,GAAK,KAAA;AAAA,EACrB,OAAgB,OAAA,GAAU,MAAA;AAAA,EAC1B,OAAgB,QAAA,GAAW,MAA8B,CAAC,SAAS,WAAW,CAAA;AAAA;AAAA,EAM9E,OAAA,GAAkB,oBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASlB,cAAA,GAA0B;AACxB,IAAA,MAAM,QAAQ,IAAA,CAAK,MAAA,CAAO,aAAa,IAAA,CAAK,SAAS,EAAE,eAAA,EAAgB;AACvE,IAAA,MAAM,IAAI,OAAO,KAAA,CAAM,MAAM,QAAA,GAAW,KAAA,CAAM,IAAI,IAAA,CAAK,OAAA;AACvD,IAAA,MAAM,IAAI,OAAO,KAAA,CAAM,MAAM,QAAA,GAAW,KAAA,CAAM,IAAI,IAAA,CAAK,OAAA;AACvD,IAAA,OAAO,EAAE,GAAG,CAAA,EAAE;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAA,GAA0C;AACxC,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,SAAS,MAAA,EAAmC;AAC1C,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAI,OAAO,gBAAA,EAAiB,CAAE,cAAc,MAAA,CAAO,cAAA,CAAe,KAAK,EAAE,CAAA;AAAA,SACpE,MAAA,CAAO,eAAe,QAAQ,CAAA;AAAA,EACrC;AACF;;;AC3MA,IAAM,kBAAA,GAA8B,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AAErD,IAAM,cAAA,GAAiB,EAAA;AAGvB,SAAS,cAAc,MAAA,EAAwB;AAC7C,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,oBAAA,EAAqB,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,OAAO,CAAA,CAAE,MAAA;AAC9E,EAAA,OAAO,CAAA,MAAA,EAAS,QAAQ,CAAC,CAAA,CAAA;AAC3B;AAGA,SAAS,iBAAA,CAAkB,QAAgB,OAAA,EAAwB;AACjE,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA;AACrC,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,kBAAA,CAAmB,OAAO,CAAA;AAChD,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAA,EAAQ;AACvB,EAAA,MAAM,MAAA,GAAS,OAAO,gBAAA,EAAiB;AACvC,EAAA,MAAM,SAAS,MAAA,CAAO,qBAAA,CAAsB,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAoB;AAC9E,IAAA,IAAI,CAAA,CAAE,OAAO,OAAA,IAAW,CAAA,CAAE,YAAY,CAAA,CAAE,QAAA,KAAa,QAAQ,OAAO,KAAA;AAGpE,IAAA,OAAO,CAAC,MAAA,CAAO,YAAA,CAAa,CAAC,CAAA,CAAE,YAAY,CAAC,CAAA;AAAA,EAC9C,CAAC,CAAA;AACD,EAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,qBAAA,CAAsB,MAAA,EAAQ,OAAO,MAAM,CAAA;AAChE;AAQO,IAAM,SAAA,GAAN,cAAwB,gBAAA,CAAiB;AAAA,EAC9C,OAAgB,EAAA,GAAK,OAAA;AAAA,EACrB,OAAgB,OAAA,GAAU,MAAA;AAAA,EAEjB,SAAA,GAAY,OAAA;AAAA,EAEZ,OAAA,GAAU,cAAA;AAAA;AAAA,EAGV,cAAA,GAA0B;AACjC,IAAA,OAAO,EAAE,GAAG,kBAAA,EAAmB;AAAA,EACjC;AAAA,EAES,cAAA,GAA0C;AACjD,IAAA,OAAO,EAAE,IAAA,EAAM,aAAA,CAAc,IAAA,CAAK,MAAM,CAAA,EAAE;AAAA,EAC5C;AAAA,EAES,SAAS,KAAA,EAAkC;AAClD,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAI,KAAA,EAAO,iBAAA,CAAkB,MAAA,EAAQ,KAAA,CAAM,EAAE,CAAA;AAC7C,IAAA,IAAI,OAAO,gBAAA,EAAiB,CAAE,cAAc,MAAA,CAAO,cAAA,CAAe,KAAK,EAAE,CAAA;AAAA,SACpE,MAAA,CAAO,eAAe,QAAQ,CAAA;AAAA,EACrC;AACF;AChDA,IAAMD,KAAAA,GAAN,cAAmBC,SAAAA,CAAU;AAAA,EAC3B,OAAgB,EAAA,GAAK,MAAA;AAAA,EACZ,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,MAAA,EAAQ,EAAE,MAAM,OAAA,EAAS,QAAA,EAAU,CAAA,EAAE,EAAG,CAAA;AAAA,EAC5E;AAAA,EACS,cAAc,IAAA,EAA8B;AACnD,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,OAAQ,MAAA,CAAQ,UAAA,CAAW,YAAY,IAAI,CAAA;AAAA,EACjE;AAAA,EACS,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,eAAe,QAAQ,CAAA;AAAA,EACrC;AACF,CAAA;AAEA,IAAME,SAAAA,GAAN,cAAuBF,SAAAA,CAAU;AAAA,EAC/B,OAAgB,EAAA,GAAK,UAAA;AAAA,EACb,OAAA,GAA0B,IAAA;AAAA,EAC1B,MAAA,GAAS,EAAA;AAAA,EAER,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AAAA,EAES,aAAA,GAAsB;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY;AACpC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,MAAA,EAAO;AAC/B,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AAEjB,MAAA,IAAA,CAAK,MAAA,EAAO;AACZ,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,KAAK,OAAQ,CAAA;AAChD,MAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,KAAA,CAAM,KAAA;AACvB,MAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,IAAA,CAAK,MAAA,CAAO,MAAA;AACxC,MAAA,IAAA,CAAK,OAAO,WAAA,CAAY,EAAE,IAAI,KAAA,CAAM,EAAA,EAAI,MAAM,KAAA,CAAM,IAAA,EAAM,GAAG,eAAA,CAAgB,CAAA,GAAI,IAAI,CAAA,EAAG,CAAA,EAAG,gBAAgB,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA;AAAA,IACxH;AACA,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAI,KAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,KAAK,MAAM,CAAA;AACnD,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EAES,UAAA,GAAmB;AAC1B,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,GAAA,GAAO,KAAK,MAAA,CAAmB,GAAA;AACrC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,wBAAA,CAAyB,YAAY,CAAA;AAC1D,IAAA,MAAM,KAAKC,aAAAA,EAAc;AACzB,IAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,MAAA,CAAO,MAAA;AACnC,IAAA,MAAA,CAAO,WAAA,CAAY;AAAA,MACjB,EAAA;AAAA,MACA,IAAA,EAAM,KAAA;AAAA,MACN,GAAG,eAAA,CAAgB,CAAA;AAAA,MACnB,GAAG,eAAA,CAAgB,CAAA;AAAA,MACnB,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA;AAAI,KAC9B,CAAA;AACD,IAAA,MAAA,CAAO,OAAO,EAAE,CAAA;AAChB,IAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AAAA,EACjB;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,OAAQ,CAAA;AAC3C,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,EAAE,eAAA,EAAiB,gBAAA,EAAkB,QAAA,EAAU,MAAA,KAAW,MAAA,CAAO,MAAA;AACvE,IAAA,IAAI,CAAA,GAAI,gBAAA,CAAiB,CAAA,GAAI,eAAA,CAAgB,CAAA;AAC7C,IAAA,IAAI,CAAA,GAAI,gBAAA,CAAiB,CAAA,GAAI,eAAA,CAAgB,CAAA;AAC7C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAC3C,MAAA,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,IAAK,CAAC,CAAA,GAAI,CAAA;AACxB,MAAA,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,IAAK,CAAC,CAAA,GAAI,CAAA;AAAA,IAC1B;AACA,IAAA,IAAI,IAAI,eAAA,CAAgB,CAAA;AACxB,IAAA,IAAI,IAAI,eAAA,CAAgB,CAAA;AACxB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,CAAA,IAAK,IAAA,CAAK,IAAI,CAAC,CAAA;AACf,MAAA,CAAA,IAAK,IAAA,CAAK,IAAI,CAAC,CAAA;AACf,MAAA,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAClB,MAAA,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,IAAI,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AAChB,MAAA,IAAI,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AAAA,IAClB;AACA,IAAA,MAAA,CAAO,WAAA,CAAY,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,EAAE,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA,IAAK,CAAA;AAAA,EAC7H;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,gBAAA,EAAiB,CAAE,YAAA;AACzC,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAC9B,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAA,CAAO,cAAA,CAAe,QAAQ,CAAA;AAAA,EAC7C;AACF,CAAA;AAGO,IAAM,OAAA,GAAN,cAAsBD,SAAAA,CAAU;AAAA,EACrC,OAAgB,EAAA,GAAK,KAAA;AAAA,EACrB,OAAgB,OAAA,GAAU,MAAA;AAAA,EAC1B,OAAgB,QAAA,GAAW,MAA8B,CAACD,OAAMG,SAAQ,CAAA;AAAA,EACxE,GAAA,GAAoB,WAAA;AAAA,EAEX,QAAQ,IAAA,EAAqC;AACpD,IAAA,MAAM,GAAA,GAAM,KAAK,KAAK,CAAA;AACtB,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,IAAA,CAAK,GAAA,GAAM,GAAA;AAAA,SACnC,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,qBAAqB3E,gBAAgB,CAAA;AAAA,EACnE;AACF;AC9GA,IAAMwE,KAAAA,GAAN,cAAmBC,SAAAA,CAAU;AAAA,EAC3B,OAAgB,EAAA,GAAK,MAAA;AAAA,EACZ,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,MAAA,EAAQ,EAAE,MAAM,OAAA,EAAS,QAAA,EAAU,CAAA,EAAE,EAAG,CAAA;AAAA,EAC5E;AAAA,EACS,cAAc,IAAA,EAA8B;AACnD,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,OAAQ,MAAA,CAAQ,UAAA,CAAW,gBAAgB,IAAI,CAAA;AAAA,EACrE;AAAA,EACS,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,eAAe,QAAQ,CAAA;AAAA,EACrC;AACF,CAAA;AAEA,IAAM,YAAA,GAAN,cAA2BA,SAAAA,CAAU;AAAA,EACnC,OAAgB,EAAA,GAAK,cAAA;AAAA,EACb,OAAA,GAA0B,IAAA;AAAA,EAC1B,MAAA,GAAS,IAAIP,GAAAA,EAAI;AAAA,EACjB,SAAgD,EAAC;AAAA,EACjD,MAAA,GAAS,EAAA;AAAA,EACT,SAAA,GAAY,CAAA;AAAA,EAEX,QAAQ,IAAA,EAAqC;AACpD,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,KAAA,GAAS,KAA6B,KAAA,IAAS,KAAA;AACrD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,wBAAA,CAAyB,WAAW,CAAA;AACzD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,eAAA,CAAgB,KAAA,EAAM;AAClD,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,CAAA;AACrC,IAAA,MAAM,KAAKQ,aAAAA,EAAc;AACzB,IAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AACf,IAAA,MAAA,CAAO,WAAA,CAA4B;AAAA,MACjC,EAAA;AAAA,MACA,IAAA,EAAM,WAAA;AAAA,MACN,CAAA,EAAG,KAAK,MAAA,CAAO,CAAA;AAAA,MACf,CAAA,EAAG,KAAK,MAAA,CAAO,CAAA;AAAA,MACf,OAAO,EAAE,QAAA,EAAU,CAAC,EAAE,MAAM,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,OAAM,EAAG,CAAA,EAAG,UAAA,EAAY,OAAO,KAAA;AAAM,KAC9F,CAAA;AACD,IAAA,MAAA,CAAO,UAAA,EAAW;AAAA,EACpB;AAAA,EAES,aAAA,GAAsB;AAC7B,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,IAAIR,GAAAA,CAAI,GAAA,CAAI,OAAO,MAAA,CAAO,gBAAA,EAAkB,KAAK,MAAM,CAAA;AAC7D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,EAAE,CAAA;AAC9B,IAAA,IAAIA,GAAAA,CAAI,KAAA,CAAM,IAAA,EAAM,CAAC,IAAI,IAAA,EAAM;AAC/B,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,CAAA;AAC3C,IAAA,MAAM,GAAA,GAAM,YAAY,GAAA,EAAI;AAE5B,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,SAAA,GAAY,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAK,SAAA,GAAY,GAAA;AACjB,MAAA,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,IAClB;AAAA,EACF;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAES,UAAA,GAAmB;AAC1B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AAClC,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EAEQ,MAAM,QAAA,EAAyB;AACrC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,KAAK,OAAQ,CAAA;AAChD,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,IAAA,CAAK,OAAO,WAAA,CAA4B;AAAA,MACtC,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,IAAA,EAAM,WAAA;AAAA,MACN,KAAA,EAAO,EAAE,QAAA,EAAU,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,OAAO,KAAA,EAAM,EAAG,CAAA,EAAG,YAAY,QAAA;AAAS,KAC1F,CAAA;AAAA,EACH;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,IAAA,CAAK,MAAM,IAAI,CAAA;AACf,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AACF,CAAA;AAGO,IAAM,kBAAA,GAAN,cAAiCO,SAAAA,CAAU;AAAA,EAChD,OAAgB,EAAA,GAAK,WAAA;AAAA,EACrB,OAAgB,OAAA,GAAU,MAAA;AAAA,EAC1B,OAAgB,QAAA,GAAW,MAA8B,CAACD,OAAM,YAAY,CAAA;AAAA;AAAA,EAEnE,SAAA,GAAY,WAAA;AACvB;ACjFO,IAAM,cAAA,GAAiB;AAAA,EAC5B,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,GAAA;AAAA,EACT,IAAA,EAAM,CAAA;AAAA,EACN,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,IAAA;AAAA,EACR,KAAA,EAAO;AACT,CAAA;AAEA,IAAMA,KAAAA,GAAN,cAAmBC,SAAAA,CAAU;AAAA,EAC3B,OAAgB,EAAA,GAAK,MAAA;AAAA,EACZ,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,MAAA,EAAQ,EAAE,MAAM,OAAA,EAAS,QAAA,EAAU,CAAA,EAAE,EAAG,CAAA;AAAA,EAC5E;AAAA,EACS,cAAc,IAAA,EAA8B;AACnD,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,OAAQ,MAAA,CAAQ,UAAA,CAAW,YAAY,IAAI,CAAA;AAAA,EACjE;AAAA,EACS,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,eAAe,QAAQ,CAAA;AAAA,EACrC;AACF,CAAA;AAEA,IAAM,QAAA,GAAN,cAAuBA,SAAAA,CAAU;AAAA,EAC/B,OAAgB,EAAA,GAAK,UAAA;AAAA,EAEZ,OAAA,GAAgB;AACvB,IAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,IAAA,CAAK,OAAO,MAAA,CAAO,gBAAA;AACpC,IAAA,MAAM,IAAA,GAAO,KAAK,MAAA,CAAO,SAAA,CAAU,aAAa,EAAE,GAAG,gBAAgB,CAAA;AACpE,IAAC,IAAA,CAAK,MAAA,CAAqB,SAAA,GAAY,IAAA,CAAK,EAAA;AAC7C,IAAA,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,iBAAA,CAAkB,CAAA,EAAG,CAAC,CAAA;AAAA,EAC9C;AAAA,EAES,aAAA,GAAsB;AAC7B,IAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,IAAA,CAAK,OAAO,MAAA,CAAO,gBAAA;AACpC,IAAA,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,iBAAA,CAAkB,CAAA,EAAG,CAAC,CAAA;AAAA,EAC9C;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAES,UAAA,GAAmB;AAC1B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,QAAA,GAAiB;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,UAAU,WAAA,EAAY;AACjC,IAAC,IAAA,CAAK,OAAqB,SAAA,GAAY,IAAA;AACxC,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AACF,CAAA;AAGO,IAAM,SAAA,GAAN,cAAwBA,SAAAA,CAAU;AAAA,EACvC,OAAgB,EAAA,GAAK,OAAA;AAAA,EACrB,OAAgB,OAAA,GAAU,MAAA;AAAA,EAC1B,OAAgB,QAAA,GAAW,MAA8B,CAACD,OAAM,QAAQ,CAAA;AAAA;AAAA,EAGxE,SAAA,GAA2B,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU3B,YAAA,GAA8B;AAC5B,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AACF;ACnGA,IAAMA,KAAAA,GAAN,cAAmBC,SAAAA,CAAU;AAAA,EAC3B,OAAgB,EAAA,GAAK,MAAA;AAAA,EACZ,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,MAAA,EAAQ,EAAE,MAAM,MAAA,EAAQ,QAAA,EAAU,CAAA,EAAE,EAAG,CAAA;AAAA,EAC3E;AAAA,EACS,cAAc,IAAA,EAA8B;AACnD,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,OAAQ,MAAA,CAAQ,UAAA,CAAW,YAAY,IAAI,CAAA;AAAA,EACjE;AACF,CAAA;AAEA,IAAME,SAAAA,GAAN,cAAuBF,SAAAA,CAAU;AAAA,EAC/B,OAAgB,EAAA,GAAK,UAAA;AAAA,EACZ,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,MAAA,EAAQ,EAAE,MAAM,UAAA,EAAY,QAAA,EAAU,CAAA,EAAE,EAAG,CAAA;AAAA,EAC/E;AAAA,EACS,aAAA,GAAsB;AAC7B,IAAA,IAAI,KAAK,MAAA,CAAO,MAAA,CAAO,YAAY,IAAA,CAAK,MAAA,CAAQ,WAAW,UAAU,CAAA;AAAA,EACvE;AAAA,EACS,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EACS,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AACF,CAAA;AAEA,IAAM,QAAA,GAAN,cAAuBA,SAAAA,CAAU;AAAA,EAC/B,OAAgB,EAAA,GAAK,UAAA;AAAA,EACZ,aAAA,GAAsB;AAC7B,IAAA,MAAM,EAAE,kBAAA,EAAoB,mBAAA,EAAoB,GAAI,KAAK,MAAA,CAAO,MAAA;AAChE,IAAA,IAAA,CAAK,OAAO,GAAA,CAAIP,GAAAA,CAAI,GAAA,CAAI,kBAAA,EAAoB,mBAAmB,CAAC,CAAA;AAAA,EAClE;AAAA,EACS,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EACS,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AACF,CAAA;AAGO,IAAM,QAAA,GAAN,cAAuBO,SAAAA,CAAU;AAAA,EACtC,OAAgB,EAAA,GAAK,MAAA;AAAA,EACrB,OAAgB,OAAA,GAAU,MAAA;AAAA,EAC1B,OAAgB,QAAA,GAAW,MAA8B,CAACD,KAAAA,EAAMG,WAAU,QAAQ,CAAA;AACpF;ACjCA,IAAM,kBAAA,GAAqB,CAAA;AAE3B,IAAMH,KAAAA,GAAN,cAAmBC,SAAAA,CAAU;AAAA,EAC3B,OAAgB,EAAA,GAAK,MAAA;AAAA,EAEZ,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,MAAA,EAAQ,EAAE,MAAM,OAAA,EAAS,QAAA,EAAU,CAAA,EAAE,EAAG,CAAA;AAAA,EAC5E;AAAA,EAES,cAAc,IAAA,EAA8B;AACnD,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,OAAQ,MAAA,CAAQ,UAAA,CAAW,YAAY,IAAI,CAAA;AAAA,EACjE;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,eAAe,QAAQ,CAAA;AAAA,EACrC;AACF,CAAA;AAOA,IAAME,SAAAA,GAAN,cAAuBF,SAAAA,CAAU;AAAA,EAC/B,OAAgB,EAAA,GAAK,UAAA;AAAA,EACb,OAAA,GAA0B,IAAA;AAAA,EAC1B,MAAA,GAAS,EAAA;AAAA;AAAA,EAET,OAAA,GAAU,IAAA;AAAA;AAAA,EAEV,OAAA,GAAU,KAAA;AAAA,EAET,OAAA,GAAgB;AACvB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,wBAAA,CAAyB,aAAa,CAAA;AAC3D,IAAA,MAAM,KAAKC,aAAAA,EAAc;AACzB,IAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,MAAA,CAAO,MAAA;AACnC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,MAAA,CAAO,WAAA,CAAuB;AAAA,MAC5B,EAAA;AAAA,MACA,IAAA,EAAM,MAAA;AAAA,MACN,GAAG,eAAA,CAAgB,CAAA;AAAA,MACnB,GAAG,eAAA,CAAgB,CAAA;AAAA,MACnB,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ;AAAA,UACN,EAAA,EAAI,EAAE,EAAA,EAAI,IAAA,EAAM,OAAO,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AAAA,UACxC,EAAA,EAAI,EAAE,EAAA,EAAI,IAAA,EAAM,OAAO,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AAAE;AAC1C;AACF,KACD,CAAA;AACD,IAAA,MAAA,CAAO,OAAO,EAAE,CAAA;AAChB,IAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AAAA,EACjB;AAAA;AAAA,EAGS,cAAc,IAAA,EAA8B;AACnD,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,EAAS;AAC5B,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAES,aAAA,GAAsB;AAC7B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,UAAA,OAAiB,OAAA,GAAU,IAAA;AAClD,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA,EAES,WAAA,GAAoB;AAI3B,IAAA,IAAI,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,MAAA,EAAO;AAAA,EAChC;AAAA,EAES,cAAc,IAAA,EAA4B;AAEjD,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AACzB,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,UAAU,IAAA,EAA+B;AAChD,IAAA,IAAI,IAAA,CAAK,GAAA,KAAQ,OAAA,EAAS,IAAA,CAAK,MAAA,EAAO;AAAA,EACxC;AAAA,EAES,UAAA,GAAmB;AAC1B,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAI,KAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,KAAK,MAAM,CAAA;AACnD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EAEQ,QAAA,GAAkC;AACxC,IAAA,OAAO,KAAK,OAAA,GAAU,IAAA,CAAK,OAAO,QAAA,CAAoB,IAAA,CAAK,OAAO,CAAA,GAAI,MAAA;AAAA,EACxE;AAAA,EAEQ,kBAAA,GAA2B;AACjC,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,EAAS;AAC5B,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,QAAQ,MAAA,CAAO,oBAAA,CAAqB,KAAA,EAAO,MAAA,CAAO,OAAO,gBAAgB,CAAA;AAC/E,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,KAAK,OAAO,CAAA;AAC7C,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,SAAoC,EAAE,GAAG,MAAM,KAAA,CAAM,MAAA,EAAQ,CAAC,IAAA,CAAK,OAAO,GAAG,EAAE,GAAG,OAAO,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,EAAG,KAAA,CAAM,GAAE,EAAE;AACxH,IAAA,MAAA,CAAO,WAAA,CAAuB,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,EAAE,MAAA,EAAO,EAAG,CAAA;AAAA,EACjF;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,EAAS;AAC5B,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,OAAA,GAAU,cAAc,KAAK,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,EAAA,CAAG,EAAE,CAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,EAAA,CAAG,EAAE,CAAA;AAC1B,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI,QAAQR,GAAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAI,IAAI,kBAAA,EAAoB;AACrD,MAAA,IAAA,CAAK,MAAA,EAAO;AACZ,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,IAAA,CAAK,KAAiB,CAAA;AAClD,IAAA,MAAM,SAAoC,EAAE,GAAG,MAAM,KAAA,CAAM,MAAA,EAAQ,CAAC,KAAK,GAAG,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,CAAA,EAAG,IAAA,CAAK,GAAG,CAAA,EAAG,IAAA,CAAK,GAAE,EAAE;AACvH,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,MAAA,CAAO,WAAA,CAAuB,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,EAAE,MAAA,EAAO,EAAG,CAAA;AAAA,EACtF;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,EAAS;AAC5B,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,OAAA,GAAU,cAAc,KAAK,CAAA;AACnC,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,EAAA,CAAG,EAAE,CAAA;AAC1B,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,EAAA,CAAG,EAAE,CAAA;AAC1B,MAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,IAAA,IAAQ,IAAA,IAAQA,IAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA,GAAI,kBAAA,EAAoB;AAEnF,QAAA,MAAM,MAAA,GAAS,EAAE,GAAG,KAAA,CAAM,MAAM,MAAA,EAAO;AACvC,QAAA,OAAO,MAAA,CAAO,KAAK,EAAE,CAAA;AACrB,QAAA,MAAA,CAAO,WAAA,CAAuB,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,EAAE,MAAA,EAAO,EAAG,CAAA;AAAA,MACjF,CAAA,MAAA,IAAW,OAAA,CAAQ,MAAA,IAAU,CAAA,IAAK,IAAA,IAAQ,IAAA,IAAQA,GAAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA,GAAI,kBAAA,EAAoB;AAE3F,QAAA,MAAA,CAAO,UAAA,CAAW,KAAK,MAAM,CAAA;AAAA,MAC/B;AAAA,IACF;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,gBAAA,EAAiB,CAAE,YAAA;AACzC,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAC9B,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAA,CAAO,cAAA,CAAe,QAAQ,CAAA;AAAA,EAC7C;AACF,CAAA;AAGO,IAAM,QAAA,GAAN,cAAuBO,SAAAA,CAAU;AAAA,EACtC,OAAgB,EAAA,GAAK,MAAA;AAAA,EACrB,OAAgB,OAAA,GAAU,MAAA;AAAA,EAC1B,OAAgB,QAAA,GAAW,MAA8B,CAACD,OAAMG,SAAQ,CAAA;AAC1E;AC3KA,IAAMH,KAAAA,GAAN,cAAmBC,SAAAA,CAAU;AAAA,EAC3B,OAAgB,EAAA,GAAK,MAAA;AAAA,EACZ,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,MAAA,EAAQ,EAAE,MAAM,OAAA,EAAS,QAAA,EAAU,CAAA,EAAE,EAAG,CAAA;AAAA,EAC5E;AAAA,EACS,cAAc,IAAA,EAA8B;AACnD,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,MAAA,CAAO,MAAA;AACnC,IAAA,MAAA,CAAO,yBAAyB,aAAa,CAAA;AAC7C,IAAA,MAAM,KAAKC,aAAAA,EAAc;AACzB,IAAA,MAAA,CAAO,WAAA,CAAY;AAAA,MACjB,EAAA;AAAA,MACA,IAAA,EAAM,MAAA;AAAA,MACN,CAAA,EAAG,gBAAgB,CAAA,GAAI,GAAA;AAAA,MACvB,CAAA,EAAG,gBAAgB,CAAA,GAAI;AAAA,KACxB,CAAA;AACD,IAAA,MAAA,CAAO,OAAO,EAAE,CAAA;AAChB,IAAA,MAAA,CAAO,gBAAgB,EAAE,CAAA;AACzB,IAAA,IAAI,CAAC,MAAA,CAAO,gBAAA,GAAmB,YAAA,EAAc,MAAA,CAAO,eAAe,QAAQ,CAAA;AAAA,EAC7E;AAAA,EACS,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,eAAe,QAAQ,CAAA;AAAA,EACrC;AACF,CAAA;AAGO,IAAM,QAAA,GAAN,cAAuBD,SAAAA,CAAU;AAAA,EACtC,OAAgB,EAAA,GAAK,MAAA;AAAA,EACrB,OAAgB,OAAA,GAAU,MAAA;AAAA,EAC1B,OAAgB,QAAA,GAAW,MAA8B,CAACD,KAAI,CAAA;AAChE;AChBA,IAAM,cAAA,GAA2D;AAAA,EAC/D,GAAA,EAAK,WAAA;AAAA,EACL,MAAA,EAAQ,WAAA;AAAA,EACR,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO,WAAA;AAAA,EACP,QAAA,EAAU,aAAA;AAAA,EACV,YAAA,EAAc,aAAA;AAAA,EACd,SAAA,EAAW,aAAA;AAAA,EACX,WAAA,EAAa,aAAA;AAAA,EACb,MAAA,EAAQ;AACV,CAAA;AAEA,SAAS,SAAA,CAAU,QAA6F,IAAA,EAAoB;AAClI,EAAA,MAAA,CAAO,mBAAA,CAAoB,EAAE,MAAA,EAAQ,EAAE,MAAM,QAAA,EAAU,CAAA,IAAK,CAAA;AAC9D;AAEA,IAAMA,MAAAA,GAAN,cAAmBC,SAAAA,CAAU;AAAA,EAC3B,OAAgB,EAAA,GAAK,MAAA;AAAA,EAEZ,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,MAAA,EAAQ,EAAE,MAAM,SAAA,EAAW,QAAA,EAAU,CAAA,EAAE,EAAG,CAAA;AAAA,EAC9E;AAAA,EAES,cAAc,IAAA,EAA8B;AACnD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,KAAW,OAAA,GAAU,KAAK,KAAA,GAAQ,MAAA;AACvD,IAAA,IAAA,CAAK,MAAA,CAAO,eAAA,CAAgB,OAAA,IAAW,CAAC,IAAA,CAAK,MAAA,CAAO,uBAAA,CAAwB,OAAO,CAAA,GAAI,OAAA,CAAQ,EAAA,GAAK,IAAI,CAAA;AACxG,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,WAAA,IAAe,IAAA,CAAK,MAAA,EAAQ,SAAA,CAAU,IAAA,CAAK,MAAA,EAAQ,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA,IAAK,SAAS,CAAA;AAAA,SAAA,IACtG,KAAK,MAAA,KAAW,QAAA,EAAU,SAAA,CAAU,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,SAC9D,SAAA,CAAU,IAAA,CAAK,MAAA,EAAQ,SAAS,CAAA;AAAA,EACvC;AAAA,EAES,cAAc,IAAA,EAA8B;AACnD,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,IAAA,QAAQ,KAAK,MAAA;AAAQ,MACnB,KAAK,QAAA,EAAU;AACb,QAAA,IAAA,CAAK,MAAA,CAAQ,UAAA,CAAW,iBAAA,EAAmB,IAAI,CAAA;AAC/C,QAAA;AAAA,MACF;AAAA,MACA,KAAK,WAAA,EAAa;AAChB,QAAA,IAAI,KAAK,MAAA,KAAW,QAAA,OAAe,MAAA,CAAQ,UAAA,CAAW,0BAA0B,IAAI,CAAA;AAAA,aAAA,IAC3E,KAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAQ,UAAA,CAAW,0BAA0B,IAAI,CAAA;AAAA,aACvE,IAAA,CAAK,MAAA,CAAQ,UAAA,CAAW,oBAAA,EAAsB,IAAI,CAAA;AACvD,QAAA;AAAA,MACF;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,IAAA,CAAK,MAAA,CAAQ,UAAA,CAAW,iBAAA,EAAmB,IAAI,CAAA;AAC/C,QAAA;AAAA,MACF;AAAA,MACA,KAAK,OAAA,EAAS;AACZ,QAAA,IAAI,IAAA,CAAK,MAAA,CAAO,uBAAA,CAAwB,IAAA,CAAK,KAAK,CAAA,EAAG;AACnD,UAAA,IAAA,CAAK,MAAA,CAAQ,UAAA,CAAW,iBAAA,EAAmB,IAAI,CAAA;AAC/C,UAAA;AAAA,QACF;AACA,QAAA,MAAM,QAAQ,IAAA,CAAK,MAAA,CAAO,4BAA4B,IAAA,CAAK,KAAK,KAAK,IAAA,CAAK,KAAA;AAC1E,QAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,gBAAA,EAAkB,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA;AACnE,QAAA;AAAA,MACF;AAEE;AACJ,EACF;AAAA,EAES,cAAc,IAAA,EAA4B;AAIjD,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AACzB,IAAA,IAAI,IAAA,CAAK,WAAW,OAAA,EAAS;AAC7B,IAAA,MAAM,QAAQ,IAAA,CAAK,MAAA,CAAO,4BAA4B,IAAA,CAAK,KAAK,KAAK,IAAA,CAAK,KAAA;AAC1E,IAAA,IAAI,MAAM,IAAA,KAAS,OAAA,IAAW,MAAM,EAAA,KAAO,IAAA,CAAK,MAAM,EAAA,EAAI;AAExD,MAAA,IAAA,CAAK,OAAO,sBAAA,CAAuB,EAAE,cAAA,EAAgB,KAAA,CAAM,IAAI,CAAA;AAC/D,MAAA,MAAM,QAAQ,IAAA,CAAK,MAAA,CAAO,4BAA4B,IAAA,CAAK,KAAK,KAAK,IAAA,CAAK,KAAA;AAC1E,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA;AAC3C,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAK,CAAA,IAAK,CAAC,IAAA,CAAK,MAAA,CAAO,uBAAA,CAAwB,KAAK,CAAA,EAAG;AACtE,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA;AAC3B,MAAA,IAAA,CAAK,MAAA,CAAO,eAAA,CAAgB,KAAA,CAAM,EAAE,CAAA;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,GAAgB,KAAK,CAAA;AACzC,MAAA,IAAI,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,GAAG,QAAQ,CAAA;AAAA,IACnF;AAAA,EACF;AAAA,EAES,UAAU,IAAA,EAA+B;AAChD,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,QAAQ,KAAK,GAAA;AAAK,MAChB,KAAK,QAAA;AAAA,MACL,KAAK,WAAA,EAAa;AAChB,QAAA,MAAM,GAAA,GAAM,OAAO,mBAAA,EAAoB;AACvC,QAAA,IAAI,IAAI,MAAA,EAAQ;AACd,UAAA,MAAA,CAAO,yBAAyB,QAAQ,CAAA;AACxC,UAAA,MAAA,CAAO,aAAa,GAAG,CAAA;AAAA,QACzB;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,WAAA;AAAA,MACL,KAAK,YAAA;AAAA,MACL,KAAK,SAAA;AAAA,MACL,KAAK,WAAA,EAAa;AAChB,QAAA,MAAM,GAAA,GAAM,OAAO,mBAAA,EAAoB;AACvC,QAAA,IAAI,CAAC,IAAI,MAAA,EAAQ;AACjB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,GAAW,EAAA,GAAK,CAAA;AAClC,QAAA,MAAM,IAAI,IAAIP,GAAAA;AAAA,UACZ,IAAA,CAAK,QAAQ,WAAA,GAAc,CAAC,OAAO,IAAA,CAAK,GAAA,KAAQ,eAAe,IAAA,GAAO,CAAA;AAAA,UACtE,IAAA,CAAK,QAAQ,SAAA,GAAY,CAAC,OAAO,IAAA,CAAK,GAAA,KAAQ,cAAc,IAAA,GAAO;AAAA,SACrE;AACA,QAAA,MAAA,CAAO,yBAAyB,OAAO,CAAA;AACvC,QAAA,MAAA,CAAO,YAAA;AAAA,UACL,GAAA,CAAI,GAAA,CAAI,CAAC,EAAA,KAAO;AACd,YAAA,MAAM,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAC5B,YAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,MAAM,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,EAAE;AAAA,UACxD,CAAC;AAAA,SACH;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,IAAI,MAAA,CAAO,iBAAA,EAAkB,EAAG,MAAA,CAAO,gBAAgB,IAAI,CAAA;AAAA,aAAA,IAClD,MAAA,CAAO,mBAAA,EAAoB,CAAE,cAAA,EAAgB;AACpD,UAAA,MAAM,CAAA,GAAI,MAAA,CAAO,mBAAA,EAAoB,CAAE,cAAA;AACvC,UAAA,MAAA,CAAO,sBAAA,CAAuB,EAAE,cAAA,EAAgB,IAAA,EAAM,CAAA;AACtD,UAAA,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,QACjB,CAAA,aAAc,UAAA,EAAW;AACzB,QAAA;AAAA,MACF;AAEE;AACJ,EACF;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAI,KAAK,MAAA,CAAO,iBAAA,IAAqB,IAAA,CAAK,MAAA,CAAO,gBAAgB,IAAI,CAAA;AAAA,SAChE,IAAA,CAAK,OAAO,UAAA,EAAW;AAAA,EAC9B;AACF,CAAA;AAEA,IAAM,cAAA,GAAN,cAA6BO,SAAAA,CAAU;AAAA,EACrC,OAAgB,EAAA,GAAK,iBAAA;AAAA,EAEZ,OAAA,GAAgB;AACvB,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU;AAChC,MAAA,IAAI,KAAK,MAAA,CAAO,iBAAA,IAAqB,IAAA,CAAK,MAAA,CAAO,gBAAgB,IAAI,CAAA;AACrE,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,mBAAA,EAAoB,CAAE,cAAA,EAAgB,IAAA,CAAK,MAAA,CAAO,sBAAA,CAAuB,EAAE,cAAA,EAAgB,IAAA,EAAM,CAAA;AACjH,MAAA,IAAA,CAAK,OAAO,UAAA,EAAW;AAAA,IACzB;AAAA,EACF;AAAA,EAES,aAAA,GAAsB;AAC7B,IAAA,IAAI,KAAK,MAAA,CAAO,MAAA,CAAO,YAAY,IAAA,CAAK,MAAA,CAAQ,WAAW,UAAU,CAAA;AAAA,EACvE;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AACF,CAAA;AAEA,IAAM,QAAA,GAAN,cAAuBA,SAAAA,CAAU;AAAA,EAC/B,OAAgB,EAAA,GAAK,UAAA;AAAA,EACb,mBAA8B,EAAC;AAAA,EAE9B,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAK,MAAA,CAAO,MAAA,CAAO,WAAW,IAAA,CAAK,MAAA,CAAO,mBAAA,EAAoB,GAAI,EAAC;AAC3F,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,aAAA,GAAsB;AAC7B,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,iBAAA,CAAkB,IAAA,CAAK,gBAAgB,CAAA;AACnD,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,MAAA,GAAe;AACtB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,EACjD;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,EAAE,eAAA,EAAiB,gBAAA,EAAkB,OAAA,EAAQ,GAAI,KAAK,MAAA,CAAO,MAAA;AACnE,IAAA,MAAM,MAAMG,GAAAA,CAAI,UAAA,CAAW,CAAC,eAAA,EAAiB,gBAAgB,CAAC,CAAA;AAC9D,IAAA,IAAA,CAAK,OAAO,mBAAA,CAAoB,EAAE,OAAO,GAAA,CAAI,MAAA,IAAU,CAAA;AACvD,IAAA,MAAM,IAAA,GAAO,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,qBAAA,CAAsB,GAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,2BAAA,CAA4B,GAAG,CAAA;AAC3G,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAiB;AAC5C,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAa,IAAA,CAAK,gBAAgB,CAAA;AAClD,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,IAAI,EAAE,QAAA,EAAU;AAEhB,MAAA,IAAI,GAAA,GAAoB,CAAA;AACxB,MAAA,OAAO,GAAA,CAAI,aAAa,MAAA,EAAQ;AAC9B,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAI,QAAmB,CAAA;AACtD,QAAA,IAAI,CAAC,CAAA,EAAG;AACR,QAAA,GAAA,GAAM,CAAA;AAAA,MACR;AACA,MAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAE,CAAA;AAAA,IAChB;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,iBAAA,CAAkB,CAAC,GAAG,GAAG,CAAC,CAAA;AAAA,EACxC;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AACF,CAAA;AAEA,IAAM,aAAA,GAAN,cAA4BH,SAAAA,CAAU;AAAA,EACpC,OAAgB,EAAA,GAAK,gBAAA;AAAA,EACb,QAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EAEb,QAAQ,IAAA,EAAqC;AACpD,IAAA,MAAM,QAAS,IAAA,CAAkC,KAAA;AACjD,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAChB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,QAAA,GAAW,OAAO,mBAAA,EAAoB;AAC5C,IAAA,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA;AAC7C,IAAA,IAAI,MAAA,CAAO,OAAO,QAAA,EAAU;AAC1B,MAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,MAAA,CAAO,iBAAA,CAAkB,CAAC,GAAG,QAAA,EAAU,KAAA,CAAM,EAAE,CAAC,CAAA;AAAA,IACzE,CAAA,MAAA,IAAW,CAAC,IAAA,CAAK,WAAA,EAAa;AAC5B,MAAA,MAAA,CAAO,iBAAA,CAAkB,CAAC,KAAA,CAAM,EAAE,CAAC,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAES,aAAA,GAAsB;AAC7B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY;AACjC,MAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,aAAa,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAI,OAAO,MAAA,CAAO,QAAA,IAAY,IAAA,CAAK,WAAA,IAAe,KAAK,QAAA,EAAU;AAC/D,MAAA,MAAA,CAAO,iBAAA,CAAkB,MAAA,CAAO,mBAAA,EAAoB,CAAE,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,KAAO,IAAA,CAAK,QAAA,CAAU,EAAE,CAAC,CAAA;AAAA,IAChG;AACA,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AACF,CAAA;AAEA,IAAM,WAAA,GAAN,cAA0BA,SAAAA,CAAU;AAAA,EAClC,OAAgB,EAAA,GAAK,aAAA;AAAA,EACb,aAAA,uBAAoB,GAAA,EAA2B;AAAA,EAC/C,MAAA,GAAS,EAAA;AAAA,EAER,OAAA,GAAgB;AACvB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,wBAAA,CAAyB,WAAW,CAAA;AACzD,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,IAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,iBAAA,EAAkB,EAAG;AAC1C,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AAC9B,MAAA,MAAA,CAAO,YAAA,CAAa,CAAC,CAAA,CAAE,gBAAA,GAAmB,CAAC,CAAA;AAAA,IAC7C;AACA,IAAA,MAAA,CAAO,mBAAA,CAAoB,EAAE,MAAA,EAAQ,EAAE,MAAM,MAAA,EAAQ,QAAA,EAAU,CAAA,EAAE,EAAG,CAAA;AACpE,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,aAAA,GAAsB;AAC7B,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAES,UAAA,GAAmB;AAC1B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AAClC,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EAES,UAAU,IAAA,EAA+B;AAChD,IAAA,IAAI,KAAK,GAAA,KAAQ,OAAA,IAAW,KAAK,GAAA,KAAQ,KAAA,OAAY,MAAA,EAAO;AAAA,EAC9D;AAAA,EAES,QAAQ,IAAA,EAA+B;AAC9C,IAAA,IAAI,KAAK,GAAA,KAAQ,OAAA,IAAW,KAAK,GAAA,KAAQ,KAAA,OAAY,MAAA,EAAO;AAAA,EAC9D;AAAA,EAEQ,aAAA;AAAA,EAEA,MAAA,GAAe;AACrB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,EAAE,eAAA,EAAiB,gBAAA,EAAkB,QAAA,EAAU,OAAA,KAAY,MAAA,CAAO,MAAA;AACxE,IAAA,IAAI,KAAA,GAAQP,GAAAA,CAAI,GAAA,CAAI,gBAAA,EAAkB,eAAe,CAAA;AACrD,IAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,IAAI,IAAA,CAAK,IAAI,KAAA,CAAM,CAAC,IAAI,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,EAAG;AACzC,QAAA,KAAA,GAAQ,IAAIA,GAAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAC1B,QAAA,KAAA,GAAQ,IAAA;AAAA,MACV,CAAA,MAAO;AACL,QAAA,KAAA,GAAQ,IAAIA,GAAAA,CAAI,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA;AAC1B,QAAA,KAAA,GAAQ,IAAA;AAAA,MACV;AAAA,IACF;AACA,IAAA,IAAI,CAAC,OAAA,IAAW,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY;AACxC,MAAA,IAAA,CAAK,kBAAkBU,GAAAA,CAAI,MAAA;AAAA,QACzB,CAAC,GAAG,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,OAAO,kBAAA,CAAmB,CAAC,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAgB,CAAC,CAAC,CAAC;AAAA,OACvG;AACA,MAAA,IAAI,KAAK,aAAA,EAAe;AACtB,QAAA,MAAM,SAAS,IAAIA,GAAAA,CAAI,KAAK,aAAA,CAAc,CAAA,GAAI,MAAM,CAAA,EAAG,IAAA,CAAK,aAAA,CAAc,CAAA,GAAI,MAAM,CAAA,EAAG,IAAA,CAAK,cAAc,CAAA,EAAG,IAAA,CAAK,cAAc,CAAC,CAAA;AACjI,QAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAA,CAAO,KAAA,CAAM,cAAc,MAAA,EAAQ,IAAI,GAAA,CAAI,IAAA,CAAK,cAAc,IAAA,EAAM,GAAG,EAAE,KAAA,EAAO,OAAO,CAAA;AACzG,QAAA,KAAA,GAAQV,GAAAA,CAAI,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA;AAAA,MAC9B;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,MAAM,UAAA,EAAW;AAAA,IAC1B;AACA,IAAA,MAAM,UAA0B,EAAC;AACjC,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,OAAO,CAAA,IAAK,KAAK,aAAA,EAAe;AAE9C,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,cAAA,CAAe,OAAO,CAAA;AAC5C,MAAA,IAAI,CAAA,GAAI,KAAA;AACR,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,qBAAA,CAAsB,MAAM,CAAA;AAC7C,QAAA,MAAM,GAAA,GAAM,EAAE,CAAA,GAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA;AACrC,QAAA,CAAA,GAAI,IAAIA,KAAK,CAAA,CAAE,CAAA,GAAI,MAAM,CAAA,GAAI,CAAA,CAAE,IAAI,KAAA,CAAM,CAAA,IAAK,MAAM,CAAC,CAAA,CAAE,IAAI,KAAA,CAAM,CAAA,GAAI,EAAE,CAAA,GAAI,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,MAC3F;AACA,MAAA,MAAM,IAAA,GAAO,EAAE,GAAG,OAAA,EAAS,CAAA,EAAG,OAAA,CAAQ,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,OAAA,CAAQ,CAAA,GAAI,EAAE,CAAA,EAAE;AAClE,MAAA,MAAM,SAAS,MAAA,CAAO,YAAA,CAAa,OAAO,CAAA,CAAE,WAAA,GAAc,SAAS,IAAI,CAAA;AACvE,MAAA,OAAA,CAAQ,KAAK,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,EAAG,GAAI,MAAA,IAAU,IAAK,CAAA;AAAA,IAClF;AACA,IAAA,MAAA,CAAO,aAAa,OAAO,CAAA;AAC3B,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,EACxB;AAAA;AAAA,EAGQ,UAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOV,gBAAA,GAAyB;AAC/B,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY;AAC/B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,MAAM,QAAA,GAAW,CAAC,GAAG,IAAA,CAAK,cAAc,IAAA,EAAM,EAC3C,GAAA,CAAI,CAAC,OAAO,MAAA,CAAO,QAAA,CAAuB,EAAE,CAAC,CAAA,CAC7C,OAAO,CAAC,CAAA,KAAyB,CAAC,CAAC,CAAC,CAAA;AACvC,IAAA,IAAA,CAAK,aAAa,sBAAA,CAAuB,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,kBAAkB,QAAQ,CAAA;AACzF,IAAA,MAAA,CAAO,gBAAA,CAAiB,KAAK,UAAA,GAAa,CAAC,KAAK,UAAA,CAAW,EAAE,CAAA,GAAI,EAAE,CAAA;AAAA,EACrE;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,OAAO,CAAA,IAAK,KAAK,aAAA,EAAe;AAC9C,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAClC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,SAAS,MAAA,CAAO,YAAA,CAAa,OAAO,CAAA,CAAE,cAAA,GAAiB,SAAS,OAAO,CAAA;AAC7E,QAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,WAAA,CAAY,EAAE,EAAA,EAAI,MAAM,OAAA,CAAQ,IAAA,EAAM,GAAG,MAAA,EAAQ,CAAA;AAAA,MACtE;AAAA,IACF;AACA,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,YAAA,GAAqB;AAG3B,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,QAAA,GAAW,CAAC,GAAG,IAAA,CAAK,cAAc,IAAA,EAAM,EAC3C,GAAA,CAAI,CAAC,OAAO,MAAA,CAAO,QAAA,CAAuB,EAAE,CAAC,CAAA,CAC7C,OAAO,CAAC,CAAA,KAAyB,CAAC,CAAC,CAAC,CAAA;AACvC,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAAW,qBAAAA,CAAsB,MAAA,EAAQ,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA;AAAA,EACzD;AAAA,EAES,MAAA,GAAe;AACtB,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,UAAA,EAAW;AAC7B,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,EAAE,CAAA;AAC/B,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,EACjB;AACF,CAAA;AAEA,IAAM,iBAAA,GAAN,cAAgCJ,SAAAA,CAAU;AAAA,EACxC,OAAgB,EAAA,GAAK,oBAAA;AAAA,EACZ,aAAA,GAAsB;AAC7B,IAAA,IAAI,KAAK,MAAA,CAAO,MAAA,CAAO,YAAY,IAAA,CAAK,MAAA,CAAQ,WAAW,aAAa,CAAA;AAAA,EAC1E;AAAA,EACS,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EACS,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AACF,CAAA;AAEA,IAAM,oBAAA,GAAN,cAAmCA,SAAAA,CAAU;AAAA,EAC3C,OAAgB,EAAA,GAAK,wBAAA;AAAA,EACb,MAAA,GAA0B,cAAA;AAAA,EACzB,QAAQ,IAAA,EAAqC;AACpD,IAAA,IAAA,CAAK,MAAA,GAAU,KAAsC,MAAA,IAAU,cAAA;AAAA,EACjE;AAAA,EACS,aAAA,GAAsB;AAC7B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,IAAA,CAAK,MAAA,CAAQ,UAAA,CAAW,UAAA,EAAY,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,EAChG;AAAA,EACS,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EACS,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AACF,CAAA;AAEA,IAAM,oBAAA,GAAN,cAAmCA,SAAAA,CAAU;AAAA,EAC3C,OAAgB,EAAA,GAAK,wBAAA;AAAA,EACZ,aAAA,GAAsB;AAC7B,IAAA,IAAI,KAAK,MAAA,CAAO,MAAA,CAAO,YAAY,IAAA,CAAK,MAAA,CAAQ,WAAW,UAAU,CAAA;AAAA,EACvE;AAAA,EACS,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EACS,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AACF,CAAA;AAEA,IAAM,cAAA,GAAN,cAA6BA,SAAAA,CAAU;AAAA,EACrC,OAAgB,EAAA,GAAK,iBAAA;AAAA,EACb,IAAA,GAA4D,IAAA;AAAA,EAC3D,QAAQ,IAAA,EAAqC;AACpD,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,IAAA,CAAK,IAAA,GAAO,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,MAAA,GAAS,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,GAAI,IAAA;AAAA,EAC3E;AAAA,EACS,aAAA,GAAsB;AAC7B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,UAAA,IAAc,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,MAAA,CAAQ,UAAA,CAAW,iBAAA,EAAmB,IAAA,CAAK,IAAI,CAAA;AAAA,EACtG;AAAA,EACS,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EACS,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AACF,CAAA;AAUA,IAAM,QAAA,GAAN,cAAuBA,SAAAA,CAAU;AAAA,EAC/B,OAAgB,EAAA,GAAK,UAAA;AAAA,EACb,MAAA,GAA0B,cAAA;AAAA,EAC1B,MAAA,GAAS,EAAA;AAAA,EACT,YAA8B,EAAC;AAAA,EAC/B,sBAAA,GAAyB,IAAIG,GAAAA,EAAI;AAAA,EACjC,MAAA;AAAA,EACA,cAAA,GAAiB,CAAA;AAAA,EAEhB,QAAQ,IAAA,EAAqC;AACpD,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAA,CAAK,MAAA,GAAU,KAAsC,MAAA,IAAU,cAAA;AAC/D,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,wBAAA,CAAyB,QAAQ,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,OAAO,iBAAA,EAAkB;AAC1C,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,KAAU;AACvC,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,qBAAA,CAAsB,KAAK,CAAA;AAC5C,MAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,sBAAA,CAAuB,KAAK,CAAA,CAAG,KAAA,EAAM,EAAG,OAAA,EAAS,IAAIV,GAAAA,CAAI,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAE;AAAA,IACpG,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,SAAS,QAAA,CAAS,MAAA,KAAW,CAAA,GAAI,QAAA,CAAS,CAAC,CAAA,GAAI,MAAA;AACpD,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,sBAAqB,GAAI,CAAA;AACpE,IAAA,IAAA,CAAK,sBAAA,GAAyB,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,CAAG,MAAA,CAAO,KAAA,EAAM,GAAI,MAAA,CAAO,sBAAA,GAA0B,KAAA,EAAM;AACvH,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,SAAA,EAAW,MAAA,CAAO,YAAA,CAAa,EAAE,KAAK,CAAA,CAAE,aAAA,GAAgB,CAAA,CAAE,KAAK,CAAA;AACpF,IAAA,SAAA,CAAU,MAAA,EAAQ,cAAA,CAAe,IAAA,CAAK,MAAM,KAAK,SAAS,CAAA;AAC1D,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,aAAA,GAAsB;AAC7B,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EACS,SAAA,GAAkB;AACzB,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EACS,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EACS,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EACS,UAAA,GAAmB;AAC1B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EACS,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AAClC,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA;AAAA,EAGQ,WAAW,SAAA,EAAqB;AACtC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,SAAA;AACzB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA;AAE1B,IAAA,MAAM,CAAA,GAAIA,GAAAA,CAAI,GAAA,CAAI,SAAA,EAAW,EAAE,OAAO,CAAA;AACtC,IAAA,OAAOA,GAAAA,CAAI,GAAA,CAAI,CAAA,EAAG,CAAC,KAAK,cAAc,CAAA;AAAA,EACxC;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,EAAE,gBAAA,EAAkB,eAAA,EAAiB,QAAA,EAAU,MAAA,KAAW,MAAA,CAAO,MAAA;AACvE,IAAA,MAAM,KAAK,IAAA,CAAK,sBAAA;AAChB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,UAAA,CAAW,gBAAgB,CAAA;AAC1C,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,UAAA,CAAW,eAAe,CAAA;AAC1C,IAAA,MAAM,KAAA,GAAQA,GAAAA,CAAI,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AAC3B,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AAGf,IAAA,IAAI,OAAO,EAAA,CAAG,CAAA;AACd,IAAA,IAAI,OAAO,EAAA,CAAG,CAAA;AACd,IAAA,IAAI,OAAO,EAAA,CAAG,IAAA;AACd,IAAA,IAAI,OAAO,EAAA,CAAG,IAAA;AACd,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,UAAW,KAAA,CAAM,CAAA;AACtC,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA,UAAW,KAAA,CAAM,CAAA;AACvC,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA,UAAW,KAAA,CAAM,CAAA;AACrC,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA,UAAW,KAAA,CAAM,CAAA;AACxC,IAAA,IAAI,MAAA,EAAQ;AAEV,MAAA,IAAI,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,UAAW,KAAA,CAAM,CAAA;AACtC,MAAA,IAAI,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA,UAAW,KAAA,CAAM,CAAA;AACvC,MAAA,IAAI,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA,UAAW,KAAA,CAAM,CAAA;AACrC,MAAA,IAAI,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA,UAAW,KAAA,CAAM,CAAA;AAAA,IAC1C;AACA,IAAA,IAAI,SAAS,EAAA,CAAG,CAAA,KAAM,IAAI,CAAA,GAAA,CAAK,IAAA,GAAO,QAAQ,EAAA,CAAG,CAAA;AACjD,IAAA,IAAI,SAAS,EAAA,CAAG,CAAA,KAAM,IAAI,CAAA,GAAA,CAAK,IAAA,GAAO,QAAQ,EAAA,CAAG,CAAA;AACjD,IAAA,MAAM,UAAA,GAAa,QAAA,KAAa,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA,CAAE,mBAAA,CAAoB,IAAA,CAAK,MAAM,CAAA,GAAI,KAAA,CAAA;AAClH,IAAA,IAAI,UAAA,IAAc,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG;AACjC,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA;AACrD,MAAA,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,MAAA,IAAU,CAAC,CAAA,GAAI,CAAA;AAClC,MAAA,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,MAAA,IAAU,CAAC,CAAA,GAAI,CAAA;AAElC,MAAA,IAAI,EAAE,QAAA,CAAS,MAAM,GAAG,IAAA,GAAO,IAAA,GAAO,GAAG,CAAA,GAAI,MAAA;AAAA,WACxC,IAAA,GAAO,IAAA,GAAO,EAAA,CAAG,CAAA,GAAI,MAAA;AAC1B,MAAA,IAAI,EAAE,QAAA,CAAS,KAAK,GAAG,IAAA,GAAO,IAAA,GAAO,GAAG,CAAA,GAAI,MAAA;AAAA,WACvC,IAAA,GAAO,IAAA,GAAO,EAAA,CAAG,CAAA,GAAI,MAAA;AAAA,IAC5B;AAEA,IAAA,MAAM,GAAA,GAAM,CAAA;AACZ,IAAA,IAAI,IAAA,GAAO,OAAO,GAAA,EAAK;AACrB,MAAA,IAAI,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,SAAU,IAAA,GAAO,GAAA;AAAA,kBAC1B,IAAA,GAAO,GAAA;AACnB,MAAA,MAAA,GAAS,GAAA,IAAO,GAAG,CAAA,IAAK,GAAA,CAAA;AAAA,IAC1B;AACA,IAAA,IAAI,IAAA,GAAO,OAAO,GAAA,EAAK;AACrB,MAAA,IAAI,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA,SAAU,IAAA,GAAO,GAAA;AAAA,kBACzB,IAAA,GAAO,GAAA;AACnB,MAAA,MAAA,GAAS,GAAA,IAAO,GAAG,CAAA,IAAK,GAAA,CAAA;AAAA,IAC1B;AACA,IAAA,MAAM,OAAA,GAAU,IAAA,GAAO,EAAA,CAAG,CAAA,GAAI,MAAA;AAC9B,IAAA,MAAM,OAAA,GAAU,IAAA,GAAO,EAAA,CAAG,CAAA,GAAI,MAAA;AAE9B,IAAA,MAAM,UAA0B,EAAC;AACjC,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,SAAA,EAAW;AACjC,MAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,IAAA;AAC1B,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA;AACtC,MAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG;AAC5B,MAAA,IAAI,cAAA;AACJ,MAAA,IAAI,KAAK,MAAA,EAAQ;AAEf,QAAA,cAAA,GAAiB,IAAIA,GAAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AAAA,MAC3C,CAAA,MAAO;AACL,QAAA,MAAM,GAAA,GAAMA,GAAAA,CAAI,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,IAAIA,GAAAA,CAAI,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACrD,QAAA,cAAA,GAAiB,IAAIA,IAAI,IAAA,GAAO,GAAA,CAAI,IAAI,MAAA,EAAQ,IAAA,GAAO,GAAA,CAAI,CAAA,GAAI,MAAM,CAAA;AAAA,MACvE;AAEA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,GAASA,GAAAA,CAAI,GAAA,CAAIA,GAAAA,CAAI,GAAA,CAAI,cAAA,EAAgB,IAAA,CAAK,cAAc,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,GAAI,cAAA;AACtG,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,qBAAA,CAAsB,KAAA,EAAO,SAAS,CAAA;AACjE,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,GAAW,KAAA,EAAO;AAAA,QACpC,QAAA,EAAU,WAAA;AAAA,QACV,MAAA,EAAQ,CAAA;AAAA,QACR,IAAA,EAAM,aAAA;AAAA,QACN,MAAA;AAAA,QACA,MAAA;AAAA,QACA,aAAA,EAAe,OAAO,MAAA,EAAO;AAAA,QAC7B,YAAA,EAAc;AAAA,OACf,CAAA;AACD,MAAA,OAAA,CAAQ,KAAK,EAAE,EAAA,EAAI,MAAM,EAAA,EAAI,IAAA,EAAM,MAAM,IAAA,EAAM,CAAA,EAAG,WAAA,CAAY,CAAA,EAAG,GAAG,WAAA,CAAY,CAAA,EAAG,GAAI,MAAA,IAAU,IAAK,CAAA;AAAA,IACxG;AACA,IAAA,MAAA,CAAO,aAAa,OAAO,CAAA;AAAA,EAC7B;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,SAAA,EAAW;AACjC,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,MAAM,EAAE,CAAA;AAC7C,MAAA,IAAI,OAAA,SAAgB,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA,CAAE,WAAA,GAAc,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA;AAAA,IAChF;AACA,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AACF,CAAA;AAEA,IAAM,QAAA,GAAN,cAAuBO,SAAAA,CAAU;AAAA,EAC/B,OAAgB,EAAA,GAAK,UAAA;AAAA,EACb,MAAA,GAAS,EAAA;AAAA,EACT,MAAA,GAAS,IAAIP,GAAAA,EAAI;AAAA,EACjB,UAAA,GAAa,CAAA;AAAA,EACb,gBAA+E,EAAC;AAAA,EAE/E,OAAA,GAAgB;AACvB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,wBAAA,CAAyB,QAAQ,CAAA;AACtD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,sBAAA,EAAuB,CAAG,MAAA;AAC/C,IAAA,IAAA,CAAK,aAAaA,GAAAA,CAAI,KAAA,CAAM,KAAK,MAAA,EAAQ,MAAA,CAAO,OAAO,eAAe,CAAA;AACtE,IAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,iBAAA,EAAkB,CAAE,GAAA,CAAI,CAAC,KAAA,KAAU;AAC7D,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,qBAAA,CAAsB,KAAK,CAAA;AAC5C,MAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,IAAIA,GAAAA,CAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,cAAc,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAE;AAAA,IACjF,CAAC,CAAA;AACD,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,aAAA,EAAe,MAAA,CAAO,YAAA,CAAa,EAAE,KAAK,CAAA,CAAE,aAAA,GAAgB,CAAA,CAAE,KAAK,CAAA;AACxF,IAAA,SAAA,CAAU,QAAQ,UAAU,CAAA;AAAA,EAC9B;AAAA,EAES,aAAA,GAAsB;AAC7B,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EACS,SAAA,GAAkB;AACzB,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EACS,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EACS,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EACS,UAAA,GAAmB;AAC1B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EACS,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AAClC,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAI,KAAA,GAAQA,IAAI,KAAA,CAAM,IAAA,CAAK,QAAQ,MAAA,CAAO,MAAA,CAAO,gBAAgB,CAAA,GAAI,IAAA,CAAK,UAAA;AAC1E,IAAA,IAAI,MAAA,CAAO,OAAO,QAAA,EAAU;AAC1B,MAAA,MAAM,IAAA,GAAO,KAAK,EAAA,GAAK,EAAA;AAEvB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,CAAC,GAAG,YAAA,IAAgB,CAAA;AACpD,MAAA,KAAA,GAAQ,KAAK,KAAA,CAAA,CAAO,IAAA,GAAO,KAAA,IAAS,IAAI,IAAI,IAAA,GAAO,IAAA;AAAA,IACrD;AACA,IAAA,MAAM,UAA0B,EAAC;AACjC,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,aAAA,EAAe;AAClC,MAAA,MAAM,aAAaA,GAAAA,CAAI,OAAA,CAAQ,EAAE,OAAA,EAAS,IAAA,CAAK,QAAQ,KAAK,CAAA;AAC5D,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,qBAAA,CAAsB,CAAA,CAAE,OAAO,UAAU,CAAA;AACpE,MAAA,MAAM,IAAA,GAAO,EAAE,GAAG,CAAA,CAAE,OAAO,CAAA,EAAG,WAAA,CAAY,CAAA,EAAG,CAAA,EAAG,YAAY,CAAA,EAAG,QAAA,EAAU,CAAA,CAAE,KAAA,CAAM,WAAW,KAAA,EAAM;AAClG,MAAA,MAAM,MAAA,GAAS,OAAO,YAAA,CAAa,CAAA,CAAE,KAAK,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,KAAA,EAAO,IAAI,CAAA;AACpE,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,EAAA,EAAI,CAAA,CAAE,MAAM,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,QAAA,EAAU,IAAA,CAAK,UAAU,GAAI,MAAA,IAAU,EAAC,EAAI,CAAA;AAAA,IACvH;AACA,IAAA,MAAA,CAAO,aAAa,OAAO,CAAA;AAAA,EAC7B;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,aAAA,EAAe;AAClC,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,MAAM,EAAE,CAAA;AAC1C,MAAA,IAAI,OAAA,SAAgB,YAAA,CAAa,CAAA,CAAE,KAAK,CAAA,CAAE,WAAA,GAAc,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA;AAAA,IAC1E;AACA,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AACF,CAAA;AAEA,IAAM,cAAA,GAAN,cAA6BO,SAAAA,CAAU;AAAA,EACrC,OAAgB,EAAA,GAAK,iBAAA;AAAA,EACb,MAAA,GAAS,EAAA;AAAA,EACT,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY,CAAA;AAAA,EAEX,QAAQ,IAAA,EAAqC;AACpD,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,MAAA,CAAO,QAAA,CAAS,EAAE,KAAA,CAAM,EAAE,KAAK,CAAA,CAAE,KAAA;AACnD,IAAA,IAAA,CAAK,SAAS,CAAA,CAAE,MAAA;AAChB,IAAA,IAAA,CAAK,SAAA,GAAY,YAAY,GAAA,EAAI;AACjC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,wBAAA,CAAyB,aAAa,CAAA;AAChE,IAAA,SAAA,CAAU,IAAA,CAAK,QAAQ,UAAU,CAAA;AACjC,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,aAAA,GAAsB;AAC7B,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EACS,SAAA,GAAkB;AACzB,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EACS,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EACS,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EACS,UAAA,GAAmB;AAC1B,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EACS,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AAClC,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,MAAM,EAAE,CAAA;AAC7C,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,QAAQ,MAAA,CAAO,oBAAA,CAAqB,OAAA,EAAS,MAAA,CAAO,OAAO,gBAAgB,CAAA;AACjF,IAAA,MAAM,MAAA,GAAsB,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,KAAA,CAAM,CAAA,EAAG,CAAA,EAAG,KAAA,CAAM,CAAA,EAAE;AACrE,IAAA,MAAM,SAAA,GAAY,OAAO,MAAA,CAAO,MAAA,IAAU,YAAY,GAAA,EAAI,GAAI,KAAK,SAAA,GAAY,IAAA;AAC/E,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,CAAa,OAAO,CAAA,CAAE,YAAA,GAAe,OAAA,EAAS,EAAE,MAAA,EAAQ,SAAA,EAAW,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA;AAC9G,IAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,WAAA,CAAY,EAAE,EAAA,EAAI,OAAA,CAAQ,EAAA,EAAI,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,GAAG,MAAA,EAAQ,CAAA;AAAA,EAClF;AACF,CAAA;AAGO,IAAM,UAAA,GAAN,cAAyBA,SAAAA,CAAU;AAAA,EACxC,OAAgB,EAAA,GAAK,QAAA;AAAA,EACrB,OAAgB,OAAA,GAAU,MAAA;AAAA,EAC1B,OAAgB,WAAW,MAA8B;AAAA,IACvDD,MAAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA,oBAAA;AAAA,IACA,oBAAA;AAAA,IACA,cAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;ACtwBA,IAAMA,MAAAA,GAAN,cAAmBC,SAAAA,CAAU;AAAA,EAC3B,OAAgB,EAAA,GAAK,MAAA;AAAA,EAEZ,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,MAAA,EAAQ,EAAE,MAAM,OAAA,EAAS,QAAA,EAAU,CAAA,EAAE,EAAG,CAAA;AAAA,EAC5E;AAAA,EAES,cAAc,IAAA,EAA8B;AACnD,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,MAAA,CAAO,MAAA;AACnC,IAAA,MAAA,CAAO,yBAAyB,aAAa,CAAA;AAC7C,IAAA,MAAM,KAAKC,aAAAA,EAAc;AACzB,IAAA,MAAA,CAAO,WAAA,CAAY;AAAA,MACjB,EAAA;AAAA,MACA,IAAA,EAAM,MAAA;AAAA,MACN,GAAG,eAAA,CAAgB,CAAA;AAAA,MACnB,GAAG,eAAA,CAAgB,CAAA;AAAA,MACnB,KAAA,EAAO,EAAE,IAAA,EAAM,EAAA,EAAI,UAAU,IAAA;AAAK,KACnC,CAAA;AACD,IAAA,MAAA,CAAO,OAAO,EAAE,CAAA;AAChB,IAAA,MAAA,CAAO,gBAAgB,EAAE,CAAA;AACzB,IAAA,IAAI,CAAC,MAAA,CAAO,gBAAA,GAAmB,YAAA,EAAc,MAAA,CAAO,eAAe,QAAQ,CAAA;AAAA,EAC7E;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,eAAe,QAAQ,CAAA;AAAA,EACrC;AACF,CAAA;AAGO,IAAM,QAAA,GAAN,cAAuBD,SAAAA,CAAU;AAAA,EACtC,OAAgB,EAAA,GAAK,MAAA;AAAA,EACrB,OAAgB,OAAA,GAAU,MAAA;AAAA,EAC1B,OAAgB,QAAA,GAAW,MAA8B,CAACD,MAAI,CAAA;AAChE;;;ACFO,IAAM,iBAAA,GAA4C;AAAA,EACvD,OAAA;AAAA,EACA,QAAA;AAAA,EACA,kBAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF;AAQO,IAAM,eAAuC,CAAC,UAAA,EAAY,UAAU,UAAA,EAAY,SAAA,EAAW,GAAG,iBAAiB;AChDtH,SAASvE,YAAW,CAAA,EAAgC;AAClD,EAAA,OAAO,CAAA,YAAa,gBAAgB,CAAA,CAAE,OAAA,KAAY,WAAW,CAAA,CAAE,OAAA,KAAY,cAAc,CAAA,CAAE,iBAAA,CAAA;AAC7F;AASO,SAAS,kBAAA,CAAmB,MAAA,EAAuB,YAAA,EAA6C,OAAA,EAAwC;AAC7I,EAAAR,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,UAAA,GAAa,sCAAA,CAAuC,MAAA,EAAQ,OAAA,IAAW,EAAE,CAAA;AAC/E,IAAA,OAAO,UAAA;AAAA,EAET,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,KAAK,YAAA,CAAa,OAAA;AACxB,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,EAAA,EAAI;AAEpB,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAkB,MAAA,CAAO,YAAA,CAAa,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA;AAEvF,IAAA,MAAM,UAAA,GAAa,CAAC,IAAA,EAA0B,KAAA,KAAqC;AACjF,MAAA,IAAI,CAAC,IAAA,IAAQ,iBAAA,EAAkB,EAAG,OAAO,KAAA;AACzC,MAAA,MAAM,IAAA,GAAO,oBAAA,CAAqB,IAAA,EAAM,KAAK,CAAA;AAC7C,MAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,MAAA,KAAK,MAAA,CAAO,mBAAmB,IAAI,CAAA;AACnC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,iBAAA,GAAoB,MAAM,CAAC,CAAC,OAAO,iBAAA,EAAkB,IAAKQ,WAAAA,CAAW,QAAA,CAAS,aAAa,CAAA;AAEjG,IAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAiB;AACnC,MAAA,IAAI,CAAC,EAAE,YAAA,EAAc;AACrB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,aAAa,UAAA,GAAa,MAAA;AAAA,IAC9B,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAiB;AAC/B,MAAA,MAAM,KAAK,CAAA,CAAE,YAAA;AACb,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAM,KAAA,GAAQ,UAAU,CAAC,CAAA;AACzB,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA;AACjC,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,KAAK,OAAO,kBAAA,CAAmB,EAAE,MAAM,OAAA,EAAS,KAAA,EAAO,OAAO,CAAA;AAC9D,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAM,EAAA,CAAG,OAAA,CAAQ,eAAe,CAAA,CAAE,MAAM,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,MAAM,CAAA,IAAK,CAAC,CAAA,CAAE,UAAA,CAAW,GAAG,CAAC,CAAA;AAC1F,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,KAAK,OAAO,kBAAA,CAAmB,EAAE,MAAM,KAAA,EAAO,GAAA,EAAK,OAAO,CAAA;AAC1D,QAAA;AAAA,MACF;AACA,MAAA,UAAA,CAAW,EAAA,CAAG,OAAA,CAAQ,YAAY,CAAA,EAAG,KAAK,CAAA;AAAA,IAC5C,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAsB;AACrC,MAAA,IAAIA,WAAAA,CAAW,CAAA,CAAE,MAAM,CAAA,IAAK,mBAAkB,EAAG;AACjD,MAAA,MAAM,KAAK,CAAA,CAAE,aAAA;AACb,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA;AACjC,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,KAAK,OAAO,kBAAA,CAAmB,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AACvD,QAAA;AAAA,MACF;AACA,MAAA,IAAI,WAAW,EAAA,CAAG,OAAA,CAAQ,YAAY,CAAC,CAAA,IAAK,cAAA,EAAe;AAAA,IAC7D,CAAA;AAKA,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AACtC,MAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,IAAA,CAAK,SAAA,CAAU,YAAY,EAAE,CAAA;AAC7D,MAAA,MAAM,KAAA,GAAQ,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,OAAA;AACpC,MAAA,IAAI,CAAC,KAAA,IAAS,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,KAAM,GAAA,IAAOA,WAAAA,CAAW,CAAA,CAAE,MAAM,CAAA,IAAK,iBAAA,EAAkB,EAAG;AAC1F,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,IAAI,CAAC,CAAA,CAAE,gBAAA,IAAoB,CAAC,SAAA,CAAU,WAAW,IAAA,EAAM;AACvD,QAAA,SAAA,CAAU,SAAA,CAAU,MAAK,CAAE,IAAA;AAAA,UACzB,OAAO,KAAA,KAAU;AACf,YAAA,MAAM,QAAgB,EAAC;AACvB,YAAA,IAAI,IAAA;AACJ,YAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,cAAA,MAAM,SAAA,GAAY,KAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,QAAQ,CAAC,CAAA;AAC/D,cAAA,IAAI,SAAA,EAAW;AACb,gBAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AACzC,gBAAA,KAAA,CAAM,KAAK,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG,UAAU,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,KAAK,KAAK,CAAA,CAAA,EAAI,EAAE,IAAA,EAAM,SAAA,EAAW,CAAC,CAAA;AAAA,cAChG,WAAW,IAAA,CAAK,KAAA,CAAM,SAAS,YAAY,CAAA,IAAK,SAAS,MAAA,EAAW;AAClE,gBAAA,IAAA,GAAO,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAY,GAAG,IAAA,EAAK;AAAA,cACvD;AAAA,YACF;AACA,YAAA,IAAI,KAAA,CAAM,QAAQ,KAAK,MAAA,CAAO,mBAAmB,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,4BACzD,IAAI,CAAA;AAAA,UACtB,CAAA;AAAA,UACA,MAAM;AAAA,UAEN;AAAA,SACF;AAAA,MACF,GAAG,CAAC,CAAA;AAAA,IACN,CAAA;AAEA,IAAA,EAAA,CAAG,gBAAA,CAAiB,YAAY,UAAU,CAAA;AAC1C,IAAA,EAAA,CAAG,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AAClC,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,IAAA,MAAA,CAAO,iBAAiB,SAAA,EAAW,SAAA,EAAW,EAAE,OAAA,EAAS,MAAM,CAAA;AAC/D,IAAA,OAAO,MAAM;AACX,MAAA,EAAA,CAAG,mBAAA,CAAoB,YAAY,UAAU,CAAA;AAC7C,MAAA,EAAA,CAAG,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AACrC,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,MAAA,MAAA,CAAO,oBAAoB,SAAA,EAAW,SAAA,EAAW,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,IACpE,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAY,CAAC,CAAA;AAC3B;ACgBA,IAAM,mBAAgC,EAAC;AAGhC,SAAS,SAAS,KAAA,EAAsB;AAC7C,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,gBAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AACJ,EAAA,MAAM,YAAA,GAAeV,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIC,SAAwB,IAAI,CAAA;AAExD,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,IAAI,EAAA,GAAoB,IAAA;AACxB,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,UAAA;AACJ,IAAA,UAAA,EAAW,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AAC5B,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAA,CAAO,OAAA,EAAQ;AACf,QAAA;AAAA,MACF;AACA,MAAA,MAAM,gBAAgB,CAAC,GAAG,mBAAmB,GAAI,UAAA,IAAc,EAAG,CAAA;AAClE,MAAA,MAAM,kBAAkB,CAAC,GAAG,qBAAqB,GAAI,YAAA,IAAgB,EAAG,CAAA;AACxE,MAAA,EAAA,GAAK,IAAI8E,QAAAA,CAAO;AAAA;AAAA;AAAA;AAAA,QAId,KAAA,EAAO,KAAA,IAASO,WAAAA,CAAY,EAAE,YAAY,aAAA,EAAe,YAAA,EAAc,eAAA,EAAiB,GAAI,SAAS,EAAE,MAAA,EAAO,GAAI,IAAK,CAAA;AAAA,QACvH,UAAA,EAAY,aAAA;AAAA,QACZ,YAAA,EAAc,eAAA;AAAA,QACd,OAAO,CAAC,GAAG,cAAc,GAAI,KAAA,IAAS,EAAG,CAAA;AAAA;AAAA;AAAA;AAAA,QAIzC,cAAc,YAAA,IAAgB,mBAAA;AAAA,QAC9B,MAAA;AAAA,QACA,GAAI,YAAA,GAAe,EAAE,YAAA,KAAiB,EAAC;AAAA,QACvC,YAAA,EAAc,MAAM,YAAA,CAAa,OAAA;AAAA,QACjC,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW,EAAC;AAAA,QAC3B,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW,EAAC;AAAA,QAC3B,GAAI,YAAA,GAAe,EAAE,YAAA,KAAiB,EAAC;AAAA,QACvC,GAAI,WAAA,GAAc,EAAE,WAAA,KAAgB,EAAC;AAAA,QACrC,GAAI,WAAA,GAAc,EAAE,WAAA,KAAgB,EAAC;AAAA,QACrC,GAAI,IAAA,GAAO,EAAE,IAAA,KAAS,EAAC;AAAA,QACvB,GAAI,OAAA,GAAU,EAAE,OAAA,KAAY;AAAC,OAC9B,CAAA;AACD,MAAA,SAAA,CAAU,EAAE,CAAA;AAIZ,MAAA,EAAA,CAAG,KAAK,OAAO,CAAA;AACf,MAAA,OAAA,GAAU,UAAU,EAAE,CAAA;AAAA,IACxB,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,UAAA,IAAa;AACb,MAAA,UAAA,GAAa,MAAA;AACb,MAAA,OAAA,IAAU;AACV,MAAA,EAAA,EAAI,OAAA,EAAQ;AACZ,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,IAChB,CAAA;AAAA,EAEF,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAIV,EAAA,oBAAA,CAAqB,MAAA,EAAQ,EAAE,KAAA,EAAO,MAAA,KAAW,MAAM,CAAA;AACvD,EAAA,kBAAA,CAAmB,QAAQ,YAAY,CAAA;AAIvC,EAAA,MAAM,MAAA,GAAShE,OAAAA;AAAA,IACb,MACE,MAAA,mBACEnB,GAAAA,CAAC,UAAO,MAAA,EAAiB,GAAI,gBAAA,GAAmB,EAAE,YAAY,gBAAA,EAAiB,GAAI,EAAC,EACjF,UACH,CAAA,GACE,IAAA;AAAA,IACN,CAAC,MAAA,EAAQ,gBAAA,EAAkB,QAAQ;AAAA,GACrC;AAEA,EAAA,uBACEA,IAAC,iBAAA,EAAA,EAAkB,SAAA,EAAW,aAAa,gBAAA,EACzC,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAA,EAAc,WAAsB,KAAA,EAAO,EAAE,UAAU,UAAA,EAAY,KAAA,EAAO,QAAQ,MAAA,EAAQ,MAAA,EAAQ,GAAG,KAAA,EAAM,EAClH,QAAA,EAAA,MAAA;AAAA;AAAA;AAAA;AAAA,oBAICA,GAAAA,CAAC,cAAA,EAAA,EAAe,MAAA,EACd,QAAA,kBAAAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACE,GAAI,UAAA,GAAa,EAAE,UAAA,KAA6C,EAAC;AAAA,QACjE,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,QACjC,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,QACjC,GAAI,WAAA,GAAc,EAAE,WAAA,KAAgB,EAAC;AAAA,QACtC,QAAQ,MAAA,KAAW,IAAA;AAAA,QAElB,QAAA,EAAA;AAAA;AAAA,KACH,EACF;AAAA,sBAEAA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,OAAO,CAAA,EAAG,OAAA,EAAS,QAAQ,UAAA,EAAY,QAAA,EAAU,OAAO,SAAA,EAAW,UAAA,EAAY,aAAY,EAAG,QAAA,EAAA,sBAAA,EAAe,GAErJ,CAAA,EACF,CAAA;AAEJ;ACpPA,IAAM,mBAAA,GAAuC,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AASvD,SAAS,kBAAA,CAAmB,IAAA,EAAuB,GAAA,GAAM,QAAA,EAA2B;AACzF,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAC5B,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAC5B,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAC9C,EAAA,OAAO,EAAE,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,KAAK,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,KAAK,CAAA,EAAE;AAC9D;AAUA,eAAsB,cACpB,IAAA,EACA,KAAA,EACA,MAAA,EACA,IAAA,GAA4C,EAAC,EAC9B;AACf,EAAA,IAAI,OAAO,iBAAA,KAAsB,UAAA,IAAc,OAAO,eAAA,KAAoB,aAAa,OAAO,IAAA;AAC9F,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,IAAI,CAAA;AAC3C,IAAA,IAAI,MAAA,CAAO,KAAA,IAAS,KAAA,IAAS,MAAA,CAAO,UAAU,MAAA,EAAQ;AACpD,MAAA,MAAA,CAAO,KAAA,EAAM;AACb,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,SAAS,IAAI,eAAA,CAAgB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,MAAM,CAAC,CAAC,CAAA;AAClG,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AACtC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAA,CAAO,KAAA,EAAM;AACb,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAA,CAAQ,UAAU,MAAA,EAAQ,CAAA,EAAG,GAAG,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AAC3D,IAAA,MAAA,CAAO,KAAA,EAAM;AACb,IAAA,OAAO,MAAM,MAAA,CAAO,aAAA,CAAc,EAAE,MAAM,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,IAAQ,WAAA,EAAa,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,MAAM,CAAA;AAAA,EAClH,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AASA,eAAsB,aAAA,CAAc,KAAa,IAAA,EAAuC;AACtF,EAAA,IAAI,QAAQ,OAAO,iBAAA,KAAsB,UAAA,IAAc,IAAA,CAAK,SAAS,eAAA,EAAiB;AACpF,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,IAAI,CAAA;AAC3C,MAAA,MAAM,OAAO,EAAE,CAAA,EAAG,OAAO,KAAA,EAAO,CAAA,EAAG,OAAO,MAAA,EAAO;AACjD,MAAA,MAAA,CAAO,KAAA,EAAM;AACb,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,IAAI,OAAO,KAAA,KAAU,WAAA,EAAa,OAAO,mBAAA;AACzC,EAAA,OAAO,IAAI,OAAA,CAAyB,CAAC,OAAA,KAAY;AAC/C,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,IAAA,GAAA,CAAI,MAAA,GAAS,MAAM,OAAA,CAAQ,EAAE,GAAG,GAAA,CAAI,YAAA,IAAgB,mBAAA,CAAoB,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,aAAA,IAAiB,mBAAA,CAAoB,GAAG,CAAA;AAC1H,IAAA,GAAA,CAAI,OAAA,GAAU,MAAM,OAAA,CAAQ,mBAAmB,CAAA;AAC/C,IAAA,GAAA,CAAI,GAAA,GAAM,GAAA;AAAA,EACZ,CAAC,CAAA;AACH;AAGA,IAAM,4BAAA,GAA+B,KAAK,IAAA,GAAO,IAAA;AAS1C,SAAS,sBAAA,CAAuB,MAAA,EAAgB,IAAA,EAAY,OAAA,EAAuD;AACxH,EAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAK,eAAe,4BAAA,EAA8B,sBAAA,EAAwB,wBAAuB,GAAI,OAAA;AAErH,EAAA,IAAI,YAAA,KAAiB,MAAA,IAAa,IAAA,CAAK,IAAA,GAAO,YAAA,EAAc;AAC1D,IAAA,MAAA,CAAO,QAAA,CAAS;AAAA,MACd,KAAA,EAAO,IAAI,2BAA2B,CAAA;AAAA,MACtC,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT;AAKA,EAAA,MAAM,QAAA,GAAW,CAAC,GAAI,sBAAA,IAA0B,EAAC,EAAI,GAAI,sBAAA,IAA0B,EAAG,CAAA;AACtF,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,GAAS,CAAA,GAAI,SAAS,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,WAAA,OAAkB,IAAA,CAAK,IAAA,CAAK,aAAa,CAAA,GAAI,OAAO,uBAAA,CAAwB,IAAA,CAAK,IAAI,CAAA,KAAM,MAAA;AAE9J,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAA,CAAO,QAAA,CAAS;AAAA,MACd,KAAA,EAAO,IAAI,+BAA+B,CAAA;AAAA,MAC1C,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAWA,eAAsB,qBAAA,CAAsB,MAAA,EAAgB,MAAA,EAAiB,QAAA,EAAuC;AAClH,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AACjC,EAAA,MAAM,MAAiB,EAAC;AACxB,EAAA,MAAM,WAAA,GAAc,EAAA;AAEpB,EAAA,MAAA,CAAO,IAAI,MAAM;AACf,IAAA,MAAA,CAAO,aAAa,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,IAAI,KAAA,CAAM,EAAA,EAAI,MAAM,KAAA,CAAM,IAAA,EAAM,OAAO,KAAA,CAAM,KAAA,EAAO,MAAM,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA;AACrH,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,CAAC,OAAO,KAAA,KAAU;AAC9C,MAAA,MAAM,SAAA,GAAY,OAAO,wBAAA,GAA2B,KAAA,CAAM,IAAI,CAAA,EAAG,IAAA,IAAQ,kBAAkB,KAAK,CAAA;AAChG,MAAA,IAAI,CAAC,SAAA,EAAW,OAAO,EAAC;AACxB,MAAA,MAAM,KAAK+E,aAAAA,EAAc;AACzB,MAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,MAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,YAAY,KAAK,CAAA;AAClC,MAAA,OAAO;AAAA,QACL;AAAA,UACE,EAAA;AAAA,UACA,IAAA,EAAM,SAAA;AAAA,UACN,CAAA,EAAG,QAAA,CAAS,CAAA,GAAI,CAAA,GAAI,IAAI,KAAA,GAAQ,WAAA;AAAA,UAChC,CAAA,EAAG,QAAA,CAAS,CAAA,GAAI,CAAA,GAAI,IAAI,KAAA,GAAQ,WAAA;AAAA,UAChC,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,OAAA,EAAS,MAAM,EAAA;AAAG;AACnC,OACF;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAA,CAAO,aAAa,MAAe,CAAA;AACnC,MAAA,MAAA,CAAO,kBAAkB,GAAG,CAAA;AAAA,IAC9B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,kBAAkB,KAAA,EAAkC;AAC3D,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS,OAAO,OAAA;AACnC,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS,OAAO,OAAA;AACnC,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,UAAA,EAAY,OAAO,UAAA;AACtC,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,YAAY,KAAA,EAA+B;AAClD,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,EAAA,IAAI,OAAO,MAAM,CAAA,KAAM,QAAA,IAAY,OAAO,KAAA,CAAM,CAAA,KAAM,YAAY,KAAA,CAAM,CAAA,GAAI,KAAK,KAAA,CAAM,CAAA,GAAI,GAAG,OAAO,EAAE,GAAG,KAAA,CAAM,CAAA,EAAG,CAAA,EAAG,KAAA,CAAM,CAAA,EAAE;AAE9H,EAAA,OAAO,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAC1B;;;AClKA,IAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,EAC3B,KAAA;AAAA,EAAO,GAAA;AAAA,EAAK,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,UAAA;AAAA,EAAY,OAAA;AAAA,EAClE,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,MAAA;AAAA,EAAQ,UAAA;AAAA,EAAY,SAAA;AAAA,EACzD,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,UAAA;AAAA,EAAY,MAAA;AAAA,EAC7B,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,MAAA;AAAA,EAAQ,UAAA;AAAA,EAAY,gBAAA;AAAA,EAAkB,gBAAA;AAAA,EAAkB,MAAA;AAAA,EAC7E,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,eAAA;AAAA,EACnB,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,eAAA;AAAA,EAAiB,qBAAA;AAAA,EAAuB,aAAA;AAAA,EAAe,kBAAA;AAAA,EAC5E,mBAAA;AAAA,EAAqB,mBAAA;AAAA,EAAqB,gBAAA;AAAA,EAAkB,cAAA;AAAA,EAAgB,SAAA;AAAA,EAAW,SAAA;AAAA,EACvF,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,gBAAA;AAAA,EAAkB,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,aAAA;AAAA,EACzE,cAAA;AAAA,EAAgB,UAAA;AAAA,EAAY,cAAA;AAAA,EAAgB,oBAAA;AAAA,EAAsB,aAAA;AAAA,EAAe,QAAA;AAAA,EAAU,cAAA;AAAA,EAC3F;AACF,CAAC,CAAA;AAGD,IAAM,aAAA,mBAAgB,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,QAAA,EAAU,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAc,GAAG,CAAC,CAAA;AAGpL,IAAM,iCAAiB,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,YAAA,EAAc,KAAK,CAAC,CAAA;AAG5D,IAAM,oCAAoB,IAAI,GAAA,CAAI,CAAC,cAAA,EAAgB,SAAA,EAAW,YAAY,CAAC,CAAA;AAE3E,IAAM,gBAAA,GAAmB,uBAAA;AACzB,IAAM,aAAA,GAAgB,WAAA;AAUf,SAAS,YAAY,OAAA,EAAgC;AAC1D,EAAA,IAAI,OAAO,cAAc,WAAA,EAAa;AAIpC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAS,IAAI,SAAA,EAAU,CAAE,eAAA,CAAgB,SAAS,eAAe,CAAA;AACvE,EAAA,IAAI,OAAO,oBAAA,CAAqB,aAAa,CAAA,CAAE,MAAA,GAAS,GAAG,OAAO,IAAA;AAClE,EAAA,MAAM,OAAO,MAAA,CAAO,eAAA;AACpB,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,QAAQ,WAAA,EAAY,KAAM,OAAO,OAAO,IAAA;AAE1D,EAAA,eAAA,CAAgB,MAAM,KAAK,CAAA;AAC3B,EAAA,IAAI,IAAA,CAAK,WAAW,MAAA,KAAW,CAAA,IAAK,KAAK,UAAA,CAAW,MAAA,KAAW,GAAG,OAAO,IAAA;AACzE,EAAA,OAAO,IAAI,aAAA,EAAc,CAAE,iBAAA,CAAkB,IAAI,CAAA;AACnD;AAGA,SAAS,eAAA,CAAgB,SAAkB,eAAA,EAAgC;AACzE,EAAA,KAAA,MAAW,SAAA,IAAa,CAAC,GAAG,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC/C,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,WAAA,EAAY;AACxC,IAAA,MAAM,QAAQ,SAAA,CAAU,KAAA;AAGxB,IAAA,IAAI,KAAK,UAAA,CAAW,IAAI,KAAK,iBAAA,CAAkB,GAAA,CAAI,IAAI,CAAA,EAAG;AACxD,MAAA,OAAA,CAAQ,eAAA,CAAgB,UAAU,IAAI,CAAA;AACtC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA,EAAG;AAC5B,MAAA,IAAI,CAAC,aAAa,OAAA,CAAQ,OAAA,EAAS,KAAK,CAAA,EAAG,OAAA,CAAQ,eAAA,CAAgB,SAAA,CAAU,IAAI,CAAA;AACjF,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,KAAS,OAAA,IAAW,YAAA,CAAa,KAAK,CAAA,EAAG;AAC3C,MAAA,OAAA,CAAQ,YAAA,CAAa,OAAA,EAAS,WAAA,CAAY,KAAK,CAAC,CAAA;AAChD,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,KAAA,IAAS,CAAC,GAAG,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC3C,IAAA,IAAI,KAAA,CAAM,aAAa,CAAA,EAAc;AACnC,MAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY,KAAM,OAAA,EAAS;AAC7C,QAAA,KAAA,CAAM,SAAA,GAAY,WAAA,CAAY,KAAA,CAAM,SAAA,IAAa,EAAE,CAAA;AAAA,MACrD;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,CAAM,aAAa,CAAA,EAAiB;AAEtC,MAAA,OAAA,CAAQ,YAAY,KAAK,CAAA;AACzB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,YAAA,GAAe,KAAA;AACrB,IAAA,MAAM,MAAM,YAAA,CAAa,OAAA;AACzB,IAAA,MAAM,kBAAA,GAAqB,eAAA,IAAmB,GAAA,CAAI,WAAA,EAAY,KAAM,eAAA;AACpE,IAAA,MAAM,UAAU,eAAA,GAAkB,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,aAAa,CAAA,GAAI,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,IAAK,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,aAAa,CAAA;AACpI,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,CAAQ,YAAY,KAAK,CAAA;AACzB,MAAA;AAAA,IACF;AACA,IAAA,eAAA,CAAgB,cAAc,kBAAkB,CAAA;AAAA,EAClD;AACF;AAGA,SAAS,YAAA,CAAa,SAAiB,KAAA,EAAwB;AAC7D,EAAA,MAAM,GAAA,GAAM,MAAM,IAAA,EAAK;AACvB,EAAA,MAAM,GAAA,GAAM,QAAQ,WAAA,EAAY;AAGhC,EAAA,IAAI,GAAA,KAAQ,KAAA,EAAO,OAAO,aAAA,CAAc,KAAK,GAAG,CAAA;AAGhD,EAAA,IAAI,QAAQ,OAAA,IAAW,GAAA,KAAQ,WAAW,OAAO,GAAA,CAAI,WAAW,aAAa,CAAA;AAC7E,EAAA,IAAI,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,OAAO,gBAAA,CAAiB,KAAK,GAAG,CAAA;AAClC;AAEA,IAAM,UAAA,GAAa,oDAAA;AAEnB,SAAS,aAAa,GAAA,EAAsB;AAC1C,EAAA,OAAO,UAAA,CAAW,KAAK,GAAG,CAAA;AAC5B;AAQA,SAAS,YAAY,GAAA,EAAqB;AACxC,EAAA,OAAO,GAAA,CACJ,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA,CAC9B,OAAA,CAAQ,0BAAA,EAA4B,EAAE,CAAA,CACtC,OAAA,CAAQ,sCAAA,EAAwC,MAAM,CAAA;AAC3D;;;AC9HA,SAAS,aAAA,CAAc,QAAgB,KAAA,EAAqC;AAC1E,EAAA,OAAO,KAAA,IAAS,OAAO,qBAAA,EAAsB;AAC/C;AAGA,eAAsB,gCAAA,CAAiC,QAAgB,IAAA,EAAiD;AACtH,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK;AAC5B,EAAA,IAAI,CAAC,IAAA,EAAM;AACX,EAAA,MAAA,CAAO,yBAAyB,aAAa,CAAA;AAC7C,EAAA,iBAAA,CAAkB,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,KAAK,CAAA;AAC5C;AASA,eAAsB,mCAAA,CAAoC,QAAgB,IAAA,EAAiD;AACzH,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,IAAA,EAAM;AACX,EAAA,MAAA,CAAO,yBAAyB,YAAY,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,4BAA4B,IAAI,CAAA;AAC9C,EAAA,MAAM,qBAAA,CAAsB,QAAQ,CAAC,KAAK,GAAG,aAAA,CAAc,MAAA,EAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AAChF;AAGA,eAAsB,iCAAA,CAAkC,QAAgB,IAAA,EAAgD;AACtH,EAAA,IAAI,CAAC,MAAA,CAAO,YAAA,CAAa,OAAO,CAAA,EAAG;AACjC,IAAA,MAAM,gCAAgC,MAAA,EAAQ,EAAE,GAAA,EAAK,IAAA,CAAK,KAAK,GAAI,IAAA,CAAK,KAAA,GAAQ,EAAE,OAAO,IAAA,CAAK,KAAA,EAAM,GAAI,IAAK,CAAA;AAC7G,IAAA;AAAA,EACF;AACA,EAAA,MAAA,CAAO,yBAAyB,cAAc,CAAA;AAC9C,EAAA,MAAM,EAAE,gBAAA,EAAApD,iBAAAA,EAAiB,GAAI,MAAM,OAAO,0BAAc,CAAA;AACxD,EAAAA,iBAAAA,CAAiB,MAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,KAAK,KAAK,CAAA;AAC/C;AAUA,eAAsB,kCAAA,CACpB,QACA,IAAA,EACe;AACf,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,MAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,EAAG;AAChD,EAAA,MAAA,CAAO,yBAAyB,OAAO,CAAA;AACvC,EAAA,MAAA,CAAO,yBAAA,CAA0B,OAAA,EAAkB,IAAA,CAAK,KAAA,GAAQ,EAAE,OAAO,IAAA,CAAK,KAAA,EAAM,GAAI,EAAE,CAAA;AAC5F;AAUA,eAAsB,gCAAA,CACpB,MAAA,EACA,IAAA,EACA,IAAA,EACe;AACf,EAAA,MAAM,SAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,IAAA,IAAI,CAAC,sBAAA,CAAuB,MAAA,EAAQ,IAAA,EAAM,IAAI,CAAA,EAAG;AACjD,IAAA,MAAM,KAAA,GAAQ,MAAM,8BAAA,CAA+B,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK,EAAG,IAAI,CAAA;AACvF,IAAA,IAAI,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,EAC9B;AACA,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACzB,EAAA,MAAA,CAAO,yBAAyB,cAAc,CAAA;AAC9C,EAAA,MAAM,sBAAsB,MAAA,EAAQ,MAAA,EAAQ,cAAc,MAAA,EAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AAC/E;AAQA,eAAsB,uCAAA,CACpB,MAAA,EACA,IAAA,EACA,IAAA,EACe;AACf,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACzB,EAAA,IAAI,CAAC,IAAA,EAAM;AACX,EAAA,IAAI,CAAC,sBAAA,CAAuB,MAAA,EAAQ,IAAA,EAAM,IAAI,CAAA,EAAG;AACjD,EAAA,MAAM,KAAA,GAAQ,MAAM,8BAAA,CAA+B,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK,EAAG,IAAI,CAAA;AACvF,EAAA,IAAI,CAAC,KAAA,EAAO;AACZ,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AAC1C,EAAA,IAAI,CAAC,KAAA,EAAO;AACZ,EAAA,MAAA,CAAO,yBAAyB,eAAe,CAAA;AAC/C,EAAA,MAAA,CAAO,IAAI,MAAM;AACf,IAAA,MAAA,CAAO,aAAa,CAAC,EAAE,EAAA,EAAI,KAAA,CAAM,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,MAAM,KAAA,EAAO,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAC,CAAA;AAC9F,IAAA,MAAA,CAAO,YAAY,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,MAAM,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,EAAE,GAAI,KAAA,CAAM,KAAA,EAAkB,SAAS,KAAA,CAAM,EAAA,IAAe,CAAA;AAAA,EAC1H,CAAC,CAAA;AACH;AAQA,eAAsB,8BAAA,CACpB,MAAA,EACA,IAAA,EACA,IAAA,EAC4B;AAC5B,EAAA,IAAI,CAAC,sBAAA,CAAuB,MAAA,EAAQ,KAAK,IAAA,EAAM,IAAI,GAAG,OAAO,MAAA;AAC7D,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,uBAAA,CAAwB,IAAA,CAAK,KAAK,IAAI,CAAA;AAC1D,EAAA,IAAI,IAAA,EAAM,QAAQ,OAAO,MAAM,KAAK,MAAA,CAAO,IAAA,CAAK,MAAM,MAAM,CAAA;AAG5D,EAAA,OAAO,MAAM,MAAA,CAAO,0BAAA,CAA2B,IAAI,CAAA;AACrD;AAUA,eAAsB,6BAAA,CACpB,MAAA,EACA,IAAA,EACA,KAAA,EAC4B;AAC5B,EAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,0BAAA,CAA2B,IAAI,CAAA;AAC/D,EAAA,IAAI,YAAY,OAAO,UAAA;AACvB,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,gBAAgB,QAAA,EAAS;AAAA,IAC7B,QAAA,EAAU,OAAA;AAAA,IACV,IAAA,EAAM,UAAA;AAAA,IACN,KAAA,EAAO,EAAE,KAAA,EAAO,EAAA,EAAI,WAAA,EAAa,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,OAAA,EAAS,EAAA,EAAI,GAAA,EAAK,IAAA,CAAK,GAAA,EAAI;AAAA,IAC3E,MAAM;AAAC,GACT;AACF;;;AClIA,eAAsB,qBAAA,CAAsB,MAAA,EAAgB,EAAE,GAAA,EAAK,QAAO,EAAqE;AAC7I,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,eAAA,EAAgB;AAEzD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,OAAO,CAAA;AAC9B,IAAA,IAAI,MAAA,CAAO,QAAA,KAAa,OAAA,IAAW,MAAA,CAAO,aAAa,QAAA,EAAU;AAC/D,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,CAAA,mBAAA,EAAsB,MAAA,CAAO,QAAQ,CAAA,MAAA,CAAA,EAAS;AAAA,IAC3E;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,iBAAA,EAAoB,OAAO,CAAA,WAAA,CAAA,EAAc;AAAA,EACtE;AAEA,EAAA,IAAI,CAAC,MAAA,CAAO,YAAA,CAAa,UAAU,CAAA,EAAG;AACpC,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,+CAAA,EAAgD;AAAA,EAC7E;AAEA,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,KAAA,GAAQ,MAAM,OAAO,0BAAA,CAA2B,EAAE,MAAM,KAAA,EAAO,GAAA,EAAK,SAAS,CAAA;AAAA,EAC/E,CAAA,CAAA,MAAQ;AAGN,IAAA,KAAA,GAAQ,MAAA;AAAA,EACV;AAEA,EAAA,MAAM,EAAA,GAAK,mBAAA,CAAoB,MAAA,EAAQ,OAAA,EAAS,OAAO,MAAM,CAAA;AAC7D,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAwB,EAAE,CAAA;AAC/C,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,0CAAA,EAA2C;AAClF,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,KAAA,EAAM;AAClC;AChCA,IAAM,YAAA,GAAiD;AAAA,EACrD,SAAA,EAAW,OAAA;AAAA,EACX,SAAA,EAAW,OAAA;AAAA,EACX,SAAA,EAAW,KAAA;AAAA,EACX,SAAA,EAAW,OAAA;AAAA,EACX,SAAA,EAAW,MAAA;AAAA,EACX,SAAA,EAAW,QAAA;AAAA,EACX,SAAA,EAAW,QAAA;AAAA,EACX,SAAA,EAAW;AACb,CAAA;AAEA,SAAS,SAAS,GAAA,EAAiC;AACjD,EAAA,IAAI,CAAC,KAAK,OAAO,OAAA;AACjB,EAAA,OAAO,YAAA,CAAa,GAAA,CAAI,WAAA,EAAa,CAAA,IAAK,OAAA;AAC5C;AAEA,SAAS,QAAQ,KAAA,EAAmC;AAClD,EAAA,IAAI,KAAA,KAAU,UAAU,OAAO,QAAA;AAC/B,EAAA,IAAI,KAAA,KAAU,UAAU,OAAO,QAAA;AAC/B,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,QAAQ,WAAA,EAAyC;AACxD,EAAA,IAAI,WAAA,KAAgB,QAAW,OAAO,GAAA;AACtC,EAAA,IAAI,WAAA,IAAe,GAAG,OAAO,GAAA;AAC7B,EAAA,IAAI,WAAA,IAAe,GAAG,OAAO,GAAA;AAC7B,EAAA,IAAI,WAAA,IAAe,GAAG,OAAO,GAAA;AAC7B,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,sBAAA,GAA2D;AAAA,EAC/D,SAAA,EAAW,WAAA;AAAA,EACX,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS;AACX,CAAA;AASO,SAAS,6BAA6B,OAAA,EAA2B;AACtE,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,MAAM,OAAO,KAAA;AAC5D,EAAA,MAAM,OAAQ,OAAA,CAA+B,IAAA;AAC7C,EAAA,OAAO,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,WAAW,YAAY,CAAA;AACjE;AASA,eAAsB,oBAAA,CAAqB,MAAA,EAAgB,0BAAA,EAAqC,KAAA,EAAgC;AAC9H,EAAA,MAAM,SAAA,GAAY,0BAAA;AAClB,EAAA,MAAM,QAAA,GAAA,CAAY,SAAA,EAAW,QAAA,IAAY,EAAC,EAAG,OAAO,CAAC,OAAA,KAAY,CAAC,OAAA,CAAQ,SAAS,CAAA;AACnF,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAG3B,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,CAAA,GAAI,QAAQ,CAAA,IAAK,CAAA;AACvB,IAAA,MAAM,CAAA,GAAI,QAAQ,CAAA,IAAK,CAAA;AACvB,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AACvB,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AACvB,IAAA,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA,EAAM,CAAA,IAAK,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AAC9C,IAAA,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA,EAAM,CAAA,IAAK,OAAA,CAAQ,UAAU,CAAA,CAAE,CAAA;AAAA,EACjD;AACA,EAAA,MAAM,MAAA,GAAS,KAAA,IAAS,MAAA,CAAO,qBAAA,EAAsB;AACrD,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,GAAA,CAAK,IAAA,GAAO,IAAA,IAAQ,CAAA;AACtC,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,GAAA,CAAK,IAAA,GAAO,IAAA,IAAQ,CAAA;AAEtC,EAAA,MAAM,UAAqB,EAAC;AAC5B,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,CAAA,GAAA,CAAK,OAAA,CAAQ,CAAA,IAAK,CAAA,IAAK,EAAA;AAC7B,IAAA,MAAM,CAAA,GAAA,CAAK,OAAA,CAAQ,CAAA,IAAK,CAAA,IAAK,EAAA;AAC7B,IAAA,MAAM,QAAA,GAAW,QAAQ,KAAA,IAAS,CAAA;AAClC,IAAA,MAAM,SAAS,EAAE,KAAA,EAAO,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAA,EAAG,IAAA,EAAM,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAA,EAAG,IAAA,EAAM,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAA,EAAE;AAE9H,IAAA,MAAM,GAAA,GAAM,sBAAA,CAAuB,OAAA,CAAQ,IAAA,IAAQ,EAAE,CAAA;AACrD,IAAA,IAAI,GAAA,IAAO,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA,EAAG;AACrC,MAAA,MAAM,KAAKoD,aAAAA,EAAc;AACzB,MAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AACf,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,EAAA;AAAA,QACA,IAAA,EAAM,KAAA;AAAA,QACN,CAAA;AAAA,QACA,CAAA;AAAA,QACA,QAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,GAAG,MAAA;AAAA,UACH,GAAA;AAAA,UACA,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,UACjC,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,UAAU,CAAC,CAAA;AAAA,UAClC,MAAM,OAAA,CAAQ,eAAA,IAAmB,OAAA,CAAQ,eAAA,KAAoB,gBAAgB,OAAA,GAAU;AAAA;AACzF,OACD,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,IAAA,KAAS,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA,EAAG;AAC1D,MAAA,MAAM,KAAKA,aAAAA,EAAc;AACzB,MAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AACf,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,EAAA;AAAA,QACA,IAAA,EAAM,MAAA;AAAA,QACN,CAAA;AAAA,QACA,CAAA;AAAA,QACA,QAAA;AAAA,QACA,KAAA,EAAO,EAAE,GAAG,MAAA,EAAQ,QAAA,EAAU,UAAA,CAAW,OAAA,CAAQ,IAAA,IAAQ,EAAE,CAAA,EAAG,QAAA,EAAU,IAAA;AAAK,OAC9E,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAQ,IAAA,KAAS,MAAA,IAAU,OAAA,CAAQ,IAAA,KAAS,WAAW,OAAA,CAAQ,IAAA,KAAS,MAAA,IAAU,OAAA,CAAQ,SAAS,UAAA,KAAe,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,EAAG;AACpJ,MAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,MAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,MAAA,IAAI,CAAC,KAAA,IAAS,CAAC,IAAA,EAAM;AAErB,MAAA,IAAI,QAAQ,IAAA,KAAS,OAAA,IAAW,MAAA,CAAO,YAAA,CAAa,OAAO,CAAA,EAAG;AAC5D,QAAA,MAAM,KAAKA,aAAAA,EAAc;AACzB,QAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AACf,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,EAAA;AAAA,UACA,IAAA,EAAM,OAAA;AAAA,UACN,CAAA;AAAA,UACA,CAAA;AAAA,UACA,QAAA;AAAA,UACA,KAAA,EAAO,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,EAAE,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,EAAG,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,EAAE,EAAG,GAAA,EAAK,EAAE,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA,EAAE;AAAE,SAC1F,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA,EAAG;AAC/B,QAAA,MAAM,KAAKA,aAAAA,EAAc;AACzB,QAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AACf,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,EAAA;AAAA,UACA,IAAA,EAAM,MAAA;AAAA,UACN,CAAA;AAAA,UACA,CAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAO,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,OAAO,WAAA,CAAY,MAAA,CAAO,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,CAAC,IAAI,CAAA,GAAI,CAAC,IAAI,EAAE,EAAA,EAAI,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,KAAA,EAAO,IAAI,CAAA,GAAI,CAAC,IAAI,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,GAAG,CAAA,CAAE,CAAC,GAAG,CAAC,CAAC,CAAA;AAAE,SAChJ,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IACF;AAAA,EAEF;AAEA,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACzB,EAAA,MAAA,CAAO,yBAAyB,kBAAkB,CAAA;AAClD,EAAA,MAAA,CAAO,IAAI,MAAM;AACf,IAAA,MAAA,CAAO,aAAa,MAAe,CAAA;AACnC,IAAA,MAAA,CAAO,kBAAkB,OAAO,CAAA;AAAA,EAClC,CAAC,CAAA;AACH;AAQA,eAAsB,sCAAA,CACpB,QACA,IAAA,EACe;AACf,EAAA,IAAI,CAAC,4BAAA,CAA6B,IAAA,CAAK,OAAO,CAAA,EAAG;AACjD,EAAA,MAAM,oBAAA,CAAqB,MAAA,EAAQ,IAAA,CAAK,OAAA,EAAS,KAAK,KAAK,CAAA;AAC7D;;;AChJO,IAAM,4BAAA,GAA+B;AAAA,EAC1C,eAAA,EAAiB,IAAA;AAAA,EACjB,UAAA,EAAY,IAAA;AAAA,EACZ,iBAAA,EAAmB,KAAA;AAAA,EACnB,iBAAA,EAAmB,IAAA;AAAA,EACnB,YAAA,EAAc,IAAA;AAAA,EACd,WAAA,EAAa,IAAA;AAAA,EACb,oBAAA,EAAsB,IAAA;AAAA,EACtB,QAAA,EAAU,KAAA;AAAA,EACV,iBAAA,EAAmB,KAAA;AAAA,EACnB,aAAA,EAAe,KAAA;AAAA,EACf,YAAA,EAAc,KAAA;AAAA,EACd,MAAA,EAAQ,KAAA;AAAA,EACR,SAAA,EAAW,KAAA;AAAA,EACX,kBAAA,EAAoB,KAAA;AAAA,EACpB,KAAA,EAAO,KAAA;AAAA,EACP,WAAA,EAAa,KAAA;AAAA,EACb,qBAAA,EAAuB;AACzB;AASO,SAAS,iCAAiC,WAAA,EAAwD;AACvG,EAAA,OAAO,MAAA,CAAO,QAAQ,WAAW,CAAA,CAC9B,OAAO,CAAC,GAAG,OAAO,CAAA,KAAM,OAAO,CAAA,CAC/B,GAAA,CAAI,CAAC,CAAC,OAAO,MAAM,OAAO,CAAA,CAC1B,KAAK,IAAI,CAAA;AACd;ACxFO,IAAM,sBAAA,GAAyB,KAAK,IAAA,GAAO;AAG3C,IAAM,6BAAA,GAAmD;AAAA,EAC9D,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF;AAGO,IAAM,6BAAA,GAAmD,CAAC,WAAA,EAAa,iBAAA,EAAmB,YAAY;AAG7G,IAAMK,4BAAAA,GAA8B,GAAA;AA2BpC,IAAe,mBAAf,MAAiD;AAAA,EA0B/C,YAAqB,MAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACnB,IAAA,IAAA,CAAK,OAAA,GAAY,IAAA,CAAK,WAAA,CAA+C,OAAA,IAAW,EAAC;AAAA,EACnF;AAAA,EAFqB,MAAA;AAAA,EAzBrB,OAAO,IAAA;AAAA;AAAA,EAEP,OAAO,KAAA;AAAA;AAAA,EAEP,OAAO,UAAA;AAAA;AAAA,EAEP,OAAO,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQP,OAAO,UAA6C,OAAA,EAAoB;AACtE,IAAA,MAAM,IAAA,GAAO,IAAA;AACb,IAAA,MAAM,MAAA,GAAS,EAAE,GAAK,IAAA,CAA8B,WAAW,EAAC,EAAI,GAAG,OAAA,EAAQ;AAC/E,IAAA,MAAM,UAAA,GAAa,cAAc,IAAA,CAAK;AAAA,KAAC;AACvC,IAAA,MAAA,CAAO,cAAA,CAAe,UAAA,EAAY,SAAA,EAAW,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,CAAA;AACpH,IAAA,MAAA,CAAO,cAAA,CAAe,UAAA,EAAY,MAAA,EAAQ,EAAE,KAAA,EAAO,CAAA,EAAI,IAAA,CAA2B,IAAA,IAAQ,WAAW,CAAA,YAAA,CAAA,EAAgB,YAAA,EAAc,IAAA,EAAM,CAAA;AACzI,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAES,OAAA;AAAA,EAMT,IAAI,IAAA,GAAkB;AACpB,IAAA,OAAQ,KAAK,WAAA,CAA+C,IAAA;AAAA,EAC9D;AAAA;AAAA,EAYA,gBAAgB,QAAA,EAA2B;AACzC,IAAA,MAAM,MAAA,GAAS,SAAS,WAAA,EAAY;AACpC,IAAA,OAAO,IAAA,CAAK,uBAAsB,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,WAAA,EAAY,KAAM,MAAM,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA,EAKA,YAAA,GAAkC;AAChC,IAAA,OAAO,KAAK,qBAAA,EAAsB;AAAA,EACpC;AAAA;AAAA,EAMA,MAAM,MAAA,CAAO,IAAA,EAAY,OAAA,EAAiC;AACxD,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,iBAAiB,IAAA,EAAMC,eAAAA,CAAgB,UAAU,CAAA;AAC1E,IAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,IAAA,CAAK,IAAI,CAAA,4BAAA,EAA+B,IAAA,CAAK,IAAI,CAAA,EAAA,CAAI,CAAA;AAC9F,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGA,QAAQ,KAAA,EAA6B;AACnC,IAAA,OAAQ,KAAA,CAAM,MAAkC,GAAA,IAAO,IAAA;AAAA,EACzD;AACF,CAAA;AAGO,IAAM,cAAA,GAAN,cAA6B,gBAAA,CAA6B;AAAA,EAC/D,OAAgB,IAAA,GAAO,OAAA;AAAA,EACvB,OAAgB,OAAA,GAAwD;AAAA,IACtE,kBAAA,EAAoB,6BAAA;AAAA,IACpB,YAAA,EAAcD;AAAA,GAChB;AAAA,EAES,qBAAA,GAA2C;AAClD,IAAA,OAAO,IAAA,CAAK,QAAQ,kBAAA,IAAsB,6BAAA;AAAA,EAC5C;AAAA,EAES,YAAA,GAAuB;AAC9B,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAES,eAAA,GAAmC;AAC1C,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,EAAA,EAAI,UAAA,EAAY,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,GAAA,EAAK,IAAA,EAAK;AAAA,EAC9E;AAAA,EAEA,MAAe,gBAAA,CAAiB,IAAA,EAAY,OAAA,EAAkD;AAC5F,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,IAAK,CAAC,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AAC3E,IAAA,MAAM,GAAA,GAAM,MAAM,iBAAA,CAAkB,IAAI,CAAA;AACxC,IAAA,MAAM,QAAA,GAAW,KAAK,IAAA,KAAS,SAAA,CAAU,KAAK,IAAA,CAAK,IAAI,IAAI,eAAA,GAAkB,IAAA,CAAA;AAC7E,IAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,MAAM,aAAA,CAAc,GAAA,EAAK,IAAI,CAAA,EAAI,IAAA,CAAK,OAAA,CAAsC,YAAA,IAAgBA,4BAA2B,CAAA;AACvJ,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,OAAA;AAAA,MACJ,QAAA,EAAU,OAAA;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,GAAG,IAAA;AAAA,QACH,MAAM,IAAA,CAAK,IAAA;AAAA;AAAA;AAAA;AAAA,QAIX,UAAA,EAAY,QAAA,KAAa,WAAA,IAAe,QAAA,KAAa,gBAAgB,QAAA,KAAa,YAAA;AAAA,QAClF,QAAA;AAAA,QACA,GAAA;AAAA,QACA,UAAU,IAAA,CAAK;AAAA,OACjB;AAAA,MACA,MAAM;AAAC,KACT;AAAA,EACF;AACF;AAGO,IAAM,cAAA,GAAN,cAA6B,gBAAA,CAA6B;AAAA,EAC/D,OAAgB,IAAA,GAAO,OAAA;AAAA,EACvB,OAAgB,OAAA,GAA4B,EAAE,kBAAA,EAAoB,6BAAA,EAA8B;AAAA,EAEvF,qBAAA,GAA2C;AAClD,IAAA,OAAO,IAAA,CAAK,QAAQ,kBAAA,IAAsB,6BAAA;AAAA,EAC5C;AAAA,EAES,YAAA,GAAuB;AAC9B,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAES,eAAA,GAAmC;AAC1C,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,GAAA,EAAK,IAAA,EAAK;AAAA,EAC7E;AAAA,EAEA,MAAe,gBAAA,CAAiB,IAAA,EAAY,OAAA,EAAkD;AAC5F,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA;AAC7C,IAAA,MAAM,GAAA,GAAM,MAAM,iBAAA,CAAkB,IAAI,CAAA;AACxC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,OAAA;AAAA,MACJ,QAAA,EAAU,OAAA;AAAA,MACV,IAAA,EAAM,OAAA;AAAA;AAAA;AAAA;AAAA,MAIN,OAAO,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,MAAM,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAU,IAAA,CAAK,IAAA,IAAQ,MAAM,GAAA,EAAK,QAAA,EAAU,KAAK,IAAA,EAAK;AAAA,MAC9G,MAAM;AAAC,KACT;AAAA,EACF;AACF;AAUO,IAAM,iBAAA,GAAN,cAAgC,gBAAA,CAAgC;AAAA,EACrE,OAAgB,IAAA,GAAO,UAAA;AAAA,EAEd,qBAAA,GAA2C;AAClD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,kBAAA,IAAsB,EAAC;AAAA,EAC7C;AAAA,EAES,YAAA,GAAuB;AAC9B,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAES,eAAA,GAAsC;AAC7C,IAAA,OAAO,EAAE,KAAA,EAAO,EAAA,EAAI,WAAA,EAAa,EAAA,EAAI,OAAO,EAAA,EAAI,OAAA,EAAS,EAAA,EAAI,GAAA,EAAK,IAAA,EAAK;AAAA,EACzE;AAAA,EAEA,MAAe,gBAAA,GAAkD;AAC/D,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AASO,IAAM,iBAAA,GAAoB,CAAC,cAAA,EAAgB,cAAA,EAAgB,iBAAiB;;;AC/N5E,IAAM,yBAAA,GAAyE;AAuB/E,IAAM,sBAAA,GAA4C,MAAA,CAAO,MAAA,CAAO,EAAE;;;AC1CzE,IAAM,qBAAA,GAAwB,EAAA;AAWvB,SAAS,iBAAA,CAAkB,MAAA,EAAgB,EAAA,EAAa,IAAA,GAA6B,EAAC,EAAS;AACpG,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAChC,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAA,CAAO,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAE/C,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,0BAAA,CAA2B,EAAE,CAAA;AACrD,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAE3B,EAAA,MAAM,SAAS,MAAA,CAAO,mBAAA,CAAoB,CAAC,GAAG,QAAQ,CAAC,CAAA;AACvD,EAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,qBAAA;AAChC,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,qBAAA,CAAsB,EAAE,CAAA;AACtD,EAAA,IAAI,CAAC,cAAA,EAAgB;AAGrB,EAAA,MAAM,SAAA,GAAY,OAAO,IAAA,GAAO,OAAA;AAChC,EAAA,MAAM,SAAA,GAAY,OAAO,IAAA,GAAO,OAAA;AAChC,EAAA,MAAM,EAAA,GAAK,YAAY,cAAA,CAAe,CAAA;AACtC,EAAA,MAAM,EAAA,GAAK,YAAY,cAAA,CAAe,CAAA;AAEtC,EAAA,MAAA,CAAO,yBAAyB,sBAAsB,CAAA;AACtD,EAAA,MAAA,CAAO,IAAI,MAAM;AACf,IAAA,MAAA,CAAO,WAAA,CAAY;AAAA,MACjB,EAAA;AAAA,MACA,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,CAAA,EAAG,MAAM,CAAA,GAAI,EAAA;AAAA,MACb,CAAA,EAAG,MAAM,CAAA,GAAI,EAAA;AAAA,MACb,KAAA,EAAO,EAAE,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,OAAA,GAAU,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,OAAA,GAAU,CAAA;AAAE,KACtD,CAAA;AAIV,IAAA,IAAI,EAAA,KAAO,CAAA,IAAK,EAAA,KAAO,CAAA,EAAG;AACxB,MAAA,MAAA,CAAO,YAAA;AAAA,QACL,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY;AACxB,UAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA;AACrC,UAAA,OAAO,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAA,EAAG,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAA,EAAG,KAAA,CAAM,IAAI,EAAA,EAAG;AAAA,QAC3E,CAAC;AAAA,OACH;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACH;AAUO,SAAS,WAAA,CAAY,QAAgB,GAAA,EAA+B;AACzE,EAAA,MAAM,SAAS,GAAA,CACZ,GAAA,CAAI,CAAC,EAAA,KAAO,MAAA,CAAO,SAAS,EAAE,CAAC,CAAA,CAC/B,MAAA,CAAO,CAAC,KAAA,KAA8C,KAAA,KAAU,UAAa,MAAA,CAAO,gBAAA,CAAiB,KAAK,CAAC,CAAA;AAC9G,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAEzB,EAAA,MAAA,CAAO,yBAAyB,cAAc,CAAA;AAC9C,EAAA,MAAA,CAAO,IAAI,MAAM;AACf,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,0BAAA,CAA2B,KAAA,CAAM,EAAE,CAAA;AAC3D,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,MAAA,CAAO,eAAe,CAAC,GAAG,QAAQ,CAAA,EAAG,MAAM,QAAQ,CAAA;AAAA,MACrD;AAAA,IACF;AACA,IAAA,MAAA,CAAO,aAAa,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,EAAE,CAAC,CAAA;AAAA,EACrD,CAAC,CAAA;AACH;AC7DO,SAAS,8BAAA,CAA+B,MAAA,EAAgB,SAAA,GAAY,KAAA,EAAiC;AAC1G,EAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,CAAO,gBAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,gBAAA,EAAiB,GAAI,OAAO,YAAA,EAAa;AAI/D,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,eAAA,CAAgB,KAAA,EAAO;AAAA,IAC3C,SAAA,EAAW,IAAA;AAAA,IACX,cAAA,EAAgB,KAAA;AAAA,IAChB,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ,CAAA;AAAA,IACR,MAAA,EAAQ,CAAC,KAAA,KAAW,SAAA,GAAY,OAAO,CAAC,WAAA,CAAY,QAAQ,KAAK;AAAA,GAClE,CAAA;AACD,EAAA,IAAI,QAAQ,OAAO,MAAA;AAGnB,EAAA,OAAO,MAAA,CAAO,eAAA,CAAgB,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA,EAAO,cAAA,EAAgB,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,CAAA;AAC5G;AAGA,SAAS,WAAA,CAAY,QAAgB,KAAA,EAA8B;AACjE,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,gBAAA,CAAiB,KAAK,CAAA;AAC9C,EAAA,OAAO,SAAS,OAAA,KAAY,IAAA;AAC9B;AAUO,SAAS,0BAAA,CAA2B,QAAgB,QAAA,EAAyB;AAClF,EAAA,MAAM,MAAA,GAAS,OAAO,sBAAA,EAAuB;AAC7C,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,MAAM,KAAA,GAAQb,GAAAA,CAAI,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AAC7C,EAAA,IAAI,KAAA,CAAM,CAAA,KAAM,CAAA,IAAK,KAAA,CAAM,MAAM,CAAA,EAAG;AACpC,EAAA,MAAM,GAAA,GAAiB,OAAO,mBAAA,EAAoB;AAClD,EAAA,MAAA,CAAO,WAAA,CAAY,KAAK,KAAK,CAAA;AAC/B;AC9BO,SAAS,8BAAA,CAA+B,MAAA,EAAgB,KAAA,EAAyB,IAAA,EAAiD;AACvI,EAAA,MAAM,KAAKQ,aAAAA,EAAc;AAEzB,EAAA,MAAA,CAAO,yBAAyB,2BAA2B,CAAA;AAC3D,EAAA,MAAA,CAAO,IAAI,MAAM;AACf,IAAA,IAAA,CAAK,YAAY,EAAE,CAAA;AACnB,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,EAAG;AAC1B,IAAA,MAAA,CAAO,iBAAA,CAAkB,CAAC,EAAE,CAAC,CAAA;AAG7B,IAAA,0BAAA,CAA2B,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,gBAAgB,CAAA;AAAA,EACnE,CAAC,CAAA;AAED,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,EAAG;AAE1B,EAAA,IAAI,IAAA,CAAK,iBAAiB,MAAA,EAAW;AACnC,IAAA,MAAM,IAAA,GAAO,OAAO,cAAA,EAAe;AACnC,IAAA,IAAA,EAAM,oBAAA,CAAqB,KAAK,YAAY,CAAA;AAC5C,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAqB;AACnD,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,SAAA,IAAa,KAAA,CAAM,SAAS,YAAA,EAAc;AAC7D,MAAA,IAAA,EAAM,qBAAqB,MAAS,CAAA;AACpC,MAAA,GAAA,EAAI;AAAA,IACN,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,IAAA,CAAK,YAAY,EAAE,CAAA;AACrB;;;AC1CO,SAAS,2BAA2B,MAAA,EAA4B;AACrE,EAAA,MAAM,YAA4B,EAAC;AAMnC,EAAA,SAAA,CAAU,IAAA;AAAA,IACR,MAAA,CAAO,WAAA,CAAY,0BAAA,CAA2B,OAAA,EAAS,CAAC,KAAA,KAAwB;AAC9E,MAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC5B,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA;AACtC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,kBAAA,GAAqB,KAAK,CAAA;AAC7C,MAAA,IAAI,CAAC,SAAS,CAAC,MAAA,CAAO,SAAS,KAAK,CAAA,IAAK,SAAS,CAAA,EAAG;AACrD,MAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,MAAA,IAAI,OAAO,KAAA,CAAM,CAAA,KAAM,YAAY,OAAO,KAAA,CAAM,MAAM,QAAA,EAAU;AAChE,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,KAAK,CAAA;AAC7C,MAAA,IAAI,UAAA,KAAe,MAAM,CAAA,EAAG;AAC5B,MAAA,MAAA,CAAO,WAAA,CAAY,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,EAAE,CAAA,EAAG,UAAA,IAAuB,CAAA;AAAA,IAC1F,CAAC;AAAA,GACH;AAMA,EAAA,SAAA,CAAU,IAAA;AAAA,IACR,MAAA,CAAO,WAAA,CAAY,0BAAA,CAA2B,OAAA,EAAS,CAAC,KAAA,KAAwB;AAC9E,MAAA,MAAM,OAAA,GAAW,MAAM,KAAA,CAAsC,OAAA;AAC7D,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,oBAAA,EAAqB,CAAE,IAAA,CAAK,CAAC,KAAA,KAAW,KAAA,CAAM,KAAA,CAAsC,OAAA,KAAY,OAAO,CAAA;AAChI,MAAA,IAAI,SAAA,EAAW;AAKf,MAAA,MAAM,iBAAkB,MAAA,CAAiE,0BAAA;AACzF,MAAA,cAAA,EAAgB,IAAA,CAAK,QAAQ,OAAO,CAAA;AAAA,IACtC,CAAC;AAAA,GACH;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,KAAA,MAAW,OAAA,IAAW,WAAW,OAAA,EAAQ;AAAA,EAC3C,CAAA;AACF;ACrDA,IAAM,iBAAA,GAAoB,CAAA;AAE1B,IAAMF,MAAAA,GAAN,cAAmBC,SAAAA,CAAU;AAAA,EAC3B,OAAgB,EAAA,GAAK,MAAA;AAAA,EAEZ,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,MAAA,EAAQ,EAAE,MAAM,SAAA,EAAW,QAAA,EAAU,CAAA,EAAE,EAAG,CAAA;AAAA,EAC9E;AAAA,EAES,cAAc,IAAA,EAA8B;AACnD,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,IAAA,IAAA,CAAK,MAAA,CAAQ,UAAA,CAAW,UAAA,EAAY,IAAI,CAAA;AAAA,EAC1C;AAAA,EAES,SAAA,GAAkB;AAGzB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,SAAS,UAAA,GAAa,SAAA,EAAW,QAAA,EAAU,CAAA,IAAK,CAAA;AAAA,EACvH;AAAA,EAES,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,SAAS,UAAA,GAAa,SAAA,EAAW,QAAA,EAAU,CAAA,IAAK,CAAA;AAAA,EACvH;AAAA,EAES,QAAA,GAAiB;AACvB,IAAC,IAAA,CAAK,QAA4B,uBAAA,EAAwB;AAAA,EAC7D;AACF,CAAA;AAEA,IAAME,SAAAA,GAAN,cAAuBF,SAAAA,CAAU;AAAA,EAC/B,OAAgB,EAAA,GAAK,UAAA;AAAA,EAEZ,aAAA,GAAsB;AAC7B,IAAA,IAAI,KAAK,MAAA,CAAO,MAAA,CAAO,YAAY,IAAA,CAAK,MAAA,CAAQ,WAAW,eAAe,CAAA;AAAA,EAC5E;AAAA,EAES,WAAA,GAAoB;AAG3B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,kBAAA;AACjC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,YAAA,EAAa;AACtC,IAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,MAAA,GAAS,IAAA,GAAO,oBAAoB,IAAA,GAAO,iBAAA;AAC3E,IAAA,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,KAAA,EAAO,IAAA,EAAM,EAAE,SAAA,EAAW,EAAE,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,iBAAA,IAAqB,CAAA;AACxG,IAAC,IAAA,CAAK,QAA4B,uBAAA,EAAwB;AAAA,EAC7D;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AACF,CAAA;AAEA,IAAM,YAAA,GAAN,cAA2BA,SAAAA,CAAU;AAAA,EACnC,OAAgB,EAAA,GAAK,eAAA;AAAA,EAEZ,aAAA,GAAsB;AAC7B,IAAA,IAAA,CAAK,OAAO,mBAAA,CAAoB,EAAE,WAAW,IAAA,CAAK,KAAA,IAAS,CAAA;AAAA,EAC7D;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,SAAA,EAAW,MAAM,CAAA;AAGnD,IAAA,IAAI,KAAA,CAAM,CAAA,GAAI,CAAA,IAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,KAAA,EAAO,EAAE,SAAA,EAAW,EAAE,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,iBAAA,EAAkB,EAAG,CAAA;AAAA,IACpG;AACC,IAAC,IAAA,CAAK,QAA4B,uBAAA,EAAwB;AAAA,EAC7D;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,SAAA,EAAW,MAAM,CAAA;AACnD,IAAA,IAAA,CAAK,MAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,EAChC;AAAA,EAES,MAAA,GAAe;AACtB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACrD;AAAA;AAAA,EAGQ,KAAA,GAAa;AACnB,IAAA,MAAM,EAAE,eAAA,EAAiB,gBAAA,EAAiB,GAAI,KAAK,MAAA,CAAO,MAAA;AAC1D,IAAA,OAAOG,GAAAA,CAAI,UAAA,CAAW,CAACV,GAAAA,CAAI,IAAA,CAAK,eAAe,CAAA,EAAGA,GAAAA,CAAI,IAAA,CAAK,gBAAgB,CAAC,CAAC,CAAA;AAAA,EAC/E;AACF,CAAA;AAGO,IAAM,QAAA,GAAN,cAAuBO,SAAAA,CAAU;AAAA,EACtC,OAAgB,EAAA,GAAK,MAAA;AAAA,EACrB,OAAgB,OAAA,GAAU,MAAA;AAAA,EAC1B,OAAgB,QAAA,GAAW,MAA8B,CAACD,MAAAA,EAAMG,WAAU,YAAY,CAAA;AAAA;AAAA,EAGtF,OAAsC,EAAC;AAAA,EAE9B,OAAA,CAAQ,IAAA,GAAsC,EAAC,EAAS;AAC/D,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAGZ,IAAA,IAAA,CAAK,oBAAA,CAAqB,KAAK,gBAAgB,CAAA;AAAA,EACjD;AAAA,EAES,MAAA,GAAe;AACtB,IAAA,IAAA,CAAK,qBAAqB,MAAS,CAAA;AACnC,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACrD;AAAA;AAAA,EAGA,uBAAA,GAAgC;AAC9B,IAAA,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,IAAA,CAAK,IAAA,CAAK,oBAAoB,QAAQ,CAAA;AAAA,EACnE;AACF;ACtDO,IAAM,YAAA,GAAe;AASrB,IAAM,mBAAA,GAA6C,MAAA,CAAO,MAAA,CAAO,gBAAgB,CAAA,CAAE,OAAA;AAAA,EAAQ,CAAC,MAAA,KACjG,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,QAAA,KAAa,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAC;AACrE;AAWA,eAAsB,WAAA,CAAY,EAAA,EAAY,IAAA,EAAkB,cAAA,EAA8C;AAC5G,EAAA,MAAM,GAAA,GAAM,cAAA,KAAmB,OAAO,QAAA,KAAa,cAAc,MAAA,GAAY,QAAA,CAAA;AAC7E,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,QAAA,KAAa,WAAA,EAAa;AAC3C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,EAAE,CAAA,sDAAA,CAAmD,CAAA;AAAA,EACzG;AACA,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,GAAS,CAAA,IAAA,EAAO,KAAK,SAAA,CAAU,IAAA,CAAK,GAAG,CAAC,CAAA,SAAA,EAAY,KAAK,SAAA,CAAU,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,CAAA,GAAM,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AACxI,EAAA,MAAM,cAAmC,EAAC;AAC1C,EAAA,IAAI,IAAA,CAAK,OAAA,KAAY,MAAA,EAAW,WAAA,CAAY,UAAU,IAAA,CAAK,OAAA;AAC3D,EAAA,IAAI,IAAA,CAAK,eAAA,KAAoB,MAAA,EAAW,WAAA,CAAY,kBAAkB,IAAA,CAAK,eAAA;AAC3E,EAAA,IAAI,IAAA,CAAK,OAAA,KAAY,MAAA,EAAW,WAAA,CAAY,UAAU,IAAA,CAAK,OAAA;AAC3D,EAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,EAAW,WAAA,CAAY,QAAQ,IAAA,CAAK,KAAA;AACvD,EAAA,IAAI,IAAA,CAAK,YAAA,KAAiB,MAAA,EAAW,WAAA,CAAY,eAAe,IAAA,CAAK,YAAA;AACrE,EAAA,IAAI,KAAK,OAAA,KAAY,MAAA,EAAY,WAAA,CAAqC,UAAU,IAAA,CAAK,OAAA;AACrF,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,MAAA,EAAW,WAAA,CAAY,SAAS,IAAA,CAAK,MAAA;AAEzD,EAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,EAAA,EAAI,QAAQ,WAAW,CAAA;AACjD,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,EAAK;AAC/B,EAAA,GAAA,CAAI,KAAA,CAAM,IAAI,MAAM,CAAA;AACpB,EAAA,OAAO,MAAA;AACT;AA2BA,SAAS,OAAO,KAAA,EAAuD;AACrE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAS,OAAO,IAAA,IAAQ,EAAA;AAC7D;AAEA,IAAM,6BAAa,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAC7C,IAAM,+BAAe,IAAI,GAAA,CAAI,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AAC7C,IAAM,6BAAa,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,WAAW,CAAC,CAAA;AAWzC,SAAS,uBAAA,CACd,IAAA,EACA,KAAA,EACA,OAAA,EACmB;AACnB,EAAA,MAAM,OAAA,GAAU,IAAA;AAChB,EAAA,IAAI,IAAA,GAAO,KAAA;AACX,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG;AACtC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAC7B,IAAA,IAAI,UAAA,CAAW,IAAI,IAAI,CAAA,SAAU,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAO;AAAA,SAAA,IAClD,YAAA,CAAa,IAAI,IAAI,CAAA,SAAU,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,QAAA,EAAS;AAAA,SAAA,IAC1D,UAAA,CAAW,IAAI,IAAI,CAAA,SAAU,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,aAAA,EAAc;AAAA,EACzE;AACA,EAAA,IAAI,UAAA,CAAW,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA,EAAG,IAAA,GAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,aAAA,EAAc;AAElF,EAAA,MAAM,IAAA,GAAO,iBAAiB,IAAA,CAAK,MAAM,IAAI,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA;AACtE,EAAA,IAAI,IAAA,UAAc,IAAI,CAAA;AACtB,EAAA,OAAO,IAAA;AACT;;;ACxCO,SAASM,mBAAAA,CAAmB,MAAe,GAAA,EAAqC;AACrF,EAAA,MAAM,KAAK,IAAA,CAAK,CAAA;AAChB,EAAA,MAAM,KAAK,IAAA,CAAK,CAAA;AAChB,EAAA,MAAM,KAAK,GAAA,CAAI,CAAA;AACf,EAAA,MAAM,KAAK,GAAA,CAAI,CAAA;AACf,EAAA,IAAI,EAAA,KAAO,EAAA,IAAM,EAAA,KAAO,EAAA,SAAW,EAAC;AAEpC,EAAA,IAAI,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AACxB,EAAA,IAAI,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AACxB,EAAA,IAAI,EAAA,KAAO,CAAA,IAAK,EAAA,KAAO,CAAA,SAAU,CAAC,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAC,CAAA;AAElE,EAAA,MAAM,MAAM,GAAA,CAAI,oBAAA;AAChB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC3B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAG3B,EAAA,MAAM,GAAA,GAAA,CAAO,KAAK,EAAA,IAAM,CAAA;AACxB,EAAA,MAAM,GAAA,GAAA,CAAO,KAAK,EAAA,IAAM,CAAA;AACxB,EAAA,MAAM,GAAA,GAAM,MAAA,GAAS,GAAA,GAAM,MAAA,GAAS,GAAA;AACpC,EAAA,MAAM,GAAA,GAAM,CAAC,MAAA,GAAS,GAAA,GAAM,MAAA,GAAS,GAAA;AAGrC,EAAA,MAAM,SAAU,GAAA,GAAM,GAAA,IAAQ,KAAK,EAAA,CAAA,GAAO,GAAA,GAAM,OAAQ,EAAA,GAAK,EAAA,CAAA;AAC7D,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAC9B,IAAA,EAAA,IAAM,KAAA;AACN,IAAA,EAAA,IAAM,KAAA;AAAA,EACR;AAGA,EAAA,MAAM,OAAO,EAAA,GAAK,EAAA;AAClB,EAAA,MAAM,OAAO,EAAA,GAAK,EAAA;AAClB,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,IAAA,GAAO,IAAA,GAAO,GAAA,GAAM,GAAA,GAAM,IAAA,GAAO,GAAA,GAAM,GAAG,CAAA;AAC/E,EAAA,MAAM,WAAA,GAAc,IAAA,GAAO,GAAA,GAAM,GAAA,GAAM,OAAO,GAAA,GAAM,GAAA;AACpD,EAAA,MAAM,WAAA,GAAA,CAAe,GAAA,CAAI,YAAA,KAAiB,GAAA,CAAI,SAAA,GAAY,EAAA,GAAK,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,WAAA,KAAgB,CAAA,GAAI,CAAA,GAAI,YAAY,WAAW,CAAA;AAC7H,EAAA,MAAM,GAAA,GAAO,WAAA,IAAe,EAAA,GAAK,GAAA,CAAA,GAAQ,EAAA;AACzC,EAAA,MAAM,GAAA,GAAO,WAAA,GAAc,EAAE,EAAA,GAAK,GAAA,CAAA,GAAQ,EAAA;AAC1C,EAAA,MAAM,KAAK,MAAA,GAAS,GAAA,GAAM,MAAA,GAAS,GAAA,GAAA,CAAO,KAAK,EAAA,IAAM,CAAA;AACrD,EAAA,MAAM,KAAK,MAAA,GAAS,GAAA,GAAM,MAAA,GAAS,GAAA,GAAA,CAAO,KAAK,EAAA,IAAM,CAAA;AAGrD,EAAA,MAAM,UAAA,GAAa,aAAa,CAAA,EAAG,CAAA,EAAA,CAAI,MAAM,GAAA,IAAO,EAAA,EAAA,CAAK,GAAA,GAAM,GAAA,IAAO,EAAE,CAAA;AACxE,EAAA,IAAI,UAAA,GAAa,YAAA,CAAA,CAAc,GAAA,GAAM,GAAA,IAAO,KAAK,GAAA,GAAM,GAAA,IAAO,EAAA,EAAA,CAAK,CAAC,MAAM,GAAA,IAAO,EAAA,EAAA,CAAK,CAAC,GAAA,GAAM,OAAO,EAAE,CAAA;AACtG,EAAA,IAAI,CAAC,GAAA,CAAI,SAAA,IAAa,aAAa,CAAA,EAAG,UAAA,IAAc,KAAK,EAAA,GAAK,CAAA;AAAA,OAAA,IACrD,IAAI,SAAA,IAAa,UAAA,GAAa,CAAA,EAAG,UAAA,IAAc,KAAK,EAAA,GAAK,CAAA;AAGlE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,IAAK,IAAA,CAAK,EAAA,GAAK,EAAE,CAAC,CAAA;AACzE,EAAA,MAAM,OAAO,UAAA,GAAa,KAAA;AAE1B,EAAA,MAAM,QAAS,CAAA,GAAI,CAAA,GAAK,IAAA,CAAK,GAAA,CAAI,OAAO,CAAC,CAAA;AAEzC,EAAA,MAAM,WAA2B,EAAC;AAClC,EAAA,IAAI,KAAA,GAAQ,UAAA;AACZ,EAAA,IAAI,OAAA,GAAmB,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AACtC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,OAAO,KAAA,GAAQ,IAAA;AACrB,IAAA,MAAM,GAAA,GAAM,UAAU,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,MAAA,EAAQ,QAAQ,IAAI,CAAA;AAC1D,IAAA,MAAM,KAAK,mBAAA,CAAoB,EAAA,EAAI,EAAA,EAAI,MAAA,EAAQ,QAAQ,KAAK,CAAA;AAC5D,IAAA,MAAM,KAAK,mBAAA,CAAoB,EAAA,EAAI,EAAA,EAAI,MAAA,EAAQ,QAAQ,IAAI,CAAA;AAC3D,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,KAAA,EAAO,OAAA;AAAA,MACP,GAAA,EAAK,EAAE,CAAA,EAAG,OAAA,CAAQ,CAAA,GAAI,KAAA,GAAQ,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,OAAA,CAAQ,CAAA,GAAI,KAAA,GAAQ,GAAG,CAAA,EAAE;AAAA,MAChE,GAAA,EAAK,EAAE,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,KAAA,GAAQ,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,KAAA,GAAQ,GAAG,CAAA,EAAE;AAAA,MACxD;AAAA,KACD,CAAA;AACD,IAAA,OAAA,GAAU,GAAA;AACV,IAAA,KAAA,GAAQ,IAAA;AAAA,EACV;AAIA,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AACzC,EAAA,IAAI,MAAM,IAAA,CAAK,GAAA,GAAM,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AACpC,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,QAAA,CAAS,MAAe,EAAA,EAA2B;AAC1D,EAAA,OAAO,EAAE,OAAO,IAAA,EAAM,GAAA,EAAK,MAAM,GAAA,EAAK,EAAA,EAAI,KAAK,EAAA,EAAG;AACpD;AAEA,SAAS,UAAU,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAY,MAAA,EAAgB,QAAgB,KAAA,EAAwB;AACzH,EAAA,MAAM,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC7B,EAAA,MAAM,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC7B,EAAA,OAAO,EAAE,CAAA,EAAG,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,CAAA,GAAI,EAAA,EAAI,CAAA,EAAG,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,CAAA,GAAI,EAAA,EAAG;AAC5E;AAEA,SAAS,mBAAA,CAAoB,EAAA,EAAY,EAAA,EAAY,MAAA,EAAgB,QAAgB,KAAA,EAAwB;AAC3G,EAAA,MAAM,CAAA,GAAI,CAAC,EAAA,GAAK,IAAA,CAAK,IAAI,KAAK,CAAA;AAC9B,EAAA,MAAM,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC7B,EAAA,OAAO,EAAE,CAAA,EAAG,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,GAAG,CAAA,EAAG,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,CAAA,EAAE;AAClE;AAGA,SAAS,YAAA,CAAa,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAoB;AAC5E,EAAA,MAAM,GAAA,GAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC3B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAE,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACtE,EAAA,IAAI,GAAA,KAAQ,GAAG,OAAO,CAAA;AACtB,EAAA,MAAM,OAAO,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,IAAI,EAAA,GAAK,CAAA;AAC1C,EAAA,OAAO,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,GAAA,GAAM,GAAG,CAAC,CAAC,CAAA;AAC9D;AAGO,SAAS,YAAA,CAAa,SAAuB,CAAA,EAAoB;AACtE,EAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,EAAA,MAAM,CAAA,GAAI,KAAK,EAAA,GAAK,EAAA;AACpB,EAAA,MAAM,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,CAAA;AACxB,EAAA,MAAM,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,CAAA;AACvB,EAAA,MAAM,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAClB,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,CAAA,GAAI,IAAI,OAAA,CAAQ,GAAA,CAAI,CAAA,GAAI,CAAA,GAAI,QAAQ,GAAA,CAAI,CAAA;AAAA,IACjF,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,CAAA,GAAI,IAAI,OAAA,CAAQ,GAAA,CAAI,CAAA,GAAI,CAAA,GAAI,QAAQ,GAAA,CAAI;AAAA,GACnF;AACF;AASO,SAAS,kBAAkB,OAAA,EAA+B;AAC/D,EAAA,MAAM,IACJ,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,GAAG,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,QAAQ,GAAG,CAAA,GAAI,KAAK,OAAA,CAAQ,GAAA,EAAK,QAAQ,GAAG,CAAA;AACnG,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAC,CAAC,CAAC,CAAA;AACnD;AAEA,SAAS,IAAA,CAAK,GAAY,CAAA,EAAoB;AAC5C,EAAA,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACxC;AC1OO,SAAS,aAAA,CAAc,QAAA,EAAyC,QAAA,EAAkB,MAAA,EAAkC;AACzH,EAAA,MAAM,WAA6B,EAAC;AACpC,EAAA,IAAI,MAAA,GAAyB,IAAA;AAC7B,EAAA,IAAI,QAAA,GAA2B,IAAA;AAC/B,EAAA,KAAA,IAAS,IAAI,QAAA,EAAU,CAAA,GAAI,UAAU,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7D,IAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,IAAA,QAAQ,QAAQ,IAAA;AAAM,MACpB,KAAK,MAAA;AACH,QAAA,MAAA,GAAS,EAAE,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,QAAQ,CAAA,EAAE;AACtC,QAAA,QAAA,GAAW,MAAA;AACX,QAAA;AAAA,MACF,KAAK,MAAA,EAAQ;AACX,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,MAAM,MAAM,EAAE,CAAA,EAAG,QAAQ,CAAA,EAAG,CAAA,EAAG,QAAQ,CAAA,EAAE;AACzC,QAAA,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,MAAM,KAAA,EAAO,MAAA,EAAQ,KAAK,CAAA;AACjD,QAAA,MAAA,GAAS,GAAA;AACT,QAAA;AAAA,MACF;AAAA,MACA,KAAK,OAAA,EAAS;AACZ,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,MAAM,MAAM,EAAE,CAAA,EAAG,QAAQ,CAAA,EAAG,CAAA,EAAG,QAAQ,CAAA,EAAE;AACzC,QAAA,MAAM,KAAA,GAAsB,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAK,EAAE,CAAA,EAAG,OAAA,CAAQ,IAAA,EAAM,CAAA,EAAG,OAAA,CAAQ,MAAK,EAAG,GAAA,EAAK,EAAE,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,EAAG,OAAA,CAAQ,IAAA,EAAK,EAAG,GAAA,EAAI;AACvI,QAAA,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,KAAK,CAAA;AAC3C,QAAA,MAAA,GAAS,GAAA;AACT,QAAA;AAAA,MACF;AAAA,MACA,KAAK,KAAA,EAAO;AACV,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,KAAA,MAAW,KAAA,IAASA,mBAAAA,CAAmB,MAAA,EAAQ,OAAO,GAAG,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,OAAO,KAAA,CAAM,KAAA,EAAO,GAAA,EAAK,KAAA,CAAM,KAAK,CAAA;AACpH,QAAA,MAAA,GAAS,EAAE,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,QAAQ,CAAA,EAAE;AACtC,QAAA;AAAA,MACF;AAAA,MACA,KAAK,OAAA;AAKH,QAAA,MAAA,GAAS,QAAA;AACT,QAAA;AAAA;AACJ,EACF;AACA,EAAA,OAAO,QAAA;AACT;AAGO,SAAS,WAAA,CAAY,QAAA,EAAyC,QAAA,EAAkB,MAAA,EAAyB;AAC9G,EAAA,KAAA,IAAS,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,QAAA,EAAU,CAAA,EAAA,EAAK;AACtE,IAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,OAAA,EAAS,OAAO,IAAA;AACrC,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,MAAA,EAAQ,OAAO,KAAA;AAAA,EACtC;AACA,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,mBAAmB,QAAA,EAA4C;AAC7E,EAAA,MAAM,MAAa,EAAC;AACpB,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAe;AAC3B,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC/B,IAAA,IAAI,IAAA,IAAQ,KAAK,CAAA,KAAM,CAAA,CAAE,KAAK,IAAA,CAAK,CAAA,KAAM,EAAE,CAAA,EAAG;AAC9C,IAAA,GAAA,CAAI,KAAK,IAAIf,GAAAA,CAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EAC5B,CAAA;AACA,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAA,CAAK,QAAQ,KAAK,CAAA;AAClB,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,OAAA,CAAQ,KAAK,CAAA;AAC7C,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,KAAA,EAAO,CAAA,GAAI,KAAK,CAAC,CAAA;AAAA,IAC7E;AACA,IAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AAAA,EAClB;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,mBAAA,CAAoB,UAAqC,MAAA,EAA2B;AAClG,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA;AACxB,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,EAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA,EAAG,KAAA,CAAM,MAAM,CAAC,CAAA;AACrD,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA;AAAA,IACxJ,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,IAAA,EAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,IACvD;AAAA,EACF;AACA,EAAA,IAAI,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA;AACpC,EAAA,OAAO,KAAA;AACT;AAGO,IAAM,qBAAA,GAAN,cAAoC,UAAA,CAAW;AAAA,EAGpD,WAAA,CACW,IAAA,EACA,QAAA,EACA,MAAA,EACT,OAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AALJ,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAIT,IAAA,IAAA,CAAK,YAAA,GAAe,aAAA,CAAc,IAAA,CAAK,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,EACnE;AAAA,EAPW,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EALM,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBjB,WAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,CAAC,OAAA,KAAY;AACxC,MAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,CAAC,OAAO,CAAC,CAAA;AAC7C,MAAA,OAAO,IAAI,sBAAsB,QAAA,EAAU,EAAE,UAAU,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA;AAAA,IACjF,CAAC,CAAA;AAAA,EACH;AAAA,EAES,YAAY,QAAA,EAAqC;AACxD,IAAA,OAAO,kBAAA,CAAmB,KAAK,YAAY,CAAA;AAAA,EAC7C;AAAA,EAES,WAAA,GAAwB;AAC/B,IAAA,OAAO,mBAAA,CAAoB,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC7D;AAAA,EAES,cAAA,CAAe,QAAQ,IAAA,EAAc;AAC5C,IAAA,MAAM,WAAW,IAAA,CAAK,YAAA;AACtB,IAAA,MAAM,IAAA,GAAO,SAAS,CAAC,CAAA;AACvB,IAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAClB,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAG,KAAA,GAAQ,MAAM,GAAG,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,CAAA;AACpE,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAA,EAAI,QAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAI,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACzJ,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,IAAA,CAAK,IAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACjD;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AACjC,IAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACtB;AACF;AAGA,IAAM,qBAAA,GAAN,cAAoC,UAAA,CAAW;AAAA,EAC7C,WAAA,CACmB,QACjB,OAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHI,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAInB;AAAA,EAJmB,MAAA;AAAA,EAMV,WAAA,GAAqB;AAC5B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAES,WAAA,GAAwB;AAC/B,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AAC3B,IAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,IAAA,KAAA,CAAM,KAAK,OAAA,CAAQ,IAAA,EAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AACzC,IAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,IAAA,CAAK,OAAO,MAAA,EAAQ,CAAA,EAAA,QAAW,IAAA,CAAK,OAAA,CAAQ,MAAM,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAG,CAAA,EAAG,KAAK,MAAA,CAAO,CAAC,EAAG,CAAC,CAAA;AAC1G,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA;ACtFA,IAAM,yBAAA,GAA4B,CAAA;AAClC,IAAM,wBAAA,GAA2B,GAAA;AACjC,IAAM,mBAAA,GAAsB,GAAA;AAC5B,IAAM,mBAAA,GAAsB,CAAA;AAErB,IAAM,WAAA,GAAN,MAAM,YAAA,CAAY;AAAA;AAAA,EAEd,WAAiC,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ3C,OAAO,iBAAA,CAAkB,MAAA,EAAmB,IAAA,GAAsD,EAAC,EAAgB;AACjH,IAAA,MAAM,IAAA,GAAO,IAAI,YAAA,EAAY;AAC7B,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,cAAc,CAAC,CAAA;AACrD,IAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,GAAG,IAAI,CAAA;AAChC,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,MAAA,EAAQ,KAAK,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,CAAC,EAAG,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAG,GAAG,IAAI,CAAA;AACvF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,wBAAA,CAAyB,MAAA,EAAmB,IAAA,GAAsD,EAAC,EAAgB;AACxH,IAAA,MAAM,IAAA,GAAO,IAAI,YAAA,EAAY;AAC7B,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,cAAc,CAAC,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,GAAG,IAAI,CAAA;AAChC,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC3B,IAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAClB,MAAA,IAAA,CAAK,MAAA,CAAO,EAAE,CAAC,CAAA,CAAG,GAAG,CAAA,CAAE,CAAC,CAAA,CAAG,CAAA,EAAG,IAAI,CAAA;AAClC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,KAAK,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,IAAK,EAAE,CAAC,CAAA;AAC1B,MAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA;AAClB,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA;AAEvB,MAAA,IAAA,CAAK,aAAA;AAAA,QACH,EAAA,CAAG,CAAA;AAAA,QACH,EAAA,CAAG,CAAA;AAAA,QACH,EAAA,CAAG,CAAA,GAAA,CAAK,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AAAA,QACvB,EAAA,CAAG,CAAA,GAAA,CAAK,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AAAA,QACvB,EAAA,CAAG,CAAA,GAAA,CAAK,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AAAA,QACvB,EAAA,CAAG,CAAA,GAAA,CAAK,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AAAA,QACvB;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAA,CAAO,CAAA,EAAW,CAAA,EAAW,IAAA,GAA4B,EAAC,EAAS;AACjE,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,MAAM,CAAA;AAC/C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAA,CAAO,CAAA,EAAW,CAAA,EAAW,IAAA,GAA+B,EAAC,EAAS;AACpE,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,MAAM,CAAA;AAC/C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,aAAA,CAAc,GAAW,CAAA,EAAW,IAAA,EAAc,MAAc,IAAA,EAAc,IAAA,EAAc,IAAA,GAA+B,EAAC,EAAS;AACnI,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,CAAA;AACxE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,KAAA,CACE,EAAA,EACA,EAAA,EACA,YAAA,EACA,SAAA,EACA,sBACA,EAAA,EACA,EAAA,EACA,IAAA,GAA+B,EAAC,EAC1B;AACN,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,OAAO,EAAA,EAAI,EAAA,EAAI,YAAA,EAAc,SAAA,EAAW,sBAAsB,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,MAAM,CAAA;AAC7G,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,aAAA,CAAc,QAAgB,YAAA,EAAuB,SAAA,EAAoB,IAAY,EAAA,EAAY,IAAA,GAA+B,EAAC,EAAS;AACxI,IAAA,OAAO,IAAA,CAAK,MAAM,MAAA,EAAQ,MAAA,EAAQ,cAAc,SAAA,EAAW,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,IAAI,CAAA;AAAA,EAC5E;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,SAAS,CAAA;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,OAAA,GAAqB;AACnB,IAAA,MAAM,OAAkB,EAAC;AACzB,IAAA,IAAI,OAAA,GAA0B,IAAA;AAC9B,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC/B,MAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC3B,QAAA,IAAI,OAAA,EAAS,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAC9B,QAAA,OAAA,GAAU,EAAE,UAAU,CAAA,EAAG,MAAA,EAAQ,IAAI,CAAA,EAAG,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,MAC7D,WAAW,OAAA,EAAS;AAClB,QAAA,OAAA,CAAQ,SAAS,CAAA,GAAI,CAAA;AAAA,MACvB;AAAA,IACF;AACA,IAAA,IAAI,OAAA,EAAS,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAA,GAA8C;AAC5C,IAAA,MAAM,WAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,OAAA,EAAQ,EAAG;AAChC,MAAA,IAAI,GAAA,CAAI,IAAA,CAAK,QAAA,KAAa,KAAA,EAAO;AACjC,MAAA,MAAM,WAAgD,GAAA,CAAI,IAAA,CAAK,QAAA,IAAY,EAAE,UAAU,KAAA,EAAM;AAC7F,MAAA,QAAA,CAAS,IAAA;AAAA,QACP,IAAI,qBAAA,CAAsB,IAAA,EAAM,GAAA,CAAI,QAAA,EAAU,IAAI,MAAA,EAAQ;AAAA,UACxD,GAAG,QAAA;AAAA,UACH,UAAU,QAAA,CAAS,QAAA;AAAA,UACnB,UAAU,WAAA,CAAY,IAAA,CAAK,UAAU,GAAA,CAAI,QAAA,EAAU,IAAI,MAAM;AAAA,SAC9D;AAAA,OACH;AAAA,IACF;AACA,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,SAAS,CAAC,CAAA;AAC5C,IAAA,OAAO,IAAI,OAAA,CAAQ,EAAE,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EACjD;AAAA;AAAA,EAGA,GAAA,CAAI,IAAA,GAA2B,EAAC,EAAW;AACzC,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,QAAA,CAAS,MAAA;AAC5C,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,OAAA,EAAQ,EAAG;AAChC,MAAA,IAAI,GAAA,CAAI,MAAA,IAAU,QAAA,IAAY,GAAA,CAAI,YAAY,MAAA,EAAQ;AACtD,MAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,QAAA;AAC1B,MAAA,IAAI,IAAA,CAAK,cAAc,EAAE,QAAA,KAAa,SAAS,QAAA,KAAa,MAAA,IAAa,SAAS,QAAA,CAAA,EAAW;AAC7F,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,UAAU,QAAQ,CAAA;AAC5C,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,QAAQ,MAAM,CAAA;AACtC,MAAA,MAAM,QAAA,GAAW,aAAA,CAAc,IAAA,CAAK,QAAA,EAAU,MAAM,EAAE,CAAA;AACtD,MAAA,MAAM,CAAA,GAAI,YAAY,QAAA,EAAU,WAAA,CAAY,KAAK,QAAA,EAAU,IAAA,EAAM,EAAE,CAAC,CAAA;AACpE,MAAA,IAAI,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,QAAQ,IAAA,EAAoC;AAC1C,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,mBAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,MAAA,IAAU,mBAAmB,CAAC,CAAA;AACzE,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,MAAA,EAAQ,IAAA,EAAA,EAAQ;AACxC,MAAA,MAAM,SAAS,YAAA,CAAa,CAAA,EAAG,KAAK,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AACxD,MAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,OAAA,EAAQ,EAAG;AAChC,QAAA,MAAM,WAAW,aAAA,CAAc,IAAA,CAAK,UAAU,GAAA,CAAI,QAAA,EAAU,IAAI,MAAM,CAAA;AACtE,QAAA,MAAM,QAAA,GAAW,SAAS,GAAA,CAAI,CAAC,YAAY,aAAA,CAAc,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAC,CAAA;AACjF,QAAA,MAAM,CAAA,GAAI,WAAA,CAAY,QAAA,EAAU,WAAA,CAAY,IAAA,CAAK,UAAU,GAAA,CAAI,QAAA,EAAU,GAAA,CAAI,MAAM,CAAC,CAAA;AACpF,QAAA,IAAI,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAAA,MACrB;AAAA,IACF;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,IAAA,EAA+B;AACtC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,KAAU,MAAA,GAAS,KAAK,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,CAAK,IAAI,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,IAAc,OAAO,CAAA;AACxG,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,EAAE;AAC5C,IAAA,OAAO,IAAI,OAAO,CAAC,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,IAAA,EAA2C;AAC/C,IAAA,MAAM,IAAI,IAAA,CAAK,KAAA,KAAU,UAAU,CAAC,IAAA,CAAK,aAAa,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,GAAI,KAAK,GAAA,CAAI,EAAE,YAAY,IAAA,CAAK,UAAA,IAAc,OAAO,CAAA;AAC5H,IAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,EAAQ,uBAAOvE,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAM,WAAA,EAAa,CAAA,EAAG,MAAA,EAAO,MAAA,EAAQ,GAAG,KAAK,KAAA,EAAO,CAAA;AAC5F,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,KAAA,KAAU,OAAA,IAAW,IAAA,CAAK,KAAA,KAAU,MAAA,GAAS,MAAA,GAAY,YAAA,CAAa,IAAA,EAAM,IAAI,CAAA;AACrH,IAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAM,WAAA,EAAa,IAAA,CAAK,WAAA,EAAa,eAAA,EAAiB,IAAA,EAAO,GAAG,IAAA,CAAK,KAAA,EAAO,CAAA;AAAA,EAC3F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,UAAU,GAAA,EAA2B;AACnC,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AAC3B,IAAA,MAAM,GAAA,GAAM,IAAI,YAAA,EAAY;AAC5B,IAAA,MAAM,GAAA,GAAM,CAAC,CAAA,EAAW,CAAA,KAAuB,OAAO,YAAA,CAAa,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA;AAC3E,IAAA,IAAI,MAAA,GAAyB,IAAA;AAC7B,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACnC,MAAA,QAAQ,QAAQ,IAAA;AAAM,QACpB,KAAK,MAAA,EAAQ;AACX,UAAA,MAAM,CAAA,GAAI,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,QAAQ,CAAC,CAAA;AAClC,UAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAA;AACtE,UAAA,MAAA,GAAS,EAAE,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,QAAQ,CAAA,EAAE;AACtC,UAAA;AAAA,QACF;AAAA,QACA,KAAK,MAAA,EAAQ;AACX,UAAA,MAAM,CAAA,GAAI,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,QAAQ,CAAC,CAAA;AAClC,UAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAA;AACtE,UAAA,MAAA,GAAS,EAAE,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,QAAQ,CAAA,EAAE;AACtC,UAAA;AAAA,QACF;AAAA,QACA,KAAK,OAAA,EAAS;AACZ,UAAA,MAAM,CAAA,GAAI,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,QAAQ,CAAC,CAAA;AAClC,UAAA,MAAM,EAAA,GAAK,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,QAAQ,IAAI,CAAA;AACzC,UAAA,MAAM,EAAA,GAAK,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,QAAQ,IAAI,CAAA;AACzC,UAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,IAAA,EAAM,EAAA,CAAG,GAAG,IAAA,EAAM,EAAA,CAAG,CAAA,EAAG,IAAA,EAAM,EAAA,CAAG,CAAA,EAAG,IAAA,EAAM,EAAA,CAAG,CAAA,EAAG,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,CAAA;AACvH,UAAA,MAAA,GAAS,EAAE,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,QAAQ,CAAA,EAAE;AACtC,UAAA;AAAA,QACF;AAAA,QACA,KAAK,KAAA,EAAO;AACV,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,KAAA,MAAW,KAAA,IAASsF,mBAAAA,CAAmB,MAAA,EAAQ,OAAO,CAAA,EAAG;AACvD,cAAA,MAAM,IAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG,KAAA,CAAM,IAAI,CAAC,CAAA;AACtC,cAAA,MAAM,KAAK,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG,KAAA,CAAM,IAAI,CAAC,CAAA;AACvC,cAAA,MAAM,KAAK,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG,KAAA,CAAM,IAAI,CAAC,CAAA;AACvC,cAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,IAAA,EAAM,EAAA,CAAG,GAAG,IAAA,EAAM,EAAA,CAAG,CAAA,EAAG,IAAA,EAAM,EAAA,CAAG,CAAA,EAAG,IAAA,EAAM,EAAA,CAAG,CAAA,EAAG,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,CAAA;AAAA,YACzH;AAAA,UACF;AACA,UAAA,MAAA,GAAS,EAAE,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,QAAQ,CAAA,EAAE;AACtC,UAAA;AAAA,QACF;AAAA,QACA,KAAK,OAAA;AACH,UAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,SAAS,CAAA;AACnC,UAAA;AAAA;AACJ,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAGA,SAAS,WAAA,CAAY,UAAqC,MAAA,EAAyB;AACjF,EAAA,MAAM,IAAA,GAAO,SAAS,CAAC,CAAA;AACvB,EAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAClB,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CAAE,CAAA;AACvD,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAM,GAAA,CAAI,CAAC,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,QAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAA,CAAA,EAAI,EAAE,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAC,CAAC,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAM,GAAA,CAAI,CAAC,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,QAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,SACvL,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,CAAA,CAAE,QAAQ,GAAA,CAAI,CAAC,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,EAC5D;AACA,EAAA,IAAI,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAC1B,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AACtB;AAEA,SAAS,EAAE,KAAA,EAAuB;AAChC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA,GAAI,GAAA;AACnC;AAGA,SAAS,YAAA,CAAa,MAA6B,IAAA,EAA2B;AAC5E,EAAA,MAAM,QAAQ,IAAA,CAAK,WAAA,KAAgB,IAAA,CAAK,KAAA,KAAU,WAAW,wBAAA,GAA2B,yBAAA,CAAA;AACxF,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,cAAc,KAAK,CAAA;AACpD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,eAAe,IAAA,CAAK,KAAA,KAAU,QAAA,GAAW,CAAA,GAAI,CAAA,CAAE,CAAA;AAC/E,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,GAAG,CAAC,CAAA,CAAA;AAG3C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,EAAW,CAAE,MAAA;AACjC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,IAAA,GAAO,GAAA,CAAA,GAAO,IAAA,CAAK,IAAI,CAAA,GAAI,KAAK,IAAI,CAAA;AACrF,EAAA,MAAM,SAAS,MAAA,GAAS,OAAA;AACxB,EAAA,OAAO,CAAA,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,MAAA,GAAS,IAAI,CAAC,CAAC,CAAA,CAAA;AACvD;AAGA,SAAS,aAAA,CAAc,OAAA,EAAyB,MAAA,EAAgB,MAAA,EAAsC;AACpG,EAAA,MAAM,QAAQ,CAAC,CAAA,MAAyB,EAAE,CAAA,EAAG,CAAA,CAAE,KAAK,MAAA,EAAO,GAAI,OAAO,CAAA,GAAI,MAAA,EAAQ,GAAG,CAAA,CAAE,CAAA,GAAA,CAAK,QAAO,GAAI,GAAA,IAAO,IAAI,MAAA,EAAO,CAAA;AACzH,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAC7B,EAAA,IAAI,CAAC,QAAQ,KAAA,EAAO,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,OAAO,GAAA,EAAI;AACrD,EAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,OAAO,EAAE,KAAA,EAAO,KAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,GAAG,CAAA,EAAG,KAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,GAAG,CAAA,EAAG,KAAI,EAAE;AAC3G;AASA,SAAS,aAAa,IAAA,EAA4B;AAChD,EAAA,IAAI,CAAA,GAAI,UAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,CAAA,IAAK,IAAA,CAAK,WAAW,CAAC,CAAA;AACtB,IAAA,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,EAAG,QAAU,CAAA;AAAA,EAC7B;AACA,EAAA,IAAI,KAAA,GAAQ,MAAM,CAAA,IAAK,CAAA;AACvB,EAAA,OAAO,MAAM;AACX,IAAA,KAAA,IAAS,KAAA,IAAS,EAAA;AAClB,IAAA,KAAA,IAAS,KAAA,KAAU,EAAA;AACnB,IAAA,KAAA,IAAS,KAAA,IAAS,CAAA;AAClB,IAAA,KAAA,MAAW,CAAA;AACX,IAAA,OAAO,KAAA,GAAQ,UAAA;AAAA,EACjB,CAAA;AACF;AAGA,SAAS,QAAA,CAAS,QAA4B,EAAA,EAAuB;AACnE,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAE,CAAE,CAAA;AAClD,EAAA,IAAI,EAAA,IAAM,CAAA,IAAK,GAAA,CAAI,MAAA,GAAS,GAAG,OAAO,GAAA;AACtC,EAAA,MAAM,KAAA,GAAQ,IAAI,CAAC,CAAA;AACnB,EAAA,MAAM,MAAA,GAAS,IAAI,CAAC,CAAA;AACpB,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC/B,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AACtC,EAAA,MAAM,IAAA,GAAOf,IAAI,GAAA,CAAI,KAAA,EAAOA,IAAI,GAAA,CAAIA,GAAAA,CAAI,GAAA,CAAIA,GAAAA,CAAI,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAIA,GAAAA,CAAI,KAAK,KAAA,EAAO,MAAM,CAAC,CAAC,CAAC,CAAA;AAC3G,EAAA,MAAM,IAAA,GAAOA,IAAI,GAAA,CAAI,IAAA,EAAMA,IAAI,GAAA,CAAIA,GAAAA,CAAI,GAAA,CAAIA,GAAAA,CAAI,GAAA,CAAI,WAAA,EAAa,IAAI,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAIA,GAAAA,CAAI,KAAK,IAAA,EAAM,WAAW,CAAC,CAAC,CAAC,CAAA;AAClH,EAAA,GAAA,CAAI,CAAC,IAAI,EAAE,CAAA,EAAG,KAAK,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,EAAE;AAChC,EAAA,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAI,EAAE,GAAG,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,CAAA,EAAE;AAC7C,EAAA,OAAO,GAAA;AACT;ACtYA,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,gBAAA,GAAmB,GAAA;AACzB,IAAM,iBAAA,GAAoB,GAAA;AAC1B,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAM,gBAAA,GAAmB,GAAA;AACzB,IAAM,uBAAA,GAA0B,KAAA;AAEhC,IAAM,QAAA,GAAW,CAAC,CAAA,KAAsB,CAAA;AACxC,IAAM,WAAA,GAAc,CAAC,CAAA,KAAsB,IAAA,CAAK,IAAK,CAAA,GAAI,IAAA,CAAK,KAAM,CAAC,CAAA;AAGrE,SAAS,WAAW,KAAA,EAAoC;AACtD,EAAA,MAAM,IAAK,KAAA,CAAqC,CAAA;AAChD,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,GAAI,MAAA;AACrC;AAWO,SAAS,eAAA,CAAgB,cAAA,EAA2B,OAAA,GAAyB,EAAC,EAAkB;AACrG,EAAA,MAAM,EAAE,aAAa,kBAAA,EAAoB,IAAA,GAAO,cAAc,gBAAA,GAAmB,IAAA,EAAM,IAAA,GAAO,KAAA,EAAM,GAAI,OAAA;AACxG,EAAA,IAAI,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEzC,EAAA,MAAM,CAAA,GAAI,IAAA,GAAA,CAAQ,CAAA,GAAI,UAAA,IAAc,IAAA;AACpC,EAAA,MAAM,SAAwB,EAAC;AAE/B,EAAA,MAAM,KAAA,GAAQ,eAAe,CAAC,CAAA;AAC9B,EAAA,IAAI,WAAW,IAAIA,GAAAA,CAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AACvC,EAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,KAAK,CAAA,IAAK,gBAAA;AAC3C,EAAA,MAAA,CAAO,IAAA,CAAK;AAAA,IACV,OAAO,IAAIA,GAAAA,CAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,IAC/B,KAAA,EAAO,QAAA;AAAA,IACP,QAAA,EAAU,mBAAmB,gBAAA,GAAmB,aAAA;AAAA,IAChD,QAAA,EAAU,CAAA;AAAA,IACV,aAAA,EAAe,CAAA;AAAA,IACf,QAAQ,IAAA,GAAO;AAAA,GAChB,CAAA;AAED,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAC9C,IAAA,MAAM,GAAA,GAAM,eAAe,CAAC,CAAA;AAC5B,IAAA,MAAM,QAAQ,IAAIA,GAAAA,CAAI,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAGlC,IAAA,MAAM,KAAA,GAAQ,IAAA,IAAQ,CAAA,KAAM,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQA,GAAAA,CAAI,GAAA,CAAI,QAAA,EAAU,KAAA,EAAO,CAAC,CAAA;AAC1F,IAAA,MAAM,QAAA,GAAWA,GAAAA,CAAI,IAAA,CAAK,KAAA,EAAO,QAAQ,CAAA;AAGzC,IAAA,IAAI,QAAA,GAAW,IAAA,IAAS,CAAA,GAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AACvD,IAAA,aAAA,IAAiB,QAAA;AACjB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,KAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA,EAAU,UAAA,CAAW,GAAG,CAAA,IAAK,gBAAA;AAAA,MAC7B,QAAA;AAAA,MACA,aAAA;AAAA,MACA,QAAQ,IAAA,GAAO;AAAA,KAChB,CAAA;AACD,IAAA,QAAA,GAAW,KAAA;AAAA,EACb;AAEA,EAAA,OAAO,UAAA,CAAW,QAAQ,OAAO,CAAA;AACnC;AAGA,SAAS,UAAA,CAAW,QAAuB,OAAA,EAAuC;AAChF,EAAA,MAAM;AAAA,IACJ,IAAA,GAAO,YAAA;AAAA,IACP,QAAA,GAAW,gBAAA;AAAA,IACX,SAAA,GAAY,iBAAA;AAAA,IACZ,gBAAA,GAAmB,IAAA;AAAA,IACnB,MAAA,GAAS;AAAA,GACX,GAAI,OAAA;AACJ,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,KAAA,MAAW,CAAA,IAAK,MAAA,EAAQ,CAAA,CAAE,MAAA,GAAS,IAAA,GAAO,CAAA;AAC1C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,gBAAA,GAAmB,MAAA,CAAO,CAAC,CAAA,EAAG,QAAA,IAAY,gBAAA;AAC9C,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,WAAW,KAAA,CAAM,QAAA;AACrB,IAAA,IAAI,gBAAA,EAAkB;AAGpB,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,WAAW,IAAI,CAAA;AAC/C,MAAA,MAAM,SAAS,CAAA,GAAI,KAAA;AACnB,MAAA,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,oBAAoB,MAAA,GAAS,gBAAA,KAAqB,0BAA0B,SAAA,CAAU,CAAA;AAAA,IAC/G;AACA,IAAA,gBAAA,GAAmB,QAAA;AACnB,IAAA,KAAA,CAAM,QAAA,GAAW,QAAA;AACjB,IAAA,KAAA,CAAM,MAAA,GAAU,QAAQ,GAAA,GAAM,MAAA,CAAO,QAAQ,CAAA,GAAI,QAAA,GAAW,WAAW,CAAA,CAAA,GAAM,CAAA;AAAA,EAC/E;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,WAAA,CAAY,QAAA,EAA6C,IAAA,EAAc,WAAA,EAA6B;AAC3G,EAAA,MAAM,QAAQ,QAAA,EAAU,KAAA;AACxB,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,KAAA,EAAO,OAAO,CAAA;AACnD,EAAA,IAAI,UAAU,IAAA,EAAM,OAAO,KAAK,GAAA,CAAI,IAAA,EAAM,cAAc,GAAG,CAAA;AAC3D,EAAA,OAAO,KAAA;AACT;AAWO,SAAS,sBAAA,CAAuB,YAAA,EAA6B,OAAA,GAAyB,EAAC,EAAU;AACtG,EAAA,MAAM,EAAE,IAAA,GAAO,YAAA,EAAc,KAAA,EAAO,KAAI,GAAI,OAAA;AAC5C,EAAA,IAAI,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEvC,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,YAAA,CAAa,MAAA,GAAS,CAAC,CAAA,CAAG,aAAA;AACrD,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,KAAA,EAAO,IAAA,EAAM,KAAK,CAAA;AACjD,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,EAAK,IAAA,EAAM,KAAK,CAAA;AAC7C,EAAA,MAAM,WAAA,GAAc,OAAO,MAAA,IAAU,WAAA;AACrC,EAAA,MAAM,SAAA,GAAY,KAAK,MAAA,IAAU,WAAA;AAEjC,EAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAE7B,IAAA,MAAM,IAAA,GAAO,aAAa,CAAC,CAAA;AAC3B,IAAA,MAAM,OAAc,EAAC;AACrB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,MAAA,MAAM,KAAA,GAAS,CAAA,GAAI,EAAA,GAAM,IAAA,CAAK,EAAA,GAAK,CAAA;AACnC,MAAA,IAAA,CAAK,IAAA,CAAK,IAAIA,GAAAA,CAAI,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA,CAAK,IAAI,KAAK,CAAA,GAAI,KAAK,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA,CAAK,IAAI,KAAK,CAAA,GAAI,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IAC/G;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAc,EAAC;AACrB,EAAA,MAAM,QAAe,EAAC;AACtB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,KAAA,GAAQ,aAAa,CAAC,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAA,GAAI,CAAC,CAAA,IAAK,KAAA;AACpC,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,CAAA,GAAI,CAAC,CAAA,IAAK,KAAA;AACxC,IAAA,MAAM,YAAYA,GAAAA,CAAI,GAAA,CAAIA,GAAAA,CAAI,GAAA,CAAI,SAAS,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,OAAO,QAAA,KAAa,KAAA,GAAQ,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAK,CAAC,CAAA;AAC/H,IAAA,IAAI,SAAA,CAAU,GAAA,EAAI,KAAM,CAAA,EAAG;AAC3B,IAAA,MAAM,SAAS,IAAIA,GAAAA,CAAI,CAAC,SAAA,CAAU,CAAA,EAAG,UAAU,CAAC,CAAA;AAEhD,IAAA,IAAI,SAAS,KAAA,CAAM,MAAA;AACnB,IAAA,IAAI,UAAA,GAAa,KAAK,KAAA,CAAM,aAAA,GAAgB,YAAY,MAAA,IAAU,WAAA,CAAY,KAAA,CAAM,aAAA,GAAgB,UAAU,CAAA;AAC9G,IAAA,IAAI,QAAA,GAAW,CAAA,IAAK,KAAA,GAAQ,KAAA,CAAM,aAAA,GAAgB,QAAA,EAAU,MAAA,IAAU,SAAA,CAAA,CAAW,KAAA,GAAQ,KAAA,CAAM,aAAA,IAAiB,QAAQ,CAAA;AAExH,IAAA,IAAA,CAAK,IAAA,CAAK,IAAIA,GAAAA,CAAI,KAAA,CAAM,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,MAAA,EAAQ,MAAM,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,MAAM,CAAC,CAAA;AACvF,IAAA,KAAA,CAAM,IAAA,CAAK,IAAIA,GAAAA,CAAI,KAAA,CAAM,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,MAAA,EAAQ,MAAM,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,MAAM,CAAC,CAAA;AAAA,EAC1F;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAI,CAAA;AACxB,EAAA,IAAI,GAAA,EAAK,QAAQ,KAAA,EAAO,OAAA,CAAQ,KAAK,GAAG,SAAA,CAAU,YAAA,CAAa,YAAA,CAAa,MAAA,GAAS,CAAC,GAAI,IAAA,CAAK,IAAA,CAAK,SAAS,CAAC,CAAA,EAAG,MAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAC,CAAA;AACzI,EAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,KAAA,CAAM,OAAA,EAAS,CAAA;AAC/B,EAAA,IAAI,OAAO,GAAA,KAAQ,KAAA,UAAe,IAAA,CAAK,GAAG,UAAU,YAAA,CAAa,CAAC,CAAA,EAAI,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,GAAG,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA;AACvG,EAAA,OAAO,OAAA;AACT;AAGA,SAAS,SAAA,CAAU,KAAA,EAAoB,IAAA,EAAuB,EAAA,EAA4B;AACxF,EAAA,IAAI,CAAC,QAAQ,CAAC,EAAA,IAAM,MAAM,MAAA,IAAU,CAAA,SAAU,EAAC;AAC/C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AAC5E,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AACtE,EAAA,IAAI,QAAQ,QAAA,GAAW,UAAA;AACvB,EAAA,OAAO,KAAA,IAAS,CAAA,EAAG,KAAA,IAAS,IAAA,CAAK,EAAA,GAAK,CAAA;AACtC,EAAA,MAAM,KAAA,GAAQ,CAAA;AACd,EAAA,MAAM,MAAa,EAAC;AACpB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,KAAA,GAAQ,UAAA,GAAc,KAAA,GAAQ,CAAA,GAAK,KAAA;AACzC,IAAA,GAAA,CAAI,IAAA,CAAK,IAAIA,GAAAA,CAAI,KAAA,CAAM,MAAM,CAAA,GAAI,IAAA,CAAK,IAAI,KAAK,CAAA,GAAI,MAAM,MAAA,EAAQ,KAAA,CAAM,MAAM,CAAA,GAAI,IAAA,CAAK,IAAI,KAAK,CAAA,GAAI,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,EAClH;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,SAAA,CAAU,MAAA,EAAmB,OAAA,GAAyB,EAAC,EAAU;AAC/E,EAAA,OAAO,sBAAA,CAAuB,eAAA,CAAgB,MAAA,EAAQ,OAAO,GAAG,OAAO,CAAA;AACzE;AAUO,SAAS,0BAAA,CAA2B,MAAA,EAAuB,MAAA,GAAS,KAAA,EAAe;AACxF,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,CAAC,CAAA,CAAG,KAAA;AACzB,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAEpE,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,CAAE,CAAA;AACrD,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,CAAG,KAAA;AACrB,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,CAAG,KAAA;AACzB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,KAAA,CAAM,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAA,CAAO,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAA,CAAO,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,EAC/F;AACA,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,CAAG,KAAA;AACxC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAC,CAAA,CAAE,CAAA;AAC/C,EAAA,IAAI,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAC1B,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;AAEA,SAAS,MAAM,KAAA,EAAuB;AACpC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA,GAAI,GAAA;AACnC;ACrQO,SAAS,yBAAyB,OAAA,EAA6B,MAAA,EAAgB,MAAA,EAAgB,MAAA,GAAgB,EAAC,EAAU;AAC/H,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,IAAO,MAAA;AAC3B,EAAA,MAAM,OAAA,GACJ,GAAA,KAAQgB,MAAAA,GACJC,OAAAA,CAAQ,cAAA,CAAe,QAAQ,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,GAAA,EAAI,CAAE,CAAA,GAC9EA,OAAAA,CAAQ,YAAA,CAAa,OAAA,CAAQ,MAAM,CAAA;AACzC,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAG3B,IAAA,MAAM,MAAA,GAAS,IAAIjB,GAAAA,CAAI,KAAA,CAAM,CAAA,GAAI,QAAQ,KAAA,CAAM,CAAA,GAAI,MAAA,EAAQ,KAAA,CAAM,CAAC,CAAA;AAGlE,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,IAAI,IAAA,IAAQ,KAAK,CAAA,KAAM,MAAA,CAAO,KAAK,IAAA,CAAK,CAAA,KAAM,OAAO,CAAA,EAAG;AACxD,IAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,EACpB;AACA,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,yBAAA,CAA0B,QAAA,EAAgC,MAAA,GAAS,CAAA,EAAG,SAAS,CAAA,EAAU;AACvG,EAAA,MAAM,SAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU,wBAAA,CAAyB,OAAA,EAAS,MAAA,EAAQ,QAAQ,MAAM,CAAA;AACxF,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["/**\n * Rich text in and out of the two formats the world outside the canvas speaks:\n * HTML and plain text.\n *\n * The canonical form is always the ProseMirror document in `props.richText`\n * (see `rich-text.ts`). These three functions are the boundary: they take an\n * `editor` first because the conversion depends on the editor's configured\n * extension set — an app that registered a node type mocanvas has never heard\n * of should get that node rendered, not dropped.\n */\n\nimport type { Editor } from \"@mocanvas/editor\"\nimport { getRichTextExtensions } from \"./measure-html\"\nimport { asRichText, richTextToHtml, richTextToText, type RichText, type RichTextMark, type RichTextNode, type RichTextSource } from \"./rich-text\"\n\n/**\n * A rich-text document as HTML.\n *\n * Safe to hand to `innerHTML`: text is escaped and link hrefs are\n * scheme-checked on the way out. Useful for rendering a label outside the\n * canvas, and for exporting a document to somewhere that speaks HTML.\n */\nexport function renderHtmlFromRichText(editor: Editor, richText: RichTextSource): string {\n return richTextToHtml(richText, { extensions: getRichTextExtensions(editor) })\n}\n\n/**\n * A rich-text document as plain text.\n *\n * Formatting is dropped, structure is not: a hard break and a block boundary\n * both become a newline, so the result has the same number of lines the label\n * shows.\n */\nexport function renderPlaintextFromRichText(_editor: Editor, richText: RichTextSource): string {\n return richTextToText(richText)\n}\n\n/* ---- HTML → rich text ----------------------------------------------------- */\n\nconst MARK_BY_TAG: Readonly<Record<string, string>> = {\n b: \"bold\",\n strong: \"bold\",\n i: \"italic\",\n em: \"italic\",\n u: \"underline\",\n s: \"strike\",\n strike: \"strike\",\n del: \"strike\",\n code: \"code\",\n mark: \"highlight\",\n}\n\nconst BLOCK_BY_TAG: Readonly<Record<string, string>> = {\n p: \"paragraph\",\n div: \"paragraph\",\n h1: \"heading\",\n h2: \"heading\",\n h3: \"heading\",\n h4: \"heading\",\n h5: \"heading\",\n h6: \"heading\",\n ul: \"bulletList\",\n ol: \"orderedList\",\n li: \"listItem\",\n blockquote: \"blockquote\",\n pre: \"codeBlock\",\n}\n\nconst SAFE_HREF = /^(?:https?:|mailto:|tel:|#|\\/|\\.{1,2}\\/)/i\n\n/**\n * Parse HTML into a rich-text document.\n *\n * The inverse of {@link renderHtmlFromRichText}, and the path a paste from a\n * browser or a word processor takes. Unknown elements are *descended into*\n * rather than dropped, so text inside a `<section>` or a `<font>` survives even\n * though the wrapper does not; unknown attributes are ignored entirely, which\n * is what keeps a paste from carrying a stylesheet onto the canvas.\n *\n * Returns a one-empty-paragraph document when there is nothing to parse, so the\n * result is always a valid document with a caret line.\n */\nexport function renderRichTextFromHTML(_editor: Editor, html: string): RichText {\n if (typeof DOMParser === \"undefined\") {\n // Without a parser the honest reading of arbitrary HTML is \"text I cannot\n // interpret\". Stripping tags with a regex would be worse than useless: it\n // would silently mangle content that has any angle bracket in it.\n return asRichText(\"\")\n }\n\n const document_ = new DOMParser().parseFromString(`<body>${html}</body>`, \"text/html\")\n const blocks: RichTextNode[] = []\n walkBlocks(document_.body, blocks, [])\n const nonEmpty = blocks.filter((block) => block.content?.length || block.type === \"paragraph\")\n if (nonEmpty.length === 0) return asRichText(\"\")\n return { type: \"doc\", content: nonEmpty }\n}\n\n/** Collect block-level nodes out of `element`, in document order. */\nfunction walkBlocks(element: Node, out: RichTextNode[], marks: RichTextMark[]): void {\n for (const child of Array.from(element.childNodes)) {\n if (child.nodeType === 3 /* text */) {\n const text = child.nodeValue ?? \"\"\n if (!text.trim()) continue\n appendInline(currentParagraph(out), text, marks)\n continue\n }\n if (child.nodeType !== 1 /* element */) continue\n\n const el = child as Element\n const tag = el.tagName.toLowerCase()\n if (tag === \"br\") {\n currentParagraph(out).content?.push({ type: \"hardBreak\" })\n continue\n }\n if (tag === \"hr\") {\n out.push({ type: \"horizontalRule\" })\n continue\n }\n\n const mark = markFor(tag, el)\n if (mark) {\n walkBlocks(el, out, [...marks, mark])\n continue\n }\n\n const block = BLOCK_BY_TAG[tag]\n if (block) {\n const node: RichTextNode = { type: block, content: [] }\n if (block === \"heading\") node.attrs = { level: Number(tag.slice(1)) || 1 }\n const inner: RichTextNode[] = []\n walkBlocks(el, inner, marks)\n // A list wraps other blocks; everything else holds inline content, which\n // the recursion has already collected into paragraphs of its own.\n if (block === \"bulletList\" || block === \"orderedList\") node.content = inner\n else node.content = inner.flatMap((child_) => child_.content ?? [])\n out.push(node)\n continue\n }\n\n // An element we have no node type for: keep its text, lose its wrapper.\n walkBlocks(el, out, marks)\n }\n}\n\n/** The paragraph in progress, starting one when there is none. */\nfunction currentParagraph(out: RichTextNode[]): RichTextNode {\n const last = out[out.length - 1]\n if (last && last.content && last.type !== \"bulletList\" && last.type !== \"orderedList\") return last\n const paragraph: RichTextNode = { type: \"paragraph\", content: [] }\n out.push(paragraph)\n return paragraph\n}\n\nfunction appendInline(node: RichTextNode, text: string, marks: RichTextMark[]): void {\n node.content ??= []\n node.content.push(marks.length > 0 ? { type: \"text\", text, marks } : { type: \"text\", text })\n}\n\n/** The mark an inline tag contributes, or `null` when it is not one. */\nfunction markFor(tag: string, element: Element): RichTextMark | null {\n if (tag === \"a\") {\n const href = element.getAttribute(\"href\")?.trim()\n // A link whose scheme could execute contributes no mark, and so falls\n // through to the unknown-element branch: its text survives, its link does\n // not.\n if (!href || !SAFE_HREF.test(href)) return null\n return { type: \"link\", attrs: { href } }\n }\n const mark = MARK_BY_TAG[tag]\n return mark ? { type: mark } : null\n}\n","/**\n * The TipTap side of rich text — for the apps that have TipTap.\n *\n * mocanvas measures, lays out, rasterizes, exports and round-trips rich text\n * with no TipTap at all; the library is an *optional peer dependency* and is\n * needed only to edit a label in a WYSIWYG surface. Two ProseMirror instances\n * on one page break schema identity in ways that are miserable to diagnose, so\n * an app that already ships TipTap must keep exactly one copy — which is\n * precisely what a peer dependency enforces.\n *\n * Everything here therefore imports TipTap *dynamically*, from a module id\n * built at runtime, so a bundler in an app that never calls these does not try\n * to resolve them.\n */\n\nimport { RICH_TEXT_MARKS, RICH_TEXT_NODES, type RichTextExtension } from \"./tiptap-extensions\"\n\n/** The `StarterKit` options an app may override. Structural, so TipTap's own type fits. */\nexport interface TipTapStarterKitOptions {\n [option: string]: unknown\n}\n\n/**\n * mocanvas's default TipTap extension set, with `StarterKit` configured.\n *\n * Returns TipTap `Extension` instances when the peer dependency is installed.\n * When it is not, it returns the description-driven default set instead — the\n * same list `tipTapDefaultExtensions` holds — so a caller that only wanted to\n * pass something to `textOptions.tipTapConfig.extensions` still gets a working\n * configuration rather than a crash. A caller that genuinely needs live TipTap\n * extensions can tell the two apart: the descriptions carry a `kind` field and\n * real extensions do not.\n */\nexport function getTipTapDefaultExtensions(starterKitOptions: Partial<TipTapStarterKitOptions> = {}): readonly RichTextExtension[] {\n const starterKit = loadedStarterKit\n if (!starterKit) return [...RICH_TEXT_NODES, ...RICH_TEXT_MARKS]\n const configured = typeof starterKit.configure === \"function\" ? starterKit.configure(starterKitOptions) : starterKit\n return [configured as RichTextExtension, KeyboardShiftEnterTweakExtension]\n}\n\ninterface ConfigurableExtension extends RichTextExtension {\n configure?(options: object): RichTextExtension\n}\n\nlet loadedStarterKit: ConfigurableExtension | null = null\n\n/**\n * Load TipTap's `StarterKit` so {@link getTipTapDefaultExtensions} can return\n * real extensions.\n *\n * Separate from `getTipTapDefaultExtensions` because that one has to be\n * synchronous — it is called while building the editor's options object — and\n * a dynamic import is not. An app calls this once at startup and then uses the\n * synchronous getter everywhere.\n */\nexport async function loadTipTapDefaultExtensions(): Promise<readonly RichTextExtension[]> {\n if (!loadedStarterKit) {\n const moduleId = \"@tiptap/starter-kit\"\n let loaded: unknown\n try {\n loaded = await import(/* @vite-ignore */ /* webpackIgnore: true */ moduleId)\n } catch (cause) {\n throw new Error(\n \"mocanvas: `@tiptap/starter-kit` is an optional peer dependency and is not installed. Run `npm install @tiptap/starter-kit@^3 @tiptap/core@^3 @tiptap/pm@^3`, or use `tipTapDefaultExtensions` instead.\",\n { cause },\n )\n }\n loadedStarterKit = ((loaded as { default?: unknown }).default ?? loaded) as ConfigurableExtension\n }\n return getTipTapDefaultExtensions()\n}\n\n/**\n * Makes Shift+Enter insert a line break instead of splitting the block.\n *\n * ProseMirror's default is the other way round, which is wrong for a canvas\n * label: a note or a geo label is one block of text with several lines in it,\n * not a document of paragraphs, and Enter has to commit the edit on a\n * single-line label. Binding the break to Shift+Enter is what makes both\n * behaviours available without a modifier key doing two jobs.\n *\n * Declared as a description rather than as a live TipTap extension so importing\n * it costs nothing; the editor factory an app registers is what turns it into\n * a real key binding.\n */\nexport const KeyboardShiftEnterTweakExtension: RichTextExtension & {\n kind: \"keymap\"\n keys: Readonly<Record<string, string>>\n} = {\n name: \"keyboardShiftEnterTweak\",\n kind: \"keymap\",\n keys: { \"Shift-Enter\": \"setHardBreak\" },\n}\n","/**\n * The wiring a shape's text label needs to be editable.\n *\n * A label is a DOM element sitting over the canvas, and the same handful of\n * questions come up for every shape that has one: is this shape being edited,\n * should a double click start editing it, what happens on Escape, where does a\n * paste go. These two hooks answer them once, so a custom shape's label is a\n * spread of props rather than a re-implementation.\n *\n * Two hooks rather than one because the two label kinds differ in exactly one\n * respect — what `handleChange` writes back — and collapsing them into one hook\n * with a mode flag would make every call site say which mode it is anyway.\n */\n\nimport { useCallback, useEffect, useRef, useState, type ClipboardEvent as ReactClipboardEvent, type PointerEvent as ReactPointerEvent, type RefObject } from \"react\"\nimport { useEditor, useValue, type ShapeId } from \"@mocanvas/editor\"\nimport { richTextToText, type RichText, type RichTextSource } from \"./rich-text\"\n\n/** Everything a label component needs, from either hook. */\nexport interface EditableTextHandle {\n /** Stop editing when focus leaves the label. */\n handleBlur: () => void\n /** Select the whole label when it takes focus, so typing replaces it. */\n handleFocus: () => void\n /** Start editing on a double click. */\n handleDoubleClick: (e: { nativeEvent: Event } | Event) => void\n /** Swallow pointer-down inside the input so the canvas does not start a drag. */\n handleInputPointerDown: (e: ReactPointerEvent) => void\n /** Escape commits, Enter commits a single-line label. */\n handleKeyDown: (e: KeyboardEvent) => void\n /** Let a paste inside the label reach the label rather than the canvas. */\n handlePaste: (e: ClipboardEvent | ReactClipboardEvent<HTMLTextAreaElement>) => void\n /** Whether this shape is the one being edited. */\n isEditing: boolean\n /** Whether the label has no text; `undefined` before it is known. */\n isEmpty: boolean | undefined\n /**\n * Whether the editing surface may mount.\n *\n * One frame behind {@link isEditing}: a contenteditable that mounts in the\n * same commit as the state change steals focus before the canvas has\n * finished handling the click that caused it.\n */\n isReadyForEditing: boolean\n /** Ref for the element the text is edited in. */\n rInput: RefObject<HTMLDivElement | null>\n}\n\n/** The half of the handle that does not depend on what the label stores. */\nfunction useEditableTextCore(shapeId: ShapeId, isEmpty: boolean | undefined, singleLine: boolean): EditableTextHandle {\n const editor = useEditor()\n const rInput = useRef<HTMLDivElement | null>(null)\n const isEditing = useValue(\"isEditingShape\", () => editor.getEditingShapeId() === shapeId, [editor, shapeId])\n const [isReadyForEditing, setIsReadyForEditing] = useState(false)\n\n useEffect(() => {\n if (!isEditing) {\n setIsReadyForEditing(false)\n return\n }\n // One frame's delay; see `isReadyForEditing`.\n const raf = requestAnimationFrame(() => setIsReadyForEditing(true))\n return () => cancelAnimationFrame(raf)\n }, [isEditing])\n\n const handleBlur = useCallback(() => {\n if (editor.getEditingShapeId() === shapeId) editor.setEditingShape(null)\n }, [editor, shapeId])\n\n const handleFocus = useCallback(() => {\n const element = rInput.current\n if (!element || typeof window === \"undefined\") return\n const selection = window.getSelection?.()\n if (!selection) return\n const range = document.createRange()\n range.selectNodeContents(element)\n selection.removeAllRanges()\n selection.addRange(range)\n }, [])\n\n const handleDoubleClick = useCallback(\n (e: { nativeEvent: Event } | Event) => {\n const native = \"nativeEvent\" in e ? e.nativeEvent : e\n native.stopPropagation?.()\n editor.setEditingShape(shapeId)\n },\n [editor, shapeId],\n )\n\n const handleInputPointerDown = useCallback((e: ReactPointerEvent) => {\n // The canvas listens on the container; without this a drag inside the\n // label would translate the shape instead of selecting text.\n e.stopPropagation()\n }, [])\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault()\n editor.setEditingShape(null)\n return\n }\n if (singleLine && e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault()\n editor.setEditingShape(null)\n }\n },\n [editor, singleLine],\n )\n\n const handlePaste = useCallback((e: ClipboardEvent | ReactClipboardEvent<HTMLTextAreaElement>) => {\n // The canvas's own paste handler would turn the clipboard into shapes.\n e.stopPropagation()\n }, [])\n\n return { handleBlur, handleFocus, handleDoubleClick, handleInputPointerDown, handleKeyDown, handlePaste, isEditing, isEmpty, isReadyForEditing, rInput }\n}\n\n/** The handle for a label that stores a rich-text document. */\nexport function useEditableRichText(\n shapeId: ShapeId,\n type: string,\n richText?: RichTextSource,\n): EditableTextHandle & { handleChange: (next: { richText: RichText }) => void } {\n const editor = useEditor()\n const core = useEditableTextCore(shapeId, richText === undefined ? undefined : richTextToText(richText).length === 0, false)\n\n const handleChange = useCallback(\n ({ richText: next }: { richText: RichText }) => {\n editor.updateShape({ id: shapeId, type, props: { richText: next } } as never)\n },\n [editor, shapeId, type],\n )\n\n return { ...core, handleChange }\n}\n\n/** The handle for a label that stores a plain string. */\nexport function useEditablePlainText(\n shapeId: ShapeId,\n type: string,\n text?: string,\n): EditableTextHandle & { handleChange: (next: { text: string }) => void } {\n const editor = useEditor()\n const core = useEditableTextCore(shapeId, text === undefined ? undefined : text.length === 0, true)\n\n const handleChange = useCallback(\n ({ text: next }: { text: string }) => {\n editor.updateShape({ id: shapeId, type, props: { text: next } } as never)\n },\n [editor, shapeId, type],\n )\n\n return { ...core, handleChange }\n}\n\n/**\n * Put a shape into text-editing mode from outside the label.\n *\n * The path a tool or a menu item takes: creating a note and dropping the caret\n * into it, or \"Edit text\" in the context menu. Selecting the shape first is\n * deliberate — editing a shape that is not selected leaves the selection UI\n * pointing somewhere else.\n */\nexport function startEditingShapeWithRichText(\n editor: ReturnType<typeof useEditor>,\n shapeOrId: ShapeId | { id: ShapeId },\n options: { selectAll?: boolean } = {},\n): void {\n const id = typeof shapeOrId === \"string\" ? shapeOrId : shapeOrId.id\n const shape = editor.getShape(id)\n if (!shape) return\n editor.run(() => {\n editor.setSelectedShapes([id])\n editor.setEditingShape(id)\n })\n if (options.selectAll === false) return\n // The label's own `handleFocus` selects everything once it mounts; nothing\n // else can, because the editing surface does not exist yet at this point.\n}\n","/**\n * The WYSIWYG surface a label is edited in: a TipTap editor, mounted into the\n * container the label hands over.\n *\n * ## Why this exists at all\n *\n * Everything mocanvas *does* with rich text — measure it, lay it out, rasterize\n * it, export it, round-trip it through a `.tldr` — is derived from the document\n * JSON and needs no editor. Only editing does. That is why the seam in\n * `tiptap-extensions` is a seam and not a hard call, and why a host can replace\n * this with its own.\n *\n * Without it a label edits through a plain `<textarea>` over the text projection\n * of the document, which costs two things at once: no formatting commands, so\n * `cmd+B` does nothing; and a visible jump on entering edit mode, because a\n * textarea lays text out its own way and the static label is HTML. Both are the\n * same missing piece.\n *\n * ## Why StarterKit, minus three\n *\n * The document model a mocanvas label understands is described by\n * `tipTapDefaultExtensions`, and StarterKit covers it with three exceptions that\n * have no place inside a shape's label: a blockquote, a code block and a\n * horizontal rule are all block furniture for a page, not a caption. They are\n * turned off rather than left to produce documents the renderer would then have\n * to be taught to draw.\n */\nimport { Editor as TipTapEditor } from \"@tiptap/core\"\nimport StarterKit from \"@tiptap/starter-kit\"\nimport type { RichTextEditorFactory, RichTextEditorHandle, RichTextEditorMountOptions, RichTextExtension } from \"./tiptap-extensions\"\nimport { registerRichTextEditorFactory } from \"./tiptap-extensions\"\nimport type { RichTextNode } from \"./rich-text\"\n\n/** Block types a label has no use for; see the note above. */\nconst DISABLED_STARTER_KIT_NODES = { blockquote: false, codeBlock: false, horizontalRule: false } as const\n\n/**\n * Whether an entry of the extension list is a real TipTap extension rather than\n * one of the plain descriptions `tipTapDefaultExtensions` is made of.\n *\n * The list serves both: the description-driven paths read `kind` and `tag` off\n * it, and a host that has TipTap can put actual extensions in the same array.\n * Only the real ones can be handed to an editor, and a description passed to one\n * throws, so they are told apart by the shape TipTap itself gives them.\n */\nfunction isTipTapExtension(entry: RichTextExtension): boolean {\n const e = entry as { type?: unknown; config?: unknown }\n return typeof e.type === \"string\" && typeof e.config === \"object\" && e.config !== null\n}\n\n/** Mount a TipTap editor into `container` and report what the user types. */\nexport const tipTapRichTextEditorFactory: RichTextEditorFactory = (options: RichTextEditorMountOptions): RichTextEditorHandle => {\n const { container, initialValue, extensions, singleLine, onChange, onFinish } = options\n\n const editor = new TipTapEditor({\n element: container,\n content: initialValue,\n extensions: [StarterKit.configure(DISABLED_STARTER_KIT_NODES), ...extensions.filter(isTipTapExtension)] as never,\n editorProps: {\n handleKeyDown: (_view, event) => {\n if (event.key === \"Escape\") {\n onFinish()\n return true\n }\n // A single-line label — a frame's name — takes Enter as \"done\" and only\n // shift+Enter as a break, the same bargain every single-line field makes.\n if (event.key === \"Enter\" && singleLine && !event.shiftKey) {\n onFinish()\n return true\n }\n return false\n },\n },\n onUpdate: ({ editor: e }) => {\n onChange(e.getJSON() as RichTextNode & { type: \"doc\" })\n },\n })\n\n // ProseMirror ships a focus ring of its own — a 1px orange outline on the\n // focused editable. On a page it marks the field being typed into; on a canvas\n // the shape is already outlined, and the ring lands *inside* it as a second,\n // differently coloured box. Worse, an outline traces line boxes rather than the\n // block, so on a label of one short line it comes out stepped, which reads as a\n // rendering fault rather than a focus ring.\n const dom = editor.view.dom as HTMLElement\n dom.style.outline = \"none\"\n\n return {\n focus() {\n editor.commands.focus(\"end\")\n },\n destroy() {\n // `destroy` also removes the ProseMirror DOM it built, which is what the\n // contract asks for: the container is the label's, not the editor's.\n editor.destroy()\n },\n }\n}\n\n/**\n * Install the TipTap surface as the default.\n *\n * Called from the package's install path, so a label is editable with\n * formatting out of the box. A host that wants its own — one already running\n * TipTap, and so wanting the editor built from *its* copy of ProseMirror —\n * calls {@link registerRichTextEditorFactory} afterwards and replaces this.\n */\nexport function installDefaultRichTextEditor(): () => void {\n return registerRichTextEditorFactory(tipTapRichTextEditorFactory)\n}\n","import {\n getLoadedEngine,\n registerEngineProvider,\n registerExportImplementation,\n registerTextMeasureImplementation,\n type Editor,\n type ShapeId,\n} from \"@mocanvas/editor\"\nimport { exportToBlob, getSvgString } from \"./export\"\nimport { getTextMeasure } from \"./text\"\nimport { installDefaultRichTextEditor } from \"./text/tiptap-editor\"\n\n/**\n * `@mocanvas/editor` declares `Editor.getSvgString`, `Editor.toImage` and\n * `Editor.textMeasure` but cannot implement them: exporting needs the default\n * shapes' SVG renderers and measuring text needs the DOM, both of which live\n * here, and this package depends on the editor rather than the other way round.\n *\n * Importing `mocanvas` runs this module and fills those three in. An app that\n * builds on `@mocanvas/editor` alone either imports this package or registers\n * its own through the same seam.\n */\nregisterExportImplementation({\n getSvgString,\n async toImage(editor: Editor, ids?: readonly ShapeId[], opts = {}) {\n const { format = \"png\", ...rest } = opts\n // Measure from the SVG so the caller learns the size without decoding the blob.\n const measured = getSvgString(editor, ids, rest)\n if (!measured) throw new Error(\"Nothing to export: the page has no shapes, and none were named.\")\n const blob = await exportToBlob(editor, { ...rest, ...(ids === undefined ? {} : { ids }), format })\n return { blob, width: measured.width, height: measured.height }\n },\n})\n\nregisterTextMeasureImplementation(getTextMeasure)\n\n/**\n * …and the surface a label is edited in. Without one, editing falls back to a\n * plain `<textarea>` over the text projection of the document: no formatting\n * commands, and a visible jump on entering edit mode because a textarea lays\n * text out differently from the HTML the static label is.\n *\n * Registered here rather than left to the app because a label that cannot be\n * emboldened is a missing feature, not a configuration. A host with its own\n * TipTap registers over it through the same seam.\n */\ninstallDefaultRichTextEditor()\n\n/**\n * Let `new Editor({ ... })` be constructed without threading the engine\n * through: it picks up whatever `loadEngine()` last produced. `<Mocanvas />`\n * loads it before mounting, so an app that uses the component never sees this.\n */\nregisterEngineProvider(getLoadedEngine)\n","/**\n * The shape indicator overlay, as the SDK exposes it.\n *\n * In 5.2 `ShapeIndicatorOverlayUtil` and `TLShapeIndicatorOverlay` stopped being\n * part of the editor package and became part of the SDK package — this one.\n *\n * Only the *names* could make the whole trip. `<Canvas>` in `@mocanvas/editor`\n * still has to draw selection outlines for an app that depends on the editor\n * alone, and the editor cannot import the package that depends on it, so the\n * machinery stays there as `ShapeIndicatorCompositor` (together with\n * `OverlayUtil`, `TLIndicatorPath` and `getShapeIndicatorPath`, which are the\n * extension seam a custom shape writes against). What lives here is the class\n * an app registers and configures, and the record type its `getIndicators()`\n * hands back.\n */\nimport { ShapeIndicatorCompositor, type TLIndicatorHost, type TLIndicatorOverlay } from \"@mocanvas/editor\"\n\n/**\n * Paints every selection, hover and drop-target outline onto the canvas overlay\n * in a single pass.\n *\n * Register it — or a configured subclass — as an overlay util:\n *\n * ```ts\n * <Mocanvas overlayUtils={[ShapeIndicatorOverlayUtil.configure({ lineWidth: 2 })]} />\n * ```\n *\n * Override `shouldShowIndicator` to control *which* shapes get an outline;\n * anything finer belongs in a shape util's `getIndicatorPath`.\n */\nexport class ShapeIndicatorOverlayUtil<\n H extends TLIndicatorHost = TLIndicatorHost,\n> extends ShapeIndicatorCompositor<H> {}\n\n/**\n * One resolved indicator: the paths to stroke, the page transform to stroke\n * them under, and the paint to use.\n *\n * Produced by {@link ShapeIndicatorOverlayUtil.getIndicators}.\n */\nexport type TLShapeIndicatorOverlay = TLIndicatorOverlay\n","/**\n * The small amount of canvas arithmetic every overlay painter repeats.\n *\n * Two rules are stated here once so no painter has to restate them:\n *\n * - **Hairlines.** Overlay chrome is measured in CSS pixels, not page units. A\n * 1.5px selection stroke has to stay 1.5px at 10 % zoom and at 800 %, which\n * means dividing by the zoom *if and only if* the camera transform is in\n * effect. {@link hairline} is that division, named so the intent survives.\n * - **Which space.** {@link withCamera} runs a callback with the page→screen\n * transform installed and restores the context afterwards; painters that work\n * in screen pixels (a handle, a cursor) simply do not call it.\n *\n * Nothing here reads a colour. Colours come from the theme, through\n * `getOverlayDisplayValues`.\n */\nimport type { CameraLike } from \"./types\"\n\n/**\n * Run `draw` with the camera installed, so everything inside is in **page**\n * coordinates. Restores the context afterwards, even if `draw` throws.\n */\nexport function withCamera(\n ctx: CanvasRenderingContext2D,\n camera: CameraLike,\n draw: (ctx: CanvasRenderingContext2D) => void,\n): void {\n ctx.save()\n try {\n ctx.transform(camera.z, 0, 0, camera.z, camera.x * camera.z, camera.y * camera.z)\n draw(ctx)\n } finally {\n ctx.restore()\n }\n}\n\n/**\n * A width given in CSS pixels, expressed in the page units the camera\n * transform is about to scale. Use inside {@link withCamera}; outside it the\n * CSS pixel value is already correct and this must not be applied.\n */\nexport function hairline(cssPixels: number, zoom: number): number {\n return cssPixels / (zoom || 1)\n}\n\n/** Save the paint state, run `draw`, restore. The narrow-waisted `ctx.save()`. */\nexport function isolate(ctx: CanvasRenderingContext2D, draw: (ctx: CanvasRenderingContext2D) => void): void {\n ctx.save()\n try {\n draw(ctx)\n } finally {\n ctx.restore()\n }\n}\n\n/**\n * Trace a rectangle with rounded corners.\n *\n * `ctx.roundRect` is not in jsdom and was late to Safari, so the path is built\n * by hand — an overlay that silently stops drawing on one browser is worse than\n * four arcs.\n */\nexport function traceRoundedRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n radius: number,\n): void {\n const r = Math.max(0, Math.min(radius, Math.abs(w) / 2, Math.abs(h) / 2))\n ctx.beginPath()\n if (r === 0) {\n ctx.rect(x, y, w, h)\n return\n }\n ctx.moveTo(x + r, y)\n ctx.lineTo(x + w - r, y)\n ctx.quadraticCurveTo(x + w, y, x + w, y + r)\n ctx.lineTo(x + w, y + h - r)\n ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h)\n ctx.lineTo(x + r, y + h)\n ctx.quadraticCurveTo(x, y + h, x, y + h - r)\n ctx.lineTo(x, y + r)\n ctx.quadraticCurveTo(x, y, x + r, y)\n ctx.closePath()\n}\n\n/** Trace a polyline. A single point traces nothing, which is what we want. */\nexport function tracePolyline(ctx: CanvasRenderingContext2D, points: readonly { x: number; y: number }[]): void {\n ctx.beginPath()\n const first = points[0]\n if (!first || points.length < 2) return\n ctx.moveTo(first.x, first.y)\n for (let i = 1; i < points.length; i++) {\n const p = points[i]!\n ctx.lineTo(p.x, p.y)\n }\n}\n\n/**\n * Trace a scribble as a *tapered* ribbon rather than a stroked line.\n *\n * A laser trail whose tail thins out cannot be drawn by stroking a polyline —\n * a stroke has one width for its whole length. So the outline is walked: down\n * one side offset by the half-width at each point, back along the other. The\n * half-width is scaled by the point's position along the stroke, which is what\n * produces the taper.\n *\n * SEMANTICS-ASSUMED: the taper profile. The docs say a scribble may taper but\n * not how; a linear ramp over the first fifth of the stroke reads as a trail\n * with a point on it at every speed, and degenerates to a constant width when\n * `taper` is false.\n */\nexport function traceTaperedStroke(\n ctx: CanvasRenderingContext2D,\n points: readonly { x: number; y: number }[],\n width: number,\n taper: boolean,\n): void {\n ctx.beginPath()\n if (points.length < 2) return\n const half = width / 2\n const n = points.length\n const widthAt = (i: number): number => {\n if (!taper) return half\n // Ramp in over the leading fifth of the stroke, held flat after that.\n const t = Math.min(1, i / Math.max(1, (n - 1) * 0.2))\n return half * t\n }\n const left: { x: number; y: number }[] = []\n const right: { x: number; y: number }[] = []\n for (let i = 0; i < n; i++) {\n const p = points[i]!\n const prev = points[Math.max(0, i - 1)]!\n const next = points[Math.min(n - 1, i + 1)]!\n let dx = next.x - prev.x\n let dy = next.y - prev.y\n const len = Math.hypot(dx, dy)\n if (len === 0) {\n dx = 1\n dy = 0\n } else {\n dx /= len\n dy /= len\n }\n const w = widthAt(i)\n left.push({ x: p.x - dy * w, y: p.y + dx * w })\n right.push({ x: p.x + dy * w, y: p.y - dx * w })\n }\n ctx.moveTo(left[0]!.x, left[0]!.y)\n for (let i = 1; i < left.length; i++) ctx.lineTo(left[i]!.x, left[i]!.y)\n for (let i = right.length - 1; i >= 0; i--) ctx.lineTo(right[i]!.x, right[i]!.y)\n ctx.closePath()\n}\n\n/**\n * An `×` centred on a point, as the snap layer marks an aligned edge.\n *\n * Drawn as a path rather than two `line` calls so a caller can stroke it in one\n * go with the rest of the guide.\n */\nexport function traceCross(ctx: CanvasRenderingContext2D, x: number, y: number, arm: number): void {\n ctx.moveTo(x - arm, y - arm)\n ctx.lineTo(x + arm, y + arm)\n ctx.moveTo(x - arm, y + arm)\n ctx.lineTo(x + arm, y - arm)\n}\n\n/**\n * Draw a short text label on a filled, rounded chip — a collaborator's name,\n * a zoom read-out.\n *\n * Returns the chip's width so a caller can lay several out in a row. Measuring\n * costs a `measureText`, which is why the result is handed back rather than\n * recomputed.\n */\nexport function drawLabelChip(\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n opts: { background: string; color: string; font: string; paddingX: number; paddingY: number; radius: number },\n): number {\n ctx.font = opts.font\n ctx.textBaseline = \"top\"\n ctx.textAlign = \"left\"\n const metrics = ctx.measureText(text)\n // `fontBoundingBox*` is absent in older engines and in jsdom; fall back to\n // the em size the font string implies rather than drawing a zero-height chip.\n const ascent = metrics.actualBoundingBoxAscent\n const descent = metrics.actualBoundingBoxDescent\n const lineHeight = Number.isFinite(ascent) && Number.isFinite(descent) && ascent + descent > 0 ? ascent + descent : 12\n const w = metrics.width + opts.paddingX * 2\n const h = lineHeight + opts.paddingY * 2\n ctx.fillStyle = opts.background\n traceRoundedRect(ctx, x, y, w, h, opts.radius)\n ctx.fill()\n ctx.fillStyle = opts.color\n ctx.fillText(text, x + opts.paddingX, y + opts.paddingY)\n return w\n}\n","/**\n * The two overlays that make arrow binding legible.\n *\n * Binding is the one arrow behaviour with no visible geometry of its own: an\n * arrow that is *attached* to a rectangle and one that merely *ends near* it\n * look identical, right up until you move the rectangle and only one of them\n * follows. Both overlays here exist to close that gap.\n *\n * - {@link ArrowHintOverlayUtil} answers \"will this bind?\" while a terminal is\n * being dragged — it outlines the shape that is about to be caught.\n * - {@link ArrowBindingHintOverlayUtil} answers \"is this bound?\" for an arrow\n * already on the page — it marks each bound terminal with a dot on the\n * anchor it is attached to.\n */\nimport {\n getOverlayDisplayValues,\n OverlayUtil,\n type Editor,\n type Geometry2d,\n type OverlayOptionsWithDisplayValues,\n type TLColorMode,\n type TLTheme,\n type UnknownBinding,\n type UnknownShape,\n} from \"@mocanvas/editor\"\nimport { hairline, withCamera } from \"./paint\"\nimport type { OverlayBox, TLArrowBindingHintOverlay, TLArrowHintOverlay } from \"./types\"\n\n/** The paint an arrow hint is drawn with. */\nexport interface ArrowHintOverlayUtilDisplayValues {\n /** Outline colour of the shape about to be bound to. */\n stroke: string\n}\n\n/** How the \"will bind\" outline is drawn. */\nexport interface ArrowHintOverlayUtilOptions\n extends OverlayOptionsWithDisplayValues<ArrowHintOverlayUtilDisplayValues> {\n /** Outline weight, in CSS pixels. */\n lineWidth: number\n /** Dash pattern, in CSS pixels. Empty for a continuous outline. */\n lineDash: readonly number[]\n /** How far outside the shape's bounds the outline sits, in CSS pixels. */\n inset: number\n}\n\n/**\n * The theme's `hint` colour, not `selectStroke`.\n *\n * A binding target is not selected and must not look selected — the whole\n * point of the outline is that it means something else.\n */\nexport const DEFAULT_ARROW_HINT_OVERLAY_OPTIONS: ArrowHintOverlayUtilOptions = {\n lineWidth: 2,\n lineDash: [4, 3],\n inset: -3,\n getDefaultDisplayValues: (_editor: unknown, theme: TLTheme, colorMode: TLColorMode) => ({\n stroke: theme.colors[colorMode].hint,\n }),\n}\n\n/**\n * Outlines the shape an arrow terminal is about to bind to.\n *\n * SEMANTICS-ASSUMED: which shapes count as \"about to bind\". The documented\n * surface names the overlay but does not say where its state comes from, and\n * mocanvas has no arrow-target state object. The hinting shape ids are the\n * editor's existing \"a gesture in flight is aiming at this shape\" channel —\n * `Editor.setHintingShapes`, which the select tool already drives for drop\n * targets — so an arrow tool sets them the same way and this util reads them.\n * The util narrows to the arrow case by only being active while an arrow is the\n * thing being drawn or edited; a drop-target hint during a plain drag stays\n * with the shape indicator compositor, which draws it heavier rather than\n * dashed.\n */\nexport class ArrowHintOverlayUtil extends OverlayUtil<Editor, ArrowHintOverlayUtilOptions> {\n static override type = \"arrowHint\"\n static override zIndex = 25\n static override options: ArrowHintOverlayUtilOptions = DEFAULT_ARROW_HINT_OVERLAY_OPTIONS\n\n /**\n * Whether an arrow gesture is what is producing the hints.\n *\n * Either the arrow tool is drawing one, or an arrow is selected and one of\n * its terminals is being dragged — in both cases the hints on screen are\n * binding targets rather than reparenting targets.\n */\n protected isArrowGestureActive(): boolean {\n const editor = this.editor\n if (editor.getCurrentToolId() === \"arrow\") return true\n const shape = editor.getOnlySelectedShape()\n return shape?.type === \"arrow\"\n }\n\n override isActive(): boolean {\n return this.isArrowGestureActive() && this.editor.getHintingShapeIds().length > 0\n }\n\n override getOverlays(): TLArrowHintOverlay[] {\n if (!this.isArrowGestureActive()) return []\n const editor = this.editor\n const out: TLArrowHintOverlay[] = []\n for (const shape of editor.getHintingShapes()) {\n // A hinted arrow is the arrow being drawn, not a target for it.\n if (shape.type === \"arrow\") continue\n const bounds = editor.getShapePageBounds(shape)\n if (!bounds) continue\n out.push({\n id: shape.id,\n type: \"arrowHint\",\n shapeId: shape.id,\n bounds: { x: bounds.x, y: bounds.y, w: bounds.w, h: bounds.h } satisfies OverlayBox,\n })\n }\n return out\n }\n\n /** The hint is feedback about the drag in flight; it cannot be pointed at. */\n override getGeometry(): Geometry2d | undefined {\n return undefined\n }\n\n /** The colour to draw with, read fresh from the theme on every frame. */\n getDisplayValues(): ArrowHintOverlayUtilDisplayValues {\n return getOverlayDisplayValues<ArrowHintOverlayUtilDisplayValues>(this)\n }\n\n override render(ctx: CanvasRenderingContext2D): void {\n const overlays = this.getOverlays()\n if (overlays.length === 0) return\n const camera = this.editor.getCamera()\n const zoom = camera.z || 1\n const { lineWidth, lineDash, inset } = this.options\n const stroke = this.getDisplayValues().stroke\n withCamera(ctx, camera, (c) => {\n c.strokeStyle = stroke\n c.lineWidth = hairline(lineWidth, zoom)\n // Dashes are given in CSS pixels for the same reason the width is, so\n // they take the same division to survive the camera transform.\n c.setLineDash(lineDash.map((d) => hairline(d, zoom)))\n const pad = hairline(inset, zoom)\n for (const overlay of overlays) {\n const { x, y, w, h } = overlay.bounds\n c.beginPath()\n c.rect(x + pad, y + pad, w - pad * 2, h - pad * 2)\n c.stroke()\n }\n })\n }\n}\n\n/** The paint a bound-terminal marker is drawn with. */\nexport interface ArrowBindingHintOverlayUtilDisplayValues {\n /** Body of the anchor dot. */\n fill: string\n /** Ring round the anchor dot, so it stays visible on a shape of the same colour. */\n stroke: string\n}\n\n/** How the anchor dot is drawn. */\nexport interface ArrowBindingHintOverlayUtilOptions\n extends OverlayOptionsWithDisplayValues<ArrowBindingHintOverlayUtilDisplayValues> {\n /** Dot radius, in CSS pixels. */\n radius: number\n /** Ring weight, in CSS pixels. */\n lineWidth: number\n}\n\n/** A small hint-coloured dot with a paper-coloured ring. */\nexport const DEFAULT_ARROW_BINDING_HINT_OVERLAY_OPTIONS: ArrowBindingHintOverlayUtilOptions = {\n radius: 3.5,\n lineWidth: 1.5,\n getDefaultDisplayValues: (_editor: unknown, theme: TLTheme, colorMode: TLColorMode) => {\n const colors = theme.colors[colorMode]\n return { fill: colors.hint, stroke: colors.solid }\n },\n}\n\n/** An arrow binding, in the only two fields this overlay needs from it. */\ninterface ArrowBindingLike extends UnknownBinding {\n props: { terminal?: \"start\" | \"end\"; normalizedAnchor?: { x: number; y: number } }\n}\n\n/**\n * Marks the anchor each bound terminal of the selected arrow is attached to.\n *\n * Only for a selected arrow: the dots are an editing aid, and drawing one on\n * every bound terminal on the page would bury the board in them.\n *\n * The binding is read structurally — `props.terminal` and\n * `props.normalizedAnchor` off a binding of type `arrow` — rather than through\n * the arrow shape's own helpers. That keeps this file out of the shape and\n * binding modules entirely, which matters because the package barrel loads the\n * overlays before either of them.\n */\nexport class ArrowBindingHintOverlayUtil extends OverlayUtil<Editor, ArrowBindingHintOverlayUtilOptions> {\n static override type = \"arrowBindingHint\"\n static override zIndex = 26\n static override options: ArrowBindingHintOverlayUtilOptions = DEFAULT_ARROW_BINDING_HINT_OVERLAY_OPTIONS\n\n /** The arrows whose bindings are worth marking: the selected ones. */\n protected getArrows(): UnknownShape[] {\n return this.editor.getSelectedShapes().filter((shape) => shape.type === \"arrow\")\n }\n\n override isActive(): boolean {\n return this.getArrows().length > 0\n }\n\n override getOverlays(): TLArrowBindingHintOverlay[] {\n const editor = this.editor\n const out: TLArrowBindingHintOverlay[] = []\n for (const arrow of this.getArrows()) {\n for (const binding of editor.getBindingsFromShape<ArrowBindingLike>(arrow, \"arrow\")) {\n const terminal = binding.props?.terminal\n const anchor = binding.props?.normalizedAnchor\n if (!terminal || !anchor) continue\n const target = editor.getShape(binding.toId)\n if (!target) continue\n const local = editor.getShapeGeometryBounds(target)\n const m = editor.getShapePageTransform(target)\n if (!local) continue\n // The anchor is normalized against the target's geometry bounds, which\n // is what lets it survive the target being resized.\n const x = local.x + local.w * anchor.x\n const y = local.y + local.h * anchor.y\n out.push({\n id: `${arrow.id}:${terminal}`,\n type: \"arrowBindingHint\",\n arrowId: arrow.id,\n boundShapeId: target.id,\n terminal,\n point: { x: m.a * x + m.c * y + m.e, y: m.b * x + m.d * y + m.f },\n })\n }\n }\n return out\n }\n\n /** A marker, not a control: dragging the terminal is the arrow handle's job. */\n override getGeometry(): Geometry2d | undefined {\n return undefined\n }\n\n /** The colours to draw with, read fresh from the theme on every frame. */\n getDisplayValues(): ArrowBindingHintOverlayUtilDisplayValues {\n return getOverlayDisplayValues<ArrowBindingHintOverlayUtilDisplayValues>(this)\n }\n\n override render(ctx: CanvasRenderingContext2D): void {\n const overlays = this.getOverlays()\n if (overlays.length === 0) return\n const camera = this.editor.getCamera()\n const zoom = camera.z || 1\n const display = this.getDisplayValues()\n const { radius, lineWidth } = this.options\n withCamera(ctx, camera, (c) => {\n c.fillStyle = display.fill\n c.strokeStyle = display.stroke\n c.lineWidth = hairline(lineWidth, zoom)\n const r = hairline(radius, zoom)\n for (const overlay of overlays) {\n c.beginPath()\n c.arc(overlay.point.x, overlay.point.y, r, 0, Math.PI * 2)\n c.fill()\n c.stroke()\n }\n })\n }\n}\n","/**\n * The selection brush — the translucent rectangle you drag across the canvas to\n * select what it touches — and its sibling, the zoom tool's brush.\n *\n * This is the smallest complete overlay util, and so the one worth reading\n * first: it resolves its paint from the theme through\n * {@link getOverlayDisplayValues}, it names one overlay so the manager can talk\n * about it, and it paints in page space by asking for the camera. Every other\n * painter in this directory is a longer version of the same three steps.\n */\nimport {\n getOverlayDisplayValues,\n OverlayUtil,\n type Editor,\n type Geometry2d,\n type OverlayOptionsWithDisplayValues,\n type TLColorMode,\n type TLTheme,\n} from \"@mocanvas/editor\"\nimport { traceRoundedRect, withCamera } from \"./paint\"\nimport type { OverlayBox, TLBrushOverlay, TLZoomBrushOverlay } from \"./types\"\n\n/**\n * The paint a brush is drawn with, resolved against the live theme.\n *\n * Separate from the options so an app can restyle *one* of them: overriding\n * `getCustomDisplayValues` changes the colours and leaves the geometry alone,\n * while `configure({ radius })` changes the geometry and leaves the theme in\n * charge of the colours.\n */\nexport interface BrushOverlayUtilDisplayValues {\n /** Interior colour, including its alpha. */\n fill: string\n /** Outline colour. */\n stroke: string\n}\n\n/** Everything about a brush that is not a colour. */\nexport interface BrushOverlayUtilOptions extends OverlayOptionsWithDisplayValues<BrushOverlayUtilDisplayValues> {\n /** Outline weight, in CSS pixels — so it is a hairline at any zoom. */\n lineWidth: number\n /** Corner radius, in CSS pixels. */\n radius: number\n}\n\n/**\n * The theme tokens a brush uses.\n *\n * `selectFill` and `selectStroke` exist in the theme for exactly this, so the\n * brush, the selection box and the indicators cannot drift apart when an app\n * retints one of them.\n */\nfunction defaultBrushDisplayValues(\n _editor: unknown,\n theme: TLTheme,\n colorMode: TLColorMode,\n): BrushOverlayUtilDisplayValues {\n const colors = theme.colors[colorMode]\n return { fill: colors.selectFill, stroke: colors.selectStroke }\n}\n\n/** The default brush geometry and paint, shared by both brushes. */\nexport const DEFAULT_BRUSH_OVERLAY_OPTIONS: BrushOverlayUtilOptions = {\n lineWidth: 1.5,\n radius: 2,\n getDefaultDisplayValues: defaultBrushDisplayValues,\n}\n\n/**\n * The half a brush painter shares with the other one: read a rectangle off the\n * instance record, name it, stroke it in page space.\n *\n * Generic in its overlay record so the two concrete utils can each declare\n * their own — a caller that asked `editor.overlays.getOverlayUtil(\"zoomBrush\")`\n * for its overlays gets `TLZoomBrushOverlay[]`, not the union.\n */\nabstract class BaseBrushOverlayUtil<T extends TLBrushOverlay | TLZoomBrushOverlay> extends OverlayUtil<\n Editor,\n BrushOverlayUtilOptions\n> {\n /** The brush rectangle, or `null` when no drag is in flight. */\n protected abstract getBrushBounds(): OverlayBox | null\n\n override isActive(): boolean {\n return this.getBrushBounds() !== null\n }\n\n abstract override getOverlays(): T[]\n\n /**\n * A brush is not pointable — it *is* the pointer gesture. Returning the\n * rectangle would make the brush swallow the drag that draws it.\n */\n override getGeometry(): Geometry2d | undefined {\n return undefined\n }\n\n /** The colours to draw with, read fresh from the theme on every frame. */\n getDisplayValues(): BrushOverlayUtilDisplayValues {\n return getOverlayDisplayValues<BrushOverlayUtilDisplayValues>(this)\n }\n\n override render(ctx: CanvasRenderingContext2D): void {\n const overlays = this.getOverlays()\n if (overlays.length === 0) return\n const camera = this.editor.getCamera()\n const zoom = camera.z || 1\n const display = this.getDisplayValues()\n const { lineWidth, radius } = this.options\n withCamera(ctx, camera, (c) => {\n c.fillStyle = display.fill\n c.strokeStyle = display.stroke\n c.lineWidth = lineWidth / zoom\n for (const overlay of overlays) {\n const { x, y, w, h } = overlay.bounds\n traceRoundedRect(c, x, y, w, h, radius / zoom)\n if (display.fill !== \"transparent\") c.fill()\n c.stroke()\n }\n })\n }\n}\n\n/**\n * Paints the select tool's brush.\n *\n * Register it — or a configured subclass — as an overlay util:\n *\n * ```ts\n * <Mocanvas overlayUtils={[BrushOverlayUtil.configure({ radius: 0 })]} />\n * ```\n */\nexport class BrushOverlayUtil extends BaseBrushOverlayUtil<TLBrushOverlay> {\n static override type = \"brush\"\n static override zIndex = 10\n static override options: BrushOverlayUtilOptions = DEFAULT_BRUSH_OVERLAY_OPTIONS\n\n protected override getBrushBounds(): OverlayBox | null {\n return this.editor.getInstanceState().brush\n }\n\n override getOverlays(): TLBrushOverlay[] {\n const bounds = this.getBrushBounds()\n if (!bounds) return []\n return [{ id: \"brush\", type: \"brush\", bounds }]\n }\n}\n\n/**\n * The zoom tool's brush: the rectangle you drag to zoom to a region.\n *\n * Everything about it is the selection brush except which slot of the instance\n * record it reads and how loudly it is painted.\n */\nexport class ZoomBrushOverlayUtil extends BaseBrushOverlayUtil<TLZoomBrushOverlay> {\n static override type = \"zoomBrush\"\n static override zIndex = 10\n static override options: BrushOverlayUtilOptions = {\n ...DEFAULT_BRUSH_OVERLAY_OPTIONS,\n radius: 4,\n // SEMANTICS-ASSUMED: the docs name the overlay but not its paint. The zoom\n // brush borrows the selection stroke and drops the fill entirely, because\n // it is a viewport gesture rather than a selection: tinting it as solidly\n // as the select brush implies the shapes underneath are being picked up.\n getDefaultDisplayValues: (_editor, theme, colorMode) => ({\n fill: \"transparent\",\n stroke: theme.colors[colorMode].selectStroke,\n }),\n }\n\n protected override getBrushBounds(): OverlayBox | null {\n return this.editor.getInstanceState().zoomBrush\n }\n\n override getOverlays(): TLZoomBrushOverlay[] {\n const bounds = this.getBrushBounds()\n if (!bounds) return []\n return [{ id: \"zoomBrush\", type: \"zoomBrush\", bounds }]\n }\n}\n","/**\n * The five overlays that draw other people.\n *\n * Everything here is derived from presence records, never from the document:\n * a collaborator's cursor, brush, scribbles and selection are things they are\n * *doing*, and none of them survive a reload or belong in a `.tldr` file.\n *\n * They share one base, {@link CollaboratorOverlayUtil}, for a reason that is\n * easy to get wrong when the five are written separately: \"who is visible\" is a\n * single rule — present within the inactive timeout, and on this page — and\n * five copies of it drift. `editor.collaborators` owns that rule; these utils\n * only decide what to paint for each person it hands back.\n *\n * Colour never comes from the theme here. It comes from the presence record,\n * because the whole job of a collaborator colour is to be the same colour for\n * the same person on every screen in the room.\n */\nimport {\n OverlayUtil,\n type Editor,\n type Geometry2d,\n type InstancePresence,\n type Scribble,\n} from \"@mocanvas/editor\"\nimport { drawLabelChip, hairline, isolate, traceRoundedRect, traceTaperedStroke, withCamera } from \"./paint\"\nimport type {\n TLCollaboratorBrushOverlay,\n TLCollaboratorCursorOverlay,\n TLCollaboratorHintOverlay,\n TLCollaboratorScribbleOverlay,\n TLCollaboratorShapeIndicatorOverlay,\n} from \"./types\"\n\n/** Shared configuration: how a person who has gone quiet is dimmed. */\nexport interface CollaboratorOverlayUtilOptions {\n /** Opacity applied to everything drawn for an idle collaborator. */\n idleOpacity: number\n}\n\n/** The one dial every collaborator overlay has. */\nexport const DEFAULT_COLLABORATOR_OVERLAY_OPTIONS: CollaboratorOverlayUtilOptions = {\n idleOpacity: 0.5,\n}\n\n/**\n * The half every collaborator painter shares: who to draw, and how faded.\n *\n * Not exported as part of the SDK surface — an app subclasses one of the five\n * concrete utils, which is the granularity anybody actually wants.\n */\nabstract class CollaboratorOverlayUtil<\n O extends CollaboratorOverlayUtilOptions = CollaboratorOverlayUtilOptions,\n> extends OverlayUtil<Editor, O> {\n /** Everybody present and on this page. Never the local user. */\n protected getPeople(): InstancePresence[] {\n return this.editor.collaborators.getVisibleCollaboratorsOnCurrentPage()\n }\n\n /** The fields every collaborator overlay record carries. */\n protected baseRecord(presence: InstancePresence): {\n presenceId: string\n userName: string\n color: string\n isIdle: boolean\n } {\n return {\n presenceId: presence.id,\n userName: presence.userName,\n color: presence.color,\n isIdle: this.editor.collaborators.isCollaboratorIdle(presence),\n }\n }\n\n /** Nothing another person is doing is clickable by us. */\n override getGeometry(): Geometry2d | undefined {\n return undefined\n }\n}\n\n/**\n * Other people's pointers, with their names beside them.\n *\n * Drawn in screen space and at a fixed size: a cursor that shrank with the zoom\n * would become invisible on a zoomed-out board, which is exactly when knowing\n * where somebody is matters most.\n */\nexport class CollaboratorCursorOverlayUtil extends CollaboratorOverlayUtil {\n static override type = \"collaboratorCursor\"\n static override zIndex = 60\n static override options: CollaboratorOverlayUtilOptions = DEFAULT_COLLABORATOR_OVERLAY_OPTIONS\n\n override isActive(): boolean {\n return this.getOverlays().length > 0\n }\n\n override getOverlays(): TLCollaboratorCursorOverlay[] {\n const out: TLCollaboratorCursorOverlay[] = []\n for (const presence of this.getPeople()) {\n // `null` is a collaborator with no pointer at all — an agent, or somebody\n // whose pointer has left the canvas. Not the same as a pointer at (0, 0).\n if (!presence.cursor) continue\n out.push({\n id: presence.id,\n type: \"collaboratorCursor\",\n ...this.baseRecord(presence),\n point: { x: presence.cursor.x, y: presence.cursor.y },\n rotation: presence.cursor.rotation,\n chatMessage: presence.chatMessage,\n })\n }\n return out\n }\n\n override render(ctx: CanvasRenderingContext2D): void {\n const overlays = this.getOverlays()\n if (overlays.length === 0) return\n const editor = this.editor\n const idleOpacity = this.options.idleOpacity\n isolate(ctx, (c) => {\n for (const overlay of overlays) {\n const at = editor.pageToViewport(overlay.point)\n c.globalAlpha = overlay.isIdle ? idleOpacity : 1\n c.save()\n c.translate(at.x, at.y)\n if (overlay.rotation) c.rotate(overlay.rotation)\n // The classic arrow pointer, traced once at its natural size. Kept as\n // an explicit path rather than a glyph so it looks the same on every\n // platform — a collaborator cursor that changed shape per OS would read\n // as a different kind of object.\n c.beginPath()\n c.moveTo(0, 0)\n c.lineTo(0, 14)\n c.lineTo(3.6, 10.9)\n c.lineTo(6.1, 15.9)\n c.lineTo(8.5, 14.7)\n c.lineTo(6, 9.8)\n c.lineTo(10.4, 9.4)\n c.closePath()\n c.fillStyle = overlay.color\n c.strokeStyle = \"rgba(0, 0, 0, 0.25)\"\n c.lineWidth = 1\n c.fill()\n c.stroke()\n c.restore()\n\n const label = overlay.chatMessage || overlay.userName\n if (label) {\n drawLabelChip(c, label, at.x + 12, at.y + 16, {\n background: overlay.color,\n // White reads on all eight presence colours, which are chosen to be\n // dark enough for exactly this.\n color: \"#ffffff\",\n font: '12px system-ui, -apple-system, \"Segoe UI\", sans-serif',\n paddingX: 6,\n paddingY: 3,\n radius: 4,\n })\n }\n }\n c.globalAlpha = 1\n })\n }\n}\n\n/** Another person's selection brush, in their colour. */\nexport class CollaboratorBrushOverlayUtil extends CollaboratorOverlayUtil {\n static override type = \"collaboratorBrush\"\n static override zIndex = 10\n static override options: CollaboratorOverlayUtilOptions = DEFAULT_COLLABORATOR_OVERLAY_OPTIONS\n\n override isActive(): boolean {\n return this.getOverlays().length > 0\n }\n\n override getOverlays(): TLCollaboratorBrushOverlay[] {\n const out: TLCollaboratorBrushOverlay[] = []\n for (const presence of this.getPeople()) {\n if (!presence.brush) continue\n out.push({\n id: presence.id,\n type: \"collaboratorBrush\",\n ...this.baseRecord(presence),\n bounds: presence.brush,\n })\n }\n return out\n }\n\n override render(ctx: CanvasRenderingContext2D): void {\n const overlays = this.getOverlays()\n if (overlays.length === 0) return\n const camera = this.editor.getCamera()\n const zoom = camera.z || 1\n const idleOpacity = this.options.idleOpacity\n withCamera(ctx, camera, (c) => {\n c.lineWidth = hairline(1.5, zoom)\n for (const overlay of overlays) {\n const { x, y, w, h } = overlay.bounds\n c.strokeStyle = overlay.color\n traceRoundedRect(c, x, y, w, h, hairline(2, zoom))\n // The brush interior is drawn at low alpha in their colour rather than\n // with a separate fill token: the point of the tint is to say *whose*\n // brush it is, and a theme fill would say the same thing for everyone.\n c.globalAlpha = (overlay.isIdle ? idleOpacity : 1) * 0.12\n c.fillStyle = overlay.color\n c.fill()\n c.globalAlpha = overlay.isIdle ? idleOpacity : 1\n c.stroke()\n }\n c.globalAlpha = 1\n })\n }\n}\n\n/** Another person's live scribbles — their laser, their eraser trail. */\nexport class CollaboratorScribbleOverlayUtil extends CollaboratorOverlayUtil {\n static override type = \"collaboratorScribble\"\n static override zIndex = 30\n static override options: CollaboratorOverlayUtilOptions = DEFAULT_COLLABORATOR_OVERLAY_OPTIONS\n\n override isActive(): boolean {\n return this.getOverlays().length > 0\n }\n\n override getOverlays(): TLCollaboratorScribbleOverlay[] {\n const out: TLCollaboratorScribbleOverlay[] = []\n for (const presence of this.getPeople()) {\n for (const scribble of presence.scribbles) {\n out.push({\n id: `${presence.id}:${scribble.id}`,\n type: \"collaboratorScribble\",\n ...this.baseRecord(presence),\n scribble,\n })\n }\n }\n return out\n }\n\n override render(ctx: CanvasRenderingContext2D): void {\n const overlays = this.getOverlays()\n if (overlays.length === 0) return\n const camera = this.editor.getCamera()\n const idleOpacity = this.options.idleOpacity\n withCamera(ctx, camera, (c) => {\n for (const overlay of overlays) {\n const scribble: Scribble = overlay.scribble\n if (scribble.points.length < 2) continue\n // Their colour, not the scribble's: a laser is a presence signal, and\n // two people's lasers have to be tellable apart.\n c.fillStyle = overlay.color\n c.globalAlpha = scribble.opacity * (overlay.isIdle ? idleOpacity : 1)\n traceTaperedStroke(c, scribble.points, scribble.size, scribble.taper)\n c.fill()\n }\n c.globalAlpha = 1\n })\n }\n}\n\n/** Outlines round the shapes another person has selected. */\nexport class CollaboratorShapeIndicatorOverlayUtil extends CollaboratorOverlayUtil {\n static override type = \"collaboratorShapeIndicator\"\n static override zIndex = 0\n static override options: CollaboratorOverlayUtilOptions = DEFAULT_COLLABORATOR_OVERLAY_OPTIONS\n\n override isActive(): boolean {\n return this.getOverlays().length > 0\n }\n\n override getOverlays(): TLCollaboratorShapeIndicatorOverlay[] {\n const editor = this.editor\n const out: TLCollaboratorShapeIndicatorOverlay[] = []\n for (const presence of this.getPeople()) {\n for (const shapeId of presence.selectedShapeIds) {\n const shape = editor.getShape(shapeId)\n if (!shape) continue\n const bounds = editor.getShapeGeometryBounds(shape)\n if (!bounds) continue\n const m = editor.getShapePageTransform(shape)\n out.push({\n id: `${presence.id}:${shapeId}`,\n type: \"collaboratorShapeIndicator\",\n ...this.baseRecord(presence),\n shapeId,\n transform: { a: m.a, b: m.b, c: m.c, d: m.d, e: m.e, f: m.f },\n bounds: { x: bounds.x, y: bounds.y, w: bounds.w, h: bounds.h },\n })\n }\n }\n return out\n }\n\n override render(ctx: CanvasRenderingContext2D): void {\n const overlays = this.getOverlays()\n if (overlays.length === 0) return\n const camera = this.editor.getCamera()\n const zoom = camera.z || 1\n const idleOpacity = this.options.idleOpacity\n withCamera(ctx, camera, (c) => {\n for (const overlay of overlays) {\n c.save()\n const m = overlay.transform\n c.transform(m.a, m.b, m.c, m.d, m.e, m.f)\n c.strokeStyle = overlay.color\n c.globalAlpha = overlay.isIdle ? idleOpacity : 1\n c.lineWidth = hairline(1.5, zoom)\n const { x, y, w, h } = overlay.bounds\n c.strokeRect(x, y, w, h)\n c.restore()\n }\n })\n }\n}\n\n/**\n * The marker on the viewport edge that says a collaborator is off screen, and\n * which way they are.\n *\n * Without it, somebody who scrolls away simply disappears and there is no way\n * to find them again short of guessing. The marker is clamped to the edge of\n * the viewport and rotated to point at where they actually are.\n */\nexport class CollaboratorHintOverlayUtil extends CollaboratorOverlayUtil {\n static override type = \"collaboratorHint\"\n static override zIndex = 70\n static override options: CollaboratorOverlayUtilOptions = DEFAULT_COLLABORATOR_OVERLAY_OPTIONS\n\n /**\n * SEMANTICS-ASSUMED: the inset. The marker sits 12 CSS pixels inside the\n * viewport edge — far enough in that it is not clipped by the canvas border,\n * close enough that it reads as \"over there\", not \"here\".\n */\n static readonly EDGE_INSET = 12\n\n override isActive(): boolean {\n return this.getOverlays().length > 0\n }\n\n override getOverlays(): TLCollaboratorHintOverlay[] {\n const editor = this.editor\n const viewport = editor.getViewportScreenBounds()\n const inset = CollaboratorHintOverlayUtil.EDGE_INSET\n const out: TLCollaboratorHintOverlay[] = []\n for (const presence of this.getPeople()) {\n if (!presence.cursor) continue\n const at = editor.pageToViewport(presence.cursor)\n const onScreen = at.x >= 0 && at.y >= 0 && at.x <= viewport.w && at.y <= viewport.h\n // A cursor already on screen is drawn by the cursor overlay; drawing an\n // edge marker for it as well would double every visible collaborator.\n if (onScreen) continue\n const cx = viewport.w / 2\n const cy = viewport.h / 2\n const point = {\n x: Math.min(Math.max(at.x, inset), Math.max(inset, viewport.w - inset)),\n y: Math.min(Math.max(at.y, inset), Math.max(inset, viewport.h - inset)),\n }\n out.push({\n id: presence.id,\n type: \"collaboratorHint\",\n ...this.baseRecord(presence),\n point,\n rotation: Math.atan2(at.y - cy, at.x - cx),\n })\n }\n return out\n }\n\n override render(ctx: CanvasRenderingContext2D): void {\n const overlays = this.getOverlays()\n if (overlays.length === 0) return\n const idleOpacity = this.options.idleOpacity\n isolate(ctx, (c) => {\n for (const overlay of overlays) {\n c.save()\n c.translate(overlay.point.x, overlay.point.y)\n c.rotate(overlay.rotation)\n c.globalAlpha = overlay.isIdle ? idleOpacity : 1\n c.fillStyle = overlay.color\n // A triangle pointing along +x, so the rotation above aims it at them.\n c.beginPath()\n c.moveTo(7, 0)\n c.lineTo(-5, -5)\n c.lineTo(-5, 5)\n c.closePath()\n c.fill()\n c.restore()\n }\n c.globalAlpha = 1\n })\n }\n}\n","/**\n * Scribbles: the fading trails a laser pointer, an eraser or a lasso leaves\n * behind.\n *\n * The animation is not here. `ScribbleManager` owns the points and sheds them\n * on a tick; this util only paints whatever is in the instance record right\n * now, which is what lets a local scribble and a collaborator's scribble be\n * drawn by the same code from two different sources.\n */\nimport {\n getOverlayDisplayValues,\n OverlayUtil,\n type Editor,\n type Geometry2d,\n type OverlayOptionsWithDisplayValues,\n type Scribble,\n type TLColorMode,\n type TLTheme,\n} from \"@mocanvas/editor\"\nimport { traceTaperedStroke, withCamera } from \"./paint\"\nimport type { TLScribbleOverlay } from \"./types\"\n\n/** The paint a scribble falls back to when its record does not name a colour. */\nexport interface ScribbleOverlayUtilDisplayValues {\n /** Colour for a scribble whose `color` is a theme token rather than CSS. */\n color: string\n}\n\n/** How scribbles are drawn. */\nexport interface ScribbleOverlayUtilOptions\n extends OverlayOptionsWithDisplayValues<ScribbleOverlayUtilDisplayValues> {\n /**\n * Whether to honour a scribble's `taper`. Turning it off draws every stroke\n * at a constant width, which is what an eraser wants and a laser does not.\n */\n taper: boolean\n}\n\n/**\n * Resolve one scribble's colour.\n *\n * A `Scribble.color` is documented as \"a theme colour name or a CSS colour\",\n * and the two are told apart the only way they can be: a name that the theme\n * knows about wins, anything else is handed to the canvas as-is. `accent` — the\n * manager's default — is not a palette entry, so it maps to the selection\n * stroke, which is the colour a laser is expected to be.\n */\nexport function resolveScribbleColor(color: string, theme: TLTheme, colorMode: TLColorMode): string {\n const colors = theme.colors[colorMode]\n if (color === \"accent\") return colors.selectStroke\n const entry = colors[color]\n if (typeof entry === \"string\") return entry\n if (entry && typeof entry === \"object\" && typeof entry.solid === \"string\") return entry.solid\n return color\n}\n\n/** The default scribble paint: taper on, colours from the theme. */\nexport const DEFAULT_SCRIBBLE_OVERLAY_OPTIONS: ScribbleOverlayUtilOptions = {\n taper: true,\n getDefaultDisplayValues: (_editor, theme, colorMode) => ({\n color: theme.colors[colorMode].selectStroke,\n }),\n}\n\n/**\n * Paints every live scribble.\n *\n * Scribbles are stroked as *ribbons*, not lines: a trail that thins to a point\n * cannot be produced by `ctx.stroke`, which has one width for the whole path.\n * See {@link traceTaperedStroke}.\n */\nexport class ScribbleOverlayUtil extends OverlayUtil<Editor, ScribbleOverlayUtilOptions> {\n static override type = \"scribble\"\n static override zIndex = 30\n static override options: ScribbleOverlayUtilOptions = DEFAULT_SCRIBBLE_OVERLAY_OPTIONS\n\n /** The scribbles to draw. Overridden by the collaborator variant. */\n protected getScribbles(): Scribble[] {\n return this.editor.getInstanceState().scribbles\n }\n\n override isActive(): boolean {\n return this.getScribbles().length > 0\n }\n\n override getOverlays(): TLScribbleOverlay[] {\n return this.getScribbles().map((scribble) => ({\n id: scribble.id,\n type: \"scribble\" as const,\n scribble,\n }))\n }\n\n /** A scribble is decoration in flight; nothing should be able to click it. */\n override getGeometry(): Geometry2d | undefined {\n return undefined\n }\n\n override render(ctx: CanvasRenderingContext2D): void {\n const overlays = this.getOverlays()\n if (overlays.length === 0) return\n const camera = this.editor.getCamera()\n const theme = this.editor.theme.getCurrentTheme()\n const colorMode = this.editor.theme.getColorMode()\n const fallback = getOverlayDisplayValues<ScribbleOverlayUtilDisplayValues>(this).color\n const taperEnabled = this.options.taper\n withCamera(ctx, camera, (c) => {\n for (const { scribble } of overlays) {\n if (scribble.points.length < 2) continue\n c.globalAlpha = scribble.opacity\n c.fillStyle = scribble.color ? resolveScribbleColor(scribble.color, theme, colorMode) : fallback\n traceTaperedStroke(c, scribble.points, scribble.size, taperEnabled && scribble.taper)\n c.fill()\n }\n c.globalAlpha = 1\n })\n }\n}\n","/**\n * The selection foreground: the box round what is selected, and the corner,\n * edge and rotate handles on it.\n *\n * \"Foreground\" as opposed to the selection *background* — the invisible region\n * that catches a drag on the interior. This util draws only what you can see,\n * and answers which handle the pointer is over so a tool can start the right\n * gesture.\n *\n * Positions come from `getSelectionHandlePositions`, which already knows the\n * awkward parts: a rotated single selection is measured in its own space, edge\n * handles disappear on an edge too short to hold one, and a util can hide its\n * resize or rotate handles entirely. Duplicating any of that here would let the\n * drawing and the hit testing disagree, which is the one failure a selection\n * box must not have.\n */\nimport {\n getOverlayDisplayValues,\n getSelectionHandlePositions,\n OverlayUtil,\n Rectangle2d,\n type Editor,\n type Geometry2d,\n type OverlayOptionsWithDisplayValues,\n type TLColorMode,\n type TLOverlay,\n type TLTheme,\n} from \"@mocanvas/editor\"\nimport { isolate, traceRoundedRect } from \"./paint\"\nimport type { TLSelectionForegroundOverlay } from \"./types\"\n\n/** The paint the selection box and its handles are drawn with. */\nexport interface SelectionForegroundOverlayUtilDisplayValues {\n /** Box outline and handle outline. */\n stroke: string\n /** Handle interior — the surface the outline is drawn against. */\n fill: string\n}\n\n/** Selection chrome geometry, in CSS pixels. */\nexport interface SelectionForegroundOverlayUtilOptions\n extends OverlayOptionsWithDisplayValues<SelectionForegroundOverlayUtilDisplayValues> {\n /** Outline weight for the box and the handles. */\n lineWidth: number\n /** Side of a square corner/edge handle. */\n handleSize: number\n /** Corner radius of a square handle. */\n handleRadius: number\n /** Radius of the round rotate handle. */\n rotateRadius: number\n /** Extra pointer slack around each handle, on top of its own size. */\n hitPadding: number\n}\n\n/** The v5 defaults: a 9px square handle, a 5.5px rotate dot, 1.5px strokes. */\nexport const DEFAULT_SELECTION_FOREGROUND_OVERLAY_OPTIONS: SelectionForegroundOverlayUtilOptions = {\n lineWidth: 1.5,\n handleSize: 9,\n handleRadius: 2,\n rotateRadius: 5.5,\n hitPadding: 6,\n getDefaultDisplayValues: (_editor: unknown, theme: TLTheme, colorMode: TLColorMode) => {\n const colors = theme.colors[colorMode]\n return { stroke: colors.selectStroke, fill: colors.solid }\n },\n}\n\n/** A corner or edge handle, as opposed to the rotate handle. */\nfunction isSquareHandle(handle: string): boolean {\n return handle !== \"rotate\"\n}\n\n/**\n * The cursor for each resize handle.\n *\n * Deliberately *not* rotated with the selection. A rotated box's \"top left\"\n * corner may point south-east on screen, and matching the cursor to the screen\n * direction would need the selection rotation folded in on every frame. Naming\n * the axis the drag acts on is both cheaper and less surprising: the cursor\n * says which dimension changes, not which way your hand moves.\n */\nconst HANDLE_CURSORS: Record<string, string> = {\n top: \"ns-resize\",\n bottom: \"ns-resize\",\n left: \"ew-resize\",\n right: \"ew-resize\",\n top_left: \"nwse-resize\",\n bottom_right: \"nwse-resize\",\n top_right: \"nesw-resize\",\n bottom_left: \"nesw-resize\",\n rotate: \"grab\",\n}\n\n/** Paints, and hit-tests, the selection box and its handles. */\nexport class SelectionForegroundOverlayUtil extends OverlayUtil<Editor, SelectionForegroundOverlayUtilOptions> {\n static override type = \"selectionForeground\"\n static override zIndex = 40\n static override options: SelectionForegroundOverlayUtilOptions = DEFAULT_SELECTION_FOREGROUND_OVERLAY_OPTIONS\n\n override isActive(): boolean {\n return this.editor.getCurrentToolId() === \"select\" && this.editor.getSelectionPageBounds() !== null\n }\n\n /**\n * One record for the box, then one per handle.\n *\n * The box comes first so that painting in order puts the handles on top of\n * it, and hit testing in reverse lets a handle win over the box it sits on.\n */\n override getOverlays(): TLSelectionForegroundOverlay[] {\n if (!this.isActive()) return []\n const info = getSelectionHandlePositions(this.editor)\n const out: TLSelectionForegroundOverlay[] = [\n { id: \"selection\", type: \"selectionForeground\", handle: null, point: null },\n ]\n if (!info) return out\n for (const h of info.handles) {\n out.push({ id: `handle:${h.handle}`, type: \"selectionForeground\", handle: h.handle, point: h.point })\n }\n return out\n }\n\n /**\n * A square hit region round a handle, in **page** units — the space\n * `OverlayManager.getOverlayAtPoint` tests in. The handle positions are\n * viewport pixels, so they are converted here rather than at the source,\n * which the SVG layer and the tools both want in viewport space.\n *\n * The box outline itself has no geometry: a click on it is a click on the\n * selection, and the select tool already owns that.\n */\n override getGeometry(overlay: TLOverlay): Geometry2d | undefined {\n const record = overlay as TLSelectionForegroundOverlay\n if (!record.handle || !record.point) return undefined\n const zoom = this.editor.getZoomLevel() || 1\n const visual = isSquareHandle(record.handle) ? this.options.handleSize / 2 : this.options.rotateRadius\n const r = (visual + this.options.hitPadding) / zoom\n const center = this.editor.viewportToPage(record.point)\n return new Rectangle2d({ x: center.x - r, y: center.y - r, width: r * 2, height: r * 2, isFilled: true })\n }\n\n override getCursor(overlay: TLOverlay): string | undefined {\n const record = overlay as TLSelectionForegroundOverlay\n if (!record.handle) return undefined\n return HANDLE_CURSORS[record.handle]\n }\n\n /** The colours to draw with, read fresh from the theme on every frame. */\n getDisplayValues(): SelectionForegroundOverlayUtilDisplayValues {\n return getOverlayDisplayValues<SelectionForegroundOverlayUtilDisplayValues>(this)\n }\n\n /**\n * Everything here is painted in **screen** space, without the camera.\n *\n * The handles are a fixed size in CSS pixels and the box is drawn round the\n * selection's screen-space corners, so installing the camera would only mean\n * dividing every number back out by the zoom again.\n */\n override render(ctx: CanvasRenderingContext2D): void {\n if (!this.isActive()) return\n const editor = this.editor\n const display = this.getDisplayValues()\n const { lineWidth, handleSize, handleRadius, rotateRadius } = this.options\n const bounds = editor.getSelectionPageBounds()\n const info = getSelectionHandlePositions(editor)\n\n isolate(ctx, (c) => {\n c.strokeStyle = display.stroke\n c.fillStyle = display.fill\n c.lineWidth = lineWidth\n\n // `info` is null exactly when a lone selected shape hides both its resize and\n // its rotate handles — which is how a util says it draws its own selection\n // chrome. The box was drawn from `bounds` alone and never asked, so such a\n // shape got the frame anyway: a selected arrow, which has no box to speak of,\n // came up wrapped in one.\n // One shape needs no box: it already has an outline of its own, drawn by the\n // indicator layer along the shape itself. Stroking the bounds as well put a\n // second line beside the first — near enough to read as a mistake, and it\n // cannot be made to coincide, because a hand-drawn outline genuinely does\n // not run along its own geometry. The handles below still mark where the\n // box is, and the corners are where the two differ visibly: the outline\n // rounds, the handle sits out on the true corner.\n //\n // Several shapes are the other case. There is no single outline to stand in\n // for the selection, so the union box is the only thing that says what the\n // gesture will act on.\n if (bounds && info) {\n const selected = editor.getSelectedShapes()\n const single = selected.length === 1 ? selected[0] : undefined\n if (!single) {\n const topLeft = editor.pageToViewport({ x: bounds.x, y: bounds.y })\n const bottomRight = editor.pageToViewport({ x: bounds.maxX, y: bounds.maxY })\n c.beginPath()\n c.rect(topLeft.x, topLeft.y, bottomRight.x - topLeft.x, bottomRight.y - topLeft.y)\n c.stroke()\n }\n }\n\n if (!info) return\n for (const h of info.handles) {\n if (isSquareHandle(h.handle)) {\n traceRoundedRect(c, h.point.x - handleSize / 2, h.point.y - handleSize / 2, handleSize, handleSize, handleRadius)\n } else {\n c.beginPath()\n c.arc(h.point.x, h.point.y, rotateRadius, 0, Math.PI * 2)\n }\n c.fill()\n c.stroke()\n }\n })\n }\n}\n","/**\n * A shape's own handles: an arrow's two terminals, a line's vertices, the\n * midpoints that become vertices when you drag them.\n *\n * These are not the selection's resize handles — those belong to\n * {@link SelectionForegroundOverlayUtil}. A shape handle is part of the shape's\n * own editing model, comes from the shape util's `getHandles`, and only exists\n * while exactly one shape is selected.\n *\n * This is the first *pointable* overlay in the directory: it answers\n * `getGeometry` and `getCursor`, which is what lets `editor.overlays` say the\n * pointer is over a handle rather than over the shape behind it.\n */\nimport {\n getOverlayDisplayValues,\n OverlayUtil,\n Rectangle2d,\n type Editor,\n type Geometry2d,\n type OverlayOptionsWithDisplayValues,\n type ShapeHandle,\n type TLColorMode,\n type TLOverlay,\n type TLTheme,\n type UnknownShape,\n} from \"@mocanvas/editor\"\nimport { withCamera } from \"./paint\"\nimport type { TLShapeHandleOverlay } from \"./types\"\n\n/** The paint a shape handle is drawn with. */\nexport interface ShapeHandleOverlayUtilDisplayValues {\n /** Outline of a solid handle, and the body of a virtual one. */\n stroke: string\n /** Interior of a solid handle — the surface its outline is drawn against. */\n fill: string\n}\n\n/** Handle geometry, all in CSS pixels so handles are one size at every zoom. */\nexport interface ShapeHandleOverlayUtilOptions\n extends OverlayOptionsWithDisplayValues<ShapeHandleOverlayUtilDisplayValues> {\n /** Radius of a real (`vertex`, `create`, `clone`) handle. */\n radius: number\n /** Radius of a `virtual` handle — smaller, because it is only a suggestion. */\n virtualRadius: number\n /** Outline weight. */\n lineWidth: number\n /** Opacity of a virtual handle. */\n virtualOpacity: number\n /**\n * Extra pointer slack around a handle, on top of its radius. A 6px dot is\n * hard to hit on a trackpad and impossible on touch; the target is bigger\n * than the thing you can see, deliberately.\n */\n hitPadding: number\n}\n\n/** Solid handles at 6px, virtual ones at 4px and half-transparent. */\nexport const DEFAULT_SHAPE_HANDLE_OVERLAY_OPTIONS: ShapeHandleOverlayUtilOptions = {\n radius: 6,\n virtualRadius: 4,\n lineWidth: 1.5,\n virtualOpacity: 0.6,\n hitPadding: 6,\n getDefaultDisplayValues: (_editor: unknown, theme: TLTheme, colorMode: TLColorMode) => {\n const colors = theme.colors[colorMode]\n return { stroke: colors.selectStroke, fill: colors.solid }\n },\n}\n\n/** Paints, and hit-tests, the handles of the single selected shape. */\nexport class ShapeHandleOverlayUtil extends OverlayUtil<Editor, ShapeHandleOverlayUtilOptions> {\n static override type = \"shapeHandle\"\n static override zIndex = 50\n static override options: ShapeHandleOverlayUtilOptions = DEFAULT_SHAPE_HANDLE_OVERLAY_OPTIONS\n\n /**\n * The shape whose handles are showing, or `undefined`.\n *\n * One shape only. With several selected there is no unambiguous answer to\n * \"drag this vertex\", and a canvas covered in every selected arrow's\n * terminals is unreadable besides.\n */\n protected getHandleShape(): UnknownShape | undefined {\n if (this.editor.getCurrentToolId() !== \"select\") return undefined\n const shape = this.editor.getOnlySelectedShape()\n if (!shape || shape.isLocked) return undefined\n return shape\n }\n\n override isActive(): boolean {\n return this.getOverlays().length > 0\n }\n\n override getOverlays(): TLShapeHandleOverlay[] {\n const editor = this.editor\n const shape = this.getHandleShape()\n if (!shape) return []\n let handles: ShapeHandle[]\n try {\n handles = editor.getShapeUtil(shape).getHandles?.(shape) ?? []\n } catch {\n // FAIL-SOFT: a util that throws while describing its handles must not\n // take the whole overlay layer down with it.\n return []\n }\n const m = editor.getShapePageTransform(shape)\n return handles.map((handle) => ({\n id: `${shape.id}:${handle.id}`,\n type: \"shapeHandle\" as const,\n shapeId: shape.id,\n handleId: handle.id,\n handleType: handle.type,\n point: { x: m.a * handle.x + m.c * handle.y + m.e, y: m.b * handle.x + m.d * handle.y + m.f },\n }))\n }\n\n /**\n * A square hit region around the handle, in page units.\n *\n * Square rather than round because it is a *target*, not the drawing: a\n * rectangle is cheaper to test, and the difference between the two at this\n * size is smaller than the pointer's own precision.\n */\n override getGeometry(overlay: TLOverlay): Geometry2d | undefined {\n const handle = overlay as TLShapeHandleOverlay\n if (!handle.point) return undefined\n const zoom = this.editor.getZoomLevel() || 1\n const visual = handle.handleType === \"virtual\" ? this.options.virtualRadius : this.options.radius\n const r = (visual + this.options.hitPadding) / zoom\n return new Rectangle2d({\n x: handle.point.x - r,\n y: handle.point.y - r,\n width: r * 2,\n height: r * 2,\n isFilled: true,\n })\n }\n\n override getCursor(): string {\n return \"grab\"\n }\n\n /** The colours to draw with, read fresh from the theme on every frame. */\n getDisplayValues(): ShapeHandleOverlayUtilDisplayValues {\n return getOverlayDisplayValues<ShapeHandleOverlayUtilDisplayValues>(this)\n }\n\n override render(ctx: CanvasRenderingContext2D): void {\n const overlays = this.getOverlays()\n if (overlays.length === 0) return\n const camera = this.editor.getCamera()\n const zoom = camera.z || 1\n const display = this.getDisplayValues()\n const { radius, virtualRadius, lineWidth, virtualOpacity } = this.options\n withCamera(ctx, camera, (c) => {\n c.lineWidth = lineWidth / zoom\n for (const overlay of overlays) {\n const isVirtual = overlay.handleType === \"virtual\"\n const r = (isVirtual ? virtualRadius : radius) / zoom\n c.globalAlpha = isVirtual ? virtualOpacity : 1\n // A virtual handle is a filled dot in the selection colour; a real one\n // is a ring, so the two never read as the same affordance.\n c.fillStyle = isVirtual ? display.stroke : display.fill\n c.strokeStyle = display.stroke\n c.beginPath()\n c.arc(overlay.point.x, overlay.point.y, r, 0, Math.PI * 2)\n c.fill()\n if (!isVirtual) c.stroke()\n }\n c.globalAlpha = 1\n })\n }\n}\n","/**\n * Snap guides: the lines that appear while dragging to say \"this edge lines up\n * with that one\".\n *\n * The snapping itself happens in `SnapManager` during the drag — by the time\n * this util runs, the decision is made and the shape has already been nudged.\n * All that is left is to show *why* it moved, which is the entire reason snap\n * guides exist: a shape that jumps without one looks like a bug.\n */\nimport {\n getOverlayDisplayValues,\n OverlayUtil,\n type Editor,\n type Geometry2d,\n type OverlayOptionsWithDisplayValues,\n type TLColorMode,\n type TLTheme,\n} from \"@mocanvas/editor\"\nimport { hairline, traceCross, tracePolyline, withCamera } from \"./paint\"\nimport type { TLSnapIndicatorOverlay } from \"./types\"\n\n/** The paint a snap guide is drawn with. */\nexport interface SnapIndicatorOverlayUtilDisplayValues {\n /** Guide colour. The theme's `hint`, which is deliberately not the selection colour. */\n color: string\n}\n\n/** How snap guides are drawn. */\nexport interface SnapIndicatorOverlayUtilOptions\n extends OverlayOptionsWithDisplayValues<SnapIndicatorOverlayUtilDisplayValues> {\n /** Guide weight, in CSS pixels. */\n lineWidth: number\n /**\n * Half-length of the `×` drawn at each aligned point, in CSS pixels. The\n * crosses are what distinguish \"these two edges are collinear\" from \"there\n * happens to be a line here\".\n */\n crossArm: number\n}\n\n/** Thin lines and small crosses, in the theme's hint colour. */\nexport const DEFAULT_SNAP_INDICATOR_OVERLAY_OPTIONS: SnapIndicatorOverlayUtilOptions = {\n lineWidth: 1,\n crossArm: 4,\n getDefaultDisplayValues: (_editor: unknown, theme: TLTheme, colorMode: TLColorMode) => ({\n color: theme.colors[colorMode].hint,\n }),\n}\n\n/** Paints the snap guides `editor.snaps` published for the drag in flight. */\nexport class SnapIndicatorOverlayUtil extends OverlayUtil<Editor, SnapIndicatorOverlayUtilOptions> {\n static override type = \"snapIndicator\"\n static override zIndex = 20\n static override options: SnapIndicatorOverlayUtilOptions = DEFAULT_SNAP_INDICATOR_OVERLAY_OPTIONS\n\n override isActive(): boolean {\n return this.editor.snaps.getLines().length > 0\n }\n\n override getOverlays(): TLSnapIndicatorOverlay[] {\n return this.editor.snaps.getLines().map((line) => ({\n id: line.id,\n type: \"snapIndicator\" as const,\n points: line.points,\n }))\n }\n\n /** A guide exists only during a drag, so nothing can be pointing at it. */\n override getGeometry(): Geometry2d | undefined {\n return undefined\n }\n\n /** The colour to draw with, read fresh from the theme on every frame. */\n getDisplayValues(): SnapIndicatorOverlayUtilDisplayValues {\n return getOverlayDisplayValues<SnapIndicatorOverlayUtilDisplayValues>(this)\n }\n\n override render(ctx: CanvasRenderingContext2D): void {\n const overlays = this.getOverlays()\n if (overlays.length === 0) return\n const camera = this.editor.getCamera()\n const zoom = camera.z || 1\n const { lineWidth, crossArm } = this.options\n const color = this.getDisplayValues().color\n withCamera(ctx, camera, (c) => {\n c.strokeStyle = color\n c.lineWidth = hairline(lineWidth, zoom)\n c.lineCap = \"round\"\n const arm = hairline(crossArm, zoom)\n for (const overlay of overlays) {\n tracePolyline(c, overlay.points)\n for (const point of overlay.points) traceCross(c, point.x, point.y, arm)\n c.stroke()\n }\n })\n }\n}\n","/**\n * The overlay painters a board gets unless it says otherwise.\n *\n * Registration order is only a tie-break: the real painting order is each\n * util's static `zIndex`, which the manager sorts by. The array is listed in\n * that order anyway, because a reader should not have to open eight files to\n * find out what ends up on top of what.\n *\n * Bottom to top:\n *\n * 1. other people's selections, then our own — a shape both of us have selected\n * shows our outline over theirs, because ours is the one we can act on;\n * 2. the brushes, which are transparent and belong under everything;\n * 3. snap guides and arrow hints, the feedback for a gesture in flight;\n * 4. scribbles;\n * 5. the selection box, then the handles that sit on it;\n * 6. collaborator cursors and off-screen markers, last, because a cursor that\n * can be hidden by a handle is a cursor you cannot follow.\n */\nimport type { TLAnyOverlayUtilConstructor } from \"@mocanvas/editor\"\nimport { ArrowBindingHintOverlayUtil, ArrowHintOverlayUtil } from \"./ArrowHintOverlayUtil\"\nimport { BrushOverlayUtil, ZoomBrushOverlayUtil } from \"./BrushOverlayUtil\"\nimport {\n CollaboratorBrushOverlayUtil,\n CollaboratorCursorOverlayUtil,\n CollaboratorHintOverlayUtil,\n CollaboratorScribbleOverlayUtil,\n CollaboratorShapeIndicatorOverlayUtil,\n} from \"./CollaboratorOverlayUtils\"\nimport { ScribbleOverlayUtil } from \"./ScribbleOverlayUtil\"\nimport { SelectionForegroundOverlayUtil } from \"./SelectionForegroundOverlayUtil\"\nimport { ShapeHandleOverlayUtil } from \"./ShapeHandleOverlayUtil\"\nimport { ShapeIndicatorOverlayUtil } from \"./ShapeIndicatorOverlayUtil\"\nimport { SnapIndicatorOverlayUtil } from \"./SnapIndicatorOverlayUtil\"\n\n/**\n * Pass to `Editor`/`<Mocanvas>` as `overlayUtils`, or spread it to add one:\n *\n * ```ts\n * <Mocanvas overlayUtils={[...defaultOverlayUtils, MyOverlayUtil]} />\n * ```\n *\n * To *replace* one of the defaults, register a util with the same `type` —\n * `OverlayManager.registerUtil` treats a repeated type as an override rather\n * than a duplicate, so a subclass slots in without filtering the array.\n */\nexport const defaultOverlayUtils: readonly TLAnyOverlayUtilConstructor[] = [\n CollaboratorShapeIndicatorOverlayUtil,\n // The one cast in this file. `ShapeIndicatorOverlayUtil` is constructed with\n // the structural `TLIndicatorHost` rather than with `Editor` — the editor\n // package cannot name its own `Editor` in that seam without a cycle — and\n // `Editor` satisfies the interface at runtime while being a wider type than\n // it at compile time. Every other util in this list is checked normally.\n ShapeIndicatorOverlayUtil as unknown as TLAnyOverlayUtilConstructor,\n BrushOverlayUtil,\n ZoomBrushOverlayUtil,\n CollaboratorBrushOverlayUtil,\n SnapIndicatorOverlayUtil,\n ArrowHintOverlayUtil,\n ArrowBindingHintOverlayUtil,\n ScribbleOverlayUtil,\n CollaboratorScribbleOverlayUtil,\n SelectionForegroundOverlayUtil,\n ShapeHandleOverlayUtil,\n CollaboratorCursorOverlayUtil,\n CollaboratorHintOverlayUtil,\n]\n","import { stopEventPropagation, type TLUiEventSource, type TLUiToolItem } from \"@mocanvas/editor\"\nimport { Children, useEffect, useRef, useState, type ReactNode } from \"react\"\nimport { Icon, ICONS, type IconName } from \"./icons\"\nimport { Popover } from \"./overlays\"\nimport \"./ui.css\"\n\n/**\n * The toolbar shell and the button that goes in it.\n *\n * Split out from `DefaultUi` so an app can keep the shell — the plate, the\n * overflow behaviour, the pointer-event isolation — while choosing which\n * tools go in it and in what order. That is the whole of what the consumer's\n * custom toolbars need: they render their own list of\n * {@link MocanvasUiMenuItem}s inside a {@link DefaultToolbar}.\n */\n\n/** Linear map from one range to another, clamped to the output range. */\nfunction modulate(value: number, [inMin, inMax]: [number, number], [outMin, outMax]: [number, number]): number {\n if (inMax === inMin) return outMin\n const t = (value - inMin) / (inMax - inMin)\n const out = outMin + t * (outMax - outMin)\n return Math.max(Math.min(outMin, outMax), Math.min(Math.max(outMin, outMax), out))\n}\n\nexport interface DefaultToolbarProps {\n /**\n * How many children stay inline at the narrowest width. The count is a\n * *last inline index*, not a length: children `0..itemsToShow` are inline\n * and the rest overflow, so `n` keeps `n + 1` of them.\n */\n minItems?: number\n /** How many children stay inline at the widest width, same counting. */\n maxItems?: number\n /** The width at which `minItems` applies, in CSS px. */\n minSizePx?: number\n /** The width at which `maxItems` applies, in CSS px. */\n maxSizePx?: number\n /** Accessible name for the toolbar. */\n label?: string\n children?: ReactNode\n}\n\n/*\n * SEMANTICS-ASSUMED — the overflow budget.\n * The rule is fixed by the consumer, which pins `minItems === maxItems` to\n * force an exact split independent of width: the inline count is\n * `floor(modulate(width, [minSizePx, maxSizePx], [minItems, maxItems]))`, and\n * child index `i` is inline while `i <= itemsToShow`. The four defaults below\n * are not: they are chosen so the ten default tools fit on a laptop and the\n * bar still holds five on a phone.\n */\nconst DEFAULT_BUDGET = { minItems: 4, maxItems: 12, minSizePx: 340, maxSizePx: 760 } as const\n\n/**\n * The toolbar plate. Children past the width budget move into a \"more\"\n * popover, in order; a child that renders nothing still takes a slot, so a\n * caller mapping over a fixed id list gets a stable split.\n */\nexport function DefaultToolbar({\n minItems = DEFAULT_BUDGET.minItems,\n maxItems = DEFAULT_BUDGET.maxItems,\n minSizePx = DEFAULT_BUDGET.minSizePx,\n maxSizePx = DEFAULT_BUDGET.maxSizePx,\n label = \"Tools\",\n children,\n}: DefaultToolbarProps) {\n const barRef = useRef<HTMLDivElement>(null)\n const moreRef = useRef<HTMLButtonElement>(null)\n const [moreOpen, setMoreOpen] = useState(false)\n const [width, setWidth] = useState<number | null>(null)\n\n useEffect(() => {\n const el = barRef.current\n if (!el || typeof ResizeObserver === \"undefined\") return\n const update = () => setWidth(el.getBoundingClientRect().width)\n update()\n const ro = new ResizeObserver(update)\n ro.observe(el)\n return () => ro.disconnect()\n }, [])\n\n const items = Children.toArray(children)\n // Before the first measurement, assume the widest budget: a toolbar that\n // starts collapsed and expands one frame later reads as a glitch, while one\n // that starts full and settles narrower does not.\n const itemsToShow = Math.floor(modulate(width ?? maxSizePx, [minSizePx, maxSizePx], [minItems, maxItems]))\n const inline = items.slice(0, itemsToShow + 1)\n const overflow = items.slice(itemsToShow + 1)\n\n return (\n <div\n ref={barRef}\n className=\"mocanvas-panel mocanvas-toolbar\"\n role=\"toolbar\"\n aria-label={label}\n onPointerDown={stopEventPropagation}\n >\n {inline}\n {overflow.length > 0 ? (\n <span className=\"mocanvas-more\">\n <button\n ref={moreRef}\n type=\"button\"\n className=\"mocanvas-btn\"\n aria-label=\"More tools\"\n data-tooltip=\"More tools\"\n aria-expanded={moreOpen}\n onClick={() => setMoreOpen((v) => !v)}\n >\n <Icon name=\"chevron-down\" />\n </button>\n <Popover anchorRef={moreRef} open={moreOpen} onClose={() => setMoreOpen(false)} label=\"More tools\" prefer=\"above\">\n <div className=\"mocanvas-toolbar-overflow\" onClick={() => setMoreOpen(false)}>\n {overflow}\n </div>\n </Popover>\n </span>\n ) : null}\n </div>\n )\n}\n\nexport interface MocanvasUiMenuItemProps extends TLUiToolItem {\n /** Whether the item is the active one; drives `aria-pressed`. */\n isSelected?: boolean\n /** Reported to `onSelect`. Defaults to `\"toolbar\"`. */\n source?: TLUiEventSource\n}\n\n/**\n * One UI item rendered as a button — the thing a toolbar is made of.\n *\n * Takes a {@link TLUiToolItem} spread flat, so `<MocanvasUiMenuItem {...tool}\n * isSelected={…} />` is the whole call. An icon name the set does not have\n * falls back to the label's initial, so an app's own tool still gets a\n * pressable, labelled button without shipping artwork into mocanvas.\n */\nexport function MocanvasUiMenuItem({ id, label, icon, kbd, disabled, isSelected, source = \"toolbar\", onSelect, meta }: MocanvasUiMenuItemProps) {\n void meta\n const known = Object.prototype.hasOwnProperty.call(ICONS, icon)\n return (\n <button\n type=\"button\"\n className=\"mocanvas-btn\"\n data-tool={id}\n aria-label={label}\n data-tooltip={label}\n {...(kbd ? { \"data-shortcut\": kbdLabel(kbd) } : {})}\n {...(isSelected === undefined ? {} : { \"aria-pressed\": isSelected })}\n {...(disabled ? { disabled: true } : {})}\n onClick={() => onSelect(source)}\n >\n {known ? <Icon name={icon as IconName} /> : <span className=\"mocanvas-btn-glyph\">{label.slice(0, 1).toUpperCase()}</span>}\n </button>\n )\n}\n\n/** The first of a `kbd` list's alternatives, upper-cased for display. */\nfunction kbdLabel(kbd: string): string {\n return (kbd.split(\",\")[0] ?? \"\").trim().toUpperCase()\n}\n","import {\n DEFAULT_COLORS,\n DefaultColorStyle,\n DefaultDashStyle,\n DefaultFillStyle,\n DefaultFontStyle,\n DefaultHorizontalAlignStyle,\n DefaultLabelColorStyle,\n DefaultSizeStyle,\n DefaultVerticalAlignStyle,\n GEO_SHAPE_KINDS,\n GeoShapeGeoStyle,\n LIGHT_THEME,\n track,\n useEditor,\n type DefaultColorStyle as ColorValue,\n type DefaultDashStyle as DashValue,\n type DefaultFillStyle as FillValue,\n type DefaultFontStyle as FontValue,\n type DefaultHorizontalAlignStyle as HAlignValue,\n type DefaultSizeStyle as SizeValue,\n type DefaultVerticalAlignStyle as VAlignValue,\n type Editor,\n type GeoShapeKind,\n type SharedStyle,\n type StyleProp,\n} from \"@mocanvas/editor\"\nimport { useRef, useState, type ReactNode } from \"react\"\nimport { Icon, type IconName } from \"./icons\"\nimport { Popover } from \"./overlays\"\n\n/** Tools whose id doubles as the type of the shape they create. */\nconst CREATING_TOOLS = new Set([\"geo\", \"draw\", \"note\", \"text\", \"arrow\", \"line\"])\n\nconst SWATCH_COLORS = DEFAULT_COLORS.filter((c) => c !== \"white\")\nconst FILLS: FillValue[] = [\"none\", \"semi\", \"solid\", \"pattern\"]\nconst DASHES: DashValue[] = [\"draw\", \"solid\", \"dashed\", \"dotted\"]\nconst SIZES: SizeValue[] = [\"s\", \"m\", \"l\", \"xl\"]\nconst FONTS: FontValue[] = [\"draw\", \"sans\", \"serif\", \"mono\"]\nconst H_ALIGNS: HAlignValue[] = [\"start\", \"middle\", \"end\"]\nconst V_ALIGNS: VAlignValue[] = [\"start\", \"middle\", \"end\"]\n\nconst FILL_ICON: Record<string, IconName> = { none: \"fill-none\", semi: \"fill-semi\", solid: \"fill-solid\", pattern: \"fill-pattern\" }\nconst H_ALIGN_ICON: Record<string, IconName> = { start: \"align-left\", middle: \"align-center\", end: \"align-right\" }\nconst V_ALIGN_ICON: Record<string, IconName> = { start: \"valign-top\", middle: \"valign-middle\", end: \"valign-bottom\" }\nconst H_ALIGN_LABEL: Record<string, string> = { start: \"Align left\", middle: \"Align centre\", end: \"Align right\" }\nconst V_ALIGN_LABEL: Record<string, string> = { start: \"Align top\", middle: \"Align middle\", end: \"Align bottom\" }\n\nfunction titleCase(s: string): string {\n return s.replace(/-/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\n// ---------------------------------------------------------------------------\n// Which rows the panel shows\n// ---------------------------------------------------------------------------\n\n/**\n * The style rows the panel renders, in order, grouped as the panel groups them.\n *\n * With a selection this is exactly what the selected shapes declare, so a line\n * (colour, dash, size) never offers Font or Align; with nothing selected it is\n * what the active drawing tool is about to create. Exported so the rule can be\n * tested without a DOM.\n */\nexport interface StylePanelSections {\n /** The geo picker. */\n shape: boolean\n /** Colour swatch grids. */\n color: boolean\n labelColor: boolean\n /** Stroke and fill. */\n fill: boolean\n dash: boolean\n size: boolean\n /** Text. */\n font: boolean\n align: boolean\n verticalAlign: boolean\n /** Shape-level, not a style: only with a selection. */\n opacity: boolean\n}\n\nconst NOTHING: StylePanelSections = {\n shape: false,\n color: false,\n labelColor: false,\n fill: false,\n dash: false,\n size: false,\n font: false,\n align: false,\n verticalAlign: false,\n opacity: false,\n}\n\n/** Decide which rows the style panel shows for the editor's current state. */\nexport function getStylePanelSections(editor: Editor): StylePanelSections {\n const hasSelection = editor.getSelectedShapeIds().length > 0\n const toolId = editor.getCurrentToolId()\n // With a selection the selection decides, full stop: falling back to the\n // active tool's styles would offer rows the selected shapes cannot carry.\n const visible: Set<StyleProp<unknown>> = hasSelection\n ? new Set(editor.getSharedStyles().keys())\n : CREATING_TOOLS.has(toolId)\n ? new Set(editor.getStylePropsForType(toolId).values())\n : new Set()\n if (visible.size === 0 && !hasSelection) return NOTHING\n return {\n shape: visible.has(GeoShapeGeoStyle),\n color: visible.has(DefaultColorStyle),\n labelColor: visible.has(DefaultLabelColorStyle),\n fill: visible.has(DefaultFillStyle),\n dash: visible.has(DefaultDashStyle),\n size: visible.has(DefaultSizeStyle),\n font: visible.has(DefaultFontStyle),\n align: visible.has(DefaultHorizontalAlignStyle),\n verticalAlign: visible.has(DefaultVerticalAlignStyle),\n opacity: hasSelection,\n }\n}\n\n/** Whether any row at all is on. */\nexport function hasAnyStyleSection(s: StylePanelSections): boolean {\n return Object.values(s).some(Boolean)\n}\n\n// ---------------------------------------------------------------------------\n// Pieces\n// ---------------------------------------------------------------------------\n\n/** The dashed ring shown beside a row whose selection has differing values. */\nfunction MixedRing() {\n return (\n <span className=\"mocanvas-mixed\">\n <Icon name=\"mixed\" size={11} />\n mixed\n </span>\n )\n}\n\nfunction Row({ label, mixed, children }: { label: string; mixed: boolean; children: ReactNode }) {\n return (\n <div>\n <div className=\"mocanvas-row-label\">\n <span>{label}</span>\n {mixed ? <MixedRing /> : null}\n </div>\n <div className=\"mocanvas-seg\" role=\"radiogroup\" aria-label={label}>\n {children}\n </div>\n </div>\n )\n}\n\n/** A titled band of related rows, separated from its neighbours by a hairline. */\nfunction Group({ children }: { children: ReactNode }) {\n return <div className=\"mocanvas-group\">{children}</div>\n}\n\ninterface ChoiceProps<T> {\n value: T\n current: SharedStyle<T> | undefined\n label: string\n onPick: (value: T) => void\n children: ReactNode\n}\n\nfunction Choice<T>({ value, current, label, onPick, children }: ChoiceProps<T>) {\n const active = current?.type === \"shared\" && current.value === value\n return (\n <button type=\"button\" role=\"radio\" className=\"mocanvas-btn\" aria-label={label} aria-checked={active} data-tooltip={label} onClick={() => onPick(value)}>\n {children}\n </button>\n )\n}\n\nfunction ColorRow({ label, current, onPick }: { label: string; current: SharedStyle<ColorValue> | undefined; onPick: (c: ColorValue) => void }) {\n return (\n <div>\n <div className=\"mocanvas-row-label\">\n <span>{label}</span>\n {current?.type === \"mixed\" ? <MixedRing /> : null}\n </div>\n <div className=\"mocanvas-swatches\" role=\"radiogroup\" aria-label={label}>\n {SWATCH_COLORS.map((c) => (\n <button\n key={c}\n type=\"button\"\n role=\"radio\"\n className=\"mocanvas-swatch\"\n aria-label={titleCase(c)}\n aria-checked={current?.type === \"shared\" && current.value === c}\n data-tooltip={titleCase(c)}\n onClick={() => onPick(c)}\n >\n <span style={{ [\"--mocanvas-swatch-color\" as string]: LIGHT_THEME[c].solid }} />\n </button>\n ))}\n </div>\n </div>\n )\n}\n\n/**\n * The geo kind, as one button that opens a grid. Twenty always-visible cells\n * cost more vertical space than the rest of the panel put together, and the\n * kind rarely changes once a shape exists.\n */\nfunction ShapePicker({ current, onPick }: { current: SharedStyle<GeoShapeKind> | undefined; onPick: (geo: GeoShapeKind) => void }) {\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLButtonElement>(null)\n const value = current?.type === \"shared\" ? current.value : null\n return (\n <div>\n <div className=\"mocanvas-row-label\">\n <span>Shape</span>\n {current?.type === \"mixed\" ? <MixedRing /> : null}\n </div>\n <button\n ref={ref}\n type=\"button\"\n className=\"mocanvas-picker\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={value ? `Shape: ${titleCase(value)}` : \"Shape\"}\n onClick={() => setOpen((v) => !v)}\n >\n <span>\n {value ? <Icon name={`geo-${value}`} /> : <Icon name=\"mixed\" />}\n {value ? titleCase(value) : \"Mixed\"}\n </span>\n <Icon name={open ? \"chevron-up\" : \"chevron-down\"} size={16} />\n </button>\n <Popover anchorRef={ref} open={open} onClose={() => setOpen(false)} label=\"Shape\" prefer=\"below\">\n {GEO_SHAPE_KINDS.map((kind) => (\n <button\n key={kind}\n type=\"button\"\n role=\"menuitemradio\"\n className=\"mocanvas-btn\"\n aria-label={titleCase(kind)}\n aria-checked={value === kind}\n data-tooltip={titleCase(kind)}\n onClick={() => {\n onPick(kind)\n setOpen(false)\n }}\n >\n <Icon name={`geo-${kind}`} />\n </button>\n ))}\n </Popover>\n </div>\n )\n}\n\nfunction OpacityRow({ editor }: { editor: Editor }) {\n const shapes = editor.getSelectedShapes()\n if (shapes.length === 0) return null\n const first = shapes[0]!.opacity\n const mixed = shapes.some((s) => s.opacity !== first)\n const value = mixed ? 1 : first\n return (\n <div>\n <div className=\"mocanvas-row-label\">\n <span>Opacity</span>\n {mixed ? <MixedRing /> : <span>{Math.round(value * 100)}%</span>}\n </div>\n <input\n type=\"range\"\n className=\"mocanvas-slider\"\n min={0.1}\n max={1}\n step={0.05}\n value={value}\n aria-label=\"Opacity\"\n onPointerDown={() => editor.markHistoryStoppingPoint(\"opacity\")}\n onChange={(e) => {\n const opacity = Number(e.currentTarget.value)\n editor.updateShapes(editor.getSelectedShapes().map((s) => ({ id: s.id, type: s.type, opacity })))\n }}\n />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Panel\n// ---------------------------------------------------------------------------\n\n/**\n * Style controls for the selection (or, with nothing selected, for the next\n * shape the active drawing tool creates). Sits in the top-right corner.\n *\n * Rows are grouped — shape, colour, stroke and fill, text, opacity — and every\n * group is omitted when the selection cannot carry it.\n */\nexport const StylePanel = track(function StylePanel() {\n const editor = useEditor()\n const sections = getStylePanelSections(editor)\n const styles = editor.getSharedStyles()\n if (!hasAnyStyleSection(sections)) return null\n\n const setStyle = <T,>(style: StyleProp<T>, value: T) => {\n editor.markHistoryStoppingPoint(\"style\")\n editor.setStyleForSelectedShapes(style, value)\n editor.setStyleForNextShapes(style, value)\n }\n const pickGeo = (geo: GeoShapeKind) => {\n setStyle(GeoShapeGeoStyle, geo)\n // The geo tool reads its kind on enter; re-enter so the change takes effect immediately.\n if (editor.getCurrentToolId() === \"geo\") editor.setCurrentTool(\"geo\", { geo, force: true })\n }\n\n const strokeGroup = sections.fill || sections.dash || sections.size\n const textGroup = sections.font || sections.align || sections.verticalAlign\n\n return (\n <div className=\"mocanvas-panel mocanvas-stylepanel\" aria-label=\"Style\" onPointerDown={(e) => e.stopPropagation()}>\n {sections.shape ? (\n <Group>\n <ShapePicker current={styles.get(GeoShapeGeoStyle)} onPick={pickGeo} />\n </Group>\n ) : null}\n\n {sections.color || sections.labelColor ? (\n <Group>\n {sections.color ? <ColorRow label=\"Color\" current={styles.get(DefaultColorStyle)} onPick={(c) => setStyle(DefaultColorStyle, c)} /> : null}\n {sections.labelColor ? <ColorRow label=\"Label\" current={styles.get(DefaultLabelColorStyle)} onPick={(c) => setStyle(DefaultLabelColorStyle, c)} /> : null}\n </Group>\n ) : null}\n\n {strokeGroup ? (\n <Group>\n {sections.fill ? (\n <Row label=\"Fill\" mixed={styles.get(DefaultFillStyle)?.type === \"mixed\"}>\n {FILLS.map((f) => (\n <Choice key={f} value={f} current={styles.get(DefaultFillStyle)} label={`${titleCase(f)} fill`} onPick={(v) => setStyle(DefaultFillStyle, v)}>\n <Icon name={FILL_ICON[f]!} />\n </Choice>\n ))}\n </Row>\n ) : null}\n {sections.dash ? (\n <Row label=\"Dash\" mixed={styles.get(DefaultDashStyle)?.type === \"mixed\"}>\n {DASHES.map((d) => (\n <Choice key={d} value={d} current={styles.get(DefaultDashStyle)} label={`${titleCase(d)} line`} onPick={(v) => setStyle(DefaultDashStyle, v)}>\n <Icon name={`dash-${d}`} />\n </Choice>\n ))}\n </Row>\n ) : null}\n {sections.size ? (\n <Row label=\"Size\" mixed={styles.get(DefaultSizeStyle)?.type === \"mixed\"}>\n {SIZES.map((s) => (\n <Choice key={s} value={s} current={styles.get(DefaultSizeStyle)} label={`Size ${s.toUpperCase()}`} onPick={(v) => setStyle(DefaultSizeStyle, v)}>\n <Icon name={`size-${s}`} />\n </Choice>\n ))}\n </Row>\n ) : null}\n </Group>\n ) : null}\n\n {textGroup ? (\n <Group>\n {sections.font ? (\n <Row label=\"Font\" mixed={styles.get(DefaultFontStyle)?.type === \"mixed\"}>\n {FONTS.map((f) => (\n <Choice key={f} value={f} current={styles.get(DefaultFontStyle)} label={`${titleCase(f)} font`} onPick={(v) => setStyle(DefaultFontStyle, v)}>\n <Icon name={`font-${f}`} />\n </Choice>\n ))}\n </Row>\n ) : null}\n {/* The two alignments are one idea and three buttons each, so they\n share a row rather than costing two labels' worth of height. */}\n {sections.align || sections.verticalAlign ? (\n <div>\n <div className=\"mocanvas-row-label\">\n <span>Align</span>\n {styles.get(DefaultHorizontalAlignStyle)?.type === \"mixed\" || styles.get(DefaultVerticalAlignStyle)?.type === \"mixed\" ? <MixedRing /> : null}\n </div>\n <div className=\"mocanvas-seg mocanvas-seg--split\">\n {sections.align ? (\n <div className=\"mocanvas-seg\" role=\"radiogroup\" aria-label=\"Horizontal align\">\n {H_ALIGNS.map((a) => (\n <Choice key={a} value={a} current={styles.get(DefaultHorizontalAlignStyle)} label={H_ALIGN_LABEL[a]!} onPick={(v) => setStyle(DefaultHorizontalAlignStyle, v)}>\n <Icon name={H_ALIGN_ICON[a]!} />\n </Choice>\n ))}\n </div>\n ) : null}\n {sections.verticalAlign ? (\n <div className=\"mocanvas-seg\" role=\"radiogroup\" aria-label=\"Vertical align\">\n {V_ALIGNS.map((a) => (\n <Choice key={a} value={a} current={styles.get(DefaultVerticalAlignStyle)} label={V_ALIGN_LABEL[a]!} onPick={(v) => setStyle(DefaultVerticalAlignStyle, v)}>\n <Icon name={V_ALIGN_ICON[a]!} />\n </Choice>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n ) : null}\n </Group>\n ) : null}\n\n {sections.opacity ? (\n <Group>\n <OpacityRow editor={editor} />\n </Group>\n ) : null}\n </div>\n )\n})\n","import { GEO_SHAPE_KINDS, type GeoShapeKind } from \"@mocanvas/editor\"\nimport type { IconName } from \"./icons\"\n\n/**\n * The default toolbar's contents, as data.\n *\n * Kept apart from the components that render it so the tool *list* — which is\n * also what `TLUiOverrides.tools` starts from and what `useTools()` hands to a\n * custom toolbar — has no React in it.\n */\n\nexport interface ToolbarItem {\n /** Unique key; also the geo kind for geo entries. */\n id: string\n /** Tool id that must be registered for this entry to appear. */\n tool: string\n icon: IconName\n label: string\n /**\n * Keyboard shortcut(s), comma-separated. Lower case: these are compared\n * against `KeyboardEvent.key`.\n */\n kbd?: string\n /** Displayed in the tooltip, next to the label. */\n shortcut?: string\n /** Geo kind the entry selects, for entries driving the `geo` tool. */\n geo?: GeoShapeKind\n /** Tools outside the default set: shown only when the app registers them. */\n optional?: boolean\n /** Keep the shortcut live on a read-only editor. */\n readonlyOk?: boolean\n}\n\n/** Toolbar entries, grouped; groups are separated by a divider. */\nexport const TOOLBAR_GROUPS: readonly (readonly ToolbarItem[])[] = [\n [\n { id: \"select\", tool: \"select\", icon: \"select\", label: \"Select\", shortcut: \"V\", kbd: \"v\", readonlyOk: true },\n { id: \"hand\", tool: \"hand\", icon: \"hand\", label: \"Hand\", shortcut: \"H\", kbd: \"h\", readonlyOk: true },\n ],\n [\n { id: \"draw\", tool: \"draw\", icon: \"draw\", label: \"Draw\", shortcut: \"D\", kbd: \"d,p,b\" },\n { id: \"eraser\", tool: \"eraser\", icon: \"eraser\", label: \"Eraser\", shortcut: \"E\", kbd: \"e\" },\n ],\n [\n { id: \"rectangle\", tool: \"geo\", icon: \"geo-rectangle\", label: \"Rectangle\", shortcut: \"R\", kbd: \"r\", geo: \"rectangle\" },\n { id: \"ellipse\", tool: \"geo\", icon: \"geo-ellipse\", label: \"Ellipse\", shortcut: \"O\", kbd: \"o\", geo: \"ellipse\" },\n { id: \"triangle\", tool: \"geo\", icon: \"geo-triangle\", label: \"Triangle\", geo: \"triangle\" },\n { id: \"diamond\", tool: \"geo\", icon: \"geo-diamond\", label: \"Diamond\", geo: \"diamond\" },\n { id: \"star\", tool: \"geo\", icon: \"geo-star\", label: \"Star\", geo: \"star\" },\n ],\n [\n { id: \"text\", tool: \"text\", icon: \"text\", label: \"Text\", shortcut: \"T\", kbd: \"t\" },\n { id: \"note\", tool: \"note\", icon: \"note\", label: \"Note\", shortcut: \"N\", kbd: \"n\" },\n { id: \"arrow\", tool: \"arrow\", icon: \"arrow\", label: \"Arrow\", shortcut: \"A\", kbd: \"a\", optional: true },\n { id: \"line\", tool: \"line\", icon: \"line\", label: \"Line\", shortcut: \"L\", kbd: \"l\", optional: true },\n { id: \"frame\", tool: \"frame\", icon: \"frame\", label: \"Frame\", shortcut: \"F\", kbd: \"f\", optional: true },\n ],\n]\n\n/** Geo kinds with a toolbar button of their own. */\nexport const PRIMARY_GEO_KINDS: readonly GeoShapeKind[] = TOOLBAR_GROUPS.flat()\n .map((t) => t.geo)\n .filter((g): g is GeoShapeKind => g !== undefined)\n\n/** Geo kinds that live behind the \"more shapes\" popover. */\nexport const MORE_GEO_KINDS: readonly GeoShapeKind[] = GEO_SHAPE_KINDS.filter((k) => !PRIMARY_GEO_KINDS.includes(k))\n","import {\n GeoShapeGeoStyle,\n type Editor,\n type TLUiActionItem,\n type TLUiActionsContextType,\n type TLUiToolItem,\n type TLUiToolsContextType,\n} from \"@mocanvas/editor\"\nimport { MORE_GEO_KINDS, TOOLBAR_GROUPS, type ToolbarItem } from \"./toolbar-config\"\n\n/**\n * The default tool and action lists — the lists a `TLUiOverrides` callback is\n * handed and gets to rewrite.\n *\n * Only tools the editor actually has are listed. An app can register a smaller\n * tool set than the default one, and a UI item for a state-chart node that is\n * not there would render a button that throws when pressed.\n */\n\nfunction titleCase(s: string): string {\n return s.replace(/-/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\n/** Tool ids the editor currently has registered. */\nexport function registeredToolIds(editor: Editor): Set<string> {\n return new Set(Object.keys(editor.root.children ?? {}))\n}\n\nfunction toolItem(editor: Editor, item: ToolbarItem): TLUiToolItem {\n return {\n id: item.id,\n label: item.label,\n icon: item.icon,\n ...(item.kbd === undefined ? {} : { kbd: item.kbd }),\n ...(item.readonlyOk === undefined ? {} : { readonlyOk: item.readonlyOk }),\n ...(item.geo === undefined ? {} : { meta: { geo: item.geo } }),\n onSelect: () => {\n if (item.geo === undefined) {\n editor.setCurrentTool(item.tool)\n return\n }\n // A geo item selects a *kind* as well as the tool, and re-selecting the\n // same kind must still re-enter the tool — hence `force`.\n editor.setStyleForNextShapes(GeoShapeGeoStyle, item.geo)\n editor.setCurrentTool(\"geo\", { geo: item.geo, force: true })\n },\n }\n}\n\n/**\n * Build the default tool list for an editor. The geo kinds without a toolbar\n * button of their own are included too: they are real, selectable tools that\n * live behind the \"more shapes\" popover, and an app rebuilding the toolbar\n * should be able to surface them.\n */\nexport function buildDefaultToolItems(editor: Editor): TLUiToolsContextType {\n const available = registeredToolIds(editor)\n const tools: TLUiToolsContextType = {}\n for (const item of TOOLBAR_GROUPS.flat()) {\n if (!available.has(item.tool)) continue\n tools[item.id] = toolItem(editor, item)\n }\n if (available.has(\"geo\")) {\n for (const kind of MORE_GEO_KINDS) {\n tools[kind] = toolItem(editor, { id: kind, tool: \"geo\", icon: `geo-${kind}`, label: titleCase(kind), geo: kind })\n }\n }\n return tools\n}\n\n/**\n * Build the default action list for an editor.\n *\n * Every menu, toolbar and shortcut in the default chrome renders from this\n * list rather than calling the editor directly, which is what makes\n * `TLUiOverrides.actions` a real override point: relabel an entry, rebind its\n * key or delete it and it changes — or disappears — everywhere at once.\n *\n * ## Why nothing here reads the editor\n * The list is built once per editor, not once per frame, so anything read\n * while building it would be frozen at that moment — an item marked\n * `disabled` because nothing was selected when the chrome mounted would stay\n * disabled forever. Availability is therefore *not* baked in: it is resolved\n * where it is rendered, by `useActionState`, which reads the editor\n * reactively. Everything below is either a constant or a closure.\n */\nexport function buildDefaultActionItems(editor: Editor): TLUiActionsContextType {\n const selected = () => editor.getSelectedShapeIds()\n\n const item = (\n id: string,\n label: string,\n onSelect: () => void,\n extra: Partial<Omit<TLUiActionItem, \"id\" | \"label\" | \"onSelect\">> = {},\n ): TLUiActionItem => ({ id, label, onSelect, ...extra })\n\n const items: TLUiActionItem[] = [\n // ---- history ----------------------------------------------------------\n item(\"undo\", \"Undo\", () => void editor.undo(), { icon: \"undo\", kbd: \"mod+z\" }),\n item(\"redo\", \"Redo\", () => void editor.redo(), { icon: \"redo\", kbd: \"mod+shift+z\" }),\n\n // ---- camera -----------------------------------------------------------\n item(\"zoom-in\", \"Zoom in\", () => void editor.zoomIn(), { icon: \"zoom-in\", kbd: \"mod+=\", readonlyOk: true }),\n item(\"zoom-out\", \"Zoom out\", () => void editor.zoomOut(), { icon: \"zoom-out\", kbd: \"mod+-\", readonlyOk: true }),\n item(\"reset-zoom\", \"Reset zoom\", () => void editor.resetZoom(), { icon: \"zoom-fit\", kbd: \"mod+0\", readonlyOk: true }),\n item(\"zoom-to-fit\", \"Zoom to fit\", () => void editor.zoomToFit(), { icon: \"zoom-fit\", kbd: \"mod+1\", readonlyOk: true }),\n item(\"zoom-to-selection\", \"Zoom to selection\", () => void editor.zoomToSelection(), { icon: \"zoom-fit\", kbd: \"mod+2\", readonlyOk: true }),\n\n // ---- selection --------------------------------------------------------\n item(\"select-all\", \"Select all\", () => void editor.selectAll(), { kbd: \"mod+a\", readonlyOk: true }),\n item(\"select-none\", \"Select none\", () => void editor.selectNone(), { readonlyOk: true }),\n item(\"delete\", \"Delete\", () => void editor.deleteShapes(selected()), { icon: \"trash\", kbd: \"backspace,delete\" }),\n item(\"duplicate\", \"Duplicate\", () => void editor.duplicateShapes(selected()), { icon: \"duplicate\", kbd: \"mod+d\" }),\n item(\"group\", \"Group\", () => void editor.groupShapes(selected()), { icon: \"group\", kbd: \"mod+g\" }),\n item(\"ungroup\", \"Ungroup\", () => void editor.ungroupShapes(selected()), { icon: \"ungroup\", kbd: \"mod+shift+g\" }),\n item(\"toggle-lock\", \"Toggle lock\", () => void editor.toggleLock(selected()), { icon: \"lock\", kbd: \"shift+l\" }),\n item(\"unlock-all\", \"Unlock all\", () => {\n const locked = editor.getCurrentPageShapes().filter((shape) => shape.isLocked)\n if (locked.length > 0) editor.toggleLock(locked.map((shape) => shape.id))\n }, { icon: \"unlock\" }),\n item(\"rotate-cw\", \"Rotate clockwise\", () => void editor.rotateShapesBy(selected(), Math.PI / 2)),\n item(\"rotate-ccw\", \"Rotate counter-clockwise\", () => void editor.rotateShapesBy(selected(), -Math.PI / 2)),\n\n // ---- ordering ---------------------------------------------------------\n item(\"bring-to-front\", \"Bring to front\", () => void editor.bringToFront(selected()), { kbd: \"]\" }),\n item(\"bring-forward\", \"Bring forward\", () => void editor.bringForward(selected()), { icon: \"bring-forward\", kbd: \"mod+]\" }),\n item(\"send-backward\", \"Send backward\", () => void editor.sendBackward(selected()), { icon: \"send-backward\", kbd: \"mod+[\" }),\n item(\"send-to-back\", \"Send to back\", () => void editor.sendToBack(selected()), { kbd: \"[\" }),\n\n // ---- align / distribute / stack / stretch -----------------------------\n item(\"align-left\", \"Align left\", () => void editor.alignShapes(selected(), \"left\"), { icon: \"align-left\", kbd: \"alt+a\" }),\n item(\"align-center-horizontal\", \"Align centre horizontally\", () => void editor.alignShapes(selected(), \"center-horizontal\"), { icon: \"align-center\", kbd: \"alt+h\" }),\n item(\"align-right\", \"Align right\", () => void editor.alignShapes(selected(), \"right\"), { icon: \"align-right\", kbd: \"alt+d\" }),\n item(\"align-top\", \"Align top\", () => void editor.alignShapes(selected(), \"top\"), { icon: \"valign-top\", kbd: \"alt+w\" }),\n item(\"align-center-vertical\", \"Align centre vertically\", () => void editor.alignShapes(selected(), \"center-vertical\"), { icon: \"valign-middle\", kbd: \"alt+v\" }),\n item(\"align-bottom\", \"Align bottom\", () => void editor.alignShapes(selected(), \"bottom\"), { icon: \"valign-bottom\", kbd: \"alt+s\" }),\n item(\"distribute-horizontal\", \"Distribute horizontally\", () => void editor.distributeShapes(selected(), \"horizontal\"), { kbd: \"alt+shift+h\" }),\n item(\"distribute-vertical\", \"Distribute vertically\", () => void editor.distributeShapes(selected(), \"vertical\"), { kbd: \"alt+shift+v\" }),\n item(\"stack-horizontal\", \"Stack horizontally\", () => void editor.stackShapes(selected(), \"horizontal\")),\n item(\"stack-vertical\", \"Stack vertically\", () => void editor.stackShapes(selected(), \"vertical\")),\n item(\"stretch-horizontal\", \"Stretch horizontally\", () => void editor.stretchShapes(selected(), \"horizontal\")),\n item(\"stretch-vertical\", \"Stretch vertically\", () => void editor.stretchShapes(selected(), \"vertical\")),\n item(\"flip-horizontal\", \"Flip horizontally\", () => void editor.flipShapes(selected(), \"horizontal\"), { kbd: \"shift+h\" }),\n item(\"flip-vertical\", \"Flip vertically\", () => void editor.flipShapes(selected(), \"vertical\"), { kbd: \"shift+v\" }),\n item(\"pack\", \"Pack\", () => void editor.packShapes(selected())),\n\n // ---- modes ------------------------------------------------------------\n item(\"toggle-grid\", \"Show grid\", () => editor.updateInstanceState({ isGridMode: !editor.getInstanceState().isGridMode }), { kbd: \"mod+'\", readonlyOk: true }),\n item(\"toggle-focus-mode\", \"Focus mode\", () => editor.updateInstanceState({ isFocusMode: !editor.getInstanceState().isFocusMode }), { kbd: \"mod+.\", readonlyOk: true }),\n item(\"toggle-debug-mode\", \"Debug mode\", () => editor.updateInstanceState({ isDebugMode: !editor.getInstanceState().isDebugMode }), { readonlyOk: true }),\n item(\"toggle-tool-lock\", \"Tool lock\", () => editor.updateInstanceState({ isToolLocked: !editor.getInstanceState().isToolLocked }), { kbd: \"q\" }),\n item(\"toggle-transparent\", \"Transparent background\", () => editor.updateInstanceState({ exportBackground: !editor.getInstanceState().exportBackground }), { readonlyOk: true }),\n item(\"toggle-snap-mode\", \"Always snap\", () => editor.user.updateUserPreferences({ isSnapMode: !editor.user.getIsSnapMode() }), { readonlyOk: true }),\n item(\"toggle-wrap-mode\", \"Wrap text\", () => editor.user.updateUserPreferences({ isWrapMode: !editor.user.getIsWrapMode() }), { readonlyOk: true }),\n item(\"toggle-dynamic-size-mode\", \"Dynamic size\", () => editor.user.updateUserPreferences({ isDynamicSizeMode: !editor.user.getIsDynamicSizeMode() }), { readonlyOk: true }),\n item(\"toggle-paste-at-cursor\", \"Paste at cursor\", () => editor.user.updateUserPreferences({ isPasteAtCursorMode: !editor.user.getIsPasteAtCursorMode() }), { readonlyOk: true }),\n item(\"toggle-edge-scrolling\", \"Edge scrolling\", () => editor.user.updateUserPreferences({ edgeScrollSpeed: editor.user.getEdgeScrollSpeed() === 0 ? 1 : 0 }), { readonlyOk: true }),\n item(\"toggle-reduce-motion\", \"Reduce motion\", () => editor.user.updateUserPreferences({ animationSpeed: editor.user.getAnimationSpeed() === 0 ? 1 : 0 }), { readonlyOk: true }),\n item(\"toggle-dark-mode\", \"Dark mode\", () => editor.setColorMode(editor.getColorMode() === \"dark\" ? \"light\" : \"dark\"), { readonlyOk: true }),\n item(\"toggle-keyboard-shortcuts\", \"Keyboard shortcuts\", () => editor.user.updateUserPreferences({ areKeyboardShortcutsEnabled: !editor.user.getAreKeyboardShortcutsEnabled() }), { readonlyOk: true }),\n\n // ---- pages ------------------------------------------------------------\n item(\"new-page\", \"New page\", () => void editor.createPage({ name: `Page ${editor.getPages().length + 1}` })),\n item(\"duplicate-page\", \"Duplicate page\", () => void editor.duplicatePage(editor.getCurrentPageId())),\n item(\"delete-page\", \"Delete page\", () => void editor.deletePage(editor.getCurrentPageId())),\n ]\n\n const actions: TLUiActionsContextType = {}\n for (const entry of items) actions[entry.id] = entry\n return actions\n}\n","import { useEditor, useTools, type TLUiToolsContextType } from \"@mocanvas/editor\"\nimport { useEffect, useRef } from \"react\"\n\n/**\n * Bind the keyboard shortcuts declared by the UI tool list.\n *\n * This is what makes `TLUiOverrides.tools` mean something: a tool's `kbd`\n * lives on its UI item, so an app that rebinds `s` to the note tool, or that\n * registers a tool of its own with a `c`, does it by rewriting that list —\n * not by patching a switch statement inside mocanvas.\n *\n * Only plain single-key bindings are handled here. Anything with a modifier\n * (`mod+z`) belongs to the action shortcuts, which `useKeyboardShortcuts`\n * owns; binding it in both places would fire it twice.\n */\nfunction isEditable(t: EventTarget | null): boolean {\n return t instanceof HTMLElement && (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable)\n}\n\n/** `{ key: toolId }` for every plain single-key binding in the list. */\nexport function toolKeyMap(tools: TLUiToolsContextType, isReadonly: boolean): Map<string, string> {\n const map = new Map<string, string>()\n for (const tool of Object.values(tools)) {\n if (tool.disabled) continue\n if (isReadonly && !tool.readonlyOk) continue\n if (!tool.kbd) continue\n for (const raw of tool.kbd.split(\",\")) {\n const key = raw.trim().toLowerCase()\n if (key === \"\" || key.includes(\"+\")) continue\n // First declaration wins, so a later item cannot silently steal a key\n // an earlier one already answers to.\n if (!map.has(key)) map.set(key, tool.id)\n }\n }\n return map\n}\n\n/** Binds the tool list's shortcuts for as long as the calling component is mounted. */\nexport function useToolShortcuts(): void {\n const editor = useEditor()\n const tools = useTools()\n const toolsRef = useRef(tools)\n toolsRef.current = tools\n\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.metaKey || e.ctrlKey || e.altKey) return\n if (isEditable(e.target)) return\n if (editor.getEditingShapeId()) return\n const map = toolKeyMap(toolsRef.current, editor.getInstanceState().isReadonly)\n const id = map.get(e.key.toLowerCase())\n if (id === undefined) return\n const tool = toolsRef.current[id]\n if (!tool) return\n e.preventDefault()\n tool.onSelect(\"kbd\")\n }\n window.addEventListener(\"keydown\", onKeyDown)\n return () => window.removeEventListener(\"keydown\", onKeyDown)\n }, [editor])\n}\n\n/** Component form, so the hook can be mounted from inside the UI provider. */\nexport function ToolShortcuts() {\n useToolShortcuts()\n return null\n}\n","import { useEffect } from \"react\"\nimport { atom } from \"@mocanvas/state\"\nimport type { Editor } from \"@mocanvas/editor\"\n\n/** Whether the frame-statistics chip is visible. Toggled with ⌥D. */\nexport const debugStatsOpen = atom(\"debugStatsOpen\", false)\n\nfunction isEditable(t: EventTarget | null): boolean {\n return t instanceof HTMLElement && (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable)\n}\n\nlet clipboardFallback = \"\"\n\nexport interface KeyboardShortcutOptions {\n /**\n * Bind the plain-key tool switches (`v`, `h`, `n`, …). Leave it on for an\n * editor with no chrome; turn it OFF whenever `DefaultUi` is mounted, because\n * the UI tool list binds those keys itself — and it is the list an app's\n * `TLUiOverrides.tools` can rewrite, so a binding hard-coded here would\n * survive an override that meant to remove it. Defaults to `true`.\n */\n tools?: boolean\n}\n\n/** Default keyboard shortcuts: tool switching, undo/redo, select all, zoom, clipboard. */\nexport function useKeyboardShortcuts(editor: Editor | null, options: KeyboardShortcutOptions = {}): void {\n const bindTools = options.tools ?? true\n useEffect(() => {\n if (!editor) return\n const isMac = /Mac|iPhone|iPad/.test(navigator.platform ?? \"\")\n const onKeyDown = (e: KeyboardEvent) => {\n if (isEditable(e.target)) return\n if (editor.getEditingShapeId()) return\n const accel = isMac ? e.metaKey : e.ctrlKey\n const key = e.key.toLowerCase()\n if (accel) {\n switch (key) {\n case \"z\":\n e.preventDefault()\n if (e.shiftKey) editor.redo()\n else editor.undo()\n return\n case \"y\":\n e.preventDefault()\n editor.redo()\n return\n case \"a\":\n e.preventDefault()\n editor.selectAll()\n return\n case \"g\": {\n e.preventDefault()\n const ids = editor.getSelectedShapeIds()\n if (!ids.length) return\n editor.markHistoryStoppingPoint(e.shiftKey ? \"ungroup\" : \"group\")\n if (e.shiftKey) editor.ungroupShapes(ids)\n else editor.groupShapes(ids)\n return\n }\n case \"l\": {\n e.preventDefault()\n if (e.shiftKey) {\n editor.markHistoryStoppingPoint(\"lock\")\n editor.toggleLock()\n }\n return\n }\n case \"d\": {\n e.preventDefault()\n const ids = editor.getSelectedShapeIds()\n if (ids.length) {\n editor.markHistoryStoppingPoint(\"duplicate\")\n const copies = editor.duplicateShapes(ids)\n editor.setSelectedShapes(copies)\n }\n return\n }\n case \"c\":\n case \"x\": {\n const ids = editor.getSelectedShapeIds()\n if (!ids.length) return\n e.preventDefault()\n const content = editor.getContentFromCurrentPage(ids)\n if (content) {\n const text = JSON.stringify({ type: \"application/mocanvas\", ...content })\n navigator.clipboard?.writeText(text).catch(() => {})\n clipboardFallback = text\n }\n if (key === \"x\") {\n editor.markHistoryStoppingPoint(\"cut\")\n editor.deleteShapes(ids)\n }\n return\n }\n case \"v\": {\n e.preventDefault()\n const paste = (text: string) => {\n try {\n const data = JSON.parse(text) as { type?: string; shapes?: unknown[]; bindings?: unknown[] }\n if (data.type !== \"application/mocanvas\" || !Array.isArray(data.shapes)) return\n editor.markHistoryStoppingPoint(\"paste\")\n editor.putContentOntoCurrentPage(data as never, { point: editor.getViewportPageCenter() })\n } catch {\n // not our content\n }\n }\n if (navigator.clipboard?.readText) navigator.clipboard.readText().then(paste, () => clipboardFallback && paste(clipboardFallback))\n else if (clipboardFallback) paste(clipboardFallback)\n return\n }\n case \"=\":\n case \"+\":\n e.preventDefault()\n editor.zoomIn()\n return\n case \"-\":\n e.preventDefault()\n editor.zoomOut()\n return\n case \"0\":\n e.preventDefault()\n editor.resetZoom()\n return\n case \"1\":\n e.preventDefault()\n editor.zoomToFit()\n return\n case \"2\":\n e.preventDefault()\n editor.zoomToSelection()\n return\n case \"]\":\n e.preventDefault()\n if (e.altKey) editor.bringToFront()\n else editor.bringForward()\n return\n case \"[\":\n e.preventDefault()\n if (e.altKey) editor.sendToBack()\n else editor.sendBackward()\n return\n default:\n return\n }\n }\n if (e.altKey) {\n // ⌥D toggles the debug stats chip. On macOS Alt+D types \"∂\", so match the physical key too.\n if (e.code === \"KeyD\" || key === \"d\" || key === \"\\u2202\") {\n e.preventDefault()\n debugStatsOpen.set(!debugStatsOpen.get())\n }\n return\n }\n // Tool lock is not a tool switch: it stays bound either way.\n if (key === \"q\") {\n editor.updateInstanceState({ isToolLocked: !editor.getInstanceState().isToolLocked })\n return\n }\n if (!bindTools) return\n switch (key) {\n case \"v\":\n editor.setCurrentTool(\"select\")\n break\n case \"h\":\n editor.setCurrentTool(\"hand\")\n break\n case \"r\":\n editor.setCurrentTool(\"geo\", { geo: \"rectangle\" })\n break\n case \"o\":\n editor.setCurrentTool(\"geo\", { geo: \"ellipse\" })\n break\n case \"d\":\n case \"p\":\n case \"b\":\n editor.setCurrentTool(\"draw\")\n break\n case \"e\":\n editor.setCurrentTool(\"eraser\")\n break\n case \"n\":\n editor.setCurrentTool(\"note\")\n break\n case \"t\":\n editor.setCurrentTool(\"text\")\n break\n // arrow/line/frame are optional tools: apps may register a smaller set.\n case \"a\":\n if (editor.root.children?.[\"arrow\"]) editor.setCurrentTool(\"arrow\")\n break\n case \"l\":\n if (editor.root.children?.[\"line\"]) editor.setCurrentTool(\"line\")\n break\n case \"f\":\n if (editor.root.children?.[\"frame\"]) editor.setCurrentTool(\"frame\")\n break\n default:\n break\n }\n }\n window.addEventListener(\"keydown\", onKeyDown)\n return () => window.removeEventListener(\"keydown\", onKeyDown)\n }, [editor, bindTools])\n}\n","import {\n GeoShapeGeoStyle,\n MocanvasUiProvider,\n track,\n useEditor,\n useEditorComponents,\n useIsToolSelected,\n useTools,\n useValue,\n type Editor,\n type GeoShapeKind,\n type TLComponents,\n type TLComponentsResolved,\n type TLUiOverrides,\n} from \"@mocanvas/editor\"\nimport { Fragment, useEffect, useMemo, useRef, useState, type ReactNode, type Ref } from \"react\"\nimport { MocanvasUiMenuItem } from \"./DefaultToolbar\"\nimport { Icon, type IconName } from \"./icons\"\nimport { Popover, UiTooltip } from \"./overlays\"\nimport { StylePanel } from \"./StylePanel\"\nimport { MORE_GEO_KINDS, PRIMARY_GEO_KINDS, TOOLBAR_GROUPS, type ToolbarItem } from \"./toolbar-config\"\nimport { buildDefaultActionItems, buildDefaultToolItems, registeredToolIds } from \"./tools-context\"\nimport { ToolShortcuts } from \"./useToolShortcuts\"\nimport { debugStatsOpen } from \"./useKeyboardShortcuts\"\nimport \"./ui.css\"\n\n// The toolbar's contents moved to `toolbar-config` (data, no React) so the UI\n// tool list can be built without importing the components. Re-exported here so\n// the module that has always published them still does.\nexport { MORE_GEO_KINDS, PRIMARY_GEO_KINDS, TOOLBAR_GROUPS }\nexport type { ToolbarItem }\n\nconst IS_MAC = typeof navigator !== \"undefined\" && /Mac|iPhone|iPad|iPod/.test(navigator.platform || navigator.userAgent || \"\")\n/** Accelerator prefix for tooltips: `⌘` on Apple platforms, `Ctrl+` elsewhere. */\nexport const MOD_KEY = IS_MAC ? \"⌘\" : \"Ctrl+\"\n\nconst stopPointer = (e: { stopPropagation: () => void }) => e.stopPropagation()\n\nfunction titleCase(s: string): string {\n return s.replace(/-/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\n// ---------------------------------------------------------------------------\n// Shared button\n// ---------------------------------------------------------------------------\n\ninterface UiButtonProps {\n icon: IconName\n label: string\n shortcut?: string\n pressed?: boolean\n expanded?: boolean\n disabled?: boolean\n className?: string\n ref?: Ref<HTMLButtonElement>\n onClick: () => void\n}\n\nfunction UiButton({ icon, label, shortcut, pressed, expanded, disabled, className, ref, onClick }: UiButtonProps) {\n return (\n <button\n ref={ref}\n type=\"button\"\n className={className ? `mocanvas-btn ${className}` : \"mocanvas-btn\"}\n aria-label={label}\n data-tooltip={label}\n {...(shortcut ? { \"data-shortcut\": shortcut } : {})}\n {...(pressed === undefined ? {} : { \"aria-pressed\": pressed })}\n {...(expanded === undefined ? {} : { \"aria-expanded\": expanded })}\n {...(disabled ? { disabled: true } : {})}\n onClick={onClick}\n >\n <Icon name={icon} />\n </button>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Toolbar\n// ---------------------------------------------------------------------------\n\n/**\n * One toolbar button driven by the UI tool list. Renders nothing when the\n * item is not registered — the normal state for an optional tool on an editor\n * that was built without it.\n */\nfunction ToolItem({ id }: { id: string }) {\n const tools = useTools()\n const tool = tools[id]\n const isSelected = useIsToolSelected(tool)\n if (!tool) return null\n return <MocanvasUiMenuItem {...tool} isSelected={isSelected} />\n}\n\n/**\n * The default tool bar: the grouped tools, plus a popover holding the geo\n * kinds that have no button of their own.\n *\n * Built from the UI tool list, so an app's `TLUiOverrides.tools` — relabelling\n * a tool, rebinding its key, adding one of its own — shows up here without\n * replacing the component.\n */\nexport const Toolbar = track(function Toolbar() {\n const editor = useEditor()\n const tools = useTools()\n const [moreOpen, setMoreOpen] = useState(false)\n const moreRef = useRef<HTMLButtonElement>(null)\n\n const toolId = editor.getCurrentToolId()\n const geo = toolId === \"geo\" ? ((editor.getStateDescendant(\"geo\") as { geo?: GeoShapeKind } | undefined)?.geo ?? \"rectangle\") : null\n\n // Groups whose entries the tool list actually has; an app that trimmed the\n // tool set, or an override that removed an item, empties a group away.\n const groups = TOOLBAR_GROUPS.map((group) => group.filter((item) => tools[item.id] !== undefined)).filter((group) => group.length > 0)\n const hasGeo = registeredToolIds(editor).has(\"geo\") && MORE_GEO_KINDS.length > 0\n const moreActive = toolId === \"geo\" && geo !== null && !PRIMARY_GEO_KINDS.includes(geo)\n\n // Any item an override added that is not part of the default layout. It gets\n // a place rather than being silently dropped, which is what a custom tool\n // registered through `overrides.tools` needs to be usable at all.\n const known = new Set(TOOLBAR_GROUPS.flat().map((item) => item.id))\n const extras = Object.keys(tools).filter((id) => !known.has(id) && !MORE_GEO_KINDS.includes(id as GeoShapeKind))\n\n return (\n <div className=\"mocanvas-panel mocanvas-toolbar\" role=\"toolbar\" aria-label=\"Tools\" onPointerDown={stopPointer}>\n {groups.map((group, i) => (\n <Fragment key={group[0]!.id}>\n {i > 0 ? <span className=\"mocanvas-divider\" aria-hidden=\"true\" /> : null}\n {group.map((item) => (\n <ToolItem key={item.id} id={item.id} />\n ))}\n {hasGeo && group.some((item) => item.geo) ? (\n <span className=\"mocanvas-more\">\n <UiButton\n ref={moreRef}\n icon=\"chevron-down\"\n label=\"More shapes\"\n pressed={moreActive}\n expanded={moreOpen}\n onClick={() => setMoreOpen((v) => !v)}\n />\n <Popover anchorRef={moreRef} open={moreOpen} onClose={() => setMoreOpen(false)} label=\"More shapes\" prefer=\"above\">\n {MORE_GEO_KINDS.map((kind) => (\n <button\n key={kind}\n type=\"button\"\n role=\"menuitemradio\"\n className=\"mocanvas-btn\"\n aria-label={titleCase(kind)}\n aria-checked={geo === kind}\n data-tooltip={titleCase(kind)}\n onClick={() => {\n editor.setStyleForNextShapes(GeoShapeGeoStyle, kind)\n editor.setCurrentTool(\"geo\", { geo: kind, force: true })\n setMoreOpen(false)\n }}\n >\n <Icon name={`geo-${kind}`} />\n </button>\n ))}\n </Popover>\n </span>\n ) : null}\n </Fragment>\n ))}\n {extras.length > 0 ? (\n <>\n <span className=\"mocanvas-divider\" aria-hidden=\"true\" />\n {extras.map((id) => (\n <ToolItem key={id} id={id} />\n ))}\n </>\n ) : null}\n </div>\n )\n})\n\n// ---------------------------------------------------------------------------\n// Zoom bar\n// ---------------------------------------------------------------------------\n\n/** Zoom controls and undo/redo. */\nexport const ZoomBar = track(function ZoomBar() {\n const editor = useEditor()\n const zoom = Math.round(editor.getZoomLevel() * 100)\n return (\n <div className=\"mocanvas-panel mocanvas-zoombar\" role=\"toolbar\" aria-label=\"View\" onPointerDown={stopPointer}>\n <UiButton icon=\"zoom-out\" label=\"Zoom out\" shortcut={`${MOD_KEY}−`} onClick={() => editor.zoomOut()} />\n <button\n type=\"button\"\n className=\"mocanvas-btn mocanvas-btn--wide\"\n aria-label={`Reset zoom, currently ${zoom}%`}\n data-tooltip=\"Reset zoom\"\n data-shortcut={`${MOD_KEY}0`}\n onClick={() => editor.resetZoom()}\n >\n {zoom}%\n </button>\n <UiButton icon=\"zoom-in\" label=\"Zoom in\" shortcut={`${MOD_KEY}+`} onClick={() => editor.zoomIn()} />\n <UiButton icon=\"zoom-fit\" label=\"Zoom to fit\" shortcut={`${MOD_KEY}1`} onClick={() => editor.zoomToFit()} />\n <span className=\"mocanvas-divider\" aria-hidden=\"true\" />\n <UiButton icon=\"undo\" label=\"Undo\" shortcut={`${MOD_KEY}Z`} disabled={!editor.getCanUndo()} onClick={() => editor.undo()} />\n <UiButton icon=\"redo\" label=\"Redo\" shortcut={`${MOD_KEY}⇧Z`} disabled={!editor.getCanRedo()} onClick={() => editor.redo()} />\n </div>\n )\n})\n\n// ---------------------------------------------------------------------------\n// Debug stats\n// ---------------------------------------------------------------------------\n\n/** Compact frame-statistics chip. Toggled with ⌥D. */\nexport const DebugStats = track(function DebugStats() {\n const editor = useEditor()\n const stats = editor.getLastFrameStats()\n const count = editor.getCurrentPageShapeIds().size\n return (\n <div className=\"mocanvas-panel mocanvas-stats\" role=\"status\" aria-label=\"Frame statistics\" onPointerDown={stopPointer}>\n <span>\n <b>{count}</b> shapes · <b>{editor.engine.shapeCount}</b> engine\n </span>\n <span>\n <b>{stats.drawn}</b> drawn · <b>{stats.culled}</b> culled\n </span>\n <span>\n <b>{stats.ms.toFixed(2)}</b> ms/frame\n </span>\n </div>\n )\n})\n\n// ---------------------------------------------------------------------------\n// The chrome\n// ---------------------------------------------------------------------------\n\n/**\n * The chrome mocanvas renders when an app overrides nothing. Every entry is a\n * slot an app can replace or remove through `components`.\n */\nexport const defaultComponents: TLComponents = {\n Toolbar,\n NavigationPanel: ZoomBar,\n StylePanel,\n DebugPanel: DebugStats,\n Tooltip: UiTooltip,\n}\n\n/**\n * Feeds the `Grid` slot the camera it draws from, and mounts it only while the\n * editor is in grid mode.\n *\n * The subscription lives here rather than in the slot so the camera is read\n * once per frame no matter how many layers want it — and so a grid component\n * can be a pure function of its props, which is what makes it testable.\n */\nconst GridLayer = track(function GridLayer({ Grid }: { Grid: NonNullable<TLComponentsResolved[\"Grid\"]> }) {\n const editor = useEditor()\n if (!editor.getInstanceState().isGridMode) return null\n const camera = editor.getCamera()\n return <Grid x={camera.x} y={camera.y} z={camera.z} size={editor.getDocumentSettings().gridSize} />\n})\n\n/**\n * Reads the merged chrome map and lays the panels out.\n *\n * ## Why the canvas is rendered from here\n * The canvas is a slot like everything else, and it is rendered FIRST, because\n * some chrome has to *wrap* it: a right-click menu owns the DOM node the\n * browser fires `contextmenu` at, so it renders `useEditorComponents().Canvas`\n * inside its own trigger. When a `ContextMenu` slot is filled it therefore\n * takes over rendering the canvas and the bare `Canvas` slot is skipped —\n * rendering both would mount two canvases.\n *\n * `hidePanels` (mocanvas's `hideUi`) suppresses the panels below and nothing\n * else: an editor with no chrome still has a canvas, and an app that supplied\n * its own context menu still gets it.\n */\nfunction Chrome({ showStats, hidePanels }: { showStats: boolean; hidePanels: boolean }) {\n const c = useEditorComponents()\n const statsOpen = useValue(debugStatsOpen)\n useEffect(() => {\n debugStatsOpen.set(showStats)\n }, [showStats])\n const canvas = c.ContextMenu ? <c.ContextMenu /> : c.Canvas ? <c.Canvas /> : null\n if (hidePanels) return canvas\n return (\n <>\n {canvas}\n {c.Background ? <c.Background /> : null}\n {c.Grid ? <GridLayer Grid={c.Grid} /> : null}\n {c.OnTheCanvas ? <c.OnTheCanvas /> : null}\n {c.Toolbar ? <c.Toolbar /> : null}\n {c.NavigationPanel ? <c.NavigationPanel /> : null}\n {c.StylePanel ? <c.StylePanel /> : null}\n {c.MenuPanel ? <c.MenuPanel /> : null}\n {c.PageMenu ? <c.PageMenu /> : null}\n {c.ActionsMenu ? <c.ActionsMenu /> : null}\n {c.QuickActions ? <c.QuickActions /> : null}\n {c.HelperButtons ? <c.HelperButtons /> : null}\n {c.ImageToolbar ? <c.ImageToolbar /> : null}\n {c.VideoToolbar ? <c.VideoToolbar /> : null}\n {c.RichTextToolbar ? <c.RichTextToolbar /> : null}\n {c.SharePanel ? <c.SharePanel /> : null}\n {c.TopPanel ? <c.TopPanel /> : null}\n {/* Slots mocanvas ships no default for. They are rendered here so that\n filling one through `components` puts it on screen, rather than\n requiring the app to replace the whole chrome to place it. */}\n {c.MainMenu ? <c.MainMenu /> : null}\n {c.HelpMenu ? <c.HelpMenu /> : null}\n {c.Minimap ? <c.Minimap /> : null}\n {c.PeopleMenu ? <c.PeopleMenu /> : null}\n {c.UserPresenceEditor ? <c.UserPresenceEditor /> : null}\n {c.FollowingIndicator ? <c.FollowingIndicator /> : null}\n {c.CursorChatBubble ? <c.CursorChatBubble /> : null}\n {c.DebugMenu ? <c.DebugMenu /> : null}\n {statsOpen && c.DebugPanel ? <c.DebugPanel /> : null}\n {c.InFrontOfTheCanvas ? <c.InFrontOfTheCanvas /> : null}\n {c.Toasts ? <c.Toasts /> : null}\n {c.Dialogs ? <c.Dialogs /> : null}\n {c.A11y ? <c.A11y /> : null}\n {c.Tooltip ? <c.Tooltip /> : null}\n <ToolShortcuts />\n </>\n )\n}\n\nexport interface DefaultUiProps {\n editor: Editor\n /** Replace (`ComponentType`) or remove (`null`) a chrome slot. */\n components?: TLComponents\n /** Rewrite the tool and action lists the chrome renders from. */\n overrides?: TLUiOverrides\n showStats?: boolean\n /**\n * The canvas, which is published as the `Canvas` chrome slot and rendered\n * through it. Omit it (as tests of the chrome alone do) and the slot stays\n * empty; an app can still fill it itself.\n */\n canvas?: ReactNode\n /**\n * Render the canvas and the app's own slots, but none of mocanvas's panels.\n * `Mocanvas`'s `hideUi`.\n */\n hidePanels?: boolean\n /** Rendered inside the UI context, so it can use `useTools()` and friends. */\n children?: ReactNode\n}\n\n/**\n * mocanvas's chrome, and the context every part of it reads.\n *\n * Customisation goes through the two override maps rather than around them:\n * `components` swaps a panel out, `overrides` rewrites the tool and action\n * lists that the panels — mocanvas's own or the app's — render from. Both are\n * live for anything rendered inside, including a `components.Toolbar` of the\n * app's own, which is why a custom toolbar can call `useTools()` and get the\n * same list the default one would have used.\n */\nexport function DefaultUi({ editor, components, overrides, showStats = true, canvas, hidePanels = false, children }: DefaultUiProps) {\n // The canvas node becomes a component so it can live in the slot map, which\n // is what lets an app's context menu render it from inside its own trigger.\n // Memoised on the node: a fresh component identity every render would\n // remount the whole canvas, engine and all.\n const defaults = useMemo<TLComponents>(() => {\n if (canvas === undefined) return defaultComponents\n const CanvasSlot = () => <>{canvas}</>\n CanvasSlot.displayName = \"MocanvasCanvasSlot\"\n return { ...defaultComponents, Canvas: CanvasSlot }\n }, [canvas])\n\n return (\n <MocanvasUiProvider\n editor={editor}\n defaultComponents={defaults}\n defaultTools={buildDefaultToolItems}\n defaultActions={buildDefaultActionItems}\n {...(components ? { components } : {})}\n {...(overrides ? { overrides } : {})}\n >\n <Chrome showStats={showStats} hidePanels={hidePanels} />\n {children}\n </MocanvasUiProvider>\n )\n}\n","import { useContainerIfExists } from \"@mocanvas/editor\"\nimport { createContext, useContext, useEffect, useState, type ReactNode } from \"react\"\n\n/**\n * How much room the chrome has, as one number the panels branch on.\n *\n * Measured from the editor's container rather than the window, because an\n * editor embedded in a sidebar is narrow even on a wide screen — and a media\n * query cannot see that.\n */\n\n/**\n * The breakpoints, smallest first. A component compares against the named\n * constants rather than the raw numbers: `breakpoint < PORTRAIT_BREAKPOINT.TABLET_SM`.\n */\nexport const PORTRAIT_BREAKPOINT = {\n ZERO: 0,\n MOBILE_XXS: 1,\n MOBILE_XS: 2,\n MOBILE_SM: 3,\n MOBILE: 4,\n TABLET_SM: 5,\n TABLET: 6,\n DESKTOP: 7,\n} as const\n\n/** One of the {@link PORTRAIT_BREAKPOINT} values. */\nexport type TLUiBreakpoint = (typeof PORTRAIT_BREAKPOINT)[keyof typeof PORTRAIT_BREAKPOINT]\n\n/** The container widths, in CSS px, at which each breakpoint starts. */\nconst BREAKPOINT_WIDTHS: readonly number[] = [0, 390, 428, 468, 580, 640, 840, 1024]\n\n/** The breakpoint a container of `width` CSS px is in. */\nexport function getBreakpointForWidth(width: number): TLUiBreakpoint {\n let result: number = PORTRAIT_BREAKPOINT.ZERO\n for (let i = 0; i < BREAKPOINT_WIDTHS.length; i++) {\n if (width >= (BREAKPOINT_WIDTHS[i] as number)) result = i\n }\n return result as TLUiBreakpoint\n}\n\nconst BreakpointContext = createContext<TLUiBreakpoint>(PORTRAIT_BREAKPOINT.DESKTOP)\n\nexport interface BreakPointProviderProps {\n /** Pin the breakpoint to the smallest one, whatever the container measures. */\n forceMobile?: boolean\n children?: ReactNode\n}\n\n/**\n * Measures the editor's container and publishes its breakpoint.\n *\n * Starts at `DESKTOP` and narrows once measured: chrome that starts full and\n * settles narrower reads as a layout, while chrome that starts collapsed and\n * expands reads as a glitch.\n */\nexport function BreakPointProvider({ forceMobile = false, children }: BreakPointProviderProps) {\n const container = useContainerIfExists()\n const [breakpoint, setBreakpoint] = useState<TLUiBreakpoint>(PORTRAIT_BREAKPOINT.DESKTOP)\n\n useEffect(() => {\n if (!container || typeof ResizeObserver === \"undefined\") return\n const update = () => setBreakpoint(getBreakpointForWidth(container.getBoundingClientRect().width))\n update()\n const ro = new ResizeObserver(update)\n ro.observe(container)\n return () => ro.disconnect()\n }, [container])\n\n const value = forceMobile ? PORTRAIT_BREAKPOINT.MOBILE_XXS : breakpoint\n return <BreakpointContext.Provider value={value}>{children}</BreakpointContext.Provider>\n}\n\n/** The current breakpoint. `DESKTOP` outside a provider. */\nexport function useBreakpoint(): TLUiBreakpoint {\n return useContext(BreakpointContext)\n}\n","import { createContext, useContext, type ReactNode } from \"react\"\n\n/**\n * Which way a container of controls runs.\n *\n * A toolbar, a menu and a picker row all need to know this for the same two\n * reasons: which arrow keys move the roving focus, and which CSS axis the\n * children lay out along. Publishing it as context rather than passing a prop\n * lets a button work out its own keyboard behaviour without its parent having\n * to thread the answer through every wrapper in between.\n */\n\nexport interface TldrawUiOrientationContext {\n orientation: \"horizontal\" | \"vertical\"\n /** Writing direction, which flips what \"next\" means on a horizontal axis. */\n dir: \"ltr\" | \"rtl\"\n}\n\nconst OrientationContext = createContext<TldrawUiOrientationContext>({ orientation: \"horizontal\", dir: \"ltr\" })\n\nexport interface TldrawUiOrientationProviderProps extends Partial<TldrawUiOrientationContext> {\n children?: ReactNode\n}\n\n/** Publishes an orientation to everything inside it. */\nexport function TldrawUiOrientationProvider({ orientation = \"horizontal\", dir = \"ltr\", children }: TldrawUiOrientationProviderProps) {\n return <OrientationContext.Provider value={{ orientation, dir }}>{children}</OrientationContext.Provider>\n}\n\n/**\n * The current orientation, plus the two keys that move focus along it.\n *\n * `prevKey`/`nextKey` are already direction-corrected, so a roving-focus\n * handler can compare `event.key` against them without knowing whether it is\n * in a right-to-left locale.\n */\nexport function useTldrawUiOrientation(): TldrawUiOrientationContext & { prevKey: string; nextKey: string } {\n const value = useContext(OrientationContext)\n if (value.orientation === \"vertical\") return { ...value, prevKey: \"ArrowUp\", nextKey: \"ArrowDown\" }\n const rtl = value.dir === \"rtl\"\n return { ...value, prevKey: rtl ? \"ArrowRight\" : \"ArrowLeft\", nextKey: rtl ? \"ArrowLeft\" : \"ArrowRight\" }\n}\n","import { useEditor, useValue } from \"@mocanvas/editor\"\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\"\n\n/**\n * The editor's live region: how the canvas tells a screen reader what just\n * happened.\n *\n * A canvas is opaque to assistive technology — there is no DOM to read for\n * \"three shapes selected\" or \"moved to the front\". The announcer is the one\n * place that gap is closed, and every panel that changes the document\n * announces through it rather than growing an `aria-live` region of its own,\n * because two live regions read over each other.\n */\n\n/** How urgently an announcement interrupts. */\nexport type A11yPriority = \"polite\" | \"assertive\"\n\n/** One thing to say. */\nexport interface TLUiA11y {\n msg: string\n priority?: A11yPriority\n}\n\n/** What {@link useA11y} hands back. */\nexport interface TLUiA11yContextType {\n /** Queue an announcement. Repeating the same text still re-announces it. */\n announce(value: TLUiA11y): void\n /** The most recent announcement, or `null` before the first one. */\n currentMsg: TLUiA11y | null\n}\n\nconst A11yContext = createContext<TLUiA11yContextType | null>(null)\n\nconst NOOP: TLUiA11yContextType = { announce: () => {}, currentMsg: null }\n\nexport interface A11yProviderProps {\n children?: ReactNode\n}\n\n/** Holds the announcement queue. Render {@link DefaultA11yAnnouncer} inside it. */\nexport function TldrawUiA11yProvider({ children }: A11yProviderProps) {\n const [currentMsg, setCurrentMsg] = useState<TLUiA11y | null>(null)\n // A screen reader only reads a live region when its *text* changes, so the\n // same announcement twice in a row would be silent. The counter is appended\n // as an invisible suffix to force a change.\n const seq = useRef(0)\n const announce = useCallback((value: TLUiA11y) => {\n seq.current += 1\n setCurrentMsg({ ...value, msg: seq.current % 2 === 0 ? `${value.msg}​` : value.msg })\n }, [])\n const value = useMemo<TLUiA11yContextType>(() => ({ announce, currentMsg }), [announce, currentMsg])\n return <A11yContext.Provider value={value}>{children}</A11yContext.Provider>\n}\n\n/**\n * The announcer. Outside a provider this is inert rather than an error, so a\n * panel that announces can still be rendered on its own.\n */\nexport function useA11y(): TLUiA11yContextType {\n return useContext(A11yContext) ?? NOOP\n}\n\n/**\n * The live region itself: two of them, one per priority, because a region's\n * politeness cannot change after it is announced into.\n *\n * Visually hidden with the clip-rect idiom rather than `display: none`, which\n * would take it out of the accessibility tree along with the layout.\n */\nexport function DefaultA11yAnnouncer() {\n const { currentMsg } = useA11y()\n const priority = currentMsg?.priority ?? \"polite\"\n const hidden = {\n position: \"absolute\" as const,\n width: 1,\n height: 1,\n margin: -1,\n padding: 0,\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n whiteSpace: \"nowrap\" as const,\n border: 0,\n }\n return (\n <>\n <div className=\"mocanvas-a11y-announcer\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" style={hidden}>\n {priority === \"polite\" ? currentMsg?.msg : \"\"}\n </div>\n <div className=\"mocanvas-a11y-announcer\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\" style={hidden}>\n {priority === \"assertive\" ? currentMsg?.msg : \"\"}\n </div>\n </>\n )\n}\n\n/**\n * Announce the selection whenever it changes.\n *\n * Says how many shapes are selected and, for a single shape, what kind it is —\n * which is the minimum a keyboard user needs to know that their last keystroke\n * did what they meant.\n */\nexport function useSelectedShapesAnnouncer(): void {\n const editor = useEditor()\n const { announce } = useA11y()\n const summary = useValue(\n \"selection summary\",\n () => {\n const shapes = editor.getSelectedShapes()\n if (shapes.length === 0) return \"\"\n if (shapes.length === 1) return `${shapes[0]!.type} selected`\n return `${shapes.length} shapes selected`\n },\n [editor],\n )\n useEffect(() => {\n if (summary) announce({ msg: summary, priority: \"polite\" })\n // `announce` is stable; re-announcing on every render would be noise.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [summary])\n}\n\n/**\n * Whether the user has asked for reduced motion, following both the OS setting\n * and the editor's own `animationSpeed` preference (which `0` disables\n * animation with).\n */\nexport function usePrefersReducedMotion(): boolean {\n const [os, setOs] = useState(false)\n useEffect(() => {\n if (typeof window === \"undefined\" || !window.matchMedia) return\n const mq = window.matchMedia(\"(prefers-reduced-motion: reduce)\")\n const update = () => setOs(mq.matches)\n update()\n mq.addEventListener(\"change\", update)\n return () => mq.removeEventListener(\"change\", update)\n }, [])\n return os\n}\n","import { createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode } from \"react\"\n\n/**\n * Transient messages: \"copied\", \"could not import that file\".\n *\n * Owned by a provider rather than by whichever panel raised one, because a\n * toast has to outlive the menu the user raised it from — the menu closes on\n * the same click.\n */\n\n/** A button on a toast. */\nexport interface TLUiToastAction {\n type: \"primary\" | \"secondary\" | \"warn\" | \"danger\"\n label: string\n onClick(): void\n}\n\n/** One message. `id` is assigned by {@link TLUiToastsContextType.addToast}. */\nexport interface TLUiToast {\n id: string\n icon?: string\n severity?: \"success\" | \"info\" | \"warning\" | \"error\"\n title?: string\n description?: string\n actions?: TLUiToastAction[]\n /** Milliseconds before it removes itself. `0` keeps it until dismissed. */\n keepOpen?: boolean\n closeLabel?: string\n}\n\nexport interface TLUiToastsContextType {\n addToast(toast: Omit<TLUiToast, \"id\"> & { id?: string }): string\n removeToast(id: string): void\n clearToasts(): void\n toasts: TLUiToast[]\n}\n\nconst ToastsContext = createContext<TLUiToastsContextType | null>(null)\n\nconst NOOP: TLUiToastsContextType = { addToast: () => \"\", removeToast: () => {}, clearToasts: () => {}, toasts: [] }\n\nexport interface TLUiToastsProviderProps {\n children?: ReactNode\n}\n\nlet nextToastId = 0\n\n/** Holds the toast list. Render {@link DefaultToasts} inside it. */\nexport function TldrawUiToastsProvider({ children }: TLUiToastsProviderProps) {\n const [toasts, setToasts] = useState<TLUiToast[]>([])\n\n const removeToast = useCallback((id: string) => {\n setToasts((current) => current.filter((toast) => toast.id !== id))\n }, [])\n\n const addToast = useCallback((toast: Omit<TLUiToast, \"id\"> & { id?: string }) => {\n const id = toast.id ?? `toast:${nextToastId++}`\n setToasts((current) => [...current.filter((t) => t.id !== id), { ...toast, id }])\n return id\n }, [])\n\n const clearToasts = useCallback(() => setToasts([]), [])\n\n const value = useMemo<TLUiToastsContextType>(\n () => ({ addToast, removeToast, clearToasts, toasts }),\n [addToast, removeToast, clearToasts, toasts],\n )\n return <ToastsContext.Provider value={value}>{children}</ToastsContext.Provider>\n}\n\n/** The toast list. Inert outside a provider. */\nexport function useToasts(): TLUiToastsContextType {\n return useContext(ToastsContext) ?? NOOP\n}\n\n/** How long a toast that did not ask to stay open lives for. */\nconst TOAST_LIFETIME_MS = 5000\n\nfunction Toast({ toast, onClose }: { toast: TLUiToast; onClose: () => void }) {\n useEffect(() => {\n if (toast.keepOpen) return\n const timer = setTimeout(onClose, TOAST_LIFETIME_MS)\n return () => clearTimeout(timer)\n }, [toast.keepOpen, onClose])\n\n return (\n <div className=\"mocanvas-toast mocanvas-panel\" role=\"alert\" data-severity={toast.severity ?? \"info\"}>\n <div className=\"mocanvas-toast-body\">\n {toast.title ? <strong className=\"mocanvas-toast-title\">{toast.title}</strong> : null}\n {toast.description ? <span className=\"mocanvas-toast-desc\">{toast.description}</span> : null}\n </div>\n {toast.actions?.length ? (\n <div className=\"mocanvas-toast-actions\">\n {toast.actions.map((action) => (\n <button key={action.label} type=\"button\" className=\"mocanvas-btn mocanvas-btn--wide\" data-type={action.type} onClick={action.onClick}>\n {action.label}\n </button>\n ))}\n </div>\n ) : null}\n <button type=\"button\" className=\"mocanvas-btn\" aria-label={toast.closeLabel ?? \"Dismiss\"} onClick={onClose}>\n ×\n </button>\n </div>\n )\n}\n\n/**\n * The toast stack.\n *\n * A `role=\"log\"` region rather than a live region: each toast is itself an\n * alert, and nesting a live region inside another makes screen readers read\n * the whole stack every time one arrives.\n */\nexport function DefaultToasts() {\n const { toasts, removeToast } = useToasts()\n if (toasts.length === 0) return null\n return (\n <div className=\"mocanvas-toasts\" role=\"log\" aria-label=\"Notifications\">\n {toasts.map((toast) => (\n <Toast key={toast.id} toast={toast} onClose={() => removeToast(toast.id)} />\n ))}\n </div>\n )\n}\n\n/**\n * How loud a message is.\n *\n * Shared by toasts and by any inline alert an app builds on the same\n * vocabulary, which is why it is named for the severity rather than for the\n * toast: the four levels are a UI concept, not a property of one component.\n */\nexport type AlertSeverity = NonNullable<TLUiToast[\"severity\"]>\n","import type { TLUiComponentSlot } from \"@mocanvas/editor\"\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\"\n\n/**\n * The UI half of the chrome override map.\n *\n * `TLComponents` (in the editor package) covers everything, including the\n * canvas layers. This is the strictly-UI subset: the panels and menus that\n * only exist once there is chrome at all. An app hands one object; the two\n * maps are separated so the editor package can define its own slots without\n * depending on the UI package's.\n *\n * Every slot is optional. `undefined` keeps the default, `null` removes it.\n */\nexport interface TLUiComponents {\n /** The live region the canvas announces through. */\n A11y?: TLUiComponentSlot\n /** The selection actions menu. */\n ActionsMenu?: TLUiComponentSlot<TLUiActionsMenuProps>\n /** The right-click menu. Wraps the canvas, since it owns the trigger. */\n ContextMenu?: TLUiComponentSlot<TLUiContextMenuProps>\n /** The follow-me chat bubble on the local cursor. */\n CursorChatBubble?: TLUiComponentSlot\n /** The debug menu. */\n DebugMenu?: TLUiComponentSlot<TLUiDebugMenuProps>\n /** The frame-statistics chip. */\n DebugPanel?: TLUiComponentSlot\n /** The dialog stack. */\n Dialogs?: TLUiComponentSlot\n /** The banner shown while following another user's camera. */\n FollowingIndicator?: TLUiComponentSlot\n /** The small buttons above the toolbar. */\n HelperButtons?: TLUiComponentSlot<TLUiHelperButtonsProps>\n /** The help menu. */\n HelpMenu?: TLUiComponentSlot<TLUiHelpMenuProps>\n /** The contextual bar over a selected image. */\n ImageToolbar?: TLUiComponentSlot<TLUiImageToolbarProps>\n /** The shortcuts dialog. */\n KeyboardShortcutsDialog?: TLUiComponentSlot<TLUiKeyboardShortcutsDialogProps>\n /** The top-left menu. */\n MainMenu?: TLUiComponentSlot<TLUiMainMenuProps>\n /** The plate the main menu and page menu sit on. */\n MenuPanel?: TLUiComponentSlot\n /** The minimap inside the navigation panel. */\n Minimap?: TLUiComponentSlot\n /** The zoom / minimap cluster. */\n NavigationPanel?: TLUiComponentSlot\n /** The page picker. */\n PageMenu?: TLUiComponentSlot\n /** The collaborator list. */\n PeopleMenu?: TLUiComponentSlot<DefaultPeopleMenuProps>\n /** One collaborator's avatar. */\n PeopleMenuAvatar?: TLUiComponentSlot<TLUiPeopleMenuAvatarProps>\n /** The stacked avatars on the people menu's trigger. */\n PeopleMenuFacePile?: TLUiComponentSlot<TLUiPeopleMenuFacePileProps>\n /** One row in the collaborator list. */\n PeopleMenuItem?: TLUiComponentSlot<TLUiPeopleMenuItemProps>\n /** The undo/redo/duplicate row. */\n QuickActions?: TLUiComponentSlot<TLUiQuickActionsProps>\n /** The formatting bar over a text shape being edited. */\n RichTextToolbar?: TLUiComponentSlot<TLUiRichTextToolbarProps>\n /** The top-right panel. */\n SharePanel?: TLUiComponentSlot\n /** The style panel. */\n StylePanel?: TLUiComponentSlot<TLUiStylePanelProps>\n /** The toast stack. */\n Toasts?: TLUiComponentSlot\n /** The tool bar. */\n Toolbar?: TLUiComponentSlot\n /** The strip above the menu panel. */\n TopPanel?: TLUiComponentSlot\n /** The local person's name and colour editor. */\n UserPresenceEditor?: TLUiComponentSlot\n /** The contextual bar over a selected video. */\n VideoToolbar?: TLUiComponentSlot<TLUiVideoToolbarProps>\n /** The zoom menu. */\n ZoomMenu?: TLUiComponentSlot<TLUiZoomMenuProps>\n}\n\n/**\n * The props each panel slot is rendered with.\n *\n * All of them take `children` and nothing else required: a panel reads the\n * editor and the UI lists from context, so a replacement can be written\n * without accepting a wiring prop it would only pass on. `children` is how the\n * `*Content` half is swapped without replacing the panel's frame — the pattern\n * every default panel below is built on.\n */\nexport interface TLUiMainMenuProps {\n children?: ReactNode\n}\nexport interface TLUiActionsMenuProps {\n children?: ReactNode\n}\nexport interface TLUiContextMenuProps {\n /** The canvas, which the menu has to wrap in order to own the trigger. */\n children?: ReactNode\n /** Disable the menu without removing the canvas it wraps. */\n disabled?: boolean\n}\nexport interface TLUiDebugMenuProps {\n children?: ReactNode\n}\nexport interface TLUiHelpMenuProps {\n children?: ReactNode\n}\nexport interface TLUiHelperButtonsProps {\n children?: ReactNode\n}\nexport interface TLUiKeyboardShortcutsDialogProps {\n children?: ReactNode\n}\nexport interface TLUiQuickActionsProps {\n children?: ReactNode\n}\nexport interface TLUiStylePanelProps {\n /** Render the panel in its compact, popover form. */\n isMobile?: boolean\n children?: ReactNode\n}\nexport interface TLUiZoomMenuProps {\n children?: ReactNode\n}\nexport interface TLUiImageToolbarProps {\n children?: ReactNode\n}\nexport interface TLUiVideoToolbarProps {\n children?: ReactNode\n}\nexport interface TLUiRichTextToolbarProps {\n children?: ReactNode\n}\nexport interface DefaultPeopleMenuProps {\n children?: ReactNode\n}\nexport interface DefaultPeopleMenuContentProps {\n children?: ReactNode\n}\nexport interface TLUiPeopleMenuAvatarProps {\n color: string\n name: string\n /** Diameter in px. */\n size?: number\n}\nexport interface TLUiPeopleMenuItemProps {\n userId: string\n color: string\n name: string\n /** Whether the local user's camera is following this person. */\n isFollowing?: boolean\n onFollow?(): void\n}\nexport interface TLUiPeopleMenuFacePileProps {\n users: readonly { userId: string; color: string; name: string }[]\n /** How many avatars to draw before collapsing the rest into a count. */\n max?: number\n}\n\n/** The UI chrome map after defaults and overrides: every slot present. */\nexport type TLUiComponentsResolved = { [K in keyof TLUiComponents]-?: NonNullable<TLUiComponents[K]> | null }\n\nconst ComponentsContext = createContext<TLUiComponents>({})\n\nexport interface TLUiComponentsProviderProps {\n /** The app's overrides. */\n overrides?: TLUiComponents\n children?: ReactNode\n}\n\n/**\n * Publishes the UI chrome map.\n *\n * Nested providers merge rather than replace, so a host can wrap a subtree —\n * a read-only preview inside an editing app — and override two slots without\n * restating the other twenty-nine.\n */\nexport function TldrawUiComponentsProvider({ overrides, children }: TLUiComponentsProviderProps) {\n const outer = useContext(ComponentsContext)\n const value = useMemo<TLUiComponents>(() => {\n if (!overrides) return outer\n const merged: Record<string, unknown> = { ...outer }\n for (const [key, slot] of Object.entries(overrides)) {\n if (slot === undefined) continue\n merged[key] = slot\n }\n return merged as TLUiComponents\n }, [outer, overrides])\n return <ComponentsContext.Provider value={value}>{children}</ComponentsContext.Provider>\n}\n\n/**\n * The UI chrome map.\n *\n * A slot is `undefined` when nothing has filled it and `null` when it has been\n * removed; both mean \"render nothing\", which is why callers write\n * `{Comp ? <Comp /> : null}` rather than branching on the two separately.\n */\nexport function useTldrawUiComponents(): TLUiComponents {\n return useContext(ComponentsContext)\n}\n","import { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from \"react\"\nimport { UiTooltip } from \"./overlays\"\n\n/**\n * Tooltips, as a wrapper rather than a delegated layer.\n *\n * {@link UiTooltip} already labels anything carrying `data-tooltip` by\n * delegation, and remains what the default chrome uses. This pair exists for\n * the other case: a control that is not a plain button — a slider thumb, a\n * swatch inside a portal — where the caller wants to say explicitly what the\n * tip belongs to.\n */\n\ninterface TooltipContextValue {\n /** Suppress every tooltip, e.g. while a menu is open. */\n suppressed: boolean\n setSuppressed(value: boolean): void\n}\n\nconst TooltipContext = createContext<TooltipContextValue | null>(null)\n\nexport interface TldrawUiTooltipProviderProps {\n /** Delay before a tip appears, in ms. */\n delayDuration?: number\n children?: ReactNode\n}\n\n/**\n * Hosts the shared tooltip layer.\n *\n * One layer for the whole editor: two tooltips on screen at once is always a\n * bug, and a per-control layer makes it easy to have one.\n */\nexport function TldrawUiTooltipProvider({ children }: TldrawUiTooltipProviderProps) {\n const [suppressed, setSuppressed] = useState(false)\n const value = useMemo<TooltipContextValue>(() => ({ suppressed, setSuppressed }), [suppressed])\n return (\n <TooltipContext.Provider value={value}>\n {children}\n {suppressed ? null : <UiTooltip />}\n </TooltipContext.Provider>\n )\n}\n\nexport interface TldrawUiTooltipProps {\n /** The tip's text. No tip is shown when this is empty. */\n content?: string\n /** A shortcut shown beside the text. */\n kbd?: string\n side?: \"top\" | \"bottom\" | \"left\" | \"right\"\n disabled?: boolean\n children?: ReactNode\n}\n\n/**\n * Attaches a tooltip to its child.\n *\n * Renders a wrapper carrying the `data-tooltip` attributes the shared layer\n * looks for, so the child stays exactly the element the caller wrote.\n */\nexport function TldrawUiTooltip({ content, kbd, disabled, children }: TldrawUiTooltipProps) {\n if (!content || disabled) return <>{children}</>\n return (\n <span className=\"mocanvas-tooltip-anchor\" style={{ display: \"contents\" }} data-tooltip={content} {...(kbd ? { \"data-shortcut\": kbd } : {})}>\n {children}\n </span>\n )\n}\n\n/**\n * Dismiss whatever tooltip is on screen.\n *\n * Needed at the moments a pointer-out never arrives: a menu opening over the\n * button that was hovered, or a shortcut that changes the layout under the\n * pointer. Dispatches the same event the shared layer already listens for,\n * so it works whether or not a provider is mounted.\n */\nexport function hideAllTooltips(): void {\n if (typeof document === \"undefined\") return\n document.dispatchEvent(new PointerEvent(\"pointerdown\", { bubbles: true }))\n}\n\n/** Suppress tooltips for as long as the caller says. */\nexport function useTooltipSuppression(): (suppressed: boolean) => void {\n const ctx = useContext(TooltipContext)\n return useCallback(\n (suppressed: boolean) => {\n ctx?.setSuppressed(suppressed)\n },\n [ctx],\n )\n}\n","import { useEditor, type TLUiOverrides, type TLUiTranslations } from \"@mocanvas/editor\"\nimport { useMemo, type ReactNode } from \"react\"\nimport { BreakPointProvider } from \"./ui-breakpoint\"\nimport { TldrawUiA11yProvider, useA11y } from \"./ui-a11y\"\nimport { TldrawUiComponentsProvider, type TLUiComponents } from \"./ui-components\"\nimport { TldrawUiDialogsProvider, useDialogs } from \"./ui-dialogs\"\nimport { TldrawUiEventsProvider, type TLUiEventHandler } from \"./ui-events\"\nimport { TldrawUiToastsProvider, useToasts } from \"./ui-toasts\"\nimport { TldrawUiTooltipProvider } from \"./ui-tooltip\"\nimport { TldrawUiTranslationProvider, useTranslation } from \"./ui-translation\"\n\n/**\n * One provider that mounts every UI context in the right order.\n *\n * The order is not arbitrary: translations read the editor's locale, the\n * announcer and the toasts are rendered by components that read the\n * breakpoint, and the tooltip layer must be inside the container provider so\n * it portals into the editor rather than the page. Getting this wrong produces\n * failures that only show up in an embedded editor, so it is written down once\n * here instead of at every call site.\n */\nexport interface TLUiContextProviderProps {\n /** Reported UI events. */\n onUiEvent?: TLUiEventHandler\n /** The UI chrome map. */\n components?: TLUiComponents\n /** Extra UI strings, keyed by locale then id. */\n overrides?: TLUiOverrides\n /** Pin the layout to its narrowest form. */\n forceMobile?: boolean\n children?: ReactNode\n}\n\n/** Mounts the UI contexts. Render inside an editor provider. */\nexport function TldrawUiContextProvider({ onUiEvent, components, overrides, forceMobile, children }: TLUiContextProviderProps) {\n const translations: TLUiTranslations | undefined = overrides?.translations\n return (\n <TldrawUiEventsProvider {...(onUiEvent ? { onEvent: onUiEvent } : {})}>\n <TldrawUiTranslationProvider {...(translations ? { overrides: translations } : {})}>\n <BreakPointProvider {...(forceMobile ? { forceMobile } : {})}>\n <TldrawUiA11yProvider>\n <TldrawUiToastsProvider>\n <TldrawUiDialogsProvider>\n <TldrawUiComponentsProvider {...(components ? { overrides: components } : {})}>\n <TldrawUiTooltipProvider>{children}</TldrawUiTooltipProvider>\n </TldrawUiComponentsProvider>\n </TldrawUiDialogsProvider>\n </TldrawUiToastsProvider>\n </TldrawUiA11yProvider>\n </BreakPointProvider>\n </TldrawUiTranslationProvider>\n </TldrawUiEventsProvider>\n )\n}\n\n/**\n * Everything a menu item's `onSelect` normally reaches for, in one object.\n *\n * A menu item that wants to raise a toast, open a dialog, announce something\n * or resolve a string would otherwise call four hooks — and could not, because\n * an item is data rather than a component. Bundling them is what lets an\n * action be defined as a plain function that takes these.\n */\nexport function useDefaultHelpers() {\n const editor = useEditor()\n const { addToast, removeToast, clearToasts } = useToasts()\n const { addDialog, removeDialog, clearDialogs } = useDialogs()\n const { announce } = useA11y()\n const msg = useTranslation()\n\n return useMemo(\n () => ({\n addToast,\n removeToast,\n clearToasts,\n addDialog,\n removeDialog,\n clearDialogs,\n announce,\n msg,\n /** Open the editor's file picker and drop what is chosen onto the page. */\n insertMedia: () => {\n const doc = editor.getContainerDocument()\n if (!doc) return\n const input = doc.createElement(\"input\")\n input.type = \"file\"\n input.multiple = true\n input.accept = \"image/*,video/*\"\n input.style.display = \"none\"\n input.addEventListener(\"change\", () => {\n const files = Array.from(input.files ?? [])\n input.remove()\n if (files.length === 0) return\n void editor.putExternalContent({ type: \"files\", files, point: editor.getViewportPageCenter() })\n })\n doc.body.appendChild(input)\n input.click()\n },\n }),\n [editor, addToast, removeToast, clearToasts, addDialog, removeDialog, clearDialogs, announce, msg],\n )\n}\n\n/** What {@link useDefaultHelpers} hands back. */\nexport type TLUiDefaultHelpers = ReturnType<typeof useDefaultHelpers>\n","import { useEditor, useValue, type TLUiActionsContextType, type TLUiToolsContextType } from \"@mocanvas/editor\"\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\"\n\n/**\n * Standalone providers for the tool and action lists.\n *\n * `MocanvasUiProvider` already builds and publishes both, and is what\n * `TldrawUi` uses. These two exist for the case it does not cover: publishing\n * a *different* list to one subtree — a read-only preview inside an editing\n * app, or a second toolbar driven by a curated subset — without a second\n * editor context.\n *\n * A subtree with neither provider falls through to whatever\n * `MocanvasUiProvider` published, so wrapping is additive.\n */\n\nconst ToolsOverrideContext = createContext<TLUiToolsContextType | null>(null)\nconst ActionsOverrideContext = createContext<TLUiActionsContextType | null>(null)\n\nexport interface TLUiToolsProviderProps {\n /** The list to publish, or a function that rewrites the inherited one. */\n tools: TLUiToolsContextType | ((inherited: TLUiToolsContextType) => TLUiToolsContextType)\n children?: ReactNode\n}\n\n/** Publishes a tool list to its subtree. */\nexport function TldrawUiToolsProvider({ tools, children }: TLUiToolsProviderProps) {\n const inherited = useContext(ToolsOverrideContext) ?? {}\n const value = useMemo(() => (typeof tools === \"function\" ? tools(inherited) : tools), [tools, inherited])\n return <ToolsOverrideContext.Provider value={value}>{children}</ToolsOverrideContext.Provider>\n}\n\nexport interface ActionsProviderProps {\n /** The list to publish, or a function that rewrites the inherited one. */\n actions: TLUiActionsContextType | ((inherited: TLUiActionsContextType) => TLUiActionsContextType)\n children?: ReactNode\n}\n\n/** Publishes an action list to its subtree. */\nexport function TldrawUiActionsProvider({ actions, children }: ActionsProviderProps) {\n const inherited = useContext(ActionsOverrideContext) ?? {}\n const value = useMemo(() => (typeof actions === \"function\" ? actions(inherited) : actions), [actions, inherited])\n return <ActionsOverrideContext.Provider value={value}>{children}</ActionsOverrideContext.Provider>\n}\n\n/** The tool list published by the nearest {@link TldrawUiToolsProvider}, if any. */\nexport function useToolsOverride(): TLUiToolsContextType | null {\n return useContext(ToolsOverrideContext)\n}\n\n/** The action list published by the nearest {@link TldrawUiActionsProvider}, if any. */\nexport function useActionsOverride(): TLUiActionsContextType | null {\n return useContext(ActionsOverrideContext)\n}\n\n/**\n * Whether the editor is in a state where the UI lists are worth reading at\n * all — an editor that has been disposed still renders, but nothing it lists\n * can be acted on.\n */\nexport function useUiListsAreLive(): boolean {\n const editor = useEditor()\n return useValue(\"uiListsAreLive\", () => !editor.getIsDisposed(), [editor])\n}\n","import { useEffect, useRef, useState, type CSSProperties, type Ref } from \"react\"\nimport { TldrawUiIcon } from \"./ui-icon\"\n\n/**\n * The text field the chrome uses: a page name, a link, a numeric style value.\n *\n * Uncontrolled in the React sense — it keeps its own draft and reports it —\n * because the values it edits are committed to the document, and committing\n * every keystroke would fill the undo stack with one entry per letter. The\n * three callbacks are the seam for that: `onValueChange` while typing,\n * `onComplete` on Enter or blur, `onCancel` on Escape.\n */\nexport interface TLUiInputProps {\n /** The value to start from. Changing it replaces the draft. */\n value?: string\n defaultValue?: string\n placeholder?: string\n label?: string\n icon?: string\n disabled?: boolean\n autoFocus?: boolean\n /** Select the whole value when it takes focus. */\n autoSelect?: boolean\n className?: string\n style?: CSSProperties\n id?: string\n ref?: Ref<HTMLInputElement>\n onValueChange?(value: string): void\n /** Enter, or losing focus: the value is final. */\n onComplete?(value: string): void\n /** Escape: put the original value back. */\n onCancel?(value: string): void\n onFocus?(): void\n onBlur?(): void\n}\n\n/** A labelled text input that commits on Enter and reverts on Escape. */\nexport function TldrawUiInput({\n value,\n defaultValue,\n placeholder,\n label,\n icon,\n disabled,\n autoFocus,\n autoSelect,\n className,\n style,\n id,\n ref,\n onValueChange,\n onComplete,\n onCancel,\n onFocus,\n onBlur,\n}: TLUiInputProps) {\n const [draft, setDraft] = useState(value ?? defaultValue ?? \"\")\n const committed = useRef(draft)\n\n useEffect(() => {\n if (value === undefined) return\n setDraft(value)\n committed.current = value\n }, [value])\n\n return (\n <div className={[\"mocanvas-input\", className].filter(Boolean).join(\" \")} style={style}>\n {icon ? <TldrawUiIcon icon={icon} small /> : null}\n <input\n ref={ref}\n id={id}\n type=\"text\"\n value={draft}\n placeholder={placeholder}\n disabled={disabled}\n autoFocus={autoFocus}\n {...(label ? { \"aria-label\": label } : {})}\n onFocus={(event) => {\n if (autoSelect) event.currentTarget.select()\n onFocus?.()\n }}\n onBlur={() => {\n onComplete?.(draft)\n committed.current = draft\n onBlur?.()\n }}\n onChange={(event) => {\n setDraft(event.target.value)\n onValueChange?.(event.target.value)\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n event.stopPropagation()\n committed.current = draft\n onComplete?.(draft)\n event.currentTarget.blur()\n } else if (event.key === \"Escape\") {\n event.stopPropagation()\n setDraft(committed.current)\n onCancel?.(committed.current)\n event.currentTarget.blur()\n }\n }}\n />\n </div>\n )\n}\n","import { useRef, type CSSProperties } from \"react\"\n\n/**\n * The chrome's slider — opacity, and anything else an app puts in the style\n * panel.\n *\n * Two callbacks rather than one: `onValueChange` fires continuously while\n * dragging, `onHistoryMark` once when the drag begins. The document mark has\n * to be taken before the first change, or the whole drag lands in the undo\n * stack as one entry per pixel.\n */\nexport interface TLUiSliderProps {\n /** Current value, in steps. `null` when the selection disagrees. */\n value: number | null\n /** Number of steps. The slider runs `0..steps`. */\n steps: number\n label: string\n title?: string\n disabled?: boolean\n className?: string\n style?: CSSProperties\n \"data-testid\"?: string\n onValueChange(value: number): void\n /** Called once per interaction, before the first `onValueChange`. */\n onHistoryMark?(id: string): void\n}\n\n/**\n * A range input.\n *\n * A native `<input type=\"range\">` rather than a div with pointer handlers: it\n * is keyboard-operable, announced correctly, and honours the platform's own\n * \"page up jumps by ten\" conventions for free.\n */\nexport function TldrawUiSlider({\n value,\n steps,\n label,\n title,\n disabled,\n className,\n style,\n onValueChange,\n onHistoryMark,\n ...rest\n}: TLUiSliderProps) {\n const marked = useRef(false)\n const mark = () => {\n if (marked.current) return\n marked.current = true\n onHistoryMark?.(`slider:${label}`)\n }\n return (\n <input\n type=\"range\"\n className={[\"mocanvas-slider\", className].filter(Boolean).join(\" \")}\n style={style}\n min={0}\n max={steps}\n step={1}\n // A slider with no shared value still has to be a valid range input, so\n // it sits at the bottom and says so through `aria-valuetext`.\n value={value ?? 0}\n disabled={disabled}\n aria-label={label}\n {...(title ? { \"data-tooltip\": title } : {})}\n {...(value === null ? { \"aria-valuetext\": \"Mixed\" } : {})}\n {...(rest[\"data-testid\"] ? { \"data-testid\": rest[\"data-testid\"] } : {})}\n onPointerDown={mark}\n onKeyDown={mark}\n onPointerUp={() => (marked.current = false)}\n onBlur={() => (marked.current = false)}\n onChange={(event) => {\n mark()\n onValueChange(Number(event.target.value))\n }}\n />\n )\n}\n","import type { CSSProperties, ReactNode } from \"react\"\nimport { TldrawUiOrientationProvider } from \"./ui-orientation\"\n\n/**\n * The three layout boxes the chrome is assembled from.\n *\n * They exist as components rather than as CSS classes so that a row also\n * publishes its orientation (see {@link TldrawUiOrientationProvider}) — which\n * is what lets the buttons inside it work out their own arrow-key behaviour\n * without being told.\n */\nexport interface TLUiLayoutProps {\n /** Cross-axis alignment. */\n align?: \"start\" | \"center\" | \"end\" | \"stretch\"\n /** Main-axis distribution. */\n justify?: \"start\" | \"center\" | \"end\" | \"between\"\n /** Gap between children, in px. */\n gap?: number\n className?: string\n style?: CSSProperties\n children?: ReactNode\n}\n\nconst ALIGN: Record<string, string> = { start: \"flex-start\", center: \"center\", end: \"flex-end\", stretch: \"stretch\" }\nconst JUSTIFY: Record<string, string> = { start: \"flex-start\", center: \"center\", end: \"flex-end\", between: \"space-between\" }\n\n/** A horizontal run of controls. */\nexport function TldrawUiRow({ align = \"center\", justify = \"start\", gap = 2, className, style, children }: TLUiLayoutProps) {\n return (\n <TldrawUiOrientationProvider orientation=\"horizontal\">\n <div\n className={[\"mocanvas-row\", className].filter(Boolean).join(\" \")}\n style={{ display: \"flex\", flexDirection: \"row\", alignItems: ALIGN[align], justifyContent: JUSTIFY[justify], gap, ...style }}\n >\n {children}\n </div>\n </TldrawUiOrientationProvider>\n )\n}\n\n/** A vertical stack of controls. */\nexport function TldrawUiColumn({ align = \"stretch\", justify = \"start\", gap = 2, className, style, children }: TLUiLayoutProps) {\n return (\n <TldrawUiOrientationProvider orientation=\"vertical\">\n <div\n className={[\"mocanvas-column\", className].filter(Boolean).join(\" \")}\n style={{ display: \"flex\", flexDirection: \"column\", alignItems: ALIGN[align], justifyContent: JUSTIFY[justify], gap, ...style }}\n >\n {children}\n </div>\n </TldrawUiOrientationProvider>\n )\n}\n\nexport interface TLUiGridProps extends TLUiLayoutProps {\n /** Columns. Defaults to four, which is what a swatch grid wants. */\n columns?: number\n}\n\n/**\n * A fixed-column grid: colour swatches, geo kinds, the shortcuts dialog.\n *\n * Reports itself as `role=\"grid\"`-less on purpose — it is a layout, and giving\n * it a grid role would make a screen reader announce row and column numbers\n * for what the user experiences as a list of buttons.\n */\nexport function TldrawUiGrid({ columns = 4, gap = 2, className, style, children }: TLUiGridProps) {\n return (\n <div\n className={[\"mocanvas-grid\", className].filter(Boolean).join(\" \")}\n style={{ display: \"grid\", gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))`, gap, ...style }}\n >\n {children}\n </div>\n )\n}\n","import { createContext, useCallback, useContext, useId, useMemo, useRef, useState, type ReactNode, type RefObject } from \"react\"\nimport { FloatingLayer, type Side } from \"./ui-floating\"\n\n/**\n * A popover: a trigger, and a panel that hangs off it.\n *\n * Three components rather than one with a `content` prop, because the trigger\n * has to be an element the caller controls — a toolbar button, a swatch, a\n * page name — while the panel has to be portalled out of it. Sharing a context\n * is what keeps the pair wired together across that portal.\n */\n\ninterface PopoverContextValue {\n id: string\n open: boolean\n setOpen(open: boolean): void\n anchorRef: RefObject<HTMLElement | null>\n side: Side\n}\n\nconst PopoverContext = createContext<PopoverContextValue | null>(null)\n\nfunction usePopoverContext(component: string): PopoverContextValue {\n const value = useContext(PopoverContext)\n if (!value) throw new Error(`${component}: render inside <TldrawUiPopover>.`)\n return value\n}\n\nexport interface TLUiPopoverProps {\n /** Stable id, used for the trigger/panel `aria-controls` pair. */\n id?: string\n /** Controlled open state. Omit to let the popover own it. */\n open?: boolean\n onOpenChange?(open: boolean): void\n /** Which side of the trigger the panel prefers. */\n side?: Side\n children?: ReactNode\n}\n\n/** The pair's root. Owns the open state unless the caller controls it. */\nexport function TldrawUiPopover({ id, open: controlled, onOpenChange, side = \"below\", children }: TLUiPopoverProps) {\n const generated = useId()\n const [uncontrolled, setUncontrolled] = useState(false)\n const anchorRef = useRef<HTMLElement | null>(null)\n const open = controlled ?? uncontrolled\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (controlled === undefined) setUncontrolled(next)\n onOpenChange?.(next)\n },\n [controlled, onOpenChange],\n )\n\n const value = useMemo<PopoverContextValue>(\n () => ({ id: id ?? generated, open, setOpen, anchorRef, side }),\n [id, generated, open, setOpen, side],\n )\n return <PopoverContext.Provider value={value}>{children}</PopoverContext.Provider>\n}\n\nexport interface TLUiPopoverTriggerProps {\n className?: string\n children?: ReactNode\n}\n\n/**\n * The control that opens the panel.\n *\n * Wraps its children in a button rather than cloning them, so a caller can put\n * whatever it likes inside without the trigger having to guess which prop on\n * an unknown element is the click handler.\n */\nexport function TldrawUiPopoverTrigger({ className, children }: TLUiPopoverTriggerProps) {\n const { id, open, setOpen, anchorRef } = usePopoverContext(\"TldrawUiPopoverTrigger\")\n return (\n <button\n ref={(node) => {\n anchorRef.current = node\n }}\n type=\"button\"\n className={[\"mocanvas-btn\", className].filter(Boolean).join(\" \")}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-controls={`${id}-content`}\n onClick={() => setOpen(!open)}\n >\n {children}\n </button>\n )\n}\n\nexport interface TLUiPopoverContentProps {\n /** Accessible name for the panel. */\n label?: string\n className?: string\n /** Which side to prefer, overriding the root's. */\n side?: Side\n children?: ReactNode\n}\n\n/** The panel. Rendered only while open, and portalled into the container. */\nexport function TldrawUiPopoverContent({ label, className, side, children }: TLUiPopoverContentProps) {\n const ctx = usePopoverContext(\"TldrawUiPopoverContent\")\n const close = useCallback(() => ctx.setOpen(false), [ctx])\n return (\n <FloatingLayer\n anchorRef={ctx.anchorRef}\n open={ctx.open}\n onClose={close}\n prefer={side ?? ctx.side}\n role=\"dialog\"\n keyboardNav={false}\n className={[\"mocanvas-popover\", className].filter(Boolean).join(\" \")}\n {...(label ? { label } : {})}\n >\n <div id={`${ctx.id}-content`}>{children}</div>\n </FloatingLayer>\n )\n}\n","import { createContext, useCallback, useContext, useId, useMemo, useRef, useState, type ReactNode, type RefObject } from \"react\"\nimport { FloatingLayer } from \"./ui-floating\"\nimport { TldrawUiIcon } from \"./ui-icon\"\n\n/**\n * A value picker: a trigger showing the current choice, and a list to change\n * it from.\n *\n * Not a native `<select>`, because the options carry icons and swatches that\n * an option element cannot hold. That means the ARIA has to be supplied by\n * hand, which is what these five components are for — a `listbox` of `option`s\n * behind a `combobox` trigger.\n */\n\ninterface SelectContextValue<T = string> {\n id: string\n open: boolean\n setOpen(open: boolean): void\n value: T | undefined\n onValueChange: ((value: T) => void) | undefined\n anchorRef: RefObject<HTMLElement | null>\n /** The label of whichever item matches `value`, registered by the items. */\n labels: Map<T, ReactNode>\n}\n\nconst SelectContext = createContext<SelectContextValue<never> | null>(null)\n\nfunction useSelect<T>(component: string): SelectContextValue<T> {\n const value = useContext(SelectContext) as SelectContextValue<T> | null\n if (!value) throw new Error(`${component}: render inside <TldrawUiSelect>.`)\n return value\n}\n\nexport interface TLUiSelectProps<T = string> {\n id?: string\n value?: T\n onValueChange?(value: T): void\n open?: boolean\n onOpenChange?(open: boolean): void\n children?: ReactNode\n}\n\n/** The picker's root. */\nexport function TldrawUiSelect<T = string>({ id, value, onValueChange, open: controlled, onOpenChange, children }: TLUiSelectProps<T>) {\n const generated = useId()\n const [uncontrolled, setUncontrolled] = useState(false)\n const anchorRef = useRef<HTMLElement | null>(null)\n const labels = useRef(new Map<T, ReactNode>()).current\n const open = controlled ?? uncontrolled\n const setOpen = useCallback(\n (next: boolean) => {\n if (controlled === undefined) setUncontrolled(next)\n onOpenChange?.(next)\n },\n [controlled, onOpenChange],\n )\n const ctx = useMemo<SelectContextValue<T>>(\n () => ({ id: id ?? generated, open, setOpen, value, onValueChange, anchorRef, labels }),\n [id, generated, open, setOpen, value, onValueChange, labels],\n )\n return <SelectContext.Provider value={ctx as unknown as SelectContextValue<never>}>{children}</SelectContext.Provider>\n}\n\nexport interface TLUiSelectTriggerProps {\n label?: string\n className?: string\n disabled?: boolean\n children?: ReactNode\n}\n\n/** The control showing the current value. */\nexport function TldrawUiSelectTrigger({ label, className, disabled, children }: TLUiSelectTriggerProps) {\n const ctx = useSelect<string>(\"TldrawUiSelectTrigger\")\n return (\n <button\n ref={(node) => {\n ctx.anchorRef.current = node\n }}\n type=\"button\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={ctx.open}\n aria-controls={`${ctx.id}-listbox`}\n className={[\"mocanvas-picker\", className].filter(Boolean).join(\" \")}\n disabled={disabled}\n {...(label ? { \"aria-label\": label } : {})}\n onClick={() => ctx.setOpen(!ctx.open)}\n >\n {children}\n <TldrawUiIcon icon=\"chevron-down\" small />\n </button>\n )\n}\n\nexport interface TLUiSelectValueProps {\n /** Shown when nothing is selected. */\n placeholder?: ReactNode\n className?: string\n}\n\n/** The current value, rendered from whichever item registered it. */\nexport function TldrawUiSelectValue({ placeholder, className }: TLUiSelectValueProps) {\n const ctx = useSelect<string>(\"TldrawUiSelectValue\")\n const label = ctx.value === undefined ? undefined : ctx.labels.get(ctx.value)\n return <span className={[\"mocanvas-select-value\", className].filter(Boolean).join(\" \")}>{label ?? placeholder ?? ctx.value ?? \"\"}</span>\n}\n\nexport interface TLUiSelectContentProps {\n label?: string\n className?: string\n side?: \"above\" | \"below\"\n children?: ReactNode\n}\n\n/** The option list. */\nexport function TldrawUiSelectContent({ label, className, side = \"below\", children }: TLUiSelectContentProps) {\n const ctx = useSelect<string>(\"TldrawUiSelectContent\")\n const close = useCallback(() => ctx.setOpen(false), [ctx])\n return (\n <FloatingLayer\n anchorRef={ctx.anchorRef}\n open={ctx.open}\n onClose={close}\n prefer={side}\n role=\"listbox\"\n className={[\"mocanvas-menu\", \"mocanvas-select-list\", className].filter(Boolean).join(\" \")}\n {...(label ? { label } : {})}\n >\n <div id={`${ctx.id}-listbox`}>{children}</div>\n </FloatingLayer>\n )\n}\n\nexport interface TLUiSelectItemProps<T = string> {\n value: T\n disabled?: boolean\n className?: string\n children?: ReactNode\n}\n\n/**\n * One option.\n *\n * Registers its own rendered label against its value on every render, so\n * {@link TldrawUiSelectValue} can show the trigger's current choice with the\n * same markup the list uses — icon included — instead of the bare value.\n */\nexport function TldrawUiSelectItem<T = string>({ value, disabled, className, children }: TLUiSelectItemProps<T>) {\n const ctx = useSelect<T>(\"TldrawUiSelectItem\")\n ctx.labels.set(value, children)\n const selected = ctx.value === value\n return (\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n className={[\"mocanvas-menu-item\", className].filter(Boolean).join(\" \")}\n disabled={disabled}\n onClick={() => {\n ctx.onValueChange?.(value)\n ctx.setOpen(false)\n }}\n >\n {children}\n </button>\n )\n}\n","import { createContext, useContext, useRef, type CSSProperties, type ReactNode, type Ref } from \"react\"\nimport { TldrawUiOrientationProvider, useTldrawUiOrientation } from \"./ui-orientation\"\n\n/**\n * The toolbar primitive, and the buttons that go in it.\n *\n * A toolbar is not a list of buttons: it is one tab stop, and the arrow keys\n * move within it. Browsers give you none of that for free, so the roving\n * tabindex lives here — a caller composing `TldrawUiToolbarButton`s gets the\n * keyboard behaviour without writing any of it.\n */\n\nexport interface TLUiToolbarProps {\n label: string\n orientation?: \"horizontal\" | \"vertical\"\n className?: string | undefined\n style?: CSSProperties | undefined\n ref?: Ref<HTMLDivElement> | undefined\n children?: ReactNode\n}\n\n/** A `role=\"toolbar\"` container with roving focus. */\nexport function TldrawUiToolbar({ label, orientation = \"horizontal\", className, style, ref, children }: TLUiToolbarProps) {\n const own = useRef<HTMLDivElement>(null)\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n const root = own.current\n if (!root) return\n const horizontal = orientation === \"horizontal\"\n const next = horizontal ? \"ArrowRight\" : \"ArrowDown\"\n const prev = horizontal ? \"ArrowLeft\" : \"ArrowUp\"\n if (event.key !== next && event.key !== prev && event.key !== \"Home\" && event.key !== \"End\") return\n const items = Array.from(root.querySelectorAll<HTMLElement>(\"button:not([disabled]),[role='radio']:not([aria-disabled='true'])\"))\n if (items.length === 0) return\n event.preventDefault()\n const index = items.indexOf(root.ownerDocument.activeElement as HTMLElement)\n if (event.key === \"Home\") items[0]?.focus()\n else if (event.key === \"End\") items[items.length - 1]?.focus()\n else if (event.key === next) items[(index + 1) % items.length]?.focus()\n else items[(index - 1 + items.length) % items.length]?.focus()\n }\n\n return (\n <TldrawUiOrientationProvider orientation={orientation}>\n <div\n ref={(node) => {\n own.current = node\n if (typeof ref === \"function\") ref(node)\n else if (ref) (ref as { current: HTMLDivElement | null }).current = node\n }}\n role=\"toolbar\"\n aria-label={label}\n aria-orientation={orientation}\n className={[\"mocanvas-panel\", \"mocanvas-toolbar\", className].filter(Boolean).join(\" \")}\n style={style}\n onKeyDown={onKeyDown}\n >\n {children}\n </div>\n </TldrawUiOrientationProvider>\n )\n}\n\nexport interface TLUiToolbarButtonProps {\n type?: \"icon\" | \"tool\" | \"menu\" | \"normal\"\n isActive?: boolean\n disabled?: boolean\n title?: string\n \"aria-label\"?: string\n className?: string\n ref?: Ref<HTMLButtonElement>\n onClick?(): void\n children?: ReactNode\n}\n\n/** A button inside a {@link TldrawUiToolbar}. */\nexport function TldrawUiToolbarButton({ type = \"icon\", isActive, disabled, title, className, ref, onClick, children, ...rest }: TLUiToolbarButtonProps) {\n const label = rest[\"aria-label\"] ?? title\n return (\n <button\n ref={ref}\n type=\"button\"\n className={[\"mocanvas-btn\", `mocanvas-btn--${type}`, className].filter(Boolean).join(\" \")}\n disabled={disabled}\n {...(label ? { \"aria-label\": label, \"data-tooltip\": title ?? label } : {})}\n {...(isActive === undefined ? {} : { \"aria-pressed\": isActive })}\n onClick={onClick}\n >\n {children}\n </button>\n )\n}\n\ninterface ToggleGroupValue {\n value: string | undefined\n onValueChange: ((value: string) => void) | undefined\n type: \"single\" | \"multiple\"\n values: readonly string[]\n}\n\nconst ToggleGroupContext = createContext<ToggleGroupValue | null>(null)\n\nexport interface TLUiToolbarToggleGroupProps {\n label: string\n /** `\"single\"` behaves as a radio group, `\"multiple\"` as a set of toggles. */\n type?: \"single\" | \"multiple\"\n value?: string\n values?: readonly string[]\n onValueChange?(value: string): void\n className?: string\n children?: ReactNode\n}\n\n/**\n * A run of mutually-exclusive (or multi-select) toolbar buttons.\n *\n * `role=\"radiogroup\"` for the single case: the difference matters to a screen\n * reader, which announces \"2 of 4\" for a radio and \"pressed\" for a toggle.\n */\nexport function TldrawUiToolbarToggleGroup({ label, type = \"single\", value, values = [], onValueChange, className, children }: TLUiToolbarToggleGroupProps) {\n return (\n <ToggleGroupContext.Provider value={{ value, onValueChange: onValueChange ?? undefined, type, values }}>\n <div className={[\"mocanvas-seg\", className].filter(Boolean).join(\" \")} role={type === \"single\" ? \"radiogroup\" : \"group\"} aria-label={label}>\n {children}\n </div>\n </ToggleGroupContext.Provider>\n )\n}\n\nexport interface TLUiToolbarToggleItemProps {\n value: string\n type?: \"icon\" | \"tool\" | \"normal\"\n disabled?: boolean\n title?: string\n className?: string\n children?: ReactNode\n}\n\n/** One entry in a {@link TldrawUiToolbarToggleGroup}. */\nexport function TldrawUiToolbarToggleItem({ value, type = \"icon\", disabled, title, className, children }: TLUiToolbarToggleItemProps) {\n const group = useContext(ToggleGroupContext)\n const { prevKey, nextKey } = useTldrawUiOrientation()\n const single = group?.type !== \"multiple\"\n const checked = single ? group?.value === value : (group?.values ?? []).includes(value)\n return (\n <button\n type=\"button\"\n role={single ? \"radio\" : \"checkbox\"}\n aria-checked={checked}\n // In a radio group only the checked item is a tab stop; the arrows move\n // between the rest. Without this, Tab walks every swatch in the panel.\n tabIndex={single ? (checked ? 0 : -1) : 0}\n className={[\"mocanvas-btn\", `mocanvas-btn--${type}`, className].filter(Boolean).join(\" \")}\n disabled={disabled}\n {...(title ? { \"aria-label\": title, \"data-tooltip\": title } : {})}\n onClick={() => group?.onValueChange?.(value)}\n onKeyDown={(event) => {\n if (event.key !== prevKey && event.key !== nextKey) return\n event.preventDefault()\n const parent = event.currentTarget.parentElement\n const items = Array.from(parent?.querySelectorAll<HTMLElement>(\"[role='radio'],[role='checkbox']\") ?? [])\n const index = items.indexOf(event.currentTarget)\n const target = items[(index + (event.key === nextKey ? 1 : -1) + items.length) % items.length]\n target?.focus()\n target?.click()\n }}\n >\n {children}\n </button>\n )\n}\n","import { EditorPortal, useEditor, useValue } from \"@mocanvas/editor\"\nimport { useLayoutEffect, useRef, useState, type ReactNode } from \"react\"\nimport { TldrawUiToolbar } from \"./ui-toolbar\"\n\n/**\n * A toolbar that follows a thing on the canvas: the bar over a selected image,\n * the rich-text bar over a text shape being edited.\n *\n * The hard part is not the buttons, it is staying put. The bar is positioned\n * from page-space bounds converted to screen space on every camera change, and\n * flips below its subject when there is no room above — otherwise it sits off\n * the top of the viewport exactly when the user has scrolled their subject to\n * the top edge to work on it.\n */\n\n/** Gap between the subject's bounds and the bar. */\nconst GAP = 12\n\nexport interface TLUiContextualToolbarProps {\n label: string\n /** Page-space box the bar hangs off. Omit to hide the bar. */\n getSelectionBounds?(): { x: number; y: number; w: number; h: number } | undefined\n /** Hide while the user is dragging, so the bar does not chase the pointer. */\n hidden?: boolean\n className?: string\n children?: ReactNode\n}\n\n/** A floating toolbar anchored to a page-space box. */\nexport function TldrawUiContextualToolbar({ label, getSelectionBounds, hidden, className, children }: TLUiContextualToolbarProps) {\n const editor = useEditor()\n const ref = useRef<HTMLDivElement>(null)\n const [size, setSize] = useState({ w: 0, h: 0 })\n\n const bounds = useValue(\"contextual toolbar bounds\", () => getSelectionBounds?.() ?? editor.getSelectionPageBounds() ?? undefined, [editor, getSelectionBounds])\n const camera = useValue(\"contextual toolbar camera\", () => editor.getCamera(), [editor])\n const viewport = useValue(\"contextual toolbar viewport\", () => editor.getViewportScreenBounds(), [editor])\n\n useLayoutEffect(() => {\n const el = ref.current\n if (!el) return\n const rect = el.getBoundingClientRect()\n setSize((current) => (current.w === rect.width && current.h === rect.height ? current : { w: rect.width, h: rect.height }))\n }, [bounds, children])\n\n if (hidden || !bounds) return null\n\n const left = (bounds.x + bounds.w / 2 + camera.x) * camera.z - size.w / 2\n const above = (bounds.y + camera.y) * camera.z - size.h - GAP\n const below = (bounds.y + bounds.h + camera.y) * camera.z + GAP\n const top = above < 0 ? below : above\n const clampedLeft = Math.max(GAP, Math.min(left, Math.max(GAP, viewport.w - size.w - GAP)))\n\n return (\n <EditorPortal>\n <div className=\"mocanvas-contextual-toolbar\" style={{ position: \"absolute\", left: clampedLeft, top, zIndex: 20 }}>\n <TldrawUiToolbar ref={ref} label={label} className={className} style={{ position: \"relative\", left: 0, right: 0, bottom: 0, margin: 0 }}>\n {children}\n </TldrawUiToolbar>\n </div>\n </EditorPortal>\n )\n}\n","import type { Editor, ShapeId } from \"@mocanvas/editor\"\nimport { copyBlobToClipboard, downloadBlob, exportToBlob, type ExportFormat } from \"../export\"\n\n/**\n * Cut, copy, paste and \"copy as\" for the menus.\n *\n * The keyboard shortcuts do the same work from their own handler; this is the\n * same behaviour reached from a menu, where there is no `ClipboardEvent` to\n * hang off. Both go through the async Clipboard API and both fall back to an\n * in-page buffer, so copy/paste still works in a browser that has not granted\n * clipboard permission — within the one tab, which is where it matters most.\n */\n\n/** The MIME-ish tag mocanvas content is written under. */\nexport const MOCANVAS_CLIPBOARD_TYPE = \"application/mocanvas\"\n\n/** Set when the real clipboard is unavailable, so paste still works in-page. */\nlet fallbackBuffer = \"\"\n\n/** Serialize the given shapes (default: the selection) as clipboard text. */\nexport function getClipboardTextForShapes(editor: Editor, ids: readonly ShapeId[] = editor.getSelectedShapeIds()): string | null {\n if (ids.length === 0) return null\n const content = editor.getContentFromCurrentPage(ids)\n if (!content) return null\n return JSON.stringify({ type: MOCANVAS_CLIPBOARD_TYPE, ...content })\n}\n\n/** Copy the selection. Resolves once the write has been attempted. */\nexport async function copySelectionToClipboard(editor: Editor, ids: readonly ShapeId[] = editor.getSelectedShapeIds()): Promise<boolean> {\n const text = getClipboardTextForShapes(editor, ids)\n if (!text) return false\n fallbackBuffer = text\n try {\n await navigator.clipboard?.writeText(text)\n } catch {\n // Permission denied, or no clipboard at all. The fallback buffer stands in.\n }\n return true\n}\n\n/** Copy the selection, then delete it. */\nexport async function cutSelectionToClipboard(editor: Editor, ids: readonly ShapeId[] = editor.getSelectedShapeIds()): Promise<boolean> {\n const copied = await copySelectionToClipboard(editor, ids)\n if (!copied) return false\n editor.markHistoryStoppingPoint(\"cut\")\n editor.deleteShapes([...ids])\n return true\n}\n\n/** Put whatever mocanvas content is on the clipboard onto the current page. */\nexport async function pasteFromClipboard(editor: Editor, point = editor.getViewportPageCenter()): Promise<boolean> {\n let text = \"\"\n try {\n text = (await navigator.clipboard?.readText()) ?? \"\"\n } catch {\n text = \"\"\n }\n if (!text) text = fallbackBuffer\n if (!text) return false\n try {\n const data = JSON.parse(text) as { type?: string; shapes?: unknown[] }\n if (data.type !== MOCANVAS_CLIPBOARD_TYPE || !Array.isArray(data.shapes)) return false\n editor.markHistoryStoppingPoint(\"paste\")\n editor.putContentOntoCurrentPage(data as never, { point })\n return true\n } catch {\n return false\n }\n}\n\nexport interface CopyAsOptions {\n /** Page units of padding around the shapes. */\n padding?: number\n /** Paint the theme's background behind the shapes. */\n background?: boolean\n scale?: number\n darkMode?: boolean\n}\n\nexport interface ExportAsOptions extends CopyAsOptions {\n /** Filename, without extension. Defaults to the current page's name. */\n name?: string\n quality?: number\n pixelRatio?: number\n}\n\n/**\n * Put a rendered copy of the shapes on the system clipboard.\n *\n * `\"json\"` writes mocanvas's own content format, which is what paste reads;\n * the image formats write a blob, which is what another application reads.\n */\nexport async function copyAs(\n editor: Editor,\n format: ExportFormat | \"json\" = \"svg\",\n ids: readonly ShapeId[] = editor.getSelectedShapeIds(),\n opts: CopyAsOptions = {},\n): Promise<void> {\n if (format === \"json\") {\n await copySelectionToClipboard(editor, ids)\n return\n }\n const blob = await exportToBlob(editor, { ...opts, format, ids: [...ids] })\n await copyBlobToClipboard(blob)\n}\n\n/** Render the shapes and hand the file to the browser's downloader. */\nexport async function exportAs(\n editor: Editor,\n format: ExportFormat = \"png\",\n ids: readonly ShapeId[] = editor.getSelectedShapeIds(),\n opts: ExportAsOptions = {},\n): Promise<void> {\n const { name, ...rest } = opts\n const blob = await exportToBlob(editor, { ...rest, format, ids: [...ids] })\n const page = editor.getCurrentPage()\n downloadBlob(blob, `${name ?? page?.name ?? \"drawing\"}.${format}`)\n}\n\n/**\n * Print the current page.\n *\n * Delegates to the browser's own print dialog rather than rendering a print\n * sheet: the page's stylesheet is what decides how the editor prints, and an\n * app that cares will have written one.\n */\nexport function printSelection(editor: Editor): void {\n editor.getContainerWindow()?.print()\n}\n","import { track, useEditor, useValue } from \"@mocanvas/editor\"\nimport { useState } from \"react\"\nimport { useCanApplySelectionAction, useHasLockedShapes, useReadonly } from \"./ui-actions\"\nimport { useDialogs } from \"./ui-dialogs\"\nimport {\n TldrawUiMenuActionCheckboxItem,\n TldrawUiMenuActionItem,\n TldrawUiMenuCheckboxItem,\n TldrawUiMenuGroup,\n TldrawUiMenuItem,\n TldrawUiMenuSubmenu,\n} from \"./ui-menu\"\nimport { copyAs, cutSelectionToClipboard, copySelectionToClipboard, exportAs, pasteFromClipboard, printSelection } from \"./ui-clipboard\"\nimport { LANGUAGES } from \"./ui-translation\"\nimport { usePrefersReducedMotion } from \"./ui-a11y\"\n\n/**\n * The concrete menu items, and the groups and submenus that arrange them.\n *\n * Almost all of them are one line: a {@link TldrawUiMenuActionItem} naming an\n * entry in the action list. That indirection is the point — the item decides\n * *where* something appears, the action decides *what* it does and whether it\n * is available, and an app's `overrides.actions` therefore reaches every menu\n * at once. An item whose action has been removed renders nothing.\n *\n * The handful that are not one-liners are the ones with no single action\n * behind them: the clipboard (which is async), the submenus that enumerate\n * pages or languages, and the toggles that read a preference directly.\n */\n\n// ---------------------------------------------------------------------------\n// Clipboard\n// ---------------------------------------------------------------------------\n\n/** Cut the selection. */\nexport function CutMenuItem() {\n const editor = useEditor()\n const enabled = useCanApplySelectionAction()\n return <TldrawUiMenuItem id=\"cut\" label=\"Cut\" icon=\"trash\" kbd=\"mod+x\" disabled={!enabled} onSelect={() => void cutSelectionToClipboard(editor)} />\n}\n\n/** Copy the selection. */\nexport function CopyMenuItem() {\n const editor = useEditor()\n const enabled = useCanApplySelectionAction()\n return <TldrawUiMenuItem id=\"copy\" label=\"Copy\" icon=\"duplicate\" kbd=\"mod+c\" disabled={!enabled} onSelect={() => void copySelectionToClipboard(editor)} />\n}\n\n/** Paste at the viewport centre, or at the pointer when that mode is on. */\nexport function PasteMenuItem() {\n const editor = useEditor()\n const readonly = useReadonly()\n return <TldrawUiMenuItem id=\"paste\" label=\"Paste\" kbd=\"mod+v\" disabled={readonly} onSelect={() => void pasteFromClipboard(editor)} />\n}\n\n/** Cut / copy / paste, as one group. */\nexport function ClipboardMenuGroup() {\n return (\n <TldrawUiMenuGroup id=\"clipboard\">\n <CutMenuItem />\n <CopyMenuItem />\n <PasteMenuItem />\n <DuplicateMenuItem />\n <DeleteMenuItem />\n </TldrawUiMenuGroup>\n )\n}\n\nconst COPY_FORMATS = [\"svg\", \"png\", \"json\"] as const\n\n/** \"Copy as\" — the rendered formats, plus mocanvas's own content JSON. */\nexport function CopyAsMenuGroup() {\n const editor = useEditor()\n const enabled = useCanApplySelectionAction()\n return (\n <TldrawUiMenuSubmenu id=\"copy-as\" label=\"Copy as\" disabled={!enabled}>\n <TldrawUiMenuGroup id=\"copy-as-group\">\n {COPY_FORMATS.map((format) => (\n <TldrawUiMenuItem key={format} id={`copy-as-${format}`} label={format.toUpperCase()} onSelect={() => void copyAs(editor, format)} />\n ))}\n </TldrawUiMenuGroup>\n </TldrawUiMenuSubmenu>\n )\n}\n\nconst EXPORT_FORMATS = [\"svg\", \"png\", \"jpeg\", \"webp\"] as const\n\n/** \"Export as\" — writes a file through the browser's downloader. */\nexport function ExportAsMenuGroup() {\n const editor = useEditor()\n return (\n <TldrawUiMenuSubmenu id=\"export-as\" label=\"Export as\">\n <TldrawUiMenuGroup id=\"export-as-group\">\n {EXPORT_FORMATS.map((format) => (\n <TldrawUiMenuItem key={format} id={`export-as-${format}`} label={format.toUpperCase()} onSelect={() => void exportAs(editor, format)} />\n ))}\n </TldrawUiMenuGroup>\n <TldrawUiMenuGroup id=\"export-as-bg\">\n <ToggleTransparentBgMenuItem />\n </TldrawUiMenuGroup>\n </TldrawUiMenuSubmenu>\n )\n}\n\n/** Export the whole document as a `.mocanvas` file. */\nexport function ExportFileContentSubMenu() {\n const editor = useEditor()\n return (\n <TldrawUiMenuSubmenu id=\"file\" label=\"File\">\n <TldrawUiMenuGroup id=\"file-group\">\n <TldrawUiMenuItem\n id=\"save-file-copy\"\n label=\"Save a copy\"\n kbd=\"mod+s\"\n onSelect={() => {\n void import(\"../file\").then(({ serializeMocanvasFile }) => {\n const blob = new Blob([serializeMocanvasFile(editor)], { type: \"application/json\" })\n void import(\"../export\").then(({ downloadBlob }) => downloadBlob(blob, `${editor.getCurrentPage()?.name ?? \"drawing\"}.mocanvas`))\n })\n }}\n />\n <PrintItem />\n </TldrawUiMenuGroup>\n </TldrawUiMenuSubmenu>\n )\n}\n\n/** Print, through the browser's own dialog. */\nexport function PrintItem() {\n const editor = useEditor()\n return <TldrawUiMenuItem id=\"print\" label=\"Print\" kbd=\"mod+p\" onSelect={() => printSelection(editor)} />\n}\n\n/** Copy-as and export-as, as one group. */\nexport function ConversionsMenuGroup() {\n return (\n <TldrawUiMenuGroup id=\"conversions\">\n <CopyAsMenuGroup />\n <ExportAsMenuGroup />\n </TldrawUiMenuGroup>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Selection\n// ---------------------------------------------------------------------------\n\n/** Delete the selection. */\nexport function DeleteMenuItem() {\n return <TldrawUiMenuActionItem actionId=\"delete\" />\n}\n\n/** Duplicate the selection. */\nexport function DuplicateMenuItem() {\n return <TldrawUiMenuActionItem actionId=\"duplicate\" />\n}\n\n/** Group the selection. */\nexport function GroupMenuItem() {\n return <TldrawUiMenuActionItem actionId=\"group\" />\n}\n\n/** Ungroup the selection. */\nexport function UngroupMenuItem() {\n return <TldrawUiMenuActionItem actionId=\"ungroup\" />\n}\n\n/**\n * Group, or ungroup — whichever applies.\n *\n * One row rather than two, because in a menu the inapplicable one of the pair\n * is always greyed out, and a permanently-dead row is worse than a row whose\n * label changes.\n */\nexport const GroupOrUngroupMenuItem = track(function GroupOrUngroupMenuItem() {\n const editor = useEditor()\n const isGroup = editor.getSelectedShapes().some((shape) => shape.type === \"group\")\n return isGroup ? <UngroupMenuItem /> : <GroupMenuItem />\n})\n\n/** Select everything on the page. */\nexport function SelectAllMenuItem() {\n return <TldrawUiMenuActionItem actionId=\"select-all\" />\n}\n\n/** Rotate the selection a quarter turn clockwise. */\nexport function RotateCWMenuItem() {\n return <TldrawUiMenuActionItem actionId=\"rotate-cw\" />\n}\n\n/** Lock or unlock the selection. */\nexport function ToggleLockMenuItem() {\n return <TldrawUiMenuActionItem actionId=\"toggle-lock\" />\n}\n\n/** Unlock every locked shape on the page. */\nexport function UnlockAllMenuItem() {\n const hasLocked = useHasLockedShapes()\n if (!hasLocked) return null\n return <TldrawUiMenuActionItem actionId=\"unlock-all\" />\n}\n\n/** Lock, and unlock-all, as one group. */\nexport function LockGroup() {\n return (\n <TldrawUiMenuGroup id=\"lock\">\n <ToggleLockMenuItem />\n <UnlockAllMenuItem />\n </TldrawUiMenuGroup>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Arrange\n// ---------------------------------------------------------------------------\n\n/** The six alignment items. */\nexport function AlignMenuItems() {\n return (\n <TldrawUiMenuGroup id=\"align\">\n <TldrawUiMenuActionItem actionId=\"align-left\" />\n <TldrawUiMenuActionItem actionId=\"align-center-horizontal\" />\n <TldrawUiMenuActionItem actionId=\"align-right\" />\n <TldrawUiMenuActionItem actionId=\"align-top\" />\n <TldrawUiMenuActionItem actionId=\"align-center-vertical\" />\n <TldrawUiMenuActionItem actionId=\"align-bottom\" />\n </TldrawUiMenuGroup>\n )\n}\n\n/** The two distribute items. */\nexport function DistributeMenuItems() {\n return (\n <TldrawUiMenuGroup id=\"distribute\">\n <TldrawUiMenuActionItem actionId=\"distribute-horizontal\" />\n <TldrawUiMenuActionItem actionId=\"distribute-vertical\" />\n </TldrawUiMenuGroup>\n )\n}\n\n/** The two stack items. */\nexport function StackMenuItems() {\n return (\n <TldrawUiMenuGroup id=\"stack\">\n <TldrawUiMenuActionItem actionId=\"stack-horizontal\" />\n <TldrawUiMenuActionItem actionId=\"stack-vertical\" />\n </TldrawUiMenuGroup>\n )\n}\n\n/** The four reorder items. */\nexport function ReorderMenuItems() {\n return (\n <TldrawUiMenuGroup id=\"reorder\">\n <TldrawUiMenuActionItem actionId=\"bring-to-front\" />\n <TldrawUiMenuActionItem actionId=\"bring-forward\" />\n <TldrawUiMenuActionItem actionId=\"send-backward\" />\n <TldrawUiMenuActionItem actionId=\"send-to-back\" />\n </TldrawUiMenuGroup>\n )\n}\n\n/** Reordering, as a submenu. */\nexport function ReorderMenuSubmenu() {\n return (\n <TldrawUiMenuSubmenu id=\"reorder\" label=\"Reorder\">\n <ReorderMenuItems />\n </TldrawUiMenuSubmenu>\n )\n}\n\n/** Align, distribute, stack, stretch and flip, as one submenu. */\nexport function ArrangeMenuSubmenu() {\n return (\n <TldrawUiMenuSubmenu id=\"arrange\" label=\"Arrange\">\n <AlignMenuItems />\n <DistributeMenuItems />\n <StackMenuItems />\n <TldrawUiMenuGroup id=\"stretch\">\n <TldrawUiMenuActionItem actionId=\"stretch-horizontal\" />\n <TldrawUiMenuActionItem actionId=\"stretch-vertical\" />\n </TldrawUiMenuGroup>\n <TldrawUiMenuGroup id=\"flip\">\n <TldrawUiMenuActionItem actionId=\"flip-horizontal\" />\n <TldrawUiMenuActionItem actionId=\"flip-vertical\" />\n <TldrawUiMenuActionItem actionId=\"pack\" />\n </TldrawUiMenuGroup>\n </TldrawUiMenuSubmenu>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Shape-specific\n// ---------------------------------------------------------------------------\n\n/** Edit the selected shape's link. Only for a shape that carries a url. */\nexport const EditLinkMenuItem = track(function EditLinkMenuItem() {\n const editor = useEditor()\n const shape = editor.getOnlySelectedShape()\n if (!shape || typeof (shape.props as { url?: unknown }).url !== \"string\") return null\n const id = shape.id\n return <TldrawUiMenuItem id=\"edit-link\" label=\"Edit link\" onSelect={() => editor.setEditingShape(id)} />\n})\n\n/**\n * Turn a bookmark into an embed.\n *\n * Renders nothing unless an embed shape util is registered — mocanvas ships\n * the mechanism, not a provider list, so an app decides what is embeddable.\n */\nexport const ConvertToEmbedMenuItem = track(function ConvertToEmbedMenuItem() {\n const editor = useEditor()\n const shape = editor.getOnlySelectedShape()\n if (!shape || shape.type !== \"bookmark\" || !editor.hasShapeUtil(\"embed\")) return null\n return (\n <TldrawUiMenuItem\n id=\"convert-to-embed\"\n label=\"Convert to embed\"\n onSelect={() => {\n const url = (shape.props as { url?: string }).url\n if (!url) return\n editor.markHistoryStoppingPoint(\"convert to embed\")\n void import(\"../external/urlContent\").then(({ createEmbedShape }) => {\n editor.deleteShapes([shape.id])\n createEmbedShape(editor, url, { x: shape.x, y: shape.y })\n })\n }}\n />\n )\n})\n\n/** Turn an embed into a bookmark. */\nexport const ConvertToBookmarkMenuItem = track(function ConvertToBookmarkMenuItem() {\n const editor = useEditor()\n const shape = editor.getOnlySelectedShape()\n if (!shape || shape.type !== \"embed\" || !editor.hasShapeUtil(\"bookmark\")) return null\n return (\n <TldrawUiMenuItem\n id=\"convert-to-bookmark\"\n label=\"Convert to bookmark\"\n onSelect={() => {\n const url = (shape.props as { url?: string }).url\n if (!url) return\n editor.markHistoryStoppingPoint(\"convert to bookmark\")\n void import(\"../external/urlContent\").then(({ createBookmarkShape }) => {\n editor.deleteShapes([shape.id])\n createBookmarkShape(editor, url, undefined, { x: shape.x, y: shape.y })\n })\n }}\n />\n )\n})\n\n/** Shrink a frame to fit what is inside it. */\nexport const FitFrameToContentMenuItem = track(function FitFrameToContentMenuItem() {\n const editor = useEditor()\n const shape = editor.getOnlySelectedShape()\n if (!shape || !editor.isShapeFrameLike(shape)) return null\n const children = editor.getSortedChildIdsForParent(shape.id)\n if (children.length === 0) return null\n return (\n <TldrawUiMenuItem\n id=\"fit-frame-to-content\"\n label=\"Fit to content\"\n onSelect={() => {\n const bounds = editor.getShapesPageBounds(children)\n if (!bounds) return\n editor.markHistoryStoppingPoint(\"fit frame to content\")\n editor.updateShape({ id: shape.id, type: shape.type, x: bounds.minX, y: bounds.minY, props: { w: bounds.width, h: bounds.height } } as never)\n }}\n />\n )\n})\n\n/** Delete a frame but keep its children. */\nexport const RemoveFrameMenuItem = track(function RemoveFrameMenuItem() {\n const editor = useEditor()\n const shape = editor.getOnlySelectedShape()\n if (!shape || !editor.isShapeFrameLike(shape)) return null\n return (\n <TldrawUiMenuItem\n id=\"remove-frame\"\n label=\"Remove frame\"\n onSelect={() => {\n const children = editor.getSortedChildIdsForParent(shape.id)\n editor.markHistoryStoppingPoint(\"remove frame\")\n if (children.length > 0) editor.reparentShapes(children, shape.parentId)\n editor.deleteShapes([shape.id])\n }}\n />\n )\n})\n\n/** Let a text shape size itself to its content again. */\nexport const ToggleAutoSizeMenuItem = track(function ToggleAutoSizeMenuItem() {\n const editor = useEditor()\n const shape = editor.getOnlySelectedShape()\n if (!shape || shape.type !== \"text\" || (shape.props as { autoSize?: boolean }).autoSize !== false) return null\n return (\n <TldrawUiMenuItem\n id=\"toggle-auto-size\"\n label=\"Auto size\"\n onSelect={() => {\n editor.markHistoryStoppingPoint(\"auto size\")\n editor.updateShape({ id: shape.id, type: shape.type, props: { autoSize: true } } as never)\n }}\n />\n )\n})\n\n/** Move the selection to another page. */\nexport const MoveToPageMenu = track(function MoveToPageMenu() {\n const editor = useEditor()\n const pages = editor.getPages()\n const currentId = editor.getCurrentPageId()\n const enabled = editor.getSelectedShapeIds().length > 0\n if (pages.length < 2 || !enabled) return null\n return (\n <TldrawUiMenuSubmenu id=\"move-to-page\" label=\"Move to page\">\n <TldrawUiMenuGroup id=\"move-to-page-group\">\n {pages\n .filter((page) => page.id !== currentId)\n .map((page) => (\n <TldrawUiMenuItem\n key={page.id}\n id={`move-to-page-${page.id}`}\n label={page.name}\n onSelect={() => {\n editor.markHistoryStoppingPoint(\"move to page\")\n editor.moveShapesToPage(editor.getSelectedShapeIds(), page.id)\n }}\n />\n ))}\n </TldrawUiMenuGroup>\n </TldrawUiMenuSubmenu>\n )\n})\n\n// ---------------------------------------------------------------------------\n// Zoom\n// ---------------------------------------------------------------------------\n\n/** Reset the camera to 100%. */\nexport function ZoomTo100MenuItem() {\n return <TldrawUiMenuActionItem actionId=\"reset-zoom\" />\n}\n\n/** Fit the whole page in the viewport. */\nexport function ZoomToFitMenuItem() {\n return <TldrawUiMenuActionItem actionId=\"zoom-to-fit\" />\n}\n\n/** Fit the selection in the viewport. */\nexport function ZoomToSelectionMenuItem() {\n return <TldrawUiMenuActionItem actionId=\"zoom-to-selection\" />\n}\n\n/**\n * Zoom to fit, or rotate — whichever the pointer device suggests.\n *\n * SEMANTICS-ASSUMED: mocanvas has no rotate-the-canvas feature, so this shows\n * the zoom half unconditionally. It exists under its documented name so a menu\n * composed of these items does not have a hole in it, and so the rotate half\n * can be filled in later without any caller changing.\n */\nexport function ZoomOrRotateMenuItem() {\n return <ZoomToFitMenuItem />\n}\n\n// ---------------------------------------------------------------------------\n// Preferences\n// ---------------------------------------------------------------------------\n\n/** Show the grid. */\nexport function ToggleGridItem() {\n return <TldrawUiMenuActionCheckboxItem actionId=\"toggle-grid\" />\n}\n\n/** Snap to other shapes while dragging. */\nexport function ToggleSnapModeItem() {\n return <TldrawUiMenuActionCheckboxItem actionId=\"toggle-snap-mode\" />\n}\n\n/** Keep the current tool after drawing a shape. */\nexport function ToggleToolLockItem() {\n return <TldrawUiMenuActionCheckboxItem actionId=\"toggle-tool-lock\" />\n}\n\n/** Hide the chrome. */\nexport function ToggleFocusModeItem() {\n return <TldrawUiMenuActionCheckboxItem actionId=\"toggle-focus-mode\" />\n}\n\n/** Show the frame-statistics chip and the debug menu. */\nexport function ToggleDebugModeItem() {\n return <TldrawUiMenuActionCheckboxItem actionId=\"toggle-debug-mode\" />\n}\n\n/** Wrap long text instead of growing the shape. */\nexport function ToggleWrapModeItem() {\n return <TldrawUiMenuActionCheckboxItem actionId=\"toggle-wrap-mode\" />\n}\n\n/** Scale new shapes so they look the same size at any zoom. */\nexport function ToggleDynamicSizeModeItem() {\n return <TldrawUiMenuActionCheckboxItem actionId=\"toggle-dynamic-size-mode\" />\n}\n\n/** Paste at the pointer rather than at the viewport centre. */\nexport function TogglePasteAtCursorItem() {\n return <TldrawUiMenuActionCheckboxItem actionId=\"toggle-paste-at-cursor\" />\n}\n\n/** Scroll the camera when dragging past the viewport edge. */\nexport function ToggleEdgeScrollingItem() {\n return <TldrawUiMenuActionCheckboxItem actionId=\"toggle-edge-scrolling\" />\n}\n\n/** Keyboard shortcuts on or off. */\nexport function ToggleKeyboardShortcutsItem() {\n return <TldrawUiMenuActionCheckboxItem actionId=\"toggle-keyboard-shortcuts\" />\n}\n\n/** Export with a transparent background. */\nexport function ToggleTransparentBgMenuItem() {\n return <TldrawUiMenuActionCheckboxItem actionId=\"toggle-transparent\" />\n}\n\n/**\n * Turn off animation.\n *\n * Reflects the OS setting as well as the preference: a user whose system asks\n * for reduced motion should find the box already ticked rather than have to\n * ask twice.\n */\nexport function ToggleReduceMotionItem() {\n const editor = useEditor()\n const os = usePrefersReducedMotion()\n const off = useValue(\"reduceMotion\", () => editor.user.getAnimationSpeed() === 0, [editor])\n return (\n <TldrawUiMenuCheckboxItem\n id=\"toggle-reduce-motion\"\n label=\"Reduce motion\"\n checked={off || os}\n onSelect={() => editor.user.updateUserPreferences({ animationSpeed: off ? 1 : 0 })}\n />\n )\n}\n\n/**\n * Invert the scroll direction of zooming.\n *\n * SEMANTICS-ASSUMED: mocanvas's camera options carry no invert flag, so this\n * toggles `wheelBehavior` between the two documented values, which is the\n * closest thing the option set has to the same effect.\n */\nexport const ToggleInvertZoomItem = track(function ToggleInvertZoomItem() {\n const editor = useEditor()\n const options = editor.getCameraOptions()\n const inverted = options.wheelBehavior === \"zoom\"\n return (\n <TldrawUiMenuCheckboxItem\n id=\"toggle-invert-zoom\"\n label=\"Invert zoom direction\"\n checked={inverted}\n onSelect={() => editor.setCameraOptions({ ...options, wheelBehavior: inverted ? \"pan\" : \"zoom\" })}\n />\n )\n})\n\n/**\n * Announce more than the minimum to a screen reader.\n *\n * SEMANTICS-ASSUMED: kept as a local preference rather than a store record,\n * because it changes only how much the announcer says and nothing about the\n * document. Read it with {@link useEnhancedA11yMode}.\n */\nlet enhancedA11y = false\n\n/** Whether the enhanced-announcement preference is on. */\nexport function useEnhancedA11yMode(): [boolean, (value: boolean) => void] {\n const [value, setValue] = useState(enhancedA11y)\n return [\n value,\n (next: boolean) => {\n enhancedA11y = next\n setValue(next)\n },\n ]\n}\n\n/** Toggle the enhanced-announcement preference. */\nexport function ToggleEnhancedA11yModeItem() {\n const [enabled, setEnabled] = useEnhancedA11yMode()\n return <TldrawUiMenuCheckboxItem id=\"toggle-enhanced-a11y\" label=\"Enhanced accessibility\" checked={enabled} onSelect={() => setEnabled(!enabled)} />\n}\n\n/** Every preference toggle, as one group. */\nexport function PreferencesGroup() {\n return (\n <TldrawUiMenuGroup id=\"preferences\" label=\"Preferences\">\n <ToggleSnapModeItem />\n <ToggleToolLockItem />\n <ToggleGridItem />\n <ToggleWrapModeItem />\n <ToggleDynamicSizeModeItem />\n <TogglePasteAtCursorItem />\n <ToggleEdgeScrollingItem />\n <ToggleReduceMotionItem />\n <ToggleEnhancedA11yModeItem />\n <ToggleFocusModeItem />\n <ToggleDebugModeItem />\n <ColorSchemeMenu />\n <LanguageMenu />\n </TldrawUiMenuGroup>\n )\n}\n\n/** Light, dark, or follow the system. */\nexport const ColorSchemeMenu = track(function ColorSchemeMenu() {\n const editor = useEditor()\n const current = editor.user.getUserPreferences().colorScheme ?? \"system\"\n return (\n <TldrawUiMenuSubmenu id=\"color-scheme\" label=\"Theme\">\n <TldrawUiMenuGroup id=\"color-scheme-group\">\n {([\"light\", \"dark\", \"system\"] as const).map((scheme) => (\n <TldrawUiMenuCheckboxItem\n key={scheme}\n id={`color-scheme-${scheme}`}\n label={scheme[0]!.toUpperCase() + scheme.slice(1)}\n checked={current === scheme}\n onSelect={() => editor.user.updateUserPreferences({ colorScheme: scheme })}\n />\n ))}\n </TldrawUiMenuGroup>\n </TldrawUiMenuSubmenu>\n )\n})\n\n/** Pick the UI locale. */\nexport const LanguageMenu = track(function LanguageMenu() {\n const editor = useEditor()\n const current = editor.user.getLocale()\n return (\n <TldrawUiMenuSubmenu id=\"language\" label=\"Language\">\n <TldrawUiMenuGroup id=\"language-group\">\n {LANGUAGES.map((language) => (\n <TldrawUiMenuCheckboxItem\n key={language.locale}\n id={`language-${language.locale}`}\n label={language.label}\n checked={current === language.locale}\n onSelect={() => editor.user.updateUserPreferences({ locale: language.locale })}\n />\n ))}\n </TldrawUiMenuGroup>\n </TldrawUiMenuSubmenu>\n )\n})\n\n/**\n * Which pointer devices draw.\n *\n * SEMANTICS-ASSUMED: mocanvas tracks one input mode — pen mode, on the\n * instance record — so this offers that as a two-state choice rather than the\n * larger set a stylus-first product would have.\n */\nexport const InputModeMenu = track(function InputModeMenu() {\n const editor = useEditor()\n const isPen = editor.getInstanceState().isPenMode\n return (\n <TldrawUiMenuSubmenu id=\"input-mode\" label=\"Input\">\n <TldrawUiMenuGroup id=\"input-mode-group\">\n <TldrawUiMenuCheckboxItem id=\"input-mode-mouse\" label=\"Mouse and touch\" checked={!isPen} onSelect={() => editor.updateInstanceState({ isPenMode: false })} />\n <TldrawUiMenuCheckboxItem id=\"input-mode-pen\" label=\"Pen only\" checked={isPen} onSelect={() => editor.updateInstanceState({ isPenMode: true })} />\n </TldrawUiMenuGroup>\n </TldrawUiMenuSubmenu>\n )\n})\n\n/** The accessibility preferences. */\nexport function AccessibilityMenu() {\n return (\n <TldrawUiMenuSubmenu id=\"accessibility\" label=\"Accessibility\">\n <TldrawUiMenuGroup id=\"accessibility-group\">\n <ToggleEnhancedA11yModeItem />\n <ToggleReduceMotionItem />\n <ToggleKeyboardShortcutsItem />\n </TldrawUiMenuGroup>\n </TldrawUiMenuSubmenu>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Submenus and groups\n// ---------------------------------------------------------------------------\n\n/** Undo and redo, as one group. */\nexport function UndoRedoGroup() {\n return (\n <TldrawUiMenuGroup id=\"undo-redo\">\n <TldrawUiMenuActionItem actionId=\"undo\" />\n <TldrawUiMenuActionItem actionId=\"redo\" />\n </TldrawUiMenuGroup>\n )\n}\n\n/** The edit submenu's items, without the submenu frame. */\nexport function EditMenuSubmenu() {\n return (\n <TldrawUiMenuSubmenu id=\"edit\" label=\"Edit\">\n <UndoRedoGroup />\n <ClipboardMenuGroup />\n <ConversionsMenuGroup />\n <TldrawUiMenuGroup id=\"edit-select\">\n <SelectAllMenuItem />\n <GroupOrUngroupMenuItem />\n </TldrawUiMenuGroup>\n <LockGroup />\n </TldrawUiMenuSubmenu>\n )\n}\n\n/** Alias of {@link EditMenuSubmenu}, under its other documented name. */\nexport const EditSubmenu = EditMenuSubmenu\n\n/** The view submenu: zoom and grid. */\nexport function ViewSubmenu() {\n return (\n <TldrawUiMenuSubmenu id=\"view\" label=\"View\">\n <TldrawUiMenuGroup id=\"view-zoom\">\n <TldrawUiMenuActionItem actionId=\"zoom-in\" />\n <TldrawUiMenuActionItem actionId=\"zoom-out\" />\n <ZoomTo100MenuItem />\n <ZoomToFitMenuItem />\n <ZoomToSelectionMenuItem />\n </TldrawUiMenuGroup>\n <TldrawUiMenuGroup id=\"view-modes\">\n <ToggleGridItem />\n <ToggleFocusModeItem />\n </TldrawUiMenuGroup>\n </TldrawUiMenuSubmenu>\n )\n}\n\n/** Open the keyboard shortcuts dialog. */\nexport function KeyboardShortcutsMenuItem() {\n const { addDialog } = useDialogs()\n return (\n <TldrawUiMenuItem\n id=\"keyboard-shortcuts\"\n label=\"Keyboard shortcuts\"\n kbd=\"mod+/\"\n onSelect={() => {\n void import(\"./panel-shortcuts\").then(({ KeyboardShortcutsDialogContents }) => {\n addDialog({ component: KeyboardShortcutsDialogContents })\n })\n }}\n />\n )\n}\n\n/** The odds and ends at the bottom of the main menu. */\nexport function ExtrasGroup() {\n return (\n <TldrawUiMenuGroup id=\"extras\">\n <PrintItem />\n <KeyboardShortcutsMenuItem />\n </TldrawUiMenuGroup>\n )\n}\n\n/** The bottom group of the context menu. */\nexport function MiscMenuGroup() {\n return (\n <TldrawUiMenuGroup id=\"misc\">\n <MoveToPageMenu />\n <EditLinkMenuItem />\n <ConvertToEmbedMenuItem />\n <ConvertToBookmarkMenuItem />\n <FitFrameToContentMenuItem />\n <RemoveFrameMenuItem />\n <ToggleAutoSizeMenuItem />\n </TldrawUiMenuGroup>\n )\n}\n","import { useEditor, useValue } from \"@mocanvas/editor\"\nimport { useCallback, useEffect, useState } from \"react\"\n\n/**\n * The small hooks the chrome reaches for that do not belong to any one panel.\n */\n\n/**\n * A value kept in `localStorage`, as React state.\n *\n * Every access is guarded: `localStorage` throws outright in a sandboxed\n * iframe and in a browser configured to block site data, and a panel that\n * remembers whether a section was collapsed must not be the thing that takes\n * the editor down.\n */\nexport function useLocalStorageState<T>(key: string, defaultValue: T): [T, (value: T) => void] {\n const [value, setValue] = useState<T>(() => {\n try {\n const stored = globalThis.localStorage?.getItem(key)\n return stored === null || stored === undefined ? defaultValue : (JSON.parse(stored) as T)\n } catch {\n return defaultValue\n }\n })\n\n const set = useCallback(\n (next: T) => {\n setValue(next)\n try {\n globalThis.localStorage?.setItem(key, JSON.stringify(next))\n } catch {\n // Storage unavailable. The value still lives for this session.\n }\n },\n [key],\n )\n\n return [value, set]\n}\n\n/**\n * Whether a menu is open, tracked on the editor's instance state.\n *\n * Menu open-ness lives on the editor rather than in component state because\n * the *canvas* needs to know: a canvas that keeps interpreting pointer moves\n * while a menu is over it fights the menu.\n */\nexport function useMenuIsOpen(id: string): [boolean, (open: boolean) => void] {\n const editor = useEditor()\n const isOpen = useValue(\"menuIsOpen\", () => editor.menus.isMenuOpen(id), [editor, id])\n const setIsOpen = useCallback(\n (open: boolean) => {\n if (open) editor.menus.addOpenMenu(id)\n else editor.menus.removeOpenMenu(id)\n },\n [editor, id],\n )\n // A menu torn down while open would otherwise leave the canvas suppressed.\n useEffect(() => () => void editor.menus.removeOpenMenu(id), [editor, id])\n return [isOpen, setIsOpen]\n}\n\n/** Whether any menu at all is open. */\nexport function useAnyMenuIsOpen(): boolean {\n const editor = useEditor()\n return useValue(\"anyMenuIsOpen\", () => editor.menus.getOpenMenus().length > 0, [editor])\n}\n\n/**\n * Shorten a string with an ellipsis, on a grapheme boundary.\n *\n * Cutting on a code unit splits surrogate pairs and combining marks, which\n * turns a page name into a replacement character.\n */\nexport function truncateStringWithEllipsis(value: string, max: number): string {\n if (value.length <= max) return value\n const graphemes = Array.from(value)\n if (graphemes.length <= max) return value\n return `${graphemes.slice(0, Math.max(0, max - 1)).join(\"\")}…`\n}\n\n/**\n * The plain text of a label that may carry markup.\n *\n * Menus show a shape's label as a row title; a shape whose label is a\n * rich-text document would otherwise render as `[object Object]`.\n */\nexport function unwrapLabel(label: unknown, max?: number): string {\n const text = typeof label === \"string\" ? label : typeof label === \"object\" && label !== null && \"text\" in label ? String((label as { text: unknown }).text) : String(label ?? \"\")\n return max === undefined ? text : truncateStringWithEllipsis(text, max)\n}\n","import { useEditor, useGlobalMenuIsOpen, useValue } from \"@mocanvas/editor\"\nimport { useCallback, useRef, type ReactNode } from \"react\"\nimport {\n AccessibilityMenu,\n ArrangeMenuSubmenu,\n ClipboardMenuGroup,\n ConversionsMenuGroup,\n EditMenuSubmenu,\n ExportFileContentSubMenu,\n ExtrasGroup,\n GroupOrUngroupMenuItem,\n LockGroup,\n MiscMenuGroup,\n PreferencesGroup,\n ReorderMenuSubmenu,\n SelectAllMenuItem,\n UndoRedoGroup,\n ViewSubmenu,\n ZoomTo100MenuItem,\n ZoomToFitMenuItem,\n ZoomToSelectionMenuItem,\n} from \"./menu-items\"\nimport {\n TldrawUiDropdownMenuContent,\n TldrawUiDropdownMenuRoot,\n TldrawUiDropdownMenuTrigger,\n} from \"./ui-dropdown-menu\"\nimport { FloatingLayer } from \"./ui-floating\"\nimport { TldrawUiIcon } from \"./ui-icon\"\nimport { TldrawUiMenuActionItem, TldrawUiMenuContextProvider, TldrawUiMenuGroup } from \"./ui-menu\"\nimport type {\n TLUiActionsMenuProps,\n TLUiContextMenuProps,\n TLUiDebugMenuProps,\n TLUiHelpMenuProps,\n TLUiHelperButtonsProps,\n TLUiMainMenuProps,\n TLUiQuickActionsProps,\n TLUiZoomMenuProps,\n} from \"./ui-components\"\n\n/**\n * The default menus.\n *\n * Every one is a pair: a `Default*` panel that owns the frame — the trigger,\n * the open state, the ARIA — and a `Default*Content` that is only the items.\n * An app that wants a different set of items replaces the content and keeps\n * the behaviour; an app that wants a different chrome replaces the panel\n * through its component slot. Neither has to reimplement the other.\n */\n\n// ---------------------------------------------------------------------------\n// Main menu\n// ---------------------------------------------------------------------------\n\n/** The main menu's items. */\nexport function DefaultMainMenuContent() {\n return (\n <>\n <EditMenuSubmenu />\n <ViewSubmenu />\n <ExportFileContentSubMenu />\n <ExtrasGroup />\n <PreferencesGroup />\n </>\n )\n}\n\n/** The top-left menu. */\nexport function DefaultMainMenu({ children }: TLUiMainMenuProps) {\n const [isOpen, setIsOpen] = useGlobalMenuIsOpen(\"main-menu\")\n return (\n <TldrawUiDropdownMenuRoot id=\"main-menu\" open={isOpen} onOpenChange={setIsOpen}>\n <TldrawUiDropdownMenuTrigger label=\"Menu\">\n <TldrawUiIcon icon=\"chevron-down\" />\n </TldrawUiDropdownMenuTrigger>\n <TldrawUiDropdownMenuContent label=\"Menu\" side=\"below\">\n <TldrawUiMenuContextProvider type=\"menu\" sourceId=\"menu\">\n {children ?? <DefaultMainMenuContent />}\n </TldrawUiMenuContextProvider>\n </TldrawUiDropdownMenuContent>\n </TldrawUiDropdownMenuRoot>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Context menu\n// ---------------------------------------------------------------------------\n\n/** The right-click menu's items. */\nexport function DefaultContextMenuContent() {\n return (\n <>\n <UndoRedoGroup />\n <ClipboardMenuGroup />\n <ConversionsMenuGroup />\n <TldrawUiMenuGroup id=\"selection\">\n <SelectAllMenuItem />\n <GroupOrUngroupMenuItem />\n </TldrawUiMenuGroup>\n <ArrangeMenuSubmenu />\n <ReorderMenuSubmenu />\n <LockGroup />\n <MiscMenuGroup />\n </>\n )\n}\n\n/**\n * The right-click menu.\n *\n * Wraps the canvas rather than sitting beside it: the browser fires\n * `contextmenu` at whatever element is under the pointer, so the menu has to\n * own that element. This is why `ContextMenu` and `Canvas` are alternatives in\n * the chrome map — filling this slot takes over rendering the canvas.\n */\nexport function DefaultContextMenu({ children, disabled }: TLUiContextMenuProps) {\n const anchorRef = useRef<HTMLDivElement>(null)\n const [isOpen, setIsOpen] = useGlobalMenuIsOpen(\"context-menu\")\n const close = useCallback(() => setIsOpen(false), [setIsOpen])\n\n return (\n <div\n ref={anchorRef}\n className=\"mocanvas-context-menu-target\"\n style={{ position: \"absolute\", inset: 0 }}\n onContextMenu={(event) => {\n if (disabled) return\n event.preventDefault()\n setIsOpen(true)\n }}\n >\n {children}\n <FloatingLayer anchorRef={anchorRef} open={isOpen && !disabled} onClose={close} role=\"menu\" label=\"Actions\" className=\"mocanvas-menu\">\n <TldrawUiMenuContextProvider type=\"context-menu\" sourceId=\"context-menu\">\n <DefaultContextMenuContent />\n </TldrawUiMenuContextProvider>\n </FloatingLayer>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Actions menu\n// ---------------------------------------------------------------------------\n\n/** The actions menu's items: alignment, distribution, reordering. */\nexport function DefaultActionsMenuContent() {\n return (\n <>\n <TldrawUiMenuGroup id=\"align\" label=\"Align\">\n <TldrawUiMenuActionItem actionId=\"align-left\" />\n <TldrawUiMenuActionItem actionId=\"align-center-horizontal\" />\n <TldrawUiMenuActionItem actionId=\"align-right\" />\n <TldrawUiMenuActionItem actionId=\"align-top\" />\n <TldrawUiMenuActionItem actionId=\"align-center-vertical\" />\n <TldrawUiMenuActionItem actionId=\"align-bottom\" />\n </TldrawUiMenuGroup>\n <TldrawUiMenuGroup id=\"reorder\" label=\"Reorder\">\n <TldrawUiMenuActionItem actionId=\"bring-forward\" />\n <TldrawUiMenuActionItem actionId=\"send-backward\" />\n </TldrawUiMenuGroup>\n <TldrawUiMenuGroup id=\"edit\" label=\"Edit\">\n <TldrawUiMenuActionItem actionId=\"group\" />\n <TldrawUiMenuActionItem actionId=\"ungroup\" />\n <TldrawUiMenuActionItem actionId=\"duplicate\" />\n <TldrawUiMenuActionItem actionId=\"toggle-lock\" />\n <TldrawUiMenuActionItem actionId=\"delete\" />\n </TldrawUiMenuGroup>\n </>\n )\n}\n\n/** The selection-actions menu: a grid of icon buttons. */\nexport function DefaultActionsMenu({ children }: TLUiActionsMenuProps) {\n const [isOpen, setIsOpen] = useGlobalMenuIsOpen(\"actions-menu\")\n return (\n <TldrawUiDropdownMenuRoot id=\"actions-menu\" open={isOpen} onOpenChange={setIsOpen}>\n <TldrawUiDropdownMenuTrigger label=\"Actions\">\n <TldrawUiIcon icon=\"duplicate\" />\n </TldrawUiDropdownMenuTrigger>\n <TldrawUiDropdownMenuContent label=\"Actions\" side=\"above\" className=\"mocanvas-menu--icons\">\n <TldrawUiMenuContextProvider type=\"small-icons\" sourceId=\"menu\">\n {children ?? <DefaultActionsMenuContent />}\n </TldrawUiMenuContextProvider>\n </TldrawUiDropdownMenuContent>\n </TldrawUiDropdownMenuRoot>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Quick actions\n// ---------------------------------------------------------------------------\n\n/** The quick-actions row's items. */\nexport function DefaultQuickActionsContent() {\n return (\n <>\n <TldrawUiMenuActionItem actionId=\"undo\" />\n <TldrawUiMenuActionItem actionId=\"redo\" />\n <TldrawUiMenuActionItem actionId=\"delete\" />\n <TldrawUiMenuActionItem actionId=\"duplicate\" />\n </>\n )\n}\n\n/** The always-visible row of common actions. */\nexport function DefaultQuickActions({ children }: TLUiQuickActionsProps) {\n return (\n <div className=\"mocanvas-quick-actions\" role=\"toolbar\" aria-label=\"Quick actions\">\n <TldrawUiMenuContextProvider type=\"icons\" sourceId=\"menu\">\n {children ?? <DefaultQuickActionsContent />}\n </TldrawUiMenuContextProvider>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Zoom menu\n// ---------------------------------------------------------------------------\n\n/** The zoom menu's items. */\nexport function DefaultZoomMenuContent() {\n return (\n <TldrawUiMenuGroup id=\"zoom\">\n <TldrawUiMenuActionItem actionId=\"zoom-in\" />\n <TldrawUiMenuActionItem actionId=\"zoom-out\" />\n <ZoomTo100MenuItem />\n <ZoomToFitMenuItem />\n <ZoomToSelectionMenuItem />\n </TldrawUiMenuGroup>\n )\n}\n\n/** The zoom menu; its trigger shows the current zoom level. */\nexport function DefaultZoomMenu({ children }: TLUiZoomMenuProps) {\n const editor = useEditor()\n const zoom = useValue(\"zoom\", () => Math.round(editor.getZoomLevel() * 100), [editor])\n const [isOpen, setIsOpen] = useGlobalMenuIsOpen(\"zoom-menu\")\n return (\n <TldrawUiDropdownMenuRoot id=\"zoom-menu\" open={isOpen} onOpenChange={setIsOpen}>\n <TldrawUiDropdownMenuTrigger label={`Zoom, currently ${zoom}%`} className=\"mocanvas-btn--wide\">\n {zoom}%\n </TldrawUiDropdownMenuTrigger>\n <TldrawUiDropdownMenuContent label=\"Zoom\" side=\"above\">\n <TldrawUiMenuContextProvider type=\"menu\" sourceId=\"menu\">\n {children ?? <DefaultZoomMenuContent />}\n </TldrawUiMenuContextProvider>\n </TldrawUiDropdownMenuContent>\n </TldrawUiDropdownMenuRoot>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Help menu\n// ---------------------------------------------------------------------------\n\n/** The help menu's items. */\nexport function DefaultHelpMenuContent() {\n return (\n <TldrawUiMenuGroup id=\"help\">\n <AccessibilityMenu />\n <ExtrasGroup />\n </TldrawUiMenuGroup>\n )\n}\n\n/** The help menu. */\nexport function DefaultHelpMenu({ children }: TLUiHelpMenuProps) {\n const [isOpen, setIsOpen] = useGlobalMenuIsOpen(\"help-menu\")\n return (\n <TldrawUiDropdownMenuRoot id=\"help-menu\" open={isOpen} onOpenChange={setIsOpen}>\n <TldrawUiDropdownMenuTrigger label=\"Help\">?</TldrawUiDropdownMenuTrigger>\n <TldrawUiDropdownMenuContent label=\"Help\" side=\"above\">\n <TldrawUiMenuContextProvider type=\"menu\" sourceId=\"menu\">\n {children ?? <DefaultHelpMenuContent />}\n </TldrawUiMenuContextProvider>\n </TldrawUiDropdownMenuContent>\n </TldrawUiDropdownMenuRoot>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Helper buttons\n// ---------------------------------------------------------------------------\n\n/**\n * The helper buttons' items: \"back to content\", shown only when there is\n * content and none of it is on screen.\n *\n * The condition is the whole feature. A button that is always there is\n * clutter; one that appears exactly when the user has panned into empty space\n * is the difference between a lost document and a recovered one.\n */\nexport function DefaultHelperButtonsContent() {\n const editor = useEditor()\n const isLost = useValue(\n \"is off screen\",\n () => {\n const ids = editor.getCurrentPageShapeIds()\n if (ids.size === 0) return false\n const bounds = editor.getCurrentPageBounds()\n if (!bounds) return false\n const viewport = editor.getViewportPageBounds()\n return !viewport.collides(bounds)\n },\n [editor],\n )\n if (!isLost) return null\n return (\n <button type=\"button\" className=\"mocanvas-btn mocanvas-btn--wide\" onClick={() => editor.zoomToFit()}>\n Back to content\n </button>\n )\n}\n\n/** The strip of contextual helper buttons above the toolbar. */\nexport function DefaultHelperButtons({ children }: TLUiHelperButtonsProps) {\n return <div className=\"mocanvas-helper-buttons\">{children ?? <DefaultHelperButtonsContent />}</div>\n}\n\n// ---------------------------------------------------------------------------\n// Debug menu\n// ---------------------------------------------------------------------------\n\n/** The debug menu's items. */\nexport function DefaultDebugMenuContent() {\n const editor = useEditor()\n return (\n <TldrawUiMenuGroup id=\"debug\">\n <TldrawUiMenuActionItem actionId=\"toggle-debug-mode\" />\n <TldrawUiMenuActionItem actionId=\"toggle-grid\" />\n <TldrawUiMenuActionItem actionId=\"toggle-transparent\" />\n <TldrawUiMenuActionItem actionId=\"toggle-edge-scrolling\" />\n <TldrawUiMenuContextProvider type=\"menu\">\n <button type=\"button\" role=\"menuitem\" className=\"mocanvas-menu-item\" onClick={() => editor.clearHistory()}>\n Clear history\n </button>\n </TldrawUiMenuContextProvider>\n </TldrawUiMenuGroup>\n )\n}\n\n/** The debug menu. Rendered only in debug mode by the chrome that hosts it. */\nexport function DefaultDebugMenu({ children }: TLUiDebugMenuProps) {\n const [isOpen, setIsOpen] = useGlobalMenuIsOpen(\"debug-menu\")\n return (\n <TldrawUiDropdownMenuRoot id=\"debug-menu\" open={isOpen} onOpenChange={setIsOpen}>\n <TldrawUiDropdownMenuTrigger label=\"Debug\">\n <TldrawUiIcon icon=\"chevron-up\" />\n </TldrawUiDropdownMenuTrigger>\n <TldrawUiDropdownMenuContent label=\"Debug\" side=\"above\">\n <TldrawUiMenuContextProvider type=\"menu\" sourceId=\"menu\">\n {children ?? <DefaultDebugMenuContent />}\n </TldrawUiMenuContextProvider>\n </TldrawUiDropdownMenuContent>\n </TldrawUiDropdownMenuRoot>\n )\n}\n\n/** Read for its side effect on the type checker only. */\nexport type TLUiMenuPanelChildren = ReactNode\n","import { track, useEditor, useGlobalMenuIsOpen, type PageId } from \"@mocanvas/editor\"\nimport { useState } from \"react\"\nimport { TldrawUiDropdownMenuContent, TldrawUiDropdownMenuRoot, TldrawUiDropdownMenuTrigger } from \"./ui-dropdown-menu\"\nimport { TldrawUiIcon } from \"./ui-icon\"\nimport { TldrawUiInput } from \"./ui-input\"\nimport { TldrawUiMenuContextProvider, TldrawUiMenuGroup, TldrawUiMenuItem } from \"./ui-menu\"\n\n/**\n * The page picker.\n *\n * A menu rather than a tab bar: a document with twenty pages has to stay\n * usable, and a row of twenty tabs does not. The current page's name doubles\n * as the trigger, so the panel costs one button's worth of chrome.\n */\n\nexport interface PageItemInputProps {\n id: PageId\n name: string\n /** Focus and select the field as soon as it mounts. */\n isCurrentPage?: boolean\n onCancel?(): void\n}\n\n/**\n * The rename field on a page row.\n *\n * Commits on Enter or blur and reverts on Escape, both through\n * {@link TldrawUiInput} — renaming a page is one undo entry, not one per\n * keystroke.\n */\nexport function PageItemInput({ id, name, onCancel }: PageItemInputProps) {\n const editor = useEditor()\n return (\n <TldrawUiInput\n value={name}\n label=\"Page name\"\n autoFocus\n autoSelect\n onComplete={(next) => {\n const trimmed = next.trim()\n if (trimmed && trimmed !== name) {\n editor.markHistoryStoppingPoint(\"rename page\")\n editor.renamePage(id, trimmed)\n }\n onCancel?.()\n }}\n onCancel={() => onCancel?.()}\n />\n )\n}\n\nexport interface PageItemSubmenuProps {\n id: PageId\n index: number\n /** How many pages there are, so the last one cannot be deleted. */\n total: number\n onRename?(): void\n}\n\n/** The per-page actions: rename, duplicate, delete. */\nexport function PageItemSubmenu({ id, total, onRename }: PageItemSubmenuProps) {\n const editor = useEditor()\n return (\n <TldrawUiMenuGroup id={`page-actions-${id}`}>\n <TldrawUiMenuItem id={`rename-page-${id}`} label=\"Rename\" onSelect={() => onRename?.()} />\n <TldrawUiMenuItem id={`duplicate-page-${id}`} label=\"Duplicate\" onSelect={() => editor.duplicatePage(id)} />\n <TldrawUiMenuItem id={`delete-page-${id}`} label=\"Delete\" disabled={total < 2} onSelect={() => editor.deletePage(id)} />\n </TldrawUiMenuGroup>\n )\n}\n\n/**\n * The page menu.\n *\n * Each row is a `menuitemradio`: exactly one page is current, which is what a\n * radio means, and it is what makes a screen reader say \"3 of 5\" rather than\n * reading five identical buttons.\n */\nexport const DefaultPageMenu = track(function DefaultPageMenu() {\n const editor = useEditor()\n const [isOpen, setIsOpen] = useGlobalMenuIsOpen(\"page-menu\")\n const [renaming, setRenaming] = useState<PageId | null>(null)\n const pages = editor.getPages()\n const currentId = editor.getCurrentPageId()\n const current = pages.find((page) => page.id === currentId)\n\n return (\n <TldrawUiDropdownMenuRoot id=\"page-menu\" open={isOpen} onOpenChange={setIsOpen}>\n <TldrawUiDropdownMenuTrigger label={`Page: ${current?.name ?? \"Untitled\"}`} className=\"mocanvas-btn--wide\">\n {current?.name ?? \"Untitled\"}\n </TldrawUiDropdownMenuTrigger>\n <TldrawUiDropdownMenuContent label=\"Pages\" side=\"below\">\n <TldrawUiMenuContextProvider type=\"menu\" sourceId=\"menu\">\n <div className=\"mocanvas-page-list\" role=\"radiogroup\" aria-label=\"Pages\">\n {pages.map((page, index) =>\n renaming === page.id ? (\n <PageItemInput key={page.id} id={page.id} name={page.name} onCancel={() => setRenaming(null)} />\n ) : (\n <div key={page.id} className=\"mocanvas-page-row\">\n <button\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={page.id === currentId}\n className=\"mocanvas-menu-item\"\n onDoubleClick={() => setRenaming(page.id)}\n onClick={() => {\n editor.setCurrentPage(page.id)\n setIsOpen(false)\n }}\n >\n {page.name}\n </button>\n <PageItemSubmenu id={page.id} index={index} total={pages.length} onRename={() => setRenaming(page.id)} />\n </div>\n ),\n )}\n </div>\n <TldrawUiMenuGroup id=\"page-menu-actions\">\n <TldrawUiMenuItem\n id=\"new-page\"\n label=\"New page\"\n icon=\"duplicate\"\n onSelect={() => {\n editor.markHistoryStoppingPoint(\"new page\")\n editor.createPage({ name: `Page ${pages.length + 1}` })\n }}\n />\n </TldrawUiMenuGroup>\n </TldrawUiMenuContextProvider>\n </TldrawUiDropdownMenuContent>\n </TldrawUiDropdownMenuRoot>\n )\n})\n\n/** Read for its side effect on the type checker only. */\nexport type TLUiPageMenuIcon = typeof TldrawUiIcon\n","import { track, useEditor } from \"@mocanvas/editor\"\nimport { useEffect, useRef, useState, type ReactNode } from \"react\"\nimport { DefaultPageMenu } from \"./panel-page\"\nimport { DefaultMainMenu, DefaultZoomMenu } from \"./panel-menus\"\nimport { useBreakpoint, PORTRAIT_BREAKPOINT } from \"./ui-breakpoint\"\nimport { TldrawUiIcon } from \"./ui-icon\"\n\n/**\n * The panels that frame the canvas: the minimap and zoom cluster at the\n * bottom-left, the menu plate at the top-left, and the strip above it.\n */\n\n/**\n * A scaled-down view of the page, with the viewport drawn on it.\n *\n * Painted into a 2D canvas rather than composed from DOM nodes: a document\n * with a thousand shapes would otherwise be a thousand absolutely-positioned\n * divs redrawn on every pan.\n */\nexport const DefaultMinimap = track(function DefaultMinimap() {\n const editor = useEditor()\n const ref = useRef<HTMLCanvasElement>(null)\n const bounds = editor.getCurrentPageBounds()\n const viewport = editor.getViewportPageBounds()\n const shapes = editor.getCurrentPageShapes()\n\n useEffect(() => {\n const canvas = ref.current\n const ctx = canvas?.getContext(\"2d\")\n if (!canvas || !ctx) return\n const dpr = window.devicePixelRatio || 1\n const { width, height } = canvas.getBoundingClientRect()\n canvas.width = Math.max(1, Math.round(width * dpr))\n canvas.height = Math.max(1, Math.round(height * dpr))\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0)\n ctx.clearRect(0, 0, width, height)\n if (!bounds || bounds.width === 0 || bounds.height === 0) return\n\n // Fit the union of the page bounds and the viewport, so panning away from\n // the content shrinks the shapes rather than sliding them out of frame.\n const minX = Math.min(bounds.minX, viewport.minX)\n const minY = Math.min(bounds.minY, viewport.minY)\n const maxX = Math.max(bounds.maxX, viewport.maxX)\n const maxY = Math.max(bounds.maxY, viewport.maxY)\n const scale = Math.min(width / (maxX - minX || 1), height / (maxY - minY || 1)) * 0.9\n const ox = (width - (maxX - minX) * scale) / 2 - minX * scale\n const oy = (height - (maxY - minY) * scale) / 2 - minY * scale\n\n ctx.fillStyle = \"rgba(127,127,127,0.5)\"\n for (const shape of shapes) {\n const box = editor.getShapePageBounds(shape)\n if (!box) continue\n ctx.fillRect(box.minX * scale + ox, box.minY * scale + oy, Math.max(1, box.width * scale), Math.max(1, box.height * scale))\n }\n ctx.strokeStyle = \"var(--mocanvas-selection, #2f6fe4)\"\n ctx.strokeStyle = \"#2f6fe4\"\n ctx.lineWidth = 1.5\n ctx.strokeRect(viewport.minX * scale + ox, viewport.minY * scale + oy, viewport.width * scale, viewport.height * scale)\n })\n\n return <canvas ref={ref} className=\"mocanvas-minimap\" aria-hidden=\"true\" style={{ width: \"100%\", height: 80, display: \"block\" }} />\n})\n\n/**\n * The zoom cluster, and the minimap above it on wide layouts.\n *\n * The minimap is dropped below the tablet breakpoint rather than shrunk: a\n * 120px-wide overview of a whiteboard shows nothing usable, and the space is\n * better spent on the buttons.\n */\nexport function DefaultNavigationPanel() {\n const editor = useEditor()\n const breakpoint = useBreakpoint()\n const showMinimap = breakpoint >= PORTRAIT_BREAKPOINT.TABLET\n return (\n <div className=\"mocanvas-panel mocanvas-navigation-panel\">\n {showMinimap ? <DefaultMinimap /> : null}\n <div className=\"mocanvas-navigation-row\" role=\"toolbar\" aria-label=\"View\">\n <button type=\"button\" className=\"mocanvas-btn\" aria-label=\"Zoom out\" data-tooltip=\"Zoom out\" onClick={() => editor.zoomOut()}>\n <TldrawUiIcon icon=\"zoom-out\" />\n </button>\n <DefaultZoomMenu />\n <button type=\"button\" className=\"mocanvas-btn\" aria-label=\"Zoom in\" data-tooltip=\"Zoom in\" onClick={() => editor.zoomIn()}>\n <TldrawUiIcon icon=\"zoom-in\" />\n </button>\n </div>\n </div>\n )\n}\n\n/** The top-left plate: the main menu and the page picker. */\nexport function DefaultMenuPanel() {\n return (\n <div className=\"mocanvas-panel mocanvas-menu-panel\">\n <DefaultMainMenu />\n <DefaultPageMenu />\n </div>\n )\n}\n\nexport interface CenteredTopPanelContainerProps {\n /** Largest width the container will take, in px. */\n maxWidth?: number\n className?: string\n children?: ReactNode\n}\n\n/**\n * Centres a panel across the top, between whatever is docked left and right.\n *\n * The margins are the two side panels' widths, so the contents are centred in\n * the space that is actually free rather than in the window — which is not the\n * same thing once the style panel is open.\n */\nexport function CenteredTopPanelContainer({ maxWidth = 480, className, children }: CenteredTopPanelContainerProps) {\n return (\n <div\n className={[\"mocanvas-top-panel\", className].filter(Boolean).join(\" \")}\n style={{\n position: \"absolute\",\n top: \"var(--mocanvas-ui-inset, 12px)\",\n left: \"calc(var(--mocanvas-ui-inset, 12px) + var(--mocanvas-ui-dock, 0px))\",\n right: \"calc(var(--mocanvas-ui-inset, 12px) + var(--mocanvas-ui-dock, 0px))\",\n maxWidth,\n marginInline: \"auto\",\n display: \"flex\",\n justifyContent: \"center\",\n pointerEvents: \"none\",\n }}\n >\n {children}\n </div>\n )\n}\n\n/**\n * The \"you are offline\" chip.\n *\n * Reads `navigator.onLine`, which is the only offline signal a canvas SDK can\n * have: whether a *sync server* is reachable is the sync layer's business, and\n * a host that has one passes its own component into the slot instead.\n */\nexport function OfflineIndicator() {\n const [online, setOnline] = useState(typeof navigator === \"undefined\" ? true : navigator.onLine)\n useEffect(() => {\n const update = () => setOnline(navigator.onLine)\n window.addEventListener(\"online\", update)\n window.addEventListener(\"offline\", update)\n return () => {\n window.removeEventListener(\"online\", update)\n window.removeEventListener(\"offline\", update)\n }\n }, [])\n if (online) return null\n return (\n <div className=\"mocanvas-panel mocanvas-offline\" role=\"status\">\n Offline\n </div>\n )\n}\n","import {\n ArrowShapeArrowheadEndStyle,\n ArrowShapeArrowheadStartStyle,\n ArrowShapeKindStyle,\n DEFAULT_COLORS,\n DefaultColorStyle,\n DefaultDashStyle,\n DefaultFillStyle,\n DefaultFontStyle,\n DefaultHorizontalAlignStyle,\n DefaultSizeStyle,\n DefaultTextAlignStyle,\n DefaultVerticalAlignStyle,\n GEO_SHAPE_KINDS,\n GeoShapeGeoStyle,\n LIGHT_THEME,\n LineShapeSplineStyle,\n track,\n useEditor,\n type EnumStyleProp,\n type SharedStyle,\n type StyleProp,\n} from \"@mocanvas/editor\"\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\"\nimport { Icon, type IconName } from \"./icons\"\nimport { useRelevantStyles } from \"./ui-actions\"\nimport { TldrawUiPopover, TldrawUiPopoverContent, TldrawUiPopoverTrigger } from \"./ui-popover\"\nimport { TldrawUiSlider } from \"./ui-slider\"\nimport { TldrawUiToolbarToggleGroup, TldrawUiToolbarToggleItem } from \"./ui-toolbar\"\nimport { useUiEvents } from \"./ui-events\"\n\n/**\n * The style panel's pickers, one per style prop.\n *\n * Three shapes cover all of them, so the concrete pickers below are almost all\n * one line: a row of buttons ({@link StylePanelButtonPicker}), a dropdown\n * ({@link StylePanelDropdownPicker}), or two dropdowns side by side\n * ({@link StylePanelDoubleDropdownPicker}, which exists for the arrowheads —\n * a pair that is one decision).\n *\n * Each has an `Inline` variant that omits the label row. The label is what\n * makes the panel readable and what makes the picker announce itself, so the\n * inline form is for the case where a caller has already supplied one — a\n * section heading, or a contextual toolbar with no room for two lines.\n */\n\n// ---------------------------------------------------------------------------\n// Panel context\n// ---------------------------------------------------------------------------\n\n/**\n * What every picker needs: the styles in play, and how to change one.\n *\n * Published as context rather than passed down, so a caller can compose the\n * panel out of individual pickers — or drop one into a contextual toolbar —\n * without re-plumbing the same three things into each.\n */\nexport interface StylePanelContext {\n styles: ReturnType<typeof useRelevantStyles>\n /** Apply a style to the selection, or to the next shape when nothing is selected. */\n setStyle<T>(style: StyleProp<T>, value: T): void\n /** Whether the panel is in its compact, popover-hosted form. */\n isMobile: boolean\n /** Whether the editor refuses edits. */\n disabled: boolean\n}\n\nconst StylePanelCtx = createContext<StylePanelContext | null>(null)\n\nexport interface StylePanelContextProviderProps {\n isMobile?: boolean\n children?: ReactNode\n}\n\n/** Publishes the style panel's context. Render inside an editor provider. */\nexport const StylePanelContextProvider = track(function StylePanelContextProvider({ isMobile = false, children }: StylePanelContextProviderProps) {\n const editor = useEditor()\n const styles = useRelevantStyles()\n const disabled = editor.getIsReadonly()\n const value = useMemo<StylePanelContext>(\n () => ({\n styles,\n isMobile,\n disabled,\n setStyle<T>(style: StyleProp<T>, next: T) {\n editor.markHistoryStoppingPoint(\"style change\")\n if (editor.getSelectedShapeIds().length > 0) editor.setStyleForSelectedShapes(style, next)\n editor.setStyleForNextShapes(style, next)\n },\n }),\n [editor, styles, isMobile, disabled],\n )\n return <StylePanelCtx.Provider value={value}>{children}</StylePanelCtx.Provider>\n})\n\n/** The style panel's context. Throws outside its provider. */\nexport function useStylePanelContext(): StylePanelContext {\n const value = useContext(StylePanelCtx)\n if (!value) throw new Error(\"useStylePanelContext: render inside <StylePanelContextProvider>.\")\n return value\n}\n\n// ---------------------------------------------------------------------------\n// Items\n// ---------------------------------------------------------------------------\n\n/** One choice in a picker: the value, and how to draw it. */\nexport interface StyleValuesForUi<T extends string> {\n value: T\n label: string\n icon?: IconName\n /** A colour swatch, for the colour picker. */\n swatch?: string\n}\n\nfunction titleCase(value: string): string {\n return value.replace(/-/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\n/** The colour choices, with their light-theme swatches. */\nexport function getColorStyleItems(): StyleValuesForUi<string>[] {\n return DEFAULT_COLORS.filter((color) => color !== \"white\").map((color) => ({\n value: color,\n label: titleCase(color),\n swatch: LIGHT_THEME[color]?.solid,\n }))\n}\n\n/** The font choices. */\nexport function getFontStyleItems(): StyleValuesForUi<string>[] {\n const fonts = [\"draw\", \"sans\", \"serif\", \"mono\"] as const\n return fonts.map((font) => ({ value: font, label: titleCase(font), icon: `font-${font}` as IconName }))\n}\n\n/** Choices built from an enum style prop, labelled by title-casing its values. */\nexport function getStyleItemsForProp<T extends string>(style: EnumStyleProp<T>, icon?: (value: T) => IconName | undefined): StyleValuesForUi<T>[] {\n return style.values.map((value) => {\n const name = icon?.(value)\n return name ? { value, label: titleCase(value), icon: name } : { value, label: titleCase(value) }\n })\n}\n\n/** The shared value of a style, or `undefined` when the style is not in play. */\nfunction useSharedValue<T>(style: StyleProp<T>): SharedStyle<T> | undefined {\n const { styles } = useStylePanelContext()\n return styles?.get(style) as SharedStyle<T> | undefined\n}\n\n// ---------------------------------------------------------------------------\n// Layout\n// ---------------------------------------------------------------------------\n\nexport interface StylePanelSectionProps {\n label?: string\n className?: string\n children?: ReactNode\n}\n\n/** A band of related rows, ruled off from its neighbours. */\nexport function StylePanelSection({ label, className, children }: StylePanelSectionProps) {\n return (\n <div className={[\"mocanvas-group\", className].filter(Boolean).join(\" \")} {...(label ? { role: \"group\", \"aria-label\": label } : {})}>\n {children}\n </div>\n )\n}\n\nexport interface StylePanelSubheadingProps {\n /** Shown when the selection's values for this style disagree. */\n mixed?: boolean\n /** Rendered at the end of the row, e.g. an opacity percentage. */\n aside?: ReactNode\n children?: ReactNode\n}\n\n/** A row's label, with the \"mixed\" marker when the selection disagrees. */\nexport function StylePanelSubheading({ mixed, aside, children }: StylePanelSubheadingProps) {\n return (\n <div className=\"mocanvas-row-label\">\n <span>{children}</span>\n {mixed ? (\n <span className=\"mocanvas-mixed\">\n <Icon name=\"mixed\" size={11} />\n mixed\n </span>\n ) : (\n aside\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// The three picker shapes\n// ---------------------------------------------------------------------------\n\nexport interface StylePanelButtonPickerProps<T extends string> {\n /** The style being edited. */\n style: StyleProp<T>\n label: string\n items: readonly StyleValuesForUi<T>[]\n /** Show colour swatches rather than icons. */\n swatches?: boolean\n className?: string\n}\n\n/**\n * A row of buttons, one per value: the shape for a style with four or five\n * choices that each have a glyph — fill, dash, size, alignment.\n */\nexport function StylePanelButtonPickerInline<T extends string>({ style, label, items, swatches, className }: StylePanelButtonPickerProps<T>) {\n const { setStyle, disabled } = useStylePanelContext()\n const shared = useSharedValue(style)\n const trackEvent = useUiEvents()\n const current = shared?.type === \"shared\" ? (shared.value as string) : undefined\n return (\n <TldrawUiToolbarToggleGroup\n label={label}\n type=\"single\"\n {...(current === undefined ? {} : { value: current })}\n className={[swatches ? \"mocanvas-swatches\" : \"mocanvas-seg\", className].filter(Boolean).join(\" \")}\n onValueChange={(value) => {\n setStyle(style, value as T)\n trackEvent(\"set-style\", { source: \"menu\", id: label, value })\n }}\n >\n {items.map((item) => (\n <TldrawUiToolbarToggleItem\n key={item.value}\n value={item.value}\n title={item.label}\n disabled={disabled}\n {...(swatches ? { className: \"mocanvas-swatch\" } : {})}\n >\n {swatches ? <span style={{ [\"--mocanvas-swatch-color\" as string]: item.swatch }} /> : item.icon ? <Icon name={item.icon} /> : item.label}\n </TldrawUiToolbarToggleItem>\n ))}\n </TldrawUiToolbarToggleGroup>\n )\n}\n\n/** {@link StylePanelButtonPickerInline} with its label row. */\nexport function StylePanelButtonPicker<T extends string>(props: StylePanelButtonPickerProps<T>) {\n const shared = useSharedValue(props.style)\n return (\n <div className=\"mocanvas-style-row\">\n <StylePanelSubheading mixed={shared?.type === \"mixed\"}>{props.label}</StylePanelSubheading>\n <StylePanelButtonPickerInline {...props} />\n </div>\n )\n}\n\nexport interface StylePanelDropdownPickerProps<T extends string> {\n style: StyleProp<T>\n label: string\n items: readonly StyleValuesForUi<T>[]\n /** Columns in the popover grid. */\n columns?: number\n id?: string\n}\n\n/**\n * A button that opens a grid of choices: the shape for a style with too many\n * values to sit in a row — the twenty geo kinds, most obviously.\n */\nexport function StylePanelDropdownPickerInline<T extends string>({ style, label, items, columns = 5, id }: StylePanelDropdownPickerProps<T>) {\n const { setStyle, disabled } = useStylePanelContext()\n const shared = useSharedValue(style)\n const current = shared?.type === \"shared\" ? (shared.value as T) : null\n const currentItem = items.find((item) => item.value === current)\n return (\n <TldrawUiPopover {...(id ? { id } : {})} side=\"below\">\n <TldrawUiPopoverTrigger className=\"mocanvas-picker\">\n <span>\n {currentItem?.icon ? <Icon name={currentItem.icon} /> : <Icon name=\"mixed\" />}\n {currentItem?.label ?? \"Mixed\"}\n </span>\n <Icon name=\"chevron-down\" size={16} />\n </TldrawUiPopoverTrigger>\n <TldrawUiPopoverContent label={label}>\n <div className=\"mocanvas-popover-grid\" role=\"radiogroup\" aria-label={label} style={{ [\"--mocanvas-popover-cols\" as string]: columns }}>\n {items.map((item) => (\n <button\n key={item.value}\n type=\"button\"\n role=\"radio\"\n className=\"mocanvas-btn\"\n aria-checked={current === item.value}\n aria-label={item.label}\n data-tooltip={item.label}\n disabled={disabled}\n onClick={() => setStyle(style, item.value)}\n >\n {item.icon ? <Icon name={item.icon} /> : item.label}\n </button>\n ))}\n </div>\n </TldrawUiPopoverContent>\n </TldrawUiPopover>\n )\n}\n\n/** {@link StylePanelDropdownPickerInline} with its label row. */\nexport function StylePanelDropdownPicker<T extends string>(props: StylePanelDropdownPickerProps<T>) {\n const shared = useSharedValue(props.style)\n return (\n <div className=\"mocanvas-style-row\">\n <StylePanelSubheading mixed={shared?.type === \"mixed\"}>{props.label}</StylePanelSubheading>\n <StylePanelDropdownPickerInline {...props} />\n </div>\n )\n}\n\nexport interface StylePanelDoubleDropdownPickerProps<T extends string> {\n label: string\n labelA: string\n labelB: string\n styleA: StyleProp<T>\n styleB: StyleProp<T>\n items: readonly StyleValuesForUi<T>[]\n}\n\n/**\n * Two dropdowns under one label: the arrowheads, which are two styles but one\n * decision, and which read as unrelated when split into two rows.\n */\nexport function StylePanelDoubleDropdownPickerInline<T extends string>({ labelA, labelB, styleA, styleB, items }: StylePanelDoubleDropdownPickerProps<T>) {\n return (\n <div className=\"mocanvas-seg mocanvas-seg--split\">\n <StylePanelDropdownPickerInline style={styleA} label={labelA} items={items} />\n <StylePanelDropdownPickerInline style={styleB} label={labelB} items={items} />\n </div>\n )\n}\n\n/** {@link StylePanelDoubleDropdownPickerInline} with its label row. */\nexport function StylePanelDoubleDropdownPicker<T extends string>(props: StylePanelDoubleDropdownPickerProps<T>) {\n return (\n <div className=\"mocanvas-style-row\">\n <StylePanelSubheading>{props.label}</StylePanelSubheading>\n <StylePanelDoubleDropdownPickerInline {...props} />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// The concrete pickers\n// ---------------------------------------------------------------------------\n\n/** Shape colour. Renders nothing when the selection carries no colour. */\nexport function StylePanelColorPicker() {\n const { styles } = useStylePanelContext()\n if (!styles?.get(DefaultColorStyle)) return null\n return <StylePanelButtonPicker style={DefaultColorStyle} label=\"Colour\" items={getColorStyleItems()} swatches />\n}\n\nconst FILL_ICONS: Record<string, IconName> = { none: \"fill-none\", semi: \"fill-semi\", solid: \"fill-solid\", pattern: \"fill-pattern\" }\nconst DASH_ICONS: Record<string, IconName> = { draw: \"dash-draw\", solid: \"dash-solid\", dashed: \"dash-dashed\", dotted: \"dash-dotted\" }\nconst SIZE_ICONS: Record<string, IconName> = { s: \"size-s\", m: \"size-m\", l: \"size-l\", xl: \"size-xl\" }\nconst H_ALIGN_ICONS: Record<string, IconName> = { start: \"align-left\", middle: \"align-center\", end: \"align-right\" }\nconst V_ALIGN_ICONS: Record<string, IconName> = { start: \"valign-top\", middle: \"valign-middle\", end: \"valign-bottom\" }\n\n/** Fill style. */\nexport function StylePanelFillPicker() {\n const { styles } = useStylePanelContext()\n if (!styles?.get(DefaultFillStyle)) return null\n return <StylePanelButtonPicker style={DefaultFillStyle} label=\"Fill\" items={getStyleItemsForProp(DefaultFillStyle, (v) => FILL_ICONS[v])} />\n}\n\n/** Dash style. */\nexport function StylePanelDashPicker() {\n const { styles } = useStylePanelContext()\n if (!styles?.get(DefaultDashStyle)) return null\n return <StylePanelButtonPicker style={DefaultDashStyle} label=\"Dash\" items={getStyleItemsForProp(DefaultDashStyle, (v) => DASH_ICONS[v])} />\n}\n\n/** Stroke size. */\nexport function StylePanelSizePicker() {\n const { styles } = useStylePanelContext()\n if (!styles?.get(DefaultSizeStyle)) return null\n return <StylePanelButtonPicker style={DefaultSizeStyle} label=\"Size\" items={getStyleItemsForProp(DefaultSizeStyle, (v) => SIZE_ICONS[v])} />\n}\n\n/** Font family. */\nexport function StylePanelFontPicker() {\n const { styles } = useStylePanelContext()\n if (!styles?.get(DefaultFontStyle)) return null\n return <StylePanelButtonPicker style={DefaultFontStyle} label=\"Font\" items={getFontStyleItems() as StyleValuesForUi<string>[]} />\n}\n\n/** Where the label sits inside its shape. */\nexport function StylePanelLabelAlignPicker() {\n const { styles } = useStylePanelContext()\n if (!styles?.get(DefaultHorizontalAlignStyle)) return null\n return (\n <>\n <StylePanelButtonPicker style={DefaultHorizontalAlignStyle} label=\"Align\" items={getStyleItemsForProp(DefaultHorizontalAlignStyle, (v) => H_ALIGN_ICONS[v])} />\n {styles?.get(DefaultVerticalAlignStyle) ? (\n <StylePanelButtonPicker style={DefaultVerticalAlignStyle} label=\"Vertical align\" items={getStyleItemsForProp(DefaultVerticalAlignStyle, (v) => V_ALIGN_ICONS[v])} />\n ) : null}\n </>\n )\n}\n\n/** How the text is aligned within the label box. */\nexport function StylePanelTextAlignPicker() {\n const { styles } = useStylePanelContext()\n if (!styles?.get(DefaultTextAlignStyle)) return null\n return <StylePanelButtonPicker style={DefaultTextAlignStyle} label=\"Text align\" items={getStyleItemsForProp(DefaultTextAlignStyle, (v) => H_ALIGN_ICONS[v])} />\n}\n\n/** The geo kind. */\nexport function StylePanelGeoShapePicker() {\n const { styles } = useStylePanelContext()\n if (!styles?.get(GeoShapeGeoStyle)) return null\n const items = GEO_SHAPE_KINDS.map((kind) => ({ value: kind, label: titleCase(kind), icon: `geo-${kind}` as IconName }))\n return <StylePanelDropdownPicker style={GeoShapeGeoStyle} label=\"Shape\" items={items} id=\"geo-picker\" />\n}\n\n/** How a line interpolates between its points. */\nexport function StylePanelSplinePicker() {\n const { styles } = useStylePanelContext()\n if (!styles?.get(LineShapeSplineStyle)) return null\n return <StylePanelDropdownPicker style={LineShapeSplineStyle} label=\"Spline\" items={getStyleItemsForProp(LineShapeSplineStyle)} id=\"spline-picker\" />\n}\n\n/** How an arrow's body is routed. */\nexport function StylePanelArrowKindPicker() {\n const { styles } = useStylePanelContext()\n if (!styles?.get(ArrowShapeKindStyle)) return null\n return <StylePanelDropdownPicker style={ArrowShapeKindStyle} label=\"Arrow kind\" items={getStyleItemsForProp(ArrowShapeKindStyle)} id=\"arrow-kind-picker\" />\n}\n\n/** The two arrowheads. */\nexport function StylePanelArrowheadPicker() {\n const { styles } = useStylePanelContext()\n if (!styles?.get(ArrowShapeArrowheadStartStyle)) return null\n return (\n <StylePanelDoubleDropdownPicker\n label=\"Arrowheads\"\n labelA=\"Start\"\n labelB=\"End\"\n styleA={ArrowShapeArrowheadStartStyle}\n styleB={ArrowShapeArrowheadEndStyle}\n items={getStyleItemsForProp(ArrowShapeArrowheadStartStyle)}\n />\n )\n}\n\n/** How many steps the opacity slider has. */\nconst OPACITY_STEPS = 4\nconst OPACITY_VALUES = [0.1, 0.25, 0.5, 0.75, 1] as const\n\n/**\n * Shape opacity.\n *\n * Not a style prop — opacity lives on the shape record — so this reads and\n * writes the selection directly. Stepped rather than continuous, so a value\n * chosen on one shape can be matched exactly on another.\n */\nexport const StylePanelOpacityPicker = track(function StylePanelOpacityPicker() {\n const editor = useEditor()\n const shapes = editor.getSelectedShapes()\n if (shapes.length === 0) return null\n const first = shapes[0]!.opacity\n const mixed = shapes.some((shape) => shape.opacity !== first)\n const index = OPACITY_VALUES.findIndex((value) => Math.abs(value - first) < 0.001)\n return (\n <div className=\"mocanvas-style-row\">\n <StylePanelSubheading mixed={mixed} aside={<span>{Math.round(first * 100)}%</span>}>\n Opacity\n </StylePanelSubheading>\n <TldrawUiSlider\n value={mixed ? null : index < 0 ? OPACITY_STEPS : index}\n steps={OPACITY_STEPS}\n label=\"Opacity\"\n onHistoryMark={(id) => editor.markHistoryStoppingPoint(id)}\n onValueChange={(value) => editor.setOpacityForSelectedShapes(OPACITY_VALUES[value] ?? 1)}\n />\n </div>\n )\n})\n","import { track, useEditor } from \"@mocanvas/editor\"\nimport { useRelevantStyles } from \"./ui-actions\"\nimport { useBreakpoint, PORTRAIT_BREAKPOINT } from \"./ui-breakpoint\"\nimport { TldrawUiPopover, TldrawUiPopoverContent, TldrawUiPopoverTrigger } from \"./ui-popover\"\nimport { Icon } from \"./icons\"\nimport {\n StylePanelArrowKindPicker,\n StylePanelArrowheadPicker,\n StylePanelColorPicker,\n StylePanelContextProvider,\n StylePanelDashPicker,\n StylePanelFillPicker,\n StylePanelFontPicker,\n StylePanelGeoShapePicker,\n StylePanelLabelAlignPicker,\n StylePanelOpacityPicker,\n StylePanelSection,\n StylePanelSizePicker,\n StylePanelSplinePicker,\n StylePanelTextAlignPicker,\n} from \"./style-pickers\"\nimport type { TLUiStylePanelProps } from \"./ui-components\"\n\n/**\n * The style panel, composed from the pickers.\n *\n * Every picker decides for itself whether it applies, so the panel's own job\n * is only the frame and the order. That is what makes replacing the *content*\n * a matter of listing different pickers, rather than reimplementing the\n * \"which rows apply?\" rule that used to live in the panel.\n */\n\n/** The pickers, in the order the panel shows them. */\nexport function DefaultStylePanelContent() {\n return (\n <>\n <StylePanelSection label=\"Shape\">\n <StylePanelGeoShapePicker />\n <StylePanelSplinePicker />\n <StylePanelArrowKindPicker />\n </StylePanelSection>\n <StylePanelSection label=\"Colour\">\n <StylePanelColorPicker />\n </StylePanelSection>\n <StylePanelSection label=\"Stroke\">\n <StylePanelFillPicker />\n <StylePanelDashPicker />\n <StylePanelSizePicker />\n <StylePanelArrowheadPicker />\n </StylePanelSection>\n <StylePanelSection label=\"Text\">\n <StylePanelFontPicker />\n <StylePanelTextAlignPicker />\n <StylePanelLabelAlignPicker />\n </StylePanelSection>\n <StylePanelSection label=\"Shape opacity\">\n <StylePanelOpacityPicker />\n </StylePanelSection>\n </>\n )\n}\n\n/**\n * The docked style panel.\n *\n * Renders nothing at all when no style applies — an empty panel in the corner\n * is worse than no panel, because it reads as broken rather than as\n * inapplicable.\n */\nexport const DefaultStylePanel = track(function DefaultStylePanel({ isMobile = false, children }: TLUiStylePanelProps) {\n const styles = useRelevantStyles()\n const editor = useEditor()\n const hasSelection = editor.getSelectedShapeIds().length > 0\n if (!styles && !hasSelection) return null\n return (\n <StylePanelContextProvider isMobile={isMobile}>\n <div className=\"mocanvas-panel mocanvas-stylepanel\" role=\"region\" aria-label=\"Style\">\n {children ?? <DefaultStylePanelContent />}\n </div>\n </StylePanelContextProvider>\n )\n})\n\n/**\n * The style panel as a popover, for narrow layouts.\n *\n * The trigger is a colour swatch showing the current colour, which is the one\n * style a user is most likely to be reaching for and the only one that can be\n * shown legibly in a single button.\n */\nexport const MobileStylePanel = track(function MobileStylePanel() {\n const editor = useEditor()\n const styles = useRelevantStyles()\n const disabled = editor.getIsReadonly()\n if (!styles) return null\n return (\n <TldrawUiPopover id=\"mobile-style-panel\" side=\"above\">\n <TldrawUiPopoverTrigger className={disabled ? \"mocanvas-btn mocanvas-btn--disabled\" : \"mocanvas-btn\"}>\n <Icon name=\"fill-solid\" />\n </TldrawUiPopoverTrigger>\n <TldrawUiPopoverContent label=\"Style\">\n <StylePanelContextProvider isMobile>\n <div className=\"mocanvas-stylepanel mocanvas-stylepanel--mobile\">\n <DefaultStylePanelContent />\n </div>\n </StylePanelContextProvider>\n </TldrawUiPopoverContent>\n </TldrawUiPopover>\n )\n})\n\n/**\n * The style panel in whichever form the layout calls for.\n *\n * The breakpoint decides, not the caller: a panel that is docked on a phone\n * covers most of the canvas, and one that is a popover on a desktop wastes the\n * space it has.\n */\nexport function ResponsiveStylePanel() {\n const breakpoint = useBreakpoint()\n return breakpoint < PORTRAIT_BREAKPOINT.TABLET_SM ? <MobileStylePanel /> : <DefaultStylePanel />\n}\n","import { track, useEditor, useValue, type InstancePresence, type UserId } from \"@mocanvas/editor\"\nimport { useState, type ReactNode } from \"react\"\nimport { TldrawUiInput } from \"./ui-input\"\nimport { TldrawUiPopover, TldrawUiPopoverContent, TldrawUiPopoverTrigger } from \"./ui-popover\"\nimport type {\n DefaultPeopleMenuContentProps,\n DefaultPeopleMenuProps,\n TLUiPeopleMenuAvatarProps,\n TLUiPeopleMenuFacePileProps,\n TLUiPeopleMenuItemProps,\n} from \"./ui-components\"\n\n/**\n * Who else is here.\n *\n * The presence *records* are the editor's; this is only their chrome. It\n * renders from `editor.getVisibleCollaboratorsOnCurrentPage()`, which already\n * excludes people whose tab has gone idle — so an abandoned tab does not sit\n * in the face pile forever.\n */\n\n/** The ids of everyone else on this page. */\nexport function usePeerIds(): UserId[] {\n const editor = useEditor()\n return useValue(\"peerIds\", () => editor.getVisibleCollaboratorsOnCurrentPage().map((peer) => peer.userId), [editor])\n}\n\n/** One person's presence record, or `null` when they have left. */\nexport function usePresence(userId: UserId): InstancePresence | null {\n const editor = useEditor()\n return useValue(\"presence\", () => editor.getVisibleCollaboratorsOnCurrentPage().find((peer) => peer.userId === userId) ?? null, [editor, userId])\n}\n\n/** Everyone else on this page. */\nexport function usePeers(): InstancePresence[] {\n const editor = useEditor()\n return useValue(\"peers\", () => editor.getVisibleCollaboratorsOnCurrentPage(), [editor])\n}\n\n/**\n * Whether to show collaboration chrome at all.\n *\n * False when nobody else is here: a \"people\" button on a document nobody else\n * has ever opened is chrome that never does anything.\n */\nexport function useShowCollaborationUi(): boolean {\n return usePeers().length > 0\n}\n\n/**\n * A coarse status for the collaboration chrome.\n *\n * mocanvas's editor has no transport of its own — sync is a separate package —\n * so this reports what the editor can actually see: whether there is anyone\n * else present. A host with a real connection passes its own indicator into\n * the `SharePanel` slot.\n */\nexport function useCollaborationStatus(): \"offline\" | \"online\" {\n return useShowCollaborationUi() ? \"online\" : \"offline\"\n}\n\n/** Initials for an avatar: at most two, from the first and last word. */\nfunction initials(name: string): string {\n const words = name.trim().split(/\\s+/).filter(Boolean)\n if (words.length === 0) return \"?\"\n const first = words[0]![0] ?? \"\"\n const last = words.length > 1 ? (words[words.length - 1]![0] ?? \"\") : \"\"\n return (first + last).toUpperCase()\n}\n\n/** One person's avatar: their colour, and their initials. */\nexport function DefaultPeopleMenuAvatar({ color, name, size = 24 }: TLUiPeopleMenuAvatarProps) {\n return (\n <span\n className=\"mocanvas-avatar\"\n title={name}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: size,\n height: size,\n borderRadius: \"50%\",\n background: color,\n color: \"#fff\",\n fontSize: Math.round(size * 0.42),\n fontWeight: 600,\n }}\n aria-hidden=\"true\"\n >\n {initials(name)}\n </span>\n )\n}\n\n/**\n * The overlapping avatars on the people menu's trigger.\n *\n * `aria-hidden`, with the count announced by the trigger's own label: reading\n * out five initials is not how anyone wants to be told who is in the room.\n */\nexport function DefaultPeopleMenuFacePile({ users, max = 3 }: TLUiPeopleMenuFacePileProps) {\n const shown = users.slice(0, max)\n const extra = users.length - shown.length\n return (\n <span className=\"mocanvas-face-pile\" style={{ display: \"inline-flex\" }} aria-hidden=\"true\">\n {shown.map((user, i) => (\n <span key={user.userId} style={{ marginLeft: i === 0 ? 0 : -8 }}>\n <DefaultPeopleMenuAvatar color={user.color} name={user.name} size={22} />\n </span>\n ))}\n {extra > 0 ? <span className=\"mocanvas-face-pile-more\">+{extra}</span> : null}\n </span>\n )\n}\n\n/** One row in the collaborator list; clicking it follows that person's camera. */\nexport function DefaultPeopleMenuItem({ color, name, isFollowing, onFollow }: TLUiPeopleMenuItemProps) {\n return (\n <button type=\"button\" role=\"menuitemcheckbox\" aria-checked={isFollowing ?? false} className=\"mocanvas-menu-item\" onClick={() => onFollow?.()}>\n <DefaultPeopleMenuAvatar color={color} name={name} size={20} />\n <span className=\"mocanvas-menu-item-label\">{name}</span>\n {isFollowing ? <span className=\"mocanvas-menu-item-note\">Following</span> : null}\n </button>\n )\n}\n\n/** The collaborator list, plus the local person's own name and colour. */\nexport const DefaultPeopleMenuContent = track(function DefaultPeopleMenuContent({ children }: DefaultPeopleMenuContentProps) {\n const editor = useEditor()\n const peers = usePeers()\n const followingId = editor.getFollowingUserId()\n return (\n <>\n <DefaultUserPresenceEditor />\n <div className=\"mocanvas-people-list\" role=\"menu\" aria-label=\"People\">\n {peers.map((peer) => (\n <DefaultPeopleMenuItem\n key={peer.userId}\n userId={peer.userId}\n color={peer.color}\n name={peer.userName}\n isFollowing={followingId === peer.userId}\n onFollow={() => (followingId === peer.userId ? editor.stopFollowingUser() : editor.startFollowingUser(peer.userId))}\n />\n ))}\n </div>\n {children}\n </>\n )\n})\n\n/** The people menu. Renders nothing when nobody else is here. */\nexport const DefaultPeopleMenu = track(function DefaultPeopleMenu({ children }: DefaultPeopleMenuProps) {\n const peers = usePeers()\n if (peers.length === 0) return null\n const users = peers.map((peer) => ({ userId: peer.userId as string, color: peer.color, name: peer.userName }))\n return (\n <TldrawUiPopover id=\"people-menu\" side=\"below\">\n <TldrawUiPopoverTrigger className=\"mocanvas-btn mocanvas-btn--wide\">\n <DefaultPeopleMenuFacePile users={users} />\n <span className=\"sr-only\">{`${peers.length} other ${peers.length === 1 ? \"person\" : \"people\"} here`}</span>\n </TldrawUiPopoverTrigger>\n <TldrawUiPopoverContent label=\"People\">\n <DefaultPeopleMenuContent>{children}</DefaultPeopleMenuContent>\n </TldrawUiPopoverContent>\n </TldrawUiPopover>\n )\n})\n\n/** The local person's name and cursor colour. */\nexport const DefaultUserPresenceEditor = track(function DefaultUserPresenceEditor() {\n const editor = useEditor()\n const name = editor.user.getName()\n const color = editor.user.getColor()\n return (\n <div className=\"mocanvas-presence-editor\">\n <label className=\"mocanvas-presence-color\">\n <span className=\"sr-only\">Your colour</span>\n <input type=\"color\" value={color} onChange={(event) => editor.user.setColor(event.target.value)} />\n </label>\n <TldrawUiInput value={name} label=\"Your name\" placeholder=\"Your name\" onComplete={(next) => editor.user.setName(next)} />\n </div>\n )\n})\n\n/**\n * The banner shown while the camera is following someone.\n *\n * Also the way out of it: a user who cannot see how to stop following is\n * trapped, since their own panning is being overridden.\n */\nexport const DefaultFollowingIndicator = track(function DefaultFollowingIndicator() {\n const editor = useEditor()\n const followingId = editor.getFollowingUserId()\n if (!followingId) return null\n const peer = editor.getVisibleCollaboratorsOnCurrentPage().find((p) => p.userId === followingId)\n return (\n <div className=\"mocanvas-following-indicator\" role=\"status\" style={{ borderColor: peer?.color }}>\n <span>Following {peer?.userName ?? \"someone\"}</span>\n <button type=\"button\" className=\"mocanvas-btn\" onClick={() => editor.stopFollowingUser()}>\n Stop\n </button>\n </div>\n )\n})\n\n/** The top-right panel: who is here. */\nexport function DefaultSharePanel() {\n return (\n <div className=\"mocanvas-panel mocanvas-share-panel\">\n <DefaultPeopleMenu />\n </div>\n )\n}\n\n/**\n * The cursor-chat entry field.\n *\n * A local-only overlay: it publishes nothing on its own, and calls\n * `onSubmit` so a host with a transport can send the message. That keeps\n * cursor chat available as chrome without mocanvas pretending to have a\n * message channel.\n */\nexport function CursorChatItem({ onSubmit }: { onSubmit?(text: string): void }): ReactNode {\n const [text, setText] = useState(\"\")\n return (\n <div className=\"mocanvas-cursor-chat\">\n <TldrawUiInput\n value={text}\n label=\"Cursor chat\"\n placeholder=\"Say something\"\n onValueChange={setText}\n onComplete={(value) => {\n if (value.trim()) onSubmit?.(value.trim())\n setText(\"\")\n }}\n />\n </div>\n )\n}\n","import { track, useEditor } from \"@mocanvas/editor\"\nimport { Icon } from \"./icons\"\nimport { TldrawUiContextualToolbar } from \"./ui-contextual-toolbar\"\nimport { TldrawUiToolbarButton } from \"./ui-toolbar\"\nimport type { TLUiRichTextToolbarProps } from \"./ui-components\"\n\n/**\n * The formatting bar over a text shape that is being edited.\n *\n * Follows the shape rather than docking, because the thing being formatted is\n * on the canvas and a docked bar makes the user look away from it to press a\n * button.\n */\n\nexport interface DefaultRichTextToolbarContentProps {\n /** Which marks to offer. Defaults to bold, italic, strikethrough, code, link. */\n marks?: readonly string[]\n}\n\n/** The formatting buttons. */\nexport function DefaultRichTextToolbarContent({ marks: only }: DefaultRichTextToolbarContentProps = {}) {\n const editor = useEditor()\n // SEMANTICS-ASSUMED: the editor stores whatever rich-text editor the host\n // attached, without a type of its own (TipTap is an optional peer\n // dependency). The bar asks for the two methods it needs and falls back to\n // rendering nothing when they are absent.\n const rich = editor.getRichTextEditor() as { isActive?(mark: string): boolean; toggleMark?(mark: string): void } | null\n\n // Without a rich-text editor attached there is no mark to toggle, so the bar\n // offers nothing rather than offering buttons that do nothing.\n if (!rich) return null\n\n const marks = [\n { id: \"bold\", label: \"Bold\", glyph: \"B\", weight: 700 },\n { id: \"italic\", label: \"Italic\", glyph: \"I\", style: \"italic\" as const },\n { id: \"strike\", label: \"Strikethrough\", glyph: \"S\", decoration: \"line-through\" as const },\n { id: \"code\", label: \"Code\", glyph: \"<>\" },\n ]\n\n const shown = only ? marks.filter((mark) => only.includes(mark.id)) : marks\n\n return (\n <>\n {shown.map((mark) => (\n <TldrawUiToolbarButton\n key={mark.id}\n type=\"icon\"\n title={mark.label}\n isActive={rich.isActive?.(mark.id) ?? false}\n onClick={() => rich.toggleMark?.(mark.id)}\n >\n <span style={{ fontWeight: mark.weight, fontStyle: mark.style, textDecoration: mark.decoration }}>{mark.glyph}</span>\n </TldrawUiToolbarButton>\n ))}\n <TldrawUiToolbarButton type=\"icon\" title=\"Link\" isActive={rich.isActive?.(\"link\") ?? false} onClick={() => rich.toggleMark?.(\"link\")}>\n <Icon name=\"line\" />\n </TldrawUiToolbarButton>\n </>\n )\n}\n\n/**\n * The rich-text bar. Shown only while a shape's text is being edited, and\n * hidden while the pointer is down so it does not chase a drag.\n */\nexport const DefaultRichTextToolbar = track(function DefaultRichTextToolbar({ children }: TLUiRichTextToolbarProps) {\n const editor = useEditor()\n const editingId = editor.getEditingShapeId()\n if (!editingId) return null\n const bounds = editor.getShapePageBounds(editingId)\n if (!bounds) return null\n return (\n <TldrawUiContextualToolbar label=\"Text formatting\" getSelectionBounds={() => ({ x: bounds.minX, y: bounds.minY, w: bounds.width, h: bounds.height })}>\n {children ?? <DefaultRichTextToolbarContent />}\n </TldrawUiContextualToolbar>\n )\n})\n","import { atom, track, useEditor, useValue } from \"@mocanvas/editor\"\nimport type { Atom } from \"@mocanvas/state\"\nimport type { ReactNode } from \"react\"\n\n/**\n * Debug flags: named booleans an app can flip at runtime, and the panel that\n * lists them.\n *\n * Kept out of the store on purpose. A debug flag is a property of *this\n * session's developer*, not of the document, and putting one in the store\n * would sync it to everyone else in the room.\n */\n\n/** One flag: a name, a default, and the signal holding its current value. */\nexport interface DebugFlagDef<T> {\n name: string\n defaultValue: T\n /** Show it in the debug panel. */\n shouldStore?: boolean\n value: Atom<T>\n}\n\n/** A boolean debug flag. */\nexport type DebugFlag<T = boolean> = DebugFlagDef<T>\n\n/** Every flag that has been created, in creation order. */\nconst registry: DebugFlagDef<unknown>[] = []\n\n/** Create a flag of any type. */\nexport function createDebugValue<T>(name: string, defaultValue: T, shouldStore = true): DebugFlagDef<T> {\n const flag: DebugFlagDef<T> = { name, defaultValue, shouldStore, value: atom(`debug:${name}`, defaultValue) }\n registry.push(flag as DebugFlagDef<unknown>)\n return flag\n}\n\n/** Create a boolean flag. */\nexport function createDebugFlag(name: string, defaultValue = false): DebugFlag {\n return createDebugValue(name, defaultValue)\n}\n\n/** Every registered flag. */\nexport function getDebugFlags(): readonly DebugFlagDef<unknown>[] {\n return registry\n}\n\n/** What every flag resolves to before anything has been changed. */\nexport const DebugFlagDefaults = {\n debugSvg: false,\n debugGeometry: false,\n showCullingOutlines: false,\n logPointerEvents: false,\n throwToBlob: false,\n} as const\n\n/** The flags mocanvas itself reads. */\nexport const debugFlags = {\n debugSvg: createDebugFlag(\"debugSvg\"),\n debugGeometry: createDebugFlag(\"debugGeometry\"),\n showCullingOutlines: createDebugFlag(\"showCullingOutlines\"),\n logPointerEvents: createDebugFlag(\"logPointerEvents\"),\n throwToBlob: createDebugFlag(\"throwToBlob\"),\n}\n\n/** Flags an app adds of its own. Extend it through {@link createDebugFlag}. */\nexport interface CustomDebugFlags {\n [name: string]: DebugFlagDef<unknown>\n}\n\n/** Longer-lived switches for work in progress. Same mechanism as a debug flag. */\nexport const featureFlags: CustomDebugFlags = {}\n\n/** Register a feature flag. */\nexport function createFeatureFlag(name: string, defaultValue = false): DebugFlag {\n const flag = createDebugFlag(name, defaultValue)\n featureFlags[name] = flag as DebugFlagDef<unknown>\n return flag\n}\n\nfunction FlagRow({ flag }: { flag: DebugFlagDef<unknown> }) {\n const value = useValue(flag.value)\n if (typeof value !== \"boolean\") return null\n return (\n <label className=\"mocanvas-debug-flag\">\n <input type=\"checkbox\" checked={value} onChange={(event) => flag.value.set(event.target.checked)} />\n {flag.name}\n </label>\n )\n}\n\nexport interface DebugFlagsProps {\n children?: ReactNode\n}\n\n/** The debug flag list. */\nexport function DebugFlags({ children }: DebugFlagsProps) {\n const flags = getDebugFlags().filter((flag) => flag.shouldStore && !(flag.name in featureFlags))\n return (\n <div className=\"mocanvas-debug-flags\" role=\"group\" aria-label=\"Debug flags\">\n {flags.map((flag) => (\n <FlagRow key={flag.name} flag={flag} />\n ))}\n {children}\n </div>\n )\n}\n\nexport interface FeatureFlagsProps {\n children?: ReactNode\n}\n\n/** The feature flag list. */\nexport function FeatureFlags({ children }: FeatureFlagsProps) {\n const flags = Object.values(featureFlags)\n if (flags.length === 0) return null\n return (\n <div className=\"mocanvas-debug-flags\" role=\"group\" aria-label=\"Feature flags\">\n {flags.map((flag) => (\n <FlagRow key={flag.name} flag={flag} />\n ))}\n {children}\n </div>\n )\n}\n\n/**\n * The frame-statistics chip.\n *\n * Named for the chrome slot it fills rather than for what it shows, because\n * what it shows is whatever is worth watching — and an app replacing it is\n * filling the \"small numbers in the corner\" hole, not committing to these\n * particular numbers.\n */\nexport const DefaultDebugPanel = track(function DefaultDebugPanel() {\n const editor = useEditor()\n const stats = editor.getLastFrameStats()\n return (\n <div className=\"mocanvas-panel mocanvas-stats\" role=\"status\" aria-label=\"Frame statistics\">\n <span>\n <b>{editor.getCurrentPageShapeIds().size}</b> shapes\n </span>\n <span>\n <b>{stats.drawn}</b> drawn · <b>{stats.culled}</b> culled\n </span>\n <span>\n <b>{stats.ms.toFixed(2)}</b> ms/frame\n </span>\n </div>\n )\n})\n","import { GeoShapeGeoStyle, track, useEditor, useIsToolSelected, useTools, type GeoShapeKind } from \"@mocanvas/editor\"\nimport { Children, useEffect, useRef, useState, type ReactNode } from \"react\"\nimport { Icon, ICONS, type IconName } from \"./icons\"\nimport { TldrawUiPopover, TldrawUiPopoverContent, TldrawUiPopoverTrigger } from \"./ui-popover\"\nimport { TldrawUiToolbar, TldrawUiToolbarButton } from \"./ui-toolbar\"\nimport { MobileStylePanel } from \"./panel-style\"\nimport { useBreakpoint, PORTRAIT_BREAKPOINT } from \"./ui-breakpoint\"\n\n/**\n * The toolbar's buttons, one exported component per tool.\n *\n * They are components rather than a data list so a caller can compose its own\n * bar out of exactly the tools it wants — `<DrawToolbarItem />\n * <EraserToolbarItem />` — while each button keeps the behaviour that makes it\n * correct: it reads the tool from the UI tool list, so it disappears when the\n * tool is not registered, follows an override's relabelling, and shows itself\n * as pressed when its tool is the current one.\n */\n\nexport interface ToolbarItemProps {\n /** The id of an entry in the UI tool list. */\n tool: string\n /** Override the item's own label. */\n label?: string\n /** Override the item's own icon. */\n icon?: string\n}\n\n/**\n * One toolbar button, driven by the tool list.\n *\n * Named `TldrawUiToolbarItem` rather than `ToolbarItem`, which is already the\n * name of the toolbar's *configuration* record in `toolbar-config`.\n *\n * Renders nothing when the tool is not registered. That is the load-bearing\n * behaviour: an editor built without the arrow tool simply has no arrow\n * button, rather than one that throws when pressed.\n */\nexport const TldrawUiToolbarItem = track(function TldrawUiToolbarItem({ tool: toolId, label, icon }: ToolbarItemProps) {\n const tools = useTools()\n const tool = tools[toolId]\n const isSelected = useIsToolSelected(tool)\n if (!tool) return null\n const name = icon ?? tool.icon\n const text = label ?? tool.label\n const known = Object.prototype.hasOwnProperty.call(ICONS, name)\n return (\n <TldrawUiToolbarButton\n type=\"tool\"\n isActive={isSelected}\n title={text}\n {...(tool.disabled ? { disabled: true } : {})}\n onClick={() => tool.onSelect(\"toolbar\")}\n >\n {known ? <Icon name={name as IconName} /> : <span className=\"mocanvas-btn-glyph\">{text.slice(0, 1).toUpperCase()}</span>}\n </TldrawUiToolbarButton>\n )\n})\n\n/** A geo-kind button: selects the geo tool *and* the kind. */\nexport const GeoToolbarItem = track(function GeoToolbarItem({ geo, label }: { geo: GeoShapeKind; label?: string }) {\n const editor = useEditor()\n const tools = useTools()\n const tool = tools[geo] ?? tools[\"geo\"]\n const current = editor.getCurrentToolId() === \"geo\" ? ((editor.getStateDescendant(\"geo\") as { geo?: GeoShapeKind } | undefined)?.geo ?? \"rectangle\") : null\n if (!tool) return null\n const text = label ?? geo.replace(/-/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase())\n return (\n <TldrawUiToolbarButton\n type=\"tool\"\n isActive={current === geo}\n title={text}\n onClick={() => {\n editor.setStyleForNextShapes(GeoShapeGeoStyle, geo)\n editor.setCurrentTool(\"geo\", { geo, force: true })\n }}\n >\n <Icon name={`geo-${geo}`} />\n </TldrawUiToolbarButton>\n )\n})\n\n// ---- tools -------------------------------------------------------------------\n\n/** The select tool. */\nexport const SelectToolbarItem = () => <TldrawUiToolbarItem tool=\"select\" />\n/** The hand (pan) tool. */\nexport const HandToolbarItem = () => <TldrawUiToolbarItem tool=\"hand\" />\n/** The freehand draw tool. */\nexport const DrawToolbarItem = () => <TldrawUiToolbarItem tool=\"draw\" />\n/** The eraser. */\nexport const EraserToolbarItem = () => <TldrawUiToolbarItem tool=\"eraser\" />\n/** The arrow tool. */\nexport const ArrowToolbarItem = () => <TldrawUiToolbarItem tool=\"arrow\" />\n/** The line tool. */\nexport const LineToolbarItem = () => <TldrawUiToolbarItem tool=\"line\" />\n/** The text tool. */\nexport const TextToolbarItem = () => <TldrawUiToolbarItem tool=\"text\" />\n/** The sticky-note tool. */\nexport const NoteToolbarItem = () => <TldrawUiToolbarItem tool=\"note\" />\n/** The frame tool. */\nexport const FrameToolbarItem = () => <TldrawUiToolbarItem tool=\"frame\" />\n/** The highlighter. */\nexport const HighlightToolbarItem = () => <TldrawUiToolbarItem tool=\"highlight\" />\n/** The laser pointer. */\nexport const LaserToolbarItem = () => <TldrawUiToolbarItem tool=\"laser\" />\n/** The image / media placer. */\nexport const AssetToolbarItem = () => <TldrawUiToolbarItem tool=\"asset\" label=\"Media\" icon=\"image\" />\n/** The commenting tool. */\nexport const CommentToolbarItem = () => <TldrawUiToolbarItem tool=\"comment\" />\n\n// ---- geo kinds ---------------------------------------------------------------\n\n/** Rectangle. */\nexport const RectangleToolbarItem = () => <GeoToolbarItem geo=\"rectangle\" />\n/** Ellipse. */\nexport const EllipseToolbarItem = () => <GeoToolbarItem geo=\"ellipse\" />\n/** Triangle. */\nexport const TriangleToolbarItem = () => <GeoToolbarItem geo=\"triangle\" />\n/** Diamond. */\nexport const DiamondToolbarItem = () => <GeoToolbarItem geo=\"diamond\" />\n/** Hexagon. */\nexport const HexagonToolbarItem = () => <GeoToolbarItem geo=\"hexagon\" />\n/** Star. */\nexport const StarToolbarItem = () => <GeoToolbarItem geo=\"star\" />\n/** Rhombus. */\nexport const RhombusToolbarItem = () => <GeoToolbarItem geo=\"rhombus\" />\n/** Oval. */\nexport const OvalToolbarItem = () => <GeoToolbarItem geo=\"oval\" />\n/** Trapezoid. */\nexport const TrapezoidToolbarItem = () => <GeoToolbarItem geo=\"trapezoid\" />\n/** Cloud. */\nexport const CloudToolbarItem = () => <GeoToolbarItem geo=\"cloud\" />\n/** Heart. */\nexport const HeartToolbarItem = () => <GeoToolbarItem geo=\"heart\" />\n/** X box. */\nexport const XBoxToolbarItem = () => <GeoToolbarItem geo=\"x-box\" />\n/** Check box. */\nexport const CheckBoxToolbarItem = () => <GeoToolbarItem geo=\"check-box\" />\n/** Arrow pointing right. */\nexport const ArrowRightToolbarItem = () => <GeoToolbarItem geo=\"arrow-right\" />\n/** Arrow pointing left. */\nexport const ArrowLeftToolbarItem = () => <GeoToolbarItem geo=\"arrow-left\" />\n/** Arrow pointing up. */\nexport const ArrowUpToolbarItem = () => <GeoToolbarItem geo=\"arrow-up\" />\n/** Arrow pointing down. */\nexport const ArrowDownToolbarItem = () => <GeoToolbarItem geo=\"arrow-down\" />\n\n// ---- tool lock ---------------------------------------------------------------\n\nexport interface ToggleToolLockedButtonProps {\n activeTool?: string\n className?: string\n}\n\n/**\n * The padlock at the end of the toolbar: keep the current tool after drawing.\n *\n * Hidden for the tools it makes no difference to — select and hand do not\n * \"finish\" — because a control that is present but inert teaches the user\n * nothing.\n */\nexport const ToggleToolLockedButton = track(function ToggleToolLockedButton({ className }: ToggleToolLockedButtonProps) {\n const editor = useEditor()\n const toolId = editor.getCurrentToolId()\n if (toolId === \"select\" || toolId === \"hand\" || toolId === \"eraser\") return null\n const locked = editor.getInstanceState().isToolLocked\n return (\n <TldrawUiToolbarButton\n type=\"icon\"\n isActive={locked}\n title=\"Tool lock\"\n {...(className ? { className } : {})}\n onClick={() => editor.updateInstanceState({ isToolLocked: !locked })}\n >\n <Icon name={locked ? \"lock\" : \"unlock\"} />\n </TldrawUiToolbarButton>\n )\n})\n\n// ---- the bar -----------------------------------------------------------------\n\n/**\n * The default set of toolbar buttons, in order.\n *\n * Every one of them removes itself when its tool is absent, so this same list\n * is correct for an editor with three tools and for one with fifteen.\n */\nexport function DefaultToolbarContent() {\n return (\n <>\n <SelectToolbarItem />\n <HandToolbarItem />\n <DrawToolbarItem />\n <EraserToolbarItem />\n <ArrowToolbarItem />\n <TextToolbarItem />\n <NoteToolbarItem />\n <RectangleToolbarItem />\n <EllipseToolbarItem />\n <TriangleToolbarItem />\n <DiamondToolbarItem />\n <StarToolbarItem />\n <LineToolbarItem />\n <FrameToolbarItem />\n <HighlightToolbarItem />\n <LaserToolbarItem />\n <AssetToolbarItem />\n </>\n )\n}\n\nexport interface OverflowingToolbarProps {\n label?: string\n /** How many children stay inline before the rest move into the popover. */\n maxInline?: number\n children?: ReactNode\n}\n\n/**\n * A toolbar that moves whatever will not fit into a \"more\" popover.\n *\n * The split is measured, not guessed: the bar is observed and the inline count\n * derived from its width, so the same component works in a 320px phone frame\n * and in a 1600px desktop one without the caller configuring anything.\n *\n * A child that renders nothing still takes a slot, so a caller mapping over a\n * fixed list gets a split that does not jump around as tools appear.\n */\nexport function OverflowingToolbar({ label = \"Tools\", maxInline, children }: OverflowingToolbarProps) {\n const barRef = useRef<HTMLDivElement>(null)\n const [width, setWidth] = useState<number | null>(null)\n\n useEffect(() => {\n const el = barRef.current\n if (!el || typeof ResizeObserver === \"undefined\") return\n const update = () => setWidth(el.getBoundingClientRect().width)\n update()\n const ro = new ResizeObserver(update)\n ro.observe(el)\n return () => ro.disconnect()\n }, [])\n\n const items = Children.toArray(children)\n // 44px per button, and room for the \"more\" button itself. Before the first\n // measurement, assume everything fits: a bar that starts full and settles\n // narrower reads as layout, one that starts collapsed reads as a glitch.\n const fits = width === null ? items.length : Math.max(1, Math.floor((width - 48) / 44))\n const limit = Math.min(maxInline ?? items.length, fits)\n const inline = items.slice(0, limit)\n const overflow = items.slice(limit)\n\n return (\n <TldrawUiToolbar ref={barRef} label={label}>\n {inline}\n {overflow.length > 0 ? (\n <TldrawUiPopover id=\"toolbar-overflow\" side=\"above\">\n <TldrawUiPopoverTrigger className=\"mocanvas-btn\">\n <Icon name=\"chevron-down\" />\n </TldrawUiPopoverTrigger>\n <TldrawUiPopoverContent label=\"More tools\">\n <div className=\"mocanvas-toolbar-overflow\">{overflow}</div>\n </TldrawUiPopoverContent>\n </TldrawUiPopover>\n ) : null}\n </TldrawUiToolbar>\n )\n}\n\n/**\n * The toolbar, with the mobile style trigger beside it on narrow layouts.\n *\n * The style panel has nowhere to dock on a phone, so it travels with the\n * toolbar instead of disappearing.\n */\nexport function DefaultToolbarWithOverflow() {\n const breakpoint = useBreakpoint()\n return (\n <OverflowingToolbar label=\"Tools\">\n <DefaultToolbarContent />\n <ToggleToolLockedButton />\n {breakpoint < PORTRAIT_BREAKPOINT.TABLET_SM ? <MobileStylePanel /> : null}\n </OverflowingToolbar>\n )\n}\n","import { track, useEditor, useValue, type Asset, type AssetId, type UnknownShape } from \"@mocanvas/editor\"\nimport { useEffect, useState } from \"react\"\nimport { Icon } from \"./icons\"\nimport { TldrawUiContextualToolbar } from \"./ui-contextual-toolbar\"\nimport { TldrawUiToolbarButton, TldrawUiToolbarToggleGroup, TldrawUiToolbarToggleItem } from \"./ui-toolbar\"\nimport type { TLUiImageToolbarProps, TLUiVideoToolbarProps } from \"./ui-components\"\n\n/**\n * The bars that appear over a selected image or video.\n *\n * They are contextual because the operations are: cropping and aspect ratio\n * only mean anything for the shape under the pointer, and putting them in the\n * style panel would leave the user reading the far corner of the screen while\n * dragging a crop handle in the near one.\n */\n\nexport interface BoxWidthHeight {\n w: number\n h: number\n}\n\n/**\n * Fit `box` inside `container` without changing its aspect ratio.\n *\n * The rule every image import needs: a 4000px photo dropped on the canvas must\n * arrive at a workable size, and must not arrive squashed.\n */\nexport function containBoxSize(box: BoxWidthHeight, container: BoxWidthHeight): BoxWidthHeight {\n if (box.w <= container.w && box.h <= container.h) return box\n const scale = Math.min(container.w / box.w, container.h / box.h)\n return { w: box.w * scale, h: box.h * scale }\n}\n\n/** One entry in the aspect-ratio picker. */\nexport interface AspectRatioOption {\n value: string\n label: string\n}\n\n/** The aspect ratios the image bar offers. */\nexport const ASPECT_RATIO_OPTIONS: readonly AspectRatioOption[] = [\n { value: \"original\", label: \"Original\" },\n { value: \"square\", label: \"Square\" },\n { value: \"circle\", label: \"Circle\" },\n { value: \"landscape\", label: \"Landscape\" },\n { value: \"portrait\", label: \"Portrait\" },\n { value: \"wide\", label: \"Wide\" },\n]\n\n/** One aspect-ratio option's value. */\nexport type ASPECT_RATIO_OPTION = AspectRatioOption[\"value\"]\n\n/** The width-over-height each named ratio means. `null` keeps the asset's own. */\nexport const ASPECT_RATIO_TO_VALUE: Readonly<Record<string, number | null>> = {\n original: null,\n square: 1,\n circle: 1,\n landscape: 4 / 3,\n portrait: 3 / 4,\n wide: 16 / 9,\n}\n\nexport interface UseImageOrVideoAssetOptions {\n /** The asset to resolve. */\n assetId: AssetId | null\n /** The shape's on-screen width, used to pick a resolution variant. */\n width?: number\n /** Resolve at a higher resolution than the shape's own size. */\n shouldResolveToOriginal?: boolean\n}\n\n/**\n * Resolve an image or video asset to a URL that can be put in a `src`.\n *\n * Asynchronous because `editor.resolveAssetUrl` may have to ask an asset store\n * — the seam a host uses to sign a URL or to serve a downscaled variant. The\n * hook reports `isPlaceholder` until the answer arrives, so a shape can draw a\n * grey box rather than a broken image.\n */\nexport function useImageOrVideoAsset({ assetId, width, shouldResolveToOriginal }: UseImageOrVideoAssetOptions): {\n asset: Asset | null\n url: string | null\n isPlaceholder: boolean\n} {\n const editor = useEditor()\n const asset = useValue(\"asset\", () => (assetId ? (editor.getAssets().find((a) => a.id === assetId) ?? null) : null), [editor, assetId])\n const [url, setUrl] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n if (!assetId) {\n setUrl(null)\n return\n }\n // SEMANTICS-ASSUMED: mocanvas's asset registry resolves one URL per asset\n // rather than a resolution ladder, so `width` and `shouldResolveToOriginal`\n // are accepted (an app writes them, and a variant-serving asset store will\n // want them) but do not yet change the answer.\n void width\n void shouldResolveToOriginal\n const resolved = editor.resolveAssetUrl(assetId)\n void Promise.resolve(resolved).then((next) => {\n if (!cancelled) setUrl(next ?? null)\n })\n return () => {\n cancelled = true\n }\n }, [editor, assetId, width, shouldResolveToOriginal])\n\n return { asset, url, isPlaceholder: url === null }\n}\n\n/** The size and mime type of an asset, for a shape that is placing it. */\nexport function getAssetInfo(asset: Asset | null | undefined): { w: number; h: number; mimeType: string | null; isAnimated: boolean } | null {\n if (!asset) return null\n const props = asset.props as { w?: number; h?: number; mimeType?: string | null; isAnimated?: boolean }\n return {\n w: props.w ?? 0,\n h: props.h ?? 0,\n mimeType: props.mimeType ?? null,\n isAnimated: props.isAnimated ?? false,\n }\n}\n\nexport interface DefaultImageToolbarContentProps {\n shape: UnknownShape\n /** Called when the user picks a named aspect ratio. */\n onAspectRatio?(value: string): void\n}\n\n/** The image bar's buttons: aspect ratio, and replace. */\nexport function DefaultImageToolbarContent({ shape, onAspectRatio }: DefaultImageToolbarContentProps) {\n const editor = useEditor()\n const [ratio, setRatio] = useState<string>(\"original\")\n return (\n <>\n <TldrawUiToolbarToggleGroup\n label=\"Aspect ratio\"\n type=\"single\"\n value={ratio}\n onValueChange={(value) => {\n setRatio(value)\n onAspectRatio?.(value)\n const target = ASPECT_RATIO_TO_VALUE[value]\n if (!target) return\n const bounds = editor.getShapePageBounds(shape.id)\n if (!bounds) return\n editor.markHistoryStoppingPoint(\"aspect ratio\")\n editor.updateShape({ id: shape.id, type: shape.type, props: { w: bounds.width, h: bounds.width / target } } as never)\n }}\n >\n {ASPECT_RATIO_OPTIONS.map((option) => (\n <TldrawUiToolbarToggleItem key={option.value} value={option.value} title={option.label}>\n {option.label}\n </TldrawUiToolbarToggleItem>\n ))}\n </TldrawUiToolbarToggleGroup>\n <TldrawUiToolbarButton type=\"icon\" title=\"Replace media\" onClick={() => editor.setCroppingShape(null)}>\n <Icon name=\"image\" />\n </TldrawUiToolbarButton>\n </>\n )\n}\n\n/** The bar over a selected image. */\nexport const DefaultImageToolbar = track(function DefaultImageToolbar({ children }: TLUiImageToolbarProps) {\n const editor = useEditor()\n const shape = editor.getOnlySelectedShape()\n if (!shape || shape.type !== \"image\" || editor.getEditingShapeId()) return null\n const bounds = editor.getShapePageBounds(shape.id)\n if (!bounds) return null\n return (\n <TldrawUiContextualToolbar label=\"Image\" getSelectionBounds={() => ({ x: bounds.minX, y: bounds.minY, w: bounds.width, h: bounds.height })}>\n {children ?? <DefaultImageToolbarContent shape={shape} />}\n </TldrawUiContextualToolbar>\n )\n})\n\nexport interface DefaultVideoToolbarContentProps {\n shape: UnknownShape\n}\n\n/** The video bar's buttons: play/pause and loop, written onto the shape. */\nexport function DefaultVideoToolbarContent({ shape }: DefaultVideoToolbarContentProps) {\n const editor = useEditor()\n const props = shape.props as { playing?: boolean; autoplay?: boolean }\n return (\n <>\n <TldrawUiToolbarButton\n type=\"icon\"\n title={props.playing ? \"Pause\" : \"Play\"}\n onClick={() => editor.updateShape({ id: shape.id, type: shape.type, props: { playing: !props.playing } } as never)}\n >\n {props.playing ? \"❚❚\" : \"▶\"}\n </TldrawUiToolbarButton>\n <TldrawUiToolbarButton\n type=\"icon\"\n isActive={props.autoplay ?? false}\n title=\"Autoplay\"\n onClick={() => editor.updateShape({ id: shape.id, type: shape.type, props: { autoplay: !props.autoplay } } as never)}\n >\n ↻\n </TldrawUiToolbarButton>\n </>\n )\n}\n\n/** The bar over a selected video. */\nexport const DefaultVideoToolbar = track(function DefaultVideoToolbar({ children }: TLUiVideoToolbarProps) {\n const editor = useEditor()\n const shape = editor.getOnlySelectedShape()\n if (!shape || shape.type !== \"video\" || editor.getEditingShapeId()) return null\n const bounds = editor.getShapePageBounds(shape.id)\n if (!bounds) return null\n return (\n <TldrawUiContextualToolbar label=\"Video\" getSelectionBounds={() => ({ x: bounds.minX, y: bounds.minY, w: bounds.width, h: bounds.height })}>\n {children ?? <DefaultVideoToolbarContent shape={shape} />}\n </TldrawUiContextualToolbar>\n )\n})\n","import type { DefaultFontStyle, DefaultHorizontalAlignStyle, DefaultVerticalAlignStyle, UnknownShape } from \"@mocanvas/editor\"\nimport { useEffect, useRef, type CSSProperties, type KeyboardEvent, type ReactNode, type Ref } from \"react\"\nimport { TextLabel } from \"../text/TextEditor\"\nimport { richTextToText, type RichText, type RichTextSource } from \"../text/rich-text\"\nimport { textToSvg, type SvgTextBox } from \"../export/text-svg\"\nimport { getFontFamily } from \"../shapes/shape-theme\"\n\n/**\n * Shape labels, in the three forms a shape needs them.\n *\n * The DOM label ({@link PlainTextLabel} / {@link RichTextLabel}) is what a\n * shape body renders; {@link RichTextSVG} is what the exporter renders, and it\n * has to produce real `<text>` elements rather than a `foreignObject`, because\n * a `foreignObject` is not rendered by most SVG consumers — including the\n * rasteriser in several browsers.\n */\n\nexport interface PlainTextLabelProps {\n shape: UnknownShape\n text: string\n isEditing: boolean\n fontFamily?: DefaultFontStyle\n fontSize: number\n color: string\n textAlign?: DefaultHorizontalAlignStyle\n verticalAlign: DefaultVerticalAlignStyle\n wrap: boolean\n width?: number\n height?: number\n padding?: number\n placeholder?: string\n singleLine?: boolean\n onChange(text: string): void\n}\n\n/** A shape's label, as plain text. */\nexport function PlainTextLabel(props: PlainTextLabelProps): ReactNode {\n return <TextLabel {...props} />\n}\n\nexport interface RichTextLabelProps extends Omit<PlainTextLabelProps, \"text\"> {\n /** The label's document. Plain `text` is the fallback when there is none. */\n richText?: RichTextSource\n text?: string\n onChangeRichText?(value: RichText): void\n}\n\n/** A shape's label, as a rich-text document. */\nexport function RichTextLabel({ richText, text, ...rest }: RichTextLabelProps): ReactNode {\n return <TextLabel {...rest} text={text ?? richTextToText(richText)} {...(richText === undefined ? {} : { richText })} />\n}\n\nexport interface RichTextSVGProps {\n /** The document to draw. */\n richText: RichTextSource\n /** The box to lay the text out in, in the SVG's own coordinates. */\n bounds: SvgTextBox\n fontSize: number\n fontFamily?: DefaultFontStyle\n color: string\n textAlign?: DefaultHorizontalAlignStyle\n verticalAlign: DefaultVerticalAlignStyle\n padding?: number\n wrap?: boolean\n fontWeight?: string | number\n}\n\n/**\n * A rich-text label as SVG markup.\n *\n * Produced by the same {@link textToSvg} the file exporter uses, so what a\n * shape shows on screen and what lands in an exported file cannot drift apart\n * in layout.\n */\nexport function RichTextSVG({ richText, bounds, fontSize, fontFamily = \"draw\", color, textAlign, verticalAlign, padding, wrap, fontWeight }: RichTextSVGProps) {\n const markup = textToSvg(richText, bounds, {\n fontFamily: getFontFamily(fontFamily),\n fontSize,\n color,\n verticalAlign,\n ...(textAlign ? { textAlign } : {}),\n ...(padding === undefined ? {} : { padding }),\n ...(wrap === undefined ? {} : { wrap }),\n ...(fontWeight === undefined ? {} : { fontWeight }),\n })\n // The markup is produced by `textToSvg` from escaped text; nothing the\n // document carries reaches the DOM as markup.\n return <g dangerouslySetInnerHTML={{ __html: markup }} />\n}\n\nexport interface TextAreaProps {\n /** The current value. */\n text: string\n isEditing: boolean\n /** Commit on Enter and refuse newlines: frame names, page names. */\n singleLine?: boolean\n placeholder?: string\n className?: string\n style?: CSSProperties\n ref?: Ref<HTMLTextAreaElement>\n onChange(text: string): void\n /** Enter (single-line) or a deliberate blur: the value is final. */\n onComplete?(text: string): void\n /** Escape: abandon the edit. */\n onCancel?(): void\n onKeyDown?(event: KeyboardEvent<HTMLTextAreaElement>): void\n}\n\n/**\n * The editable surface behind a plain-text label.\n *\n * A real `<textarea>` rather than a `contenteditable` div: it gets the\n * platform's own caret, selection, IME and autocorrect behaviour, all of which\n * a hand-rolled editor loses and users notice immediately.\n */\nexport function PlainTextArea({ text, isEditing, singleLine, placeholder, className, style, ref, onChange, onComplete, onCancel, onKeyDown }: TextAreaProps) {\n const own = useRef<HTMLTextAreaElement>(null)\n\n useEffect(() => {\n if (!isEditing) return\n const el = own.current\n if (!el) return\n el.focus()\n el.select()\n }, [isEditing])\n\n if (!isEditing) return null\n return (\n <textarea\n ref={(node) => {\n own.current = node\n if (typeof ref === \"function\") ref(node)\n else if (ref) (ref as { current: HTMLTextAreaElement | null }).current = node\n }}\n className={[\"mocanvas-textarea\", className].filter(Boolean).join(\" \")}\n style={style}\n value={text}\n placeholder={placeholder}\n spellCheck={false}\n // The canvas listens for these; a keystroke meant for the caret must not\n // also be read as a tool shortcut.\n onPointerDown={(event) => event.stopPropagation()}\n onChange={(event) => onChange(singleLine ? event.target.value.replace(/\\n/g, \"\") : event.target.value)}\n onBlur={() => onComplete?.(text)}\n onKeyDown={(event) => {\n onKeyDown?.(event)\n if (event.key === \"Escape\") {\n event.stopPropagation()\n onCancel?.()\n } else if (event.key === \"Enter\" && singleLine && !event.shiftKey) {\n event.preventDefault()\n event.stopPropagation()\n onComplete?.(text)\n }\n }}\n />\n )\n}\n\nexport interface RichTextAreaProps extends Omit<TextAreaProps, \"onChange\"> {\n richText?: RichTextSource\n onChange(text: string): void\n onChangeRichText?(value: RichText): void\n}\n\n/**\n * The editable surface behind a rich-text label.\n *\n * Falls back to the plain-text area when no rich-text editor factory has been\n * registered — TipTap is an optional peer dependency, and an app that has not\n * installed it should still be able to edit the text it can see.\n */\nexport function RichTextArea({ richText, text, onChangeRichText, ...rest }: RichTextAreaProps) {\n void onChangeRichText\n return <PlainTextArea {...rest} text={text || richTextToText(richText)} />\n}\n","import { track, useEditor, type TLUiOverrides } from \"@mocanvas/editor\"\nimport type { ReactNode } from \"react\"\nimport { DefaultActionsMenu, DefaultContextMenu, DefaultHelpMenu, DefaultHelperButtons, DefaultQuickActions } from \"./panel-menus\"\nimport { DefaultMenuPanel, DefaultNavigationPanel, OfflineIndicator } from \"./panel-navigation\"\nimport { DefaultFollowingIndicator, DefaultSharePanel } from \"./panel-people\"\nimport { DefaultRichTextToolbar } from \"./panel-richtext\"\nimport { ResponsiveStylePanel } from \"./panel-style\"\nimport { DefaultImageToolbar, DefaultVideoToolbar } from \"./asset-toolbars\"\nimport { DefaultToolbarWithOverflow } from \"./toolbar-items\"\nimport { DefaultA11yAnnouncer } from \"./ui-a11y\"\nimport { TldrawUiContextProvider } from \"./ui-context-provider\"\nimport { useTldrawUiComponents, type TLUiComponents } from \"./ui-components\"\nimport { DefaultDialogs } from \"./ui-dialogs\"\nimport type { TLUiEventHandler } from \"./ui-events\"\nimport { DefaultToasts } from \"./ui-toasts\"\nimport { DefaultDebugPanel } from \"./panel-debug\"\n\n/**\n * The whole chrome, laid out.\n *\n * Every panel here is read out of the components map first, so the layout is\n * the only thing this component owns: which slots exist, what order they sit\n * in, and which of them are suppressed in focus mode. Replacing a panel never\n * requires replacing this, and replacing this never requires reimplementing a\n * panel.\n */\n\nexport interface TldrawUiProps {\n /** Replace or remove a UI panel. */\n components?: TLUiComponents\n /** Rewrite the tool and action lists the panels render from. */\n overrides?: TLUiOverrides\n /** Reported UI events. */\n onUiEvent?: TLUiEventHandler\n /** Render the canvas and the app's own slots, but none of mocanvas's panels. */\n hideUi?: boolean\n /** Pin the layout to its narrowest form. */\n forceMobile?: boolean\n /** The canvas, and anything else that belongs under the chrome. */\n children?: ReactNode\n}\n\n/**\n * A slot for whatever an app wants drawn over the canvas but under the panels.\n *\n * `pointer-events: none` on the layer and `auto` on its children, so a badge\n * pinned to a shape is clickable while the empty space around it still pans\n * the canvas.\n */\nexport function TldrawUiInFrontOfTheCanvas({ children }: { children?: ReactNode }) {\n return (\n <div className=\"mocanvas-in-front-of-canvas\" style={{ position: \"absolute\", inset: 0, pointerEvents: \"none\" }}>\n {children}\n </div>\n )\n}\n\n/** The panels, read from the components map, in layout order. */\nconst Layout = track(function Layout({ children }: { children?: ReactNode }) {\n const editor = useEditor()\n const c = useTldrawUiComponents()\n const instance = editor.getInstanceState()\n\n // Focus mode hides the panels and nothing else: the canvas, the dialogs and\n // the announcer stay, because losing them would lose the document rather\n // than tidy the screen.\n const focus = instance.isFocusMode\n\n const Canvas = c.ContextMenu === null ? null : (c.ContextMenu ?? DefaultContextMenu)\n const canvas = Canvas ? <Canvas>{children}</Canvas> : children\n\n const slot = <P,>(value: TLUiComponents[keyof TLUiComponents], fallback: React.ComponentType<P> | null) =>\n value === null ? null : ((value as React.ComponentType<P> | undefined) ?? fallback)\n\n const Toolbar = slot<object>(c.Toolbar, DefaultToolbarWithOverflow)\n const StylePanel = slot<object>(c.StylePanel, ResponsiveStylePanel)\n const NavigationPanel = slot<object>(c.NavigationPanel, DefaultNavigationPanel)\n const MenuPanel = slot<object>(c.MenuPanel, DefaultMenuPanel)\n const ActionsMenu = slot<object>(c.ActionsMenu, DefaultActionsMenu)\n const QuickActions = slot<object>(c.QuickActions, DefaultQuickActions)\n const HelperButtons = slot<object>(c.HelperButtons, DefaultHelperButtons)\n const HelpMenu = slot<object>(c.HelpMenu, DefaultHelpMenu)\n const SharePanel = slot<object>(c.SharePanel, DefaultSharePanel)\n const ImageToolbar = slot<object>(c.ImageToolbar, DefaultImageToolbar)\n const VideoToolbar = slot<object>(c.VideoToolbar, DefaultVideoToolbar)\n const RichTextToolbar = slot<object>(c.RichTextToolbar, DefaultRichTextToolbar)\n const FollowingIndicator = slot<object>(c.FollowingIndicator, DefaultFollowingIndicator)\n const Toasts = slot<object>(c.Toasts, DefaultToasts)\n const Dialogs = slot<object>(c.Dialogs, DefaultDialogs)\n const A11y = slot<object>(c.A11y, DefaultA11yAnnouncer)\n const DebugPanel = slot<object>(c.DebugPanel, DefaultDebugPanel)\n const TopPanel = slot<object>(c.TopPanel, null)\n const PageMenu = slot<object>(c.PageMenu, null)\n const Minimap = slot<object>(c.Minimap, null)\n const CursorChatBubble = slot<object>(c.CursorChatBubble, null)\n const UserPresenceEditor = slot<object>(c.UserPresenceEditor, null)\n const PeopleMenu = slot<object>(c.PeopleMenu, null)\n const KeyboardShortcutsDialog = slot<object>(c.KeyboardShortcutsDialog, null)\n const DebugMenu = slot<object>(c.DebugMenu, null)\n\n return (\n <>\n {canvas}\n {focus ? null : (\n <>\n {MenuPanel ? <MenuPanel /> : null}\n {PageMenu ? <PageMenu /> : null}\n {TopPanel ? <TopPanel /> : null}\n {QuickActions ? <QuickActions /> : null}\n {ActionsMenu ? <ActionsMenu /> : null}\n {HelperButtons ? <HelperButtons /> : null}\n {Toolbar ? <Toolbar /> : null}\n {StylePanel ? <StylePanel /> : null}\n {NavigationPanel ? <NavigationPanel /> : null}\n {Minimap ? <Minimap /> : null}\n {HelpMenu ? <HelpMenu /> : null}\n {SharePanel ? <SharePanel /> : null}\n {PeopleMenu ? <PeopleMenu /> : null}\n {UserPresenceEditor ? <UserPresenceEditor /> : null}\n {ImageToolbar ? <ImageToolbar /> : null}\n {VideoToolbar ? <VideoToolbar /> : null}\n {RichTextToolbar ? <RichTextToolbar /> : null}\n {CursorChatBubble ? <CursorChatBubble /> : null}\n {FollowingIndicator ? <FollowingIndicator /> : null}\n {KeyboardShortcutsDialog ? <KeyboardShortcutsDialog /> : null}\n {instance.isDebugMode && DebugMenu ? <DebugMenu /> : null}\n {instance.isDebugMode && DebugPanel ? <DebugPanel /> : null}\n <OfflineIndicator />\n </>\n )}\n {Toasts ? <Toasts /> : null}\n {Dialogs ? <Dialogs /> : null}\n {A11y ? <A11y /> : null}\n </>\n )\n})\n\n/**\n * mocanvas's chrome, and every context it reads.\n *\n * Wrap the canvas in it. Everything inside — mocanvas's panels and an app's\n * own — sees the same tool list, action list, translations, toasts and dialog\n * stack, which is what makes a replacement panel a drop-in rather than a fork.\n */\nexport function TldrawUi({ components, overrides, onUiEvent, hideUi, forceMobile, children }: TldrawUiProps) {\n return (\n <TldrawUiContextProvider\n {...(components ? { components } : {})}\n {...(overrides ? { overrides } : {})}\n {...(onUiEvent ? { onUiEvent } : {})}\n {...(forceMobile ? { forceMobile } : {})}\n >\n {hideUi ? children : <Layout>{children}</Layout>}\n </TldrawUiContextProvider>\n )\n}\n","import {\n BindingUtil,\n Vec,\n type BaseBinding,\n type BindingOnShapeChangeOptions,\n type BindingOnShapeDeleteOptions,\n type BindingOnShapeIsolateOptions,\n type VecLike,\n} from \"@mocanvas/editor\"\nimport type { ArrowShape } from \"../shapes/ArrowShapeUtil\"\nimport { getArrowTerminalsInArrowSpace } from \"./arrow-terminals\"\n\nexport type ArrowTerminal = \"start\" | \"end\"\n\n/**\n * Props of an `arrow` binding. The record layout matches what `.tldr` files\n * store for arrow bindings so documents round-trip.\n */\nexport interface ArrowBindingProps {\n /** Which end of the arrow (`fromId`) is attached to the bound shape (`toId`). */\n terminal: ArrowTerminal\n /** Anchor inside the bound shape's geometry bounds, normalized to `[0, 1]`. */\n normalizedAnchor: { x: number; y: number }\n /** When true the terminal sits exactly on the anchor instead of on the shape's outline. */\n isExact: boolean\n /** When true the anchor was placed deliberately (Alt or a lingering drag) rather than snapped to the center. */\n isPrecise: boolean\n}\n\nexport type ArrowBinding = BaseBinding<\"arrow\", ArrowBindingProps>\n\nconst EPS = 1e-6\n\nfunction samePoint(a: VecLike, b: VecLike): boolean {\n return Math.abs(a.x - b.x) < EPS && Math.abs(a.y - b.y) < EPS\n}\n\n/**\n * Keeps arrows attached to the shapes their terminals are bound to.\n *\n * - When the bound shape changes, the arrow is rewritten so its geometry is\n * re-derived (and its static fallback stays current).\n * - When the bound shape goes away, or the binding is deleted with\n * `isolateShapes`, the terminal is frozen at its current page position.\n */\nexport class ArrowBindingUtil extends BindingUtil<ArrowBinding> {\n static override type = \"arrow\" as const\n\n getDefaultProps(): ArrowBindingProps {\n return { terminal: \"end\", normalizedAnchor: { x: 0.5, y: 0.5 }, isExact: false, isPrecise: false }\n }\n\n override onAfterChangeToShape({ binding }: BindingOnShapeChangeOptions<ArrowBinding>): void {\n this.refreshArrow(binding)\n }\n\n override onAfterChangeFromShape({ binding, shapeBefore, shapeAfter }: BindingOnShapeChangeOptions<ArrowBinding>): void {\n // Moving the arrow itself does not change where its bound terminal resolves\n // to in page space; only a re-parent changes the arrow's local frame.\n if (shapeBefore.parentId !== shapeAfter.parentId) this.refreshArrow(binding)\n }\n\n override onBeforeDeleteToShape({ binding }: BindingOnShapeDeleteOptions<ArrowBinding>): void {\n this.freezeTerminal(binding)\n }\n\n override onBeforeIsolateFromShape({ binding }: BindingOnShapeIsolateOptions<ArrowBinding>): void {\n this.freezeTerminal(binding)\n }\n\n override onBeforeIsolateToShape({ binding }: BindingOnShapeIsolateOptions<ArrowBinding>): void {\n this.freezeTerminal(binding)\n }\n\n /** Write the resolved terminals into the arrow so its geometry is rebuilt. */\n private refreshArrow(binding: ArrowBinding): void {\n const arrow = this.editor.getShape<ArrowShape>(binding.fromId)\n if (!arrow || arrow.type !== \"arrow\") return\n const { start, end } = getArrowTerminalsInArrowSpace(this.editor, arrow)\n if (samePoint(start, arrow.props.start) && samePoint(end, arrow.props.end)) return\n this.editor.updateShape<ArrowShape>({ id: arrow.id, type: \"arrow\", props: { start: start.toJson(), end: end.toJson() } })\n }\n\n /**\n * Convert the bound terminal into a static point at its current resolved\n * position. Idempotent: calling it twice for the same binding is a no-op the\n * second time.\n */\n private freezeTerminal(binding: ArrowBinding): void {\n const arrow = this.editor.getShape<ArrowShape>(binding.fromId)\n if (!arrow || arrow.type !== \"arrow\") return\n if (!this.editor.getShape(binding.toId)) return\n const terminal = binding.props.terminal\n const resolved = getArrowTerminalsInArrowSpace(this.editor, arrow)[terminal]\n if (samePoint(resolved, arrow.props[terminal])) return\n this.editor.updateShape<ArrowShape>({ id: arrow.id, type: \"arrow\", props: { [terminal]: Vec.From(resolved).toJson() } })\n }\n}\n","/**\n * Everything about an arrow that is derived rather than stored.\n *\n * An arrow's record holds terminals in its own space and a bend; where the\n * arrow *actually* starts and ends depends on what it is bound to, how big\n * those shapes are right now, and how much of the body the arrowheads take up.\n * `getArrowInfo` resolves all of that once, and the geometry, the renderer, the\n * indicator and the label placement all read the same answer — which is what\n * keeps a bound arrow's outline and its paint from disagreeing.\n *\n * It is a free function taking the editor rather than a method on the shape\n * util because a tool needs it before the shape exists.\n */\n\nimport { Vec, type Editor, type ShapeId, type VecLike } from \"@mocanvas/editor\"\nimport { getArrowBody, getArrowheadInset, getArrowheadLength, getBodyLength, shortenBody, type ArcBody, type ArrowBody } from \"../shapes/arrow-helpers\"\nimport type { ElbowArrowRoute, TLElbowArrowInfo } from \"../shapes/elbow-arrow-types\"\nimport { getElbowBody, getElbowRoute } from \"../shapes/elbow-helpers\"\nimport type { ArrowShape } from \"../shapes/ArrowShapeUtil\"\nimport { getArrowTerminalsInArrowSpace, type ArrowBindings } from \"./arrow-terminals\"\nimport { getArrowBindings } from \"./arrow-terminals\"\n\n/** One end of an arrow: where the handle sits, where the line stops, and what is drawn there. */\nexport interface TLArrowPoint {\n /** The arrowhead style drawn at this end. */\n arrowhead: ArrowShape[\"props\"][\"arrowheadStart\"]\n /** Where the draggable handle sits — the terminal itself, unshortened. */\n handle: VecLike\n /** Where the body actually stops, pulled back to make room for the arrowhead. */\n point: VecLike\n}\n\n/** A circular arc, in the form an SVG `A` command and a length query both need. */\nexport interface TLArcInfo {\n center: VecLike\n /** `1` when the arc takes the long way round; SVG's own flag, as a number. */\n largeArcFlag: number\n /** Arc length, in the arrow's own units. */\n length: number\n radius: number\n /** The swept angle, in radians. Signed: negative sweeps anticlockwise. */\n size: number\n /** `1` when the arc sweeps clockwise; SVG's own flag, as a number. */\n sweepFlag: number\n}\n\n/** A straight arrow, resolved. */\nexport interface TLStraightArrowInfo {\n type: \"straight\"\n bindings: ArrowBindings\n start: TLArrowPoint\n end: TLArrowPoint\n /** The midpoint of the body — where the label sits by default. */\n middle: VecLike\n /** The body's length, after the arrowheads have been made room for. */\n length: number\n /** Whether the arrow has enough body left to draw. */\n isValid: boolean\n}\n\n/** A bowed arrow, resolved. */\nexport interface TLArcArrowInfo {\n type: \"arc\"\n bindings: ArrowBindings\n /** The arc the *body* is drawn along, after shortening for arrowheads. */\n bodyArc: TLArcInfo\n /** The arc through the *handles*, which is what the bend handle is dragged along. */\n handleArc: TLArcInfo\n start: TLArrowPoint\n end: TLArrowPoint\n middle: VecLike\n isValid: boolean\n}\n\n/** A resolved arrow, discriminated by how its body is routed. */\nexport type TLArrowInfo = TLArcArrowInfo | TLElbowArrowInfo | TLStraightArrowInfo\n\n/** An arc body as {@link TLArcInfo}. */\nfunction arcInfo(body: ArcBody): TLArcInfo {\n const size = body.sweep\n return {\n center: body.center,\n radius: body.radius,\n size,\n length: Math.abs(size) * body.radius,\n largeArcFlag: Math.abs(size) > Math.PI ? 1 : 0,\n sweepFlag: size > 0 ? 1 : 0,\n }\n}\n\n/**\n * Resolve an arrow to the geometry everything downstream draws from.\n *\n * Returns `undefined` for a shape that is not an arrow, so a caller can pass\n * whatever it has selected.\n */\nexport function getArrowInfo(editor: Editor, shape: ArrowShape | ShapeId): TLArrowInfo | undefined {\n const arrow = typeof shape === \"string\" ? editor.getShape<ArrowShape>(shape) : shape\n if (!arrow || arrow.type !== \"arrow\") return undefined\n\n const bindings = getArrowBindings(editor, arrow)\n const terminals = getArrowTerminalsInArrowSpace(editor, arrow)\n const start = Vec.From(terminals.start)\n const end = Vec.From(terminals.end)\n\n // The routing kind decides the body: `\"elbow\"` ignores `bend` entirely, and\n // `\"arc\"` with no bend is a straight line, which is what `getArrowBody`\n // already reports.\n const handleBody: ArrowBody =\n arrow.props.kind === \"elbow\"\n ? getElbowBody(start, end, { midPoint: arrow.props.elbowMidPoint })\n : getArrowBody(start, end, arrow.props.bend)\n const bodyLength = getBodyLength(handleBody)\n\n // Each arrowhead eats into the body from its own end. Computing the inset\n // from the *whole* body length rather than from each half is what keeps a\n // short arrow from having its two arrowheads overlap in the middle.\n const strokeWidth = 2\n const headLength = getArrowheadLength(strokeWidth, bodyLength)\n const startInset = getArrowheadInset(arrow.props.arrowheadStart, headLength)\n const endInset = getArrowheadInset(arrow.props.arrowheadEnd, headLength)\n const shortened = shortenBody(handleBody, startInset, endInset)\n\n const isValid = bodyLength - startInset - endInset > 0\n\n if (shortened.kind === \"arc\" && handleBody.kind === \"arc\") {\n const bodyArc = arcInfo(shortened)\n const handleArc = arcInfo(handleBody)\n const startPoint = pointOnArc(shortened, 0)\n const endPoint = pointOnArc(shortened, 1)\n return {\n type: \"arc\",\n bindings,\n bodyArc,\n handleArc,\n start: { arrowhead: arrow.props.arrowheadStart, handle: start, point: startPoint },\n end: { arrowhead: arrow.props.arrowheadEnd, handle: end, point: endPoint },\n middle: pointOnArc(shortened, 0.5),\n isValid,\n }\n }\n\n if (handleBody.kind === \"elbow\") {\n const routed = getElbowRoute(start, end, { midPoint: arrow.props.elbowMidPoint })\n const route: ElbowArrowRoute = {\n name: \"free\",\n points: routed.points,\n corners: routed.corners,\n distance: getBodyLength(handleBody),\n // A free-terminal route leaves and enters bare points, so neither end\n // sits on a box edge; a bound elbow's edges come from the router in\n // `elbow-arrow-types`, which knows the boxes.\n aEdge: null,\n bEdge: null,\n midpointHandle: null,\n }\n return { type: \"elbow\", start, end, route, isValid }\n }\n\n const straightStart = shortened.kind === \"straight\" ? shortened.start : start\n const straightEnd = shortened.kind === \"straight\" ? shortened.end : end\n return {\n type: \"straight\",\n bindings,\n start: { arrowhead: arrow.props.arrowheadStart, handle: start, point: straightStart },\n end: { arrowhead: arrow.props.arrowheadEnd, handle: end, point: straightEnd },\n middle: Vec.Lrp(straightStart, straightEnd, 0.5),\n length: Vec.Dist(straightStart, straightEnd),\n isValid,\n }\n}\n\n/** The point `t` of the way along an arc body. */\nfunction pointOnArc(body: ArcBody, t: number): Vec {\n const angle = body.startAngle + body.sweep * t\n return new Vec(body.center.x + Math.cos(angle) * body.radius, body.center.y + Math.sin(angle) * body.radius)\n}\n","/**\n * What the arrow being dragged is currently pointing at.\n *\n * While a terminal is dragged, three things need the same answer at the same\n * moment: the tool, which will write the binding on pointer-up; the hint\n * overlay, which draws the highlight and the four side handles; and the arrow\n * itself, which routes towards the anchor. Recomputing it in each of them would\n * be three hit tests a frame *and* three chances to disagree about what is\n * under the cursor.\n *\n * So it is computed once and published as editor-scoped state. It is transient\n * — never written to the store, gone when the drag ends — because it describes\n * a gesture in progress, not the document.\n */\n\nimport { Vec, atom, type Editor, type UnknownShape, type VecLike } from \"@mocanvas/editor\"\nimport type { ArrowBinding } from \"./ArrowBindingUtil\"\nimport type { ArrowShape } from \"../shapes/ArrowShapeUtil\"\nimport { getArrowBindingTargetAtPoint, getNormalizedAnchor } from \"./arrow-terminals\"\n\n/** One of the four side handles the hint overlay draws on a target. */\nexport interface ArrowTargetHandle {\n /** Whether this side may be bound to; a side the opposite terminal already uses is not. */\n isEnabled: boolean\n point: VecLike\n}\n\n/** The shape an arrow terminal is currently over, and everything derived from that. */\nexport interface ArrowTargetState {\n /** Where the terminal would attach, in page space. */\n anchorInPageSpace: VecLike\n /** How the arrow's body is routed — the target's handles differ between kinds. */\n arrowKind: ArrowShape[\"props\"][\"kind\"]\n /** The target's centre, in page space. */\n centerInPageSpace: VecLike\n /** The four side handles, in page space. */\n handlesInPageSpace: {\n top: ArrowTargetHandle\n bottom: ArrowTargetHandle\n left: ArrowTargetHandle\n right: ArrowTargetHandle\n }\n /** Whether the pointer is inside the target rather than merely near it. */\n isExact: boolean\n /** Whether the binding should keep this exact anchor rather than re-centring. */\n isPrecise: boolean\n /** The anchor as a `0..1` fraction of the target's bounds — what the binding stores. */\n normalizedAnchor: VecLike\n /** Which side of the target an elbow arrow must leave from, when one is forced. */\n snap: \"none\" | \"center\" | \"edge\" | \"edge-point\"\n /** The shape being pointed at. */\n target: UnknownShape\n}\n\n/** Everything {@link updateArrowTargetState} needs to work out the answer. */\nexport interface UpdateArrowTargetStateOpts {\n /** The arrow being dragged, or `undefined` while a new one is being created. */\n arrow: ArrowShape | undefined\n /** The binding this terminal already has, if any. */\n currentBinding: ArrowBinding | undefined\n editor: Editor\n /** Whether the user is asking for an exact anchor (the modifier is held, or they hovered). */\n isPrecise: boolean\n /** The binding on the arrow's *other* terminal, whose side this one may not reuse. */\n oppositeBinding: ArrowBinding | undefined\n /** The pointer, in page space. */\n pointInPageSpace: VecLike\n}\n\n/**\n * The published state, per editor.\n *\n * Keyed by editor rather than held in a module-level variable so two editors on\n * one page do not share a drag; a `WeakMap` so an editor that goes away takes\n * its entry with it.\n */\ntype TargetAtom = ReturnType<typeof atom<ArrowTargetState | null>>\n\nconst targetStates = new WeakMap<Editor, TargetAtom>()\n\nfunction stateAtom(editor: Editor): TargetAtom {\n let existing = targetStates.get(editor)\n if (!existing) {\n existing = atom<ArrowTargetState | null>(\"arrowTargetState\", null)\n targetStates.set(editor, existing)\n }\n return existing\n}\n\n/**\n * What the arrow is currently pointing at, or `null` when it is over empty\n * canvas.\n *\n * Reactive: read it inside a `useValue` or a `react` and the caller re-runs as\n * the pointer moves.\n */\nexport function getArrowTargetState(editor: Editor): ArrowTargetState | null {\n return stateAtom(editor).get()\n}\n\n/**\n * Recompute the target state from the current pointer position, publish it, and\n * return it.\n *\n * Called on every pointer move of a terminal drag. Returns `null` — and clears\n * the published state — when there is nothing bindable under the pointer, so a\n * caller can treat \"no target\" and \"cleared\" identically.\n */\nexport function updateArrowTargetState(opts: UpdateArrowTargetStateOpts): ArrowTargetState | null {\n const { editor, arrow, pointInPageSpace, isPrecise, oppositeBinding } = opts\n\n // A terminal being dragged before its arrow exists — the arrow tool's very\n // first pointer move — still has to know what it would bind to. The stub\n // stands in for the arrow that is about to exist: parented to the page, so\n // the ancestor walk terminates, and with an id nothing can match.\n const from: UnknownShape =\n arrow ?? ({ id: \"shape:pending-arrow\", type: \"arrow\", parentId: editor.getCurrentPageId() } as unknown as UnknownShape)\n const target = getArrowBindingTargetAtPoint(editor, from, pointInPageSpace)\n if (!target) {\n stateAtom(editor).set(null)\n return null\n }\n\n const bounds = editor.getShapePageBounds(target)\n if (!bounds) {\n stateAtom(editor).set(null)\n return null\n }\n\n const normalizedAnchor = getNormalizedAnchor(editor, target, pointInPageSpace)\n const anchorInPageSpace = isPrecise\n ? Vec.From(pointInPageSpace)\n : new Vec(bounds.minX + bounds.w / 2, bounds.minY + bounds.h / 2)\n\n // A side the arrow's *other* end is already bound to is not offered: an\n // elbow that leaves and enters the same side of the same shape has nowhere\n // to route.\n const usedSide = oppositeBinding?.props.terminal === (opts.currentBinding?.props.terminal === \"start\" ? \"end\" : \"start\") ? sideOf(editor, oppositeBinding) : null\n\n const handlesInPageSpace = {\n top: { isEnabled: usedSide !== \"top\", point: new Vec(bounds.center.x, bounds.minY) },\n bottom: { isEnabled: usedSide !== \"bottom\", point: new Vec(bounds.center.x, bounds.maxY) },\n left: { isEnabled: usedSide !== \"left\", point: new Vec(bounds.minX, bounds.center.y) },\n right: { isEnabled: usedSide !== \"right\", point: new Vec(bounds.maxX, bounds.center.y) },\n }\n\n const next: ArrowTargetState = {\n anchorInPageSpace,\n arrowKind: arrow?.props.kind ?? \"arc\",\n centerInPageSpace: new Vec(bounds.center.x, bounds.center.y),\n handlesInPageSpace,\n isExact: bounds.containsPoint(pointInPageSpace),\n isPrecise,\n normalizedAnchor,\n snap: isPrecise ? \"edge-point\" : \"none\",\n target,\n }\n\n stateAtom(editor).set(next)\n return next\n}\n\n/**\n * Forget the current target.\n *\n * Called when a drag ends or is cancelled. Leaving stale state behind would\n * keep the hint overlay drawn on a shape nothing is pointing at any more.\n */\nexport function clearArrowTargetState(editor: Editor): void {\n if (stateAtom(editor).get() !== null) stateAtom(editor).set(null)\n}\n\n/** Which side of its target a binding's anchor is nearest, or `null` when it is central. */\nfunction sideOf(editor: Editor, binding: ArrowBinding | undefined): \"top\" | \"bottom\" | \"left\" | \"right\" | null {\n if (!binding) return null\n const shape = editor.getShape(binding.toId)\n if (!shape) return null\n const { x, y } = binding.props.normalizedAnchor\n const dx = Math.min(x, 1 - x)\n const dy = Math.min(y, 1 - y)\n // Only an anchor that is actually near an edge names a side; one in the\n // middle names none, which is what leaves every handle enabled.\n if (Math.min(dx, dy) > 0.25) return null\n if (dx < dy) return x < 0.5 ? \"left\" : \"right\"\n return y < 0.5 ? \"top\" : \"bottom\"\n}\n","import type { BindingUtilConstructor } from \"@mocanvas/editor\"\nimport { ArrowBindingUtil } from \"./ArrowBindingUtil\"\n\nexport * from \"./ArrowBindingUtil\"\nexport * from \"./arrow-terminals\"\nexport * from \"./arrow-info\"\nexport * from \"./arrow-target\"\n\n/** The built-in binding utils, in the order they are registered. */\nexport const defaultBindingUtils: BindingUtilConstructor[] = [ArrowBindingUtil]\n","import type { VecLike } from \"@mocanvas/editor\"\n\n/**\n * One pass of a light 1-2-1 moving average over a freehand stroke. Endpoints\n * are kept fixed so the stroke still starts and ends where the pen did.\n * Extra properties on each point (e.g. pressure `z`) are preserved.\n */\nexport function smoothPoints<P extends VecLike>(points: readonly P[]): P[] {\n const n = points.length\n if (n < 4) return points.slice()\n const out: P[] = [points[0]!]\n for (let i = 1; i < n - 1; i++) {\n const prev = points[i - 1]!\n const p = points[i]!\n const next = points[i + 1]!\n out.push({ ...p, x: (prev.x + 2 * p.x + next.x) / 4, y: (prev.y + 2 * p.y + next.y) / 4 })\n }\n out.push(points[n - 1]!)\n return out\n}\n","import {\n b64Vecs,\n DefaultColorStyle,\n DefaultDashStyle,\n DefaultFillStyle,\n DefaultSizeStyle,\n DIM_2D,\n DIM_3D,\n getDefaultDisplayValues,\n Polygon2d,\n Polyline2d,\n ShapeUtil,\n STROKE_SIZES,\n type BaseShape,\n type EngineGeometry,\n type Geometry2d,\n type ResizeInfo,\n type ShapeUtilOptions,\n type StyleWords,\n type TLColorMode,\n type TLDefaultDisplayValues,\n type TLStyledShape,\n type TLTheme,\n type VecLike,\n} from \"@mocanvas/editor\"\nimport type { ReactNode } from \"react\"\nimport { smoothPoints } from \"./draw-helpers\"\nimport { propsOf, readArray, readBoolean, readEnum, readNumber, readStyle } from \"./prop-access\"\nimport { getFillRgba, getStrokeRgba, getDashId, getThemeColors } from \"./shape-theme\"\nimport { polylinePath } from \"./indicator-paths\"\nimport { drawShapeProps } from \"./shape-props\"\nimport { drawShapeMigrations } from \"./shape-migrations\"\n\nexport interface DrawPoint {\n x: number\n y: number\n /**\n * Pen pressure, `0..1`. Absent on points a mouse or a finger made — and\n * spelled `| undefined` so a validator that produces the key explicitly\n * still describes this type under `exactOptionalPropertyTypes`.\n */\n z?: number | undefined\n}\n\nexport interface DrawSegment {\n type: \"free\" | \"straight\"\n points: DrawPoint[]\n}\n\nexport interface DrawShapeProps {\n segments: DrawSegment[]\n color: DefaultColorStyle\n fill: DefaultFillStyle\n dash: DefaultDashStyle\n size: DefaultSizeStyle\n isComplete: boolean\n isClosed: boolean\n isPen: boolean\n scale: number\n}\n\nexport type DrawShape = BaseShape<\"draw\", DrawShapeProps>\n\nconst SEGMENT_TYPES = [\"free\", \"straight\"] as const\n\n/**\n * The shape's segments in a usable form.\n *\n * `points` comes in two shapes and both are ours. A document written long-hand\n * carries an array of `{x, y, z}`; a compressed one carries the packed base64\n * string that {@link b64Vecs} produces and that `TLDrawShapeSegment` declares —\n * which is what `compressLegacySegments` writes and what a `.tldr` file holds.\n *\n * Only the array was read. The string fell through the array reader as empty,\n * so a compressed segment contributed no points, and a draw shape written by\n * this very library came back with no geometry and drew nothing at all —\n * silently, because an unreadable segment is meant to cost its own run and not\n * throw. Failing soft is right; failing soft on a format we author ourselves is\n * not, and that is what hid it.\n *\n * A segment that is neither still reads as an empty run.\n */\nexport function readDrawSegments(shape: { props?: unknown }): DrawSegment[] {\n const out: DrawSegment[] = []\n for (const seg of readArray(propsOf(shape), \"segments\")) {\n const packed = (seg as { points?: unknown } | null)?.points\n if (typeof packed === \"string\") {\n // `dim` says how many floats a point took; 3 (x, y, pressure) unless the\n // writer said otherwise.\n const dim = readNumber(seg, \"dim\", DIM_3D)\n const decoded =\n dim === DIM_2D\n ? b64Vecs.decodePoints2D(packed).map((p) => ({ x: p.x, y: p.y }) as DrawPoint)\n : b64Vecs.decodePoints(packed).map((p) => ({ x: p.x, y: p.y, z: p.z }) as DrawPoint)\n out.push({ type: readEnum(seg, \"type\", SEGMENT_TYPES, \"free\"), points: decoded })\n continue\n }\n const points: DrawPoint[] = readArray(seg, \"points\").map((p) => {\n const point: DrawPoint = { x: readNumber(p, \"x\", 0), y: readNumber(p, \"y\", 0) }\n // Pressure stays absent when the stored point has none, so a round trip\n // through here does not invent one.\n const z = (p as { z?: unknown } | null)?.z\n if (typeof z === \"number\" && Number.isFinite(z)) point.z = z\n return point\n })\n out.push({ type: readEnum(seg, \"type\", SEGMENT_TYPES, \"free\"), points })\n }\n return out\n}\n\n/**\n * What a draw shape paints with.\n *\n * A draw shape carries its own `scale`, which the shared set knows nothing\n * about: `strokeWidth` on the base is the width the *style* asks for, and\n * {@link DrawShapeUtilDisplayValues.scaledStrokeWidth} is the width actually\n * drawn. Both are reported rather than one overwriting the other, so a caller\n * comparing two shapes' styles and a caller measuring one shape's ink each get\n * the number they meant.\n */\nexport interface DrawShapeUtilDisplayValues extends TLDefaultDisplayValues {\n /** `strokeWidth` with the shape's own `scale` applied. */\n scaledStrokeWidth: number\n /** Whether the outline is actually filled: it must be closed *and* have a fill style. */\n isFilled: boolean\n}\n\n/** `DrawShapeUtil`'s settings; see {@link ShapeUtil.configure}. */\nexport interface DrawShapeOptions extends ShapeUtilOptions<DrawShape, DrawShapeUtilDisplayValues> {}\n\n/** Resolve a draw shape's display values against a theme. */\nexport function getDrawDisplayValues(\n editor: unknown,\n shape: { props?: unknown },\n theme: TLTheme,\n colorMode: TLColorMode,\n): DrawShapeUtilDisplayValues {\n const base = getDefaultDisplayValues(editor, shape as TLStyledShape, theme, colorMode)\n const p = propsOf(shape)\n return {\n ...base,\n scaledStrokeWidth: base.strokeWidth * readNumber(p, \"scale\", 1),\n isFilled: readBoolean(p, \"isClosed\", false) && readStyle(p, \"fill\", DefaultFillStyle) !== \"none\",\n }\n}\n\n/** Flatten a draw shape's segments to one outline, smoothing freehand runs. */\nexport function getDrawOutlinePoints(shape: { props?: unknown }): VecLike[] {\n const out: VecLike[] = []\n for (const seg of readDrawSegments(shape)) {\n const pts = seg.type === \"free\" && seg.points.length >= 4 ? smoothPoints(seg.points) : seg.points\n for (const p of pts) out.push({ x: p.x, y: p.y })\n }\n return out\n}\n\nexport class DrawShapeUtil extends ShapeUtil<DrawShape, DrawShapeUtilDisplayValues> {\n static override type = \"draw\" as const\n static override props = drawShapeProps\n static override migrations = drawShapeMigrations\n static override options: DrawShapeOptions = { getDefaultDisplayValues: getDrawDisplayValues }\n declare readonly options: DrawShapeOptions\n\n getDefaultProps(): DrawShapeProps {\n return {\n segments: [],\n color: \"black\",\n fill: \"none\",\n dash: \"draw\",\n size: \"m\",\n isComplete: false,\n isClosed: false,\n isPen: false,\n scale: 1,\n }\n }\n\n /**\n * Freehand smoothing runs in the engine: the raw segment points go across and\n * the outline is built there. `w`/`h` are the extents of the *unsmoothed*\n * points — the smoothed outline can only sit inside them, and this util sets\n * neither `OVERLAY` nor `LABEL`, so those words feed a fallback the engine\n * never reaches once the geometry command has run.\n */\n override getEngineGeometry(shape: DrawShape): EngineGeometry {\n const p = propsOf(shape)\n const segments = readDrawSegments(shape).map((seg) => ({\n points: seg.points.flatMap((q) => [q.x, q.y]),\n freehand: seg.type === \"free\",\n }))\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const seg of segments) {\n for (let i = 0; i < seg.points.length; i += 2) {\n const x = seg.points[i]!\n const y = seg.points[i + 1]!\n if (x < minX) minX = x\n if (x > maxX) maxX = x\n if (y < minY) minY = y\n if (y > maxY) maxY = y\n }\n }\n const isClosed = readBoolean(p, \"isClosed\", false)\n return {\n type: \"draw\",\n segments,\n closed: isClosed,\n w: Number.isFinite(minX) ? maxX - minX : 0,\n h: Number.isFinite(minY) ? maxY - minY : 0,\n isClosed,\n isFilled: isClosed && readStyle(p, \"fill\", DefaultFillStyle) !== \"none\",\n }\n }\n\n getGeometry(shape: DrawShape): Geometry2d {\n const points = getDrawOutlinePoints(shape)\n const p = propsOf(shape)\n if (readBoolean(p, \"isClosed\", false) && points.length > 2) {\n return new Polygon2d({ points, isFilled: readStyle(p, \"fill\", DefaultFillStyle) !== \"none\" })\n }\n return new Polyline2d({ points: points.length === 0 ? [{ x: 0, y: 0 }] : points })\n }\n\n override getRenderStyle(shape: DrawShape): StyleWords {\n const p = propsOf(shape)\n const color = readStyle(p, \"color\", DefaultColorStyle)\n const fill = readStyle(p, \"fill\", DefaultFillStyle)\n const size = readStyle(p, \"size\", DefaultSizeStyle)\n const scale = readNumber(p, \"scale\", 1)\n const isClosed = readBoolean(p, \"isClosed\", false)\n const dash = readStyle(p, \"dash\", DefaultDashStyle)\n const colors = getThemeColors(this.editor)\n return {\n stroke: getStrokeRgba(color, colors),\n strokeWidth: STROKE_SIZES[size] * scale,\n fill: isClosed && fill !== \"none\" ? getFillRgba(color, fill, colors) : 0,\n // `draw` asks the engine to replace an outline with a hand-drawn version of\n // it. A draw shape's points *are* a hand-drawn version already — a recorded\n // pen movement, smoothed — so putting them through it a second time only\n // adds bulges the hand never made. Ask for the solid stroke instead. The\n // record keeps `props.dash` exactly as it was, so the style panel still\n // shows \"draw\", a `.tldr` round trip is unaffected, and `dashed`/`dotted`\n // reach the engine untouched.\n dash: getDashId(dash === \"draw\" ? \"solid\" : dash),\n opacity: 1,\n }\n }\n\n component(_shape: DrawShape): ReactNode {\n return null\n }\n\n override getIndicatorPath(shape: DrawShape): Path2D {\n const points = getDrawOutlinePoints(shape)\n const isClosed = readBoolean(propsOf(shape), \"isClosed\", false) && points.length > 2\n return polylinePath(points, isClosed)\n }\n\n override canResize(_shape: DrawShape): boolean {\n return true\n }\n\n override hideResizeHandles(_shape: DrawShape): boolean {\n return false\n }\n\n override onResize(shape: DrawShape, info: ResizeInfo<DrawShape>): Partial<DrawShape> {\n const { scaleX, scaleY, initialShape, newPoint } = info\n const segments = readDrawSegments(initialShape).map((seg) => ({\n ...seg,\n points: seg.points.map((p) => ({ ...p, x: p.x * scaleX, y: p.y * scaleY })),\n }))\n return { x: newPoint.x, y: newPoint.y, props: { ...shape.props, segments } }\n }\n}\n","/**\n * The highlighter: a draw stroke that marks what is already on the canvas\n * instead of adding to it.\n *\n * It is deliberately *not* a draw shape with different styles. A highlight is\n * translucent, is drawn much wider than its size suggests, never closes into a\n * filled region, and is painted behind everything else so that highlighting a\n * note does not hide the note. Those four differences are the whole shape, and\n * each of them would be a special case inside `DrawShapeUtil` if the two\n * shared a type — which is also why a highlight carries no `fill`, no `dash`\n * and no `isClosed`: there is nothing sensible for them to mean.\n */\nimport {\n DefaultColorStyle,\n DefaultSizeStyle,\n Polyline2d,\n STROKE_SIZES,\n ShapeUtil,\n getColorValue,\n getDefaultDisplayValues,\n hexToRgba,\n type BaseShape,\n type EngineGeometry,\n type Geometry2d,\n type ResizeInfo,\n type ShapeUtilOptions,\n type StyleWords,\n type TLColorMode,\n type TLDefaultDisplayValues,\n type TLStyledShape,\n type TLTheme,\n type VecLike,\n} from \"@mocanvas/editor\"\nimport type { ReactNode } from \"react\"\nimport { readDrawSegments, type DrawSegment } from \"./DrawShapeUtil\"\nimport { smoothPoints } from \"./draw-helpers\"\nimport { polylinePath } from \"./indicator-paths\"\nimport { propsOf, readNumber, readStyle } from \"./prop-access\"\nimport { getThemeColors } from \"./shape-theme\"\nimport { highlightShapeProps } from \"./shape-props\"\nimport { highlightShapeMigrations } from \"./shape-migrations\"\n\n/**\n * How wide a highlight is drawn, per `size`, at `scale: 1`.\n *\n * MEASURED, replacing a guess: these are tldraw 5.4's painted stroke widths,\n * read off the rendered element in `apps/bench` at each of the four sizes.\n *\n * A table rather than a multiple of `STROKE_SIZES`, because the two do not run\n * in step — the ratio falls from ~10x at `s` to ~4.9x at `xl`, so no single\n * multiplier reproduces them. The previous 3.2x of `STROKE_SIZES` came out\n * between 1.5x and 3.2x too narrow depending on the size.\n */\nexport const HIGHLIGHT_STROKE_SIZES: typeof STROKE_SIZES = { s: 20.16, m: 26.88, l: 40.32, xl: 49.28 }\n\n/**\n * How see-through a highlight is.\n *\n * MEASURED, replacing a guess: tldraw paints the highlight at this opacity over\n * the palette's highlight ink, which is the same token mocanvas already carries.\n * The old 0.32 washed a saturated `#fddd00` out to a pale cream over white\n * paper — the mark read as a smudge rather than as a highlighter.\n */\nexport const HIGHLIGHT_OPACITY = 0.82\n\nexport interface HighlightShapeProps {\n /** The recorded pen movement, in the same encoding a draw shape uses. */\n segments: DrawSegment[]\n color: DefaultColorStyle\n size: DefaultSizeStyle\n /** Whether the stroke is finished; `false` while the pen is still down. */\n isComplete: boolean\n /** Whether the stroke came from a pen rather than a mouse or a finger. */\n isPen: boolean\n scale: number\n}\n\n/** The `@tldraw/tlschema` spelling of {@link HighlightShapeProps}. */\nexport type TLHighlightShapeProps = HighlightShapeProps\n\nexport type HighlightShape = BaseShape<\"highlight\", HighlightShapeProps>\n\n/** The `@tldraw/tlschema` spelling of {@link HighlightShape}. */\nexport type TLHighlightShape = HighlightShape\n\n/**\n * What a highlight paints with.\n *\n * `color` on the base is the palette's *solid* ink, which is not what a\n * highlighter lays down — the palette carries a separate, much paler highlight\n * token for exactly this. Both are reported: the solid one so a caller that\n * only knows the shared set still gets something sensible, and\n * {@link HighlightShapeUtilDisplayValues.highlightColor} for the real ink.\n */\nexport interface HighlightShapeUtilDisplayValues extends TLDefaultDisplayValues {\n /** The highlighter ink: the palette's highlight token for `props.color`. */\n highlightColor: string\n /** The stroke width actually drawn — the base width, widened and scaled. */\n highlightStrokeWidth: number\n /** How see-through the stroke is drawn, `0..1`. */\n highlightOpacity: number\n}\n\n/** `HighlightShapeUtil`'s settings; see {@link ShapeUtil.configure}. */\nexport interface HighlightShapeOptions extends ShapeUtilOptions<HighlightShape, HighlightShapeUtilDisplayValues> {\n /** A multiplier on {@link HIGHLIGHT_STROKE_SIZES}; `1` draws the standard width. */\n strokeScale?: number\n /** How see-through a highlight is, `0..1`; see {@link HIGHLIGHT_OPACITY}. */\n opacity?: number\n}\n\n/** Resolve a highlight's display values against a theme. */\nexport function getHighlightDisplayValues(\n editor: unknown,\n shape: { props?: unknown },\n theme: TLTheme,\n colorMode: TLColorMode,\n options: HighlightShapeOptions = {},\n): HighlightShapeUtilDisplayValues {\n const base = getDefaultDisplayValues(editor, shape as TLStyledShape, theme, colorMode)\n const p = propsOf(shape)\n const colors = theme.colors[colorMode] ?? theme.colors.light\n const size = readStyle(p, \"size\", DefaultSizeStyle)\n const scale = readNumber(p, \"scale\", 1)\n return {\n ...base,\n highlightColor: getColorValue(colors, readStyle(p, \"color\", DefaultColorStyle), \"highlightSrgb\"),\n highlightStrokeWidth: HIGHLIGHT_STROKE_SIZES[size] * (options.strokeScale ?? 1) * scale,\n highlightOpacity: options.opacity ?? HIGHLIGHT_OPACITY,\n }\n}\n\n/** The stroke as one polyline, freehand runs smoothed. A highlight never closes. */\nexport function getHighlightOutlinePoints(shape: { props?: unknown }): VecLike[] {\n const out: VecLike[] = []\n for (const seg of readDrawSegments(shape)) {\n const pts = seg.type === \"free\" && seg.points.length >= 4 ? smoothPoints(seg.points) : seg.points\n for (const p of pts) out.push({ x: p.x, y: p.y })\n }\n return out\n}\n\n/** A translucent marker stroke, drawn behind the shapes it marks. */\nexport class HighlightShapeUtil extends ShapeUtil<HighlightShape, HighlightShapeUtilDisplayValues> {\n static override type = \"highlight\" as const\n static override props = highlightShapeProps\n static override migrations = highlightShapeMigrations\n // A method rather than an arrow so `configure()`'s overrides are visible\n // through `this`; see `NoteShapeUtil` for the same pattern.\n static override options: HighlightShapeOptions = {\n getDefaultDisplayValues(editor, shape, theme, colorMode) {\n return getHighlightDisplayValues(editor, shape, theme, colorMode, this)\n },\n }\n declare readonly options: HighlightShapeOptions\n\n getDefaultProps(): HighlightShapeProps {\n return { segments: [], color: \"black\", size: \"m\", isComplete: false, isPen: false, scale: 1 }\n }\n\n /**\n * The same freehand generator a draw shape uses, so a highlight and a pen\n * stroke recorded from the same movement have the same silhouette; only the\n * width, the colour and the opacity differ, and those are render style.\n */\n override getEngineGeometry(shape: HighlightShape): EngineGeometry {\n const segments = readDrawSegments(shape).map((seg) => ({\n points: seg.points.flatMap((q) => [q.x, q.y]),\n freehand: seg.type === \"free\",\n }))\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const seg of segments) {\n for (let i = 0; i < seg.points.length; i += 2) {\n const x = seg.points[i]!\n const y = seg.points[i + 1]!\n if (x < minX) minX = x\n if (x > maxX) maxX = x\n if (y < minY) minY = y\n if (y > maxY) maxY = y\n }\n }\n return {\n type: \"draw\",\n segments,\n closed: false,\n w: Number.isFinite(minX) ? maxX - minX : 0,\n h: Number.isFinite(minY) ? maxY - minY : 0,\n isClosed: false,\n isFilled: false,\n }\n }\n\n getGeometry(shape: HighlightShape): Geometry2d {\n const points = getHighlightOutlinePoints(shape)\n return new Polyline2d({ points: points.length === 0 ? [{ x: 0, y: 0 }] : points })\n }\n\n override getRenderStyle(shape: HighlightShape): StyleWords {\n const p = propsOf(shape)\n const colors = getThemeColors(this.editor)\n const size = readStyle(p, \"size\", DefaultSizeStyle)\n const scale = readNumber(p, \"scale\", 1)\n return {\n stroke: hexToRgba(getColorValue(colors, readStyle(p, \"color\", DefaultColorStyle), \"highlightSrgb\")),\n strokeWidth: HIGHLIGHT_STROKE_SIZES[size] * (this.options.strokeScale ?? 1) * scale,\n fill: 0,\n // Never `draw`: the points are already a recorded hand movement, and\n // running them through the hand-drawn generator a second time only adds\n // bulges the hand never made. Same reasoning as `DrawShapeUtil`.\n dash: 0,\n opacity: this.options.opacity ?? HIGHLIGHT_OPACITY,\n }\n }\n\n component(_shape: HighlightShape): ReactNode {\n return null\n }\n\n /**\n * The highlight belongs *behind* the shapes it marks, so a renderer with a\n * background layer draws it from here instead of from {@link component}.\n *\n * Both are `null` because the stroke is painted on the GPU from\n * {@link getRenderStyle}; the method exists so that a renderer asking \"does\n * this shape want a background pass?\" gets a truthful answer, and so a\n * subclass has the seam to paint one in the DOM.\n */\n backgroundComponent(_shape: HighlightShape): ReactNode {\n return null\n }\n\n override getIndicatorPath(shape: HighlightShape): Path2D {\n return polylinePath(getHighlightOutlinePoints(shape), false)\n }\n\n override canResize(_shape: HighlightShape): boolean {\n return true\n }\n\n override hideResizeHandles(_shape: HighlightShape): boolean {\n return false\n }\n\n override onResize(shape: HighlightShape, info: ResizeInfo<HighlightShape>): Partial<HighlightShape> {\n const { scaleX, scaleY, initialShape, newPoint } = info\n const segments = readDrawSegments(initialShape).map((seg) => ({\n ...seg,\n points: seg.points.map((p) => ({ ...p, x: p.x * scaleX, y: p.y * scaleY })),\n }))\n return { x: newPoint.x, y: newPoint.y, props: { ...shape.props, segments } }\n }\n}\n","/**\n * Turning a crop drag into a shape update.\n *\n * Cropping is not resizing: the content stays the size it was and the shape's\n * box moves over it, so a crop handle changes two things at once — the shape's\n * position and size, *and* the normalized window it shows. Getting the pair\n * consistent is the whole job, and it is the same job for every croppable\n * shape, so it lives here rather than in each util's `onCrop`.\n */\n\nimport {\n getUncroppedSize,\n type ShapeWithCrop,\n type TLCropInfo,\n type TLShapeCrop,\n} from \"@mocanvas/editor\"\n\n/** Limits {@link getCropBox} respects. */\nexport interface CropBoxOptions {\n /** The narrowest the shape's box may be cropped to, in page units. */\n minWidth?: number\n /** The shortest the shape's box may be cropped to, in page units. */\n minHeight?: number\n}\n\n/**\n * How small a crop may get by default.\n *\n * SEMANTICS-ASSUMED: not pinned by the docs. Small enough that a deliberate\n * sliver crop is possible, large enough that the shape never collapses to\n * something with no grabbable handles.\n */\nconst DEFAULT_MIN_CROP_SIZE = 8\n\nfunction clamp01(value: number): number {\n return value < 0 ? 0 : value > 1 ? 1 : value\n}\n\n/**\n * The shape update one step of a crop drag produces, or `undefined` when the\n * drag would change nothing.\n *\n * Returns a partial in the same form `onResize` does — `x`, `y` and the\n * changed props — so a util's `onCrop` can hand it straight back:\n *\n * ```ts\n * override onCrop(shape: ImageShape, info: TLCropInfo<ImageShape>) {\n * return getCropBox(shape, info, { minWidth: 32 })\n * }\n * ```\n *\n * The handle being dragged decides which of the four normalized edges moves.\n * Each edge is clamped so the window stays inside `0…1` and so the box stays\n * above the minimum; because every step recomputes from `info.initialShape`\n * rather than from the shape's current state, a drag that hits a clamp and\n * comes back lands exactly where it would have without the clamp.\n */\nexport function getCropBox<T extends ShapeWithCrop>(\n shape: T,\n info: TLCropInfo<T>,\n options: CropBoxOptions = {},\n): Partial<T> | undefined {\n const { handle, change, initialShape } = info\n const crop: TLShapeCrop = info.crop ?? { topLeft: { x: 0, y: 0 }, bottomRight: { x: 1, y: 1 } }\n const minWidth = options.minWidth ?? DEFAULT_MIN_CROP_SIZE\n const minHeight = options.minHeight ?? DEFAULT_MIN_CROP_SIZE\n\n // The content's full size at the shape's current scale: the frame the\n // normalized window is a fraction of, and what turns a pixel drag into one.\n const uncropped = getUncroppedSize({ w: initialShape.props.w, h: initialShape.props.h }, crop)\n if (uncropped.w <= 0 || uncropped.h <= 0) return undefined\n\n const movesLeft = handle === \"left\" || handle === \"top_left\" || handle === \"bottom_left\"\n const movesRight = handle === \"right\" || handle === \"top_right\" || handle === \"bottom_right\"\n const movesTop = handle === \"top\" || handle === \"top_left\" || handle === \"top_right\"\n const movesBottom = handle === \"bottom\" || handle === \"bottom_left\" || handle === \"bottom_right\"\n if (!movesLeft && !movesRight && !movesTop && !movesBottom) return undefined\n\n let { x: x0, y: y0 } = crop.topLeft\n let { x: x1, y: y1 } = crop.bottomRight\n\n // The most either edge may travel before the box is thinner than the minimum.\n const minCropW = minWidth / uncropped.w\n const minCropH = minHeight / uncropped.h\n\n if (movesLeft) x0 = clamp01(Math.min(x0 + change.x / uncropped.w, x1 - minCropW))\n if (movesRight) x1 = clamp01(Math.max(x1 + change.x / uncropped.w, x0 + minCropW))\n if (movesTop) y0 = clamp01(Math.min(y0 + change.y / uncropped.h, y1 - minCropH))\n if (movesBottom) y1 = clamp01(Math.max(y1 + change.y / uncropped.h, y0 + minCropH))\n\n const w = (x1 - x0) * uncropped.w\n const h = (y1 - y0) * uncropped.h\n if (w <= 0 || h <= 0) return undefined\n\n // A crop from the left or the top moves the shape as well as resizing it:\n // the content must not appear to slide under the window.\n const dx = movesLeft ? (x0 - crop.topLeft.x) * uncropped.w : 0\n const dy = movesTop ? (y0 - crop.topLeft.y) * uncropped.h : 0\n\n const next: TLShapeCrop = {\n topLeft: { x: x0, y: y0 },\n bottomRight: { x: x1, y: y1 },\n ...(crop.isCircle === undefined ? {} : { isCircle: crop.isCircle }),\n }\n\n return {\n x: initialShape.x + dx,\n y: initialShape.y + dy,\n props: { ...shape.props, w, h, crop: next },\n } as Partial<T>\n}\n","import {\n BaseBoxShapeUtil,\n Rectangle2d,\n type AssetId,\n type BaseShape,\n type Editor,\n type Geometry2d,\n getDefaultDisplayValues,\n type ImageAsset,\n type ShapeUtilOptions,\n type StyleWords,\n type TLColorMode,\n type TLDefaultDisplayValues,\n type TLStyledShape,\n type TLTheme,\n type TLCropInfo,\n} from \"@mocanvas/editor\"\nimport type { CSSProperties, ReactNode } from \"react\"\nimport { propsOf, readBoolean, readNumber, readString } from \"./prop-access\"\nimport { rectPath } from \"./indicator-paths\"\nimport { getCropBox } from \"./crop-box\"\nimport { imageShapeProps } from \"./shape-props\"\nimport { imageShapeMigrations } from \"./shape-migrations\"\n\n/** Normalized crop window: both corners in [0, 1] of the source image. */\nexport interface ImageCrop {\n topLeft: { x: number; y: number }\n bottomRight: { x: number; y: number }\n /** Whether the window is the circle inscribed in that rectangle. */\n isCircle?: boolean\n}\n\nexport interface ImageShapeProps {\n w: number\n h: number\n /** The image asset holding the pixels; `null` while nothing is attached. */\n assetId: AssetId | null\n /** Whether an animated image plays. */\n playing: boolean\n /** A hyperlink attached to the shape (not the image source). */\n url: string\n crop: ImageCrop | null\n flipX: boolean\n flipY: boolean\n altText: string\n}\n\nexport type ImageShape = BaseShape<\"image\", ImageShapeProps>\n\nexport const IMAGE_PLACEHOLDER_FILL = \"#eceff3\"\nexport const IMAGE_PLACEHOLDER_STROKE = \"#9fa8b2\"\n\n/**\n * The source the shape's pixels come from: the asset's `src` (a URL or data URL),\n * or `null` when the shape has no asset yet or the asset is still uploading.\n * `getImageTextureKey` turns it into a GPU texture; `component` draws the same\n * source in the DOM overlay while that texture loads (and for crops/flips).\n */\nexport function getImageTextureSource(editor: Editor, shape: ImageShape): string | null {\n const assetId = readString(propsOf(shape), \"assetId\", \"\") as AssetId | \"\"\n if (!assetId) return null\n const asset = editor.getAsset<ImageAsset>(assetId)\n if (!asset || asset.type !== \"image\") return null\n return asset.props.src ?? null\n}\n\n/**\n * Texture cache key for the shape's pixels, or `null` when it must stay on the\n * DOM overlay.\n *\n * The GPU path only covers the plain case. The engine maps uv `0..1` over the\n * shape's local geometry bounds, so a crop window or a flip would need the quad\n * to carry its own uvs; until the bridge does, cropped and flipped images (and\n * anything without a decoded source) are drawn by `component`.\n *\n * Assets are treated as immutable, so the key is the asset id: replacing an\n * asset's `src` in place keeps the cached texture.\n */\nexport function getImageTextureKey(editor: Editor, shape: ImageShape): string | null {\n const p = propsOf(shape)\n const assetId = readString(p, \"assetId\", \"\")\n if (!assetId || p[\"crop\"] || readBoolean(p, \"flipX\", false) || readBoolean(p, \"flipY\", false)) return null\n if (!canUploadImageTextures()) return null\n return getImageTextureSource(editor, shape) === null ? null : `asset:${assetId}`\n}\n\n/** Whether this environment can decode an image into a texture source at all. */\nexport function canUploadImageTextures(): boolean {\n return typeof createImageBitmap === \"function\" || typeof Image === \"function\"\n}\n\n/** Decode an image `src` (URL or data URL) into something the GPU can sample. */\nexport async function loadImageTextureSource(src: string): Promise<TexImageSource> {\n const isData = src.startsWith(\"data:\")\n if (!isData && typeof createImageBitmap === \"function\" && typeof fetch === \"function\") {\n const res = await fetch(src)\n if (!res.ok) throw new Error(`mocanvas: image asset request failed (${res.status})`)\n return await createImageBitmap(await res.blob())\n }\n return await loadHtmlImage(src, isData)\n}\n\nfunction loadHtmlImage(src: string, isData: boolean): Promise<HTMLImageElement> {\n if (typeof Image !== \"function\") return Promise.reject(new Error(\"mocanvas: no image decoder available\"))\n return new Promise((resolve, reject) => {\n const img = new Image()\n if (!isData) img.crossOrigin = \"anonymous\"\n img.onload = () => resolve(img)\n img.onerror = () => reject(new Error(\"mocanvas: image asset failed to decode\"))\n img.src = src\n })\n}\n\n/** CSS for the `<img>` so the crop window fills the shape's box; `null` crop shows the whole image. */\nexport function getImageCropStyle(shape: ImageShape): CSSProperties {\n const { w, h } = readImageBox(shape)\n const p = propsOf(shape)\n const crop = readImageCrop(shape)\n const flipX = readBoolean(p, \"flipX\", false)\n const flipY = readBoolean(p, \"flipY\", false)\n const transform = flipX || flipY ? `scale(${flipX ? -1 : 1}, ${flipY ? -1 : 1})` : undefined\n if (!crop) {\n return { position: \"absolute\", left: 0, top: 0, width: w, height: h, ...(transform ? { transform } : {}) }\n }\n const cw = Math.max(1e-6, crop.bottomRight.x - crop.topLeft.x)\n const ch = Math.max(1e-6, crop.bottomRight.y - crop.topLeft.y)\n const fullW = w / cw\n const fullH = h / ch\n return {\n position: \"absolute\",\n left: -crop.topLeft.x * fullW,\n top: -crop.topLeft.y * fullH,\n width: fullW,\n height: fullH,\n ...(transform ? { transform } : {}),\n }\n}\n\n/** The shape's box, with each side falling back to the util's default. */\nfunction readImageBox(shape: { props?: unknown }): { w: number; h: number } {\n const p = propsOf(shape)\n return { w: readNumber(p, \"w\", 100), h: readNumber(p, \"h\", 100) }\n}\n\n/** The crop window, or `null` when there is none or it is not shaped like one. */\nfunction readImageCrop(shape: { props?: unknown }): ImageCrop | null {\n const crop = propsOf(shape)[\"crop\"]\n if (typeof crop !== \"object\" || crop === null) return null\n const corners = crop as { topLeft?: unknown; bottomRight?: unknown }\n if (typeof corners.topLeft !== \"object\" || typeof corners.bottomRight !== \"object\") return null\n return {\n topLeft: { x: readNumber(corners.topLeft, \"x\", 0), y: readNumber(corners.topLeft, \"y\", 0) },\n bottomRight: { x: readNumber(corners.bottomRight, \"x\", 1), y: readNumber(corners.bottomRight, \"y\", 1) },\n isCircle: readBoolean(crop, \"isCircle\", false),\n }\n}\n\n/**\n * What an image shape paints with.\n *\n * An image has no styles at all — the pixels are the picture — so the only\n * values it adds are the placeholder it draws while there is nothing to show.\n */\nexport interface ImageShapeUtilDisplayValues extends TLDefaultDisplayValues {\n /** Fill of the frame drawn while the image has no asset or is still loading. */\n placeholderFill: string\n /** Border of that placeholder. */\n placeholderStroke: string\n}\n\n/** `ImageShapeUtil`'s settings; see {@link ShapeUtil.configure}. */\nexport interface ImageShapeOptions extends ShapeUtilOptions<ImageShape, ImageShapeUtilDisplayValues> {\n /** The narrowest a crop may make the shape, in page units. */\n minCropWidth?: number\n /** The shortest a crop may make the shape, in page units. */\n minCropHeight?: number\n}\n\n/** Resolve an image shape's display values; see {@link ImageShapeUtilDisplayValues}. */\nexport function getImageDisplayValues(\n editor: unknown,\n shape: { props?: unknown },\n theme: TLTheme,\n colorMode: TLColorMode,\n): ImageShapeUtilDisplayValues {\n return {\n ...getDefaultDisplayValues(editor, shape as TLStyledShape, theme, colorMode),\n placeholderFill: IMAGE_PLACEHOLDER_FILL,\n placeholderStroke: IMAGE_PLACEHOLDER_STROKE,\n }\n}\n\nexport class ImageShapeUtil extends BaseBoxShapeUtil<ImageShape> {\n static override type = \"image\" as const\n static override props = imageShapeProps\n static override migrations = imageShapeMigrations\n static override options: ImageShapeOptions = { getDefaultDisplayValues: getImageDisplayValues }\n declare readonly options: ImageShapeOptions\n\n /**\n * Cropping an image resizes the window, not the picture; the arithmetic is\n * shared with every other croppable shape.\n */\n onCrop(shape: ImageShape, info: TLCropInfo<ImageShape>): Partial<ImageShape> | undefined {\n return getCropBox<ImageShape>(shape, info, {\n ...(this.options.minCropWidth === undefined ? {} : { minWidth: this.options.minCropWidth }),\n ...(this.options.minCropHeight === undefined ? {} : { minHeight: this.options.minCropHeight }),\n })\n }\n\n getDefaultProps(): ImageShapeProps {\n return { w: 100, h: 100, assetId: null, playing: true, url: \"\", crop: null, flipX: false, flipY: false, altText: \"\" }\n }\n\n override getGeometry(shape: ImageShape): Geometry2d {\n const { w, h } = readImageBox(shape)\n return new Rectangle2d({ width: Math.max(1, w), height: Math.max(1, h), isFilled: true })\n }\n\n /** A white textured quad over the shape's bounds, or `null` for the DOM overlay path. */\n override getRenderStyle(shape: ImageShape): StyleWords | null {\n const key = getImageTextureKey(this.editor, shape)\n if (!key) return null\n const src = getImageTextureSource(this.editor, shape)\n if (!src) return null\n const texture = this.editor.textures.acquire(key, () => loadImageTextureSource(src))\n if (!texture) return null\n return { fill: 0xffffffff, stroke: 0, strokeWidth: 0, dash: 0, opacity: 1, texture }\n }\n\n /** The DOM overlay draws the image until (and unless) its texture is ready. */\n override needsOverlay(shape: ImageShape): boolean {\n if (super.needsOverlay(shape)) return true\n const key = getImageTextureKey(this.editor, shape)\n return key === null || !this.editor.textures.isReady(key)\n }\n\n component(shape: ImageShape): ReactNode {\n const { w, h } = readImageBox(shape)\n const crop = readImageCrop(shape)\n const altText = readString(propsOf(shape), \"altText\", \"\")\n const src = getImageTextureSource(this.editor, shape)\n const clip: CSSProperties = {\n position: \"absolute\",\n left: 0,\n top: 0,\n width: w,\n height: h,\n overflow: \"hidden\",\n ...(crop?.isCircle ? { borderRadius: \"50%\" } : {}),\n }\n if (!src) {\n return (\n <div\n style={{\n ...clip,\n boxSizing: \"border-box\",\n background: IMAGE_PLACEHOLDER_FILL,\n border: `1px dashed ${IMAGE_PLACEHOLDER_STROKE}`,\n }}\n aria-label={altText || \"image\"}\n />\n )\n }\n return (\n <div style={clip}>\n <img src={src} alt={altText} draggable={false} style={{ ...getImageCropStyle(shape), pointerEvents: \"none\", userSelect: \"none\" }} />\n </div>\n )\n }\n\n override getIndicatorPath(shape: ImageShape): Path2D {\n const { w, h } = readImageBox(shape)\n return rectPath(w, h)\n }\n\n override isAspectRatioLocked(_shape: ImageShape): boolean {\n return true\n }\n}\n","import {\n type EngineGeometry,\n CubicSpline2d,\n Polyline2d,\n ShapeUtil,\n STROKE_SIZES,\n DefaultColorStyle,\n DefaultDashStyle,\n DefaultSizeStyle,\n type BaseShape,\n type Geometry2d,\n getDefaultDisplayValues,\n type ShapeHandle,\n type ShapeUtilOptions,\n type StyleWords,\n type TLColorMode,\n type TLDefaultDisplayValues,\n type TLStyledShape,\n type TLTheme,\n} from \"@mocanvas/editor\"\nimport { getIndexBetween, sortByIndex, type IndexKey } from \"@mocanvas/store\"\nimport type { ReactNode } from \"react\"\nimport { lineShapeProps } from \"./shape-props\"\nimport { lineShapeMigrations } from \"./shape-migrations\"\nimport { propsOf, readEnum, readNumber, readString, readStyle } from \"./prop-access\"\nimport { getStrokeRgba, getDashId, getThemeColors } from \"./shape-theme\"\nimport { catmullRomToBezier } from \"./spline-helpers\"\nimport { pathWordsToSvgD } from \"./svg-path\"\nimport { svgPath } from \"./indicator-paths\"\n\n/**\n * What a line paints with. A line is a stroke and nothing else, so the one\n * thing it adds is its own `scale` applied to the style's width.\n */\nexport interface LineShapeUtilDisplayValues extends TLDefaultDisplayValues {\n /** `strokeWidth` with the shape's own `scale` applied. */\n scaledStrokeWidth: number\n}\n\n/** `LineShapeUtil`'s settings; see {@link ShapeUtil.configure}. */\nexport interface LineShapeOptions extends ShapeUtilOptions<LineShape, LineShapeUtilDisplayValues> {}\n\n/** Resolve a line's display values; see {@link LineShapeUtilDisplayValues}. */\nexport function getLineDisplayValues(\n editor: unknown,\n shape: { props?: unknown },\n theme: TLTheme,\n colorMode: TLColorMode,\n): LineShapeUtilDisplayValues {\n const base = getDefaultDisplayValues(editor, shape as TLStyledShape, theme, colorMode)\n return { ...base, scaledStrokeWidth: base.strokeWidth * readNumber(propsOf(shape), \"scale\", 1) }\n}\n\nexport interface LinePoint {\n id: string\n index: string\n x: number\n y: number\n}\n\n/** The `@tldraw/tlschema` spelling of {@link LinePoint}. */\nexport type TLLineShapePoint = LinePoint\n\nexport interface LineShapeProps {\n color: DefaultColorStyle\n dash: DefaultDashStyle\n size: DefaultSizeStyle\n spline: \"line\" | \"cubic\"\n points: Record<string, LinePoint>\n scale: number\n}\n\nexport type LineShape = BaseShape<\"line\", LineShapeProps>\n\nconst SPLINES = [\"line\", \"cubic\"] as const\n\n/** The line's points in drawing order, skipping any entry that is not a point. */\nexport function getLinePoints(shape: { props?: unknown }): LinePoint[] {\n const stored = propsOf(shape)[\"points\"]\n if (typeof stored !== \"object\" || stored === null) return []\n const points: (LinePoint & { index: IndexKey })[] = []\n for (const [id, value] of Object.entries(stored as Record<string, unknown>)) {\n if (typeof value !== \"object\" || value === null) continue\n points.push({\n id: readString(value, \"id\", id),\n index: readString(value, \"index\", \"a1\") as IndexKey,\n x: readNumber(value, \"x\", 0),\n y: readNumber(value, \"y\", 0),\n })\n }\n return sortByIndex(points)\n}\n\nfunction midIndex(a: string, b: string): string {\n try {\n return getIndexBetween(a as IndexKey, b as IndexKey)\n } catch {\n return `${a}V`\n }\n}\n\nexport class LineShapeUtil extends ShapeUtil<LineShape, LineShapeUtilDisplayValues> {\n static override type = \"line\" as const\n static override props = lineShapeProps\n static override migrations = lineShapeMigrations\n static override options: LineShapeOptions = { getDefaultDisplayValues: getLineDisplayValues }\n declare readonly options: LineShapeOptions\n\n getDefaultProps(): LineShapeProps {\n return {\n color: \"black\",\n dash: \"draw\",\n size: \"m\",\n spline: \"line\",\n points: {\n a1: { id: \"a1\", index: \"a1\", x: 0, y: 0 },\n a2: { id: \"a2\", index: \"a2\", x: 100, y: 100 },\n },\n scale: 1,\n }\n }\n\n /**\n * A line is its points: the engine fits the spline. `w`/`h` are the point\n * extents; a cubic spline through them stays within its control hull, and\n * this util has neither an overlay nor a label, so those words feed a\n * fallback the engine never reaches.\n */\n override getEngineGeometry(shape: LineShape): EngineGeometry {\n const pts = getLinePoints(shape)\n const points: number[] = []\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const q of pts) {\n points.push(q.x, q.y)\n if (q.x < minX) minX = q.x\n if (q.x > maxX) maxX = q.x\n if (q.y < minY) minY = q.y\n if (q.y > maxY) maxY = q.y\n }\n const cubic = readEnum(propsOf(shape), \"spline\", SPLINES, \"line\") === \"cubic\" && pts.length > 2\n return {\n type: cubic ? \"spline\" : \"poly\",\n points,\n closed: false,\n w: Number.isFinite(minX) ? maxX - minX : 0,\n h: Number.isFinite(minY) ? maxY - minY : 0,\n isClosed: false,\n isFilled: false,\n }\n }\n\n getGeometry(shape: LineShape): Geometry2d {\n const points = getLinePoints(shape)\n if (points.length === 0) return new Polyline2d({ points: [{ x: 0, y: 0 }] })\n if (readEnum(propsOf(shape), \"spline\", SPLINES, \"line\") === \"cubic\" && points.length > 2) {\n return new CubicSpline2d({ segments: catmullRomToBezier(points), isClosed: false, isFilled: false })\n }\n return new Polyline2d({ points })\n }\n\n override getRenderStyle(shape: LineShape): StyleWords {\n const p = propsOf(shape)\n const color = readStyle(p, \"color\", DefaultColorStyle)\n const size = readStyle(p, \"size\", DefaultSizeStyle)\n return {\n stroke: getStrokeRgba(color, getThemeColors(this.editor)),\n strokeWidth: STROKE_SIZES[size] * readNumber(p, \"scale\", 1),\n fill: 0,\n dash: getDashId(readStyle(p, \"dash\", DefaultDashStyle)),\n opacity: 1,\n }\n }\n\n component(_shape: LineShape): ReactNode {\n return null\n }\n\n override getIndicatorPath(shape: LineShape): Path2D {\n return svgPath(pathWordsToSvgD(this.getGeometry(shape).toPathWords()))\n }\n\n /**\n * A selected line shows its own outline and its points, and nothing else — the\n * same selection an arrow gets, and for the same reason: a line *is* its\n * points, so a box around them is chrome with nothing to do. Turning it means\n * moving the points, and resizing it means moving the points, so neither the\n * rotate handle nor the resize handles have any work either.\n *\n * All four answers matter together. `selectionHandles` only drops the frame\n * when resize *and* rotate are both hidden, and `hideSelectionBoundsFg` must\n * stay false or the shape loses its own outline as well and a selected line\n * shows nothing at all.\n */\n override hideSelectionBoundsBg(_shape: LineShape): boolean {\n return true\n }\n\n override hideSelectionBoundsFg(_shape: LineShape): boolean {\n return false\n }\n\n override hideResizeHandles(_shape: LineShape): boolean {\n return true\n }\n\n override hideRotateHandle(_shape: LineShape): boolean {\n return true\n }\n\n override getHandles(shape: LineShape): ShapeHandle[] {\n const points = getLinePoints(shape)\n const handles: ShapeHandle[] = []\n for (let i = 0; i < points.length; i++) {\n const p = points[i]!\n handles.push({ id: p.id, type: \"vertex\", index: p.index, x: p.x, y: p.y })\n const next = points[i + 1]\n if (next) {\n handles.push({\n id: `mid:${p.id}:${next.id}`,\n type: \"virtual\",\n index: midIndex(p.index, next.index),\n x: (p.x + next.x) / 2,\n y: (p.y + next.y) / 2,\n })\n }\n }\n return handles\n }\n\n override onHandleDrag(shape: LineShape, info: { handle: ShapeHandle }): Partial<LineShape> {\n const { handle } = info\n const points: Record<string, LinePoint> = {}\n for (const p of getLinePoints(shape)) points[p.id] = p\n const existing = points[handle.id]\n if (existing) {\n points[handle.id] = { ...existing, x: handle.x, y: handle.y }\n } else {\n // Dragging a virtual midpoint promotes it to a real point.\n points[handle.id] = { id: handle.id, index: handle.index, x: handle.x, y: handle.y }\n }\n return { props: { ...shape.props, points } }\n }\n}\n","import { Rectangle2d, ShapeUtil, type BaseShape, type Geometry2d, type StyleWords, type TLIndicatorPath } from \"@mocanvas/editor\"\nimport { boxPath } from \"./indicator-paths\"\nimport { groupShapeProps } from \"./shape-props\"\nimport { groupShapeMigrations } from \"./shape-migrations\"\n\n/** Dash pattern of a group's outline, in screen px: 4 on, 4 off. */\nconst GROUP_INDICATOR_DASH = [4, 4] as const\n\n/**\n * A group's props: none. Named so an app can spell the empty bag the same way\n * the other shapes' props are spelled.\n */\nexport type GroupShapeProps = Record<string, never>\n\n/** The `@tldraw/tlschema` spelling of {@link GroupShapeProps}. */\nexport type TLGroupShapeProps = GroupShapeProps\n\nexport type GroupShape = BaseShape<\"group\", GroupShapeProps>\n\n/** A container with no visuals of its own; its bounds are the union of its children. */\nexport class GroupShapeUtil extends ShapeUtil<GroupShape> {\n static override type = \"group\" as const\n static override props = groupShapeProps\n static override migrations = groupShapeMigrations\n\n getDefaultProps(): GroupShape[\"props\"] {\n return {}\n }\n\n getGeometry(shape: GroupShape): Geometry2d {\n const editor = this.editor\n const children = editor.getSortedChildIdsForParent(shape.id)\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const id of children) {\n const child = editor.getShape(id)\n if (!child) continue\n const b = editor.getShapeGeometryBounds(child)\n if (!b) continue\n // child bounds in group space\n for (const c of b.corners) {\n const r = child.rotation\n const x = child.x + c.x * Math.cos(r) - c.y * Math.sin(r)\n const y = child.y + c.x * Math.sin(r) + c.y * Math.cos(r)\n if (x < minX) minX = x\n if (y < minY) minY = y\n if (x > maxX) maxX = x\n if (y > maxY) maxY = y\n }\n }\n if (!Number.isFinite(minX)) return new Rectangle2d({ width: 1, height: 1, isFilled: false })\n return new Rectangle2d({ x: minX, y: minY, width: Math.max(1, maxX - minX), height: Math.max(1, maxY - minY), isFilled: false })\n }\n\n override getRenderStyle(_shape: GroupShape): StyleWords {\n // Invisible on the GPU; hit-testing goes through children.\n return { fill: 0, stroke: 0, strokeWidth: 0, dash: 0, opacity: 1 }\n }\n\n override canResize(): boolean {\n return false\n }\n override hideResizeHandles(): boolean {\n return true\n }\n override hideSelectionBoundsBg(): boolean {\n return true\n }\n override canReceiveNewChildrenOfType(): boolean {\n return true\n }\n\n component() {\n return null\n }\n\n /** Dashed, so a group's outline is never mistaken for a shape of its own. */\n override getIndicatorPath(shape: GroupShape): TLIndicatorPath {\n return { path: boxPath(this.getGeometry(shape).bounds), lineDash: GROUP_INDICATOR_DASH }\n }\n}\n","/**\n * The elbow arrow's *model*: the boxes, edges and ranges a route is chosen\n * from, and the route once it has been chosen.\n *\n * `elbow-helpers.ts` answers the narrow question \"given two points and two\n * axes, what is the polyline?\". This module answers the wider one an arrow\n * bound to two shapes actually asks: *which side of each shape should the\n * arrow leave and enter, and where along that side?* The answer needs the two\n * shapes' boxes, each box grown by the distance an arrow is kept clear of it,\n * the span of each edge an arrow may attach anywhere along, and the corridor\n * between the two boxes that a middle leg can slide in.\n *\n * SEMANTICS-ASSUMED throughout. The published docs name these types but do not\n * list their members, and the clean-room rule forbids reading the reference\n * implementation. The shapes below are what the routing this library already\n * performs actually needs, named after the documented types; where a choice was\n * free it went to the reading that keeps the route stable as a shape is\n * dragged, because a routing that flips between two equally good answers on\n * every frame is the failure mode that matters.\n */\n\nimport { Box, Vec, type VecLike } from \"@mocanvas/editor\"\nimport { getElbowRoute, type ElbowAxis, type ElbowRoute, type ElbowRouteOptions } from \"./elbow-helpers\"\n\n/** Which side of a box an elbow arrow attaches to. */\nexport type ElbowArrowSide = \"top\" | \"right\" | \"bottom\" | \"left\"\n\n/** The four sides, in clockwise order from the top. */\nexport const ELBOW_ARROW_SIDES: readonly ElbowArrowSide[] = [\"top\", \"right\", \"bottom\", \"left\"]\n\n/** The axis a leg attached to `side` runs along. */\nexport function getElbowArrowSideAxis(side: ElbowArrowSide): ElbowAxis {\n return side === \"left\" || side === \"right\" ? \"x\" : \"y\"\n}\n\n/** A closed span on one axis, in page units. `min` is always `<= max`. */\nexport interface ElbowArrowRange {\n min: number\n max: number\n}\n\n/**\n * One side of a box, as the router sees it.\n *\n * `value` is where the side sits on its own axis (a left or right edge has an\n * x, a top or bottom edge has a y); `cross` is how far the attachment point may\n * slide along the side, and `crossTarget` is where it would like to sit — the\n * centre, unless a bound anchor asked for somewhere else. `expanded` is `value`\n * pushed outwards by {@link ElbowArrowOptions.expandDistance}, which is where a\n * leg parallel to the side is allowed to run, or `null` when the side may not\n * be expanded because the other box is already inside that margin.\n */\nexport interface ElbowArrowEdge {\n value: number\n cross: ElbowArrowRange\n crossTarget: number\n expanded: number | null\n}\n\n/** A box's four sides, keyed by side. A side is `null` when nothing may attach to it. */\nexport interface ElbowArrowBoxEdges {\n top: ElbowArrowEdge | null\n right: ElbowArrowEdge | null\n bottom: ElbowArrowEdge | null\n left: ElbowArrowEdge | null\n}\n\n/**\n * A box the router works with, in both the sizes it needs: the shape's own\n * bounds, and those bounds grown by the clearance an arrow keeps from them.\n */\nexport interface ElbowArrowBox {\n /** The shape's bounds, in the arrow's space. */\n original: Box\n /** {@link ElbowArrowBox.original} grown by {@link ElbowArrowOptions.expandDistance}. */\n expanded: Box\n}\n\n/**\n * One end of an elbow arrow: the box it attaches to, plus how it may attach.\n *\n * A terminal that is not bound to anything is still a target box — a\n * zero-sized one at the terminal's point, with `isPoint` set — so the router\n * has one shape of input rather than two.\n */\nexport interface ElbowArrowTargetBox extends ElbowArrowBox {\n edges: ElbowArrowBoxEdges\n /** The point the arrow aims at: the anchor if bound, else the box's centre. */\n target: Vec\n /** Whether this end is a bare point rather than a bound shape. */\n isPoint: boolean\n /** Whether the terminal must land exactly on {@link ElbowArrowTargetBox.target}. */\n isExact: boolean\n}\n\n/**\n * The two ends and the space they share.\n *\n * `common` is the union of the two expanded boxes: the region the whole route\n * is contained in, which is what a caller culls and hit-tests against.\n */\nexport interface ElbowArrowBoxes {\n A: ElbowArrowTargetBox\n B: ElbowArrowTargetBox\n common: ElbowArrowBox\n}\n\n/** How much room an elbow arrow gives itself. */\nexport interface ElbowArrowOptions {\n /** How far outside a bound shape a leg parallel to it runs. */\n expandDistance: number\n /** The shortest leg the router will emit; shorter ones are absorbed into their neighbours. */\n minElbowLegLength: number\n /** How close to a corner an arrow may attach, as a fraction of the side's length, `0..0.5`. */\n minArrowDistanceFromCorner: number\n /** Corner fillet radius, before the per-corner clamp {@link roundElbowCorners} applies. */\n cornerRadius: number\n}\n\n/**\n * The defaults, in page units.\n *\n * SEMANTICS-ASSUMED: `expandDistance` is a little over the widest default\n * stroke so an arrow beside a shape never overlaps it; `minElbowLegLength` is\n * large enough that a fillet at each end of a leg cannot swallow it whole.\n */\nexport const DEFAULT_ELBOW_ARROW_OPTIONS: ElbowArrowOptions = {\n expandDistance: 16,\n minElbowLegLength: 24,\n minArrowDistanceFromCorner: 0.15,\n cornerRadius: 12,\n}\n\n/**\n * The handle that slides an elbow's middle leg.\n *\n * `axis` is the axis the leg *slides along*, `point` is where the handle sits\n * now, and `range` is how far it may travel — the corridor between the two\n * boxes, so a dragged handle cannot be pushed inside either shape.\n */\nexport interface ElbowArrowMidpointHandle {\n axis: ElbowAxis\n point: Vec\n range: ElbowArrowRange\n}\n\n/**\n * A routed elbow: the polyline, and everything a caller needs to describe it.\n *\n * `name` identifies which of the router's cases produced it (`\"hvh\"`, `\"vh\"`,\n * `\"straight\"`, …). It is not decoration: when two candidate routes are the\n * same length the name is the tie-break, and keeping the previous frame's name\n * is what stops a route flipping between two equally good answers while a\n * shape is dragged.\n */\nexport interface ElbowArrowRoute {\n name: string\n /** The drawn polyline, corners already filleted. */\n points: Vec[]\n /** The corner points before filleting — what a handle or a hit test wants. */\n corners: Vec[]\n /** Total length of the un-filleted route; the router's cost function. */\n distance: number\n /** The side of `A` the arrow leaves, or `null` when `A` is a bare point. */\n aEdge: ElbowArrowSide | null\n /** The side of `B` the arrow enters, or `null` when `B` is a bare point. */\n bEdge: ElbowArrowSide | null\n midpointHandle: ElbowArrowMidpointHandle | null\n}\n\n/** Everything the router derived, before it picked a route. */\nexport interface ElbowArrowInfoWithoutRoute {\n options: ElbowArrowOptions\n A: ElbowArrowTargetBox\n B: ElbowArrowTargetBox\n common: ElbowArrowBox\n /** The x a vertical middle leg would sit at, or `null` when the boxes overlap on x. */\n midX: number | null\n /** The y a horizontal middle leg would sit at, or `null` when the boxes overlap on y. */\n midY: number | null\n /** The clear gap between the two expanded boxes on each axis; `0` when they overlap. */\n gapX: number\n gapY: number\n}\n\n/** {@link ElbowArrowInfoWithoutRoute} plus the route that was picked. */\nexport interface ElbowArrowInfo extends ElbowArrowInfoWithoutRoute {\n /** `null` when the two ends are so close that no elbow can be drawn between them. */\n route: ElbowArrowRoute | null\n}\n\n/**\n * The elbow member of the arrow-info union — what `getArrowInfo` returns for\n * an arrow whose `kind` is `\"elbow\"`, alongside the arc and straight members.\n */\nexport interface TLElbowArrowInfo {\n /** Discriminates this from the arc and straight members. */\n type: \"elbow\"\n /** The start terminal in the arrow's own space, after binding resolution. */\n start: VecLike\n /** The end terminal in the arrow's own space, after binding resolution. */\n end: VecLike\n /** The routed body. */\n route: ElbowArrowRoute\n /** Whether the arrow could be routed at all; a degenerate arrow is not drawn. */\n isValid: boolean\n}\n\n/* ---- building the model -------------------------------------------------- */\n\nfunction range(a: number, b: number): ElbowArrowRange {\n return a <= b ? { min: a, max: b } : { min: b, max: a }\n}\n\n/** Whether `value` lies inside `span`, inclusive. */\nexport function isInElbowArrowRange(span: ElbowArrowRange, value: number): boolean {\n return value >= span.min && value <= span.max\n}\n\n/**\n * The four sides of `box` as the router sees them.\n *\n * `target` is the point the arrow aims at — the bound anchor, or the centre —\n * and it is what each side's `crossTarget` is pulled towards, clamped away\n * from the corners by {@link ElbowArrowOptions.minArrowDistanceFromCorner} so\n * an arrow never appears to attach to a corner rather than to a side.\n */\nexport function getElbowArrowBoxEdges(\n box: Box,\n target: VecLike = box.center,\n options: ElbowArrowOptions = DEFAULT_ELBOW_ARROW_OPTIONS,\n): ElbowArrowBoxEdges {\n const inset = options.minArrowDistanceFromCorner\n const clampX = (value: number): number => {\n const margin = box.width * inset\n return Math.min(Math.max(value, box.minX + margin), box.maxX - margin)\n }\n const clampY = (value: number): number => {\n const margin = box.height * inset\n return Math.min(Math.max(value, box.minY + margin), box.maxY - margin)\n }\n const expand = options.expandDistance\n return {\n top: { value: box.minY, cross: range(box.minX, box.maxX), crossTarget: clampX(target.x), expanded: box.minY - expand },\n bottom: { value: box.maxY, cross: range(box.minX, box.maxX), crossTarget: clampX(target.x), expanded: box.maxY + expand },\n left: { value: box.minX, cross: range(box.minY, box.maxY), crossTarget: clampY(target.y), expanded: box.minX - expand },\n right: { value: box.maxX, cross: range(box.minY, box.maxY), crossTarget: clampY(target.y), expanded: box.maxX + expand },\n }\n}\n\n/** Grow `box` by `distance` on every side. */\nfunction expandBox(box: Box, distance: number): Box {\n return Box.FromMinMax(box.minX - distance, box.minY - distance, box.maxX + distance, box.maxY + distance)\n}\n\n/**\n * One end of an arrow as a target box.\n *\n * Pass a `Box` for a bound terminal and a point for a free one; a free terminal\n * becomes a zero-sized box at that point, with `isPoint` set, so the router has\n * one kind of input to reason about.\n */\nexport function getElbowArrowTargetBox(\n boxOrPoint: Box | VecLike,\n options: ElbowArrowOptions = DEFAULT_ELBOW_ARROW_OPTIONS,\n extra: { target?: VecLike; isExact?: boolean } = {},\n): ElbowArrowTargetBox {\n const isPoint = !(boxOrPoint instanceof Box)\n const original = isPoint\n ? Box.FromMinMax(boxOrPoint.x, boxOrPoint.y, boxOrPoint.x, boxOrPoint.y)\n : (boxOrPoint as Box)\n const target = Vec.From(extra.target ?? original.center)\n return {\n original,\n expanded: expandBox(original, options.expandDistance),\n edges: isPoint ? { top: null, right: null, bottom: null, left: null } : getElbowArrowBoxEdges(original, target, options),\n target,\n isPoint,\n isExact: extra.isExact ?? false,\n }\n}\n\n/** The two ends and their union; see {@link ElbowArrowBoxes}. */\nexport function getElbowArrowBoxes(A: ElbowArrowTargetBox, B: ElbowArrowTargetBox): ElbowArrowBoxes {\n const union = (a: Box, b: Box): Box => Box.FromMinMax(Math.min(a.minX, b.minX), Math.min(a.minY, b.minY), Math.max(a.maxX, b.maxX), Math.max(a.maxY, b.maxY))\n return { A, B, common: { original: union(A.original, B.original), expanded: union(A.expanded, B.expanded) } }\n}\n\n/** Which side of `box` the point `to` sits off, or `null` when it is inside. */\nexport function getElbowArrowSideTowards(box: Box, to: VecLike): ElbowArrowSide | null {\n const dx = to.x < box.minX ? to.x - box.minX : to.x > box.maxX ? to.x - box.maxX : 0\n const dy = to.y < box.minY ? to.y - box.minY : to.y > box.maxY ? to.y - box.maxY : 0\n if (dx === 0 && dy === 0) return null\n if (Math.abs(dx) >= Math.abs(dy)) return dx < 0 ? \"left\" : \"right\"\n return dy < 0 ? \"top\" : \"bottom\"\n}\n\n/** The un-filleted length of a corner list. */\nfunction routeDistance(corners: readonly Vec[]): number {\n let total = 0\n for (let i = 1; i < corners.length; i++) total += Vec.Dist(corners[i - 1]!, corners[i]!)\n return total\n}\n\n/**\n * Lift the polyline `elbow-helpers` produced into the documented route shape.\n *\n * `name` is the router's case: `\"hvh\"` and `\"vhv\"` for the three-leg routes,\n * `\"hv\"` and `\"vh\"` for the two-leg ones, `\"straight\"` when the terminals line\n * up. It is derived from the corners rather than passed in, so a route and its\n * name can never disagree.\n */\nexport function toElbowArrowRoute(\n route: ElbowRoute,\n ends: { aEdge?: ElbowArrowSide | null; bEdge?: ElbowArrowSide | null; range?: ElbowArrowRange } = {},\n): ElbowArrowRoute {\n const legs: string[] = []\n for (let i = 1; i < route.corners.length; i++) {\n const a = route.corners[i - 1]!\n const b = route.corners[i]!\n legs.push(Math.abs(b.x - a.x) >= Math.abs(b.y - a.y) ? \"h\" : \"v\")\n }\n const midLeg = route.midLeg\n return {\n name: legs.length <= 1 ? \"straight\" : legs.join(\"\"),\n points: route.points,\n corners: route.corners,\n distance: routeDistance(route.corners),\n aEdge: ends.aEdge ?? null,\n bEdge: ends.bEdge ?? null,\n midpointHandle:\n midLeg && route.slideAxis\n ? {\n axis: route.slideAxis,\n point: Vec.Med(midLeg[0], midLeg[1]),\n range: ends.range ?? range(route.corners[0]![route.slideAxis], route.corners.at(-1)![route.slideAxis]),\n }\n : null,\n }\n}\n\n/**\n * Route an elbow arrow between two ends, and report everything the routing was\n * derived from.\n *\n * The route itself still comes from {@link getElbowRoute}: this adds the side\n * picking (which edge of each box the arrow leaves and enters) and the gaps\n * that decide where a middle leg may sit.\n */\nexport function getElbowArrowInfo(\n A: ElbowArrowTargetBox,\n B: ElbowArrowTargetBox,\n options: ElbowArrowOptions = DEFAULT_ELBOW_ARROW_OPTIONS,\n routeOptions: Pick<ElbowRouteOptions, \"midPoint\"> = {},\n): ElbowArrowInfo {\n const boxes = getElbowArrowBoxes(A, B)\n const gapX = Math.max(0, Math.max(B.expanded.minX - A.expanded.maxX, A.expanded.minX - B.expanded.maxX))\n const gapY = Math.max(0, Math.max(B.expanded.minY - A.expanded.maxY, A.expanded.minY - B.expanded.maxY))\n // A middle leg only has somewhere to sit when the two boxes are clear of each\n // other on that axis; where they overlap, running a leg down the middle would\n // put it inside one of the shapes.\n const midX = gapX > 0 ? (Math.max(A.expanded.minX, B.expanded.minX) + Math.min(A.expanded.maxX, B.expanded.maxX)) / 2 : null\n const midY = gapY > 0 ? (Math.max(A.expanded.minY, B.expanded.minY) + Math.min(A.expanded.maxY, B.expanded.maxY)) / 2 : null\n\n const aEdge = A.isPoint ? null : getElbowArrowSideTowards(A.original, B.target)\n const bEdge = B.isPoint ? null : getElbowArrowSideTowards(B.original, A.target)\n const routed = getElbowRoute(A.target, B.target, {\n ...(routeOptions.midPoint === undefined ? {} : { midPoint: routeOptions.midPoint }),\n ...(aEdge ? { startAxis: getElbowArrowSideAxis(aEdge) } : {}),\n ...(bEdge ? { endAxis: getElbowArrowSideAxis(bEdge) } : {}),\n cornerRadius: options.cornerRadius,\n })\n const degenerate = Vec.Dist(A.target, B.target) < 1e-6\n return {\n options,\n A,\n B,\n common: boxes.common,\n midX,\n midY,\n gapX,\n gapY,\n route: degenerate ? null : toElbowArrowRoute(routed, { aEdge, bEdge }),\n }\n}\n","// Registers the built-in shapes in the editor's global prop map (types only).\nimport \"./register\"\nimport type { ShapeUtilConstructor } from \"@mocanvas/editor\"\nimport { ArrowShapeUtil } from \"./ArrowShapeUtil\"\nimport { BookmarkShapeUtil } from \"./BookmarkShapeUtil\"\nimport { DrawShapeUtil } from \"./DrawShapeUtil\"\nimport { EmbedShapeUtil } from \"./EmbedShapeUtil\"\nimport { FrameShapeUtil } from \"./FrameShapeUtil\"\nimport { GeoShapeUtil } from \"./GeoShapeUtil\"\nimport { HighlightShapeUtil } from \"./HighlightShapeUtil\"\nimport { ImageShapeUtil } from \"./ImageShapeUtil\"\nimport { LineShapeUtil } from \"./LineShapeUtil\"\nimport { NoteShapeUtil } from \"./NoteShapeUtil\"\nimport { TextShapeUtil } from \"./TextShapeUtil\"\nimport { VideoShapeUtil } from \"./VideoShapeUtil\"\n\nexport * from \"./GeoShapeUtil\"\nexport * from \"./HighlightShapeUtil\"\nexport * from \"./DrawShapeUtil\"\nexport * from \"./LineShapeUtil\"\nexport * from \"./ArrowShapeUtil\"\nexport * from \"./TextShapeUtil\"\nexport * from \"./NoteShapeUtil\"\nexport * from \"./FrameShapeUtil\"\nexport * from \"./ImageShapeUtil\"\nexport * from \"./BookmarkShapeUtil\"\nexport * from \"./EmbedShapeUtil\"\nexport * from \"./VideoShapeUtil\"\nexport * from \"./shape-theme\"\nexport * from \"./geo-helpers\"\nexport * from \"./geo-types\"\nexport * from \"./arrow-helpers\"\nexport * from \"./spline-helpers\"\nexport * from \"./draw-helpers\"\nexport * from \"./text-helpers\"\nexport * from \"./prop-access\"\nexport { pathWordsToSvgD, transformPathWords } from \"./svg-path\"\nexport * from \"./indicator-paths\"\n\n/** The built-in shape utils, in the order they are registered. */\nexport * from \"./GroupShapeUtil\"\nimport { GroupShapeUtil } from \"./GroupShapeUtil\"\n\nexport const defaultShapeUtils: ShapeUtilConstructor[] = [\n GroupShapeUtil,\n GeoShapeUtil,\n DrawShapeUtil,\n HighlightShapeUtil,\n LineShapeUtil,\n ArrowShapeUtil,\n TextShapeUtil,\n NoteShapeUtil,\n FrameShapeUtil,\n ImageShapeUtil,\n BookmarkShapeUtil,\n EmbedShapeUtil,\n VideoShapeUtil,\n]\nexport * from \"./elbow-helpers\"\nexport * from \"./elbow-arrow-types\"\nexport * from \"./shape-props\"\nexport * from \"./shape-migrations\"\nexport * from \"./crop-box\"\n","import { createStore, Editor, type CurrentUser, type EditorStoreSnapshot, type ShapeUtilConstructor, type BindingUtilConstructor } from \"@mocanvas/editor\"\nimport { useEffect, useState, type CSSProperties } from \"react\"\nimport { defaultBindingUtils } from \"../bindings\"\nimport { defaultShapeUtils } from \"../shapes\"\n\n/**\n * A snapshot, rendered as a static picture.\n *\n * The point is that it is *not* an editor: no engine, no event handlers, no\n * store subscription. A document listing, a thumbnail grid or a printed report\n * needs the drawing and none of the machinery, and mounting a real editor per\n * thumbnail is what makes those pages unusable.\n *\n * The snapshot is rendered through the same SVG exporter the file export uses,\n * so a thumbnail and a downloaded file agree.\n */\nexport interface TldrawImageProps {\n /** The document to draw. */\n snapshot: EditorStoreSnapshot\n /** Which page to draw. Defaults to the snapshot's current page. */\n pageId?: string\n /** Draw only these shapes. */\n shapeIds?: readonly string[]\n /** Page units of padding around the shapes. */\n padding?: number\n /** Paint the theme's background behind the shapes. */\n background?: boolean\n /** Render with the dark theme. */\n darkMode?: boolean\n /** Extra shape utils beyond the defaults, for a document with custom shapes. */\n shapeUtils?: readonly ShapeUtilConstructor[]\n /** Extra binding utils beyond the defaults. */\n bindingUtils?: readonly BindingUtilConstructor[]\n /** Owns the preferences the render reads. */\n user?: CurrentUser\n /** Accessible description of the drawing. Empty marks it decorative. */\n alt?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A snapshot as an inline SVG.\n *\n * Rendered in an effect rather than during render: building the editor and\n * walking the document is work, and doing it synchronously would block the\n * first paint of whatever page is showing the thumbnail.\n */\nexport function TldrawImage({\n snapshot,\n pageId,\n shapeIds,\n padding,\n background,\n darkMode,\n shapeUtils,\n bindingUtils,\n user,\n alt,\n className,\n style,\n}: TldrawImageProps) {\n const [svg, setSvg] = useState<string | null>(null)\n const [error, setError] = useState<unknown>(null)\n\n useEffect(() => {\n let disposed = false\n let editor: Editor | null = null\n const container = typeof document === \"undefined\" ? (null as unknown as HTMLElement) : document.createElement(\"div\")\n try {\n const store = createStore({\n shapeUtils: [...defaultShapeUtils, ...(shapeUtils ?? [])],\n bindingUtils: [...defaultBindingUtils, ...(bindingUtils ?? [])],\n })\n editor = new Editor({\n store,\n shapeUtils: [...defaultShapeUtils, ...(shapeUtils ?? [])],\n bindingUtils: [...defaultBindingUtils, ...(bindingUtils ?? [])],\n // No tools and a detached container: this editor exists to be read,\n // never pointed at. The container is a bare element rather than the\n // page's, so nothing here can style or measure against the host.\n tools: [],\n getContainer: () => container,\n ...(user ? { user } : {}),\n })\n editor.loadSnapshot(snapshot)\n if (pageId) editor.setCurrentPage(pageId as never)\n const ids = shapeIds ? (shapeIds as never[]) : undefined\n const result = editor.getSvgString(ids, {\n ...(padding === undefined ? {} : { padding }),\n ...(background === undefined ? {} : { background }),\n ...(darkMode === undefined ? {} : { darkMode }),\n })\n if (!disposed) setSvg(result?.svg ?? null)\n } catch (thrown) {\n if (!disposed) setError(thrown)\n } finally {\n editor?.dispose()\n }\n return () => {\n disposed = true\n }\n }, [snapshot, pageId, shapeIds, padding, background, darkMode, shapeUtils, bindingUtils, user])\n\n if (error) {\n return (\n <div className={[\"mocanvas-image\", \"mocanvas-image--error\", className].filter(Boolean).join(\" \")} style={style} role=\"img\" aria-label={alt ?? \"Could not render drawing\"} />\n )\n }\n return (\n <div\n className={[\"mocanvas-image\", className].filter(Boolean).join(\" \")}\n style={style}\n {...(alt ? { role: \"img\", \"aria-label\": alt } : { \"aria-hidden\": true })}\n // The markup comes from mocanvas's own exporter, which escapes every\n // value it writes; nothing the document carries reaches the DOM as\n // markup.\n dangerouslySetInnerHTML={{ __html: svg ?? \"\" }}\n />\n )\n}\n","/**\n * Clipboard and export, as the menus and the keyboard reach them.\n *\n * There are two ways a copy can happen and they arrive differently. A *native*\n * copy comes with a `ClipboardEvent`, which is the only moment a browser lets a\n * page write several flavours of the same content synchronously. A *menu* copy\n * has no event at all and has to go through the async Clipboard API. These\n * hooks hide that split: a menu item calls `copy()` and does not care which\n * path it took.\n *\n * Everything here is a hook because the work needs the editor, the toasts and\n * the translator, all of which are React contexts — which is also why the plain\n * functions in `ui-clipboard.ts` take an editor and say nothing to the user.\n */\n\nimport { useCallback, useEffect } from \"react\"\nimport { Vec, useEditor, type Editor, type ShapeId } from \"@mocanvas/editor\"\nimport type { ExportFormat } from \"../export\"\nimport { copyAs, cutSelectionToClipboard, copySelectionToClipboard, getClipboardTextForShapes, pasteFromClipboard, exportAs, type CopyAsOptions, type ExportAsOptions } from \"./ui-clipboard\"\nimport { useToasts } from \"./ui-toasts\"\nimport { useTranslation } from \"./ui-translation\"\n\n/** The formats \"copy as\" can write. `\"json\"` is mocanvas's own content format. */\nexport type TLCopyType = \"svg\" | \"png\" | \"jpeg\" | \"json\"\n\n/** The MIME type mocanvas's own clipboard content is written under. */\nconst MOCANVAS_HTML_MARKER = \"data-mocanvas\"\n\n/**\n * Write the current selection to the clipboard, from either a native copy event\n * or a menu item.\n *\n * With an event, the content is written synchronously in every flavour at once:\n * the HTML flavour carries mocanvas's own serialized content inside a marker\n * element (so a paste back into the canvas is lossless), and the plain-text\n * flavour carries the text of the copied shapes (so a paste into anything else\n * is readable). Without an event, only the async path is available and only the\n * text flavour is written.\n *\n * Returns whether anything was copied — an empty selection is not a failure,\n * but the caller usually wants to skip the \"copied\" toast.\n */\nexport async function handleNativeOrMenuCopy(editor: Editor, event?: ClipboardEvent, ids: readonly ShapeId[] = editor.getSelectedShapeIds()): Promise<boolean> {\n const serialized = getClipboardTextForShapes(editor, ids)\n if (!serialized) return false\n\n const plainText = ids\n .map((id) => {\n const shape = editor.getShape(id)\n return shape ? (editor.getShapeUtil(shape).getText?.(shape) ?? \"\") : \"\"\n })\n .filter(Boolean)\n .join(\"\\n\")\n\n if (event?.clipboardData) {\n // A `ClipboardEvent` is the one place several flavours can be written at\n // once, and only synchronously — awaiting anything here loses the window.\n event.preventDefault()\n event.clipboardData.setData(\"text/html\", `<div ${MOCANVAS_HTML_MARKER}>${escapeForHtmlComment(serialized)}</div>`)\n event.clipboardData.setData(\"text/plain\", plainText || serialized)\n return true\n }\n\n return await copySelectionToClipboard(editor, ids)\n}\n\nfunction escapeForHtmlComment(value: string): string {\n return value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\")\n}\n\n/** What both clipboard hooks hand back. */\nexport interface TLUiClipboardEvents {\n copy: () => Promise<void>\n cut: () => Promise<void>\n paste: (data?: DataTransfer | ClipboardItem[], point?: { x: number; y: number }) => Promise<void>\n}\n\n/**\n * Cut, copy and paste for the menus and the action list.\n *\n * The three functions do the same work the keyboard shortcuts do; what differs\n * is that there is no event to hang off, so paste has to ask the browser for\n * the clipboard and may be refused. A refusal falls back to an in-page buffer,\n * which keeps copy and paste working within one tab even where the permission\n * was denied — which is where it matters most.\n */\nexport function useMenuClipboardEvents(): TLUiClipboardEvents {\n const editor = useEditor()\n\n const copy = useCallback(async () => {\n await handleNativeOrMenuCopy(editor)\n }, [editor])\n\n const cut = useCallback(async () => {\n await cutSelectionToClipboard(editor)\n }, [editor])\n\n const paste = useCallback(\n async (_data?: DataTransfer | ClipboardItem[], point?: { x: number; y: number }) => {\n await pasteFromClipboard(editor, point ? new Vec(point.x, point.y) : editor.getViewportPageCenter())\n },\n [editor],\n )\n\n return { copy, cut, paste }\n}\n\n/**\n * The native `copy`, `cut` and `paste` listeners on the container.\n *\n * Installed for their side effect; the returned functions are the same three\n * as {@link useMenuClipboardEvents} so a component can use either without\n * knowing which path it is on. The listeners ignore events that originated in a\n * text input or a contenteditable — a copy inside a label being edited belongs\n * to the label, not to the canvas.\n */\nexport function useNativeClipboardEvents(): TLUiClipboardEvents {\n const editor = useEditor()\n const menu = useMenuClipboardEvents()\n\n useEffect(() => {\n const container = editor.getContainerDocument?.()\n if (!container) return\n\n const isInTextField = (target: EventTarget | null): boolean => {\n const element = target as HTMLElement | null\n if (!element || typeof element.closest !== \"function\") return false\n return element.closest(\"input, textarea, [contenteditable=true], [contenteditable='']\") !== null\n }\n\n const onCopy = (event: Event) => {\n if (isInTextField(event.target)) return\n void handleNativeOrMenuCopy(editor, event as ClipboardEvent)\n }\n\n const onCut = (event: Event) => {\n if (isInTextField(event.target)) return\n const ids = editor.getSelectedShapeIds()\n void handleNativeOrMenuCopy(editor, event as ClipboardEvent).then((copied) => {\n if (!copied) return\n editor.markHistoryStoppingPoint(\"cut\")\n editor.deleteShapes([...ids])\n })\n }\n\n const onPaste = (event: Event) => {\n if (isInTextField(event.target)) return\n void menu.paste()\n }\n\n container.addEventListener(\"copy\", onCopy)\n container.addEventListener(\"cut\", onCut)\n container.addEventListener(\"paste\", onPaste)\n return () => {\n container.removeEventListener(\"copy\", onCopy)\n container.removeEventListener(\"cut\", onCut)\n container.removeEventListener(\"paste\", onPaste)\n }\n }, [editor, menu])\n\n return menu\n}\n\n/**\n * \"Copy as PNG/SVG/JSON\", with the toast the menu item is expected to raise.\n *\n * The toast is the reason this is a hook rather than a call to `copyAs`: a copy\n * that produces no visible change on the canvas looks like nothing happened.\n */\nexport function useCopyAs(): (ids: readonly ShapeId[], format?: TLCopyType, opts?: CopyAsOptions) => Promise<void> {\n const editor = useEditor()\n const toasts = useToasts()\n const msg = useTranslation()\n\n return useCallback(\n async (ids: readonly ShapeId[], format: TLCopyType = \"svg\", opts: CopyAsOptions = {}) => {\n try {\n await copyAs(editor, format === \"json\" ? \"json\" : (format as ExportFormat), ids, opts)\n } catch (error) {\n toasts.addToast({ title: msg(\"toast.error.copy-fail.title\"), description: String(error), severity: \"error\" })\n }\n },\n [editor, toasts, msg],\n )\n}\n\n/**\n * \"Export as PNG/SVG\", with the same error toast.\n *\n * Takes the ids first and the format in the options object, which is the shape\n * the action list calls it with.\n */\nexport function useExportAs(): (ids: readonly ShapeId[], opts?: ExportAsOptions & { format?: ExportFormat }) => Promise<void> {\n const editor = useEditor()\n const toasts = useToasts()\n const msg = useTranslation()\n\n return useCallback(\n async (ids: readonly ShapeId[], opts: ExportAsOptions & { format?: ExportFormat } = {}) => {\n const { format = \"png\", ...rest } = opts\n try {\n await exportAs(editor, format, ids, rest)\n } catch (error) {\n toasts.addToast({ title: msg(\"toast.error.export-fail.title\"), description: String(error), severity: \"error\" })\n }\n },\n [editor, toasts, msg],\n )\n}\n","/**\n * How an icon is named, and how an app supplies one of its own.\n *\n * An icon slot in the UI accepts three things, and they are all spelled the\n * same way in a menu item: a name from the built-in set, a URL, or a React\n * element. The types here say so, so an app writing an override can be told at\n * compile time that its icon name is not one mocanvas ships — while still\n * leaving the door open for its own artwork.\n */\n\nimport type { ReactElement } from \"react\"\nimport { ICON_NAMES, type IconName } from \"./icons\"\n\n/**\n * A built-in icon name, or any string.\n *\n * Widened to `string` on purpose: an app's override may name artwork it serves\n * itself, and a union that refused those would make every custom menu item a\n * cast. Editors still autocomplete the built-in names, which is the part that\n * actually helps.\n */\nexport type TLUiIconType = IconName | (string & {})\n\n/** A ready-made element used in place of a named icon. */\nexport type TLUiIconJsx = ReactElement\n\n/**\n * Every icon name mocanvas ships, sorted.\n *\n * Exported as a value rather than only as a type so a picker, a storybook page\n * or a test can enumerate them.\n */\nexport const iconTypes: readonly TLUiIconType[] = ICON_NAMES\n","import {\n createShapeId,\n StateNode,\n Vec,\n type PointerEventInfo,\n type ShapeHandle,\n type ShapeId,\n type StateNodeConstructor,\n} from \"@mocanvas/editor\"\nimport type { ArrowShape } from \"../shapes\"\n\n/** Length of the arrow created by a click without a drag, in page units. */\nconst DEFAULT_ARROW_LENGTH = 100\n/** Arrows shorter than this are discarded on pointer up. */\nconst MIN_ARROW_LENGTH = 4\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"pointing\", info)\n }\n\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\nclass Pointing extends StateNode {\n static override id = \"pointing\"\n private shapeId: ShapeId | null = null\n private markId = \"\"\n /** Set once the pointer travelled far enough to count as a drag. */\n private dragged = false\n\n override onEnter(): void {\n const editor = this.editor\n this.dragged = false\n this.markId = editor.markHistoryStoppingPoint(\"create arrow\")\n const id = createShapeId()\n const { originPagePoint } = editor.inputs\n editor.createShape<ArrowShape>({\n id,\n type: \"arrow\",\n x: originPagePoint.x,\n y: originPagePoint.y,\n props: { start: { x: 0, y: 0 }, end: { x: 1, y: 0 } },\n })\n editor.select(id)\n this.shapeId = id\n }\n\n override onPointerMove(): void {\n if (!this.editor.inputs.isDragging) return\n this.dragged = true\n this.updateEnd()\n }\n\n override onPointerUp(): void {\n // `inputs.isDragging` is already cleared by the time a pointer up arrives.\n if (this.dragged) this.updateEnd()\n else this.setDefaultEnd()\n this.finish()\n }\n\n override onComplete(): void {\n this.finish()\n }\n\n override onCancel(): void {\n if (this.markId) this.editor.bailToMark(this.markId)\n this.shapeId = null\n this.parent!.transition(\"idle\")\n }\n\n /**\n * Move the end terminal to the pointer, offering a binding the same way the\n * select tool's handle drag does: the shape util decides whether the point\n * lands on a bindable shape and returns the props to apply.\n */\n private updateEnd(): void {\n const editor = this.editor\n const shape = editor.getShape<ArrowShape>(this.shapeId!)\n if (!shape) return\n const local = editor.getPointInShapeSpace(shape, editor.inputs.currentPagePoint)\n const handle: ShapeHandle = { id: \"end\", type: \"vertex\", index: \"a3\", x: local.x, y: local.y }\n const change = editor.getShapeUtil<ArrowShape>(shape).onHandleDrag?.(shape, { handle, isPrecise: editor.inputs.altKey, initial: shape })\n if (change) editor.updateShape<ArrowShape>({ id: shape.id, type: \"arrow\", ...change })\n else editor.updateShape<ArrowShape>({ id: shape.id, type: \"arrow\", props: { end: { x: local.x, y: local.y } } })\n }\n\n /** A click without a drag makes a default arrow pointing to the right. */\n private setDefaultEnd(): void {\n const editor = this.editor\n const shape = editor.getShape<ArrowShape>(this.shapeId!)\n if (!shape) return\n editor.updateShape<ArrowShape>({ id: shape.id, type: \"arrow\", props: { end: { x: DEFAULT_ARROW_LENGTH, y: 0 } } })\n }\n\n private finish(): void {\n const editor = this.editor\n const shape = this.shapeId ? editor.getShape<ArrowShape>(this.shapeId) : undefined\n if (shape) {\n const { start, end } = shape.props\n // No zero-length arrows: undo the whole creation, bindings included.\n if (Vec.Dist(start, end) < MIN_ARROW_LENGTH) editor.bailToMark(this.markId)\n }\n this.shapeId = null\n const locked = editor.getInstanceState().isToolLocked\n this.parent!.transition(\"idle\")\n if (!locked) editor.setCurrentTool(\"select\")\n }\n}\n\n/** Drag to draw an arrow; dropping the end on a shape binds it to that shape. */\nexport class ArrowTool extends StateNode {\n static override id = \"arrow\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Pointing]\n}\n","import { createShapeId, StateNode, Vec, type PointerEventInfo, type ShapeId, type StateNodeConstructor } from \"@mocanvas/editor\"\n\ninterface DrawProps {\n segments: { type: \"free\" | \"straight\"; points: { x: number; y: number; z?: number }[] }[]\n isComplete: boolean\n isClosed: boolean\n isPen: boolean\n}\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"drawing\", info)\n }\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\nclass Drawing extends StateNode {\n static override id = \"drawing\"\n private shapeId: ShapeId | null = null\n private origin = new Vec()\n private points: { x: number; y: number; z: number }[] = []\n private markId = \"\"\n private lastFlush = 0\n\n override onEnter(info: Record<string, unknown>): void {\n const editor = this.editor\n const isPen = (info as { isPen?: boolean }).isPen ?? false\n this.markId = editor.markHistoryStoppingPoint(\"draw\")\n this.origin = editor.inputs.originPagePoint.clone()\n this.points = [{ x: 0, y: 0, z: 0.5 }]\n const id = createShapeId()\n this.shapeId = id\n editor.createShape({\n id,\n type: \"draw\",\n x: this.origin.x,\n y: this.origin.y,\n props: {\n segments: [{ type: \"free\", points: this.points.slice() }],\n isComplete: false,\n isClosed: false,\n isPen,\n },\n })\n editor.selectNone()\n }\n\n override onPointerMove(): void {\n const editor = this.editor\n const { currentPagePoint } = editor.inputs\n const p = Vec.Sub(currentPagePoint, this.origin)\n const last = this.points.at(-1)!\n if (Vec.Dist2(last, p) < 0.25) return\n this.points.push({ x: p.x, y: p.y, z: 0.5 })\n const now = performance.now()\n // Throttle store writes to ~120 Hz; the pointer may report far faster.\n if (now - this.lastFlush > 8) {\n this.lastFlush = now\n this.flush(false)\n }\n }\n\n override onPointerUp(): void {\n this.complete()\n }\n\n override onComplete(): void {\n this.complete()\n }\n\n override onCancel(): void {\n this.editor.bailToMark(this.markId)\n this.parent!.transition(\"idle\")\n }\n\n private flush(complete: boolean): void {\n const editor = this.editor\n const shape = editor.getShape(this.shapeId!)\n if (!shape) return\n const props = shape.props as DrawProps\n const first = this.points[0]!\n const last = this.points.at(-1)!\n const isClosed = complete && this.points.length > 3 && Vec.Dist(first, last) < 12 / editor.getZoomLevel()\n editor.updateShape({\n id: shape.id,\n type: \"draw\",\n props: {\n segments: [{ type: props.segments[0]?.type ?? \"free\", points: this.points.slice() }],\n isComplete: complete,\n isClosed,\n },\n })\n }\n\n private complete(): void {\n this.flush(true)\n const editor = this.editor\n this.parent!.transition(\"idle\")\n if (!editor.getInstanceState().isToolLocked && !editor.inputs.isPen) {\n // Stay in the draw tool: freehand drawing is usually repeated.\n }\n }\n}\n\n/** Freehand drawing. */\nexport class DrawTool extends StateNode {\n static override id = \"draw\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Drawing]\n}\n","import { StateNode, type PointerEventInfo, type ShapeId, type StateNodeConstructor } from \"@mocanvas/editor\"\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"erasing\", info)\n }\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\nclass Erasing extends StateNode {\n static override id = \"erasing\"\n private erasing = new Set<ShapeId>()\n private markId = \"\"\n\n override onEnter(): void {\n this.erasing.clear()\n this.markId = this.editor.markHistoryStoppingPoint(\"erase\")\n this.update()\n }\n\n override onPointerMove(): void {\n this.update()\n }\n\n override onPointerUp(): void {\n this.complete()\n }\n\n override onComplete(): void {\n this.complete()\n }\n\n override onCancel(): void {\n this.editor.setErasingShapes([])\n this.parent!.transition(\"idle\")\n }\n\n private update(): void {\n const editor = this.editor\n const { currentPagePoint, previousPagePoint } = editor.inputs\n const minX = Math.min(currentPagePoint.x, previousPagePoint.x)\n const minY = Math.min(currentPagePoint.y, previousPagePoint.y)\n const box = {\n x: minX,\n y: minY,\n w: Math.abs(currentPagePoint.x - previousPagePoint.x),\n h: Math.abs(currentPagePoint.y - previousPagePoint.y),\n }\n const margin = 8 / editor.getZoomLevel()\n const hits = editor.getShapesIntersectingBounds({ x: box.x - margin, y: box.y - margin, w: box.w + 2 * margin, h: box.h + 2 * margin })\n let changed = false\n for (const s of hits) {\n if (s.isLocked || this.erasing.has(s.id)) continue\n this.erasing.add(s.id)\n changed = true\n }\n if (changed) editor.setErasingShapes([...this.erasing])\n }\n\n private complete(): void {\n const editor = this.editor\n const ids = [...this.erasing]\n editor.setErasingShapes([])\n if (ids.length) editor.deleteShapes(ids)\n this.parent!.transition(\"idle\")\n }\n}\n\n/** Delete shapes by dragging over them. */\nexport class EraserTool extends StateNode {\n static override id = \"eraser\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Erasing]\n}\n","import {\n createShapeId,\n StateNode,\n type PointerEventInfo,\n type ShapeId,\n type StateNodeConstructor,\n type UnknownShape,\n} from \"@mocanvas/editor\"\n\n/** Smallest box a drag may produce, in page units. */\nconst DEFAULT_MIN_BOX_SIZE = 1\n\n/** A `w`/`h` pair in page units. */\nexport interface BoxSize {\n w: number\n h: number\n}\n\nclass BoxIdle extends StateNode {\n static override id = \"idle\"\n\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"pointing\", info)\n }\n\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\nclass BoxPointing extends StateNode {\n static override id = \"pointing\"\n private shapeId: ShapeId | null = null\n private markId = \"\"\n\n private get tool(): BaseBoxShapeTool {\n return this.parent as BaseBoxShapeTool\n }\n\n override onEnter(): void {\n this.shapeId = null\n }\n\n override onPointerMove(): void {\n if (!this.editor.inputs.isDragging) return\n if (!this.shapeId) this.create()\n this.resize()\n }\n\n override onPointerUp(): void {\n // A press with no drag places a default-sized box CENTRED on the point,\n // which is what makes \"click to place\" feel like dropping a stamp rather\n // than starting a rectangle at the cursor.\n if (!this.shapeId) {\n this.create()\n const size = this.tool.getDefaultSize()\n const { originPagePoint } = this.editor.inputs\n this.editor.updateShape({\n id: this.shapeId!,\n type: this.tool.shapeType,\n x: originPagePoint.x - size.w / 2,\n y: originPagePoint.y - size.h / 2,\n // `getCreateProps()` already ran inside `create()`; running it again\n // would ask a counter (\"Frame 3\") for a second, different answer.\n props: { ...size },\n })\n }\n this.finish()\n }\n\n override onComplete(): void {\n this.finish()\n }\n\n override onCancel(): void {\n if (this.markId) this.editor.bailToMark(this.markId)\n this.shapeId = null\n this.parent!.transition(\"idle\")\n }\n\n private create(): void {\n const editor = this.editor\n const tool = this.tool\n this.markId = editor.markHistoryStoppingPoint(`create ${tool.shapeType}`)\n const id = createShapeId()\n const { originPagePoint } = editor.inputs\n const min = tool.minSize\n editor.createShape({\n id,\n type: tool.shapeType,\n x: originPagePoint.x,\n y: originPagePoint.y,\n props: { ...tool.getCreateProps(), w: min, h: min },\n })\n editor.select(id)\n this.shapeId = id\n }\n\n private resize(): void {\n const editor = this.editor\n const tool = this.tool\n const shape = editor.getShape(this.shapeId!)\n if (!shape) return\n const { originPagePoint, currentPagePoint, shiftKey } = editor.inputs\n let w = currentPagePoint.x - originPagePoint.x\n let h = currentPagePoint.y - originPagePoint.y\n if (shiftKey) {\n const m = Math.max(Math.abs(w), Math.abs(h))\n w = Math.sign(w || 1) * m\n h = Math.sign(h || 1) * m\n }\n let x = originPagePoint.x\n let y = originPagePoint.y\n // Dragging up or left moves the origin instead of producing a negative box.\n if (w < 0) x += w\n if (h < 0) y += h\n const min = tool.minSize\n editor.updateShape({\n id: shape.id,\n type: shape.type,\n x,\n y,\n props: { w: Math.max(min, Math.abs(w)), h: Math.max(min, Math.abs(h)) },\n })\n }\n\n private finish(): void {\n const id = this.shapeId\n this.shapeId = null\n this.parent!.transition(\"idle\")\n this.tool.onCreate(id ? (this.editor.getShape(id) ?? null) : null)\n }\n}\n\n/**\n * Drag out a box shape, or click to place a default-sized one.\n *\n * The create-on-drag state chart, on its own, so a placement tool is a\n * subclass rather than a copy of it:\n *\n * ```ts\n * class SectionTool extends BaseBoxShapeTool {\n * static override id = \"section\"\n * static override initial = \"idle\"\n * override shapeType = \"section\" as const\n * override onCreate(shape: UnknownShape | null): void { … }\n * }\n * ```\n *\n * A subclass that overrides {@link BaseBoxShapeTool.onCreate} takes over\n * *everything* the base did afterwards, tool lock included — the default\n * implementation is the whole of that behaviour, so an override is expected to\n * finish the job itself.\n */\nexport abstract class BaseBoxShapeTool extends StateNode {\n static override id = \"box\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [BoxIdle, BoxPointing]\n\n /** The shape type this tool creates. */\n abstract override shapeType: string\n\n /** Smallest box a drag may produce, in page units. */\n minSize: number = DEFAULT_MIN_BOX_SIZE\n\n /**\n * The size a click (as opposed to a drag) places.\n *\n * Defaults to the shape util's own `getDefaultProps()`, so the tool and a\n * programmatic `createShape` agree on what \"a new one\" means, and a util that\n * changes its default size does not have to tell the tool.\n */\n getDefaultSize(): BoxSize {\n const props = this.editor.getShapeUtil(this.shapeType).getDefaultProps() as { w?: unknown; h?: unknown }\n const w = typeof props.w === \"number\" ? props.w : this.minSize\n const h = typeof props.h === \"number\" ? props.h : this.minSize\n return { w, h }\n }\n\n /**\n * Props to seed a newly created shape with, beyond `w`/`h`.\n *\n * The hook for a shape whose identity is decided at placement time — a\n * frame's `Frame 3`, a section's colour. Runs once, before the shape exists.\n */\n getCreateProps(): Record<string, unknown> {\n return {}\n }\n\n /**\n * Called once the shape is final: after the drag ends, or after a click has\n * placed a default-sized one. `null` means nothing was created.\n *\n * The default returns to the select tool, unless tool lock is on. Override it\n * to adopt enclosed shapes, open an editor, or anything else a placement\n * should do — and repeat whichever of those two endings you want, because an\n * override replaces this entirely.\n */\n onCreate(_shape: UnknownShape | null): void {\n const editor = this.editor\n if (editor.getInstanceState().isToolLocked) editor.setCurrentTool(this.id)\n else editor.setCurrentTool(\"select\")\n }\n}\n","import { dropShapesOnFrameLike, type Editor, type ShapeId, type UnknownShape } from \"@mocanvas/editor\"\nimport { BaseBoxShapeTool, type BoxSize } from \"./BaseBoxShapeTool\"\n\n/** Size of the frame created by a click without a drag. */\nconst DEFAULT_FRAME_SIZE: BoxSize = { w: 640, h: 480 }\n/** Smallest frame a drag can produce. */\nconst MIN_FRAME_SIZE = 32\n\n/** `Frame 1`, `Frame 2`, ... counting the frames already on the page. */\nfunction nextFrameName(editor: Editor): string {\n const count = editor.getCurrentPageShapes().filter((s) => s.type === \"frame\").length\n return `Frame ${count + 1}`\n}\n\n/** Move shapes that sit entirely inside a fresh frame into it. */\nfunction adoptShapesInside(editor: Editor, frameId: ShapeId): void {\n const frame = editor.getShape(frameId)\n const bounds = editor.getShapePageBounds(frameId)\n if (!frame || !bounds) return\n const pageId = editor.getCurrentPageId()\n const inside = editor.getShapesInsideBounds(bounds).filter((s: UnknownShape) => {\n if (s.id === frameId || s.isLocked || s.parentId !== pageId) return false\n // A container never swallows another container: two frames drawn over each\n // other stay siblings, which is what keeps the shape tree flat and legible.\n return !editor.getShapeUtil(s).isFrameLike(s)\n })\n if (inside.length) dropShapesOnFrameLike(editor, frame, inside)\n}\n\n/**\n * Drag out a frame, or click to place a default-sized one.\n *\n * Drawing a frame *around* existing shapes adopts them — the Figma behaviour,\n * and the reason the tool is worth having over \"create it, then drag things in\".\n */\nexport class FrameTool extends BaseBoxShapeTool {\n static override id = \"frame\"\n static override initial = \"idle\"\n\n override shapeType = \"frame\" as const\n\n override minSize = MIN_FRAME_SIZE\n\n /** A click places a full artboard, not the 160×90 a bare `createShape` gives. */\n override getDefaultSize(): BoxSize {\n return { ...DEFAULT_FRAME_SIZE }\n }\n\n override getCreateProps(): Record<string, unknown> {\n return { name: nextFrameName(this.editor) }\n }\n\n override onCreate(shape: UnknownShape | null): void {\n const editor = this.editor\n if (shape) adoptShapesInside(editor, shape.id)\n if (editor.getInstanceState().isToolLocked) editor.setCurrentTool(this.id)\n else editor.setCurrentTool(\"select\")\n }\n}\n","import {\n createShapeId,\n GeoShapeGeoStyle,\n StateNode,\n type GeoShapeKind,\n type PointerEventInfo,\n type ShapeId,\n type StateNodeConstructor,\n} from \"@mocanvas/editor\"\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"pointing\", info)\n }\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\nclass Pointing extends StateNode {\n static override id = \"pointing\"\n private shapeId: ShapeId | null = null\n private markId = \"\"\n\n override onEnter(): void {\n this.shapeId = null\n }\n\n override onPointerMove(): void {\n if (!this.editor.inputs.isDragging) return\n if (!this.shapeId) this.create()\n this.resize()\n }\n\n override onPointerUp(): void {\n if (!this.shapeId) {\n // click without drag: create a default-sized shape centered on the point\n this.create()\n const shape = this.editor.getShape(this.shapeId!)!\n const { w, h } = shape.props as { w: number; h: number }\n const { originPagePoint } = this.editor.inputs\n this.editor.updateShape({ id: shape.id, type: shape.type, x: originPagePoint.x - w / 2, y: originPagePoint.y - h / 2 })\n }\n this.finish()\n }\n\n override onCancel(): void {\n if (this.markId) this.editor.bailToMark(this.markId)\n this.parent!.transition(\"idle\")\n }\n\n override onComplete(): void {\n this.finish()\n }\n\n private create(): void {\n const editor = this.editor\n const geo = (this.parent as GeoTool).geo\n this.markId = editor.markHistoryStoppingPoint(\"create geo\")\n const id = createShapeId()\n const { originPagePoint } = editor.inputs\n editor.createShape({\n id,\n type: \"geo\",\n x: originPagePoint.x,\n y: originPagePoint.y,\n props: { geo, w: 100, h: 100 },\n })\n editor.select(id)\n this.shapeId = id\n }\n\n private resize(): void {\n const editor = this.editor\n const shape = editor.getShape(this.shapeId!)\n if (!shape) return\n const { originPagePoint, currentPagePoint, shiftKey, altKey } = editor.inputs\n let w = currentPagePoint.x - originPagePoint.x\n let h = currentPagePoint.y - originPagePoint.y\n if (shiftKey) {\n const m = Math.max(Math.abs(w), Math.abs(h))\n w = Math.sign(w || 1) * m\n h = Math.sign(h || 1) * m\n }\n let x = originPagePoint.x\n let y = originPagePoint.y\n if (altKey) {\n x -= Math.abs(w)\n y -= Math.abs(h)\n w = Math.abs(w) * 2\n h = Math.abs(h) * 2\n } else {\n if (w < 0) x += w\n if (h < 0) y += h\n }\n editor.updateShape({ id: shape.id, type: \"geo\", x, y, props: { w: Math.max(1, Math.abs(w)), h: Math.max(1, Math.abs(h)) } })\n }\n\n private finish(): void {\n const editor = this.editor\n const locked = editor.getInstanceState().isToolLocked\n this.parent!.transition(\"idle\")\n if (!locked) editor.setCurrentTool(\"select\")\n }\n}\n\n/** Draw a geo shape (rectangle, ellipse, ...) by dragging. Pick the kind with `editor.setCurrentTool('geo', { geo })`. */\nexport class GeoTool extends StateNode {\n static override id = \"geo\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Pointing]\n geo: GeoShapeKind = \"rectangle\"\n\n override onEnter(info: Record<string, unknown>): void {\n const geo = info[\"geo\"]\n if (typeof geo === \"string\") this.geo = geo as GeoShapeKind\n else this.geo = this.editor.getStyleForNextShape(GeoShapeGeoStyle)\n }\n}\n","/**\n * The highlighter tool.\n *\n * The gesture is the draw tool's — pen down, record the movement, pen up — but\n * the shape it lays down is a `highlight`, and the differences matter enough to\n * be a tool of its own rather than a mode of `DrawTool`: a highlight never\n * closes into a filled region, so there is no closing test on pen-up, and it\n * has no `isClosed` prop for one to write to.\n */\nimport { StateNode, Vec, createShapeId, type PointerEventInfo, type ShapeId, type StateNodeConstructor } from \"@mocanvas/editor\"\nimport type { HighlightShape } from \"../shapes/HighlightShapeUtil\"\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"highlighting\", info)\n }\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\nclass Highlighting extends StateNode {\n static override id = \"highlighting\"\n private shapeId: ShapeId | null = null\n private origin = new Vec()\n private points: { x: number; y: number; z: number }[] = []\n private markId = \"\"\n private lastFlush = 0\n\n override onEnter(info: Record<string, unknown>): void {\n const editor = this.editor\n const isPen = (info as { isPen?: boolean }).isPen ?? false\n this.markId = editor.markHistoryStoppingPoint(\"highlight\")\n this.origin = editor.inputs.originPagePoint.clone()\n this.points = [{ x: 0, y: 0, z: 0.5 }]\n const id = createShapeId()\n this.shapeId = id\n editor.createShape<HighlightShape>({\n id,\n type: \"highlight\",\n x: this.origin.x,\n y: this.origin.y,\n props: { segments: [{ type: \"free\", points: this.points.slice() }], isComplete: false, isPen },\n })\n editor.selectNone()\n }\n\n override onPointerMove(): void {\n const editor = this.editor\n const p = Vec.Sub(editor.inputs.currentPagePoint, this.origin)\n const last = this.points.at(-1)!\n if (Vec.Dist2(last, p) < 0.25) return\n this.points.push({ x: p.x, y: p.y, z: 0.5 })\n const now = performance.now()\n // Throttle store writes to ~120 Hz; the pointer may report far faster.\n if (now - this.lastFlush > 8) {\n this.lastFlush = now\n this.flush(false)\n }\n }\n\n override onPointerUp(): void {\n this.complete()\n }\n\n override onComplete(): void {\n this.complete()\n }\n\n override onCancel(): void {\n this.editor.bailToMark(this.markId)\n this.parent!.transition(\"idle\")\n }\n\n private flush(complete: boolean): void {\n const shape = this.editor.getShape(this.shapeId!)\n if (!shape) return\n this.editor.updateShape<HighlightShape>({\n id: shape.id,\n type: \"highlight\",\n props: { segments: [{ type: \"free\", points: this.points.slice() }], isComplete: complete },\n })\n }\n\n private complete(): void {\n this.flush(true)\n this.parent!.transition(\"idle\")\n }\n}\n\n/** Draw a translucent marker stroke over what is already on the canvas. */\nexport class HighlightShapeTool extends StateNode {\n static override id = \"highlight\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Highlighting]\n /** The shape this tool places, for anything reading the tool list. */\n override shapeType = \"highlight\" as const\n}\n","/**\n * The laser pointer.\n *\n * It draws, but it does not create anything: the trail is a *scribble*, which\n * lives on the `instance` record rather than in the document, is never\n * undoable, is never saved, and fades out on its own. That is what makes it\n * usable while presenting — you can wave it over someone else's board without\n * changing it — and it is also what makes a collaborator's laser visible\n * without a second transport, since presence carries the same record.\n */\nimport { StateNode, type PointerEventInfo, type StateNodeConstructor } from \"@mocanvas/editor\"\n\n/**\n * How the trail looks and how it fades.\n *\n * SEMANTICS-ASSUMED: the docs describe the tool, not its numbers. `delay` is\n * the beat before the tail starts retracting — long enough that a slow circle\n * round something stays whole, short enough that the trail never becomes a\n * drawing — and `taper` narrows the tail so the head reads as the pointer.\n */\nexport const LASER_SCRIBBLE = {\n color: \"laser\",\n opacity: 0.7,\n size: 4,\n delay: 1200,\n shrink: 0.05,\n taper: true,\n} as const\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"lasering\", info)\n }\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\nclass Lasering extends StateNode {\n static override id = \"lasering\"\n\n override onEnter(): void {\n const { x, y } = this.editor.inputs.currentPagePoint\n const item = this.editor.scribbles.startSession({ ...LASER_SCRIBBLE })\n ;(this.parent as LaserTool).sessionId = item.id\n this.editor.scribbles.addPointToSession(x, y)\n }\n\n override onPointerMove(): void {\n const { x, y } = this.editor.inputs.currentPagePoint\n this.editor.scribbles.addPointToSession(x, y)\n }\n\n override onPointerUp(): void {\n this.complete()\n }\n\n override onComplete(): void {\n this.complete()\n }\n\n override onCancel(): void {\n this.complete()\n }\n\n /**\n * Let the trail fade rather than clearing it: the point of the gesture is\n * what it drew, and yanking it away the instant the pointer lifts loses the\n * end of every sweep.\n */\n private complete(): void {\n this.editor.scribbles.stopSession()\n ;(this.parent as LaserTool).sessionId = null\n this.parent!.transition(\"idle\")\n }\n}\n\n/** Point at things: a fading trail that never becomes a shape. */\nexport class LaserTool extends StateNode {\n static override id = \"laser\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Lasering]\n\n /** Set while a stroke is in progress; read through {@link getSessionId}. */\n sessionId: string | null = null\n\n /**\n * The id of the scribble this tool is currently drawing, or `null` when it is\n * idle — including while the last trail is still fading, which is a scribble\n * the tool no longer owns.\n *\n * Exposed so a renderer, an overlay or a test can address the live trail\n * without reaching into the manager's bookkeeping.\n */\n getSessionId(): string | null {\n return this.sessionId\n }\n}\n","import { StateNode, Vec, type PointerEventInfo, type StateNodeConstructor } from \"@mocanvas/editor\"\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"grab\", rotation: 0 } })\n }\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"pointing\", info)\n }\n}\n\nclass Pointing extends StateNode {\n static override id = \"pointing\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"grabbing\", rotation: 0 } })\n }\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) this.parent!.transition(\"dragging\")\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass Dragging extends StateNode {\n static override id = \"dragging\"\n override onPointerMove(): void {\n const { currentScreenPoint, previousScreenPoint } = this.editor.inputs\n this.editor.pan(Vec.Sub(currentScreenPoint, previousScreenPoint))\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\n/** Pan the camera by dragging. */\nexport class HandTool extends StateNode {\n static override id = \"hand\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Pointing, Dragging]\n}\n","import {\n createShapeId,\n StateNode,\n Vec,\n type ClickEventInfo,\n type KeyboardEventInfo,\n type PointerEventInfo,\n type ShapeId,\n type StateNodeConstructor,\n} from \"@mocanvas/editor\"\nimport { getIndexAbove, type IndexKey } from \"@mocanvas/store\"\nimport { getLinePoints, type LinePoint, type LineShape } from \"../shapes\"\n\n/** Segments shorter than this are treated as a repeated click, not a new point. */\nconst MIN_SEGMENT_LENGTH = 4\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"pointing\", info)\n }\n\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\n/**\n * Draws a line. A drag makes a straight two-point line; a click starts a\n * multi-segment line where every further click commits another point and the\n * last point follows the pointer. Enter or a double click finishes it.\n */\nclass Pointing extends StateNode {\n static override id = \"pointing\"\n private shapeId: ShapeId | null = null\n private markId = \"\"\n /** Id of the point that follows the pointer. */\n private draftId = \"a2\"\n /** Set once the pointer travelled far enough to count as a drag. */\n private dragged = false\n\n override onEnter(): void {\n const editor = this.editor\n this.dragged = false\n this.markId = editor.markHistoryStoppingPoint(\"create line\")\n const id = createShapeId()\n const { originPagePoint } = editor.inputs\n this.draftId = \"a2\"\n editor.createShape<LineShape>({\n id,\n type: \"line\",\n x: originPagePoint.x,\n y: originPagePoint.y,\n props: {\n points: {\n a1: { id: \"a1\", index: \"a1\", x: 0, y: 0 },\n a2: { id: \"a2\", index: \"a2\", x: 0, y: 0 },\n },\n },\n })\n editor.select(id)\n this.shapeId = id\n }\n\n /** A further click commits the draft point and starts a new one. */\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button !== 0) return\n const shape = this.getShape()\n if (!shape) return\n this.dragged = false\n this.moveDraftToPointer()\n this.addPoint()\n }\n\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) this.dragged = true\n this.moveDraftToPointer()\n }\n\n override onPointerUp(): void {\n // A drag finishes the line right away; a click keeps the tool going so the\n // next click adds another segment. `inputs.isDragging` is already cleared\n // by the time a pointer up arrives, hence the flag.\n if (this.dragged) this.finish()\n }\n\n override onDoubleClick(info: ClickEventInfo): void {\n // See `SelectTool.onDoubleClick`: act on the release, not every phase.\n if (info.phase !== \"up\") return\n this.finish()\n }\n\n override onKeyDown(info: KeyboardEventInfo): void {\n if (info.key === \"Enter\") this.finish()\n }\n\n override onComplete(): void {\n this.finish()\n }\n\n override onCancel(): void {\n if (this.markId) this.editor.bailToMark(this.markId)\n this.shapeId = null\n this.parent!.transition(\"idle\")\n }\n\n private getShape(): LineShape | undefined {\n return this.shapeId ? this.editor.getShape<LineShape>(this.shapeId) : undefined\n }\n\n private moveDraftToPointer(): void {\n const editor = this.editor\n const shape = this.getShape()\n if (!shape) return\n const local = editor.getPointInShapeSpace(shape, editor.inputs.currentPagePoint)\n const draft = shape.props.points[this.draftId]\n if (!draft) return\n const points: Record<string, LinePoint> = { ...shape.props.points, [this.draftId]: { ...draft, x: local.x, y: local.y } }\n editor.updateShape<LineShape>({ id: shape.id, type: \"line\", props: { points } })\n }\n\n private addPoint(): void {\n const shape = this.getShape()\n if (!shape) return\n const ordered = getLinePoints(shape)\n const last = ordered.at(-1)\n const prev = ordered.at(-2)\n if (!last) return\n // Clicking the same spot twice would add a degenerate segment; finish instead.\n if (prev && Vec.Dist(prev, last) < MIN_SEGMENT_LENGTH) {\n this.finish()\n return\n }\n const index = getIndexAbove(last.index as IndexKey)\n const points: Record<string, LinePoint> = { ...shape.props.points, [index]: { id: index, index, x: last.x, y: last.y } }\n this.draftId = index\n this.editor.updateShape<LineShape>({ id: shape.id, type: \"line\", props: { points } })\n }\n\n private finish(): void {\n const editor = this.editor\n const shape = this.getShape()\n if (shape) {\n const ordered = getLinePoints(shape)\n const last = ordered.at(-1)\n const prev = ordered.at(-2)\n if (ordered.length > 2 && last && prev && Vec.Dist(prev, last) < MIN_SEGMENT_LENGTH) {\n // Drop the trailing draft point left over from the finishing click.\n const points = { ...shape.props.points }\n delete points[last.id]\n editor.updateShape<LineShape>({ id: shape.id, type: \"line\", props: { points } })\n } else if (ordered.length <= 2 && last && prev && Vec.Dist(prev, last) < MIN_SEGMENT_LENGTH) {\n // A line of no length at all: undo the whole creation.\n editor.bailToMark(this.markId)\n }\n }\n this.shapeId = null\n const locked = editor.getInstanceState().isToolLocked\n this.parent!.transition(\"idle\")\n if (!locked) editor.setCurrentTool(\"select\")\n }\n}\n\n/** Drag for a straight line, or click repeatedly for a multi-segment one. */\nexport class LineTool extends StateNode {\n static override id = \"line\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Pointing]\n}\n","import { createShapeId, StateNode, type PointerEventInfo, type StateNodeConstructor } from \"@mocanvas/editor\"\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button !== 0) return\n const editor = this.editor\n const { originPagePoint } = editor.inputs\n editor.markHistoryStoppingPoint(\"create note\")\n const id = createShapeId()\n editor.createShape({\n id,\n type: \"note\",\n x: originPagePoint.x - 100,\n y: originPagePoint.y - 100,\n })\n editor.select(id)\n editor.setEditingShape(id)\n if (!editor.getInstanceState().isToolLocked) editor.setCurrentTool(\"select\")\n }\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\n/** Click to place a sticky note. */\nexport class NoteTool extends StateNode {\n static override id = \"note\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle]\n}\n","import {\n Box,\n dropShapesOnFrameLike,\n getFrameLikeDropTarget,\n StateNode,\n Vec,\n type ClickEventInfo,\n type KeyboardEventInfo,\n type PointerEventInfo,\n type SelectionHandle,\n type ShapeHandle,\n type ShapeId,\n type ShapePartial,\n type StateNodeConstructor,\n type UnknownShape,\n} from \"@mocanvas/editor\"\n\nconst RESIZE_CURSORS: Partial<Record<SelectionHandle, string>> = {\n top: \"ns-resize\",\n bottom: \"ns-resize\",\n left: \"ew-resize\",\n right: \"ew-resize\",\n top_left: \"nwse-resize\",\n bottom_right: \"nwse-resize\",\n top_right: \"nesw-resize\",\n bottom_left: \"nesw-resize\",\n rotate: \"grab\",\n}\n\nfunction setCursor(editor: { updateInstanceState(p: { cursor: { type: string; rotation: number } }): unknown }, type: string): void {\n editor.updateInstanceState({ cursor: { type, rotation: 0 } })\n}\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"default\", rotation: 0 } })\n }\n\n override onPointerMove(info: PointerEventInfo): void {\n const hovered = info.target === \"shape\" ? info.shape : undefined\n this.editor.setHoveredShape(hovered && !this.editor.isShapeOrAncestorLocked(hovered) ? hovered.id : null)\n if (info.target === \"selection\" && info.handle) setCursor(this.editor, RESIZE_CURSORS[info.handle] ?? \"default\")\n else if (info.target === \"handle\") setCursor(this.editor, \"pointer\")\n else setCursor(this.editor, \"default\")\n }\n\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button !== 0) return\n switch (info.target) {\n case \"canvas\": {\n this.parent!.transition(\"pointing_canvas\", info)\n break\n }\n case \"selection\": {\n if (info.handle === \"rotate\") this.parent!.transition(\"pointing_rotate_handle\", info)\n else if (info.handle) this.parent!.transition(\"pointing_resize_handle\", info)\n else this.parent!.transition(\"pointing_selection\", info)\n break\n }\n case \"handle\": {\n this.parent!.transition(\"pointing_handle\", info)\n break\n }\n case \"shape\": {\n if (this.editor.isShapeOrAncestorLocked(info.shape)) {\n this.parent!.transition(\"pointing_canvas\", info)\n return\n }\n const outer = this.editor.getOutermostSelectableShape(info.shape) ?? info.shape\n this.parent!.transition(\"pointing_shape\", { ...info, shape: outer })\n break\n }\n default:\n break\n }\n }\n\n override onDoubleClick(info: ClickEventInfo): void {\n // A double click is reported in three phases; act on the release, which is\n // the one this tool has always acted on. Acting on `down` too would enter a\n // group and then immediately act again inside it.\n if (info.phase !== \"up\") return\n if (info.target !== \"shape\") return\n const outer = this.editor.getOutermostSelectableShape(info.shape) ?? info.shape\n if (outer.type === \"group\" && outer.id !== info.shape.id) {\n // Focus into the group so its children become selectable.\n this.editor.updateCurrentPageState({ focusedGroupId: outer.id })\n const inner = this.editor.getOutermostSelectableShape(info.shape) ?? info.shape\n this.editor.select(inner.id)\n return\n }\n const shape = info.shape\n const util = this.editor.getShapeUtil(shape)\n if (util.canEdit(shape) && !this.editor.isShapeOrAncestorLocked(shape)) {\n this.editor.select(shape.id)\n this.editor.setEditingShape(shape.id)\n } else {\n const change = util.onDoubleClick?.(shape)\n if (change) this.editor.updateShape({ id: shape.id, type: shape.type, ...change })\n }\n }\n\n override onKeyDown(info: KeyboardEventInfo): void {\n const editor = this.editor\n switch (info.key) {\n case \"Delete\":\n case \"Backspace\": {\n const ids = editor.getSelectedShapeIds()\n if (ids.length) {\n editor.markHistoryStoppingPoint(\"delete\")\n editor.deleteShapes(ids)\n }\n break\n }\n case \"ArrowLeft\":\n case \"ArrowRight\":\n case \"ArrowUp\":\n case \"ArrowDown\": {\n const ids = editor.getSelectedShapeIds()\n if (!ids.length) return\n const step = info.shiftKey ? 10 : 1\n const d = new Vec(\n info.key === \"ArrowLeft\" ? -step : info.key === \"ArrowRight\" ? step : 0,\n info.key === \"ArrowUp\" ? -step : info.key === \"ArrowDown\" ? step : 0,\n )\n editor.markHistoryStoppingPoint(\"nudge\")\n editor.updateShapes(\n ids.map((id) => {\n const s = editor.getShape(id)!\n return { id, type: s.type, x: s.x + d.x, y: s.y + d.y }\n }),\n )\n break\n }\n case \"Escape\": {\n if (editor.getEditingShapeId()) editor.setEditingShape(null)\n else if (editor.getCurrentPageState().focusedGroupId) {\n const g = editor.getCurrentPageState().focusedGroupId!\n editor.updateCurrentPageState({ focusedGroupId: null })\n editor.select(g)\n } else editor.selectNone()\n break\n }\n default:\n break\n }\n }\n\n override onCancel(): void {\n if (this.editor.getEditingShapeId()) this.editor.setEditingShape(null)\n else this.editor.selectNone()\n }\n}\n\nclass PointingCanvas extends StateNode {\n static override id = \"pointing_canvas\"\n\n override onEnter(): void {\n if (!this.editor.inputs.shiftKey) {\n if (this.editor.getEditingShapeId()) this.editor.setEditingShape(null)\n if (this.editor.getCurrentPageState().focusedGroupId) this.editor.updateCurrentPageState({ focusedGroupId: null })\n this.editor.selectNone()\n }\n }\n\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) this.parent!.transition(\"brushing\")\n }\n\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass Brushing extends StateNode {\n static override id = \"brushing\"\n private initialSelection: ShapeId[] = []\n\n override onEnter(): void {\n this.initialSelection = this.editor.inputs.shiftKey ? this.editor.getSelectedShapeIds() : []\n this.update()\n }\n\n override onPointerMove(): void {\n this.update()\n }\n\n override onPointerUp(): void {\n this.finish()\n }\n\n override onCancel(): void {\n this.editor.setSelectedShapes(this.initialSelection)\n this.finish()\n }\n\n override onExit(): void {\n this.editor.updateInstanceState({ brush: null })\n }\n\n private update(): void {\n const { originPagePoint, currentPagePoint, ctrlKey } = this.editor.inputs\n const box = Box.FromPoints([originPagePoint, currentPagePoint])\n this.editor.updateInstanceState({ brush: box.toJson() })\n const hits = ctrlKey ? this.editor.getShapesInsideBounds(box) : this.editor.getShapesIntersectingBounds(box)\n const pageId = this.editor.getCurrentPageId()\n const ids = new Set<ShapeId>(this.initialSelection)\n for (const s of hits) {\n if (s.isLocked) continue\n // select top-level ancestors only\n let top: UnknownShape = s\n while (top.parentId !== pageId) {\n const p = this.editor.getShape(top.parentId as ShapeId)\n if (!p) break\n top = p\n }\n ids.add(top.id)\n }\n this.editor.setSelectedShapes([...ids])\n }\n\n private finish(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass PointingShape extends StateNode {\n static override id = \"pointing_shape\"\n private hitShape: UnknownShape | undefined\n private wasSelected = false\n\n override onEnter(info: Record<string, unknown>): void {\n const shape = (info as { shape?: UnknownShape }).shape\n this.hitShape = shape\n if (!shape) return\n const editor = this.editor\n const selected = editor.getSelectedShapeIds()\n this.wasSelected = selected.includes(shape.id)\n if (editor.inputs.shiftKey) {\n if (!this.wasSelected) editor.setSelectedShapes([...selected, shape.id])\n } else if (!this.wasSelected) {\n editor.setSelectedShapes([shape.id])\n }\n }\n\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) {\n this.parent!.transition(\"translating\")\n }\n }\n\n override onPointerUp(): void {\n const editor = this.editor\n if (editor.inputs.shiftKey && this.wasSelected && this.hitShape) {\n editor.setSelectedShapes(editor.getSelectedShapeIds().filter((id) => id !== this.hitShape!.id))\n }\n this.parent!.transition(\"idle\")\n }\n\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass Translating extends StateNode {\n static override id = \"translating\"\n private initialShapes = new Map<ShapeId, UnknownShape>()\n private markId = \"\"\n\n override onEnter(): void {\n const editor = this.editor\n this.markId = editor.markHistoryStoppingPoint(\"translate\")\n this.initialShapes.clear()\n for (const s of editor.getSelectedShapes()) {\n this.initialShapes.set(s.id, s)\n editor.getShapeUtil(s).onTranslateStart?.(s)\n }\n editor.updateInstanceState({ cursor: { type: \"move\", rotation: 0 } })\n this.update()\n }\n\n override onPointerMove(): void {\n this.update()\n }\n\n override onPointerUp(): void {\n this.complete()\n }\n\n override onComplete(): void {\n this.complete()\n }\n\n override onCancel(): void {\n this.editor.bailToMark(this.markId)\n this.parent!.transition(\"idle\")\n }\n\n override onKeyDown(info: KeyboardEventInfo): void {\n if (info.key === \"Shift\" || info.key === \"Alt\") this.update()\n }\n\n override onKeyUp(info: KeyboardEventInfo): void {\n if (info.key === \"Shift\" || info.key === \"Alt\") this.update()\n }\n\n private initialBounds: Box | undefined\n\n private update(): void {\n const editor = this.editor\n const { originPagePoint, currentPagePoint, shiftKey, ctrlKey } = editor.inputs\n let delta = Vec.Sub(currentPagePoint, originPagePoint)\n let lockX = false\n let lockY = false\n if (shiftKey) {\n // lock to the dominant axis\n if (Math.abs(delta.x) > Math.abs(delta.y)) {\n delta = new Vec(delta.x, 0)\n lockY = true\n } else {\n delta = new Vec(0, delta.y)\n lockX = true\n }\n }\n if (!ctrlKey && editor.inputs.isDragging) {\n this.initialBounds ??= Box.Common(\n [...this.initialShapes.values()].map((s) => editor.getShapePageBounds(s)).filter((b): b is Box => !!b),\n )\n if (this.initialBounds) {\n const moving = new Box(this.initialBounds.x + delta.x, this.initialBounds.y + delta.y, this.initialBounds.w, this.initialBounds.h)\n const { nudge } = editor.snaps.snapTranslate(moving, new Set(this.initialShapes.keys()), { lockX, lockY })\n delta = Vec.Add(delta, nudge)\n }\n } else {\n editor.snaps.clearLines()\n }\n const updates: ShapePartial[] = []\n for (const [id, initial] of this.initialShapes) {\n // delta is in page space; convert to parent space for nested shapes\n const parent = editor.getShapeParent(initial)\n let d = delta\n if (parent) {\n const m = editor.getShapePageTransform(parent)\n const det = m.a * m.d - m.b * m.c || 1\n d = new Vec((m.d * delta.x - m.c * delta.y) / det, (-m.b * delta.x + m.a * delta.y) / det)\n }\n const next = { ...initial, x: initial.x + d.x, y: initial.y + d.y }\n const change = editor.getShapeUtil(initial).onTranslate?.(initial, next)\n updates.push({ id, type: initial.type, x: next.x, y: next.y, ...(change ?? {}) })\n }\n editor.updateShapes(updates)\n this.updateDropTarget()\n }\n\n /** The container the pointer is currently over, and whether a drag happened at all. */\n private dropTarget: UnknownShape | undefined\n private didDrag = false\n\n /**\n * Mark the container the drag is currently over, so its indicator draws in\n * the heavier \"hinting\" weight while the pointer is inside it. Cleared on\n * exit, including a cancel — a stale hint outlives the gesture otherwise.\n */\n private updateDropTarget(): void {\n const editor = this.editor\n if (!editor.inputs.isDragging) return\n this.didDrag = true\n const dragging = [...this.initialShapes.keys()]\n .map((id) => editor.getShape<UnknownShape>(id))\n .filter((s): s is UnknownShape => !!s)\n this.dropTarget = getFrameLikeDropTarget(editor, editor.inputs.currentPagePoint, dragging)\n editor.setHintingShapes(this.dropTarget ? [this.dropTarget.id] : [])\n }\n\n private complete(): void {\n const editor = this.editor\n for (const [id, initial] of this.initialShapes) {\n const current = editor.getShape(id)\n if (current) {\n const change = editor.getShapeUtil(initial).onTranslateEnd?.(initial, current)\n if (change) editor.updateShape({ id, type: initial.type, ...change })\n }\n }\n this.dropOnTarget()\n this.parent!.transition(\"idle\")\n }\n\n /**\n * Hand the dragged shapes to whatever container they were released over —\n * or back to the page when they were released over nothing.\n *\n * Reads the target the last move computed rather than re-deriving it: by the\n * time the gesture completes the pointer is already up, so \"is the user\n * dragging\" is no longer true and the point is no longer the drop point.\n */\n private dropOnTarget(): void {\n // A click that happens to land inside a frame must not silently reparent\n // the shape it selected.\n if (!this.didDrag) return\n const editor = this.editor\n const dragging = [...this.initialShapes.keys()]\n .map((id) => editor.getShape<UnknownShape>(id))\n .filter((s): s is UnknownShape => !!s)\n if (dragging.length === 0) return\n dropShapesOnFrameLike(editor, this.dropTarget, dragging)\n }\n\n override onExit(): void {\n this.editor.snaps.clearLines()\n this.editor.setHintingShapes([])\n this.initialBounds = undefined\n this.dropTarget = undefined\n this.didDrag = false\n }\n}\n\nclass PointingSelection extends StateNode {\n static override id = \"pointing_selection\"\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) this.parent!.transition(\"translating\")\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass PointingResizeHandle extends StateNode {\n static override id = \"pointing_resize_handle\"\n private handle: SelectionHandle = \"bottom_right\"\n override onEnter(info: Record<string, unknown>): void {\n this.handle = (info as { handle?: SelectionHandle }).handle ?? \"bottom_right\"\n }\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) this.parent!.transition(\"resizing\", { handle: this.handle })\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass PointingRotateHandle extends StateNode {\n static override id = \"pointing_rotate_handle\"\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) this.parent!.transition(\"rotating\")\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass PointingHandle extends StateNode {\n static override id = \"pointing_handle\"\n private info: { shape: UnknownShape; handle: ShapeHandle } | null = null\n override onEnter(info: Record<string, unknown>): void {\n const i = info as { shape?: UnknownShape; handle?: ShapeHandle }\n this.info = i.shape && i.handle ? { shape: i.shape, handle: i.handle } : null\n }\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging && this.info) this.parent!.transition(\"dragging_handle\", this.info)\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\ninterface ResizeSnapshot {\n shape: UnknownShape\n /** Shape-local geometry bounds. */\n bounds: Box\n /** Page position of the shape origin. */\n pagePos: Vec\n}\n\nclass Resizing extends StateNode {\n static override id = \"resizing\"\n private handle: SelectionHandle = \"bottom_right\"\n private markId = \"\"\n private snapshots: ResizeSnapshot[] = []\n private initialSelectionBounds = new Box()\n private single: UnknownShape | undefined\n private singleRotation = 0\n\n override onEnter(info: Record<string, unknown>): void {\n const editor = this.editor\n this.handle = (info as { handle?: SelectionHandle }).handle ?? \"bottom_right\"\n this.markId = editor.markHistoryStoppingPoint(\"resize\")\n const selected = editor.getSelectedShapes()\n this.snapshots = selected.map((shape) => {\n const m = editor.getShapePageTransform(shape)\n return { shape, bounds: editor.getShapeGeometryBounds(shape)!.clone(), pagePos: new Vec(m.e, m.f) }\n })\n this.single = selected.length === 1 ? selected[0] : undefined\n this.singleRotation = this.single ? editor.getSelectionRotation() : 0\n this.initialSelectionBounds = this.single ? this.snapshots[0]!.bounds.clone() : editor.getSelectionPageBounds()!.clone()\n for (const s of this.snapshots) editor.getShapeUtil(s.shape).onResizeStart?.(s.shape)\n setCursor(editor, RESIZE_CURSORS[this.handle] ?? \"default\")\n this.update()\n }\n\n override onPointerMove(): void {\n this.update()\n }\n override onKeyDown(): void {\n this.update()\n }\n override onKeyUp(): void {\n this.update()\n }\n override onPointerUp(): void {\n this.complete()\n }\n override onComplete(): void {\n this.complete()\n }\n override onCancel(): void {\n this.editor.bailToMark(this.markId)\n this.parent!.transition(\"idle\")\n }\n\n /** Pointer position in the resize frame (shape-local for a single shape, page for many). */\n private framePoint(pagePoint: Vec): Vec {\n if (!this.single) return pagePoint\n const s = this.snapshots[0]!\n // inverse of the initial page transform (rotation + translation only)\n const d = Vec.Sub(pagePoint, s.pagePos)\n return Vec.Rot(d, -this.singleRotation)\n }\n\n private update(): void {\n const editor = this.editor\n const { currentPagePoint, originPagePoint, shiftKey, altKey } = editor.inputs\n const b0 = this.initialSelectionBounds\n const p = this.framePoint(currentPagePoint)\n const p0 = this.framePoint(originPagePoint)\n const delta = Vec.Sub(p, p0)\n const h = this.handle\n\n // New frame bounds from the dragged handle.\n let minX = b0.x\n let minY = b0.y\n let maxX = b0.maxX\n let maxY = b0.maxY\n if (h.includes(\"left\")) minX += delta.x\n if (h.includes(\"right\")) maxX += delta.x\n if (h.includes(\"top\")) minY += delta.y\n if (h.includes(\"bottom\")) maxY += delta.y\n if (altKey) {\n // symmetric about the center\n if (h.includes(\"left\")) maxX -= delta.x\n if (h.includes(\"right\")) minX -= delta.x\n if (h.includes(\"top\")) maxY -= delta.y\n if (h.includes(\"bottom\")) minY -= delta.y\n }\n let scaleX = b0.w === 0 ? 1 : (maxX - minX) / b0.w\n let scaleY = b0.h === 0 ? 1 : (maxY - minY) / b0.h\n const lockAspect = shiftKey || (this.single ? editor.getShapeUtil(this.single).isAspectRatioLocked(this.single) : false)\n if (lockAspect && h.includes(\"_\")) {\n const s = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n scaleX = Math.sign(scaleX || 1) * s\n scaleY = Math.sign(scaleY || 1) * s\n // recompute the moving edges from the anchored ones\n if (h.includes(\"left\")) minX = maxX - b0.w * scaleX\n else maxX = minX + b0.w * scaleX\n if (h.includes(\"top\")) minY = maxY - b0.h * scaleY\n else maxY = minY + b0.h * scaleY\n }\n // Flipping is not supported yet: clamp to a minimum size.\n const MIN = 1\n if (maxX - minX < MIN) {\n if (h.includes(\"left\")) minX = maxX - MIN\n else maxX = minX + MIN\n scaleX = MIN / (b0.w || MIN)\n }\n if (maxY - minY < MIN) {\n if (h.includes(\"top\")) minY = maxY - MIN\n else maxY = minY + MIN\n scaleY = MIN / (b0.h || MIN)\n }\n const anchorX = minX - b0.x * scaleX\n const anchorY = minY - b0.y * scaleY\n\n const updates: ShapePartial[] = []\n for (const snap of this.snapshots) {\n const { shape, bounds } = snap\n const util = editor.getShapeUtil(shape)\n if (!util.canResize(shape)) continue\n let newOriginFrame: Vec\n if (this.single) {\n // frame == shape local space; local origin (0,0) maps to (anchorX, anchorY)\n newOriginFrame = new Vec(anchorX, anchorY)\n } else {\n const rel = Vec.Sub(snap.pagePos, new Vec(b0.x, b0.y))\n newOriginFrame = new Vec(minX + rel.x * scaleX, minY + rel.y * scaleY)\n }\n // frame → page → parent\n const pagePoint = this.single ? Vec.Add(Vec.Rot(newOriginFrame, this.singleRotation), snap.pagePos) : newOriginFrame\n const parentPoint = editor.getPointInParentSpace(shape, pagePoint)\n const change = util.onResize?.(shape, {\n newPoint: parentPoint,\n handle: h,\n mode: \"scale_shape\",\n scaleX,\n scaleY,\n initialBounds: bounds.toJson(),\n initialShape: shape,\n })\n updates.push({ id: shape.id, type: shape.type, x: parentPoint.x, y: parentPoint.y, ...(change ?? {}) })\n }\n editor.updateShapes(updates)\n }\n\n private complete(): void {\n const editor = this.editor\n for (const snap of this.snapshots) {\n const current = editor.getShape(snap.shape.id)\n if (current) editor.getShapeUtil(snap.shape).onResizeEnd?.(snap.shape, current)\n }\n this.parent!.transition(\"idle\")\n }\n}\n\nclass Rotating extends StateNode {\n static override id = \"rotating\"\n private markId = \"\"\n private center = new Vec()\n private startAngle = 0\n private initialShapes: { shape: UnknownShape; pagePos: Vec; pageRotation: number }[] = []\n\n override onEnter(): void {\n const editor = this.editor\n this.markId = editor.markHistoryStoppingPoint(\"rotate\")\n this.center = editor.getSelectionPageBounds()!.center\n this.startAngle = Vec.Angle(this.center, editor.inputs.originPagePoint)\n this.initialShapes = editor.getSelectedShapes().map((shape) => {\n const m = editor.getShapePageTransform(shape)\n return { shape, pagePos: new Vec(m.e, m.f), pageRotation: Math.atan2(m.b, m.a) }\n })\n for (const i of this.initialShapes) editor.getShapeUtil(i.shape).onRotateStart?.(i.shape)\n setCursor(editor, \"grabbing\")\n }\n\n override onPointerMove(): void {\n this.update()\n }\n override onKeyDown(): void {\n this.update()\n }\n override onKeyUp(): void {\n this.update()\n }\n override onPointerUp(): void {\n this.complete()\n }\n override onComplete(): void {\n this.complete()\n }\n override onCancel(): void {\n this.editor.bailToMark(this.markId)\n this.parent!.transition(\"idle\")\n }\n\n private update(): void {\n const editor = this.editor\n let delta = Vec.Angle(this.center, editor.inputs.currentPagePoint) - this.startAngle\n if (editor.inputs.shiftKey) {\n const step = Math.PI / 12\n // snap the resulting page rotation of the first shape to 15° steps\n const base = this.initialShapes[0]?.pageRotation ?? 0\n delta = Math.round((base + delta) / step) * step - base\n }\n const updates: ShapePartial[] = []\n for (const i of this.initialShapes) {\n const newPagePos = Vec.RotWith(i.pagePos, this.center, delta)\n const parentPoint = editor.getPointInParentSpace(i.shape, newPagePos)\n const next = { ...i.shape, x: parentPoint.x, y: parentPoint.y, rotation: i.shape.rotation + delta }\n const change = editor.getShapeUtil(i.shape).onRotate?.(i.shape, next)\n updates.push({ id: i.shape.id, type: i.shape.type, x: next.x, y: next.y, rotation: next.rotation, ...(change ?? {}) })\n }\n editor.updateShapes(updates)\n }\n\n private complete(): void {\n const editor = this.editor\n for (const i of this.initialShapes) {\n const current = editor.getShape(i.shape.id)\n if (current) editor.getShapeUtil(i.shape).onRotateEnd?.(i.shape, current)\n }\n this.parent!.transition(\"idle\")\n }\n}\n\nclass DraggingHandle extends StateNode {\n static override id = \"dragging_handle\"\n private markId = \"\"\n private shape!: UnknownShape\n private handle!: ShapeHandle\n private startedAt = 0\n\n override onEnter(info: Record<string, unknown>): void {\n const i = info as { shape: UnknownShape; handle: ShapeHandle }\n this.shape = this.editor.getShape(i.shape.id) ?? i.shape\n this.handle = i.handle\n this.startedAt = performance.now()\n this.markId = this.editor.markHistoryStoppingPoint(\"drag handle\")\n setCursor(this.editor, \"grabbing\")\n this.update()\n }\n\n override onPointerMove(): void {\n this.update()\n }\n override onKeyDown(): void {\n this.update()\n }\n override onKeyUp(): void {\n this.update()\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onComplete(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.editor.bailToMark(this.markId)\n this.parent!.transition(\"idle\")\n }\n\n private update(): void {\n const editor = this.editor\n const current = editor.getShape(this.shape.id)\n if (!current) return\n const local = editor.getPointInShapeSpace(current, editor.inputs.currentPagePoint)\n const handle: ShapeHandle = { ...this.handle, x: local.x, y: local.y }\n const isPrecise = editor.inputs.altKey || performance.now() - this.startedAt > 1200\n const change = editor.getShapeUtil(current).onHandleDrag?.(current, { handle, isPrecise, initial: this.shape })\n if (change) editor.updateShape({ id: current.id, type: current.type, ...change })\n }\n}\n\n/** Selection, brush select, drag-to-move, resize, rotate, and shape handle dragging. */\nexport class SelectTool extends StateNode {\n static override id = \"select\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [\n Idle,\n PointingCanvas,\n Brushing,\n PointingShape,\n PointingSelection,\n PointingResizeHandle,\n PointingRotateHandle,\n PointingHandle,\n Translating,\n Resizing,\n Rotating,\n DraggingHandle,\n ]\n}\n","import { createShapeId, StateNode, type PointerEventInfo, type StateNodeConstructor } from \"@mocanvas/editor\"\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button !== 0) return\n const editor = this.editor\n const { originPagePoint } = editor.inputs\n editor.markHistoryStoppingPoint(\"create text\")\n const id = createShapeId()\n editor.createShape({\n id,\n type: \"text\",\n x: originPagePoint.x,\n y: originPagePoint.y,\n props: { text: \"\", autoSize: true },\n })\n editor.select(id)\n editor.setEditingShape(id)\n if (!editor.getInstanceState().isToolLocked) editor.setCurrentTool(\"select\")\n }\n\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\n/** Click to place a text shape and start typing. */\nexport class TextTool extends StateNode {\n static override id = \"text\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle]\n}\n","import type { StateNodeConstructor } from \"@mocanvas/editor\"\nimport { ArrowTool } from \"./ArrowTool\"\nimport { DrawTool } from \"./DrawTool\"\nimport { EraserTool } from \"./EraserTool\"\nimport { FrameTool } from \"./FrameTool\"\nimport { GeoTool } from \"./GeoTool\"\nimport { HighlightShapeTool } from \"./HighlightShapeTool\"\nimport { LaserTool } from \"./LaserTool\"\nimport { HandTool } from \"./HandTool\"\nimport { LineTool } from \"./LineTool\"\nimport { NoteTool } from \"./NoteTool\"\nimport { SelectTool } from \"./SelectTool\"\nimport { TextTool } from \"./TextTool\"\n\nexport { BaseBoxShapeTool } from \"./BaseBoxShapeTool\"\nexport { HighlightShapeTool, LaserTool }\nexport { ArrowTool, DrawTool, EraserTool, FrameTool, GeoTool, HandTool, LineTool, NoteTool, SelectTool, TextTool }\n\n/**\n * The tools that *place a shape*: one entry per built-in shape type that has a\n * tool of its own.\n *\n * Split out from {@link defaultTools} so an app can register the canvas tools\n * and its own shape tools without inheriting ours:\n *\n * ```ts\n * tools: [...defaultTools, ...defaultShapeTools, SectionTool]\n * ```\n *\n * {@link defaultTools} still contains these as well, so that spread names each\n * tool twice. That is deliberate and safe — a tool is registered under its\n * `id`, so a repeated constructor replaces its own earlier entry rather than\n * adding a second one — and it keeps every existing `tools: defaultTools`\n * working unchanged.\n */\nexport const defaultShapeTools: StateNodeConstructor[] = [\n GeoTool,\n DrawTool,\n HighlightShapeTool,\n NoteTool,\n TextTool,\n ArrowTool,\n LineTool,\n FrameTool,\n]\n\n/**\n * Every built-in tool: the canvas tools plus {@link defaultShapeTools}.\n *\n * `SelectTool` is first because the editor starts in whichever tool leads this\n * list.\n */\nexport const defaultTools: StateNodeConstructor[] = [SelectTool, HandTool, EraserTool, LaserTool, ...defaultShapeTools]\n\n/**\n * The `*ShapeTool` spellings.\n *\n * A tool that places a shape is documented as `<Shape>ShapeTool`; this library\n * named them `<Shape>Tool` from the start. Both names are the same class — a\n * tool registers by its `static id`, so aliasing changes nothing at runtime.\n */\nexport {\n ArrowTool as ArrowShapeTool,\n DrawTool as DrawShapeTool,\n FrameTool as FrameShapeTool,\n GeoTool as GeoShapeTool,\n LineTool as LineShapeTool,\n NoteTool as NoteShapeTool,\n TextTool as TextShapeTool,\n}\n","import type { Editor } from \"@mocanvas/editor\"\nimport { useEffect, type RefObject } from \"react\"\nimport { classifyExternalText, registerDefaultExternalContentHandlers, type ExternalContentOptions } from \"./defaultExternalContentHandlers\"\n\nfunction isEditable(t: EventTarget | null): boolean {\n return t instanceof HTMLElement && (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable)\n}\n\n/**\n * Drop and paste support for the canvas container: files, images, svg markup,\n * urls and plain text are routed to `editor.putExternalContent`. Plain text is\n * only taken when nothing is being edited and it is not our own\n * `application/mocanvas` clipboard JSON (the keyboard shortcuts handle that).\n * Also installs the default handlers for any content type without one.\n */\nexport function useExternalContent(editor: Editor | null, containerRef: RefObject<HTMLElement | null>, options?: ExternalContentOptions): void {\n useEffect(() => {\n if (!editor) return\n const unregister = registerDefaultExternalContentHandlers(editor, options ?? {})\n return unregister\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editor])\n\n useEffect(() => {\n const el = containerRef.current\n if (!editor || !el) return\n\n const pagePoint = (e: MouseEvent) => editor.screenToPage({ x: e.clientX, y: e.clientY })\n\n const handleText = (text: string | undefined, point?: { x: number; y: number }) => {\n if (!text || isEditableContext()) return false\n const info = classifyExternalText(text, point)\n if (!info) return false\n void editor.putExternalContent(info)\n return true\n }\n\n const isEditableContext = () => !!editor.getEditingShapeId() || isEditable(document.activeElement)\n\n const onDragOver = (e: DragEvent) => {\n if (!e.dataTransfer) return\n e.preventDefault()\n e.dataTransfer.dropEffect = \"copy\"\n }\n\n const onDrop = (e: DragEvent) => {\n const dt = e.dataTransfer\n if (!dt) return\n e.preventDefault()\n const point = pagePoint(e)\n const files = Array.from(dt.files)\n if (files.length) {\n void editor.putExternalContent({ type: \"files\", files, point })\n return\n }\n const url = dt.getData(\"text/uri-list\").split(/\\r?\\n/).find((l) => l && !l.startsWith(\"#\"))\n if (url) {\n void editor.putExternalContent({ type: \"url\", url, point })\n return\n }\n handleText(dt.getData(\"text/plain\"), point)\n }\n\n const onPaste = (e: ClipboardEvent) => {\n if (isEditable(e.target) || isEditableContext()) return\n const cd = e.clipboardData\n if (!cd) return\n const files = Array.from(cd.files)\n if (files.length) {\n e.preventDefault()\n void editor.putExternalContent({ type: \"files\", files })\n return\n }\n if (handleText(cd.getData(\"text/plain\"))) e.preventDefault()\n }\n\n // The default shortcuts call preventDefault on ⌘V (to paste our own JSON),\n // which suppresses the `paste` event. When that happened, read the clipboard\n // through the async API instead; images are the main thing gained here.\n const onKeyDown = (e: KeyboardEvent) => {\n const isMac = /Mac|iPhone|iPad/.test(navigator.platform ?? \"\")\n const accel = isMac ? e.metaKey : e.ctrlKey\n if (!accel || e.key.toLowerCase() !== \"v\" || isEditable(e.target) || isEditableContext()) return\n setTimeout(() => {\n if (!e.defaultPrevented || !navigator.clipboard?.read) return\n navigator.clipboard.read().then(\n async (items) => {\n const files: File[] = []\n let text: string | undefined\n for (const item of items) {\n const imageType = item.types.find((t) => t.startsWith(\"image/\"))\n if (imageType) {\n const blob = await item.getType(imageType)\n files.push(new File([blob], `pasted.${imageType.split(\"/\")[1] ?? \"png\"}`, { type: imageType }))\n } else if (item.types.includes(\"text/plain\") && text === undefined) {\n text = await (await item.getType(\"text/plain\")).text()\n }\n }\n if (files.length) void editor.putExternalContent({ type: \"files\", files })\n else handleText(text)\n },\n () => {\n // clipboard permission denied or unsupported; nothing to paste\n },\n )\n }, 0)\n }\n\n el.addEventListener(\"dragover\", onDragOver)\n el.addEventListener(\"drop\", onDrop)\n window.addEventListener(\"paste\", onPaste)\n window.addEventListener(\"keydown\", onKeyDown, { capture: true })\n return () => {\n el.removeEventListener(\"dragover\", onDragOver)\n el.removeEventListener(\"drop\", onDrop)\n window.removeEventListener(\"paste\", onPaste)\n window.removeEventListener(\"keydown\", onKeyDown, { capture: true })\n }\n }, [editor, containerRef])\n}\n","import {\n type TLAnyOverlayUtilConstructor,\n EditorProvider,\n AssetUrlsProvider,\n Canvas,\n createStore,\n Editor,\n loadEngine,\n type AssetStore,\n type CanvasProps,\n type BindingUtilConstructor,\n type CurrentUser,\n type EditorStore,\n type ShapeUtilConstructor,\n type StateNodeConstructor,\n type TLAssetUrls,\n type TLColorScheme,\n type TLComponents,\n type TLTextOptions,\n type TLThemeId,\n type TLThemesInput,\n type TLUiOverrides,\n} from \"@mocanvas/editor\"\nimport { useEffect, useMemo, useRef, useState, type CSSProperties, type ReactNode } from \"react\"\nimport { defaultBindingUtils } from \"./bindings\"\nimport { defaultShapeUtils } from \"./shapes\"\nimport { defaultTools } from \"./tools\"\nimport { defaultOverlayUtils } from \"./indicators\"\nimport { TldrawUi } from \"./ui/TldrawUi\"\nimport type { TLUiComponents } from \"./ui/ui-components\"\nimport type { TLUiEventHandler } from \"./ui/ui-events\"\nimport { useKeyboardShortcuts } from \"./ui/useKeyboardShortcuts\"\nimport { useExternalContent } from \"./external/useExternalContent\"\n\n/**\n * What `onMount` is: called once with the editor as soon as it exists, and on\n * nothing else. Return a function to run when the editor is torn down — the\n * place to undo whatever the handler wired up.\n */\nexport type TLOnMountHandler = (editor: Editor) => void | (() => void)\n\n/**\n * The documented name for the props `<Mocanvas />` takes. `MocanvasProps` is the\n * same interface under this library's own name; both are exported so either\n * spelling works.\n */\nexport type TldrawBaseProps = MocanvasProps\n\nexport interface MocanvasProps {\n /** Reuse a store (e.g. for persistence or collaboration). */\n store?: EditorStore\n /** Reported UI events — a menu opened, an action run. */\n onUiEvent?: TLUiEventHandler\n /** Pin the chrome to its narrowest layout, whatever the container's width. */\n forceMobile?: boolean\n /**\n * Replace the canvas overlay painters. Defaults to `defaultOverlayUtils`;\n * pass your own list to swap one out or drop it.\n */\n overlayUtils?: readonly TLAnyOverlayUtilConstructor[]\n /** Extra shape utils beyond the defaults. */\n shapeUtils?: readonly ShapeUtilConstructor[]\n /** Extra binding utils beyond the defaults. */\n bindingUtils?: readonly BindingUtilConstructor[]\n /** Extra tools beyond the defaults. */\n tools?: readonly StateNodeConstructor[]\n initialState?: string\n onMount?: TLOnMountHandler\n /** Hide mocanvas's own panels. The canvas, and any slot the app filled, still render. */\n hideUi?: boolean\n showStats?: boolean\n className?: string\n style?: CSSProperties\n children?: ReactNode\n /**\n * The chrome map: which panels render, and what renders them. Includes the\n * `Canvas` slot, which mocanvas fills — see {@link TLComponents}.\n */\n /**\n * Replace or remove a component.\n *\n * Two maps reach this prop and their slot names are disjoint: the editor's\n * canvas-level slots (`TLComponents`) and the UI chrome's panels\n * (`TLUiComponents`). It accepts either or both — an intersection alone would\n * reject a value already typed as just one of them, because neither is\n * assignable to the other.\n */\n components?: TLComponents | TLUiComponents | (TLComponents & TLUiComponents)\n /** Rewrite the tool and action lists the chrome renders from. */\n overrides?: TLUiOverrides\n /**\n * The much smaller *canvas* override map — the selection indicators, the\n * brush, the canvas backdrop. A different thing from `components`, which is\n * chrome; these are drawn on the canvas surface itself.\n */\n canvasComponents?: CanvasProps[\"components\"]\n /**\n * Where asset bytes live. Threaded to both the store this component creates\n * and the editor, so a dropped image is uploaded through the app's own\n * storage. Ignored for the store when `store` is supplied — that store\n * already carries its own.\n */\n assets?: AssetStore\n /** Themes to register, merged over the built-in `default`. */\n themes?: TLThemesInput\n /** Which theme starts out current. */\n initialTheme?: TLThemeId\n /** Light, dark, or follow the host window. */\n colorScheme?: TLColorScheme\n /** Rich-text configuration handed to the editor. */\n textOptions?: TLTextOptions\n /**\n * Who is using this editor: the app-owned holder of their preferences. Pass\n * one to control preferences from app state; omit it and the editor keeps\n * its own.\n */\n user?: CurrentUser\n /**\n * Base paths for files an app self-hosts, published for chrome that needs\n * them via `useAssetUrls()`. mocanvas's own chrome loads none.\n */\n assetUrls?: TLAssetUrls\n /**\n * Accepted and ignored. mocanvas's licence is a written agreement rather\n * than a key the canvas verifies at runtime, so there is nothing to check; the\n * prop exists so an app migrating from a licensed canvas does not have to\n * strip it from every mount, and so that leaving it in place stays a no-op\n * rather than becoming a type error.\n */\n licenseKey?: string\n /** Editor config overrides. */\n options?: ConstructorParameters<typeof Editor>[0][\"options\"]\n}\n\n/** One identity for \"no asset urls configured\", so the context value is stable. */\nconst EMPTY_ASSET_URLS: TLAssetUrls = {}\n\n/** Batteries-included canvas: default shapes, tools, shortcuts and UI. */\nexport function Mocanvas(props: MocanvasProps) {\n const {\n store,\n shapeUtils,\n bindingUtils,\n tools,\n initialState,\n onMount,\n hideUi,\n overlayUtils,\n onUiEvent,\n forceMobile,\n showStats,\n className,\n style,\n children,\n components,\n overrides,\n canvasComponents,\n assets,\n themes,\n initialTheme,\n colorScheme,\n textOptions,\n user,\n assetUrls,\n options,\n } = props\n const containerRef = useRef<HTMLDivElement>(null)\n const [editor, setEditor] = useState<Editor | null>(null)\n\n useEffect(() => {\n let disposed = false\n let ed: Editor | null = null\n let cleanup: void | (() => void)\n let unregister: (() => void) | undefined\n loadEngine().then((engine) => {\n if (disposed) {\n engine.dispose()\n return\n }\n const allShapeUtils = [...defaultShapeUtils, ...(shapeUtils ?? [])]\n const allBindingUtils = [...defaultBindingUtils, ...(bindingUtils ?? [])]\n ed = new Editor({\n // The util lists go to the store as well as to the editor: that is what\n // registers their `static migrations`, so a board saved before a prop\n // existed is backfilled on load rather than refused by the validator.\n store: store ?? createStore({ shapeUtils: allShapeUtils, bindingUtils: allBindingUtils, ...(assets ? { assets } : {}) }),\n shapeUtils: allShapeUtils,\n bindingUtils: allBindingUtils,\n tools: [...defaultTools, ...(tools ?? [])],\n // The overlay painters — brush, scribble, snap lines, handles, the\n // selection foreground and the collaborator set. An app that replaces\n // one passes its own list, the way it does for shape utils.\n overlayUtils: overlayUtils ?? defaultOverlayUtils,\n engine,\n ...(initialState ? { initialState } : {}),\n getContainer: () => containerRef.current!,\n ...(assets ? { assets } : {}),\n ...(themes ? { themes } : {}),\n ...(initialTheme ? { initialTheme } : {}),\n ...(colorScheme ? { colorScheme } : {}),\n ...(textOptions ? { textOptions } : {}),\n ...(user ? { user } : {}),\n ...(options ? { options } : {}),\n })\n setEditor(ed)\n // `emit(\"mount\")` is what enrols the editor in `tleditors` — the editor\n // does it itself — so it comes before `onMount`, whose handler may reach\n // for `tleditors.getMounted()` and expect to find this editor there.\n ed.emit(\"mount\")\n cleanup = onMount?.(ed)\n })\n return () => {\n disposed = true\n unregister?.()\n unregister = undefined\n cleanup?.()\n ed?.dispose()\n setEditor(null)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [store])\n\n // The UI tool list binds the plain-key tool switches whenever the chrome is\n // mounted, so the hard-coded set is only wanted on a chrome-less editor.\n useKeyboardShortcuts(editor, { tools: hideUi === true })\n useExternalContent(editor, containerRef)\n\n // The canvas goes through the `Canvas` chrome slot rather than wrapping the\n // chrome, so a `components.ContextMenu` can render it inside its own trigger.\n const canvas = useMemo(\n () =>\n editor ? (\n <Canvas editor={editor} {...(canvasComponents ? { components: canvasComponents } : {})}>\n {children}\n </Canvas>\n ) : null,\n [editor, canvasComponents, children],\n )\n\n return (\n <AssetUrlsProvider assetUrls={assetUrls ?? EMPTY_ASSET_URLS}>\n <div ref={containerRef} className={className} style={{ position: \"relative\", width: \"100%\", height: \"100%\", ...style }}>\n {editor ? (\n // `TldrawUi` is the documented chrome: it owns the context\n // providers the component slots read from, and renders the canvas as\n // its child rather than taking it as a prop.\n <EditorProvider editor={editor}>\n <TldrawUi\n {...(components ? { components: components as TLUiComponents } : {})}\n {...(overrides ? { overrides } : {})}\n {...(onUiEvent ? { onUiEvent } : {})}\n {...(forceMobile ? { forceMobile } : {})}\n hideUi={hideUi === true}\n >\n {canvas}\n </TldrawUi>\n </EditorProvider>\n ) : (\n <div style={{ position: \"absolute\", inset: 0, display: \"grid\", placeItems: \"center\", color: \"#9ca3af\", fontFamily: \"system-ui\" }}>loading engine…</div>\n )}\n </div>\n </AssetUrlsProvider>\n )\n}\n","/**\n * The file-handling bits every asset path shares: measuring an image, shrinking\n * one, deciding whether a file is allowed at all, and turning finished assets\n * into shapes.\n *\n * They live apart from the asset utils because the drop handler, the paste\n * handler and an app's own upload button all need them and none of them has an\n * asset util to hand at the point they need it.\n */\n\nimport { createShapeId, type Asset, type Editor, type ShapeId, type VecLike } from \"@mocanvas/editor\"\nimport type { TLDefaultExternalContentHandlerOpts } from \"../external/handler-options\"\n\n/** Pixel dimensions of an image. */\nexport interface ImageDimensions {\n w: number\n h: number\n}\n\nconst FALLBACK_IMAGE_SIZE: ImageDimensions = { w: 100, h: 100 }\n\n/**\n * Scale `size` down — never up — so neither side exceeds `max`, keeping the\n * aspect ratio.\n *\n * Never scaling up is the whole point: a 32×32 icon dropped on the canvas\n * should arrive as a 32×32 shape, not blown up to the maximum.\n */\nexport function downsizeDimensions(size: ImageDimensions, max = Infinity): ImageDimensions {\n const w = Math.max(1, size.w)\n const h = Math.max(1, size.h)\n const scale = Math.min(1, max / Math.max(w, h))\n return { w: Math.round(w * scale), h: Math.round(h * scale) }\n}\n\n/**\n * Re-encode an image blob at `width`×`height`.\n *\n * Used before an asset is stored, so a 12-megapixel photo does not become a\n * 16 MB data URL in the document. Returns the original blob unchanged where no\n * canvas is available, or where the requested size is not smaller — shrinking\n * is an optimisation, and failing it must not fail the drop.\n */\nexport async function downsizeImage(\n blob: Blob,\n width: number,\n height: number,\n opts: { quality?: number; type?: string } = {},\n): Promise<Blob> {\n if (typeof createImageBitmap !== \"function\" || typeof OffscreenCanvas === \"undefined\") return blob\n try {\n const bitmap = await createImageBitmap(blob)\n if (bitmap.width <= width && bitmap.height <= height) {\n bitmap.close()\n return blob\n }\n const canvas = new OffscreenCanvas(Math.max(1, Math.round(width)), Math.max(1, Math.round(height)))\n const context = canvas.getContext(\"2d\")\n if (!context) {\n bitmap.close()\n return blob\n }\n context.drawImage(bitmap, 0, 0, canvas.width, canvas.height)\n bitmap.close()\n return await canvas.convertToBlob({ type: opts.type ?? blob.type ?? \"image/png\", quality: opts.quality ?? 0.92 })\n } catch {\n return blob\n }\n}\n\n/**\n * The pixel size of an image from its source.\n *\n * Falls back to a small square rather than throwing: an image whose size cannot\n * be read still deserves to land on the canvas, where the user can resize it,\n * instead of the drop silently doing nothing.\n */\nexport async function readImageSize(src: string, file?: File): Promise<ImageDimensions> {\n if (file && typeof createImageBitmap === \"function\" && file.type !== \"image/svg+xml\") {\n try {\n const bitmap = await createImageBitmap(file)\n const size = { w: bitmap.width, h: bitmap.height }\n bitmap.close()\n return size\n } catch {\n // Unsupported type — fall through to the element path.\n }\n }\n if (typeof Image === \"undefined\") return FALLBACK_IMAGE_SIZE\n return new Promise<ImageDimensions>((resolve) => {\n const img = new Image()\n img.onload = () => resolve({ w: img.naturalWidth || FALLBACK_IMAGE_SIZE.w, h: img.naturalHeight || FALLBACK_IMAGE_SIZE.h })\n img.onerror = () => resolve(FALLBACK_IMAGE_SIZE)\n img.src = src\n })\n}\n\n/** The default ceiling {@link notifyIfFileNotAllowed} applies when none is configured. */\nconst DEFAULT_MAX_ASSET_SIZE_BYTES = 10 * 1024 * 1024\n\n/**\n * Whether `file` may be turned into an asset — and if not, say so on screen.\n *\n * Returns `true` when the file is allowed. The toast is the point: a file that\n * is silently ignored looks like a broken drop target, so every rejection here\n * produces one, with the reason spelled out.\n */\nexport function notifyIfFileNotAllowed(editor: Editor, file: File, options: TLDefaultExternalContentHandlerOpts): boolean {\n const { toasts, msg, maxAssetSize = DEFAULT_MAX_ASSET_SIZE_BYTES, acceptedImageMimeTypes, acceptedVideoMimeTypes } = options\n\n if (maxAssetSize !== undefined && file.size > maxAssetSize) {\n toasts.addToast({\n title: msg(\"assets.files.size-too-big\"),\n severity: \"error\",\n })\n return false\n }\n\n // An accept list is only consulted when the caller supplied one: leaving it\n // out means \"whatever an asset util claims\", which is the sensible default\n // once an app has registered utils of its own.\n const accepted = [...(acceptedImageMimeTypes ?? []), ...(acceptedVideoMimeTypes ?? [])]\n const isKnown = accepted.length > 0 ? accepted.some((type) => type.toLowerCase() === file.type.toLowerCase()) : editor.getAssetUtilForMimeType(file.type) !== undefined\n\n if (!isKnown) {\n toasts.addToast({\n title: msg(\"assets.files.type-not-allowed\"),\n severity: \"error\",\n })\n return false\n }\n\n return true\n}\n\n/**\n * Store `assets` and create the shape each one calls for, centred on\n * `position` and stacked so several dropped files do not land exactly on top\n * of one another.\n *\n * Which shape an asset becomes is the asset util's answer, via\n * `editor.getShapeUtilForAssetType` — so an app that registered a util for its\n * own asset type gets its own shape here without changing this function.\n */\nexport async function createShapesForAssets(editor: Editor, assets: Asset[], position: VecLike): Promise<ShapeId[]> {\n if (assets.length === 0) return []\n const ids: ShapeId[] = []\n const stackOffset = 20\n\n editor.run(() => {\n editor.createAssets(assets.map((asset) => ({ id: asset.id, type: asset.type, props: asset.props, meta: asset.meta })))\n const shapes = assets.flatMap((asset, index) => {\n const shapeType = editor.getShapeUtilForAssetType?.(asset.type)?.type ?? shapeTypeForAsset(asset)\n if (!shapeType) return []\n const id = createShapeId()\n ids.push(id)\n const { w, h } = sizeOfAsset(asset)\n return [\n {\n id,\n type: shapeType,\n x: position.x - w / 2 + index * stackOffset,\n y: position.y - h / 2 + index * stackOffset,\n props: { w, h, assetId: asset.id },\n },\n ]\n })\n if (shapes.length > 0) {\n editor.createShapes(shapes as never)\n editor.setSelectedShapes(ids)\n }\n })\n\n return ids\n}\n\n/** The shape type a built-in asset becomes, when no util claims it. */\nfunction shapeTypeForAsset(asset: Asset): string | undefined {\n if (asset.type === \"image\") return \"image\"\n if (asset.type === \"video\") return \"video\"\n if (asset.type === \"bookmark\") return \"bookmark\"\n return undefined\n}\n\n/** The size a new shape for `asset` should start at. */\nfunction sizeOfAsset(asset: Asset): ImageDimensions {\n const props = asset.props as { w?: number; h?: number }\n if (typeof props.w === \"number\" && typeof props.h === \"number\" && props.w > 0 && props.h > 0) return { w: props.w, h: props.h }\n // A bookmark has no intrinsic size; this is the card the bookmark shape draws.\n return { w: 300, h: 320 }\n}\n","/**\n * Making pasted SVG safe to render.\n *\n * SVG is the one external format that is also a script host: an `<svg>` can\n * carry `<script>`, `onload=` handlers, external references that phone home,\n * and CSS that pulls in more of the same. Anything that arrives from a\n * clipboard or a dropped file goes through here first.\n *\n * The policy is an allowlist, because a denylist of dangerous element names has\n * been wrong every time anyone has tried it:\n *\n * - only known-safe elements and attributes survive;\n * - every `on*` attribute is removed, whatever it is called;\n * - links may only be `http:`, `https:` or `mailto:`;\n * - `<image>` and `<feImage>` may only reference `data:` URIs, so a pasted\n * graphic cannot beacon out to the page it came from;\n * - `<use>` may only reference a fragment (`#id`) in the same document;\n * - CSS loses `@import`, `expression()` and any external `url()`;\n * - `<foreignObject>` survives, under an HTML allowlist, because that is how\n * text is rendered — and so does a `<style>` holding `data:` font URLs.\n *\n * This is a floor, not a guarantee. An app with stricter requirements should\n * run a dedicated sanitizer (DOMPurify, say) in its own external content\n * handler; note that DOMPurify's default SVG profile strips `<foreignObject>`\n * and `<style>`, which mocanvas's own SVG export relies on, so it needs\n * configuring to keep them.\n */\n\nconst SVG_ELEMENTS = new Set([\n \"svg\", \"g\", \"defs\", \"symbol\", \"use\", \"title\", \"desc\", \"metadata\", \"style\",\n \"path\", \"rect\", \"circle\", \"ellipse\", \"line\", \"polyline\", \"polygon\",\n \"text\", \"tspan\", \"textPath\", \"tref\",\n \"marker\", \"pattern\", \"mask\", \"clipPath\", \"linearGradient\", \"radialGradient\", \"stop\",\n \"image\", \"switch\", \"foreignObject\",\n \"filter\", \"feBlend\", \"feColorMatrix\", \"feComponentTransfer\", \"feComposite\", \"feConvolveMatrix\",\n \"feDiffuseLighting\", \"feDisplacementMap\", \"feDistantLight\", \"feDropShadow\", \"feFlood\", \"feFuncA\",\n \"feFuncB\", \"feFuncG\", \"feFuncR\", \"feGaussianBlur\", \"feImage\", \"feMerge\", \"feMergeNode\",\n \"feMorphology\", \"feOffset\", \"fePointLight\", \"feSpecularLighting\", \"feSpotLight\", \"feTile\", \"feTurbulence\",\n \"a\",\n])\n\n/** Elements a `<foreignObject>` may contain — enough for text rendering, nothing more. */\nconst HTML_ELEMENTS = new Set([\"div\", \"span\", \"p\", \"br\", \"b\", \"strong\", \"i\", \"em\", \"u\", \"s\", \"code\", \"pre\", \"ul\", \"ol\", \"li\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"blockquote\", \"a\"])\n\n/** Attributes that may carry a URL, and therefore need their scheme checked. */\nconst URL_ATTRIBUTES = new Set([\"href\", \"xlink:href\", \"src\"])\n\n/** Attributes never allowed, whatever element they sit on. */\nconst BANNED_ATTRIBUTES = new Set([\"xlink:script\", \"content\", \"http-equiv\"])\n\nconst SAFE_LINK_SCHEME = /^(?:https?:|mailto:)/i\nconst FRAGMENT_ONLY = /^#[^\\s]*$/\n\n/**\n * Sanitize an SVG document, returning the cleaned markup — or `null` when the\n * input was not SVG at all, or when nothing survived.\n *\n * `null` rather than an empty string on purpose: a caller has to be able to\n * tell \"there was nothing to draw\" from \"here is an empty drawing\", and the\n * former should not create a shape.\n */\nexport function sanitizeSvg(svgText: string): string | null {\n if (typeof DOMParser === \"undefined\") {\n // Nothing can parse the document, so nothing can vouch for it. Refusing is\n // the only safe answer: returning the input unchanged would hand unchecked\n // markup to whatever renders it.\n return null\n }\n\n const parsed = new DOMParser().parseFromString(svgText, \"image/svg+xml\")\n if (parsed.getElementsByTagName(\"parsererror\").length > 0) return null\n const root = parsed.documentElement\n if (!root || root.tagName.toLowerCase() !== \"svg\") return null\n\n sanitizeElement(root, false)\n if (root.childNodes.length === 0 && root.attributes.length === 0) return null\n return new XMLSerializer().serializeToString(root)\n}\n\n/** Strip everything disallowed from `element` and its descendants, in place. */\nfunction sanitizeElement(element: Element, inForeignObject: boolean): void {\n for (const attribute of [...element.attributes]) {\n const name = attribute.name.toLowerCase()\n const value = attribute.value\n\n // Event handlers are the whole attack in one attribute; drop the family.\n if (name.startsWith(\"on\") || BANNED_ATTRIBUTES.has(name)) {\n element.removeAttribute(attribute.name)\n continue\n }\n\n if (URL_ATTRIBUTES.has(name)) {\n if (!isAllowedUrl(element.tagName, value)) element.removeAttribute(attribute.name)\n continue\n }\n\n if (name === \"style\" && hasUnsafeCss(value)) {\n element.setAttribute(\"style\", sanitizeCss(value))\n continue\n }\n }\n\n for (const child of [...element.childNodes]) {\n if (child.nodeType === 3 /* text */) {\n if (element.tagName.toLowerCase() === \"style\") {\n child.nodeValue = sanitizeCss(child.nodeValue ?? \"\")\n }\n continue\n }\n if (child.nodeType !== 1 /* element */) {\n // Comments, CDATA and processing instructions carry nothing we render.\n element.removeChild(child)\n continue\n }\n const childElement = child as Element\n const tag = childElement.tagName\n const nowInForeignObject = inForeignObject || tag.toLowerCase() === \"foreignobject\"\n const allowed = inForeignObject ? HTML_ELEMENTS.has(tag.toLowerCase()) : SVG_ELEMENTS.has(tag) || SVG_ELEMENTS.has(tag.toLowerCase())\n if (!allowed) {\n element.removeChild(child)\n continue\n }\n sanitizeElement(childElement, nowInForeignObject)\n }\n}\n\n/** Whether a URL attribute on `tagName` may keep `value`. */\nfunction isAllowedUrl(tagName: string, value: string): boolean {\n const url = value.trim()\n const tag = tagName.toLowerCase()\n // A `<use>` that can reach outside the document is a way to pull in markup\n // the sanitizer never saw.\n if (tag === \"use\") return FRAGMENT_ONLY.test(url)\n // A referenced image is fetched by the renderer; only a self-contained one\n // cannot become a request.\n if (tag === \"image\" || tag === \"feimage\") return url.startsWith(\"data:image/\")\n if (url.startsWith(\"#\")) return true\n return SAFE_LINK_SCHEME.test(url)\n}\n\nconst UNSAFE_CSS = /@import|expression\\s*\\(|url\\s*\\(\\s*(?!['\"]?data:)/i\n\nfunction hasUnsafeCss(css: string): boolean {\n return UNSAFE_CSS.test(css)\n}\n\n/**\n * Remove the parts of a stylesheet that can fetch or execute.\n *\n * `url(data:…)` survives, because that is how an exported drawing carries its\n * embedded fonts; every other `url()` is a request the document did not ask for.\n */\nfunction sanitizeCss(css: string): string {\n return css\n .replace(/@import[^;]*;?/gi, \"\")\n .replace(/expression\\s*\\([^)]*\\)/gi, \"\")\n .replace(/url\\s*\\(\\s*(['\"]?)(?!data:)[^)]*\\)/gi, \"none\")\n}\n","/**\n * The default handlers for content that arrives from outside the editor.\n *\n * `registerDefaultExternalContentHandlers` wires these up; they are exported\n * individually so an app can *extend* one rather than replace it — filter the\n * files, then call the default with what is left:\n *\n * ```ts\n * editor.registerExternalContentHandler(\"files\", async (content) => {\n * const small = content.files.filter((file) => file.size < 1024 * 1024)\n * await defaultHandleExternalFileContent(editor, { ...content, files: small }, { toasts, msg })\n * })\n * ```\n *\n * The ones that can refuse a file take a third argument carrying the toasts and\n * the translator, because refusing silently is worse than not handling the drop\n * at all.\n */\n\nimport { AssetRecordType, type Asset, type Editor, type ShapeId, type VecLike } from \"@mocanvas/editor\"\nimport { createShapesForAssets, notifyIfFileNotAllowed } from \"../assets/media\"\nimport { createImageAssetFromSvgText, createTextShapeAt } from \"./defaultExternalContentHandlers\"\nimport type { TLDefaultExternalContentHandlerOpts } from \"./handler-options\"\nimport { sanitizeSvg } from \"./sanitizeSvg\"\nimport { defaultHandleExternalUrlContent } from \"./urlContent\"\n\n/** Where content should land, when it says. */\ninterface AtPoint {\n point?: VecLike\n}\n\nfunction pointOrCenter(editor: Editor, point: VecLike | undefined): VecLike {\n return point ?? editor.getViewportPageCenter()\n}\n\n/** Plain text: one text shape, centred where it was dropped. */\nexport async function defaultHandleExternalTextContent(editor: Editor, info: { text: string } & AtPoint): Promise<void> {\n const text = info.text.trim()\n if (!text) return\n editor.markHistoryStoppingPoint(\"insert text\")\n createTextShapeAt(editor, text, info.point)\n}\n\n/**\n * SVG markup: one image shape backed by an inline SVG asset.\n *\n * The markup is sanitized first, and dropped entirely when nothing safe is left\n * — pasted SVG is the single most dangerous thing that can arrive on a canvas,\n * because it can carry script.\n */\nexport async function defaultHandleExternalSvgTextContent(editor: Editor, info: { text: string } & AtPoint): Promise<void> {\n const safe = sanitizeSvg(info.text)\n if (!safe) return\n editor.markHistoryStoppingPoint(\"insert svg\")\n const asset = createImageAssetFromSvgText(safe)\n await createShapesForAssets(editor, [asset], pointOrCenter(editor, info.point))\n}\n\n/** A url the caller has already decided to embed, skipping the bookmark negotiation. */\nexport async function defaultHandleExternalEmbedContent(editor: Editor, info: { url: string } & AtPoint): Promise<void> {\n if (!editor.hasShapeUtil(\"embed\")) {\n await defaultHandleExternalUrlContent(editor, { url: info.url, ...(info.point ? { point: info.point } : {}) })\n return\n }\n editor.markHistoryStoppingPoint(\"insert embed\")\n const { createEmbedShape } = await import(\"./urlContent\")\n createEmbedShape(editor, info.url, info.point)\n}\n\n/**\n * mocanvas's own clipboard content: shapes, bindings and assets, put back onto\n * the current page.\n *\n * Goes through `putContentOntoCurrentPage`, so ids are remapped, the content is\n * migrated from whatever schema it was written under, and a paste with a point\n * lands inside whatever frame is under it.\n */\nexport async function defaultHandleExternalTldrawContent(\n editor: Editor,\n info: { content: unknown } & AtPoint,\n): Promise<void> {\n const content = info.content as { shapes?: unknown[] } | null\n if (!content || !Array.isArray(content.shapes)) return\n editor.markHistoryStoppingPoint(\"paste\")\n editor.putContentOntoCurrentPage(content as never, info.point ? { point: info.point } : {})\n}\n\n/**\n * Files: turn each one into an asset through the util that claims its type,\n * then create the shapes those assets call for.\n *\n * Files that are refused (too large, or a type nothing claims) are dropped with\n * a toast and the rest still land — a drop of ten photos and one video should\n * not fail wholesale because the video was too big.\n */\nexport async function defaultHandleExternalFileContent(\n editor: Editor,\n info: { files: File[] } & AtPoint,\n opts: TLDefaultExternalContentHandlerOpts,\n): Promise<void> {\n const assets: Asset[] = []\n for (const file of info.files) {\n if (!notifyIfFileNotAllowed(editor, file, opts)) continue\n const asset = await defaultHandleExternalFileAsset(editor, { type: \"file\", file }, opts)\n if (asset) assets.push(asset)\n }\n if (assets.length === 0) return\n editor.markHistoryStoppingPoint(\"insert files\")\n await createShapesForAssets(editor, assets, pointOrCenter(editor, info.point))\n}\n\n/**\n * Replace the asset behind an existing shape with one built from `file`.\n *\n * The shape keeps its position, size and every other prop — which is the point:\n * \"swap this photo for that one\" should not move or resize anything.\n */\nexport async function defaultHandleExternalFileReplaceContent(\n editor: Editor,\n info: { files: File[]; shapeId: ShapeId },\n opts: TLDefaultExternalContentHandlerOpts,\n): Promise<void> {\n const file = info.files[0]\n if (!file) return\n if (!notifyIfFileNotAllowed(editor, file, opts)) return\n const asset = await defaultHandleExternalFileAsset(editor, { type: \"file\", file }, opts)\n if (!asset) return\n const shape = editor.getShape(info.shapeId)\n if (!shape) return\n editor.markHistoryStoppingPoint(\"replace media\")\n editor.run(() => {\n editor.createAssets([{ id: asset.id, type: asset.type, props: asset.props, meta: asset.meta }])\n editor.updateShape({ id: shape.id, type: shape.type, props: { ...(shape.props as object), assetId: asset.id } } as never)\n })\n}\n\n/**\n * Build an asset record for a file, without creating any shape.\n *\n * The seam an app overrides to upload somewhere: return an asset whose `src`\n * points at your own storage and every path that handles a file gets it.\n */\nexport async function defaultHandleExternalFileAsset(\n editor: Editor,\n info: { type: \"file\"; file: File },\n opts: TLDefaultExternalContentHandlerOpts,\n): Promise<Asset | undefined> {\n if (!notifyIfFileNotAllowed(editor, info.file, opts)) return undefined\n const util = editor.getAssetUtilForMimeType(info.file.type)\n if (util?.upload) return await util.upload(info.file, editor)\n // No util claims the type — fall back to whatever asset handler the app\n // registered, which is how an app supports a type without writing a util.\n return await editor.getAssetForExternalContent(info)\n}\n\n/**\n * Build a bookmark asset for a url, without creating any shape.\n *\n * mocanvas performs no network request of its own here: unfurling a link needs\n * a server that can fetch it, which is the app's to provide. The asset that\n * comes back carries the url and empty metadata, and an app that has an unfurl\n * endpoint registers its own `url` asset handler to fill the rest in.\n */\nexport async function defaultHandleExternalUrlAsset(\n editor: Editor,\n info: { type: \"url\"; url: string },\n _opts?: TLDefaultExternalContentHandlerOpts,\n): Promise<Asset | undefined> {\n const registered = await editor.getAssetForExternalContent(info)\n if (registered) return registered\n return {\n id: AssetRecordType.createId(),\n typeName: \"asset\",\n type: \"bookmark\",\n props: { title: \"\", description: \"\", image: \"\", favicon: \"\", src: info.url },\n meta: {},\n }\n}\n","/**\n * Turning a url into a bookmark card.\n *\n * The card's title, description and preview image come from *unfurling* the\n * url, and unfurling means fetching somebody else's page — which a browser\n * cannot do cross-origin and mocanvas will not pretend to. So this function\n * performs no network request of its own: it asks the editor for a `url` asset,\n * which reaches whatever asset handler the app registered, and creates the card\n * from whatever comes back.\n *\n * An app with an unfurl endpoint of its own wires it up once:\n *\n * ```ts\n * editor.registerExternalAssetHandler(\"url\", async ({ url }) => {\n * const meta = await fetch(`/api/unfurl?url=${encodeURIComponent(url)}`).then((r) => r.json())\n * return { id: AssetRecordType.createId(), typeName: \"asset\", type: \"bookmark\", props: { ...meta, src: url }, meta: {} }\n * })\n * ```\n *\n * With no handler registered the card still appears, showing the host and the\n * link — which is a better outcome than a paste that does nothing.\n */\n\nimport type { Asset, Editor, VecLike } from \"@mocanvas/editor\"\nimport type { BookmarkShape } from \"../shapes/BookmarkShapeUtil\"\nimport { createBookmarkShape } from \"./urlContent\"\n\n/**\n * Either the shape that was created, or why it was not.\n *\n * A result rather than a throw because failing to unfurl a link is an ordinary\n * outcome — an offline machine, a page that blocks scrapers — and the caller\n * usually wants to show a toast, not unwind.\n *\n * SEMANTICS-ASSUMED: the documented return type is `Result<TLBookmarkShape,\n * string>` from tldraw's utils package, which is outside the six packages\n * mocanvas reimplements. This is the same two-case shape under a local name.\n */\nexport type CreateBookmarkResult = { ok: true; value: BookmarkShape } | { ok: false; error: string }\n\n/**\n * Create a bookmark shape for `url`, centred on `center`.\n *\n * Fails — rather than creating an empty card — when the url is unparseable or\n * the editor has no bookmark shape registered, because in both cases there is\n * nothing meaningful to put on the canvas.\n */\nexport async function createBookmarkFromUrl(editor: Editor, { url, center }: { url: string; center?: VecLike }): Promise<CreateBookmarkResult> {\n const trimmed = url.trim()\n if (!trimmed) return { ok: false, error: \"No url given.\" }\n\n try {\n const parsed = new URL(trimmed)\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return { ok: false, error: `Cannot bookmark a \"${parsed.protocol}\" url.` }\n }\n } catch {\n return { ok: false, error: `Could not parse \"${trimmed}\" as a url.` }\n }\n\n if (!editor.hasShapeUtil(\"bookmark\")) {\n return { ok: false, error: \"This editor has no bookmark shape registered.\" }\n }\n\n let asset: Asset | undefined\n try {\n asset = await editor.getAssetForExternalContent({ type: \"url\", url: trimmed })\n } catch {\n // An unfurl that failed is not a bookmark that failed: the card is still\n // worth creating, it just shows the link rather than a preview.\n asset = undefined\n }\n\n const id = createBookmarkShape(editor, trimmed, asset, center)\n const shape = editor.getShape<BookmarkShape>(id)\n if (!shape) return { ok: false, error: \"The bookmark shape could not be created.\" }\n return { ok: true, value: shape }\n}\n","/**\n * Importing Excalidraw clipboard content.\n *\n * Purely local: an Excalidraw copy puts a JSON document on the clipboard, and\n * this reads it. No request is made to excalidraw.com or anywhere else — the\n * whole drawing is in the paste.\n *\n * The mapping is deliberately lossy and says so. Excalidraw's model and this\n * one agree on rectangles, ellipses, diamonds, lines, arrows, freehand strokes\n * and text; they disagree on almost everything below that (Excalidraw's\n * roughness seed, its bound-element graph, its frames). Shapes that cannot be\n * represented are skipped rather than approximated, because a wrong shape in\n * the middle of a pasted diagram is worse than a missing one.\n */\n\nimport { createShapeId, type Editor, type ShapeId, type VecLike } from \"@mocanvas/editor\"\nimport { toRichText } from \"../text/rich-text\"\n\n/** The fields of an Excalidraw element this importer reads. */\ninterface ExcalidrawElement {\n type?: string\n x?: number\n y?: number\n width?: number\n height?: number\n angle?: number\n text?: string\n fontSize?: number\n strokeColor?: string\n backgroundColor?: string\n fillStyle?: string\n strokeStyle?: string\n strokeWidth?: number\n isDeleted?: boolean\n points?: [number, number][]\n roundness?: unknown\n}\n\n/** The clipboard document Excalidraw writes. */\ninterface ExcalidrawClipboard {\n type?: string\n elements?: ExcalidrawElement[]\n}\n\n/** Excalidraw's stroke colours, mapped to the nearest canvas colour token. */\nconst COLOR_BY_HEX: Readonly<Record<string, string>> = {\n \"#1e1e1e\": \"black\",\n \"#000000\": \"black\",\n \"#e03131\": \"red\",\n \"#2f9e44\": \"green\",\n \"#1971c2\": \"blue\",\n \"#f08c00\": \"orange\",\n \"#9c36b5\": \"violet\",\n \"#868e96\": \"grey\",\n}\n\nfunction colorFor(hex: string | undefined): string {\n if (!hex) return \"black\"\n return COLOR_BY_HEX[hex.toLowerCase()] ?? \"black\"\n}\n\nfunction dashFor(style: string | undefined): string {\n if (style === \"dashed\") return \"dashed\"\n if (style === \"dotted\") return \"dotted\"\n return \"draw\"\n}\n\nfunction sizeFor(strokeWidth: number | undefined): string {\n if (strokeWidth === undefined) return \"m\"\n if (strokeWidth <= 1) return \"s\"\n if (strokeWidth <= 2) return \"m\"\n if (strokeWidth <= 4) return \"l\"\n return \"xl\"\n}\n\nconst GEO_BY_EXCALIDRAW_TYPE: Readonly<Record<string, string>> = {\n rectangle: \"rectangle\",\n ellipse: \"ellipse\",\n diamond: \"diamond\",\n}\n\n/**\n * Whether `content` looks like an Excalidraw clipboard payload.\n *\n * Checked by its declared `type` rather than by sniffing for fields, so a\n * document that merely happens to have an `elements` array is not mistaken for\n * one.\n */\nexport function isExcalidrawClipboardContent(content: unknown): boolean {\n if (typeof content !== \"object\" || content === null) return false\n const type = (content as { type?: unknown }).type\n return typeof type === \"string\" && type.startsWith(\"excalidraw\")\n}\n\n/**\n * Put Excalidraw clipboard content onto the current page, centred on `point`.\n *\n * The elements' own coordinates are preserved relative to one another, so a\n * pasted diagram keeps its layout; the whole group is then translated so its\n * centre lands where the paste happened.\n */\nexport async function putExcalidrawContent(editor: Editor, excalidrawClipboardContent: unknown, point?: VecLike): Promise<void> {\n const clipboard = excalidrawClipboardContent as ExcalidrawClipboard | null\n const elements = (clipboard?.elements ?? []).filter((element) => !element.isDeleted)\n if (elements.length === 0) return\n\n // The bounding box of everything, so the paste can be centred as one piece.\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const element of elements) {\n const x = element.x ?? 0\n const y = element.y ?? 0\n minX = Math.min(minX, x)\n minY = Math.min(minY, y)\n maxX = Math.max(maxX, x + (element.width ?? 0))\n maxY = Math.max(maxY, y + (element.height ?? 0))\n }\n const target = point ?? editor.getViewportPageCenter()\n const dx = target.x - (minX + maxX) / 2\n const dy = target.y - (minY + maxY) / 2\n\n const created: ShapeId[] = []\n const shapes: object[] = []\n\n for (const element of elements) {\n const x = (element.x ?? 0) + dx\n const y = (element.y ?? 0) + dy\n const rotation = element.angle ?? 0\n const common = { color: colorFor(element.strokeColor), dash: dashFor(element.strokeStyle), size: sizeFor(element.strokeWidth) }\n\n const geo = GEO_BY_EXCALIDRAW_TYPE[element.type ?? \"\"]\n if (geo && editor.hasShapeUtil(\"geo\")) {\n const id = createShapeId()\n created.push(id)\n shapes.push({\n id,\n type: \"geo\",\n x,\n y,\n rotation,\n props: {\n ...common,\n geo,\n w: Math.max(1, element.width ?? 1),\n h: Math.max(1, element.height ?? 1),\n fill: element.backgroundColor && element.backgroundColor !== \"transparent\" ? \"solid\" : \"none\",\n },\n })\n continue\n }\n\n if (element.type === \"text\" && editor.hasShapeUtil(\"text\")) {\n const id = createShapeId()\n created.push(id)\n shapes.push({\n id,\n type: \"text\",\n x,\n y,\n rotation,\n props: { ...common, richText: toRichText(element.text ?? \"\"), autoSize: true },\n })\n continue\n }\n\n if ((element.type === \"line\" || element.type === \"arrow\" || element.type === \"draw\" || element.type === \"freedraw\") && Array.isArray(element.points)) {\n const points = element.points\n const first = points[0]\n const last = points[points.length - 1]\n if (!first || !last) continue\n\n if (element.type === \"arrow\" && editor.hasShapeUtil(\"arrow\")) {\n const id = createShapeId()\n created.push(id)\n shapes.push({\n id,\n type: \"arrow\",\n x,\n y,\n rotation,\n props: { ...common, start: { x: first[0], y: first[1] }, end: { x: last[0], y: last[1] } },\n })\n continue\n }\n\n if (editor.hasShapeUtil(\"line\")) {\n const id = createShapeId()\n created.push(id)\n shapes.push({\n id,\n type: \"line\",\n x,\n y,\n rotation,\n props: { ...common, points: Object.fromEntries(points.map((p, i) => [`a${i + 1}`, { id: `a${i + 1}`, index: `a${i + 1}`, x: p[0], y: p[1] }])) },\n })\n }\n continue\n }\n // Anything else — an image, a frame, an embedded scene — is skipped.\n }\n\n if (shapes.length === 0) return\n editor.markHistoryStoppingPoint(\"paste excalidraw\")\n editor.run(() => {\n editor.createShapes(shapes as never)\n editor.setSelectedShapes(created)\n })\n}\n\n/**\n * The default handler for Excalidraw content arriving on the clipboard.\n *\n * A thin wrapper over {@link putExcalidrawContent} that ignores content which\n * is not actually Excalidraw's, so it is safe to register unconditionally.\n */\nexport async function defaultHandleExternalExcalidrawContent(\n editor: Editor,\n info: { content: unknown; point?: VecLike },\n): Promise<void> {\n if (!isExcalidrawClipboardContent(info.content)) return\n await putExcalidrawContent(editor, info.content, info.point)\n}\n","/**\n * The configuration seam for embedded third-party pages.\n *\n * mocanvas ships the *mechanism* — a permit list of hosts, a per-service\n * settings map, and a permissions policy for the iframe — and a small set of\n * built-in definitions. What it deliberately does not ship is any code that\n * talks to somebody else's hosted API: an embed is a URL rewrite and an\n * `<iframe>`, never a fetch. An app that needs a service mocanvas has never\n * heard of adds a {@link CustomEmbedDefinition} rather than waiting for one.\n *\n * ```ts\n * const Embeds = EmbedShapeUtil.configure({\n * embedDefinitions: [...DEFAULT_EMBED_DEFINITIONS, myIntranet],\n * embedConfig: { \"google-maps\": { apiKey: MAPS_KEY } },\n * })\n * ```\n *\n * The definitions and the util live in `shapes/EmbedShapeUtil`; this module is\n * the typed surface an app configures them through.\n */\n\nimport type { EmbedDefinition, EmbedInfo, EmbedSettings } from \"../shapes/EmbedShapeUtil\"\n\n/** The services recognised out of the box, by their stable ids. */\nexport type DefaultEmbedDefinitionType = \"youtube\" | \"vimeo\" | \"codesandbox\" | \"figma\" | \"google-maps\" | \"excalidraw\"\n\n/**\n * An embed definition supplied by the app.\n *\n * Structurally the same as a built-in one — which is the point: there is no\n * privileged category of embed, and a custom definition can do anything a\n * built-in does, including declaring an aspect ratio and recovering a page url\n * from an embed url.\n */\nexport interface CustomEmbedDefinition extends EmbedDefinition {}\n\n/**\n * Google Maps needs a key to embed anything beyond a basic map, so it is the\n * one built-in with settings worth naming.\n */\nexport interface GoogleMapsEmbedConfig extends EmbedSettings {\n /** Maps Embed API key. Ends up in the iframe url, so it must be a browser-restricted key. */\n apiKey?: string\n /** Two-letter language for the map's labels. */\n language?: string\n /** Two-letter region, biasing place names and borders. */\n region?: string\n}\n\n/**\n * Settings for the built-in services, keyed by service id.\n *\n * The only route a key takes into an embed url: a definition is handed its own\n * entry and nothing else, so one service's configuration can never leak into\n * another's request.\n */\nexport interface DefaultEmbedConfig extends Partial<Record<DefaultEmbedDefinitionType, EmbedSettings>> {\n \"google-maps\"?: GoogleMapsEmbedConfig\n}\n\n/**\n * What resolving a url against the permit list produced, or `undefined` when\n * the url is not one that gets embedded.\n */\nexport type TLEmbedResult = EmbedInfo | undefined\n\n/**\n * The permissions an embedded page is granted by default, as iframe\n * permissions-policy features.\n *\n * Everything that can reach the user's hardware or identity is off. What is on\n * is only what a media player needs to be a media player: full screen, sound\n * without a second click, DRM playback, picture-in-picture, and the motion\n * sensors a 360° video reads. A definition may widen this for its own service;\n * nothing widens it for a service that is not on the permit list, because\n * nothing off the permit list is ever put in an iframe at all.\n *\n * The documented `TLEmbedShapePermissions` alias for this object's shape is\n * published from the shapes module alongside the embed util.\n */\nexport const embedShapePermissionDefaults = {\n \"accelerometer\": true,\n \"autoplay\": true,\n \"clipboard-write\": false,\n \"encrypted-media\": true,\n \"fullscreen\": true,\n \"gyroscope\": true,\n \"picture-in-picture\": true,\n \"camera\": false,\n \"display-capture\": false,\n \"geolocation\": false,\n \"microphone\": false,\n \"midi\": false,\n \"payment\": false,\n \"screen-wake-lock\": false,\n \"usb\": false,\n \"web-share\": false,\n \"xr-spatial-tracking\": false,\n} as const\n\n/**\n * The `allow` attribute for an iframe, built from a permissions map.\n *\n * Only the features that are on are listed; a feature that is absent from the\n * attribute is denied, so an explicit `false` and an omission mean the same\n * thing to the browser.\n */\nexport function embedPermissionsToAllowAttribute(permissions: Readonly<Record<string, boolean>>): string {\n return Object.entries(permissions)\n .filter(([, allowed]) => allowed)\n .map(([feature]) => feature)\n .join(\"; \")\n}\n","/**\n * The asset utils for the three built-in asset types.\n *\n * An asset util is to a dropped file what a shape util is to a shape: it says\n * which MIME types it can take, turns one into an asset record, and names the\n * shape type that record should become. Registering one is how an app teaches\n * the editor about a new kind of attachment without touching the drop handler.\n *\n * The editor drives these structurally (see `TLAssetUtilLike`), so the three\n * below are ordinary classes rather than a framework: what makes them *the\n * defaults* is only that {@link defaultAssetUtils} lists them.\n */\n\nimport { AssetRecordType, type Asset, type BookmarkAsset, type BookmarkAssetProps, type Editor, type ImageAsset, type ImageAssetProps, type VideoAsset, type VideoAssetProps } from \"@mocanvas/editor\"\nimport { readFileAsDataUrl } from \"../external/defaultExternalContentHandlers\"\nimport { downsizeDimensions, readImageSize } from \"./media\"\n\n/**\n * The largest file the drop and paste paths will turn into an asset, in bytes.\n *\n * A ceiling rather than a preference: an asset is inlined as a data URL until an\n * app supplies an asset store, and a 50 MB data URL in a document is a document\n * nothing can open. Apps that upload to their own storage raise it.\n */\nexport const DEFAULT_MAX_ASSET_SIZE = 10 * 1024 * 1024\n\n/** Image types every browser that runs the canvas can decode. */\nexport const DEFAULT_SUPPORTED_IMAGE_TYPES: readonly string[] = [\n \"image/jpeg\",\n \"image/png\",\n \"image/gif\",\n \"image/svg+xml\",\n \"image/webp\",\n \"image/apng\",\n \"image/avif\",\n]\n\n/** Video types every browser that runs the canvas can play. */\nexport const DEFAULT_SUPPORTED_VIDEO_TYPES: readonly string[] = [\"video/mp4\", \"video/quicktime\", \"video/webm\"]\n\n/** Longest side, in page units, an inserted image is scaled down to. */\nconst DEFAULT_MAX_IMAGE_DIMENSION = 1000\n\n/** What every asset util can be configured with; a subclass adds its own. */\nexport interface AssetUtilOptions {\n /** MIME types this util claims. Replacing the list is how an app narrows it. */\n supportedMimeTypes?: readonly string[]\n}\n\n/** Constructor form, matching what `<Mocanvas assetUtils={…}>` accepts. */\nexport interface AssetUtilClass {\n // A mixin base has to accept a rest parameter; the one argument an asset util\n // actually takes is the editor.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]): { readonly type: string }\n readonly type: string\n options?: object\n}\n\n/**\n * The shared half of the three utils below.\n *\n * Deliberately not exported: the documented base class is `AssetUtil` in the\n * editor package, and exporting a second class under a different name here\n * would give apps two bases to choose between. When the editor's `AssetUtil`\n * lands, these three change their `extends` clause and nothing else — they\n * already have its documented members.\n */\nabstract class BuiltInAssetUtil<A extends Asset> {\n static type: string\n /** Prop validators for this asset type. Read by the store when it builds the schema. */\n static props?: object\n /** How this asset type's props have changed over time. */\n static migrations?: object\n /** The defaults every instance starts its `options` from. */\n static options?: object\n\n /**\n * This util with `options` merged over its defaults, as a new class.\n *\n * Nothing is mutated, so two editors on one page can register differently\n * configured copies of the same asset type.\n */\n static configure<C extends AssetUtilClass>(this: C, options: object): C {\n const Base = this\n const merged = { ...((Base as { options?: object }).options ?? {}), ...options }\n const Configured = class extends Base {}\n Object.defineProperty(Configured, \"options\", { value: merged, writable: true, configurable: true, enumerable: true })\n Object.defineProperty(Configured, \"name\", { value: `${(Base as { name?: string }).name ?? \"AssetUtil\"}(configured)`, configurable: true })\n return Configured as unknown as C\n }\n\n readonly options: AssetUtilOptions\n\n constructor(readonly editor: Editor) {\n this.options = ((this.constructor as { options?: AssetUtilOptions }).options ?? {}) as AssetUtilOptions\n }\n\n get type(): A[\"type\"] {\n return (this.constructor as unknown as { type: A[\"type\"] }).type\n }\n\n /** The MIME types this util can build an asset from. */\n abstract getSupportedMimeTypes(): readonly string[]\n\n /** The props a freshly created asset of this type starts with. */\n abstract getDefaultProps(): A[\"props\"]\n\n /** Build an asset record from a file, or `null` when it cannot. */\n abstract getAssetFromFile(file: File, assetId: Asset[\"id\"]): Promise<A | null>\n\n /** Whether this util claims `mimeType`. Case-insensitive. */\n acceptsMimeType(mimeType: string): boolean {\n const wanted = mimeType.toLowerCase()\n return this.getSupportedMimeTypes().some((type) => type.toLowerCase() === wanted)\n }\n\n // ---- the editor's structural contract -------------------------------------\n\n /** Alias of {@link getSupportedMimeTypes}, under the name the editor's registry calls. */\n getMimeTypes(): readonly string[] {\n return this.getSupportedMimeTypes()\n }\n\n /** The shape type an asset of this type is dropped as. */\n abstract getShapeType(): string\n\n /** Build an asset for `file`, for the editor's registry. */\n async upload(file: File, _editor: Editor): Promise<Asset> {\n const asset = await this.getAssetFromFile(file, AssetRecordType.createId())\n if (!asset) throw new Error(`mocanvas: ${this.type} asset util could not read \"${file.name}\".`)\n return asset\n }\n\n /** The URL the canvas should paint this asset from. */\n resolve(asset: Asset): string | null {\n return (asset.props as { src?: string | null }).src ?? null\n }\n}\n\n/** Image files: raster and SVG, downsized to the configured maximum. */\nexport class ImageAssetUtil extends BuiltInAssetUtil<ImageAsset> {\n static override type = \"image\" as const\n static override options: AssetUtilOptions & { maxDimension?: number } = {\n supportedMimeTypes: DEFAULT_SUPPORTED_IMAGE_TYPES,\n maxDimension: DEFAULT_MAX_IMAGE_DIMENSION,\n }\n\n override getSupportedMimeTypes(): readonly string[] {\n return this.options.supportedMimeTypes ?? DEFAULT_SUPPORTED_IMAGE_TYPES\n }\n\n override getShapeType(): string {\n return \"image\"\n }\n\n override getDefaultProps(): ImageAssetProps {\n return { w: 0, h: 0, name: \"\", isAnimated: false, mimeType: null, src: null }\n }\n\n override async getAssetFromFile(file: File, assetId: Asset[\"id\"]): Promise<ImageAsset | null> {\n if (!this.acceptsMimeType(file.type) && !/\\.svg$/i.test(file.name)) return null\n const src = await readFileAsDataUrl(file)\n const mimeType = file.type || (/\\.svg$/i.test(file.name) ? \"image/svg+xml\" : null)\n const size = downsizeDimensions(await readImageSize(src, file), (this.options as { maxDimension?: number }).maxDimension ?? DEFAULT_MAX_IMAGE_DIMENSION)\n return {\n id: assetId,\n typeName: \"asset\",\n type: \"image\",\n props: {\n ...size,\n name: file.name,\n // An animated format has to be painted as a live element rather than a\n // texture, so this flag decides how the shape renders, not just how it\n // is described.\n isAnimated: mimeType === \"image/gif\" || mimeType === \"image/apng\" || mimeType === \"image/webp\",\n mimeType,\n src,\n fileSize: file.size,\n },\n meta: {},\n }\n }\n}\n\n/** Video files. */\nexport class VideoAssetUtil extends BuiltInAssetUtil<VideoAsset> {\n static override type = \"video\" as const\n static override options: AssetUtilOptions = { supportedMimeTypes: DEFAULT_SUPPORTED_VIDEO_TYPES }\n\n override getSupportedMimeTypes(): readonly string[] {\n return this.options.supportedMimeTypes ?? DEFAULT_SUPPORTED_VIDEO_TYPES\n }\n\n override getShapeType(): string {\n return \"video\"\n }\n\n override getDefaultProps(): VideoAssetProps {\n return { w: 0, h: 0, name: \"\", isAnimated: true, mimeType: null, src: null }\n }\n\n override async getAssetFromFile(file: File, assetId: Asset[\"id\"]): Promise<VideoAsset | null> {\n if (!this.acceptsMimeType(file.type)) return null\n const src = await readFileAsDataUrl(file)\n return {\n id: assetId,\n typeName: \"asset\",\n type: \"video\",\n // Dimensions are left at zero: reading them needs a `<video>` element to\n // reach `loadedmetadata`, and the video shape sizes itself from the\n // element once it has one. A wrong guess here would make the shape jump.\n props: { w: 0, h: 0, name: file.name, isAnimated: true, mimeType: file.type || null, src, fileSize: file.size },\n meta: {},\n }\n }\n}\n\n/**\n * Bookmarks: a link with a title, description and preview image.\n *\n * It claims no MIME types, because a bookmark never comes from a file — it\n * comes from a URL. The util exists so a bookmark asset has the same\n * default-props and shape-type answers as any other asset type, and so\n * `editor.getShapeUtilForAssetType(\"bookmark\")` resolves.\n */\nexport class BookmarkAssetUtil extends BuiltInAssetUtil<BookmarkAsset> {\n static override type = \"bookmark\" as const\n\n override getSupportedMimeTypes(): readonly string[] {\n return this.options.supportedMimeTypes ?? []\n }\n\n override getShapeType(): string {\n return \"bookmark\"\n }\n\n override getDefaultProps(): BookmarkAssetProps {\n return { title: \"\", description: \"\", image: \"\", favicon: \"\", src: null }\n }\n\n override async getAssetFromFile(): Promise<BookmarkAsset | null> {\n return null\n }\n}\n\n/**\n * The built-in asset utils, in registration order.\n *\n * Order matters for MIME-type lookup — the first util that claims a type wins —\n * which is why images come before videos: the two lists are disjoint today, but\n * a container format claimed by both should read as an image.\n */\nexport const defaultAssetUtils = [ImageAssetUtil, VideoAssetUtil, BookmarkAssetUtil]\n","/**\n * The flagship's configuration seams, under the names they are documented by.\n *\n * Nothing here has behaviour. Each entry is the shape an app fills in — the\n * geo table it may extend, the asset urls it may self-host, the options a\n * custom shape util resolves its display values through — kept in one file so\n * \"what can I configure\" is one import rather than a hunt through the barrel.\n */\n\nimport type { TLDefaultDisplayValues, TLEditorAssetUrls, TLUiAssetUrls, ShapeUtilOptions, UnknownShape } from \"@mocanvas/editor\"\nimport { DEFAULT_GEO_TYPE_DEFINITIONS, type GeoTypeDefinition } from \"./shapes/geo-types\"\n\n/**\n * A shape util's options, including how it resolves its style props into the\n * concrete values it paints with.\n *\n * The second type argument is the util's own display values: a util that only\n * paints the shared set leaves it at {@link TLDefaultDisplayValues}, and one\n * that adds its own — a note's body size, a label's padding — names its own\n * interface here and gets it back from `getDisplayValues`.\n */\nexport interface ShapeOptionsWithDisplayValues<T extends UnknownShape = UnknownShape, D extends object = TLDefaultDisplayValues>\n extends ShapeUtilOptions<T, D> {}\n\n/**\n * The built-in geo forms, keyed by their `geo` prop value.\n *\n * The table `GeoShapeUtil.configure({ customGeoTypes })` merges over: an entry\n * with a key that is already here replaces that form, and a new key adds one.\n */\nexport const defaultGeoTypeDefinitions: Readonly<Record<string, GeoTypeDefinition>> = DEFAULT_GEO_TYPE_DEFINITIONS\n\n/**\n * A partial override of the self-hosted asset urls, as an app supplies one.\n *\n * Two levels deep, because that is how the map is shaped: an override that\n * names one icon should not have to restate every other icon, and one that\n * names icons should not have to restate the fonts.\n */\nexport type TLUiAssetUrlOverrides = {\n [K in keyof TLUiAssetUrls]?: Readonly<Record<string, string>>\n}\n\n/**\n * The editor's default asset urls: none.\n *\n * mocanvas serves nothing from a CDN. Its icons are inline SVG, it ships no\n * translation bundles, and every built-in font face names a family that is\n * already on the machine — so the map an app would override is empty rather\n * than pointing somewhere. The *mechanism* is the point (`assetUrls` on the\n * component, `useAssetUrls()` below it); an app that self-hosts fills this in,\n * and one that does not never loads anything over the network.\n */\nexport const defaultEditorAssetUrls: TLEditorAssetUrls = Object.freeze({})\n","/**\n * The two frame operations that are not \"move it\" or \"resize it\".\n *\n * Both are exported rather than living inside a menu item because both are\n * things an app scripts: laying out a board programmatically, or flattening a\n * template's frames before an export.\n */\n\nimport type { Editor, ShapeId } from \"@mocanvas/editor\"\n\n/** Default breathing room {@link fitFrameToContent} leaves around the content. */\nconst DEFAULT_FRAME_PADDING = 32\n\n/**\n * Resize a frame — or any frame-like container — so it fits its children,\n * with `padding` around them.\n *\n * The frame's children keep their page positions: the frame moves and resizes\n * around them rather than the other way round, so fitting a frame never\n * disturbs the drawing inside it. A frame with no children is left alone,\n * because shrinking it to nothing would make it unclickable.\n */\nexport function fitFrameToContent(editor: Editor, id: ShapeId, opts: { padding?: number } = {}): void {\n const frame = editor.getShape(id)\n if (!frame || !editor.isShapeFrameLike(frame)) return\n\n const childIds = editor.getSortedChildIdsForParent(id)\n if (childIds.length === 0) return\n\n const bounds = editor.getShapesPageBounds([...childIds])\n if (!bounds) return\n\n const padding = opts.padding ?? DEFAULT_FRAME_PADDING\n const frameTransform = editor.getShapePageTransform(id)\n if (!frameTransform) return\n\n // Where the frame's own origin has to move to, in its parent's space.\n const nextPageX = bounds.minX - padding\n const nextPageY = bounds.minY - padding\n const dx = nextPageX - frameTransform.e\n const dy = nextPageY - frameTransform.f\n\n editor.markHistoryStoppingPoint(\"fit frame to content\")\n editor.run(() => {\n editor.updateShape({\n id,\n type: frame.type,\n x: frame.x + dx,\n y: frame.y + dy,\n props: { w: bounds.w + padding * 2, h: bounds.h + padding * 2 },\n } as never)\n // The children are positioned relative to the frame, so moving the frame\n // would drag them along; shifting them back by the same amount is what\n // keeps them where they were on the page.\n if (dx !== 0 || dy !== 0) {\n editor.updateShapes(\n childIds.map((childId) => {\n const child = editor.getShape(childId)!\n return { id: childId, type: child.type, x: child.x - dx, y: child.y - dy }\n }) as never,\n )\n }\n })\n}\n\n/**\n * Remove the frames among `ids`, keeping what was inside them.\n *\n * The children are reparented to the frame's own parent first and then the\n * frame is deleted, so \"remove frame\" un-groups rather than destroys — which is\n * the only reading that makes it safe to reach for. Ids that are not frames are\n * ignored, so passing the whole selection is fine.\n */\nexport function removeFrame(editor: Editor, ids: readonly ShapeId[]): void {\n const frames = ids\n .map((id) => editor.getShape(id))\n .filter((shape): shape is NonNullable<typeof shape> => shape !== undefined && editor.isShapeFrameLike(shape))\n if (frames.length === 0) return\n\n editor.markHistoryStoppingPoint(\"remove frame\")\n editor.run(() => {\n for (const frame of frames) {\n const childIds = editor.getSortedChildIdsForParent(frame.id)\n if (childIds.length > 0) {\n editor.reparentShapes([...childIds], frame.parentId)\n }\n }\n editor.deleteShapes(frames.map((frame) => frame.id))\n })\n}\n","/**\n * The two questions a tool asks on a pointer down: what did I hit, and where\n * should what I just made end up.\n *\n * Both are exported because a custom tool needs to answer them the same way the\n * built-in ones do — a select tool that hit-tests differently from the eraser\n * is a tool that disagrees with the canvas about what the user clicked.\n */\n\nimport { Vec, type Editor, type ShapeId, type UnknownShape, type VecLike } from \"@mocanvas/editor\"\n\n/**\n * The shape under the pointer, as a click should resolve it.\n *\n * Not the same question as `editor.getShapeAtPoint`, which answers about\n * geometry. This one answers about *intent*, and differs in three ways that\n * each come from how a click reads to a person:\n *\n * - a filled shape is hit anywhere inside it, an unfilled one only on its edge,\n * because clicking through the middle of an outline is how you select what is\n * behind it;\n * - a locked shape is not hit at all;\n * - a frame is hit on its edge and its heading, not across its interior, so a\n * click inside a frame reaches what is in the frame.\n *\n * `hitLabels` widens it to count a shape's text label as part of the shape,\n * which is what a double-click-to-edit needs.\n */\nexport function getHitShapeOnCanvasPointerDown(editor: Editor, hitLabels = false): UnknownShape | undefined {\n const point = editor.inputs.currentPagePoint\n const margin = editor.getHitTestMargin() / editor.getZoomLevel()\n\n // Filled shapes and labels first, at zero margin: something the pointer is\n // actually inside beats something it is merely near.\n const inside = editor.getShapeAtPoint(point, {\n hitInside: true,\n hitFrameInside: false,\n hitLocked: false,\n margin: 0,\n filter: (shape) => (hitLabels ? true : !isLabelOnly(editor, shape)),\n })\n if (inside) return inside\n\n // Then anything whose outline is within the usual tolerance.\n return editor.getShapeAtPoint(point, { hitInside: false, hitFrameInside: false, hitLocked: false, margin })\n}\n\n/** Whether a shape's only hittable geometry is its label. */\nfunction isLabelOnly(editor: Editor, shape: UnknownShape): boolean {\n const geometry = editor.getShapeGeometry(shape)\n return geometry.isLabel === true\n}\n\n/**\n * Move the selection so its centre sits at `position`.\n *\n * The last step of \"create this shape where I dropped it\": a tool creates the\n * shape at whatever origin is convenient, then centres the result. Doing it as\n * a translation of the finished selection rather than as an offset at creation\n * time means it works the same for one shape and for twenty.\n */\nexport function centerSelectionAroundPoint(editor: Editor, position: VecLike): void {\n const bounds = editor.getSelectionPageBounds()\n if (!bounds) return\n const delta = Vec.Sub(position, bounds.center)\n if (delta.x === 0 && delta.y === 0) return\n const ids: ShapeId[] = editor.getSelectedShapeIds()\n editor.nudgeShapes(ids, delta)\n}\n","/**\n * Dragging a tool off the toolbar to place a shape.\n *\n * The gesture is worth supporting because it is how a first-time user\n * discovers that the toolbar makes things: pressing a tool and dragging onto\n * the canvas puts the shape exactly where the finger let go, with no second\n * click. Everything about it is the same for every tool except *what* gets\n * created, which is why that is the one thing the caller supplies.\n */\n\nimport { createShapeId, type Editor, type EventInfo, type PointerEventInfo, type ShapeId } from \"@mocanvas/editor\"\nimport { centerSelectionAroundPoint } from \"./pointer\"\n\n/** What {@link onDragFromToolbarToCreateShape} needs from the toolbar button. */\nexport interface OnDragFromToolbarToCreateShapesOpts {\n /**\n * Create the shape being dragged, under this id.\n *\n * Position is not passed in: the shape is created wherever the util's\n * defaults put it and then centred on the drop point, so a caller only has to\n * know what it is making, not where.\n */\n createShape(id: ShapeId): void\n /** The toolbar tool to keep highlighted while the drag is in flight. */\n maskedToolId?: string\n /** Called once the shape is placed, for a tool that wants to start editing it. */\n onDragEnd?(id: ShapeId): void\n}\n\n/**\n * Create a shape at the end of a drag that started on the toolbar.\n *\n * The tool id stays masked for the length of the gesture so the toolbar keeps\n * showing the button the drag came from rather than jumping to `select` the\n * moment the shape exists. The mask is lifted on the next pointer-up —\n * including a cancelled gesture, which still ends in one — so a released drag\n * can never leave the toolbar stuck on a tool the editor is not in.\n */\nexport function onDragFromToolbarToCreateShape(editor: Editor, _info: PointerEventInfo, opts: OnDragFromToolbarToCreateShapesOpts): void {\n const id = createShapeId()\n\n editor.markHistoryStoppingPoint(\"create shape from toolbar\")\n editor.run(() => {\n opts.createShape(id)\n if (!editor.getShape(id)) return\n editor.setSelectedShapes([id])\n // Where the pointer is *now*, not where the press started: the drop point\n // is the whole point of the gesture.\n centerSelectionAroundPoint(editor, editor.inputs.currentPagePoint)\n })\n\n if (!editor.getShape(id)) return\n\n if (opts.maskedToolId !== undefined) {\n const tool = editor.getCurrentTool()\n tool?.setCurrentToolIdMask(opts.maskedToolId)\n const off = editor.on(\"event\", (event: EventInfo) => {\n if (event.type !== \"pointer\" || event.name !== \"pointer_up\") return\n tool?.setCurrentToolIdMask(undefined)\n off()\n })\n }\n\n opts.onDragEnd?.(id)\n}\n","/**\n * The store side effects the flagship installs that the bare editor does not.\n *\n * A side effect here is bookkeeping that has to happen however the store was\n * changed — by a tool, by an undo, by a remote peer, or by an app calling\n * `createShapes` directly. Anything that only needs to happen when *this* user\n * did something belongs in a tool instead; putting it here would make it fire\n * on a collaborator's edit too.\n *\n * `<Mocanvas>` calls this on mount. An app assembling the editor from\n * `MocanvasEditor` and the defaults calls it itself, and disposes it when the\n * editor goes away.\n */\n\nimport type { Editor, UnknownShape } from \"@mocanvas/editor\"\n\n/**\n * Install the default side effects and return a function that removes them.\n *\n * Safe to call more than once on one editor — each call installs its own\n * handlers and its own disposer — though there is rarely a reason to.\n */\nexport function registerDefaultSideEffects(editor: Editor): () => void {\n const disposers: (() => void)[] = []\n\n // An embed's aspect ratio is a property of the *service*, not of the shape,\n // so it can only be known once the shape has a url. Applying it after the\n // fact rather than at creation means a shape pasted from another document —\n // where no tool ran — is sized correctly too.\n disposers.push(\n editor.sideEffects.registerAfterCreateHandler(\"shape\", (shape: UnknownShape) => {\n if (shape.type !== \"embed\") return\n const util = editor.getShapeUtil(shape) as { resolveAspectRatio?: (shape: UnknownShape) => number | undefined }\n const ratio = util.resolveAspectRatio?.(shape)\n if (!ratio || !Number.isFinite(ratio) || ratio <= 0) return\n const props = shape.props as { w?: number; h?: number }\n if (typeof props.w !== \"number\" || typeof props.h !== \"number\") return\n const nextHeight = Math.round(props.w / ratio)\n if (nextHeight === props.h) return\n editor.updateShape({ id: shape.id, type: shape.type, props: { h: nextHeight } } as never)\n }),\n )\n\n // A shape whose asset nothing else references leaves that asset orphaned in\n // the document, where it costs whatever the file weighs on every save. The\n // check is on delete rather than on a sweep because a sweep would have to\n // walk every shape on every page.\n disposers.push(\n editor.sideEffects.registerAfterDeleteHandler(\"shape\", (shape: UnknownShape) => {\n const assetId = (shape.props as { assetId?: string | null }).assetId\n if (!assetId) return\n const stillUsed = editor.getCurrentPageShapes().some((other) => (other.props as { assetId?: string | null }).assetId === assetId)\n if (stillUsed) return\n // Deleting the asset is deliberately *not* done here: an undo of the\n // shape deletion would have nothing to point at, and an asset is small\n // compared to the surprise of losing an image on redo. What is released\n // is the in-flight upload preview, which nothing can undo into.\n const releasePreview = (editor as { clearTemporaryAssetPreview?: (id: string) => void }).clearTemporaryAssetPreview\n releasePreview?.call(editor, assetId)\n }),\n )\n\n return () => {\n for (const dispose of disposers) dispose()\n }\n}\n","/**\n * The zoom tool: click to zoom in, alt-click to zoom out, drag a box to zoom to\n * it.\n *\n * It remembers the tool it was entered from and returns there when it is done,\n * because zooming is almost always an interruption of something else — you\n * zoom in to place a shape precisely, not to stay zoomed in.\n */\n\nimport { Box, StateNode, Vec, type PointerEventInfo, type StateNodeConstructor } from \"@mocanvas/editor\"\n\n/** How far a single click zooms, as a multiple of the current zoom. */\nconst CLICK_ZOOM_FACTOR = 2\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"zoom-in\", rotation: 0 } })\n }\n\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button !== 0) return\n this.parent!.transition(\"pointing\", info)\n }\n\n override onKeyDown(): void {\n // Alt flips the cursor while it is held, so the modifier is discoverable\n // before the click rather than only after it.\n this.editor.updateInstanceState({ cursor: { type: this.editor.inputs.altKey ? \"zoom-out\" : \"zoom-in\", rotation: 0 } })\n }\n\n override onKeyUp(): void {\n this.editor.updateInstanceState({ cursor: { type: this.editor.inputs.altKey ? \"zoom-out\" : \"zoom-in\", rotation: 0 } })\n }\n\n override onCancel(): void {\n ;(this.parent as ZoomTool | null)?.returnToOriginatingTool()\n }\n}\n\nclass Pointing extends StateNode {\n static override id = \"pointing\"\n\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) this.parent!.transition(\"zoom_brushing\")\n }\n\n override onPointerUp(): void {\n // A click, not a drag: zoom about the point that was clicked, so what was\n // under the cursor stays under the cursor.\n const point = this.editor.inputs.currentScreenPoint\n const zoom = this.editor.getZoomLevel()\n const next = this.editor.inputs.altKey ? zoom / CLICK_ZOOM_FACTOR : zoom * CLICK_ZOOM_FACTOR\n this.editor.zoomToPointAt(point, next, { animation: { duration: this.editor.options.animationMediumMs } })\n ;(this.parent as ZoomTool | null)?.returnToOriginatingTool()\n }\n\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass ZoomBrushing extends StateNode {\n static override id = \"zoom_brushing\"\n\n override onPointerMove(): void {\n this.editor.updateInstanceState({ zoomBrush: this.brush() })\n }\n\n override onPointerUp(): void {\n const brush = this.brush()\n this.editor.updateInstanceState({ zoomBrush: null })\n // A degenerate box is a click that wandered a pixel; zooming to it would\n // slam the camera to the maximum.\n if (brush.w > 4 && brush.h > 4) {\n this.editor.zoomToBounds(brush, { animation: { duration: this.editor.options.animationMediumMs } })\n }\n ;(this.parent as ZoomTool | null)?.returnToOriginatingTool()\n }\n\n override onCancel(): void {\n this.editor.updateInstanceState({ zoomBrush: null })\n this.parent!.transition(\"idle\")\n }\n\n override onExit(): void {\n this.editor.updateInstanceState({ zoomBrush: null })\n }\n\n /** The dragged box, in page space. */\n private brush(): Box {\n const { originPagePoint, currentPagePoint } = this.editor.inputs\n return Box.FromPoints([Vec.From(originPagePoint), Vec.From(currentPagePoint)])\n }\n}\n\n/** Click, alt-click or drag a box to move the camera. */\nexport class ZoomTool extends StateNode {\n static override id = \"zoom\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Pointing, ZoomBrushing]\n\n /** The tool the user was in when they reached for zoom, if any. */\n info: { onInteractionEnd?: string } = {}\n\n override onEnter(info: { onInteractionEnd?: string } = {}): void {\n this.info = info\n // Zoom is a transient tool; showing it as the active toolbar button would\n // suggest the user has switched tools, which they have not.\n this.setCurrentToolIdMask(info.onInteractionEnd)\n }\n\n override onExit(): void {\n this.setCurrentToolIdMask(undefined)\n this.editor.updateInstanceState({ zoomBrush: null })\n }\n\n /** Go back to whatever tool the user was in, or to select. */\n returnToOriginatingTool(): void {\n this.editor.setCurrentTool(this.info.onInteractionEnd ?? \"select\")\n }\n}\n","/**\n * The typefaces the built-in shapes draw with, and the two seams around them:\n * loading one into a document, and deciding which faces a rich-text document\n * needs.\n *\n * The face *table* lives in the editor package (`DefaultFontFaces`), because\n * the canvas has to measure text with or without the flagship. What lives here\n * is what the flagship adds on top: the flattened list a preloader iterates,\n * the loader itself, and the default rich-text font visitor.\n *\n * mocanvas ships no font files. Every built-in face names a family already on\n * the machine, so a board renders identically with nothing loaded; an app that\n * wants real webfonts registers its own {@link TLTypeFace}s through\n * {@link preloadFont} and replaces the theme's stacks.\n */\n\nimport { DefaultFontFaces, type TLFontFace } from \"@mocanvas/editor\"\n\n/**\n * The four faces of one family: upright and italic, each normal and bold.\n *\n * Four rather than a weight axis because that is what a label can actually ask\n * for — a rich-text mark is bold or it is not — and because a face has to be\n * loadable individually.\n */\nexport interface TLDefaultFont {\n normal: { normal: TLFontFace; bold: TLFontFace }\n italic: { normal: TLFontFace; bold: TLFontFace }\n}\n\n/** The built-in families, keyed by the `font-family` a shape's `font` prop resolves to. */\nexport interface TLDefaultFonts {\n tldraw_draw: TLDefaultFont\n tldraw_mono: TLDefaultFont\n tldraw_sans: TLDefaultFont\n tldraw_serif: TLDefaultFont\n}\n\n/**\n * A font file to load, as {@link preloadFont} takes it.\n *\n * Distinct from {@link TLFontFace}, which carries a ready-made CSS `src`\n * descriptor: this one names a URL and a format and lets the loader build the\n * descriptor, which is what an app that just wants to point at a `.woff2`\n * needs.\n */\nexport interface TLTypeFace {\n /** Where the font file is. */\n url: string\n /** `font-display` descriptor. */\n display?: FontDisplay\n /** `font-feature-settings` descriptor. */\n featureSettings?: string\n /** Font format hint, e.g. `\"woff2\"`. Appended to the `src` descriptor when given. */\n format?: string\n /** `font-stretch` descriptor. */\n stretch?: string\n /** `font-style` descriptor. */\n style?: string\n /** `unicode-range` descriptor. */\n unicodeRange?: string\n /** `font-variant` descriptor. */\n variant?: string\n /** `font-weight` descriptor. */\n weight?: string\n}\n\n/** The built-in families, as {@link TLDefaultFonts}. */\nexport const defaultFonts = DefaultFontFaces as unknown as TLDefaultFonts\n\n/**\n * Every built-in face as a flat list.\n *\n * The form a preloader wants: \"load everything the default shapes might draw\n * with\" is one `Promise.all` over this, where walking the nested table would be\n * four loops and an ordering question.\n */\nexport const allDefaultFontFaces: readonly TLFontFace[] = Object.values(DefaultFontFaces).flatMap((family) =>\n Object.values(family).flatMap((byWeight) => Object.values(byWeight)),\n)\n\n/**\n * Load a font into a document and register it under `id`.\n *\n * Resolves once the file is available for layout, so a caller can render text\n * knowing it will not reflow underneath. Where the CSS Font Loading API is\n * missing — a server render, a test environment — it rejects rather than\n * pretending: a caller that wants \"load if you can\" should catch, and one that\n * is measuring text needs to know it did not happen.\n */\nexport async function preloadFont(id: string, font: TLTypeFace, targetDocument?: Document): Promise<FontFace> {\n const doc = targetDocument ?? (typeof document === \"undefined\" ? undefined : document)\n if (!doc || typeof FontFace === \"undefined\") {\n throw new Error(`mocanvas: cannot preload font \"${id}\" — this environment has no CSS Font Loading API.`)\n }\n const source = font.format ? `url(${JSON.stringify(font.url)}) format(${JSON.stringify(font.format)})` : `url(${JSON.stringify(font.url)})`\n const descriptors: FontFaceDescriptors = {}\n if (font.display !== undefined) descriptors.display = font.display\n if (font.featureSettings !== undefined) descriptors.featureSettings = font.featureSettings\n if (font.stretch !== undefined) descriptors.stretch = font.stretch\n if (font.style !== undefined) descriptors.style = font.style\n if (font.unicodeRange !== undefined) descriptors.unicodeRange = font.unicodeRange\n if (font.variant !== undefined) (descriptors as { variant?: string }).variant = font.variant\n if (font.weight !== undefined) descriptors.weight = font.weight\n\n const face = new FontFace(id, source, descriptors)\n const loaded = await face.load()\n doc.fonts.add(loaded)\n return loaded\n}\n\n/**\n * The font a rich-text node is drawn in, carried down the document tree.\n *\n * A visitor gets its parent's state, may change it, and returns what its own\n * children should inherit — which is how a `<strong>` inside a paragraph ends\n * up bold without the paragraph knowing anything about it.\n *\n * SEMANTICS-ASSUMED: the documented spelling is `@tldraw/editor`'s\n * `RichTextFontVisitorState`, which mocanvas does not export yet. The three\n * fields below are the ones the documented usage passes\n * (`{ family: \"tldraw_draw\", weight: \"normal\", style: \"normal\" }`), so the two\n * are structurally the same object.\n */\nexport interface RichTextFontState {\n family: string\n weight: string\n style: string\n}\n\n/** The subset of a ProseMirror node this visitor reads. Structural, so a real TipTap node fits. */\ninterface VisitedNode {\n type?: { name?: string } | string\n marks?: readonly { type?: { name?: string } | string }[]\n}\n\nfunction nameOf(value: { name?: string } | string | undefined): string {\n return typeof value === \"string\" ? value : (value?.name ?? \"\")\n}\n\nconst BOLD_MARKS = new Set([\"bold\", \"strong\"])\nconst ITALIC_MARKS = new Set([\"italic\", \"em\"])\nconst CODE_MARKS = new Set([\"code\", \"codeBlock\"])\n\n/**\n * The built-in rich-text font visitor: work out which face a node needs,\n * register it, and pass the resulting state to the node's children.\n *\n * Bold and italic marks switch weight and style; a code mark switches the whole\n * family to the monospace one, because that is what the mark means. An app that\n * adds a mark of its own wraps this — handle the mark, then delegate — rather\n * than reimplementing the standard cases.\n */\nexport function defaultAddFontsFromNode(\n node: Node | VisitedNode,\n state: RichTextFontState,\n addFont: (font: TLFontFace) => void,\n): RichTextFontState {\n const visited = node as VisitedNode\n let next = state\n for (const mark of visited.marks ?? []) {\n const name = nameOf(mark.type)\n if (BOLD_MARKS.has(name)) next = { ...next, weight: \"bold\" }\n else if (ITALIC_MARKS.has(name)) next = { ...next, style: \"italic\" }\n else if (CODE_MARKS.has(name)) next = { ...next, family: \"tldraw_mono\" }\n }\n if (CODE_MARKS.has(nameOf(visited.type))) next = { ...next, family: \"tldraw_mono\" }\n\n const face = DefaultFontFaces[next.family]?.[next.style]?.[next.weight]\n if (face) addFont(face)\n return next\n}\n","/**\n * The command list a {@link PathBuilder} accumulates, and the arc maths that\n * turns an SVG-style elliptical arc into something the rest of the pipeline can\n * draw.\n *\n * A path is kept as commands rather than as a `d` string or a vertex list\n * because every consumer wants a different projection of it: the indicator\n * layer wants the engine's flat word stream, an export wants a `d`, a hit test\n * wants vertices, and the draw style wants to jitter the *original* points\n * before any of that happens. Keeping the commands means each projection is\n * generated once from the same source rather than parsed back out of another\n * projection.\n */\n\nimport type { Geometry2dOptions, VecLike } from \"@mocanvas/editor\"\n\n/**\n * How a dashed run starts or ends.\n *\n * `\"none\"` leaves the terminal alone, `\"outset\"` pushes it half a dash out so a\n * corner reads as solid, and `\"skip\"` drops the terminal dash entirely.\n *\n * SEMANTICS-ASSUMED: the documented spelling of this is\n * `@tldraw/editor`'s `PerfectDashTerminal`, which mocanvas does not export yet\n * (it belongs to the editor package's dash helpers). The three names above are\n * the terminal treatments a dash generator has to distinguish; when the editor\n * publishes its own alias the two are structurally the same string union.\n */\nexport type PathDashTerminal = \"none\" | \"outset\" | \"skip\"\n\n/** Per-command settings shared by every command that draws a line. */\nexport interface PathBuilderCommandOpts {\n /**\n * When converting to a dash- or dot-style line, whether this segment is\n * merged with the previous one when the dash pattern is measured. Merging\n * keeps a dash running across a corner instead of restarting at it.\n */\n mergeWithPrevious?: boolean\n /** When converting to a draw-style line, how far this point may wander from where it was placed. */\n offset?: number\n /** When converting to a draw-style line, how much to round the end of this line. */\n roundness?: number\n}\n\n/**\n * Settings for a command that *starts* a run — `moveTo`, and the two static\n * builders. Beyond {@link PathBuilderCommandOpts} it decides what geometry the\n * run contributes and how its dashes terminate.\n */\nexport interface PathBuilderLineOpts extends PathBuilderCommandOpts {\n /** Terminal treatment for the last dash of the run. */\n dashEnd?: PathDashTerminal\n /** Terminal treatment for the first dash of the run. */\n dashStart?: PathDashTerminal\n /**\n * The geometry this run contributes, or `false` for a run that is painted\n * but never hit-tested. `isClosed` is not settable: whether a run is closed\n * is decided by whether it ends in `close()`.\n */\n geometry?: false | Omit<Geometry2dOptions, \"isClosed\">\n}\n\n/** A `moveTo`: lifts the pen and starts a new run. */\nexport interface PathMoveCommand {\n type: \"move\"\n x: number\n y: number\n opts: PathBuilderLineOpts\n}\n\n/** A straight segment to `(x, y)`. */\nexport interface PathLineCommand {\n type: \"line\"\n x: number\n y: number\n opts: PathBuilderCommandOpts\n}\n\n/** A cubic bézier to `(x, y)` through two control points. */\nexport interface PathCubicCommand {\n type: \"cubic\"\n x: number\n y: number\n cp1X: number\n cp1Y: number\n cp2X: number\n cp2Y: number\n opts: PathBuilderCommandOpts\n}\n\n/** An SVG-style elliptical arc to `(x, y)`. */\nexport interface PathArcCommand {\n type: \"arc\"\n rx: number\n ry: number\n largeArcFlag: boolean\n sweepFlag: boolean\n xAxisRotationRadians: number\n x: number\n y: number\n opts: PathBuilderCommandOpts\n}\n\n/** Closes the run in progress, joining its end back to its `moveTo`. */\nexport interface PathCloseCommand {\n type: \"close\"\n}\n\n/** One entry of a {@link PathBuilder}'s command list. */\nexport type PathBuilderCommand = PathMoveCommand | PathLineCommand | PathCubicCommand | PathArcCommand | PathCloseCommand\n\n/** A cubic segment in the form every projection consumes: start, two controls, end. */\nexport interface CubicSegment {\n start: VecLike\n cp1: VecLike\n cp2: VecLike\n end: VecLike\n}\n\n/**\n * The cubic béziers an elliptical arc is drawn as.\n *\n * SVG states an arc by where it ends and how it bulges (`rx`, `ry`, the\n * rotation, and the two flags); everything that draws one — a `d` string aside\n * — needs its centre, its start angle and its sweep. This is the endpoint →\n * centre conversion from the SVG path specification's implementation notes,\n * followed by the standard split into at most one cubic per quarter turn.\n *\n * Degenerate input (a zero radius, or an arc that ends where it starts) yields\n * a single straight segment, which is what the specification asks for.\n */\nexport function arcToCubicSegments(from: VecLike, arc: PathArcCommand): CubicSegment[] {\n const x1 = from.x\n const y1 = from.y\n const x2 = arc.x\n const y2 = arc.y\n if (x1 === x2 && y1 === y2) return []\n\n let rx = Math.abs(arc.rx)\n let ry = Math.abs(arc.ry)\n if (rx === 0 || ry === 0) return [straight(from, { x: x2, y: y2 })]\n\n const phi = arc.xAxisRotationRadians\n const cosPhi = Math.cos(phi)\n const sinPhi = Math.sin(phi)\n\n // Step 1: the endpoints in the ellipse's own frame, centred between them.\n const dx2 = (x1 - x2) / 2\n const dy2 = (y1 - y2) / 2\n const x1p = cosPhi * dx2 + sinPhi * dy2\n const y1p = -sinPhi * dx2 + cosPhi * dy2\n\n // Step 2: grow radii that are too small to reach across the chord.\n const lambda = (x1p * x1p) / (rx * rx) + (y1p * y1p) / (ry * ry)\n if (lambda > 1) {\n const scale = Math.sqrt(lambda)\n rx *= scale\n ry *= scale\n }\n\n // Step 3: the centre, in that same frame and then back in path space.\n const rxSq = rx * rx\n const rySq = ry * ry\n const numerator = Math.max(0, rxSq * rySq - rxSq * y1p * y1p - rySq * x1p * x1p)\n const denominator = rxSq * y1p * y1p + rySq * x1p * x1p\n const coefficient = (arc.largeArcFlag === arc.sweepFlag ? -1 : 1) * Math.sqrt(denominator === 0 ? 0 : numerator / denominator)\n const cxp = (coefficient * (rx * y1p)) / ry\n const cyp = (coefficient * -(ry * x1p)) / rx\n const cx = cosPhi * cxp - sinPhi * cyp + (x1 + x2) / 2\n const cy = sinPhi * cxp + cosPhi * cyp + (y1 + y2) / 2\n\n // Step 4: start angle and swept angle.\n const startAngle = angleBetween(1, 0, (x1p - cxp) / rx, (y1p - cyp) / ry)\n let deltaAngle = angleBetween((x1p - cxp) / rx, (y1p - cyp) / ry, (-x1p - cxp) / rx, (-y1p - cyp) / ry)\n if (!arc.sweepFlag && deltaAngle > 0) deltaAngle -= Math.PI * 2\n else if (arc.sweepFlag && deltaAngle < 0) deltaAngle += Math.PI * 2\n\n // Step 5: one cubic per quarter turn keeps the approximation error invisible.\n const count = Math.max(1, Math.ceil(Math.abs(deltaAngle) / (Math.PI / 2)))\n const step = deltaAngle / count\n // The magic constant that makes a cubic follow a circular arc of `step`.\n const alpha = (4 / 3) * Math.tan(step / 4)\n\n const segments: CubicSegment[] = []\n let theta = startAngle\n let current: VecLike = { x: x1, y: y1 }\n for (let i = 0; i < count; i++) {\n const next = theta + step\n const end = onEllipse(cx, cy, rx, ry, cosPhi, sinPhi, next)\n const d1 = derivativeOnEllipse(rx, ry, cosPhi, sinPhi, theta)\n const d2 = derivativeOnEllipse(rx, ry, cosPhi, sinPhi, next)\n segments.push({\n start: current,\n cp1: { x: current.x + alpha * d1.x, y: current.y + alpha * d1.y },\n cp2: { x: end.x - alpha * d2.x, y: end.y - alpha * d2.y },\n end,\n })\n current = end\n theta = next\n }\n // Land exactly on the requested endpoint; the trigonometry above lands within\n // floating-point noise of it, and a path that does not close exactly reads as\n // an open shape to every fill rule downstream.\n const last = segments[segments.length - 1]\n if (last) last.end = { x: x2, y: y2 }\n return segments\n}\n\nfunction straight(from: VecLike, to: VecLike): CubicSegment {\n return { start: from, cp1: from, cp2: to, end: to }\n}\n\nfunction onEllipse(cx: number, cy: number, rx: number, ry: number, cosPhi: number, sinPhi: number, theta: number): VecLike {\n const x = rx * Math.cos(theta)\n const y = ry * Math.sin(theta)\n return { x: cosPhi * x - sinPhi * y + cx, y: sinPhi * x + cosPhi * y + cy }\n}\n\nfunction derivativeOnEllipse(rx: number, ry: number, cosPhi: number, sinPhi: number, theta: number): VecLike {\n const x = -rx * Math.sin(theta)\n const y = ry * Math.cos(theta)\n return { x: cosPhi * x - sinPhi * y, y: sinPhi * x + cosPhi * y }\n}\n\n/** The signed angle from vector `u` to vector `v`, in `(-PI, PI]`. */\nfunction angleBetween(ux: number, uy: number, vx: number, vy: number): number {\n const dot = ux * vx + uy * vy\n const len = Math.sqrt(ux * ux + uy * uy) * Math.sqrt(vx * vx + vy * vy)\n if (len === 0) return 0\n const sign = ux * vy - uy * vx < 0 ? -1 : 1\n return sign * Math.acos(Math.min(1, Math.max(-1, dot / len)))\n}\n\n/** A point on a cubic bézier at `t`, by de Casteljau. */\nexport function cubicPointAt(segment: CubicSegment, t: number): VecLike {\n const mt = 1 - t\n const a = mt * mt * mt\n const b = 3 * mt * mt * t\n const c = 3 * mt * t * t\n const d = t * t * t\n return {\n x: a * segment.start.x + b * segment.cp1.x + c * segment.cp2.x + d * segment.end.x,\n y: a * segment.start.y + b * segment.cp1.y + c * segment.cp2.y + d * segment.end.y,\n }\n}\n\n/**\n * How many straight pieces a cubic should be flattened into.\n *\n * Scaled by the control polygon's length so a long sweep gets more pieces than\n * a short one, and clamped so a pathological curve cannot generate thousands of\n * vertices for a hit test.\n */\nexport function cubicSubdivisions(segment: CubicSegment): number {\n const d =\n dist(segment.start, segment.cp1) + dist(segment.cp1, segment.cp2) + dist(segment.cp2, segment.end)\n return Math.max(4, Math.min(64, Math.ceil(d / 8)))\n}\n\nfunction dist(a: VecLike, b: VecLike): number {\n return Math.hypot(b.x - a.x, b.y - a.y)\n}\n","/**\n * One run of a {@link PathBuilder} seen as shape geometry.\n *\n * A path built with several `moveTo`s is several runs; each becomes one of\n * these, and `PathBuilder.toGeometry()` groups them. Keeping a run's identity\n * rather than flattening the whole path to a single vertex list is what lets a\n * hit test tell \"inside the ring\" from \"inside the hole\", and lets one run be\n * filled while another is only stroked.\n */\n\nimport { Geometry2d, PATH_OP, Vec, type Geometry2dFilters, type Geometry2dOptions, type VecLike } from \"@mocanvas/editor\"\nimport { arcToCubicSegments, cubicPointAt, cubicSubdivisions, type CubicSegment, type PathBuilderCommand } from \"./commands\"\nimport type { PathBuilder } from \"./PathBuilder\"\n\n/**\n * The drawable pieces of a run: the straight and curved segments between its\n * points, in order. Shared by the vertex walk, the `d` writer and the flat\n * word stream so all three describe the same curve.\n */\nexport interface PathRunSegment {\n /** A curve carries its control points; a straight segment carries only its ends. */\n cubic: CubicSegment | null\n start: VecLike\n end: VecLike\n}\n\n/** Walk `commands[startIdx..endIdx)` into ordered segments. */\nexport function segmentsOfRun(commands: readonly PathBuilderCommand[], startIdx: number, endIdx: number): PathRunSegment[] {\n const segments: PathRunSegment[] = []\n let cursor: VecLike | null = null\n let runStart: VecLike | null = null\n for (let i = startIdx; i < endIdx && i < commands.length; i++) {\n const command = commands[i]!\n switch (command.type) {\n case \"move\":\n cursor = { x: command.x, y: command.y }\n runStart = cursor\n break\n case \"line\": {\n if (!cursor) break\n const end = { x: command.x, y: command.y }\n segments.push({ cubic: null, start: cursor, end })\n cursor = end\n break\n }\n case \"cubic\": {\n if (!cursor) break\n const end = { x: command.x, y: command.y }\n const cubic: CubicSegment = { start: cursor, cp1: { x: command.cp1X, y: command.cp1Y }, cp2: { x: command.cp2X, y: command.cp2Y }, end }\n segments.push({ cubic, start: cursor, end })\n cursor = end\n break\n }\n case \"arc\": {\n if (!cursor) break\n for (const cubic of arcToCubicSegments(cursor, command)) segments.push({ cubic, start: cubic.start, end: cubic.end })\n cursor = { x: command.x, y: command.y }\n break\n }\n case \"close\":\n // No segment is emitted: `isClosed` is what tells every consumer that\n // the last vertex joins the first, and emitting the join as well would\n // duplicate the start point in the vertex list — which would then be\n // counted twice by the area and perimeter walks.\n cursor = runStart\n break\n }\n }\n return segments\n}\n\n/** Whether `commands[startIdx..endIdx)` ends in a `close()`. */\nexport function runIsClosed(commands: readonly PathBuilderCommand[], startIdx: number, endIdx: number): boolean {\n for (let i = Math.min(endIdx, commands.length) - 1; i >= startIdx; i--) {\n const command = commands[i]!\n if (command.type === \"close\") return true\n if (command.type === \"move\") return false\n }\n return false\n}\n\n/** Flatten segments to a polyline, dropping the duplicate point between neighbours. */\nexport function segmentsToVertices(segments: readonly PathRunSegment[]): Vec[] {\n const out: Vec[] = []\n const push = (p: VecLike) => {\n const last = out[out.length - 1]\n if (last && last.x === p.x && last.y === p.y) return\n out.push(new Vec(p.x, p.y))\n }\n for (const segment of segments) {\n push(segment.start)\n if (segment.cubic) {\n const steps = cubicSubdivisions(segment.cubic)\n for (let i = 1; i < steps; i++) push(cubicPointAt(segment.cubic, i / steps))\n }\n push(segment.end)\n }\n return out\n}\n\n/** The engine's flat word stream for one run. */\nexport function segmentsToPathWords(segments: readonly PathRunSegment[], closed: boolean): number[] {\n const words: number[] = []\n const first = segments[0]\n if (!first) return words\n words.push(PATH_OP.MOVE, first.start.x, first.start.y)\n for (const segment of segments) {\n if (segment.cubic) {\n words.push(PATH_OP.CUBIC, segment.cubic.cp1.x, segment.cubic.cp1.y, segment.cubic.cp2.x, segment.cubic.cp2.y, segment.cubic.end.x, segment.cubic.end.y)\n } else {\n words.push(PATH_OP.LINE, segment.end.x, segment.end.y)\n }\n }\n if (closed) words.push(PATH_OP.CLOSE)\n return words\n}\n\n/** One run of a path, as a `Geometry2d` the editor can hit-test, snap to and export. */\nexport class PathBuilderGeometry2d extends Geometry2d {\n private readonly segmentCache: PathRunSegment[]\n\n constructor(\n readonly path: PathBuilder,\n readonly startIdx: number,\n readonly endIdx: number,\n options: Geometry2dOptions,\n ) {\n super(options)\n this.segmentCache = segmentsOfRun(path.commands, startIdx, endIdx)\n }\n\n /**\n * This run split into one geometry per segment.\n *\n * The unit an arrow terminal or a handle is placed against: a caller that\n * wants \"the third edge of the shape\" wants a segment, not the whole run.\n */\n getSegments(): Geometry2d[] {\n return this.segmentCache.map((segment) => {\n const vertices = segmentsToVertices([segment])\n return new PathSegmentGeometry2d(vertices, { isFilled: false, isClosed: false })\n })\n }\n\n override getVertices(_filters?: Geometry2dFilters): Vec[] {\n return segmentsToVertices(this.segmentCache)\n }\n\n override toPathWords(): number[] {\n return segmentsToPathWords(this.segmentCache, this.isClosed)\n }\n\n override getSvgPathData(first = true): string {\n const segments = this.segmentCache\n const head = segments[0]\n if (!head) return \"\"\n const parts = [`${first ? \"M\" : \"L\"}${head.start.x},${head.start.y}`]\n for (const segment of segments) {\n if (segment.cubic) {\n parts.push(`C${segment.cubic.cp1.x},${segment.cubic.cp1.y} ${segment.cubic.cp2.x},${segment.cubic.cp2.y} ${segment.cubic.end.x},${segment.cubic.end.y}`)\n } else {\n parts.push(`L${segment.end.x},${segment.end.y}`)\n }\n }\n if (this.isClosed) parts.push(\"Z\")\n return parts.join(\"\")\n }\n}\n\n/** A single segment of a run, handed out by {@link PathBuilderGeometry2d.getSegments}. */\nclass PathSegmentGeometry2d extends Geometry2d {\n constructor(\n private readonly points: Vec[],\n options: Geometry2dOptions,\n ) {\n super(options)\n }\n\n override getVertices(): Vec[] {\n return this.points\n }\n\n override toPathWords(): number[] {\n const words: number[] = []\n const first = this.points[0]\n if (!first) return words\n words.push(PATH_OP.MOVE, first.x, first.y)\n for (let i = 1; i < this.points.length; i++) words.push(PATH_OP.LINE, this.points[i]!.x, this.points[i]!.y)\n return words\n }\n}\n","/**\n * A chainable description of a shape's outline.\n *\n * `PathBuilder` is the authoring surface a custom geo type uses to say what it\n * looks like:\n *\n * ```ts\n * new PathBuilder()\n * .moveTo(r, 0, { geometry: { isFilled: true } })\n * .lineTo(w - r, 0)\n * .circularArcTo(r, false, true, w, r)\n * .close()\n * ```\n *\n * What makes it worth having over a raw `d` string is that one path answers\n * every question the canvas asks of an outline. `toGeometry()` gives the\n * hit-testable geometry, `toD()` the SVG attribute, `toPath2D()` something the\n * overlay layer can stroke, `toSvg()` a rendered element, and `toDrawD()` the\n * same outline redrawn with a hand-drawn wobble. All of them read the same\n * command list, so a shape cannot end up hit-testing one outline and painting\n * another.\n *\n * @see {@link PathBuilderGeometry2d} for one run of a path as geometry.\n */\n\nimport { Group2d, Mat, Vec, type Geometry2dOptions, type MatLike, type VecLike } from \"@mocanvas/editor\"\nimport type { JSX, SVGProps } from \"react\"\nimport { arcToCubicSegments, type PathBuilderCommand, type PathBuilderCommandOpts, type PathBuilderLineOpts } from \"./commands\"\nimport { PathBuilderGeometry2d, runIsClosed, segmentsOfRun, type PathRunSegment } from \"./PathBuilderGeometry2d\"\n\nexport type { PathBuilderCommand, PathBuilderCommandOpts, PathBuilderLineOpts, PathDashTerminal } from \"./commands\"\n\n/** What every rendering of a path needs, whatever its style. */\nexport interface BasePathBuilderOpts {\n /** Ignore the style and draw one solid stroke — what a tiny shape or a print export wants. */\n forceSolid?: boolean\n /** Emit only the runs that asked for a fill, dropping stroke-only runs. */\n onlyFilled?: boolean\n /** Extra attributes for the element {@link PathBuilder.toSvg} returns. */\n props?: SVGProps<SVGPathElement & SVGGElement>\n /** Stroke width, in the path's own units. Dash lengths and draw jitter scale off it. */\n strokeWidth: number\n}\n\n/** Draw the path as one continuous stroke. */\nexport interface SolidPathBuilderOpts extends BasePathBuilderOpts {\n style: \"solid\"\n}\n\n/** Do not stroke the path at all; a fill (when the run asked for one) still paints. */\nexport interface NonePathBuilderOpts extends BasePathBuilderOpts {\n style: \"none\"\n}\n\n/** Draw the path as evenly spaced dashes or dots. */\nexport interface DashedPathBuilderOpts extends BasePathBuilderOpts {\n style: \"dashed\" | \"dotted\"\n /** Terminal treatment for the last dash of each run. */\n end?: import(\"./commands\").PathDashTerminal\n /** Dash length as a multiple of the stroke width. */\n lengthRatio?: number\n /** Round the gap so a whole number of dashes fits the run exactly. */\n snap?: number\n /** Terminal treatment for the first dash of each run. */\n start?: import(\"./commands\").PathDashTerminal\n}\n\n/** The inputs {@link PathBuilder.toDrawD} needs to reproduce one hand-drawn pass. */\nexport interface DrawPathBuilderDOpts {\n /** How far a point may wander, in stroke widths. */\n offset?: number\n /** How many overlapping passes to draw; two reads as a pen gone over twice. */\n passes?: number\n /** Seeds the jitter, so the same path redraws identically between frames. */\n randomSeed: string\n /** How much to round the corners between segments. */\n roundness?: number\n}\n\n/** Draw the path with a hand-drawn wobble. */\nexport interface DrawPathBuilderOpts extends BasePathBuilderOpts, DrawPathBuilderDOpts {\n style: \"draw\"\n}\n\n/** Every way a path can be rendered, as a discriminated union on `style`. */\nexport type PathBuilderOpts = DashedPathBuilderOpts | DrawPathBuilderOpts | NonePathBuilderOpts | SolidPathBuilderOpts\n\n/** Which part of a path {@link PathBuilder.toD} should write. */\nexport interface PathBuilderToDOpts {\n /** Last command index, exclusive. Defaults to the end of the path. */\n endIdx?: number\n /** Write only the runs that asked for a fill. */\n onlyFilled?: boolean\n /** First command index. Defaults to `0`. */\n startIdx?: number\n}\n\n/** The half-open command range of one run, and whether that run is filled. */\ninterface PathRun {\n startIdx: number\n endIdx: number\n opts: PathBuilderLineOpts\n}\n\nconst DEFAULT_DASH_LENGTH_RATIO = 2\nconst DEFAULT_DOT_LENGTH_RATIO = 0.1\nconst DEFAULT_DRAW_OFFSET = 0.5\nconst DEFAULT_DRAW_PASSES = 1\n\nexport class PathBuilder {\n /** The commands recorded so far, in order. Read by {@link PathBuilderGeometry2d}. */\n readonly commands: PathBuilderCommand[] = []\n\n /**\n * A path through `points`, one straight segment at a time.\n *\n * `endOffsets` pulls both ends back along their own segment by that many\n * units — the way an arrow's shaft stops short of the shapes it binds.\n */\n static lineThroughPoints(points: VecLike[], opts: PathBuilderLineOpts & { endOffsets?: number } = {}): PathBuilder {\n const path = new PathBuilder()\n const trimmed = trimEnds(points, opts.endOffsets ?? 0)\n const head = trimmed[0]\n if (!head) return path\n path.moveTo(head.x, head.y, opts)\n for (let i = 1; i < trimmed.length; i++) path.lineTo(trimmed[i]!.x, trimmed[i]!.y, opts)\n return path\n }\n\n /**\n * A smooth path through `points`, as a Catmull-Rom spline converted to cubics.\n *\n * The curve passes *through* every point rather than being pulled towards it,\n * which is what a freehand line or a curved arrow needs: the points are\n * samples of the intended shape, not control handles.\n */\n static cubicSplineThroughPoints(points: VecLike[], opts: PathBuilderLineOpts & { endOffsets?: number } = {}): PathBuilder {\n const path = new PathBuilder()\n const p = trimEnds(points, opts.endOffsets ?? 0)\n const head = p[0]\n if (!head) return path\n path.moveTo(head.x, head.y, opts)\n if (p.length === 1) return path\n if (p.length === 2) {\n path.lineTo(p[1]!.x, p[1]!.y, opts)\n return path\n }\n for (let i = 0; i < p.length - 1; i++) {\n const p0 = p[i - 1] ?? p[i]!\n const p1 = p[i]!\n const p2 = p[i + 1]!\n const p3 = p[i + 2] ?? p2\n // Catmull-Rom → Bézier, at the uniform tension the canvas uses elsewhere.\n path.cubicBezierTo(\n p2.x,\n p2.y,\n p1.x + (p2.x - p0.x) / 6,\n p1.y + (p2.y - p0.y) / 6,\n p2.x - (p3.x - p1.x) / 6,\n p2.y - (p3.y - p1.y) / 6,\n opts,\n )\n }\n return path\n }\n\n /** Lift the pen and start a new run at `(x, y)`. */\n moveTo(x: number, y: number, opts: PathBuilderLineOpts = {}): this {\n this.commands.push({ type: \"move\", x, y, opts })\n return this\n }\n\n /** Straight segment from the cursor to `(x, y)`. */\n lineTo(x: number, y: number, opts: PathBuilderCommandOpts = {}): this {\n this.commands.push({ type: \"line\", x, y, opts })\n return this\n }\n\n /** Cubic bézier from the cursor to `(x, y)` through `cp1` and `cp2`. */\n cubicBezierTo(x: number, y: number, cp1X: number, cp1Y: number, cp2X: number, cp2Y: number, opts: PathBuilderCommandOpts = {}): this {\n this.commands.push({ type: \"cubic\", x, y, cp1X, cp1Y, cp2X, cp2Y, opts })\n return this\n }\n\n /** SVG-style elliptical arc from the cursor to `(x2, y2)`. */\n arcTo(\n rx: number,\n ry: number,\n largeArcFlag: boolean,\n sweepFlag: boolean,\n xAxisRotationRadians: number,\n x2: number,\n y2: number,\n opts: PathBuilderCommandOpts = {},\n ): this {\n this.commands.push({ type: \"arc\", rx, ry, largeArcFlag, sweepFlag, xAxisRotationRadians, x: x2, y: y2, opts })\n return this\n }\n\n /** The circular case of {@link PathBuilder.arcTo}: one radius, no rotation. */\n circularArcTo(radius: number, largeArcFlag: boolean, sweepFlag: boolean, x2: number, y2: number, opts: PathBuilderCommandOpts = {}): this {\n return this.arcTo(radius, radius, largeArcFlag, sweepFlag, 0, x2, y2, opts)\n }\n\n /** Join the current run back to where it started. */\n close(): this {\n this.commands.push({ type: \"close\" })\n return this\n }\n\n /** The runs this path is made of, as half-open command ranges. */\n getRuns(): PathRun[] {\n const runs: PathRun[] = []\n let current: PathRun | null = null\n for (let i = 0; i < this.commands.length; i++) {\n const command = this.commands[i]!\n if (command.type === \"move\") {\n if (current) runs.push(current)\n current = { startIdx: i, endIdx: i + 1, opts: command.opts }\n } else if (current) {\n current.endIdx = i + 1\n }\n }\n if (current) runs.push(current)\n return runs\n }\n\n /**\n * This path as shape geometry: one {@link PathBuilderGeometry2d} per run, or\n * a `Group2d` when there is more than one.\n *\n * A run whose `geometry` option is `false` contributes nothing — it is\n * painted but never hit.\n */\n toGeometry(): Group2d | PathBuilderGeometry2d {\n const children: PathBuilderGeometry2d[] = []\n for (const run of this.getRuns()) {\n if (run.opts.geometry === false) continue\n const geometry: Omit<Geometry2dOptions, \"isClosed\"> = run.opts.geometry ?? { isFilled: false }\n children.push(\n new PathBuilderGeometry2d(this, run.startIdx, run.endIdx, {\n ...geometry,\n isFilled: geometry.isFilled,\n isClosed: runIsClosed(this.commands, run.startIdx, run.endIdx),\n }),\n )\n }\n if (children.length === 1) return children[0]!\n return new Group2d({ children, isLabel: false })\n }\n\n /** This path as an SVG `d` attribute. */\n toD(opts: PathBuilderToDOpts = {}): string {\n const startIdx = opts.startIdx ?? 0\n const endIdx = opts.endIdx ?? this.commands.length\n const parts: string[] = []\n for (const run of this.getRuns()) {\n if (run.endIdx <= startIdx || run.startIdx >= endIdx) continue\n const geometry = run.opts.geometry\n if (opts.onlyFilled && !(geometry !== false && geometry !== undefined && geometry.isFilled)) continue\n const from = Math.max(run.startIdx, startIdx)\n const to = Math.min(run.endIdx, endIdx)\n const segments = segmentsOfRun(this.commands, from, to)\n const d = segmentsToD(segments, runIsClosed(this.commands, from, to))\n if (d) parts.push(d)\n }\n return parts.join(\" \")\n }\n\n /**\n * This path redrawn with a hand-drawn wobble.\n *\n * Every point is nudged by an amount derived from `randomSeed` and its own\n * index, so the wobble is stable across re-renders: a shape that jittered\n * differently every frame would shimmer. `passes` draws the whole outline\n * more than once with different nudges, which is what makes a stroke look\n * gone-over rather than merely crooked.\n */\n toDrawD(opts: DrawPathBuilderDOpts): string {\n const offset = opts.offset ?? DEFAULT_DRAW_OFFSET\n const passes = Math.max(1, Math.round(opts.passes ?? DEFAULT_DRAW_PASSES))\n const parts: string[] = []\n for (let pass = 0; pass < passes; pass++) {\n const random = seededRandom(`${opts.randomSeed}:${pass}`)\n for (const run of this.getRuns()) {\n const segments = segmentsOfRun(this.commands, run.startIdx, run.endIdx)\n const jittered = segments.map((segment) => jitterSegment(segment, offset, random))\n const d = segmentsToD(jittered, runIsClosed(this.commands, run.startIdx, run.endIdx))\n if (d) parts.push(d)\n }\n }\n return parts.join(\" \")\n }\n\n /**\n * This path as a `Path2D`, for a canvas or overlay that strokes it directly.\n *\n * Returns an empty `Path2D` where the constructor is unavailable (a server\n * render, a worker without the canvas API), so a caller never has to guard.\n */\n toPath2D(opts: PathBuilderOpts): Path2D {\n const d = opts.style === \"draw\" ? this.toDrawD(opts) : this.toD({ onlyFilled: opts.onlyFilled ?? false })\n if (typeof Path2D === \"undefined\") return { } as Path2D\n return new Path2D(d)\n }\n\n /**\n * This path as an SVG element, styled per `opts`, or `null` when it would\n * draw nothing.\n *\n * The dash pattern is expressed as `stroke-dasharray` rather than by cutting\n * the path into pieces: a browser measures the path's own length far more\n * accurately than a flattened polyline can, so the dashes land evenly on\n * curves.\n */\n toSvg(opts: PathBuilderOpts): JSX.Element | null {\n const d = opts.style === \"draw\" && !opts.forceSolid ? this.toDrawD(opts) : this.toD({ onlyFilled: opts.onlyFilled ?? false })\n if (!d) return null\n if (opts.style === \"none\") return <path d={d} strokeWidth={0} stroke=\"none\" {...opts.props} />\n const dash = opts.forceSolid || opts.style === \"solid\" || opts.style === \"draw\" ? undefined : dashArrayFor(opts, this)\n return <path d={d} strokeWidth={opts.strokeWidth} strokeDasharray={dash} {...opts.props} />\n }\n\n /**\n * A copy of this path with `mat` applied to every point, control points\n * included.\n *\n * Command metadata — fills, dash terminals, draw offsets, close state — is\n * carried across, so a mirrored or scaled path is still renderable and\n * hit-testable without rebuilding it from its parameters.\n *\n * An arc cannot survive an arbitrary affine map as an arc (a non-uniform\n * scale turns a circle into an ellipse at a new rotation), so arcs are\n * converted to the cubics they were going to be drawn as and those are\n * transformed instead.\n */\n transform(mat: MatLike): PathBuilder {\n const matrix = Mat.From(mat)\n const out = new PathBuilder()\n const map = (x: number, y: number): VecLike => matrix.applyToPoint({ x, y })\n let cursor: VecLike | null = null\n for (const command of this.commands) {\n switch (command.type) {\n case \"move\": {\n const p = map(command.x, command.y)\n out.commands.push({ type: \"move\", x: p.x, y: p.y, opts: command.opts })\n cursor = { x: command.x, y: command.y }\n break\n }\n case \"line\": {\n const p = map(command.x, command.y)\n out.commands.push({ type: \"line\", x: p.x, y: p.y, opts: command.opts })\n cursor = { x: command.x, y: command.y }\n break\n }\n case \"cubic\": {\n const p = map(command.x, command.y)\n const c1 = map(command.cp1X, command.cp1Y)\n const c2 = map(command.cp2X, command.cp2Y)\n out.commands.push({ type: \"cubic\", x: p.x, y: p.y, cp1X: c1.x, cp1Y: c1.y, cp2X: c2.x, cp2Y: c2.y, opts: command.opts })\n cursor = { x: command.x, y: command.y }\n break\n }\n case \"arc\": {\n if (cursor) {\n for (const cubic of arcToCubicSegments(cursor, command)) {\n const p = map(cubic.end.x, cubic.end.y)\n const c1 = map(cubic.cp1.x, cubic.cp1.y)\n const c2 = map(cubic.cp2.x, cubic.cp2.y)\n out.commands.push({ type: \"cubic\", x: p.x, y: p.y, cp1X: c1.x, cp1Y: c1.y, cp2X: c2.x, cp2Y: c2.y, opts: command.opts })\n }\n }\n cursor = { x: command.x, y: command.y }\n break\n }\n case \"close\":\n out.commands.push({ type: \"close\" })\n break\n }\n }\n return out\n }\n}\n\n/** Serialize segments to a `d`, starting with an `M` at the first segment's start. */\nfunction segmentsToD(segments: readonly PathRunSegment[], closed: boolean): string {\n const head = segments[0]\n if (!head) return \"\"\n const parts = [`M${n(head.start.x)},${n(head.start.y)}`]\n for (const segment of segments) {\n if (segment.cubic) parts.push(`C${n(segment.cubic.cp1.x)},${n(segment.cubic.cp1.y)} ${n(segment.cubic.cp2.x)},${n(segment.cubic.cp2.y)} ${n(segment.cubic.end.x)},${n(segment.cubic.end.y)}`)\n else parts.push(`L${n(segment.end.x)},${n(segment.end.y)}`)\n }\n if (closed) parts.push(\"Z\")\n return parts.join(\"\")\n}\n\nfunction n(value: number): number {\n return Math.round(value * 100) / 100\n}\n\n/** The `stroke-dasharray` for a dashed or dotted style. */\nfunction dashArrayFor(opts: DashedPathBuilderOpts, path: PathBuilder): string {\n const ratio = opts.lengthRatio ?? (opts.style === \"dotted\" ? DEFAULT_DOT_LENGTH_RATIO : DEFAULT_DASH_LENGTH_RATIO)\n const dash = Math.max(0.01, opts.strokeWidth * ratio)\n const gap = Math.max(0.01, opts.strokeWidth * (opts.style === \"dotted\" ? 2 : 2))\n if (!opts.snap) return `${n(dash)} ${n(gap)}`\n // Snapping: stretch the gap so a whole number of dash+gap periods fits the\n // run, which is what keeps a dashed rectangle's corners symmetrical.\n const length = path.toGeometry().length\n const periods = Math.max(1, Math.round(length / (dash + gap) / opts.snap) * opts.snap)\n const period = length / periods\n return `${n(dash)} ${n(Math.max(0.01, period - dash))}`\n}\n\n/** Nudge a segment's points by up to `offset` stroke widths, deterministically. */\nfunction jitterSegment(segment: PathRunSegment, offset: number, random: () => number): PathRunSegment {\n const nudge = (p: VecLike): VecLike => ({ x: p.x + (random() - 0.5) * 2 * offset, y: p.y + (random() - 0.5) * 2 * offset })\n const start = nudge(segment.start)\n const end = nudge(segment.end)\n if (!segment.cubic) return { cubic: null, start, end }\n return { start, end, cubic: { start, cp1: nudge(segment.cubic.cp1), cp2: nudge(segment.cubic.cp2), end } }\n}\n\n/**\n * A deterministic pseudo-random sequence from a string seed.\n *\n * xorshift over an FNV-1a hash of the seed: cheap, dependency-free, and stable\n * across engines, which is the whole requirement — a shape must wobble the same\n * way on every machine that opens the file.\n */\nfunction seededRandom(seed: string): () => number {\n let h = 0x811c9dc5\n for (let i = 0; i < seed.length; i++) {\n h ^= seed.charCodeAt(i)\n h = Math.imul(h, 0x01000193)\n }\n let state = h >>> 0 || 1\n return () => {\n state ^= state << 13\n state ^= state >>> 17\n state ^= state << 5\n state >>>= 0\n return state / 0xffffffff\n }\n}\n\n/** Pull the first and last point of `points` back along their own segment by `by` units. */\nfunction trimEnds(points: readonly VecLike[], by: number): VecLike[] {\n const out = points.map((p) => ({ x: p.x, y: p.y }))\n if (by <= 0 || out.length < 2) return out\n const first = out[0]!\n const second = out[1]!\n const last = out[out.length - 1]!\n const penultimate = out[out.length - 2]!\n const head = Vec.Add(first, Vec.Mul(Vec.Uni(Vec.Sub(second, first)), Math.min(by, Vec.Dist(first, second))))\n const tail = Vec.Add(last, Vec.Mul(Vec.Uni(Vec.Sub(penultimate, last)), Math.min(by, Vec.Dist(last, penultimate))))\n out[0] = { x: head.x, y: head.y }\n out[out.length - 1] = { x: tail.x, y: tail.y }\n return out\n}\n","/**\n * Turning a stream of pointer samples into a stroke you can fill.\n *\n * A freehand line is drawn as a *polygon*, not as a stroked polyline: that is\n * the only way the line can get thicker where the pen pressed harder and taper\n * at its ends. The pipeline is three steps, each exported on its own because\n * different callers stop at different points:\n *\n * 1. {@link getStrokePoints} — resample and smooth the raw input, and work out\n * how wide the line should be at each sample.\n * 2. {@link getStrokeOutlinePoints} — walk those samples' left and right sides\n * to produce the polygon.\n * 3. {@link getStroke} — both of the above, for a caller that just wants the\n * outline.\n *\n * A lasso or a laser pointer stops after step 1 and calls\n * {@link getSvgPathFromStrokePoints} instead, because it wants a centreline it\n * can stroke with a round cap rather than a filled shape.\n */\n\nimport { Vec, type VecLike } from \"@mocanvas/editor\"\n\n/** How a stroke's start or end is shaped. */\nexport interface StrokeTerminalOptions {\n /** Round the terminal off, instead of cutting it square. */\n cap?: boolean\n /** Reshapes the taper over its length; `distance` runs `0`→`1`. */\n easing?(distance: number): number\n /** `true` for a taper as long as the stroke's own width, or an explicit length. */\n taper?: boolean | number\n}\n\n/** Everything the stroke pipeline can be tuned by. */\nexport interface StrokeOptions {\n /** Shaping for the end of the stroke. */\n end?: StrokeTerminalOptions\n /** Whether these are the final points of the stroke, rather than a live prefix. */\n last?: boolean\n /** Derive pressure from speed when the input device reports none. */\n simulatePressure?: boolean\n /** The base width of the stroke, in the points' own units. */\n size?: number\n /** How strongly the width is averaged along the stroke, `0`–`1`. */\n smoothing?: number\n /** Shaping for the start of the stroke. */\n start?: StrokeTerminalOptions\n /** How strongly the input points are pulled towards the previous one, `0`–`1`. */\n streamline?: number\n /** How much pressure changes the width, `0`–`1`. Negative inverts it. */\n thinning?: number\n /** Reshapes how pressure maps to width. */\n easing?: (pressure: number) => number\n}\n\n/** One resampled point of a stroke: where it is, how wide, and how far along. */\nexport interface StrokePoint {\n /** Distance from the previous stroke point. */\n distance: number\n /** The raw input sample this came from. */\n input: Vec\n /** The smoothed position. */\n point: Vec\n /** Pressure at this point, `0`–`1`. */\n pressure: number\n /** Half-width of the stroke here. */\n radius: number\n /** Distance from the start of the stroke, along it. */\n runningLength: number\n}\n\nconst DEFAULT_SIZE = 16\nconst DEFAULT_THINNING = 0.5\nconst DEFAULT_SMOOTHING = 0.5\nconst DEFAULT_STREAMLINE = 0.5\nconst DEFAULT_PRESSURE = 0.5\nconst RATE_OF_PRESSURE_CHANGE = 0.275\n\nconst identity = (t: number): number => t\nconst easeOutSine = (t: number): number => Math.sin((t * Math.PI) / 2)\n\n/** Pressure of a sample, from a `z`/pressure component when the input carries one. */\nfunction pressureOf(point: VecLike): number | undefined {\n const z = (point as { z?: number | undefined }).z\n return typeof z === \"number\" ? z : undefined\n}\n\n/**\n * Resample and smooth raw input into the points the outline is built from.\n *\n * Two things happen here. Streamlining pulls each sample towards the previous\n * one, which removes the jitter a trackpad or a shaky hand puts into the\n * stream. Then each point is given a radius from its pressure — real pressure\n * from a pen, or pressure simulated from how fast the pointer was moving, on\n * the observation that a fast stroke is a light one.\n */\nexport function getStrokePoints(rawInputPoints: VecLike[], options: StrokeOptions = {}): StrokePoint[] {\n const { streamline = DEFAULT_STREAMLINE, size = DEFAULT_SIZE, simulatePressure = true, last = false } = options\n if (rawInputPoints.length === 0) return []\n\n const t = 0.15 + (1 - streamline) * 0.85\n const points: StrokePoint[] = []\n\n const first = rawInputPoints[0]!\n let previous = new Vec(first.x, first.y)\n const firstPressure = pressureOf(first) ?? DEFAULT_PRESSURE\n points.push({\n input: new Vec(first.x, first.y),\n point: previous,\n pressure: simulatePressure ? DEFAULT_PRESSURE : firstPressure,\n distance: 0,\n runningLength: 0,\n radius: size / 2,\n })\n\n let runningLength = 0\n for (let i = 1; i < rawInputPoints.length; i++) {\n const raw = rawInputPoints[i]!\n const input = new Vec(raw.x, raw.y)\n // The last point is used as it arrived: rounding the very end of a live\n // stroke towards its predecessor makes the line visibly lag the cursor.\n const point = last && i === rawInputPoints.length - 1 ? input : Vec.Lrp(previous, input, t)\n const distance = Vec.Dist(point, previous)\n // Points that land on top of each other carry no direction, and a zero\n // vector would put a spike in the outline.\n if (distance < 0.001 && i < rawInputPoints.length - 1) continue\n runningLength += distance\n points.push({\n input,\n point,\n pressure: pressureOf(raw) ?? DEFAULT_PRESSURE,\n distance,\n runningLength,\n radius: size / 2,\n })\n previous = point\n }\n\n return applyRadii(points, options)\n}\n\n/** Give every stroke point the radius its pressure implies. */\nfunction applyRadii(points: StrokePoint[], options: StrokeOptions): StrokePoint[] {\n const {\n size = DEFAULT_SIZE,\n thinning = DEFAULT_THINNING,\n smoothing = DEFAULT_SMOOTHING,\n simulatePressure = true,\n easing = identity,\n } = options\n if (thinning === 0) {\n for (const p of points) p.radius = size / 2\n return points\n }\n\n let previousPressure = points[0]?.pressure ?? DEFAULT_PRESSURE\n for (const point of points) {\n let pressure = point.pressure\n if (simulatePressure) {\n // Faster travel between samples reads as a lighter touch. The step is\n // capped so one long jump — a dropped frame — cannot spike the width.\n const speed = Math.min(1, point.distance / size)\n const target = 1 - speed\n pressure = Math.min(1, previousPressure + (target - previousPressure) * (RATE_OF_PRESSURE_CHANGE * smoothing))\n }\n previousPressure = pressure\n point.pressure = pressure\n point.radius = (size * (0.5 + easing(pressure) * thinning - thinning / 2)) / 2\n }\n return points\n}\n\n/** The taper length for one terminal, resolved against the stroke's total length. */\nfunction taperLength(terminal: StrokeTerminalOptions | undefined, size: number, totalLength: number): number {\n const taper = terminal?.taper\n if (taper === undefined || taper === false) return 0\n if (taper === true) return Math.max(size, totalLength * 0.1)\n return taper\n}\n\n/**\n * Walk the stroke points and produce the polygon that surrounds them.\n *\n * At each point the outline steps out perpendicular to the direction of travel\n * by that point's radius, once to the left and once to the right; the right\n * side is walked back in reverse so the result is a single closed ring. Tapers\n * shrink the radius near the ends, and a `cap` fans extra points around the\n * terminal so it reads as round rather than cut off.\n */\nexport function getStrokeOutlinePoints(strokePoints: StrokePoint[], options: StrokeOptions = {}): Vec[] {\n const { size = DEFAULT_SIZE, start, end } = options\n if (strokePoints.length === 0) return []\n\n const total = strokePoints[strokePoints.length - 1]!.runningLength\n const startTaper = taperLength(start, size, total)\n const endTaper = taperLength(end, size, total)\n const startEasing = start?.easing ?? easeOutSine\n const endEasing = end?.easing ?? easeOutSine\n\n if (strokePoints.length === 1) {\n // A dot: a ring around the single point, so a tap still draws something.\n const only = strokePoints[0]!\n const ring: Vec[] = []\n for (let i = 0; i < 16; i++) {\n const angle = (i / 16) * Math.PI * 2\n ring.push(new Vec(only.point.x + Math.cos(angle) * only.radius, only.point.y + Math.sin(angle) * only.radius))\n }\n return ring\n }\n\n const left: Vec[] = []\n const right: Vec[] = []\n for (let i = 0; i < strokePoints.length; i++) {\n const point = strokePoints[i]!\n const next = strokePoints[i + 1] ?? point\n const previous = strokePoints[i - 1] ?? point\n const direction = Vec.Uni(Vec.Sub(next === point ? point.point : next.point, previous === point ? point.point : previous.point))\n if (direction.len() === 0) continue\n const normal = new Vec(-direction.y, direction.x)\n\n let radius = point.radius\n if (startTaper > 0 && point.runningLength < startTaper) radius *= startEasing(point.runningLength / startTaper)\n if (endTaper > 0 && total - point.runningLength < endTaper) radius *= endEasing((total - point.runningLength) / endTaper)\n\n left.push(new Vec(point.point.x + normal.x * radius, point.point.y + normal.y * radius))\n right.push(new Vec(point.point.x - normal.x * radius, point.point.y - normal.y * radius))\n }\n\n const outline = [...left]\n if (end?.cap !== false) outline.push(...capAround(strokePoints[strokePoints.length - 1]!, left[left.length - 1], right[right.length - 1]))\n outline.push(...right.reverse())\n if (start?.cap !== false) outline.push(...capAround(strokePoints[0]!, right[right.length - 1], left[0]))\n return outline\n}\n\n/** A short arc of points from `from` to `to` around `point`, for a round terminal. */\nfunction capAround(point: StrokePoint, from: Vec | undefined, to: Vec | undefined): Vec[] {\n if (!from || !to || point.radius <= 0) return []\n const startAngle = Math.atan2(from.y - point.point.y, from.x - point.point.x)\n const endAngle = Math.atan2(to.y - point.point.y, to.x - point.point.x)\n let sweep = endAngle - startAngle\n while (sweep <= 0) sweep += Math.PI * 2\n const steps = 6\n const out: Vec[] = []\n for (let i = 1; i < steps; i++) {\n const angle = startAngle + (sweep * i) / steps\n out.push(new Vec(point.point.x + Math.cos(angle) * point.radius, point.point.y + Math.sin(angle) * point.radius))\n }\n return out\n}\n\n/** The polygon surrounding `points` — {@link getStrokePoints} then {@link getStrokeOutlinePoints}. */\nexport function getStroke(points: VecLike[], options: StrokeOptions = {}): Vec[] {\n return getStrokeOutlinePoints(getStrokePoints(points, options), options)\n}\n\n/**\n * The centreline of a stroke as an SVG `d`, drawn with quadratic curves through\n * the midpoints between samples.\n *\n * Curving through midpoints rather than through the samples themselves is what\n * makes a hand-drawn line look smooth: every sample becomes a control point, so\n * the curve never has to turn a corner at one.\n */\nexport function getSvgPathFromStrokePoints(points: StrokePoint[], closed = false): string {\n if (points.length === 0) return \"\"\n const first = points[0]!.point\n if (points.length === 1) return `M${round(first.x)},${round(first.y)}`\n\n const parts = [`M${round(first.x)},${round(first.y)}`]\n for (let i = 1; i < points.length - 1; i++) {\n const a = points[i]!.point\n const b = points[i + 1]!.point\n parts.push(`Q${round(a.x)},${round(a.y)} ${round((a.x + b.x) / 2)},${round((a.y + b.y) / 2)}`)\n }\n const last = points[points.length - 1]!.point\n parts.push(`L${round(last.x)},${round(last.y)}`)\n if (closed) parts.push(\"Z\")\n return parts.join(\" \")\n}\n\nfunction round(value: number): number {\n return Math.round(value * 100) / 100\n}\n","/**\n * Reading a draw shape's stored segments back into points.\n *\n * A draw shape stores its points packed (see `b64Vecs`) and in the shape's own\n * unit space, so anything that wants to measure, hit-test or re-render a stroke\n * has to unpack it and scale it to the shape's current size. That is exactly\n * these two functions, kept separate from the draw shape util so a tool, an\n * exporter or an app's own code can read a stroke without going through the\n * util.\n */\n\nimport { b64Vecs, DIM_2D, Vec, type TLDrawShapeSegment } from \"@mocanvas/editor\"\n\n/**\n * The points of one segment, scaled by `scaleX`/`scaleY`, appended to `points`.\n *\n * Appending into a caller-supplied array rather than returning a fresh one is\n * what lets {@link getPointsFromDrawSegments} walk a whole stroke without\n * allocating an array per segment; the array is returned as well, so a caller\n * that does not care can ignore the parameter.\n */\nexport function getPointsFromDrawSegment(segment: TLDrawShapeSegment, scaleX: number, scaleY: number, points: Vec[] = []): Vec[] {\n const dim = segment.dim ?? undefined\n const decoded =\n dim === DIM_2D\n ? b64Vecs.decodePoints2D(segment.points).map((p) => ({ x: p.x, y: p.y, z: 0.5 }))\n : b64Vecs.decodePoints(segment.points)\n for (const point of decoded) {\n // Pressure rides along as `z` so a re-stroked segment keeps its width\n // profile; scaling must not touch it.\n const scaled = new Vec(point.x * scaleX, point.y * scaleY, point.z)\n // A repeated point contributes no direction and would put a spike in the\n // outline where two segments meet.\n const last = points[points.length - 1]\n if (last && last.x === scaled.x && last.y === scaled.y) continue\n points.push(scaled)\n }\n return points\n}\n\n/** Every point of a stroke, in order, scaled to the shape's current size. */\nexport function getPointsFromDrawSegments(segments: TLDrawShapeSegment[], scaleX = 1, scaleY = 1): Vec[] {\n const points: Vec[] = []\n for (const segment of segments) getPointsFromDrawSegment(segment, scaleX, scaleY, points)\n return points\n}\n"]}