@developerz.ai/ts23d 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/CLAUDE.md +1 -1
  3. package/README.md +10 -5
  4. package/dist/{chunk-a8fxakcj.js → chunk-6b05mnmx.js} +2 -2
  5. package/dist/{chunk-kgvbpqqw.js → chunk-7rtfjh9f.js} +6 -5
  6. package/dist/chunk-7rtfjh9f.js.map +10 -0
  7. package/dist/{chunk-1ypfs7ga.js → chunk-8j4c28jt.js} +790 -276
  8. package/dist/chunk-8j4c28jt.js.map +46 -0
  9. package/dist/{chunk-wtqhq529.js → chunk-d1fv6hrm.js} +6 -6
  10. package/dist/{chunk-wtqhq529.js.map → chunk-d1fv6hrm.js.map} +1 -1
  11. package/dist/{chunk-gcyp9b4d.js → chunk-dbq4qf52.js} +362 -215
  12. package/dist/chunk-dbq4qf52.js.map +25 -0
  13. package/dist/{chunk-xnt2sdhf.js → chunk-drna2rny.js} +2 -2
  14. package/dist/{chunk-ravbb06q.js → chunk-dxvypr7y.js} +2 -2
  15. package/dist/{chunk-11v28977.js → chunk-f6yme003.js} +85 -71
  16. package/dist/{chunk-11v28977.js.map → chunk-f6yme003.js.map} +6 -6
  17. package/dist/{chunk-4ddzsqtc.js → chunk-hg7pf34j.js} +4 -3
  18. package/dist/{chunk-4ddzsqtc.js.map → chunk-hg7pf34j.js.map} +5 -5
  19. package/dist/{chunk-w1zyhj40.js → chunk-jq4e17tj.js} +2 -2
  20. package/dist/{chunk-kvcep7ft.js → chunk-y63c6zcv.js} +967 -218
  21. package/dist/chunk-y63c6zcv.js.map +53 -0
  22. package/dist/cli/args.d.ts +7 -1
  23. package/dist/cli/bin.js +66 -25
  24. package/dist/cli/bin.js.map +6 -5
  25. package/dist/cli/manifest.d.ts +5 -1
  26. package/dist/cli/texture-cache.d.ts +4 -0
  27. package/dist/core/definition.d.ts +7 -0
  28. package/dist/core/errors.d.ts +1 -1
  29. package/dist/core/index.js +1 -1
  30. package/dist/export/credits.d.ts +4 -0
  31. package/dist/export/glb-options.d.ts +48 -0
  32. package/dist/export/glb.d.ts +5 -35
  33. package/dist/export/hierarchy.d.ts +23 -0
  34. package/dist/export/index.d.ts +2 -1
  35. package/dist/export/index.js +21 -7
  36. package/dist/export/index.js.map +1 -1
  37. package/dist/export/lod-coverage.d.ts +12 -0
  38. package/dist/export/metadata.d.ts +2 -0
  39. package/dist/export/version.d.ts +2 -2
  40. package/dist/grammar/index.js +2 -2
  41. package/dist/index.js +63 -17
  42. package/dist/index.js.map +1 -1
  43. package/dist/kinds/head-armour.d.ts +3 -7
  44. package/dist/kinds/head-bust.d.ts +3 -2
  45. package/dist/kinds/head-face.d.ts +3 -1
  46. package/dist/kinds/head-garb.d.ts +4 -0
  47. package/dist/kinds/head-mesh.d.ts +4 -0
  48. package/dist/kinds/head-mouth.d.ts +4 -0
  49. package/dist/kinds/head-params.d.ts +9 -1
  50. package/dist/kinds/head-tone.d.ts +10 -0
  51. package/dist/kinds/head-torso.d.ts +35 -0
  52. package/dist/kinds/index.js +6 -6
  53. package/dist/material/cc0.d.ts +4 -0
  54. package/dist/material/define.d.ts +34 -0
  55. package/dist/material/generator.d.ts +1 -1
  56. package/dist/material/index.d.ts +8 -3
  57. package/dist/material/index.js +39 -7
  58. package/dist/material/index.js.map +1 -1
  59. package/dist/material/library.d.ts +7 -0
  60. package/dist/material/material-def.d.ts +30 -0
  61. package/dist/material/paint/canvas.d.ts +7 -0
  62. package/dist/material/paint/default-sheet.d.ts +3 -1
  63. package/dist/material/paint/fabric.d.ts +4 -0
  64. package/dist/material/paint/image-strip.d.ts +4 -0
  65. package/dist/material/paint/kit.d.ts +5 -0
  66. package/dist/material/paint/metal.d.ts +3 -0
  67. package/dist/material/paint/orm.d.ts +1 -1
  68. package/dist/material/paint/strip.d.ts +1 -1
  69. package/dist/material/paint/types.d.ts +32 -2
  70. package/dist/material/palette.d.ts +2 -0
  71. package/dist/material/slots.d.ts +5 -0
  72. package/dist/material/texture-source.d.ts +34 -0
  73. package/dist/material/trim-sheet.d.ts +20 -4
  74. package/dist/neural/index.js +2 -2
  75. package/dist/passes/index.js +2 -2
  76. package/dist/primitives/index.js +3 -3
  77. package/dist/qa/index.js +2 -2
  78. package/dist/render/beauty.d.ts +1 -1
  79. package/dist/render/index.js +3 -3
  80. package/dist/render/lighting.d.ts +7 -0
  81. package/dist/render/shade.d.ts +1 -1
  82. package/dist/testing/index.js +5 -5
  83. package/docs/README.md +4 -0
  84. package/docs/architecture/gltf-capabilities.md +38 -1
  85. package/docs/architecture/materials.md +151 -0
  86. package/docs/idea/10-sculpting.md +166 -0
  87. package/docs/idea/11-materials-authoring.md +132 -0
  88. package/docs/idea/12-blender-bridge.md +136 -0
  89. package/docs/idea/13-asset-pipeline-research.md +89 -0
  90. package/docs/plans/roadmap.md +12 -0
  91. package/package.json +2 -1
  92. package/recipes/boxcar/README.md +7 -0
  93. package/recipes/boxcar/boxcar.ts +118 -34
  94. package/recipes/goblin_head/README.md +27 -14
  95. package/recipes/goblin_head/goblin_head.ts +11 -9
  96. package/recipes/human_head/README.md +8 -4
  97. package/recipes/human_head/human_head.ts +4 -3
  98. package/recipes/material_swatches/material_swatches.ts +11 -5
  99. package/recipes/orc_head/README.md +32 -20
  100. package/recipes/orc_head/orc_head.ts +9 -7
  101. package/src/cli/args.ts +16 -3
  102. package/src/cli/manifest.ts +6 -0
  103. package/src/cli/run.ts +33 -9
  104. package/src/cli/texture-cache.ts +24 -0
  105. package/src/core/asset.ts +1 -0
  106. package/src/core/definition.ts +7 -0
  107. package/src/core/errors.ts +6 -1
  108. package/src/export/credits.ts +25 -0
  109. package/src/export/glb-options.ts +53 -0
  110. package/src/export/glb.ts +100 -113
  111. package/src/export/hierarchy.ts +122 -0
  112. package/src/export/index.ts +17 -1
  113. package/src/export/lod-coverage.ts +71 -0
  114. package/src/export/metadata.ts +3 -0
  115. package/src/export/version.ts +1 -1
  116. package/src/kinds/head-armour.ts +103 -73
  117. package/src/kinds/head-bust.ts +49 -86
  118. package/src/kinds/head-face.ts +94 -74
  119. package/src/kinds/head-garb.ts +181 -0
  120. package/src/kinds/head-hair.ts +74 -33
  121. package/src/kinds/head-mesh.ts +43 -5
  122. package/src/kinds/head-mouth.ts +111 -0
  123. package/src/kinds/head-params.ts +11 -2
  124. package/src/kinds/head-presets.ts +30 -27
  125. package/src/kinds/head-tone.ts +52 -0
  126. package/src/kinds/head-torso.ts +230 -0
  127. package/src/kinds/head.ts +8 -3
  128. package/src/material/cc0.ts +41 -0
  129. package/src/material/define.ts +130 -0
  130. package/src/material/generator.ts +15 -8
  131. package/src/material/index.ts +34 -3
  132. package/src/material/library.ts +196 -0
  133. package/src/material/material-def.ts +84 -0
  134. package/src/material/paint/canvas.ts +11 -1
  135. package/src/material/paint/compose.ts +1 -1
  136. package/src/material/paint/decode-png.ts +19 -13
  137. package/src/material/paint/default-sheet.ts +40 -28
  138. package/src/material/paint/fabric.ts +63 -0
  139. package/src/material/paint/image-strip.ts +88 -0
  140. package/src/material/paint/kit.ts +37 -0
  141. package/src/material/paint/masks.ts +3 -1
  142. package/src/material/paint/metal.ts +109 -0
  143. package/src/material/paint/orm.ts +14 -1
  144. package/src/material/paint/planks.ts +49 -4
  145. package/src/material/paint/strip.ts +35 -29
  146. package/src/material/paint/types.ts +45 -2
  147. package/src/material/paint/validate.ts +19 -3
  148. package/src/material/palette.ts +3 -0
  149. package/src/material/slots.ts +18 -0
  150. package/src/material/texture-source.ts +86 -0
  151. package/src/material/trim-sheet.ts +79 -13
  152. package/src/render/beauty.ts +2 -2
  153. package/src/render/lighting.ts +26 -0
  154. package/src/render/shade.ts +10 -5
  155. package/dist/chunk-1ypfs7ga.js.map +0 -42
  156. package/dist/chunk-gcyp9b4d.js.map +0 -22
  157. package/dist/chunk-kgvbpqqw.js.map +0 -10
  158. package/dist/chunk-kvcep7ft.js.map +0 -43
  159. /package/dist/{chunk-a8fxakcj.js.map → chunk-6b05mnmx.js.map} +0 -0
  160. /package/dist/{chunk-xnt2sdhf.js.map → chunk-drna2rny.js.map} +0 -0
  161. /package/dist/{chunk-ravbb06q.js.map → chunk-dxvypr7y.js.map} +0 -0
  162. /package/dist/{chunk-w1zyhj40.js.map → chunk-jq4e17tj.js.map} +0 -0
@@ -0,0 +1,46 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/kinds/faces.ts", "../src/kinds/mass.ts", "../src/kinds/openings.ts", "../src/kinds/building.ts", "../src/kinds/head-geom.ts", "../src/kinds/head-beard.ts", "../src/kinds/head-torso.ts", "../src/kinds/head-armour.ts", "../src/kinds/head-garb.ts", "../src/kinds/head-bust.ts", "../src/kinds/head-extras.ts", "../src/kinds/head-mouth.ts", "../src/kinds/head-face.ts", "../src/kinds/head-hair.ts", "../src/kinds/head-layout.ts", "../src/kinds/head-rim.ts", "../src/kinds/head-tone.ts", "../src/kinds/head-mesh.ts", "../src/kinds/head-params.ts", "../src/kinds/head-presets.ts", "../src/kinds/head.ts", "../src/kinds/hull-lines.ts", "../src/kinds/hull-skin.ts", "../src/kinds/hull.ts", "../src/kinds/planned.ts", "../src/kinds/roof-chimney.ts", "../src/kinds/roof-shape.ts", "../src/kinds/roof.ts", "../src/kinds/vegetation-fronds.ts", "../src/kinds/vegetation-impostor.ts", "../src/kinds/vegetation-params.ts", "../src/kinds/vegetation-leaves.ts", "../src/kinds/vegetation-mesh.ts", "../src/kinds/vegetation-presets.ts", "../src/kinds/vegetation-skeleton.ts", "../src/kinds/vegetation.ts", "../src/kinds/vehicle.ts"],
4
+ "sourcesContent": [
5
+ "// Convex-polygon toolkit for the building kinds: half-plane clipping in plan, and emitting a flat\n// convex 3D polygon onto a trim strip AT TRUE SCALE. A strip tiles along U only, so the polygon is\n// cut into bands `scaleMetres` tall along its V direction (courses start on `vOrigin`); each band\n// maps V 0→1 across the strip. That is how slates run down a slope and bricks up a gable.\n\nimport {\n cross,\n dot,\n type MeshBuilder,\n normalize,\n sub,\n type Vec2,\n type Vec3,\n} from '../core/index.ts';\nimport { DEFAULT_SHEET, type StripId, stripRect } from '../material/index.ts';\n\nconst EPS = 1e-9;\n\n/** Keep the part of a convex polygon where the linear function `f` is ≤ 0. */\nexport function clipPoly<P extends Vec2 | Vec3>(poly: readonly P[], f: (p: P) => number): P[] {\n const out: P[] = [];\n const n = poly.length;\n for (let i = 0; i < n; i++) {\n const a = poly[i];\n const b = poly[(i + 1) % n];\n if (a === undefined || b === undefined) continue;\n const fa = f(a);\n const fb = f(b);\n if (fa <= EPS) out.push(a);\n if (fa <= EPS !== fb <= EPS) {\n const t = fa / (fa - fb);\n out.push(a.map((v, k) => v + ((b[k] ?? v) - v) * t) as unknown as P);\n }\n }\n return dedupe(out);\n}\n\n/** Drop consecutive duplicate points (clipping through a vertex emits it twice). */\nexport function dedupe<P extends Vec2 | Vec3>(poly: readonly P[]): P[] {\n const out: P[] = [];\n for (const p of poly) {\n const q = out.at(-1);\n if (!q || p.some((v, k) => Math.abs(v - (q[k] ?? 0)) > 1e-7)) out.push(p);\n }\n const first = out[0];\n const last = out.at(-1);\n if (out.length > 1 && first && last && first.every((v, k) => Math.abs(v - (last[k] ?? 0)) < 1e-7))\n out.pop();\n return out;\n}\n\n/** Signed area of a 2D polygon (CCW positive). */\nexport const area2 = (poly: readonly Vec2[]): number =>\n poly.reduce((s, a, i) => {\n const b = poly[(i + 1) % poly.length] ?? a;\n return s + a[0] * b[1] - b[0] * a[1];\n }, 0) / 2;\n\n/** Vertical extent of one band (one full V of the strip) in metres, from the house sheet. */\nexport const stripScale = (strip: StripId): number => DEFAULT_SHEET.strips[strip]?.scaleMetres ?? 1;\n\nexport interface FaceOptions {\n /** Convex and planar; either winding (it is turned to face `normal`). */\n readonly points: readonly Vec3[];\n readonly normal: Vec3;\n /** Direction V grows along (up a slope, up a wall); projected into the face plane. */\n readonly up: Vec3;\n /** A point on the line where courses start (eave, wall foot). */\n readonly vOrigin: Vec3;\n readonly color: Vec3 | ((p: Vec3) => Vec3);\n readonly strip: StripId;\n /** false: one polygon, V squeezed over the whole face (far LODs). Default true. */\n readonly banded?: boolean;\n}\n\n/** Emit a convex face into `b`, banded at the strip's true scale. Returns triangles added. */\nexport function emitFace(b: MeshBuilder, o: FaceOptions): number {\n if (o.points.length < 3) return 0;\n const n = normalize(o.normal);\n const points = dot(newell(o.points), n) < 0 ? [...o.points].reverse() : o.points;\n const vDir = normalize(sub(o.up, scaleV(n, dot(o.up, n))));\n const uDir = cross(vDir, n);\n const rect = stripRect(o.strip);\n const scale = stripScale(o.strip);\n const vOf = (p: Vec3): number => dot(sub(p, o.vOrigin), vDir);\n const vs = points.map(vOf);\n const lo = Math.min(...vs);\n const hi = Math.max(...vs);\n if (hi - lo < 1e-6) return 0;\n const colour = (p: Vec3): Vec3 => (typeof o.color === 'function' ? o.color(p) : o.color);\n const bands: [number, number][] = [];\n if (o.banded === false) bands.push([lo, hi]);\n else {\n for (let k = Math.floor(lo / scale + 1e-9); k * scale < hi - 1e-9; k++) {\n bands.push([k * scale, (k + 1) * scale]);\n }\n }\n let tris = 0;\n for (const [v0, v1] of bands) {\n const span = v1 - v0;\n const poly = clipPoly(\n clipPoly(points, (p) => v0 - vOf(p)),\n (p) => vOf(p) - v1,\n );\n if (poly.length < 3) continue;\n const ids = poly.map((p) => {\n const f = Math.min(1, Math.max(0, (vOf(p) - v0) / span));\n return b.vertex({\n p,\n n,\n uv: [\n rect.u0 + (dot(p, uDir) / rect.metres) * (rect.u1 - rect.u0),\n rect.v0 + f * (rect.v1 - rect.v0),\n ],\n color: colour(p),\n });\n });\n const first = ids[0] ?? 0;\n for (let i = 1; i + 1 < ids.length; i++) b.tri(first, ids[i] ?? 0, ids[i + 1] ?? 0);\n tris += ids.length - 2;\n }\n return tris;\n}\n\n/** Newell's polygon normal (unnormalised): robust for any planar polygon. */\nexport function newell(poly: readonly Vec3[]): Vec3 {\n const n: [number, number, number] = [0, 0, 0];\n for (let i = 0; i < poly.length; i++) {\n const a = poly[i] ?? [0, 0, 0];\n const b = poly[(i + 1) % poly.length] ?? a;\n n[0] += (a[1] - b[1]) * (a[2] + b[2]);\n n[1] += (a[2] - b[2]) * (a[0] + b[0]);\n n[2] += (a[0] - b[0]) * (a[1] + b[1]);\n }\n return n;\n}\n\nconst scaleV = (v: Vec3, s: number): Vec3 => [v[0] * s, v[1] * s, v[2] * s];\n",
6
+ "// A building mass (walls block) whose masonry is laid at TRUE scale: every side is cut into\n// course bands of the strip's `scaleMetres`, all starting from the ground line, so brick courses\n// match across sides and across stacked masses. `box` stretches one strip band over the whole face\n// — fine for trim, wrong for a 6 m brick wall. LOD2 keeps one quad per side (V squeezed).\n\nimport { type Lod, type Mesh, MeshBuilder, Ts23dError, type Vec3 } from '../core/index.ts';\nimport type { StripId } from '../material/index.ts';\nimport { emitFace } from './faces.ts';\n\nexport interface MassOptions {\n /** Width (X), depth (Y), height (Z). */\n readonly size: Vec3;\n /** Centre of the base. */\n readonly at?: Vec3;\n readonly color: Vec3;\n readonly strip?: StripId;\n /** Courses start at this world z (default 0, the ground) so stacked masses line up. */\n readonly courseOrigin?: number;\n /** Skip faces nobody sees (bottom on the ground, top under a roof, a party wall). */\n readonly omit?: readonly ('top' | 'bottom' | 'front' | 'back' | 'left' | 'right')[];\n}\n\nexport function mass(o: MassOptions, lod: Lod = 0): Mesh {\n const [w, d, h] = o.size;\n if (!(w > 0 && d > 0 && h > 0))\n throw new Ts23dError('T3D_RECIPE_INVALID', {\n cause: `mass size is [${o.size.join(', ')}]`,\n fix: 'give width (X), depth (Y) and height (Z) in metres, all > 0',\n });\n const [cx, cy, z0] = o.at ?? [0, 0, 0];\n const [x0, x1, y0, y1, z1] = [cx - w / 2, cx + w / 2, cy - d / 2, cy + d / 2, z0 + h];\n const b = new MeshBuilder();\n const strip = o.strip ?? 'brick';\n const origin: Vec3 = [0, 0, o.courseOrigin ?? 0];\n const sides: [NonNullable<MassOptions['omit']>[number], Vec3, Vec3[]][] = [\n [\n 'front',\n [1, 0, 0],\n [\n [x1, y0, z0],\n [x1, y1, z0],\n [x1, y1, z1],\n [x1, y0, z1],\n ],\n ],\n [\n 'back',\n [-1, 0, 0],\n [\n [x0, y1, z0],\n [x0, y0, z0],\n [x0, y0, z1],\n [x0, y1, z1],\n ],\n ],\n [\n 'left',\n [0, 1, 0],\n [\n [x1, y1, z0],\n [x0, y1, z0],\n [x0, y1, z1],\n [x1, y1, z1],\n ],\n ],\n [\n 'right',\n [0, -1, 0],\n [\n [x0, y0, z0],\n [x1, y0, z0],\n [x1, y0, z1],\n [x0, y0, z1],\n ],\n ],\n ];\n for (const [name, normal, points] of sides) {\n if (o.omit?.includes(name)) continue;\n emitFace(b, {\n points,\n normal,\n up: [0, 0, 1],\n vOrigin: origin,\n color: o.color,\n strip,\n banded: lod < 2,\n });\n }\n for (const [name, z, s] of [\n ['top', z1, 1],\n ['bottom', z0, -1],\n ] as const) {\n if (o.omit?.includes(name)) continue;\n emitFace(b, {\n points: [\n [x0, y0, z],\n [x1, y0, z],\n [x1, y1, z],\n [x0, y1, z],\n ],\n normal: [0, 0, s],\n up: [0, 1, 0],\n vOrigin: [cx, y0, z],\n color: o.color,\n strip: 'plain',\n banded: false,\n });\n }\n return b.build();\n}\n",
7
+ "// Windows and doors as one mesh each: a reveal (surround in the wall's colour, so the glass reads\n// set back by `depth`), stone sill and lintel, sash frame with glazing bars, or a panelled door\n// leaf. The wall mass behind stays whole (no boolean cut): half the triangles, no T-junctions.\n// Authored with the face at x = 0 looking +X, then turned to the requested side.\n// LOD0: everything · LOD1: no glazing bars / door panels · LOD2: glass or leaf only.\n\nimport { type Lod, type Mesh, merge, place, Ts23dError, type Vec3 } from '../core/index.ts';\nimport type { StripId } from '../material/index.ts';\nimport { box } from '../primitives/index.ts';\nimport { mass } from './mass.ts';\n\nexport type OpeningSide = 'front' | 'back' | 'left' | 'right';\n\nexport interface OpeningOptions {\n readonly kind: 'window' | 'door';\n /** Clear opening, metres (UK sash ≈ 0.9 × 1.6; door ≈ 0.9 × 2.1). */\n readonly width: number;\n readonly height: number;\n /** Bottom centre of the opening ON the wall face. */\n readonly at: Vec3;\n /** Which way the wall faces (front = +X, left = +Y). */\n readonly facing: OpeningSide;\n readonly glass: Vec3;\n /** Sash frame / door leaf colour. */\n readonly frame: Vec3;\n /** Reveal (surround) colour: the wall's, so the opening reads recessed. */\n readonly wall: Vec3;\n readonly wallStrip?: StripId;\n /** Sill + lintel colour (dressed stone). */\n readonly trim?: Vec3;\n /** Reveal depth, metres. Default 0.12 (half a brick). */\n readonly depth?: number;\n /** Reveal band width either side. Default 0.1. */\n readonly surround?: number;\n /** Glazing panes [across, up]: 2-over-2 sash = [2, 2]. Default window [2, 2]. */\n readonly panes?: readonly [number, number];\n readonly sill?: boolean;\n readonly lintel?: boolean;\n}\n\nconst YAW: Record<OpeningSide, number> = {\n front: 0,\n left: Math.PI / 2,\n back: Math.PI,\n right: -Math.PI / 2,\n};\n\n/** Base-centred box flush on the wall face (x = 0), back face omitted (it is against the wall). */\nconst onWall = (size: Vec3, y: number, z: number, color: Vec3, strip?: StripId): Mesh =>\n box({ size, at: [size[0] / 2, y, z], color, omit: ['back'], ...(strip ? { strip } : {}) });\n\nexport function opening(o: OpeningOptions, lod: Lod = 0): Mesh {\n const { width: w, height: h } = o;\n if (!(w > 0.2 && h > 0.2 && Number.isFinite(w) && Number.isFinite(h)))\n throw new Ts23dError('T3D_RECIPE_INVALID', {\n cause: `${o.kind} opening is ${w} × ${h} m`,\n fix: 'give a clear width and height > 0.2 m (sash ≈ 0.9 × 1.6, door ≈ 0.9 × 2.1)',\n });\n const r = o.depth ?? 0.12;\n const s = o.surround ?? 0.1;\n const trim = o.trim ?? [0.78, 0.75, 0.68];\n const door = o.kind === 'door';\n const parts: Mesh[] = [];\n // The infill: glass flush on the wall, or the door leaf a little proud of it.\n parts.push(\n door\n ? onWall([0.05, w, h], 0, 0, o.frame, 'wood')\n : onWall([0.02, w, h], 0, 0, o.glass, 'glass'),\n );\n if (lod < 2) {\n const lintel = o.lintel ?? true;\n // Reveal masonry in true-scale courses aligned with the wall's (courses start at world z 0).\n const reveal = (size: Vec3, y: number, z: number): Mesh =>\n mass(\n {\n size,\n at: [size[0] / 2, y, z],\n color: o.wall,\n strip: o.wallStrip ?? 'plain',\n courseOrigin: -o.at[2],\n omit: ['back'],\n },\n lod,\n );\n for (const side of [-1, 1]) parts.push(reveal([r, s, h], side * (w / 2 + s / 2), 0));\n if (lintel) parts.push(onWall([r + 0.03, w + 2 * s + 0.2, 0.22], 0, h, trim, 'stone'));\n else parts.push(reveal([r, w + 2 * s, s], 0, h));\n if (!door && (o.sill ?? true))\n parts.push(onWall([r + 0.07, w + 2 * s + 0.12, 0.07], 0, -0.07, trim, 'stone'));\n if (!door) parts.push(...sash(o, w, h, lod));\n else if (lod === 0) parts.push(...panels(o, w, h));\n }\n return place(merge(parts), { yaw: YAW[o.facing], at: o.at });\n}\n\n/** Sash frame round the glass; glazing bars at LOD0. */\nfunction sash(o: OpeningOptions, w: number, h: number, lod: Lod): Mesh[] {\n const f = 0.06;\n const d = 0.05;\n const out = [\n onWall([d, f, h], -(w / 2 - f / 2), 0, o.frame),\n onWall([d, f, h], w / 2 - f / 2, 0, o.frame),\n onWall([d, w - 2 * f, f], 0, 0, o.frame),\n onWall([d, w - 2 * f, f], 0, h - f, o.frame),\n ];\n if (lod > 0) return out;\n const [across, up] = o.panes ?? [2, 2];\n const bar = 0.03;\n for (let i = 1; i < across; i++)\n out.push(\n onWall([d * 0.8, bar, h - 2 * f], -w / 2 + f + ((w - 2 * f) * i) / across, f, o.frame),\n );\n for (let j = 1; j < up; j++)\n out.push(onWall([d * 0.8, w - 2 * f, bar], 0, f + ((h - 2 * f) * j) / up - bar / 2, o.frame));\n return out;\n}\n\n/** Four raised fielded panels on a door leaf (LOD0). */\nfunction panels(o: OpeningOptions, w: number, h: number): Mesh[] {\n const out: Mesh[] = [];\n const pw = (w - 0.36) / 2;\n const tone: Vec3 = [o.frame[0] * 0.85, o.frame[1] * 0.85, o.frame[2] * 0.85];\n for (const y of [-1, 1])\n for (const [z0, ph] of [\n [0.15, h * 0.38],\n [0.15 + h * 0.38 + 0.15, h - 0.45 - h * 0.38],\n ] as const)\n out.push(\n box({\n size: [0.02, pw, ph],\n at: [0.06, y * (pw / 2 + 0.06), z0],\n color: tone,\n omit: ['back'],\n }),\n );\n // Knob on the lock side.\n out.push(\n box({ size: [0.06, 0.06, 0.06], at: [0.08, w / 2 - 0.12, h * 0.48], color: [0.7, 0.6, 0.3] }),\n );\n return out;\n}\n",
8
+ "// Building helpers: masses, then details. A facade is a split-grammar line per floor and side;\n// `win`/`door`/`arch`/`shop` slots become openings, everything else stays wall. Plain mode: inset\n// glass/door panels. With `kit`: real openings (reveal, sill, lintel, sash, panelled door).\n\nimport type { BuildContext, Vec3 } from '../core/index.ts';\nimport { split } from '../grammar/index.ts';\nimport type { StripId } from '../material/index.ts';\nimport { box } from '../primitives/index.ts';\nimport { opening } from './openings.ts';\n\nexport type Side = 'front' | 'back' | 'left' | 'right';\n\nexport interface FacadeOptions {\n readonly prefix: string;\n /** Centre of the mass's base. */\n readonly at: Vec3;\n /** Footprint width (X) and depth (Y) of the mass this facade wraps. */\n readonly footprint: readonly [number, number];\n readonly floors: number;\n readonly floorHeight: number;\n /** Grammar per floor; the same line for every floor unless `ground` overrides floor 0. */\n readonly grammar: string;\n readonly ground?: string;\n readonly sides: readonly Side[];\n readonly glass: Vec3;\n readonly frame?: Vec3;\n /** Window height as a fraction of the floor. */\n readonly windowRatio?: number;\n /** Detailed openings (see `opening`): reveal in the wall colour, stone sill/lintel, sash bars. */\n readonly kit?: {\n readonly wall: Vec3;\n readonly trim?: Vec3;\n readonly depth?: number;\n readonly panes?: readonly [number, number];\n /** The wall's strip, so reveals continue its courses. Default 'plain'. */\n readonly strip?: StripId;\n };\n}\n\nconst OPENINGS = new Set(['win', 'door', 'arch', 'shop']);\n\nexport function facade(ctx: BuildContext, o: FacadeOptions): void {\n const [w, d] = o.footprint;\n const ratio = o.windowRatio ?? 0.6;\n const depth = 0.08;\n for (const side of o.sides) {\n const along = side === 'front' || side === 'back' ? d : w;\n for (let f = 0; f < o.floors; f++) {\n const line = f === 0 && o.ground ? o.ground : o.grammar;\n const z = o.at[2] + f * o.floorHeight;\n split(line, along).forEach((slot, i) => {\n if (!OPENINGS.has(slot.symbol) || slot.size < 0.2) return;\n const isDoor = slot.symbol === 'door' || slot.symbol === 'shop';\n const h = isDoor ? o.floorHeight * 0.85 : o.floorHeight * ratio;\n const sill = isDoor ? 0 : (o.floorHeight - h) / 2;\n const c = slot.start + slot.size / 2 - along / 2;\n const inset = slot.size * 0.85;\n const pos: Vec3 =\n side === 'front'\n ? [o.at[0] + w / 2, o.at[1] + c, z + sill]\n : side === 'back'\n ? [o.at[0] - w / 2, o.at[1] - c, z + sill]\n : side === 'left'\n ? [o.at[0] - c, o.at[1] + d / 2, z + sill]\n : [o.at[0] + c, o.at[1] - d / 2, z + sill];\n const name = `${o.prefix}_${side}_${f}_${i}`;\n if (o.kit) {\n const k = o.kit;\n ctx.part(\n name,\n opening(\n {\n kind: isDoor ? 'door' : 'window',\n width: Math.max(0.3, inset - 0.2),\n height: h - (isDoor ? 0.25 : 0.2),\n at: pos,\n facing: side,\n glass: o.glass,\n frame: o.frame ?? [0.92, 0.9, 0.85],\n wall: k.wall,\n ...(k.trim ? { trim: k.trim } : {}),\n ...(k.depth !== undefined ? { depth: k.depth } : {}),\n ...(k.panes ? { panes: k.panes } : {}),\n ...(k.strip ? { wallStrip: k.strip } : {}),\n },\n ctx.lod,\n ),\n );\n return;\n }\n const size: Vec3 =\n side === 'front' || side === 'back' ? [depth, inset, h] : [inset, depth, h];\n ctx.part(\n name,\n box({\n size,\n at: pos,\n color: isDoor ? (o.frame ?? o.glass) : o.glass,\n strip: 'glass',\n omit: ['bottom'],\n }),\n );\n });\n }\n }\n}\n\nexport interface SetbackTier {\n readonly footprint: readonly [number, number];\n readonly floors: number;\n}\n\n/** Stack of shrinking masses (Empire State, Chrysler-style towers). Returns the top z. */\nexport function setbacks(\n ctx: BuildContext,\n o: {\n prefix: string;\n tiers: readonly SetbackTier[];\n floorHeight: number;\n color: Vec3;\n grammar: string;\n glass: Vec3;\n detail: boolean;\n },\n): number {\n let z = 0;\n o.tiers.forEach((t, i) => {\n const h = t.floors * o.floorHeight;\n ctx.part(\n `${o.prefix}_${i}`,\n box({\n size: [t.footprint[0], t.footprint[1], h],\n at: [0, 0, z],\n color: o.color,\n strip: 'stone',\n omit: i === 0 ? ['bottom'] : [],\n }),\n );\n if (o.detail)\n facade(ctx, {\n prefix: `${o.prefix}_${i}_win`,\n at: [0, 0, z],\n footprint: t.footprint,\n floors: t.floors,\n floorHeight: o.floorHeight,\n grammar: o.grammar,\n sides: ['front', 'back', 'left', 'right'],\n glass: o.glass,\n });\n z += h;\n });\n return z;\n}\n",
9
+ "// Small geometry helpers for head edit lists: the `rotate` that points an edit's local X (or Z) along\n// a direction, and point/vector helpers.\n\nimport type { Vec3 } from '../core/index.ts';\n\nconst DEG = 180 / Math.PI;\n\n/** `rotate` (deg, X→Y→Z) taking local +X onto `d`, then rolling `roll` deg about it. */\nexport function alongX(d: Vec3, roll = 0): Vec3 {\n const yaw = Math.atan2(d[1], d[0]);\n const pitch = -Math.atan2(d[2], Math.hypot(d[0], d[1]));\n return [roll, pitch * DEG, yaw * DEG];\n}\n\n/** `rotate` taking local +Z (a cone's axis) onto `d`. */\nexport function alongZ(d: Vec3): Vec3 {\n const len = Math.hypot(d[0], d[1], d[2]) || 1;\n const tilt = Math.acos(Math.max(-1, Math.min(1, d[2] / len)));\n return [0, tilt * DEG, Math.atan2(d[1], d[0]) * DEG];\n}\n\nexport const unit = (d: Vec3): Vec3 => {\n const l = Math.hypot(d[0], d[1], d[2]) || 1;\n return [d[0] / l, d[1] / l, d[2] / l];\n};\n\nexport const along = (a: Vec3, d: Vec3, t: number): Vec3 => [\n a[0] + d[0] * t,\n a[1] + d[1] * t,\n a[2] + d[2] * t,\n];\n",
10
+ "// Facial hair as sculpt groups, part of the skull field (so a beard splits with the jaw):\n// eyebrows riding just proud of the brow ridge (tapered, arched), and beards built as one clipped\n// volume — a mass around jaw and chin, trimmed above a cheek line that rises to the ears, the lips\n// carved clear — plus a two-segment moustache and optional braid. Head units, mirrored across Y.\n\nimport type { Vec3 } from '../core/index.ts';\nimport type { SculptEdit } from '../primitives/index.ts';\nimport { along, unit } from './head-geom.ts';\nimport type { HeadLayout } from './head-layout.ts';\nimport type { HeadParams } from './head-params.ts';\n\nconst RAD = Math.PI / 180;\n\n/** Eyebrows: two capsule segments (inner thick → outer thin) offset off the brow ridge. */\nexport function browEdits(p: HeadParams, l: HeadLayout): SculptEdit[] {\n const h = p.brow.hair ?? 0;\n if (h <= 0) return [];\n const [ex, ey] = l.eye;\n const r = l.eyeR;\n const lift: Vec3 = [p.brow.ridge * 0.55 + 0.012, 0, p.brow.ridge * 0.8 + 0.018];\n const inner: Vec3 = [ex + r * 0.75 + lift[0], 0.035, l.browZ - p.brow.scowl + lift[2]];\n const outer: Vec3 = [\n ex + r * 0.1 + lift[0] * 0.6,\n ey + r * 1.25,\n l.browZ + p.brow.scowl * 0.5 + lift[2] * 0.7,\n ];\n const mid: Vec3 = [\n (inner[0] + outer[0]) / 2,\n inner[1] + (outer[1] - inner[1]) * 0.55,\n (inner[2] + outer[2]) / 2 + 0.014,\n ];\n return [\n {\n group: [\n { shape: 'capsule', at: inner, to: mid, size: h },\n { shape: 'capsule', at: mid, to: outer, size: h * 0.65, blend: 0.006 },\n ],\n color: p.colors.hair,\n blend: 0.006,\n },\n ];\n}\n\n/** Box whose top face is the plane through `p` tilted `deg` about Y (positive: higher at back). */\nconst below = (p: Vec3, deg: number): SculptEdit => {\n const n: Vec3 = [-Math.sin(deg * RAD), 0, Math.cos(deg * RAD)];\n return {\n shape: 'roundBox',\n at: [p[0] - n[0], p[1], p[2] - n[2]],\n size: [4, 4, 2],\n rotate: [0, -deg, 0],\n op: 'intersect',\n blend: 0.02,\n };\n};\n\nexport function beardEdits(p: HeadParams, l: HeadLayout): SculptEdit[] {\n if (p.beard === 'none') return [];\n const h = p.colors.hair;\n const light: Vec3 = [h[0] * 1.35, h[1] * 1.35, h[2] * 1.35];\n const [ax, ay, az] = l.angle;\n const ch = l.chin;\n const mw = p.mouth.width;\n const lipT = p.mouth.lips;\n const full = p.beard !== 'goatee';\n const mass: SculptEdit = full\n ? {\n shape: 'ellipsoid',\n at: [(ax + ch[0]) / 2 + 0.03, 0, (az + ch[2]) / 2 + 0.01],\n size: [(ch[0] - ax) / 2 + 0.08, ay + 0.065, 0.17],\n }\n : { shape: 'ellipsoid', at: [ch[0] + 0.01, 0, ch[2] + 0.02], size: [0.09, mw * 0.9, 0.11] };\n const out: SculptEdit[] = [\n {\n group: [\n mass,\n // Chin volume: the beard grows forward and down off the chin.\n {\n shape: 'ellipsoid',\n at: [ch[0] + 0.025, 0, ch[2] - 0.03],\n size: [0.08, full ? 0.13 : 0.08, 0.1],\n blend: 0.04,\n },\n // Trimmed below a cheek line that rises towards the ears.\n below([l.mouthX, 0, l.mouthZ + 0.03], full ? 28 : 0),\n // Lips carved clear.\n {\n shape: 'ellipsoid',\n at: [l.mouthX + 0.02, 0, l.mouthZ - lipT * 0.3],\n size: [0.07, mw * 1.05, lipT * 2.3],\n op: 'subtract',\n blend: 0.012,\n },\n // Clump grooves down the chin.\n ...[-0.05, 0.05].map(\n (y): SculptEdit => ({\n shape: 'capsule',\n at: [ch[0] + 0.12, y, l.mouthZ - 0.06],\n to: [ch[0] + 0.06, y * 1.3, ch[2] - 0.14],\n size: 0.008,\n op: 'subtract',\n blend: 0.012,\n mirror: false,\n }),\n ),\n ],\n color: h,\n blend: 0.012,\n },\n ];\n if (p.beard === 'braided')\n out.push({\n shape: 'capsule',\n at: [ch[0] + 0.03, 0.035, ch[2] - 0.08],\n to: [ch[0] + 0.01, 0.045, ch[2] - 0.34],\n size: 0.032,\n color: light,\n blend: 0.02,\n });\n // Moustache: from under the nose, over the lip corners, drooping past them.\n const root: Vec3 = [l.mouthX + 0.02, 0.012, l.mouthZ + lipT * 1.9];\n const bend: Vec3 = [l.mouthX - 0.005, mw * 0.85, l.mouthZ + lipT * 0.6];\n const tip = along(bend, unit([-0.4, 0.5, -1]), 0.05);\n out.push({\n group: [\n { shape: 'capsule', at: root, to: bend, size: 0.024 },\n { shape: 'capsule', at: bend, to: tip, size: 0.016, blend: 0.01 },\n ],\n color: light,\n blend: 0.008,\n });\n return out;\n}\n",
11
+ "// The bust's anatomy, cut and plinth: ribcage, pectorals, deltoids, the trapezius sloping from\n// behind the ear to the shoulder (it is what joins a head to a body), clavicles and the sternal\n// notch — all scaled by `bust.mass` (0 bony … 1 brute) — trimmed by the classic collectible-bust\n// cut (a U under the chest rising to the arms) and set on a turned socle + disc plinth.\n// Head units, mirrored across Y; `torsoForms(f, g)` grows every form by g for clothing shells.\n\nimport type { Vec3 } from '../core/index.ts';\nimport { type Field, type SculptEdit, sd } from '../primitives/index.ts';\nimport { alongX } from './head-geom.ts';\nimport type { HeadLayout } from './head-layout.ts';\nimport type { HeadParams } from './head-params.ts';\n\n/** Where the bust sits relative to the head: centre x, shoulder half-span, base, neck root… */\nexport interface BustFrame {\n readonly cx: number;\n readonly s: number;\n /** Reference z the torso is laid out from (the floor lifted by the build's hunch). */\n readonly b: number;\n /** The asset's floor: bottom of the plinth. */\n readonly floor: number;\n /** Neck root (top of the sternum), z. */\n readonly nz: number;\n readonly m: number;\n /** Neck radius. */\n readonly n: number;\n /** Where the trapezius meets the neck, z (high behind the ear on a brute). */\n readonly trapZ: number;\n /** Top of the plinth = bottom of the chest cut, z. */\n readonly cutZ: number;\n}\n\nconst sub = (a: Vec3, b: Vec3): Vec3 => [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\nconst mid = (a: Vec3, b: Vec3): Vec3 => [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2, (a[2] + b[2]) / 2];\nconst dist = (a: Vec3, b: Vec3): number => Math.hypot(...sub(a, b));\n\n/** Plinth height, head units. */\nconst PLINTH = 0.17;\n\nexport function frameOf(p: HeadParams, l: HeadLayout): BustFrame {\n const m = p.bust.mass ?? 0.5;\n // A brute's shoulders ride up round its ears (the hunch): lift the torso, lengthen the socle.\n const b = l.base + 0.06 + 0.1 * m;\n const nz = b + 0.6;\n return {\n cx: l.cranium.at[0] + p.jaw.muzzle * 0.3,\n s: p.bust.shoulders,\n b,\n floor: l.base,\n nz,\n m,\n n: p.neck.radius,\n trapZ: nz + 0.12 + (l.hinge[1] - 0.2 - nz - 0.12) * m,\n cutZ: l.base + PLINTH + 0.06 + 0.1 * m,\n };\n}\n\n/** Anatomy volumes (plain adds), every one grown by `g`. */\nexport function torsoForms(f: BustFrame, g = 0): SculptEdit[] {\n const { cx, s, b, m, n } = f;\n const grow = (r: Vec3): Vec3 => [r[0] + g, r[1] + g, r[2] + g];\n const top: Vec3 = [cx - 0.12, n * 0.5, f.trapZ];\n const acromion: Vec3 = [cx - 0.05, s * 0.78, b + 0.62 + 0.05 * m];\n return [\n // Ribcage: the barrel everything hangs on.\n {\n shape: 'ellipsoid',\n at: [cx - 0.05, 0, b + 0.36],\n size: grow([0.25 + 0.07 * m, s * 0.66, 0.38]),\n },\n // Pectorals: two slabs angled up to the shoulder; their lower edge is the chest's shadow line.\n {\n shape: 'ellipsoid',\n at: [cx + 0.1 + 0.05 * m, s * 0.27, b + 0.46 + 0.02 * m],\n size: grow([0.09 + 0.06 * m, s * 0.27, 0.11 + 0.03 * m]),\n rotate: [-12, 0, 16],\n blend: 0.05,\n },\n // Deltoids: a cap over each shoulder joint.\n {\n shape: 'ellipsoid',\n at: [cx - 0.03, s * 0.8, b + 0.5 + 0.03 * m],\n size: grow([0.13 + 0.06 * m, 0.11 + 0.05 * m, 0.16 + 0.05 * m]),\n rotate: [-18, 0, 0],\n blend: 0.08,\n },\n // Trapezius: a broad flat sheet from the neck behind the ear down to the acromion — the slope\n // of a brute (local X along the slope, Y front-back, Z its thickness).\n {\n shape: 'ellipsoid',\n at: mid(top, acromion),\n size: [dist(top, acromion) / 2 + 0.08 + g, 0.11 + 0.12 * m + g, 0.05 + 0.1 * m + g],\n rotate: alongX(sub(acromion, top)),\n blend: 0.08 + 0.08 * m,\n },\n // Upper arm: a stump the bust cut ends, filling the shoulder under any pauldron.\n {\n shape: 'capsule',\n at: [cx - 0.04, s * 0.8, b + 0.55],\n to: [cx - 0.02, s * 0.9, b + 0.05],\n size: 0.12 + 0.05 * m + g,\n blend: 0.06,\n },\n // Clavicles: a bony ridge from the sternal notch out to the shoulder (clothes drape over it).\n {\n shape: 'capsule',\n at: [cx + 0.2 + 0.04 * m, 0.045, f.nz - 0.03],\n to: [cx + 0.0, s * 0.68, b + 0.6 + 0.04 * m],\n size: 0.02 + 0.006 * (1 - m) + g,\n blend: 0.035,\n },\n // Latissimus: widens the back under the armpit (a V-taper on a brute).\n {\n shape: 'ellipsoid',\n at: [cx - 0.1, s * 0.55, b + 0.3],\n size: grow([0.17 + 0.05 * m, 0.12 + 0.1 * m, 0.2]),\n blend: 0.08,\n },\n // Upper back: the hump of trapezius and rhomboids behind the neck.\n {\n shape: 'ellipsoid',\n at: [cx - 0.18, 0, f.nz + 0.04 + 0.08 * m],\n size: grow([0.12 + 0.06 * m, s * 0.32, 0.16 + 0.12 * m]),\n blend: 0.1,\n },\n ];\n}\n\n/** Signed distance to the bust-cut region (negative inside): ≈ 0 on the cut faces. */\nexport function cutField(f: BustFrame): Field {\n const rz = 0.64;\n const ry = f.s * 1.08;\n const cz = f.cutZ + rz;\n const e = sd.ellipsoid([f.cx, 0, cz], [1.6, ry, rz]);\n const box = sd.box([f.cx, 0, cz + 1], [3.2, ry * 2, 2]);\n return (q) => Math.min(e(q), box(q));\n}\n\n/** Keeps a group to the bust silhouette: the U-cut under the chest, rising to cut the arms. */\nexport function bustCut(f: BustFrame, g = 0): SculptEdit {\n const rz = 0.64;\n const ry = f.s * 1.08 + g;\n // (cutField mirrors these numbers.)\n const cz = f.cutZ + rz - g;\n return {\n group: [\n { shape: 'ellipsoid', at: [f.cx, 0, cz], size: [1.6, ry, rz] },\n { shape: 'roundBox', at: [f.cx, 0, cz + 1], size: [3.2, ry * 2, 2] },\n ],\n op: 'intersect',\n blend: 0.012,\n };\n}\n\n/** The bare body: anatomy in `color`, sternal notch and groove, then the bust cut. */\nexport function bodyEdits(p: HeadParams, f: BustFrame, color: Vec3): SculptEdit[] {\n const { cx, b, m, nz } = f;\n const shade = p.colors.shade;\n return [\n {\n group: [\n ...torsoForms(f),\n {\n shape: 'sphere',\n at: [cx + 0.24 + 0.04 * m, 0, nz - 0.04],\n size: 0.035,\n op: 'subtract',\n blend: 0.04,\n color: shade,\n },\n {\n shape: 'capsule',\n at: [cx + 0.26 + 0.06 * m, 0, b + 0.5],\n to: [cx + 0.26 + 0.05 * m, 0, b + 0.22],\n size: 0.01 + 0.006 * m,\n op: 'subtract',\n blend: 0.04,\n color: shade,\n },\n bustCut(f),\n ],\n color,\n },\n ];\n}\n\n/** Solid cylinder about Z from z0 to z1 (a capsule cut by a slab). */\nconst cylinder = (at: Vec3, r: number, z0: number, z1: number): SculptEdit => ({\n group: [\n { shape: 'capsule', at: [at[0], at[1], z0 - r], to: [at[0], at[1], z1 + r], size: r },\n {\n shape: 'roundBox',\n at: [at[0], at[1], (z0 + z1) / 2],\n size: [4, 4, z1 - z0],\n op: 'intersect',\n },\n ],\n});\n\n/** A turned plinth: wide disc with a bead moulding, then a narrower socle up to the chest cut.\n * Both start below the floor, so the bust's flat base cut alone makes the underside. */\n/** `minT`: floor for the disc's thickness (≈ a cell), so far LODs keep the bust on the ground. */\nexport function plinthEdits(p: HeadParams, f: BustFrame, minT = 0): SculptEdit[] {\n const c = p.colors.plinth ?? ([0.16, 0.15, 0.15] as Vec3);\n const light: Vec3 = [c[0] * 1.35, c[1] * 1.35, c[2] * 1.35];\n const x = f.cx - 0.04;\n const R = 0.3 + 0.08 * f.s;\n // Coarse cells would lose a thin disc: one solid drum from the floor to the chest cut instead.\n if (minT > 0.07)\n return [\n { ...cylinder([x, 0, 0], R * 1.05, f.floor - 0.1, f.cutZ + 0.02), color: c, mirror: false },\n ];\n const disc = f.floor + 0.07;\n return [\n { ...cylinder([x, 0, 0], R, f.floor - 0.1, disc), color: c, mirror: false },\n {\n shape: 'torus',\n at: [x, 0, disc],\n size: [R - 0.03, 0.025],\n color: light,\n blend: 0.01,\n mirror: false,\n },\n {\n ...cylinder([x, 0, 0], R * 0.62, disc, f.cutZ + 0.02),\n color: c,\n blend: 0.02,\n mirror: false,\n },\n ];\n}\n",
12
+ "// The orc's armoured bust gear as sculpt groups: plate pauldrons built like real armour — a domed\n// shoulder cap and two shingled lames, each a hollow shell (so its edge shows a thickness and a\n// shadowed underside) with a rolled rim, a raised crest and bone spikes along it, rivets — plus a\n// leather baldric that hugs the chest (a shell of the torso ∩ a diagonal slab) with an iron buckle,\n// and a fur mantle of clumped, tapering strands over the trapezius. Head units, mirrored across Y.\n\nimport type { Vec3 } from '../core/index.ts';\nimport type { SculptEdit } from '../primitives/index.ts';\nimport { alongZ, unit } from './head-geom.ts';\nimport type { HeadParams } from './head-params.ts';\nimport { type BustFrame, bustCut, torsoForms } from './head-torso.ts';\n\nconst RAD = Math.PI / 180;\nconst shade = (c: Vec3, k: number): Vec3 => [c[0] * k, c[1] * k, c[2] * k];\n\n/** Half-space kept above the plane through `p` whose normal is +Z rolled `deg` about X. */\nconst above = (p: Vec3, deg: number): SculptEdit => {\n const n: Vec3 = [0, -Math.sin(deg * RAD), Math.cos(deg * RAD)];\n return {\n shape: 'roundBox',\n at: [p[0] + n[0], p[1] + n[1], p[2] + n[2]],\n size: [4, 4, 2],\n rotate: [deg, 0, 0],\n op: 'intersect',\n };\n};\n\n/** Thin slab (thickness `t`) through `p`, normal +Z rolled `deg` about X. */\nconst slab = (p: Vec3, deg: number, t: number): SculptEdit => ({\n shape: 'roundBox',\n at: p,\n size: [4, 4, t],\n rotate: [deg, 0, 0],\n op: 'intersect',\n});\n\nconst ell = (at: Vec3, r: Vec3, g: number, roll: number): SculptEdit => ({\n shape: 'ellipsoid',\n at,\n size: [r[0] + g, r[1] + g, r[2] + g],\n rotate: [roll, 0, 0],\n});\n\n/** One plate: a shell of thickness `t` trimmed above a tilted plane, with a rolled rim. */\nfunction plate(\n at: Vec3,\n r: Vec3,\n roll: number,\n cut: Vec3,\n tilt: number,\n c: Vec3,\n t: number,\n): SculptEdit[] {\n return [\n {\n group: [\n ell(at, r, 0, roll),\n // Hollow only while the shell is thinner than the plate itself (fine LODs).\n ...(t < Math.min(...r) * 0.6 ? [{ ...ell(at, r, -t, roll), op: 'subtract' as const }] : []),\n above(cut, tilt),\n ],\n color: c,\n blend: 0.006,\n },\n {\n group: [\n ell(at, r, 0.022, roll),\n ...(t < Math.min(...r) * 0.6\n ? [{ ...ell(at, r, -t * 0.8, roll), op: 'subtract' as const }]\n : []),\n slab(cut, tilt, 0.05),\n ],\n // Worn edge: the rim catches the light (a painter's edge highlight).\n color: shade(c, 1.3),\n blend: 0.006,\n },\n ];\n}\n\n/** `cell`: the bust's sculpt cell; plates thicken to ≈ 2.5 cells so far LODs stay closed. */\nexport function armour(p: HeadParams, f: BustFrame, cell = 0): SculptEdit[] {\n const t = Math.max(0.085, cell * 2.5);\n const c = p.colors;\n const { cx, s, b, nz } = f;\n const metal = c.metal;\n const out: SculptEdit[] = [];\n // Pauldron: a big shoulder cap, then two lames shingled out and down over the arm.\n const cap: Vec3 = [cx - 0.04, s * 0.8, b + 0.66];\n for (let k = 1; k >= 0; k--) {\n const at: Vec3 = [cap[0], cap[1] + k * 0.07 * s, cap[2] - k * 0.17];\n const r: Vec3 = k === 0 ? [0.27, 0.29, 0.25] : [0.23, 0.25, 0.19];\n const tilt = -(38 + k * 14);\n const cut: Vec3 = [at[0], at[1], at[2] - r[2] * 0.45];\n out.push(...plate(at, r, -25 - k * 10, cut, tilt, shade(metal, 1 - k * 0.15), t));\n // Rivets along each plate's rim.\n for (let j = 0; j < 4; j++) {\n const x = at[0] + (j - 1.5) * 0.12;\n out.push({\n shape: 'sphere',\n at: [x, at[1] + r[1] * 0.62, cut[2] + 0.02 - r[1] * 0.62 * Math.tan(-tilt * RAD) * 0.4],\n size: 0.017,\n color: shade(metal, 1.35),\n blend: 0.004,\n });\n }\n }\n // Crest along the cap's crown, bone spikes rising out of it.\n const crest: Vec3 = [cap[0], cap[1] - 0.03, cap[2] + 0.25];\n out.push({\n shape: 'ellipsoid',\n at: crest,\n size: [0.25, 0.028, 0.07],\n rotate: [-22, 0, 0],\n color: shade(metal, 0.75),\n blend: 0.02,\n });\n for (let k = 0; k < 3; k++)\n out.push({\n shape: 'cone',\n at: [crest[0] - 0.14 + k * 0.14, crest[1] + 0.01, crest[2] + 0.02 - Math.abs(k - 1) * 0.03],\n size: [0.075, 0.012, 0.36 - Math.abs(k - 1) * 0.12],\n rotate: alongZ(unit([(k - 1) * 0.3, 0.55, 1])),\n color: c.teeth,\n blend: 0.015,\n });\n // Baldric: a shell of the chest cut to a diagonal band over the left shoulder; iron buckle.\n const band: Vec3 = [cx, 0, b + 0.36];\n out.push(\n {\n group: [{ group: torsoForms(f, 0.03) }, slab(band, 50, 0.15), bustCut(f)],\n color: c.leather,\n blend: 0.006,\n mirror: false,\n },\n {\n group: [\n { group: torsoForms(f, 0.055) },\n bustCut(f),\n {\n shape: 'roundBox',\n at: [cx + 0.3, 0.02, b + 0.38],\n size: [0.3, 0.14, 0.14],\n rotate: [50, 0, 0],\n op: 'intersect',\n },\n {\n shape: 'ellipsoid',\n at: [cx + 0.42, 0.02, b + 0.38],\n size: [0.1, 0.04, 0.04],\n op: 'subtract',\n },\n ],\n color: shade(metal, 0.8),\n blend: 0.004,\n mirror: false,\n },\n );\n // Fur mantle over the trapezius: clumped strands fanning back and out from behind the neck.\n const fur = c.fur ?? c.leather;\n const R = f.n + 0.08;\n for (let row = 0; row < 3; row++)\n for (let i = 0; i < 8; i++) {\n const a = (-80 + i * 22 + row * 11) * RAD;\n const rr = R + row * 0.07;\n const root: Vec3 = [\n cx - 0.1 - Math.abs(Math.cos(a)) * rr * 0.9,\n Math.abs(Math.sin(a)) * rr + 0.02,\n nz + 0.16 - row * 0.05,\n ];\n const dir = unit([-0.7, Math.abs(Math.sin(a)) * 0.8, -0.55 - ((i + row) % 2) * 0.3]);\n out.push({\n shape: 'cone',\n at: root,\n size: [0.075 - row * 0.008, 0.012, 0.16 + ((i + row) % 3) * 0.04],\n rotate: alongZ(dir),\n color: (i + row) % 2 ? fur : shade(fur, 0.72),\n blend: 0.035,\n });\n }\n return out;\n}\n",
13
+ "// The scrawny tinker's garb (bust style `vest`), layered like real clothing over the bony torso:\n// a shirt shell with a V-neck (clavicles and sternal notch show through), a leather vest shell open\n// down the front, a strap across the chest with a buckle, a scarf wound round the neck and knotted\n// off-centre with hanging tails, and a cowl (a hood worn down) bunched on the back of the neck.\n// Each layer is the torso grown a little (torsoForms) and trimmed by the same bust cut.\n\nimport type { Vec3 } from '../core/index.ts';\nimport type { SculptEdit } from '../primitives/index.ts';\nimport { alongZ, unit } from './head-geom.ts';\nimport type { HeadParams } from './head-params.ts';\nimport { type BustFrame, bustCut, torsoForms } from './head-torso.ts';\n\nconst shade = (c: Vec3, k: number): Vec3 => [c[0] * k, c[1] * k, c[2] * k];\n\nexport function vest(p: HeadParams, f: BustFrame): SculptEdit[] {\n const c = p.colors;\n const { cx, s, b, nz, n } = f;\n const scarf = c.scarf ?? c.cloth;\n const hood = c.cape ?? shade(c.cloth, 0.8);\n const out: SculptEdit[] = [\n // Shirt: V-neck down to the sternum.\n {\n group: [\n { group: torsoForms(f, 0.032) },\n {\n shape: 'ellipsoid',\n at: [cx + 0.32, 0, nz + 0.01],\n size: [0.2, 0.07, 0.11],\n op: 'subtract',\n blend: 0.01,\n },\n bustCut(f),\n ],\n color: c.cloth,\n blend: 0.006,\n },\n // Vest: open down the front, the opening widening to the hem.\n {\n group: [\n { group: torsoForms(f, 0.065) },\n {\n shape: 'roundBox',\n at: [cx + 0.4, 0, b + 0.3],\n size: [0.5, 0.3, 1],\n rotate: [0, -8, 0],\n round: 0.08,\n op: 'subtract',\n blend: 0.02,\n },\n // Arm holes: the vest stops short of the shoulder tip, so the shirt shows there.\n {\n shape: 'sphere',\n at: [cx - 0.03, s * 0.98, b + 0.42],\n size: 0.17,\n op: 'subtract',\n blend: 0.02,\n },\n bustCut(f),\n ],\n color: c.leather,\n blend: 0.006,\n },\n // Strap from the right shoulder across to the left hip, with a buckle.\n {\n group: [\n { group: torsoForms(f, 0.088) },\n {\n shape: 'roundBox',\n at: [cx, 0, b + 0.38],\n size: [4, 4, 0.08],\n rotate: [-48, 0, 0],\n op: 'intersect',\n },\n bustCut(f),\n ],\n color: shade(c.leather, 0.65),\n blend: 0.004,\n mirror: false,\n },\n {\n group: [\n { group: torsoForms(f, 0.105) },\n {\n shape: 'roundBox',\n at: [cx + 0.3, -0.06, b + 0.32],\n size: [0.3, 0.1, 0.1],\n rotate: [-48, 0, 0],\n op: 'intersect',\n },\n {\n shape: 'roundBox',\n at: [cx + 0.4, -0.06, b + 0.32],\n size: [0.16, 0.05, 0.05],\n rotate: [-48, 0, 0],\n op: 'subtract',\n },\n ],\n color: c.metal,\n blend: 0.003,\n mirror: false,\n },\n // Hood worn down: a rolled rim round the neck, the bag of it lying on the upper back with\n // its dark mouth open upward, and a pointed tail hanging down the spine.\n {\n group: [\n {\n shape: 'torus',\n at: [cx - 0.1, 0, nz + 0.03],\n size: [n + 0.12, 0.06],\n rotate: [0, -28, 0],\n },\n {\n shape: 'roundBox',\n at: [cx - 1.04, 0, nz],\n size: [2, 4, 4],\n op: 'intersect',\n blend: 0.04,\n },\n ],\n color: hood,\n blend: 0.03,\n },\n {\n group: [\n { shape: 'ellipsoid', at: [cx - 0.33, 0, nz - 0.04], size: [0.13, s * 0.5, 0.25] },\n {\n shape: 'cone',\n at: [cx - 0.36, 0, nz - 0.12],\n size: [0.1, 0.015, 0.34],\n rotate: alongZ(unit([-0.35, 0, -1])),\n blend: 0.05,\n },\n {\n shape: 'ellipsoid',\n at: [cx - 0.3, 0, nz + 0.12],\n size: [0.08, s * 0.36, 0.1],\n op: 'subtract',\n blend: 0.02,\n color: shade(hood, 0.35),\n },\n ],\n color: hood,\n blend: 0.04,\n mirror: false,\n },\n // Scarf: a wrap round the neck root, a knot off-centre and two tails.\n {\n shape: 'torus',\n at: [cx - 0.04, 0, nz + 0.17],\n size: [n + 0.05, 0.065],\n rotate: [0, -12, 0],\n color: scarf,\n blend: 0.02,\n },\n ];\n const knot: Vec3 = [cx + n * 0.8, n + 0.04, nz + 0.13];\n out.push({\n shape: 'ellipsoid',\n at: knot,\n size: [0.05, 0.06, 0.05],\n color: shade(scarf, 0.85),\n blend: 0.02,\n mirror: false,\n });\n for (const [dy, len, tw] of [\n [0.3, 0.2, 0.045],\n [0.6, 0.16, 0.04],\n ] as const) {\n const dir = unit([0.3, dy, -1]);\n out.push({\n shape: 'cone',\n at: [knot[0] + 0.01, knot[1] + dy * 0.04, knot[2] - 0.02],\n size: [tw, tw * 0.7, len],\n rotate: alongZ(dir),\n color: dy > 0.5 ? scarf : shade(scarf, 0.8),\n blend: 0.015,\n mirror: false,\n });\n }\n return out;\n}\n",
14
+ "// The bust under the head: the anatomy, bust cut and plinth (head-torso.ts) plus the gear that\n// sells the race at a glance — spiked plate pauldrons and a fur mantle (orc, head-armour.ts), a\n// leather vest, scarf and cowl (goblin, head-garb.ts), a draped hood, or a tunic with mantle and\n// brooch (human). Head units, mirrored across Y; the neck itself belongs to the head.\n\nimport type { Vec3 } from '../core/index.ts';\nimport { type SculptEdit, sculptField } from '../primitives/index.ts';\nimport { armour } from './head-armour.ts';\nimport { vest } from './head-garb.ts';\nimport type { HeadLayout } from './head-layout.ts';\nimport type { HeadParams } from './head-params.ts';\nimport {\n type BustFrame,\n bodyEdits,\n bustCut,\n frameOf,\n plinthEdits,\n torsoForms,\n} from './head-torso.ts';\n\nfunction hood(p: HeadParams, cx: number, nz: number): SculptEdit[] {\n const c = p.colors;\n return [\n {\n shape: 'torus',\n at: [cx - 0.08, 0, nz + 0.04],\n size: [p.neck.radius + 0.13, 0.11],\n color: c.cloth,\n blend: 0.05,\n },\n {\n shape: 'ellipsoid',\n at: [cx - 0.36, 0, nz + 0.14],\n size: [0.16, 0.3, 0.2],\n color: c.cloth,\n blend: 0.08,\n },\n {\n shape: 'cone',\n at: [cx - 0.42, 0, nz + 0.1],\n size: [0.12, 0.02, 0.32],\n rotate: [0, -165, 0],\n color: c.cloth,\n blend: 0.05,\n },\n {\n shape: 'roundBox',\n at: [cx + 0.1, 0.32, nz - 0.02],\n size: [0.04, 0.1, 0.08],\n round: 0.01,\n rotate: [20, 0, 0],\n color: c.leather,\n blend: 0.005,\n mirror: false,\n },\n {\n shape: 'capsule',\n at: [cx + 0.18, 0.12, nz - 0.02],\n to: [cx + 0.26, 0.05, nz - 0.32],\n size: 0.018,\n color: c.leather,\n blend: 0.01,\n },\n ];\n}\n\nfunction tunic(p: HeadParams, f: BustFrame): SculptEdit[] {\n const c = p.colors;\n const { cx, s, b, nz } = f;\n const shell = (g: number): SculptEdit => ({ group: torsoForms(f, g) });\n const torso = sculptField(torsoForms(f), { color: c.cloth, mirror: 'y' }).field;\n const front = (z: number): number => {\n let x = cx + 0.7;\n for (let i = 0; i < 300 && torso([x, 0, z]) > 0; i++) x -= 0.004;\n return x;\n };\n const n = p.neck.radius;\n const axis = (z: number): Vec3 => [cx - 0.08, 0, z];\n const mantle = (g: number): SculptEdit => ({\n shape: 'ellipsoid',\n at: [cx - 0.1, 0, b + 0.45],\n size: [0.42 + g, s + 0.06 + g, 0.3 + g],\n });\n const opening: SculptEdit = {\n shape: 'ellipsoid',\n at: [cx + 0.38, 0, nz - 0.1],\n size: [0.3, s * 0.45, 0.5],\n op: 'subtract',\n blend: 0.02,\n };\n const brooch = (y: number): SculptEdit => ({\n group: [\n mantle(0.03),\n { shape: 'sphere', at: [cx + 0.17, y, b + 0.5], size: 0.065, op: 'intersect' },\n ],\n color: c.metal,\n blend: 0.004,\n });\n return [\n // Mantle: a dome over shoulders and back, cut level below, open at the front.\n {\n group: [\n mantle(0),\n { shape: 'roundBox', at: [0, 0, b + 0.3 + 1], size: [4, 4, 2], op: 'intersect' },\n opening,\n bustCut(f),\n ],\n color: c.cape ?? c.leather,\n blend: 0.01,\n },\n brooch(s * 0.4),\n // Standing collar, notched open at the throat.\n {\n group: [\n { shape: 'capsule', at: axis(nz - 0.06), to: axis(nz + 0.1), size: n + 0.08 },\n {\n shape: 'capsule',\n at: axis(nz - 0.2),\n to: axis(nz + 0.3),\n size: n + 0.02,\n op: 'subtract',\n },\n {\n shape: 'ellipsoid',\n at: [cx + 0.2, 0, nz + 0.12],\n size: [0.12, 0.08, 0.14],\n op: 'subtract',\n blend: 0.02,\n },\n ],\n color: c.leather,\n blend: 0.015,\n },\n // Leather placket with three brass buttons down the chest.\n {\n group: [\n shell(0.012),\n { shape: 'roundBox', at: [cx + 0.3, 0, b + 0.2], size: [0.4, 0.07, 0.6], op: 'intersect' },\n ],\n color: c.leather,\n blend: 0.004,\n mirror: false,\n },\n // Brass buttons seated on the chest surface (probed along −X at the midline).\n ...[0.5, 0.38, 0.26].map(\n (z): SculptEdit => ({\n shape: 'sphere',\n at: [front(b + z) + 0.014, 0, b + z],\n size: 0.028,\n color: c.metal,\n blend: 0.004,\n mirror: false,\n }),\n ),\n ];\n}\n\n/** `cell`: the bust's sculpt cell (head units), floors the plinth disc so far LODs keep it. */\nexport function bustEdits(p: HeadParams, l: HeadLayout, cell = 0): SculptEdit[] {\n const c = p.colors;\n const f = frameOf(p, l);\n const style = p.bust.style;\n const bare = style === 'pauldrons' || style === 'vest';\n const e: SculptEdit[] = [\n ...bodyEdits(p, f, bare ? c.skin : c.cloth),\n // Neck root in skin, so the head's neck seats into the bust without a cloth ring (flattened,\n // so it never pokes through the chest below the collar).\n {\n shape: 'ellipsoid',\n at: [f.cx - 0.09, 0, f.nz + 0.06],\n size: [f.n * 1.02, f.n * 1.02, 0.12],\n color: c.skin,\n blend: 0.04,\n },\n ];\n if (style === 'pauldrons') e.push(...armour(p, f, cell));\n else if (style === 'hood') e.push(...hood(p, f.cx, f.nz));\n else if (style === 'vest') e.push(...vest(p, f));\n else e.push(...tunic(p, f));\n e.push(...plinthEdits(p, f, cell * 1.5));\n // Base cut flat at z = base.\n e.push({ shape: 'roundBox', at: [0, 0, f.floor - 1], size: [4, 4, 2], op: 'subtract' });\n return e;\n}\n",
15
+ "// Tertiary head forms as edit lists: ears (added to the head after the jaw cut, so the cut never\n// clips a lobe), tusks (added to the jaw), war paint and warts (part of the skull field). Hair and\n// beards: head-hair.ts. Head units, mirrored across Y unless an edit opts out.\n\nimport type { Rng, Vec3 } from '../core/index.ts';\nimport type { SculptEdit } from '../primitives/index.ts';\nimport { along, alongX, alongZ, unit } from './head-geom.ts';\nimport type { HeadLayout } from './head-layout.ts';\nimport type { HeadParams } from './head-params.ts';\n\nconst RAD = Math.PI / 180;\n\n/** `minThick`: the blade's floor thickness (≈ a cell), so far LODs keep their ears attached. */\nexport function earEdits(p: HeadParams, l: HeadLayout, minThick = 0): SculptEdit[] {\n const { length, width, sweep, lift, shape } = p.ears;\n const cx = l.cranium.at[0];\n const ry = l.cranium.r[1];\n const root: Vec3 = [cx + 0.02, ry * 0.9, l.eye[2] - 0.05];\n const d = unit([-Math.sin(sweep * RAD), Math.cos(sweep * RAD), Math.tan(lift * RAD)]);\n const rot = alongX(d, shape === 'pointed' ? -10 : 0);\n const thick = Math.max(0.022 + width * 0.06, minThick);\n const front: Vec3 = [Math.cos(sweep * RAD), Math.sin(sweep * RAD), 0];\n const shade = p.colors.shade;\n if (shape === 'round') {\n // A human/dwarf ear: upright oval, the long axis vertical, set just behind the jaw hinge.\n const at = along(root, d, 0.03);\n const rot2: Vec3 = [0, -lift, 90 + sweep];\n return [\n { shape: 'ellipsoid', at, size: [width / 2, thick, length / 2], rotate: rot2, blend: 0.02 },\n {\n shape: 'ellipsoid',\n at: along(along(at, d, thick * 0.6), front, 0.004),\n size: [width * 0.3, thick * 0.55, length * 0.3],\n rotate: rot2,\n op: 'subtract',\n blend: 0.012,\n color: shade,\n },\n {\n shape: 'ellipsoid',\n at: [at[0], at[1] + thick * 0.4, at[2] - length * 0.33],\n size: [width * 0.24, thick * 0.9, length * 0.16],\n blend: 0.015,\n },\n ];\n }\n // A pointed leaf ear: broad root blade, tapering tip blade, a hollow facing forward.\n return [\n {\n shape: 'ellipsoid',\n at: along(root, d, length * 0.3),\n size: [length * 0.36, thick, width * 0.5],\n rotate: rot,\n blend: 0.03,\n },\n {\n shape: 'ellipsoid',\n at: along(root, d, length * 0.68),\n size: [length * 0.34, thick * 0.75, width * 0.22],\n rotate: rot,\n blend: 0.04,\n },\n {\n shape: 'ellipsoid',\n at: along(along(root, d, length * 0.42), front, thick * 0.85),\n size: [length * 0.36, thick * 0.6, width * 0.3],\n rotate: rot,\n op: 'subtract',\n blend: 0.015,\n color: shade,\n },\n { shape: 'sphere', at: root, size: 0.04, blend: 0.03 },\n ];\n}\n\n/** Lower tusks rising from the jaw past the upper lip, curving out and back (3 cone segments). */\n/** `minR`: radius floor (≈ half a cell) so far LODs keep the tusks. */\nexport function tuskEdits(p: HeadParams, l: HeadLayout, minR = 0): SculptEdit[] {\n const t = p.tusks;\n if (!t) return [];\n const out: SculptEdit[] = [];\n let at: Vec3 = [l.mouthX - 0.03 + p.jaw.underbite * 0.5, t.spread, l.mouthZ - 0.02];\n let dir = unit([0.25, t.flare * 0.5, 1]);\n const seg = t.length / 3;\n for (let i = 0; i < 3; i++) {\n const r0 = Math.max(t.radius * (1 - i / 3.4), minR);\n const r1 = Math.max(t.radius * (1 - (i + 1) / 3.4), minR * 0.6);\n out.push({\n shape: 'cone',\n at,\n size: [r0, Math.max(r1, 0.004), seg * 1.05],\n rotate: alongZ(dir),\n color: p.colors.teeth,\n blend: i === 0 ? 0.02 : 0.004,\n });\n at = along(at, dir, seg);\n dir = unit([dir[0] - 0.22, dir[1] + t.flare * 0.15, dir[2]]);\n }\n return out;\n}\n\n/** War paint: thin deep ellipsoids painted through the skin, so each stripe is a clean band of\n * constant width wherever it crosses the surface — two claw marks per cheek, a crest stripe up\n * the forehead, three down the chin. */\nexport function paintEdits(p: HeadParams, l: HeadLayout): SculptEdit[] {\n const c = p.colors.paint;\n if (!c) return [];\n const [ex, ey, ez] = l.eye;\n const band = (at: Vec3, r: Vec3, mirror = true, tilt = 0): SculptEdit => ({\n shape: 'ellipsoid',\n at,\n size: r,\n rotate: [tilt, 0, 0],\n op: 'paint',\n color: c,\n blend: 0.006,\n mirror,\n });\n const chinZ = (l.mouthZ + l.chin[2]) / 2 - 0.02;\n return [\n band([ex + 0.1, ey - 0.035, ez - 0.13], [0.45, 0.016, 0.09], true, -8),\n band([ex + 0.1, ey + 0.035, ez - 0.12], [0.45, 0.016, 0.085], true, -8),\n band([l.cranium.at[0], 0, l.browZ + 0.14], [0.6, 0.028, 0.13], false),\n band([l.chin[0], 0, chinZ], [0.4, 0.012, 0.06], false),\n band([l.chin[0], 0.055, chinZ], [0.4, 0.012, 0.05]),\n ];\n}\n\n/** Seeded warts and bumps on the cranium and cheeks. */\nexport function wartEdits(p: HeadParams, l: HeadLayout, rng: Rng): SculptEdit[] {\n const cx = l.cranium.at[0];\n const [rx, ry, rz] = l.cranium.r;\n return Array.from({ length: p.warts }, (): SculptEdit => {\n const yaw = rng.range(-1.2, 1.2);\n const el = rng.range(-0.1, 0.9);\n const at: Vec3 = [\n cx + rx * Math.cos(el) * Math.cos(yaw),\n ry * Math.cos(el) * Math.sin(yaw),\n l.cranium.at[2] + rz * Math.sin(el),\n ];\n return {\n shape: 'sphere',\n at,\n size: rng.range(0.008, 0.016),\n color: p.colors.shade,\n blend: 0.01,\n mirror: false,\n };\n });\n}\n",
16
+ "// Lips and mouth as edit lists, part of the skull field: upper and lower lip pads (the lower one\n// pushed forward by the underbite), then the opening — a thin scowl line when `grin` is low, or a\n// crescent cut (a wide smile, corners lifted) lined with small pointed teeth along the dental arch\n// when it is high. Head units, mirrored across Y.\n\nimport type { SculptEdit } from '../primitives/index.ts';\nimport { alongZ } from './head-geom.ts';\nimport type { HeadLayout } from './head-layout.ts';\nimport type { HeadParams } from './head-params.ts';\n\nexport function mouthEdits(p: HeadParams, l: HeadLayout, teeth = true): SculptEdit[] {\n const c = p.colors;\n const lipT = p.mouth.lips;\n const mw = p.mouth.width;\n const g = p.mouth.grin;\n const out: SculptEdit[] = [\n {\n shape: 'ellipsoid',\n at: [l.mouthX - 0.01, 0, l.mouthZ + lipT * 0.7],\n size: [0.032, mw, lipT],\n color: c.lips,\n blend: 0.03,\n },\n {\n shape: 'ellipsoid',\n at: [l.mouthX - 0.015 + p.jaw.underbite * 0.7, 0, l.mouthZ - lipT * 0.8],\n size: [0.034 + p.jaw.underbite * 0.3, mw * 0.85, lipT * (1.1 + p.jaw.underbite * 4)],\n color: c.lips,\n blend: 0.03,\n },\n ];\n // Far LODs carve a grin as a plain wide line: a crescent that thin folds over at coarse cells.\n if (g < 0.4 || !teeth) {\n out.push({\n shape: 'capsule',\n at: [l.mouthX + 0.05, 0, l.mouthZ],\n to: [l.mouthX - 0.03 - 0.02 * g, mw * 0.98, l.mouthZ + 0.012 + g * 0.05 - p.brow.scowl * 0.4],\n size: 0.006 + g * 0.022,\n op: 'subtract',\n blend: 0.012,\n color: c.mouth,\n });\n return out;\n }\n // A grin: the part of a wide ellipsoid below a higher one — a crescent whose horns rise.\n const h = 0.035 + g * 0.05;\n const z0 = l.mouthZ + h * 0.45;\n const back = mw * 0.55;\n out.push({\n group: [\n { shape: 'ellipsoid', at: [l.mouthX - back, 0, z0], size: [back + 0.06, mw, h] },\n {\n shape: 'ellipsoid',\n at: [l.mouthX - back + 0.02, 0, z0 + h * 0.7],\n size: [back + 0.12, mw * 1.1, h * 0.9],\n op: 'subtract',\n },\n ],\n op: 'subtract',\n blend: 0.012,\n color: c.mouth,\n });\n // A tongue fills the floor of the open mouth (so no flat jaw cut shows through the grin).\n if (teeth)\n out.push({\n shape: 'ellipsoid',\n at: [l.mouthX - back * 0.9, 0, l.mouthZ - h * 0.4],\n size: [back * 0.9, mw * 0.62, h * 0.45],\n color: [0.42, 0.12, 0.12],\n blend: 0.01,\n });\n // The grin bunches the cheeks up and out beside the mouth corners.\n out.push({\n shape: 'ellipsoid',\n at: [l.mouthX - 0.06, mw * 0.95, z0 + h * 0.6],\n size: [0.05, 0.045, 0.04 + g * 0.01],\n rotate: [-30, 0, 0],\n blend: 0.035,\n });\n // Teeth: pointed little cones along the arch — the upper row hangs, the lower row rises.\n const n = teeth ? 3 : 0;\n for (let i = 0; i < n; i++) {\n const a = (0.25 + i) * 0.36;\n const y = Math.sin(a) * mw * 0.82;\n const x = l.mouthX - 0.03 - (1 - Math.cos(a)) * back * 1.3;\n // Follow the crescent: roots just inside its upper and lower edges, corners higher.\n const lo = z0 - h * Math.sqrt(Math.max(0, 1 - (y / mw) ** 2));\n const hi = z0 + h * 0.7 - h * 0.9 * Math.sqrt(Math.max(0, 1 - (y / (mw * 1.1)) ** 2));\n const len = 0.03 + g * 0.008 - i * 0.004;\n const r = 0.014 + g * 0.004 - i * 0.0015;\n out.push(\n {\n shape: 'cone',\n at: [x, y, hi + 0.008],\n size: [r, 0.003, len],\n rotate: alongZ([0.15, 0, -1]),\n color: c.teeth,\n blend: 0.004,\n },\n {\n shape: 'cone',\n at: [x - 0.006, y * 0.97, lo - 0.008],\n size: [r * 0.85, 0.003, len * 0.6],\n rotate: alongZ([0.1, 0, 1]),\n color: c.teeth,\n blend: 0.004,\n },\n );\n }\n return out;\n}\n",
17
+ "// The skull edit list, primary → secondary forms (the ZBrush order): cranium, face plate, cheek\n// bones, muzzle, mandible + chin, neck; then sockets, brow ridge, lids, nose, lips and the mouth\n// line. Head units, mirrored across Y. The jaw cut (head-split.ts) later divides this one field\n// into the `head` and `jaw` parts, so their surfaces meet without a seam.\n\nimport type { Vec3 } from '../core/index.ts';\nimport type { SculptEdit } from '../primitives/index.ts';\nimport { alongX, alongZ, unit } from './head-geom.ts';\nimport type { HeadLayout } from './head-layout.ts';\nimport { mouthEdits } from './head-mouth.ts';\nimport type { HeadParams } from './head-params.ts';\n\n/** Brain case + face plate: the forms the eyes are seated against (head.ts probes them). */\nexport function primaryEdits(l: HeadLayout): SculptEdit[] {\n const [cx, , cz] = l.cranium.at;\n const [rx, ry, rz] = l.cranium.r;\n return [\n { shape: 'ellipsoid', at: [cx, 0, cz], size: [rx, ry, rz] },\n {\n shape: 'ellipsoid',\n at: [l.faceX - 0.19, 0, l.eye[2] - 0.03],\n size: [0.2, ry * 0.86, 0.24],\n blend: 0.08,\n },\n ];\n}\n\n/** `cell`: the sculpt cell (head units). Far LODs drop the teeth and floor the nose's radii at\n * about 0.6 cells so a long nose survives. */\nexport function skullEdits(p: HeadParams, l: HeadLayout, cell = 0): SculptEdit[] {\n const fine = cell < 0.03;\n const tipR = Math.max(p.nose.tip, cell * 0.6);\n const c = p.colors;\n const cx = l.cranium.at[0];\n const [ex, ey, ez] = l.eye;\n const r = l.eyeR;\n const mw = p.mouth.width;\n const [ax, ay, az] = l.angle;\n const [hx, hz] = l.hinge;\n const chin = l.chin;\n const tipX = l.faceX + 0.06 + p.nose.length * 0.25 + p.nose.bridge + p.jaw.muzzle * 0.5;\n const tipZ = l.noseZ + 0.035 - p.nose.hook;\n const bIn: Vec3 = [ex + r * 0.75, 0.03, l.browZ - p.brow.scowl];\n const bOut: Vec3 = [ex + r * 0.05, ey + r * 1.3, l.browZ + p.brow.scowl * 0.5];\n const e: SculptEdit[] = [\n // Primary: brain case, face plate, cheek bones, muzzle, mandible, chin, neck.\n ...primaryEdits(l),\n {\n shape: 'ellipsoid',\n at: [ex - 0.03, (ey + 0.06) * p.cheeks.width, ez - r - 0.065 * p.cheeks.size],\n size: [0.075 * p.cheeks.size, 0.07 * p.cheeks.size, 0.055 * p.cheeks.size],\n rotate: [0, 0, 25],\n blend: 0.08,\n },\n // Zygomatic arch: the cheekbone ridge running back from under the eye towards the ear.\n {\n shape: 'capsule',\n at: [ex - r * 0.2, (ey + 0.05) * p.cheeks.width, ez - r - 0.03],\n to: [cx + 0.06, l.cranium.r[1] * 0.92, ez - 0.07],\n size: 0.028 * p.cheeks.size,\n blend: 0.05,\n },\n // Maxilla: fills the midface between cheekbones, nose and muzzle.\n {\n shape: 'ellipsoid',\n at: [l.faceX - 0.13 + p.jaw.muzzle * 0.6, 0, l.noseZ + 0.01],\n size: [0.15, 0.2 * p.cheeks.width, 0.13],\n blend: 0.08,\n },\n {\n shape: 'ellipsoid',\n at: [l.mouthX - 0.13, 0, l.mouthZ + 0.02],\n size: [0.14, Math.max(mw * 1.15, 0.13), 0.12 + p.jaw.drop * 0.2],\n blend: 0.07,\n },\n // Mandible: a U of bone — body from the jaw angles to the chin, ramus up to the hinge.\n {\n shape: 'roundBox',\n at: [(ax + chin[0]) / 2 + 0.01, 0, (az + chin[2]) / 2 + 0.03],\n size: [chin[0] - ax + 0.04, ay * 1.75, 0.16 + p.jaw.drop * 0.5],\n round: 0.07,\n rotate: [0, Math.atan2(az - chin[2], chin[0] - ax) * (180 / Math.PI) * 0.6, 0],\n blend: 0.08,\n },\n {\n shape: 'capsule',\n at: [hx - 0.04, ay * 0.85, hz],\n to: [ax, ay, az],\n size: 0.055,\n blend: 0.07,\n },\n { shape: 'sphere', at: [ax + 0.02, ay * 0.95, az], size: 0.065, blend: 0.07 },\n {\n shape: 'roundBox',\n at: chin,\n size: [0.13 * p.jaw.chin, 0.18 * p.jaw.chin, 0.14 * p.jaw.chin],\n round: 0.06 * p.jaw.chin,\n blend: 0.06,\n },\n {\n shape: 'capsule',\n at: [cx + 0.02, 0, ez - 0.22],\n to: [cx - 0.05, 0, l.base + 0.45],\n size: p.neck.radius,\n blend: 0.1,\n },\n // Sternocleidomastoid: the cords from behind the ear to the throat.\n {\n shape: 'capsule',\n at: [cx - 0.03, l.cranium.r[1] * 0.68, ez - 0.28],\n to: [cx + p.neck.radius * 0.6, 0.05, l.base + 0.74],\n size: p.neck.radius * 0.26,\n blend: 0.05,\n },\n // Secondary: brow shelf (a flattened bar along the brow line, lowered inside by the scowl)\n // with the glabella knot between the eyes, then the sockets and lids.\n {\n shape: 'ellipsoid',\n at: [(bIn[0] + bOut[0]) / 2, (bIn[1] + bOut[1]) / 2, (bIn[2] + bOut[2]) / 2],\n size: [\n Math.hypot(bOut[0] - bIn[0], bOut[1] - bIn[1], bOut[2] - bIn[2]) / 2 + p.brow.ridge * 0.6,\n p.brow.ridge * 1.25,\n p.brow.ridge * 0.85,\n ],\n rotate: alongX([bOut[0] - bIn[0], bOut[1] - bIn[1], bOut[2] - bIn[2]]),\n blend: 0.05,\n },\n {\n shape: 'sphere',\n at: [bIn[0] - 0.01, 0, bIn[2] - p.brow.ridge * 0.15],\n size: p.brow.ridge * 1.05,\n blend: 0.05,\n },\n { shape: 'sphere', at: l.eye, size: r * 1.12, op: 'subtract', blend: r * 0.5, color: c.shade },\n ];\n // Lids: a shell over the eyeball, kept above (upper) / below (lower) a plane through the eye\n // centre tilted to the lid angle, so the lid edge crosses the cornea exactly at that angle.\n const lid = (deg: number, upper: boolean): SculptEdit => {\n const t = (deg * Math.PI) / 180;\n const n: Vec3 = upper ? [-Math.sin(t), 0, Math.cos(t)] : [Math.sin(t), 0, Math.cos(t)];\n const k = upper ? 1 : -1;\n return {\n group: [\n { shape: 'sphere', at: l.eye, size: r * (upper ? 1.14 : 1.1) },\n {\n shape: 'roundBox',\n at: [ex + n[0] * k, ey, ez + n[2] * k],\n size: [4, 4, 2],\n rotate: [0, upper ? -deg : deg, 0],\n op: 'intersect',\n },\n ],\n blend: r * 0.22,\n };\n };\n e.push(lid(p.eyes.lid, true), lid(p.eyes.lowerLid, false));\n // Nose: bridge (humped by `hook`), tip, wings, nostrils.\n const long = p.nose.bridge > 0.06 ? 0.65 : 1;\n const wing = Math.min(1.4, Math.max(0.55, p.nose.width / 0.065)) * long;\n const rootR = Math.max(0.02 + p.nose.width * 0.6, cell * 0.65);\n // Nostril wings sit at the nose base, however far a long nose reaches past them.\n const wingX = Math.min(tipX - p.nose.tip * 1.2, l.faceX + 0.1 + p.jaw.muzzle * 0.5);\n const noseRoot: Vec3 = [ex + r * 0.4, 0, ez - r * 0.4];\n const noseDir: Vec3 = [tipX - noseRoot[0], 0, tipZ + 0.01 - noseRoot[2]];\n const midNose: Vec3 = [\n (ex + r * 0.6 + tipX) / 2,\n 0,\n (ez - 0.02 + tipZ) / 2 + p.nose.hook * 0.3 + 0.01,\n ];\n e.push(\n {\n shape: 'cone',\n at: noseRoot,\n size: [rootR, tipR * 0.85, Math.hypot(...noseDir)],\n rotate: alongZ(noseDir),\n blend: 0.045,\n },\n {\n shape: 'sphere',\n at: midNose,\n size: ((rootR + tipR) / 2) * 0.85 + Math.max(0, p.nose.hook) * 0.12,\n blend: 0.05,\n },\n { shape: 'sphere', at: [tipX, 0, tipZ], size: tipR, blend: 0.035 },\n // A strong hook draws the tip out into a drooping point (one form, not a ball on a stick).\n ...(p.nose.hook > 0.04\n ? [\n {\n shape: 'cone',\n at: [tipX, 0, tipZ],\n size: [tipR * 0.9, 0.01, p.nose.tip + p.nose.hook * 1.2],\n rotate: alongZ([0.6, 0, -1]),\n blend: 0.03,\n } satisfies SculptEdit,\n ]\n : []),\n {\n shape: 'ellipsoid',\n at: [wingX, p.nose.width, l.noseZ + 0.02],\n size: [0.045 * wing, 0.035 * wing, 0.032 * wing],\n blend: 0.025,\n },\n {\n shape: 'ellipsoid',\n at: [Math.min(tipX - p.nose.tip * 0.6, wingX + 0.035), p.nose.width * 0.55, l.noseZ + 0.005],\n size: [0.022 * wing, 0.014 * wing, 0.012 * wing],\n op: 'subtract',\n blend: 0.008,\n color: c.mouth,\n },\n );\n e.push(...mouthEdits(p, l, fine));\n // Nasolabial fold from the nose wing towards the mouth corner.\n const fold = unit([-0.02, mw - p.nose.width, l.mouthZ - l.noseZ]);\n e.push({\n shape: 'ellipsoid',\n at: [tipX - p.nose.tip * 1.5 - 0.035, p.nose.width + 0.05, l.noseZ - 0.035],\n size: [0.08, 0.006, 0.006],\n rotate: alongX(fold),\n op: 'subtract',\n blend: 0.03,\n color: c.shade,\n });\n // Forehead creases, painted (a groove that thin is below the sculpt cell): thin discs through\n // the brow, fading where the forehead turns away.\n const [, , cz] = l.cranium.at;\n const [crx, , crz] = l.cranium.r;\n for (let i = 0; i < (p.wrinkles ?? 0); i++) {\n const z = l.browZ + 0.07 + i * 0.05;\n const x = cx + crx * Math.sqrt(Math.max(0, 1 - ((z - cz) / crz) ** 2)) + 0.005;\n e.push({\n shape: 'ellipsoid',\n at: [x, 0.06, z - 0.008],\n size: [0.05, 0.08 - i * 0.012, 0.005],\n rotate: [-14, -12, 0],\n op: 'paint',\n blend: 0.01,\n color: c.shade,\n });\n }\n return e;\n}\n",
18
+ "// Scalp hair as edit lists, part of the skull field: a top-knot, mohawk ridge, chunky swept locks\n// over a cap clipped at the hairline, wiry tufts, braids. Beards and eyebrows: head-beard.ts.\n// Head units, mirrored across Y unless an edit opts out.\n\nimport type { Vec3 } from '../core/index.ts';\nimport type { SculptEdit } from '../primitives/index.ts';\nimport { alongZ } from './head-geom.ts';\nimport type { HeadLayout } from './head-layout.ts';\nimport type { HeadParams } from './head-params.ts';\n\nconst RAD = Math.PI / 180;\n\nexport function hairEdits(p: HeadParams, l: HeadLayout): SculptEdit[] {\n const h = p.colors.hair;\n const [cx, , cz] = l.cranium.at;\n const [rx, ry, rz] = l.cranium.r;\n const top = l.crown;\n switch (p.hair) {\n case 'topknot': {\n // A warrior's knot: hair gathered at the back of the crown, bound by two iron rings, rising\n // and then falling back in a thick tapering tail to the nape.\n const root: Vec3 = [cx - 0.14, 0, top - 0.03];\n const rise: Vec3 = [cx - 0.2, 0, top + 0.13];\n const fall: Vec3 = [cx - 0.38, 0, top + 0.02];\n const tip: Vec3 = [cx - rx - 0.08, 0, cz - 0.12];\n const seg = (a: Vec3, b: Vec3, r0: number, r1: number): SculptEdit => ({\n shape: 'cone',\n at: a,\n size: [r0, r1, Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2])],\n rotate: alongZ([b[0] - a[0], b[1] - a[1], b[2] - a[2]]),\n blend: 0.03,\n });\n const ring = (at: Vec3, deg: number): SculptEdit => ({\n shape: 'torus',\n at,\n size: [0.07, 0.018],\n rotate: [0, deg, 0],\n color: p.colors.metal,\n blend: 0.004,\n });\n return [\n {\n group: [\n seg(root, rise, 0.085, 0.075),\n seg(rise, fall, 0.08, 0.07),\n seg(fall, tip, 0.07, 0.015),\n ],\n color: h,\n blend: 0.02,\n },\n ring([root[0] - 0.02, 0, root[2] + 0.06], -15),\n ring([root[0] - 0.04, 0, root[2] + 0.11], -25),\n ];\n }\n case 'mohawk':\n return Array.from({ length: 6 }, (_, i): SculptEdit => {\n const a = (-20 + i * 26) * RAD;\n return {\n shape: 'ellipsoid',\n at: [cx + Math.sin(a) * rx * 0.95, 0, cz + Math.cos(a) * rz * 0.97],\n size: [0.06, 0.035, 0.09],\n rotate: [0, (a * 180) / Math.PI - 15, 0],\n color: h,\n blend: 0.03,\n };\n });\n case 'swept': {\n // Cap clipped to a rounded hairline (face and ears carved out), then big tapered locks\n // sweeping back from the hairline — thick roots proud, tips sunk — in two shades.\n const C: Vec3 = [cx - 0.04, 0, cz + 0.04];\n const R: Vec3 = [rx + 0.035, ry + 0.04, rz + 0.02];\n const on = (az: number, el: number, lift = 0): Vec3 => [\n C[0] + (R[0] + lift) * Math.cos(el * RAD) * Math.cos(az * RAD),\n C[1] + (R[1] + lift) * Math.cos(el * RAD) * Math.sin(az * RAD),\n C[2] + (R[2] + lift) * Math.sin(el * RAD),\n ];\n const light: Vec3 = [h[0] * 1.45, h[1] * 1.45, h[2] * 1.45];\n // A lock hugs the cap: two tapering cones root → mid → tip, mid on the surface.\n const cone = (a: Vec3, b: Vec3, r0: number, r1: number): SculptEdit => ({\n shape: 'cone',\n at: a,\n size: [r0, r1, Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2])],\n rotate: alongZ([b[0] - a[0], b[1] - a[1], b[2] - a[2]]),\n });\n const lock = (az: number, el: number, len: number, r: number, i: number): SculptEdit => {\n const a = on(az, el, -0.005);\n const m = on(az + len * 0.3, el - len * 0.45, -0.012);\n const b = on(az + len * 0.6, el - len, -0.045);\n return {\n group: [cone(a, m, r, r * 0.75), cone(m, b, r * 0.75, r * 0.15)],\n color: i % 2 ? h : light,\n blend: 0.035,\n ...(az === 0 ? { mirror: false } : {}),\n };\n };\n return [\n {\n group: [\n { shape: 'ellipsoid', at: C, size: R },\n {\n shape: 'ellipsoid',\n at: [l.faceX + 0.12, 0, l.eye[2] - 0.08],\n size: [0.34, ry * 0.92, 0.36],\n op: 'subtract',\n blend: 0.03,\n },\n {\n shape: 'ellipsoid',\n at: [cx + 0.02, ry, l.eye[2] - 0.08],\n size: [0.13, 0.25, 0.16],\n op: 'subtract',\n blend: 0.03,\n },\n ],\n color: h,\n blend: 0.012,\n },\n lock(0, 44, 50, 0.07, 1),\n lock(22, 46, 50, 0.07, 0),\n lock(45, 40, 45, 0.068, 1),\n lock(70, 34, 40, 0.06, 0),\n lock(95, 30, 35, 0.055, 1),\n lock(120, 30, 30, 0.05, 0),\n ];\n }\n case 'tufts': {\n // Wispy strands: a few thin, curling wisps on the crown and over the ears, each a root cone\n // and a finer tip cone bent back — straggly, not a brush.\n const out: SculptEdit[] = [];\n const spots: ReadonlyArray<readonly [number, number, number]> = [\n [10, 78, 0.26],\n [-25, 70, 0.22],\n [40, 62, 0.22],\n [150, 55, 0.2],\n [115, 30, 0.2],\n [100, 16, 0.18],\n [-120, 40, 0.18],\n ];\n for (const [az, el, len] of spots) {\n const a = az * RAD;\n const e = el * RAD;\n const n: Vec3 = [Math.cos(e) * Math.cos(a), Math.cos(e) * Math.sin(a), Math.sin(e)];\n const root: Vec3 = [cx - 0.04 + rx * 0.97 * n[0], ry * 0.97 * n[1], cz + rz * 0.97 * n[2]];\n const d1: Vec3 = [n[0] - 0.6, n[1] * 1.3, n[2] * 0.6 + 0.25];\n const l1 = Math.hypot(...d1);\n const mid: Vec3 = [\n root[0] + (d1[0] / l1) * len * 0.55,\n root[1] + (d1[1] / l1) * len * 0.55,\n root[2] + (d1[2] / l1) * len * 0.55,\n ];\n const d2: Vec3 = [d1[0] - 0.5, d1[1] * 1.6, -0.9];\n out.push({\n group: [\n { shape: 'cone', at: root, size: [0.026, 0.014, len * 0.58], rotate: alongZ(d1) },\n {\n shape: 'cone',\n at: mid,\n size: [0.015, 0.004, len * 0.6],\n rotate: alongZ(d2),\n blend: 0.008,\n },\n ],\n color: h,\n blend: 0.012,\n mirror: az !== 10 && az !== -25 && az !== -120,\n });\n }\n return out;\n }\n case 'braids':\n return [\n { ...capOf(l, h) },\n {\n shape: 'capsule',\n at: [cx - 0.2, ry * 0.7, cz - 0.1],\n to: [cx - 0.1, ry * 0.8, cz - 0.6],\n size: 0.035,\n color: h,\n blend: 0.02,\n },\n ];\n default:\n return [];\n }\n}\n\nconst capOf = (l: HeadLayout, h: Vec3): SculptEdit => ({\n shape: 'ellipsoid',\n at: [l.cranium.at[0] - 0.07, 0, l.cranium.at[2] + 0.09],\n size: [l.cranium.r[0] + 0.02, l.cranium.r[1] + 0.025, l.cranium.r[2]],\n color: h,\n blend: 0.02,\n});\n",
19
+ "// Head landmarks from params: where the cranium, eyes, brow, nose base, mouth, chin, jaw hinge and\n// jaw angle sit, in head units (x front, y left, z up; z 0 = chin of an undropped jaw, x 0 ≈ ear\n// canal). Every edit list reads this one table, so moving the eye line moves lids, brow and nose.\n\nimport type { Vec3 } from '../core/index.ts';\nimport type { HeadParams } from './head-params.ts';\n\nexport interface HeadLayout {\n /** Cranium ellipsoid centre and radii. */\n readonly cranium: { readonly at: Vec3; readonly r: Vec3 };\n /** Forehead front at the eye line. */\n readonly faceX: number;\n /** Left eye centre (mirror for the right) and eyeball radius. */\n readonly eye: Vec3;\n readonly eyeR: number;\n readonly browZ: number;\n readonly noseZ: number;\n readonly mouthZ: number;\n /** Front of the lips. */\n readonly mouthX: number;\n readonly chin: Vec3;\n /** Jaw hinge (x, z) — the jaw part's pivot. */\n readonly hinge: readonly [number, number];\n /** Left jaw angle (gonion). */\n readonly angle: Vec3;\n /** Top of the head, units. */\n readonly crown: number;\n /** Bottom of the bust (the asset's z = 0), units. */\n readonly base: number;\n}\n\nexport function headLayout(p: HeadParams): HeadLayout {\n const L = p.eyes.line;\n const crH = p.cranium.height;\n const rx = p.cranium.depth / 2;\n const ry = p.cranium.width / 2;\n const rz = crH * 0.8;\n const cx = -0.02 - p.jaw.muzzle * 0.4;\n const cz = L + crH * 0.2;\n const faceX = cx + rx * 0.97;\n const jut = p.jaw.muzzle;\n const eyeR = p.eyes.radius;\n const eye: Vec3 = [faceX - eyeR - p.brow.overhang, p.eyes.spacing, L];\n const noseZ = L - p.nose.length;\n const mouthZ = noseZ - 0.1 - p.jaw.drop * 0.3;\n const chinZ = -p.jaw.drop;\n const mouthX = faceX - 0.01 + jut + p.jaw.underbite * 0.3;\n return {\n cranium: { at: [cx, 0, cz], r: [rx, ry, rz] },\n faceX,\n eye,\n eyeR,\n browZ: L + eyeR * 0.9 + p.brow.ridge * 0.6,\n noseZ,\n mouthZ,\n mouthX,\n chin: [faceX - 0.07 + jut + p.jaw.underbite, 0, chinZ + 0.07 * p.jaw.chin],\n hinge: [cx + 0.04, L - 0.09],\n angle: [cx - 0.02, p.jaw.width, 0.15 - p.jaw.drop * 0.6],\n crown: cz + rz,\n base: -0.85 - p.jaw.drop * 0.5,\n };\n}\n",
20
+ "// Seamless split: a mesher rounds the edge where the jaw cut meets the skin by about one cell, so\n// the head and jaw would show a groove along the cut. This pass snaps every vertex near that rim\n// back onto the exact surfaces — skin vertices onto skull = 0, cut-face vertices onto cut = 0, both\n// clamped to their side — and gives skin vertices the skull's own normal, so the two parts meet on\n// one crease line with matching shading.\n\nimport type { Mesh, Vec3 } from '../core/index.ts';\n\n/** A mutable point/vector (core's Vec3 is readonly). */\ntype P3 = [number, number, number];\n\nimport type { Field } from '../primitives/index.ts';\n\nfunction grad(f: Field, p: Vec3, e: number, out: P3): number {\n const q: P3 = [p[0], p[1], p[2]];\n const at = (dx: number, dy: number, dz: number): number => {\n q[0] = p[0] + dx;\n q[1] = p[1] + dy;\n q[2] = p[2] + dz;\n return f(q);\n };\n out[0] = (at(e, 0, 0) - at(-e, 0, 0)) / (2 * e);\n out[1] = (at(0, e, 0) - at(0, -e, 0)) / (2 * e);\n out[2] = (at(0, 0, e) - at(0, 0, -e)) / (2 * e);\n return f(p);\n}\n\n/** Newton step of `p` towards f = 0 (only when f > 0 if `onlyOutside`). */\nfunction project(f: Field, p: P3, e: number, onlyOutside: boolean): void {\n const g: P3 = [0, 0, 0];\n const v = grad(f, p, e, g);\n if (onlyOutside && v <= 0) return;\n const gg = g[0] * g[0] + g[1] * g[1] + g[2] * g[2];\n if (gg < 1e-12) return;\n for (let k = 0; k < 3; k++) p[k] = (p[k] ?? 0) - (v * (g[k] ?? 0)) / gg;\n}\n\n/** Part ≈ max(skull, side); `side` is the cut field signed so the part is where side < 0;\n * `part` is the part's full field (with ears/tusks), so their vertices are left alone. */\nexport function sharpenRim(m: Mesh, skull: Field, side: Field, part: Field, res: number): Mesh {\n const positions = new Float32Array(m.positions);\n const normals = new Float32Array(m.normals);\n const e = res * 0.25;\n const gs: P3 = [0, 0, 0];\n const gc: P3 = [0, 0, 0];\n for (let i = 0; i < positions.length; i += 3) {\n const p: P3 = [positions[i] ?? 0, positions[i + 1] ?? 0, positions[i + 2] ?? 0];\n // The cut is cheap and analytic; the skull is the costly sculpt — test the cut first.\n if (Math.abs(side(p)) > res * 2) continue;\n const c = grad(side, p, e, gc);\n const s = grad(skull, p, e, gs);\n if (Math.abs(s) > res * 2) continue;\n // Skip where an extra (ear, tusk) owns the surface.\n if (part(p) < Math.max(s, c) - res * 0.5) continue;\n const n: Vec3 = [normals[i] ?? 0, normals[i + 1] ?? 0, normals[i + 2] ?? 0];\n const ls = Math.hypot(...gs) || 1;\n const lc = Math.hypot(...gc) || 1;\n const onSkin =\n (n[0] * gs[0] + n[1] * gs[1] + n[2] * gs[2]) / ls >=\n (n[0] * gc[0] + n[1] * gc[1] + n[2] * gc[2]) / lc;\n for (let k = 0; k < 4; k++) {\n if (onSkin) {\n project(skull, p, e, false);\n project(side, p, e, true);\n } else {\n project(side, p, e, false);\n project(skull, p, e, true);\n }\n }\n // Within ~half a cell of the other surface: snap onto the crease line itself, so no bevel\n // strip (seen from outside as a dark groove) is left between skin and cut face.\n const other = onSkin ? side(p) : skull(p);\n if (other > -res * 0.6)\n for (let k = 0; k < 6; k++) {\n project(skull, p, e, false);\n project(side, p, e, false);\n }\n positions[i] = p[0];\n positions[i + 1] = p[1];\n positions[i + 2] = p[2];\n if (onSkin) {\n grad(skull, p, e, gs);\n const l = Math.hypot(...gs) || 1;\n normals[i] = gs[0] / l;\n normals[i + 1] = gs[1] / l;\n normals[i + 2] = gs[2] / l;\n }\n }\n return { ...m, positions, normals };\n}\n\n/**\n * Where a field gradient smears across a hard crease (the jaw cut at coarse cells), a vertex\n * normal can oppose its triangles; those vertices take their area-weighted face normal instead.\n */\nexport function creaseNormals(m: Mesh, minDot = 0.2): Mesh {\n const P = m.positions;\n const acc = new Float64Array(P.length);\n for (let t = 0; t < m.indices.length; t += 3) {\n const a = (m.indices[t] ?? 0) * 3;\n const b = (m.indices[t + 1] ?? 0) * 3;\n const c = (m.indices[t + 2] ?? 0) * 3;\n const ux = (P[b] ?? 0) - (P[a] ?? 0);\n const uy = (P[b + 1] ?? 0) - (P[a + 1] ?? 0);\n const uz = (P[b + 2] ?? 0) - (P[a + 2] ?? 0);\n const vx = (P[c] ?? 0) - (P[a] ?? 0);\n const vy = (P[c + 1] ?? 0) - (P[a + 1] ?? 0);\n const vz = (P[c + 2] ?? 0) - (P[a + 2] ?? 0);\n const n = [uy * vz - uz * vy, uz * vx - ux * vz, ux * vy - uy * vx];\n for (const v of [a, b, c])\n for (let k = 0; k < 3; k++) acc[v + k] = (acc[v + k] ?? 0) + (n[k] ?? 0);\n }\n const normals = new Float32Array(m.normals);\n for (let i = 0; i < normals.length; i += 3) {\n const l = Math.hypot(acc[i] ?? 0, acc[i + 1] ?? 0, acc[i + 2] ?? 0);\n if (l < 1e-20) continue;\n const f = [(acc[i] ?? 0) / l, (acc[i + 1] ?? 0) / l, (acc[i + 2] ?? 0) / l];\n const d =\n (normals[i] ?? 0) * (f[0] ?? 0) +\n (normals[i + 1] ?? 0) * (f[1] ?? 0) +\n (normals[i + 2] ?? 0) * (f[2] ?? 0);\n if (d >= minDot) continue;\n normals[i] = f[0] ?? 0;\n normals[i + 1] = f[1] ?? 0;\n normals[i + 2] = f[2] ?? 0;\n }\n return { ...m, normals };\n}\n",
21
+ "// Hand-painted tone for sculpted head/bust vertex colour: the painter's three passes done from the\n// distance field itself — cavity (crevices, folds, sockets go darker and a touch more saturated),\n// a warm key from above (top planes lifted and warmed), and a cool bounce underneath. Pure field\n// sampling at the surface point, so it is deterministic and costs ~9 field evaluations per vertex.\n\nimport type { Vec3 } from '../core/index.ts';\nimport type { Field } from '../primitives/index.ts';\n\nexport interface ToneOptions {\n /** Probe distance for the cavity test, head units (≈ the size of a fold). */\n readonly reach: number;\n /** 0 = flat colour, 1 = full painted tone. */\n readonly strength?: number;\n}\n\n/** Wraps `colorAt` with cavity darkening and a warm-top / cool-under gradient. */\nexport function toned(field: Field, colorAt: (q: Vec3) => Vec3, o: ToneOptions): (q: Vec3) => Vec3 {\n const k = o.strength ?? 1;\n const d = o.reach;\n const e = d * 0.25;\n return (q) => {\n const c = colorAt(q);\n const [x, y, z] = q;\n const gx = field([x + e, y, z]) - field([x - e, y, z]);\n const gy = field([x, y + e, z]) - field([x, y - e, z]);\n const gz = field([x, y, z + e]) - field([x, y, z - e]);\n const gl = Math.hypot(gx, gy, gz) || 1;\n const n: Vec3 = [gx / gl, gy / gl, gz / gl];\n // Cavity: walk out along the normal; a crevice brings other surface closer than the walk.\n let occ = 0;\n for (let i = 1; i <= 3; i++) {\n const t = (d * i) / 3;\n occ += Math.max(0, t - field([x + n[0] * t, y + n[1] * t, z + n[2] * t])) / t / i;\n }\n const cav = Math.min(1, occ * 2.5) * k;\n const up = n[2] * k;\n const lift = up > 0 ? 1 + up * 0.22 : 1 + up * 0.3;\n const warm: Vec3 =\n up > 0 ? [1 + up * 0.12, 1 + up * 0.05, 1 - up * 0.15] : [1 + up * 0.1, 1, 1 - up * 0.12];\n const dark = 1 - cav * 0.55;\n const lum = (c[0] + c[1] + c[2]) / 3;\n // Saturate into the crevice: push each channel away from the grey by the cavity.\n const sat = 1 + cav * 0.35;\n return [\n clamp((lum + (c[0] - lum) * sat) * dark * lift * warm[0]),\n clamp((lum + (c[1] - lum) * sat) * dark * lift * warm[1]),\n clamp((lum + (c[2] - lum) * sat) * dark * lift * warm[2]),\n ];\n };\n}\n\nconst clamp = (v: number): number => Math.min(Math.max(v, 0), 1);\n",
22
+ "// Head edit lists → meshes. One skull field is split by the jaw cutter into `head` (skull − cut,\n// smooth-unioned with the ears) and `jaw` (skull ∩ cut, with the tusks), so the two parts share\n// the exact same outer surface; their cut faces are painted mouth-dark for when the jaw opens.\n// Eyeballs are their own spheres: sclera, iris, pupil by angle from the +X gaze.\n\nimport type { Mesh, Vec3 } from '../core/index.ts';\nimport { type Field, type SculptEdit, sculptField, sd, sdf } from '../primitives/index.ts';\nimport type { HeadLayout } from './head-layout.ts';\nimport type { HeadParams } from './head-params.ts';\nimport { creaseNormals, sharpenRim } from './head-rim.ts';\nimport { toned } from './head-tone.ts';\n\n/** Cavity probe of the painted tone, head units: about one fold. */\nconst REACH = 0.05;\n/** Default plinth colour (dark slate). */\nexport const PLINTH: Vec3 = [0.16, 0.15, 0.15];\n\n/** The jaw region (head units): an ellipsoid around chin and lower lip, cut flat at the mouth\n * line. Its skin seam runs along the lips, down the marionette lines and under the chin — creases\n * a face already has — instead of across the cheek. */\nexport function jawRegion(\n p: HeadParams,\n l: HeadLayout,\n): { field: Field; centre: Vec3; radii: Vec3 } {\n const chin = l.chin;\n const reach = Math.max(p.mouth.width * 1.08, (p.tusks?.spread ?? 0) + p.mouth.width * 0.5);\n const centre: Vec3 = [l.mouthX - 0.15, 0, l.mouthZ];\n const radii: Vec3 = [Math.max(0.27, l.mouthX - chin[0] + 0.2), reach, l.mouthZ - chin[2] + 0.1];\n const e = sd.ellipsoid(centre, radii);\n return { field: (q) => Math.max(q[2] - l.mouthZ, e(q)), centre, radii };\n}\n\nconst unionBounds = (a: readonly [Vec3, Vec3], b?: readonly [Vec3, Vec3]): [Vec3, Vec3] =>\n b\n ? [\n [Math.min(a[0][0], b[0][0]), Math.min(a[0][1], b[0][1]), Math.min(a[0][2], b[0][2])],\n [Math.max(a[1][0], b[1][0]), Math.max(a[1][1], b[1][1]), Math.max(a[1][2], b[1][2])],\n ]\n : [a[0], a[1]];\n\n/** The jaw region as a sculpt group (ellipsoid ∩ below the mouth line), grown by `grow`. */\nfunction regionGroup(l: HeadLayout, r: { centre: Vec3; radii: Vec3 }, grow: number): SculptEdit {\n const cx = r.centre[0];\n const [rx, ry, rz] = r.radii;\n return {\n group: [\n { shape: 'ellipsoid', at: r.centre, size: [rx + grow, ry + grow, rz + grow] },\n {\n shape: 'roundBox',\n at: [cx, 0, l.mouthZ + grow - 1],\n size: [4, 4, 2],\n op: 'intersect',\n },\n ],\n mirror: false,\n blend: 0,\n };\n}\n\nexport interface HeadEditSet {\n readonly skull: readonly SculptEdit[];\n readonly ears: readonly SculptEdit[];\n readonly tusks: readonly SculptEdit[];\n readonly bust: readonly SculptEdit[];\n /** The bust-cut region (≈ 0 on the cut faces), painted as bare plinth material. */\n readonly bustCut?: Field;\n}\n\n/** `head` and `jaw` meshes in head units at cell size `res` (units). Each is ONE sculpt (skull +\n * ears − region, skull ∩ region + tusks), so the sculpt's range skipping covers every edit. */\nexport function headAndJaw(\n p: HeadParams,\n l: HeadLayout,\n set: HeadEditSet,\n res: number,\n): { head: Mesh; jaw: Mesh } {\n const opts = { color: p.colors.skin, mirror: 'y' as const };\n const region = jawRegion(p, l);\n const cut = region.field;\n // The jaw reaches a little past the cut and sits a hair proud of the skin, so it laps over the\n // head like a lip: no gap opens along the seam where meshing leaves the two rims a cell apart.\n const lap = res * 0.75;\n const proud = res * 0.03;\n const ears: SculptEdit[] = set.ears.length > 0 ? [{ group: set.ears, blend: 0.02 }] : [];\n const tusks: SculptEdit[] = set.tusks.length > 0 ? [{ group: set.tusks, blend: 0.01 }] : [];\n const h = sculptField(\n [...set.skull, ...ears, { ...regionGroup(l, region, 0), op: 'subtract' }],\n opts,\n );\n const jRaw = sculptField(\n [...set.skull, { ...regionGroup(l, region, lap), op: 'intersect' }, ...tusks],\n opts,\n );\n const jField: Field = (q) => jRaw.field(q) - proud;\n const mouth = p.colors.mouth;\n // Only the skin-only skull is needed near the cut (paint + rim snapping): evaluated lazily.\n const skull = sculptField(set.skull, opts).field;\n // The painted tone reads the uncut surface (skin + ears, skin + tusks): the cut faces' normals\n // would light the jaw rim up as a pale outline.\n const extra = (e: readonly SculptEdit[]): Field =>\n e.length > 0\n ? (\n (f: Field): Field =>\n (q) =>\n Math.min(skull(q), f(q))\n )(sculptField(e, opts).field)\n : skull;\n const headTone = extra(set.ears);\n const jawTone = extra(set.tusks);\n const deep = -Math.max(res * 4, 0.03);\n const paint =\n (colorAt: (q: Vec3) => Vec3) =>\n (q: Vec3): Vec3 =>\n Math.abs(cut(q)) < res * 1.5 && skull(q) < deep ? mouth : colorAt(q);\n const [ec, er] = [region.centre, region.radii];\n const jb: [Vec3, Vec3] = [\n [ec[0] - er[0] - lap, -er[1] - lap, ec[2] - er[2] - lap],\n [ec[0] + er[0] + lap, er[1] + lap, ec[2] + lap + 0.01],\n ];\n const tb = set.tusks.length > 0 ? sculptField(set.tusks, opts).bounds : undefined;\n const head = sdf({\n field: h.field,\n bounds: h.bounds,\n resolution: res,\n color: toned(headTone, paint(h.colorAt), { reach: REACH }),\n symmetry: 'y',\n });\n const jaw = sdf({\n field: jField,\n bounds: unionBounds(jb, tb),\n resolution: res,\n color: toned(jawTone, paint(jRaw.colorAt), { reach: REACH }),\n symmetry: 'y',\n });\n // Coarse cells: snapping folds triangles over, and nobody sees a seam at that distance.\n if (res > 0.03) return { head: creaseNormals(head), jaw: creaseNormals(jaw) };\n const jawSkull: Field = (q) => skull(q) - proud;\n return {\n // The head's rim lies under the jaw's lap, so only the jaw rim (the visible one) is snapped.\n head: creaseNormals(head),\n jaw: creaseNormals(sharpenRim(jaw, jawSkull, (q) => cut(q) - lap, jField, res)),\n };\n}\n\n/** A surface point lies on a cut face: on the cut boundary, facing out of the cut region. */\nfunction onCut(cut: Field, q: Vec3, n: Vec3, res: number): boolean {\n if (Math.abs(cut(q)) > res * 0.8) return false;\n const e = res * 0.5;\n const g: Vec3 = [\n cut([q[0] + e, q[1], q[2]]) - cut([q[0] - e, q[1], q[2]]),\n cut([q[0], q[1] + e, q[2]]) - cut([q[0], q[1] - e, q[2]]),\n cut([q[0], q[1], q[2] + e]) - cut([q[0], q[1], q[2] - e]),\n ];\n const l = Math.hypot(g[0], g[1], g[2]) || 1;\n return (g[0] * n[0] + g[1] * n[1] + g[2] * n[2]) / l > 0.85;\n}\n\nexport function bustMesh(p: HeadParams, set: HeadEditSet, res: number): Mesh {\n const s = sculptField(set.bust, { color: p.colors.skin, mirror: 'y' });\n const tone = toned(s.field, s.colorAt, { reach: REACH * 1.4 });\n const cut = set.bustCut;\n const base = p.colors.plinth ?? PLINTH;\n const face: Vec3 = [base[0] * 1.3, base[1] * 1.3, base[2] * 1.3];\n return sdf({\n field: s.field,\n bounds: s.bounds,\n resolution: res,\n // Cut faces read as the bare material of a sculpted bust, not as sliced layers.\n color: cut ? (q, n) => (onCut(cut, q, n, res) ? face : tone(q)) : tone,\n symmetry: 'y',\n });\n}\n\n/** Eyeball of radius `r` centred on the origin, gazing +X. */\nexport function eyeMesh(p: HeadParams, r: number, res: number): Mesh {\n const c = p.colors;\n const iris = Math.cos(0.62);\n const limbus = Math.cos(0.7);\n const pupil = Math.cos(0.3);\n return sdf({\n field: (q) => Math.hypot(q[0], q[1], q[2]) - r,\n bounds: [\n [-r * 1.3, -r * 1.3, -r * 1.3],\n [r * 1.3, r * 1.3, r * 1.3],\n ],\n resolution: res,\n color: (q) => {\n const cos = q[0] / (Math.hypot(q[0], q[1], q[2]) || 1);\n if (cos > pupil) return c.pupil;\n if (cos > iris) return c.iris;\n if (cos > limbus) return [c.iris[0] * 0.45, c.iris[1] * 0.45, c.iris[2] * 0.45];\n return c.sclera;\n },\n });\n}\n",
23
+ "// Head kind parameters: the typed knobs of a stylised head, in HEAD UNITS (1 = chin to crown of a\n// human-proportioned skull; the builder scales by `height` metres at the end), plus the guard that\n// turns an unusable set into a T3D_RECIPE_INVALID with the fix.\n\nimport { Ts23dError, type Vec3 } from '../core/index.ts';\n\nexport type EarShape = 'round' | 'pointed';\nexport type HairStyle = 'none' | 'topknot' | 'mohawk' | 'swept' | 'tufts' | 'braids';\nexport type BeardStyle = 'none' | 'short' | 'braided' | 'goatee';\nexport type BustStyle = 'pauldrons' | 'hood' | 'tunic' | 'vest';\n\nexport interface HeadColors {\n readonly skin: Vec3;\n /** Darker skin: lips edge, nostrils, inner ear, wrinkles. */\n readonly shade: Vec3;\n readonly lips: Vec3;\n readonly sclera: Vec3;\n readonly iris: Vec3;\n readonly pupil: Vec3;\n readonly teeth: Vec3;\n readonly mouth: Vec3;\n readonly hair: Vec3;\n readonly cloth: Vec3;\n readonly leather: Vec3;\n readonly metal: Vec3;\n /** Cloak / mantle over the shoulders; default `leather`. */\n readonly cape?: Vec3;\n /** Fur trim on the bust (mantle, hood lining); default `leather`. */\n readonly fur?: Vec3;\n /** War paint / tattoo stripes (orc), or none. */\n readonly paint?: Vec3;\n /** The bust's plinth (stone/wood socle); default a dark slate. */\n readonly plinth?: Vec3;\n /** Scarf / sash cloth (vest style); default `cloth`. */\n readonly scarf?: Vec3;\n}\n\nexport interface HeadParams {\n /** Chin to crown, metres (adult human ≈ 0.23). */\n readonly height: number;\n /** Full width / depth of the brain case; `height` = crown above the eye line. */\n readonly cranium: { readonly width: number; readonly depth: number; readonly height: number };\n /** Ridge radius, how far it juts past the eyes, and the scowl (inner ends lowered). */\n /** Ridge radius, overhang past the eyes, scowl (inner ends lowered), eyebrow hair radius\n * (omit or 0 = no eyebrows). */\n readonly brow: {\n readonly ridge: number;\n readonly overhang: number;\n readonly scowl: number;\n readonly hair?: number;\n };\n readonly cheeks: { readonly size: number; readonly width: number };\n /** Half-width at the jaw angle, chin size, lower-jaw jut past the upper lip, chin drop,\n * muzzle (how far mouth and jaw push forward of the brow: prognathism). */\n readonly jaw: {\n readonly muzzle: number;\n readonly width: number;\n readonly chin: number;\n readonly underbite: number;\n readonly drop: number;\n };\n /** Eye line → nose base, nostril half-width, tip radius, hook (droop), bridge projection. */\n readonly nose: {\n readonly length: number;\n readonly width: number;\n readonly tip: number;\n readonly hook: number;\n readonly bridge: number;\n };\n /** Length (root → tip), width, sweep back (deg), tilt up (deg). */\n readonly ears: {\n readonly shape: EarShape;\n readonly length: number;\n readonly width: number;\n readonly sweep: number;\n readonly lift: number;\n };\n /** Eyeball radius, centre-to-midline, eye line (fraction of height), lid angles (deg). */\n readonly eyes: {\n readonly radius: number;\n readonly spacing: number;\n readonly line: number;\n readonly lid: number;\n readonly lowerLid: number;\n };\n /** Half-width, lip thickness, grin (0 = closed line, 1 = wide toothy smile). */\n readonly mouth: { readonly width: number; readonly lips: number; readonly grin: number };\n readonly tusks: {\n readonly length: number;\n readonly radius: number;\n readonly spread: number;\n readonly flare: number;\n } | null;\n readonly neck: { readonly radius: number };\n /** Shoulder half-span, gear style, muscle mass (0 = bony and narrow … 1 = brute; default 0.5). */\n readonly bust: { readonly shoulders: number; readonly style: BustStyle; readonly mass?: number };\n readonly hair: HairStyle;\n readonly beard: BeardStyle;\n /** Wart / bump count scattered on the skin (seeded). */\n readonly warts: number;\n /** Forehead creases (0 = smooth; a goblin's worried brow has 3). */\n readonly wrinkles?: number;\n readonly colors: HeadColors;\n}\n\nconst bad = (cause: string, fix: string): never => {\n throw new Ts23dError('T3D_RECIPE_INVALID', { cause, fix });\n};\n\n/** Every number in a params object, with its path, for the finite/positive sweep. */\nfunction numbers(o: unknown, path: string, out: Array<[string, number]>): void {\n if (typeof o === 'number') out.push([path, o]);\n else if (o && typeof o === 'object' && !Array.isArray(o))\n for (const [k, v] of Object.entries(o)) numbers(v, path ? `${path}.${k}` : k, out);\n}\n\nconst SIGNED = new Set([\n 'brow.scowl',\n 'jaw.underbite',\n 'nose.hook',\n 'ears.lift',\n 'ears.sweep',\n 'nose.bridge',\n]);\nconst ZERO_OK = new Set([\n 'mouth.grin',\n 'warts',\n 'jaw.drop',\n 'jaw.muzzle',\n 'brow.overhang',\n 'brow.hair',\n 'bust.mass',\n 'wrinkles',\n]);\n\n/** Throws T3D_RECIPE_INVALID (with a fix) when `p` cannot make a head. */\nexport function checkHead(p: HeadParams): HeadParams {\n if (!(p.height >= 0.05 && p.height <= 3))\n bad(`head height ${p.height} m`, 'give height in metres, chin to crown: human 0.23, orc ≈ 0.3');\n const flat: Array<[string, number]> = [];\n numbers({ ...p, colors: undefined, height: undefined }, '', flat);\n for (const [k, v] of flat) {\n if (!Number.isFinite(v)) bad(`head param ${k} is ${v}`, 'use finite numbers (head units)');\n if (SIGNED.has(k)) continue;\n if (v < 0 || (v === 0 && !ZERO_OK.has(k)))\n bad(`head param ${k} is ${v}`, `make ${k} > 0 (head units: 1 = chin to crown)`);\n }\n const e = p.eyes;\n if (e.line < 0.3 || e.line > 0.7)\n bad(`eyes.line ${e.line}`, 'keep the eye line between 0.3 and 0.7 of the head height');\n if (e.spacing < e.radius * 1.1)\n bad(\n `eyes.spacing ${e.spacing} < eyes.radius ${e.radius} × 1.1: the eyeballs overlap`,\n 'raise eyes.spacing (centre to midline) or shrink eyes.radius',\n );\n if (e.lid <= e.lowerLid * -1 || e.lid > 80)\n bad(`eye lids ${e.lid}°/${e.lowerLid}° leave no opening`, 'use lid in (−lowerLid, 80] degrees');\n if (p.mouth.grin > 1) bad(`mouth.grin ${p.mouth.grin}`, 'grin runs 0 (closed) … 1 (wide)');\n if (p.tusks && p.tusks.length > 0.6)\n bad(`tusks.length ${p.tusks.length}`, 'tusks longer than 0.6 head units read as horns');\n return p;\n}\n",
24
+ "// Race presets for the head kind: plain `HeadParams` data in head units (1 = chin to crown) —\n// spread one and override (`{ ...orc, tusks: null }` is a tuskless orc). Original stylised designs\n// in the chunky hand-painted fantasy idiom, not copies of any game's characters. Proportions and\n// palettes are documented per recipe in recipes/<race>_head/README.md.\n\nimport { hex } from '../material/index.ts';\nimport type { HeadParams } from './head-params.ts';\n\n/** Classical proportions, slightly heroic: eye line at half height, thirds brow/nose/chin. */\nexport const human: HeadParams = {\n height: 0.23,\n cranium: { width: 0.66, depth: 0.86, height: 0.5 },\n brow: { ridge: 0.035, overhang: 0.03, scowl: 0.012, hair: 0.018 },\n cheeks: { size: 1, width: 1 },\n jaw: { muzzle: 0, width: 0.22, chin: 1.05, underbite: 0, drop: 0 },\n nose: { length: 0.18, width: 0.06, tip: 0.036, hook: 0, bridge: 0 },\n ears: { shape: 'round', length: 0.27, width: 0.15, sweep: 12, lift: 0 },\n eyes: { radius: 0.052, spacing: 0.135, line: 0.5, lid: 20, lowerLid: 30 },\n mouth: { width: 0.1, lips: 0.018, grin: 0 },\n tusks: null,\n neck: { radius: 0.27 },\n bust: { shoulders: 0.95, style: 'tunic' },\n hair: 'swept',\n beard: 'short',\n warts: 0,\n colors: {\n skin: hex('#d9a07a'),\n shade: hex('#a8644a'),\n lips: hex('#b86b5c'),\n sclera: hex('#ece6dc'),\n iris: hex('#3d6e9e'),\n pupil: hex('#141414'),\n teeth: hex('#ece2c8'),\n mouth: hex('#4a1a18'),\n hair: hex('#5a3a22'),\n cloth: hex('#2e4f8a'),\n cape: hex('#7a2420'),\n leather: hex('#6b4428'),\n metal: hex('#c9a24a'),\n },\n};\n\n/** Massive underbitten jaw, tusks, heavy brow over small deep eyes, flat broad nose, thick neck. */\nexport const orc: HeadParams = {\n height: 0.3,\n cranium: { width: 0.7, depth: 0.74, height: 0.31 },\n brow: { ridge: 0.075, overhang: 0.06, scowl: 0.04 },\n cheeks: { size: 1.3, width: 1.15 },\n jaw: { muzzle: 0.1, width: 0.4, chin: 1.3, underbite: 0.1, drop: 0.1 },\n nose: { length: 0.15, width: 0.1, tip: 0.042, hook: -0.01, bridge: -0.05 },\n ears: { shape: 'pointed', length: 0.38, width: 0.19, sweep: 30, lift: 10 },\n eyes: { radius: 0.054, spacing: 0.155, line: 0.56, lid: 10, lowerLid: 22 },\n mouth: { width: 0.17, lips: 0.034, grin: 0 },\n tusks: { length: 0.22, radius: 0.055, spread: 0.15, flare: 0.35 },\n neck: { radius: 0.38 },\n bust: { shoulders: 1.0, style: 'pauldrons', mass: 1 },\n hair: 'topknot',\n beard: 'none',\n warts: 6,\n colors: {\n skin: hex('#5c8034'),\n shade: hex('#33501e'),\n lips: hex('#4f6f30'),\n sclera: hex('#8a5a1a'),\n iris: hex('#ffb030'),\n pupil: hex('#140a06'),\n teeth: hex('#e2d6b0'),\n mouth: hex('#2a0e0c'),\n hair: hex('#231a14'),\n cloth: hex('#6b2a20'),\n leather: hex('#5a3a22'),\n metal: hex('#55524d'),\n fur: hex('#5e4a34'),\n paint: hex('#8a1c12'),\n },\n};\n\n/** Small and sly: huge leaf ears, long hooked nose, wide toothy grin, big bright eyes. */\nexport const goblin: HeadParams = {\n height: 0.19,\n cranium: { width: 0.66, depth: 0.84, height: 0.5 },\n brow: { ridge: 0.032, overhang: 0.02, scowl: 0.03 },\n cheeks: { size: 1.05, width: 1.05 },\n jaw: { muzzle: 0.05, width: 0.19, chin: 0.72, underbite: 0, drop: 0 },\n nose: { length: 0.2, width: 0.06, tip: 0.046, hook: 0.065, bridge: 0.13 },\n ears: { shape: 'pointed', length: 0.66, width: 0.3, sweep: 24, lift: 6 },\n eyes: { radius: 0.08, spacing: 0.155, line: 0.5, lid: 30, lowerLid: 20 },\n mouth: { width: 0.21, lips: 0.014, grin: 0.8 },\n tusks: null,\n neck: { radius: 0.14 },\n bust: { shoulders: 0.52, style: 'vest', mass: 0 },\n hair: 'tufts',\n beard: 'none',\n warts: 4,\n wrinkles: 3,\n colors: {\n skin: hex('#9cb84a'),\n shade: hex('#6a8a2c'),\n lips: hex('#7a8e36'),\n sclera: hex('#f0e6a0'),\n iris: hex('#e0a020'),\n pupil: hex('#120c04'),\n teeth: hex('#e8dcae'),\n mouth: hex('#3a1010'),\n hair: hex('#c8c0b0'),\n cloth: hex('#b8a47c'),\n cape: hex('#4e5e3a'),\n leather: hex('#6b4428'),\n metal: hex('#a88a4a'),\n scarf: hex('#9a3a24'),\n },\n};\n\n/** Broad and bearded: wide skull, big bulbous nose, braided beard, deep-set eyes. */\nexport const dwarf: HeadParams = {\n ...human,\n height: 0.24,\n cranium: { width: 0.74, depth: 0.86, height: 0.48 },\n brow: { ridge: 0.05, overhang: 0.05, scowl: 0.02, hair: 0.024 },\n cheeks: { size: 1.25, width: 1.1 },\n jaw: { muzzle: 0.02, width: 0.27, chin: 1.2, underbite: 0, drop: 0.02 },\n nose: { length: 0.2, width: 0.08, tip: 0.06, hook: 0.02, bridge: 0.02 },\n eyes: { radius: 0.045, spacing: 0.14, line: 0.52, lid: 10, lowerLid: 24 },\n neck: { radius: 0.34 },\n bust: { shoulders: 1.1, style: 'tunic' },\n hair: 'braids',\n beard: 'braided',\n colors: { ...human.colors, skin: hex('#d49470'), hair: hex('#8a3f1c'), cloth: hex('#4a5a2a') },\n};\n\n/** Slender and ageless: long swept-back ears, high cheekbones, fine nose, almond eyes. */\nexport const elf: HeadParams = {\n ...human,\n height: 0.235,\n cranium: { width: 0.62, depth: 0.86, height: 0.52 },\n brow: { ridge: 0.025, overhang: 0.02, scowl: -0.01, hair: 0.012 },\n cheeks: { size: 1.1, width: 1.05 },\n jaw: { muzzle: 0, width: 0.19, chin: 0.85, underbite: 0, drop: 0 },\n nose: { length: 0.18, width: 0.045, tip: 0.028, hook: 0, bridge: 0.01 },\n ears: { shape: 'pointed', length: 0.42, width: 0.16, sweep: 40, lift: 24 },\n eyes: { radius: 0.05, spacing: 0.13, line: 0.5, lid: 14, lowerLid: 22 },\n bust: { shoulders: 0.85, style: 'tunic' },\n hair: 'swept',\n beard: 'none',\n colors: {\n ...human.colors,\n skin: hex('#e8c0a0'),\n hair: hex('#e0d090'),\n iris: hex('#3a8a5a'),\n cloth: hex('#2a6a4a'),\n },\n};\n\nexport const HEADS = { human, orc, goblin, dwarf, elf } as const;\nexport type HeadPreset = keyof typeof HEADS;\n",
25
+ "// Head kind: `head(ctx, …)` sculpts a stylised fantasy head + bust from a race preset (orc, goblin,\n// human, dwarf, elf) or a full `HeadParams`, and emits the engine contract: `bust` (on z = 0),\n// `head`, `jaw` (pivot at the hinge, opens about Y), `eye_l` / `eye_r` (pivots at the eyeball\n// centres, gaze +X so an engine can aim them). Head units are scaled by `height` metres.\n// LOD policy: sculpt cell 2 % / 4.5 % / 14 % of the head height (HEAD_RES); LOD2 drops warts, wiry\n// tufts and the AO bake and floors ear/tusk thickness at about a cell so they survive. Vertex AO is\n// baked across all parts at LOD0/1 (creases, under the jaw, eye sockets).\n\nimport {\n type BuildContext,\n type Mesh,\n merge,\n place,\n type Rng,\n Ts23dError,\n type Vec3,\n} from '../core/index.ts';\nimport { bakeAo } from '../passes/index.ts';\nimport { sculptField } from '../primitives/index.ts';\nimport { beardEdits, browEdits } from './head-beard.ts';\nimport { bustEdits } from './head-bust.ts';\nimport { earEdits, paintEdits, tuskEdits, wartEdits } from './head-extras.ts';\nimport { primaryEdits, skullEdits } from './head-face.ts';\nimport { hairEdits } from './head-hair.ts';\nimport { type HeadLayout, headLayout } from './head-layout.ts';\nimport { bustMesh, eyeMesh, type HeadEditSet, headAndJaw } from './head-mesh.ts';\nimport { checkHead, type HeadParams } from './head-params.ts';\nimport { HEADS, type HeadPreset } from './head-presets.ts';\nimport { cutField, frameOf } from './head-torso.ts';\n\n/** Overrides: top-level keys replace, nested objects merge one level (`{ jaw: { underbite: 0.1 } }`). */\nexport type HeadOverrides = { readonly [K in keyof HeadParams]?: Partial<HeadParams[K]> };\n\nexport interface HeadOptions {\n readonly race?: HeadPreset | HeadParams;\n readonly params?: HeadOverrides;\n /** Part-name prefix: `orc` → `orc_head`, `orc_jaw`, `orc_eye_l` … Default none. */\n readonly prefix?: string;\n /** Where the bust base sits, metres. */\n readonly at?: Vec3;\n /** Baked jaw motion (degrees either side of rest, 0 = static pivot). Default 0. */\n readonly jawSway?: number;\n}\n\nexport interface HeadInfo {\n readonly parts: { bust: string; head: string; jaw: string; eyeL: string; eyeR: string };\n /** Overall height of bust + head, metres. */\n readonly height: number;\n readonly params: HeadParams;\n}\n\nexport function headParams(o: Pick<HeadOptions, 'race' | 'params'> = {}): HeadParams {\n const r = o.race ?? 'human';\n const base = typeof r === 'string' ? HEADS[r] : r;\n if (!base)\n throw new Ts23dError('T3D_RECIPE_INVALID', {\n cause: `unknown head race '${String(r)}'`,\n fix: `use one of ${Object.keys(HEADS).join(', ')} or pass a HeadParams object`,\n });\n const out: Record<string, unknown> = { ...base };\n for (const [k, v] of Object.entries(o.params ?? {})) {\n const was = out[k];\n out[k] =\n v && typeof v === 'object' && !Array.isArray(v) && was && typeof was === 'object'\n ? { ...was, ...v }\n : v;\n }\n return checkHead(out as unknown as HeadParams);\n}\n\n/** Moves the eyes forward/back so they sit in the face surface: probe the brain case + face\n * plate along −X at the eye, then sink the eyeball by `brow.overhang`. */\nfunction seatEyes(p: HeadParams, l: HeadLayout): HeadLayout {\n const f = sculptField(primaryEdits(l), { color: p.colors.skin }).field;\n const [, ey, ez] = l.eye;\n let x = l.faceX + 0.4;\n for (let i = 0; i < 400 && f([x, ey, ez]) > 0; i++) x -= 0.002;\n const r = l.eyeR;\n return { ...l, eye: [x - r * 0.7 - p.brow.overhang * 0.3, ey, ez] };\n}\n\n/** The bust's cell as a multiple of the head's (the bust carries less detail). */\nconst BUST_CELL = 1.6;\n\n/** Sculpt cell edge per LOD, in head units (× height = metres). */\nexport const HEAD_RES = [0.02, 0.045, 0.14] as const;\n\n/** Every edit list of a head, in head units (pure: same params + rng state → same edits). */\nexport function headEdits(\n p: HeadParams,\n rng: Rng,\n lod: 0 | 1 | 2 = 0,\n): HeadEditSet & { layout: HeadLayout } {\n const l = seatEyes(p, headLayout(p));\n const res = HEAD_RES[lod];\n const warts = lod < 2 ? wartEdits(p, l, rng) : [];\n const hair = lod < 2 || p.hair !== 'tufts' ? hairEdits(p, l) : [];\n return {\n layout: l,\n skull: [\n ...skullEdits(p, l, res),\n ...hair,\n ...browEdits(p, l),\n ...beardEdits(p, l),\n ...warts,\n ...paintEdits(p, l),\n ],\n ears: earEdits(p, l, res * 0.7),\n tusks: tuskEdits(p, l, res * 0.45),\n bust: bustEdits(p, l, res * BUST_CELL),\n bustCut: cutField(frameOf(p, l)),\n };\n}\n\nexport function head(ctx: BuildContext, o: HeadOptions = {}): HeadInfo {\n const p = headParams(o);\n const set = headEdits(p, ctx.rng.fork('head'), ctx.lod);\n const l = set.layout;\n const H = p.height;\n const res = HEAD_RES[ctx.lod];\n const { head: hm, jaw: jm } = headAndJaw(p, l, set, res);\n const bm = bustMesh(p, set, res * BUST_CELL);\n const eye = eyeMesh(p, l.eyeR, l.eyeR / ctx.pick([7, 3.5, 2.2]));\n const [ox, oy, oz] = o.at ?? [0, 0, 0];\n const toWorld = (m: Mesh, at: Vec3 = [0, 0, 0]): Mesh =>\n place(m, { scale: H, at: [ox + at[0] * H, oy + at[1] * H, oz + (at[2] - l.base) * H] });\n // Coarse LODs: the coarse socket would swallow the eyeball, so it sits a little proud.\n const ex = l.eye[0] + (ctx.lod > 0 ? res * 0.4 : 0);\n const [, ey, ez] = l.eye;\n const world = {\n bust: toWorld(bm),\n head: toWorld(hm),\n jaw: toWorld(jm),\n eye_l: toWorld(eye, [ex, ey, ez]),\n eye_r: toWorld(eye, [ex, -ey, ez]),\n };\n // AO occluders leave out the other half of the jaw split: its cut face lies flush against ours\n // and would draw a dark line along the seam.\n const occ = (skip: Mesh): Mesh => merge(Object.values(world).filter((m) => m !== skip));\n const occHead = occ(world.jaw);\n const occJaw = occ(world.head);\n const ao = (m: Mesh, by: Mesh = occHead): Mesh =>\n ctx.lod < 2\n ? bakeAo(m, { samples: ctx.pick([16, 10, 8]), radius: (0.12 * H) / 0.23, strength: 0.55 }, by)\n : m;\n const pre = o.prefix ? `${o.prefix}_` : '';\n const pivot = (x: number, y: number, z: number): Vec3 => [\n ox + x * H,\n oy + y * H,\n oz + (z - l.base) * H,\n ];\n const local = (m: Mesh, at: Vec3, by?: Mesh): Mesh =>\n place(ao(m, by), { at: [-at[0], -at[1], -at[2]] });\n const hinge = pivot(l.hinge[0], 0, l.hinge[1]);\n const eyeL = pivot(ex, ey, ez);\n const eyeR = pivot(ex, -ey, ez);\n const names = {\n bust: `${pre}bust`,\n head: `${pre}head`,\n jaw: `${pre}jaw`,\n eyeL: `${pre}eye_l`,\n eyeR: `${pre}eye_r`,\n };\n ctx.part(names.bust, ao(world.bust));\n ctx.part(names.head, ao(world.head));\n const sway = o.jawSway ?? 0;\n ctx.part(names.jaw, local(world.jaw, hinge, occJaw), {\n at: hinge,\n ...(sway > 0\n ? { motion: { kind: 'sway', axis: [0, 1, 0], degrees: sway, hz: 0.5 }, clearOf: [names.head] }\n : {}),\n });\n ctx.part(names.eyeL, local(world.eye_l, eyeL), { at: eyeL });\n ctx.part(names.eyeR, local(world.eye_r, eyeR), { at: eyeR });\n return { parts: names, height: (l.crown - l.base) * H, params: p };\n}\n",
26
+ "// A hull's lines plan as functions, no mesh: deck-edge plan (half-breadth), sheer (deck-edge\n// height), keel/stem/counter profile and the section shape at any station. Waterline at z = 0,\n// bow toward +X, x = 0 amidships. Sections are superellipse quarters (n = 2 round bilge, 4 hard\n// bilge), going V toward the ends; the stem is where the keel line rises to meet the sheer.\n\nimport { Ts23dError, type Vec3 } from '../core/index.ts';\n\nexport interface HullColors {\n /** Above the boot-top. */\n readonly topsides: Vec3;\n /** Below the waterline (antifouling). */\n readonly bottom: Vec3;\n /** The boot-top band at the waterline. Default near-black. */\n readonly boot?: Vec3;\n readonly deck: Vec3;\n /** Inside of the bulwarks and the cap rail. Default = topsides. */\n readonly bulwark?: Vec3;\n}\n\nexport interface HullOptions {\n /** Length overall at the deck, metres. */\n readonly length: number;\n /** Maximum beam at the deck edge. */\n readonly beam: number;\n /** Keel below the waterline. */\n readonly draft: number;\n /** Deck edge above the waterline amidships (lowest point of the sheer). */\n readonly freeboard: number;\n /** Sheer rise of the deck edge at [bow, stern] above amidships. Default [0.035, 0.012]·L. */\n readonly sheer?: readonly [number, number];\n /** 'round' (cruiser / tug) or 'transom' (flat stern). Default 'round'. */\n readonly stern?: 'round' | 'transom';\n /** Transom half-width as a share of the half-beam. Default 0.75. */\n readonly transomWidth?: number;\n /** Bilge: section superellipse exponent, 1.5 (soft V) … 5 (barge). Default 3. */\n readonly fullness?: number;\n /** Plan entrance exponent at the bow: 1.4 sharp … 3 bluff. Default 2. */\n readonly entrance?: number;\n /** Deck-edge breadth over waterline breadth − 1. Default 0.06. */\n readonly flare?: number;\n /** Bottom deadrise, degrees. Default 5. */\n readonly deadriseDeg?: number;\n /** Bulwark height above the deck, metres; 0 = none. Default 0. */\n readonly bulwark?: number;\n /** Deck camber at the centreline, metres. Default beam / 50. */\n readonly camber?: number;\n /** Height of the boot-top band above the waterline. Default 0.3. */\n readonly bootTop?: number;\n readonly colors: HullColors;\n /** A rubbing strake / fender along each side just below the sheer (LOD0/1). */\n readonly fender?: { readonly color: Vec3; readonly radius?: number };\n /** Waterline amidships. Default [0, 0, 0]. */\n readonly at?: Vec3;\n}\n\nexport interface HullLines {\n readonly L: number;\n /** Deck-edge half-breadth at x (outer hull). */\n readonly halfBreadth: (x: number) => number;\n /** Deck-edge height at x (sheer line), relative to the waterline. */\n readonly deck: (x: number) => number;\n /** Keel / stem / counter height at x. */\n readonly keel: (x: number) => number;\n /** Section point at x for θ ∈ [0, π/2] (0 = keel, π/2 = deck edge), starboard (y ≥ 0). */\n readonly section: (x: number, theta: number) => [number, number];\n}\n\nconst bad = (cause: string, fix: string): Ts23dError =>\n new Ts23dError('T3D_RECIPE_INVALID', { cause, fix });\n\nexport function validateHull(o: HullOptions): void {\n const dims = [o.length, o.beam, o.draft, o.freeboard];\n if (!dims.every((v) => v > 0 && Number.isFinite(v)))\n throw bad(\n `hull length/beam/draft/freeboard = ${dims.join(' / ')}`,\n 'give all four in metres, > 0 (a harbour tug: 30 / 9 / 4 / 1.2)',\n );\n if (o.beam > o.length * 0.8)\n throw bad(\n `hull beam ${o.beam} is over 0.8 × length ${o.length}`,\n 'check the numbers: length/beam is 2.5–4 for tugs, 6–9 for ships',\n );\n const n = o.fullness ?? 3;\n if (!(n >= 1.2 && n <= 8)) throw bad(`hull fullness is ${n}`, 'use 1.5 (soft V) … 5 (barge)');\n const tw = o.transomWidth ?? 0.75;\n if (!(tw > 0 && tw <= 1))\n throw bad(`hull transomWidth is ${tw}`, 'use a share 0.3–1 of the half-beam');\n}\n\nconst smooth = (t: number): number => (t <= 0 ? 0 : t >= 1 ? 1 : t * t * (3 - 2 * t));\n\nexport function hullLines(o: HullOptions): HullLines {\n validateHull(o);\n const L = o.length;\n const half = L / 2;\n const [sb, ss] = o.sheer ?? [0.035 * L, 0.012 * L];\n const round = (o.stern ?? 'round') === 'round';\n const tw = o.transomWidth ?? 0.75;\n const pe = o.entrance ?? 2;\n const n = o.fullness ?? 3;\n const flare = o.flare ?? 0.06;\n const dead = Math.tan(((o.deadriseDeg ?? 5) * Math.PI) / 180);\n // Parallel middle body and where the keel starts to rise, as shares of L.\n const xf = 0.1 * L;\n const xa = -0.15 * L;\n const kf = 0.22 * L;\n const ka = -0.25 * L;\n const deck = (x: number): number => {\n const u = x / half;\n return o.freeboard + (u > 0 ? sb : ss) * u * u;\n };\n const plan = (x: number): number => {\n if (x > xf) return 1 - ((x - xf) / (half - xf)) ** pe;\n if (x < xa) {\n const v = Math.min(1, (xa - x) / (xa + half));\n return round ? Math.sqrt(Math.max(0, 1 - v * v)) : 1 - (1 - tw) * v * v;\n }\n return 1;\n };\n const halfBreadth = (x: number): number => (o.beam / 2) * Math.max(0, plan(x));\n const counter = round ? 0.35 * o.freeboard : 0.15 * o.freeboard;\n const keel = (x: number): number => {\n if (x > kf) {\n const u = Math.min(1, (x - kf) / (half - kf));\n return -o.draft + (deck(half) + o.draft) * u ** 2;\n }\n if (x < ka) {\n const v = Math.min(1, (ka - x) / (ka + half));\n return -o.draft + (counter + o.draft) * v ** 1.6;\n }\n return -o.draft;\n };\n const section = (x: number, theta: number): [number, number] => {\n const f = plan(x);\n // Fine ends go V-sectioned; the middle body keeps the full bilge.\n const ns = 1.2 + (n - 1.2) * smooth(f / 0.8);\n const s = Math.sin(theta) ** (2 / ns);\n const c = Math.cos(theta) ** (2 / ns);\n const zk = keel(x);\n const zd = deck(x);\n const zf = 1 - c;\n const y = halfBreadth(x) * (1 - flare + flare * zf * zf) * s;\n return [y, zk + (zd - zk) * zf + dead * y * c];\n };\n return { L, halfBreadth, deck, keel, section };\n}\n\n/** θ where the section crosses height z (bisection; the section rises monotonically). */\nexport function thetaAt(lines: HullLines, x: number, z: number): number {\n let lo = 0;\n let hi = Math.PI / 2;\n if (lines.section(x, lo)[1] >= z) return lo;\n if (lines.section(x, hi)[1] <= z) return hi;\n for (let i = 0; i < 40; i++) {\n const mid = (lo + hi) / 2;\n if (lines.section(x, mid)[1] < z) lo = mid;\n else hi = mid;\n }\n return (lo + hi) / 2;\n}\n",
27
+ "// Skinning for hull-like surfaces: a station × column grid of points becomes quads with smooth\n// normals (central differences; collapsed rows such as a stem head borrow their neighbour's), and\n// any column range can be emitted as its own colour band, mirrored to port for a symmetric hull.\n\nimport type { MeshBuilder, Vec3 } from '../core/index.ts';\nimport { stripRect } from '../material/index.ts';\n\nexport type Grid = Vec3[][];\nconst sub3 = (a: Vec3, b: Vec3): Vec3 => [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\nconst cross3 = (a: Vec3, b: Vec3): Vec3 => [\n a[1] * b[2] - a[2] * b[1],\n a[2] * b[0] - a[0] * b[2],\n a[0] * b[1] - a[1] * b[0],\n];\n\n/** Smooth normals over a station × column grid (outward = tj × ti for the starboard side). */\nexport function normalsOf(g: Grid): Grid {\n const R = g.length;\n const out: Grid = g.map((row, i) =>\n row.map((p, j) => {\n const r = (k: number): Vec3[] => g[Math.max(0, Math.min(R - 1, k))] ?? row;\n const ti = sub3(r(i + 1)[j] ?? p, r(i - 1)[j] ?? p);\n const tj = sub3(row[Math.min(row.length - 1, j + 1)] ?? p, row[Math.max(0, j - 1)] ?? p);\n const n = cross3(tj, ti);\n const l = Math.hypot(...n);\n return l < 1e-9 ? ([0, 0, 0] as Vec3) : ([n[0] / l, n[1] / l, n[2] / l] as Vec3);\n }),\n );\n // Collapsed rows (stem head, round stern post) borrow the nearest row's normals.\n for (let i = 0; i < R; i++) {\n const row = out[i] ?? [];\n row.forEach((n, j) => {\n if (n[0] || n[1] || n[2]) return;\n for (let d = 1; d < R; d++) {\n const m = out[i - d]?.[j] ?? out[i + d]?.[j];\n if (m && (m[0] || m[1] || m[2])) {\n row[j] = m;\n return;\n }\n }\n });\n }\n return out;\n}\n\n/** Emit columns [j0, j1] of a starboard grid and its port mirror. */\nexport function emitBand(\n b: MeshBuilder,\n g: Grid,\n nrm: Grid,\n j0: number,\n j1: number,\n color: Vec3,\n mirror: boolean,\n): void {\n const rect = stripRect('plain');\n for (const side of mirror ? [1, -1] : [1]) {\n const ids = g.map((row, i) =>\n row.slice(j0, j1 + 1).map((p, k) => {\n const n = nrm[i]?.[j0 + k] ?? [0, 0, 1];\n return b.vertex({\n p: [p[0], p[1] * side, p[2]],\n n: [n[0], n[1] * side, n[2]],\n uv: [\n rect.u0 + p[0] / rect.metres,\n rect.v0 + (k / Math.max(1, j1 - j0)) * (rect.v1 - rect.v0),\n ],\n color,\n });\n }),\n );\n for (let i = 0; i + 1 < ids.length; i++) {\n for (let k = 0; k < j1 - j0; k++) {\n const a = ids[i]?.[k] ?? 0;\n const c = ids[i]?.[k + 1] ?? 0;\n const e = ids[i + 1]?.[k + 1] ?? 0;\n const d = ids[i + 1]?.[k] ?? 0;\n if (side > 0) b.quad(a, c, e, d);\n else b.quad(a, d, e, c);\n }\n }\n }\n}\n",
28
+ "// Vessel hulls from the lines plan (hull-lines.ts): a smooth-shaded shell skinned over stations\n// (denser toward bow and stern), split at the waterline and boot-top so the paint bands are crisp,\n// optional bulwarks with a cap rail, a cambered plank deck laid in true-scale bands fore and aft,\n// and a flat transom. Waterline at `at` z, bow +X. LOD = stations × section points, nothing else.\n\nimport {\n type BuildContext,\n type Lod,\n type Mesh,\n MeshBuilder,\n merge,\n translate,\n type Vec3,\n} from '../core/index.ts';\nimport { stripRect } from '../material/index.ts';\nimport { sweep, triangulate } from '../primitives/index.ts';\nimport { dedupe, stripScale } from './faces.ts';\nimport { type HullLines, type HullOptions, hullLines, thetaAt } from './hull-lines.ts';\nimport { emitBand, type Grid, normalsOf } from './hull-skin.ts';\n\nexport type { HullColors, HullLines, HullOptions } from './hull-lines.ts';\n\n/** Width of one deck band (one V of the wood strip); LOD2 squeezes the whole beam into one. */\nconst deckBand = (o: HullOptions, lod: Lod): number => (lod === 2 ? o.beam : stripScale('wood'));\n\n/** Plank deck between the bulwarks: bands `wood` scale wide, planks running fore and aft. */\nfunction deckMesh(o: HullOptions, ln: HullLines, xs: readonly number[], inset: number, lod: Lod) {\n const b = new MeshBuilder();\n const rect = stripRect('wood');\n const w = deckBand(o, lod);\n const camber = o.camber ?? o.beam / 50;\n const yd = (x: number): number => Math.max(0, ln.halfBreadth(x) - inset);\n for (let y0 = -Math.ceil(o.beam / 2 / w) * w; y0 < o.beam / 2; y0 += w) {\n const at = (x: number, y: number): Vec3 => {\n const h = yd(x);\n const c = Math.max(-h, Math.min(h, y));\n return [x, c, ln.deck(x) + (h > 0 ? camber * (1 - (c / h) ** 2) : 0)];\n };\n for (let i = 0; i + 1 < xs.length; i++) {\n const x0 = xs[i] ?? 0;\n const x1 = xs[i + 1] ?? 0;\n const q = [at(x0, y0), at(x0, y0 + w), at(x1, y0 + w), at(x1, y0)];\n if (\n Math.abs((q[1]?.[1] ?? 0) - (q[0]?.[1] ?? 0)) +\n Math.abs((q[2]?.[1] ?? 0) - (q[3]?.[1] ?? 0)) <\n 1e-6\n )\n continue;\n const ids = q.map((p) =>\n b.vertex({\n p,\n n: [0, 0, 1],\n uv: [rect.u0 + p[0] / rect.metres, rect.v0 + ((p[1] - y0) / w) * (rect.v1 - rect.v0)],\n color: o.colors.deck,\n }),\n );\n b.quad(ids[0] ?? 0, ids[3] ?? 0, ids[2] ?? 0, ids[1] ?? 0);\n }\n }\n return b.build();\n}\n\nexport interface HullMesh {\n /** Shell (+ bulwarks + transom). */\n readonly shell: Mesh;\n readonly deck: Mesh;\n readonly lines: HullLines;\n}\n\nexport function hullMesh(o: HullOptions, lod: Lod = 0): HullMesh {\n const ln = hullLines(o);\n const half = o.length / 2;\n const stations = [36, 18, 8][lod] ?? 8;\n const na = [6, 3, 2][lod] ?? 2;\n const nc = [4, 2, 1][lod] ?? 1;\n // Cosine spacing: stations crowd the bow and stern where the shape turns.\n const xs = Array.from(\n { length: stations + 1 },\n (_, i) => -half + (o.length * (1 - Math.cos((Math.PI * i) / stations))) / 2,\n );\n const boot = o.bootTop ?? 0.3;\n const hb = o.bulwark ?? 0;\n const tb = 0.12;\n const grid: Grid = xs.map((x) => {\n const tw = thetaAt(ln, x, 0);\n const tbt = thetaAt(ln, x, boot);\n const row: Vec3[] = [];\n const seg = (t0: number, t1: number, k: number, first: boolean) => {\n for (let i = first ? 0 : 1; i <= k; i++) {\n const [y, z] = ln.section(x, t0 + ((t1 - t0) * i) / k);\n row.push([x, y, z]);\n }\n };\n seg(0, tw, na, true);\n seg(tw, tbt, 1, false);\n seg(tbt, Math.PI / 2, nc, false);\n return row;\n });\n const nrm = normalsOf(grid);\n for (const row of nrm) {\n const n = row[0];\n if (n) {\n const l = Math.hypot(n[0], n[2]) || 1;\n row[0] = [n[0] / l, 0, n[2] / l];\n }\n }\n const b = new MeshBuilder();\n const c = o.colors;\n emitBand(b, grid, nrm, 0, na, c.bottom, true);\n emitBand(b, grid, nrm, na, na + 1, c.boot ?? [0.06, 0.06, 0.06], true);\n emitBand(b, grid, nrm, na + 1, na + 1 + nc, c.topsides, true);\n const parts = [b.build()];\n if (hb > 0) parts.push(bulwarks(o, ln, xs, hb, tb));\n if (o.fender && lod < 2) parts.push(...fenders(o.fender, ln, xs, lod));\n if ((o.stern ?? 'round') === 'transom') {\n const x = xs[0] ?? -half;\n const star = (grid[0] ?? []).map((p) => p);\n if (hb > 0) star.push([x, ln.halfBreadth(x), ln.deck(x) + hb]);\n const port = [...star].reverse().map((p): Vec3 => [p[0], -p[1], p[2]]);\n // Without bulwarks the transom's top follows the deck camber through the deck's band seams.\n const yd = ln.halfBreadth(x);\n const arc: Vec3[] = [];\n const w = deckBand(o, lod);\n for (let y = Math.ceil(o.beam / 2 / w) * w; y > -o.beam / 2; y -= w) {\n if (hb === 0 && Math.abs(y) < yd - 1e-9)\n arc.push([x, y, ln.deck(x) + (o.camber ?? o.beam / 50) * (1 - (y / yd) ** 2)]);\n }\n parts.push(transom(dedupe([...port.slice(0, -1), ...star, ...arc]), c.topsides));\n }\n const at = o.at ?? [0, 0, 0];\n return {\n shell: translate(merge(parts), at),\n deck: translate(deckMesh(o, ln, xs, hb > 0 ? tb : 0, lod), at),\n lines: ln,\n };\n}\n\n/** Bulwark: outer plate up from the deck edge, cap rail, inner face down to the deck. */\nfunction bulwarks(\n o: HullOptions,\n ln: HullLines,\n xs: readonly number[],\n hb: number,\n tb: number,\n): Mesh {\n const g: Grid = xs.map((x) => {\n const y = ln.halfBreadth(x);\n const z = ln.deck(x);\n const yi = Math.max(0, y - tb);\n return [\n [x, y, z],\n [x, y, z + hb],\n [x, yi, z + hb],\n [x, yi, z],\n ];\n });\n const b = new MeshBuilder();\n const top = o.colors.bulwark ?? o.colors.topsides;\n // Each face its own band so the corners stay crisp.\n for (const [j0, color] of [\n [0, o.colors.topsides],\n [1, top],\n [2, top],\n ] as const) {\n const sliced = g.map((row) => row.slice(j0, j0 + 2));\n emitBand(b, sliced, normalsOf(sliced), 0, 1, color, true);\n }\n return b.build();\n}\n\n/** Rubbing strake / tyre fender along each side just below the sheer. */\nfunction fenders(\n f: NonNullable<HullOptions['fender']>,\n ln: HullLines,\n xs: readonly number[],\n lod: Lod,\n) {\n const r = f.radius ?? 0.15;\n return [1, -1].map((side) =>\n sweep({\n section: { radius: r, segments: lod === 0 ? 8 : 5 },\n path: xs.map((x): Vec3 => [x, side * (ln.halfBreadth(x) + r * 0.4), ln.deck(x) - r * 1.2]),\n color: f.color,\n caps: true,\n }),\n );\n}\n\n/** Flat stern plate facing −X (ear-clipped: the bulwark notch makes it non-convex). */\nfunction transom(points: readonly Vec3[], color: Vec3): Mesh {\n const b = new MeshBuilder();\n const rect = stripRect('plain');\n const ids = points.map((p) =>\n b.vertex({ p, n: [-1, 0, 0], uv: [rect.u0 + p[1] / rect.metres, rect.v0], color }),\n );\n // CCW in (y, z) faces +X, so each triangle is reversed to face aft.\n for (const [i, j, k] of triangulate(points.map((p) => [p[1], p[2]])))\n b.tri(ids[i] ?? 0, ids[k] ?? 0, ids[j] ?? 0);\n return b.build();\n}\n\n/** Add `name` (shell) and `name_deck` parts; returns the lines for placing deckhouses and fittings. */\nexport function hull(ctx: BuildContext, o: HullOptions & { readonly name?: string }): HullLines {\n const name = o.name ?? 'hull';\n const m = hullMesh(o, ctx.lod);\n ctx.part(name, m.shell);\n ctx.part(`${name}_deck`, m.deck);\n return m.lines;\n}\n",
29
+ "// Kinds with a fixed entry point and no body yet. Each is a library of builders recipes call;\n// the roadmap slice that builds it is named in the error.\n\nimport { type BuildContext, notImplemented } from '../core/index.ts';\n\n/** Stylised creature from a skeleton + SDF flesh (Spore-like). Realistic ones go via /neural. M4. */\nexport function creature(\n _ctx: BuildContext,\n _o: { skeleton: 'biped' | 'quadruped' | 'bird'; height: number },\n): void {\n notImplemented('creature (SDF-skinned skeleton)', 'docs/idea/07-what-fits.md');\n}\n",
30
+ "// A chimney stack for `roofMesh`: brick shaft from the wall plate (hidden in the attic, so it\n// always meets the roof) to a set height above where it leaves the slope, with an oversailing\n// cap course (LOD0/1) and clay pots (LOD0). Building-regs rule of thumb: ≥ 0.9 m above the\n// highest point where it passes through the roof.\n\nimport { type Lod, type Mesh, MeshBuilder, merge, type Vec3 } from '../core/index.ts';\nimport type { StripId } from '../material/index.ts';\nimport { box, lathe } from '../primitives/index.ts';\nimport { emitFace } from './faces.ts';\n\nexport interface RoofChimney {\n /** Centre offset from the roof's `at`, world X/Y metres. */\n readonly at: readonly [number, number];\n /** Stack width (X) and depth (Y). Default [0.9, 0.6]. */\n readonly size?: readonly [number, number];\n /** Height above the highest roof point it touches. Default 0.9. */\n readonly height?: number;\n readonly color: Vec3;\n readonly strip?: StripId;\n /** Clay pots on top (LOD0). Default: one per 0.4 m of width. */\n readonly pots?: number;\n readonly potColor?: Vec3;\n}\n\nexport function chimney(\n c: RoofChimney,\n heightAt: (x: number, y: number) => number,\n at: Vec3,\n lod: Lod,\n): Mesh {\n const [w, d] = c.size ?? [0.9, 0.6];\n const cx = at[0] + c.at[0];\n const cy = at[1] + c.at[1];\n const corners: [number, number][] = [\n [cx - w / 2, cy - d / 2],\n [cx + w / 2, cy - d / 2],\n [cx + w / 2, cy + d / 2],\n [cx - w / 2, cy + d / 2],\n ];\n const exit = Math.max(...corners.map(([x, y]) => heightAt(x, y)));\n const top = exit + (c.height ?? 0.9);\n const z0 = at[2];\n const strip = c.strip ?? 'brick';\n const b = new MeshBuilder();\n corners.forEach(([x0, y0], i) => {\n const [x1, y1] = corners[(i + 1) % 4] ?? [x0, y0];\n emitFace(b, {\n points: [\n [x0, y0, z0],\n [x1, y1, z0],\n [x1, y1, top],\n [x0, y0, top],\n ],\n normal: [y1 - y0, -(x1 - x0), 0],\n up: [0, 0, 1],\n vOrigin: [0, 0, z0],\n color: c.color,\n strip,\n banded: lod < 2,\n });\n });\n emitFace(b, {\n points: corners.map(([x, y]) => [x, y, top] as Vec3),\n normal: [0, 0, 1],\n up: [0, 1, 0],\n vOrigin: [cx, cy, top],\n color: c.color,\n strip: 'plain',\n banded: false,\n });\n const parts = [b.build()];\n if (lod < 2) {\n const k = 0.06;\n const cap: Vec3 = [c.color[0] * 0.85, c.color[1] * 0.85, c.color[2] * 0.85];\n parts.push(box({ size: [w + 2 * k, d + 2 * k, 0.1], at: [cx, cy, top - 0.22], color: cap }));\n parts.push(box({ size: [w + k, d + k, 0.07], at: [cx, cy, top - 0.07], color: cap }));\n }\n if (lod === 0) {\n const n = c.pots ?? Math.max(1, Math.round(w / 0.4));\n const pot = c.potColor ?? [0.62, 0.32, 0.2];\n for (let i = 0; i < n; i++) {\n const x = cx - w / 2 + (w * (i + 0.5)) / n;\n parts.push(\n lathe({\n profile: [\n [0.13, 0],\n [0.1, 0.36],\n [0.125, 0.4],\n [0.125, 0.46],\n ],\n segments: 8,\n caps: true,\n at: [x, cy, top - 0.02],\n color: pot,\n }),\n );\n }\n }\n return merge(parts);\n}\n",
31
+ "// Roof geometry as maths, no mesh: every pitched roof here is convex, so its surface is the LOWER\n// ENVELOPE (min) of a few planes over a plan outline. Gable = 2 planes, hip/pyramid = 4, gambrel =\n// 4, mansard = 8, shed = 1. Facets are the plan cells where one plane is lowest; ridges and hips\n// fall out as the creases between them. Local frame: `a` along the ridge, `b` across it, z up from\n// the wall plate; the roof UNDERSIDE passes through the top outer edge of every wall.\n\nimport { Ts23dError, type Vec2, type Vec3 } from '../core/index.ts';\nimport type { StripId } from '../material/index.ts';\nimport { area2, clipPoly } from './faces.ts';\n\nexport type RoofType = 'gable' | 'hip' | 'pyramid' | 'mansard' | 'gambrel' | 'shed';\nexport type RoofSide = 'front' | 'back' | 'left' | 'right';\n\nexport interface RoofOptions {\n readonly type: RoofType;\n /** Wall-line width (X) and depth (Y) of the mass the roof sits on, metres. */\n readonly footprint: readonly [number, number];\n /** Main slope, degrees (the lower, steep slope of a mansard or gambrel). */\n readonly pitchDeg: number;\n /** Centre of the footprint at wall-plate height (top of the walls). */\n readonly at: Vec3;\n readonly color: Vec3;\n /** Roofing strip, laid in true-scale courses down the slope. Default 'slate'. */\n readonly strip?: StripId;\n /** Eave overhang past the walls, metres. Default 0.35. */\n readonly overhang?: number;\n /** Gable-end (rake) overhang; default = overhang. Hipped roofs ignore it. */\n readonly rake?: number;\n /** Slab thickness perpendicular to the slope (rafter + battens + slate). Default 0.18. */\n readonly thickness?: number;\n /** Ridge direction; default along the longer side. */\n readonly ridge?: 'x' | 'y';\n /** Shed only: the side the single slope falls toward. Default 'front' (+X). */\n readonly low?: RoofSide;\n /** Mansard / gambrel upper slope, degrees. Default 20 (mansard), 30 (gambrel). */\n readonly upperPitchDeg?: number;\n /** Mansard / gambrel: share of the half-span the lower slope covers in plan. Default 0.3 / 0.45. */\n readonly knee?: number;\n}\n\nexport interface Plane {\n /** z = c + ga·a + gb·b (local, relative to the wall plate). */\n readonly c: number;\n readonly ga: number;\n readonly gb: number;\n}\n\nexport interface RoofShape {\n readonly L: number;\n readonly D: number;\n /** Underside planes and the matching top planes (offset by the perpendicular thickness). */\n readonly under: readonly Plane[];\n readonly top: readonly Plane[];\n /** Plan outline at the eaves (CCW, local a/b). */\n readonly outline: readonly Vec2[];\n /** Local unit axes in world XY: a → ex, b → ey (ex × ey = +Z). */\n readonly ex: Vec2;\n readonly ey: Vec2;\n readonly thickness: number;\n}\n\nconst RAD = Math.PI / 180;\nconst FRAMES: Record<RoofSide, [Vec2, Vec2]> = {\n // Frame whose −b side faces the named world side.\n front: [\n [0, 1],\n [-1, 0],\n ],\n back: [\n [0, -1],\n [1, 0],\n ],\n left: [\n [-1, 0],\n [0, -1],\n ],\n right: [\n [1, 0],\n [0, 1],\n ],\n};\n\nconst bad = (cause: string, fix: string): Ts23dError =>\n new Ts23dError('T3D_RECIPE_INVALID', { cause, fix });\n\nexport function validateRoof(o: RoofOptions): void {\n const [w, d] = o.footprint;\n if (!(w > 0 && d > 0 && Number.isFinite(w) && Number.isFinite(d)))\n throw bad(\n `roof footprint is [${w}, ${d}]`,\n 'pass the wall-line [width X, depth Y] in metres, both > 0',\n );\n const maxPitch = o.type === 'mansard' || o.type === 'gambrel' ? 85 : 75;\n if (!(o.pitchDeg >= 3 && o.pitchDeg <= maxPitch))\n throw bad(\n `${o.type} roof pitchDeg is ${o.pitchDeg}`,\n `use 3–${maxPitch}° (slate ≥ 20°, tile 30–45°, sheet metal ≥ 3°); for a flat roof use a box`,\n );\n const t = o.thickness ?? 0.18;\n if (!(t > 0 && t < 1))\n throw bad(`roof thickness is ${t}`, 'use 0.1–0.3 m (rafter + battens + slate)');\n const ov = o.overhang ?? 0.35;\n if (!(ov >= 0 && ov < 3) || !((o.rake ?? ov) >= 0))\n throw bad(`roof overhang is ${ov}`, 'use 0–1.5 m past the wall line (0 for a party wall)');\n if (o.type === 'mansard' || o.type === 'gambrel') {\n const up = o.upperPitchDeg ?? (o.type === 'mansard' ? 20 : 30);\n if (!(up > 0 && up < o.pitchDeg))\n throw bad(\n `${o.type} upperPitchDeg ${up} is not below pitchDeg ${o.pitchDeg}`,\n 'the upper slope must be shallower than the lower one (mansard 70°/20°, gambrel 60°/30°)',\n );\n const k = o.knee ?? 0.3;\n if (!(k > 0 && k < 1))\n throw bad(`${o.type} knee is ${k}`, 'use a fraction 0.15–0.6 of the half-span');\n }\n}\n\n/** Planes of the roof UNDERSIDE for a type, in the local frame. */\nfunction underPlanes(o: RoofOptions, L: number, D: number): Plane[] {\n const tp = Math.tan(o.pitchDeg * RAD);\n const side = (s: number, c = 0, k = s): Plane[] => [\n { c: c + D * k, ga: 0, gb: -s },\n { c: c + D * k, ga: 0, gb: s },\n ];\n const ends = (s: number, c = 0, k = s): Plane[] => [\n { c: c + L * k, ga: -s, gb: 0 },\n { c: c + L * k, ga: s, gb: 0 },\n ];\n switch (o.type) {\n case 'gable':\n return side(tp);\n case 'shed':\n return [{ c: D * tp, ga: 0, gb: tp }];\n case 'hip':\n return [...side(tp), ...ends(tp)];\n case 'pyramid': {\n const h = Math.min(L, D) * tp;\n return [...side(h / D), ...ends(h / L)];\n }\n case 'gambrel':\n case 'mansard': {\n const t2 = Math.tan((o.upperPitchDeg ?? (o.type === 'mansard' ? 20 : 30)) * RAD);\n const r = (o.knee ?? (o.type === 'mansard' ? 0.3 : 0.45)) * Math.min(L, D);\n // Upper plane: z = r·tp + (D − r − |b|)·t2 → c = r·tp + (D − r)·t2 with slope t2.\n const upper = (half: number): number => r * tp + (half - r) * t2 - half * t2;\n const lower = [...side(tp), ...(o.type === 'mansard' ? ends(tp) : [])];\n const top = [\n ...side(t2, upper(D), t2),\n ...(o.type === 'mansard' ? ends(t2, upper(L), t2) : []),\n ];\n return [...lower, ...top];\n }\n }\n}\n\nexport function roofShape(o: RoofOptions): RoofShape {\n validateRoof(o);\n const [w, d] = o.footprint;\n const ridge = o.ridge ?? (w >= d ? 'x' : 'y');\n const low: RoofSide = o.type === 'shed' ? (o.low ?? 'front') : ridge === 'x' ? 'right' : 'front';\n const [ex, ey] = FRAMES[low];\n const L = (Math.abs(ex[0]) > 0.5 ? w : d) / 2;\n const D = (Math.abs(ex[0]) > 0.5 ? d : w) / 2;\n const ov = o.overhang ?? 0.35;\n const t = o.thickness ?? 0.18;\n const under = underPlanes(o, L, D);\n const top = under.map((p) => ({ ...p, c: p.c + t * Math.hypot(1, p.ga, p.gb) }));\n const hipped = o.type === 'hip' || o.type === 'pyramid' || o.type === 'mansard';\n const A = hipped ? 4 * (L + D + ov) : L + (o.rake ?? ov);\n const B = D + ov;\n // Eave height: the steepest-falling b-plane at the eave line; every plane must stay above it.\n const g0 = under[0] ?? { c: 0, ga: 0, gb: 1 };\n const zEave = -ov * Math.hypot(g0.ga, g0.gb);\n let outline: Vec2[] = [\n [-A, -B],\n [A, -B],\n [A, B],\n [-A, B],\n ];\n for (const p of under) outline = clipPoly(outline, (q) => zEave - zAt(p, q));\n return { L, D, under, top, outline, ex, ey, thickness: t };\n}\n\nexport const zAt = (p: Plane, q: Vec2): number => p.c + p.ga * q[0] + p.gb * q[1];\n\n/** Envelope height (min of planes) at a local plan point. */\nexport const envelope = (planes: readonly Plane[], q: Vec2): number =>\n Math.min(...planes.map((p) => zAt(p, q)));\n\n/** The plan cell of each plane on the envelope (empty cells dropped), with its plane. */\nexport function facets(planes: readonly Plane[], outline: readonly Vec2[]): [Plane, Vec2[]][] {\n const out: [Plane, Vec2[]][] = [];\n planes.forEach((p, i) => {\n let cell: Vec2[] = [...outline];\n planes.forEach((q, j) => {\n if (j !== i && cell.length >= 3) cell = clipPoly(cell, (r) => zAt(p, r) - zAt(q, r));\n });\n if (cell.length >= 3 && Math.abs(area2(cell)) > 1e-6) out.push([p, cell]);\n });\n return out;\n}\n\n/** Local plan → world XY offset (add `at`). */\nexport const toWorld = (s: RoofShape, q: Vec2, z: number, at: Vec3): Vec3 => [\n at[0] + s.ex[0] * q[0] + s.ey[0] * q[1],\n at[1] + s.ex[1] * q[0] + s.ey[1] * q[1],\n at[2] + z,\n];\n\n/** World XY → local plan. */\nexport const toLocal = (s: RoofShape, x: number, y: number, at: Vec3): Vec2 => {\n const dx = x - at[0];\n const dy = y - at[1];\n return [dx * s.ex[0] + dy * s.ex[1], dx * s.ey[0] + dy * s.ey[1]];\n};\n\n/** World z of the roof's top surface at world (x, y) — chimneys, dormers, aerials sit on this. */\nexport function roofHeightAt(o: RoofOptions, x: number, y: number): number {\n const s = roofShape(o);\n return o.at[2] + envelope(s.top, toLocal(s, x, y, o.at));\n}\n\n/** World z of the highest point of the roof surface (ridge or apex), slab included. */\nexport function ridgeHeight(o: RoofOptions): number {\n const s = roofShape(o);\n let z = -Infinity;\n for (const [p, cell] of facets(s.top, s.outline))\n for (const q of cell) z = Math.max(z, zAt(p, q));\n return o.at[2] + z;\n}\n",
32
+ "// Pitched roofs as one mesh: true-scale roofing courses down every slope, a slab with real\n// thickness (soffit + fascia/bargeboards around the eaves), ridge and hip caps, gable infill walls\n// where the roof leaves a wall open, chimneys that stand on the attic floor and clear the slope.\n// LOD0/1 keep thickness, fascia and caps; LOD2 is the bare slopes + gables (a few dozen triangles).\n\nimport {\n type BuildContext,\n type Lod,\n type Mesh,\n MeshBuilder,\n merge,\n type Vec2,\n type Vec3,\n} from '../core/index.ts';\nimport type { StripId } from '../material/index.ts';\nimport { beam } from '../primitives/index.ts';\nimport { emitFace } from './faces.ts';\nimport { chimney, type RoofChimney } from './roof-chimney.ts';\nimport {\n envelope,\n facets,\n type Plane,\n type RoofOptions,\n type RoofShape,\n ridgeHeight,\n roofHeightAt,\n roofShape,\n toWorld,\n zAt,\n} from './roof-shape.ts';\n\nexport interface RoofMeshOptions extends RoofOptions {\n /** Fascia, bargeboards, soffit and ridge caps. Default: the roof colour, darkened. */\n readonly trim?: Vec3;\n /** Gable / shed end infill walls. Default pale render. */\n readonly wall?: { readonly color: Vec3; readonly strip?: StripId };\n /** Ridge and hip caps (LOD0/1). Default true. */\n readonly caps?: boolean;\n readonly chimneys?: readonly RoofChimney[];\n}\n\nexport interface RoofInfo {\n /** World z of the ridge / apex top. */\n readonly ridge: number;\n /** World z of the lowest eave edge (underside). */\n readonly eave: number;\n /** World z of the top surface at world (x, y). */\n readonly heightAt: (x: number, y: number) => number;\n}\n\nconst W = (s: RoofShape, q: Vec2, z: number, at: Vec3): Vec3 => toWorld(s, q, z, at);\nconst dirW = (s: RoofShape, a: number, b: number, z: number): Vec3 => [\n s.ex[0] * a + s.ey[0] * b,\n s.ex[1] * a + s.ey[1] * b,\n z,\n];\n\nconst onOutline = (outline: readonly Vec2[], q: Vec2): boolean =>\n outline.some((a, i) => {\n const b = outline[(i + 1) % outline.length] ?? a;\n const ex = b[0] - a[0];\n const ey = b[1] - a[1];\n const l2 = ex * ex + ey * ey || 1;\n const t = Math.max(0, Math.min(1, ((q[0] - a[0]) * ex + (q[1] - a[1]) * ey) / l2));\n return Math.hypot(a[0] + ex * t - q[0], a[1] + ey * t - q[1]) < 1e-6;\n });\n\n/** Slopes of one envelope: top (normal up) or underside (normal down). */\nfunction slopes(\n b: MeshBuilder,\n s: RoofShape,\n planes: readonly Plane[],\n o: RoofMeshOptions,\n face: { down: boolean; color: Vec3; strip: StripId; banded: boolean },\n): [Plane, Vec2[]][] {\n const cells = facets(planes, s.outline);\n for (const [p, cell] of cells) {\n const pts = cell.map((q) => W(s, q, zAt(p, q), o.at));\n const low = pts.reduce((m, q) => (q[2] < m[2] ? q : m), pts[0] ?? o.at);\n const k = face.down ? -1 : 1;\n emitFace(b, {\n points: pts,\n normal: dirW(s, -p.ga * k, -p.gb * k, k),\n up: [0, 0, 1],\n vOrigin: low,\n color: face.color,\n strip: face.strip,\n banded: face.banded,\n });\n }\n return cells;\n}\n\n/** Vertical fascia / bargeboard band round the outline, between the two envelopes. */\nfunction fascia(b: MeshBuilder, s: RoofShape, o: RoofMeshOptions, trim: Vec3, verts: Vec2[]): void {\n const n = s.outline.length;\n for (let i = 0; i < n; i++) {\n const a = s.outline[i] ?? [0, 0];\n const c = s.outline[(i + 1) % n] ?? a;\n const ex = c[0] - a[0];\n const ey = c[1] - a[1];\n const len2 = ex * ex + ey * ey;\n if (len2 < 1e-12) continue;\n const ts = [0, 1];\n for (const q of verts) {\n const t = ((q[0] - a[0]) * ex + (q[1] - a[1]) * ey) / len2;\n const off = Math.abs((q[0] - a[0]) * ey - (q[1] - a[1]) * ex) / Math.sqrt(len2);\n if (t > 1e-6 && t < 1 - 1e-6 && off < 1e-6) ts.push(t);\n }\n ts.sort((x, y) => x - y);\n const out = dirW(s, ey, -ex, 0);\n for (let k = 0; k + 1 < ts.length; k++) {\n const q0: Vec2 = [a[0] + ex * (ts[k] ?? 0), a[1] + ey * (ts[k] ?? 0)];\n const q1: Vec2 = [a[0] + ex * (ts[k + 1] ?? 1), a[1] + ey * (ts[k + 1] ?? 1)];\n if (Math.hypot(q1[0] - q0[0], q1[1] - q0[1]) < 1e-6) continue;\n emitFace(b, {\n points: [\n W(s, q0, envelope(s.under, q0), o.at),\n W(s, q1, envelope(s.under, q1), o.at),\n W(s, q1, envelope(s.top, q1), o.at),\n W(s, q0, envelope(s.top, q0), o.at),\n ],\n normal: out,\n up: [0, 0, 1],\n vOrigin: o.at,\n color: trim,\n strip: 'plain',\n });\n }\n }\n}\n\n/** Infill under the roof on each wall line where the underside rises above the plate. */\nfunction gableWalls(b: MeshBuilder, s: RoofShape, o: RoofMeshOptions, banded: boolean): void {\n const wall = o.wall ?? { color: [0.8, 0.76, 0.68] as Vec3 };\n const lines: [Vec2, Vec2, Vec3][] = [\n [[s.L, -s.D], [s.L, s.D], dirW(s, 1, 0, 0)],\n [[-s.L, s.D], [-s.L, -s.D], dirW(s, -1, 0, 0)],\n [[s.L, s.D], [-s.L, s.D], dirW(s, 0, 1, 0)],\n [[-s.L, -s.D], [s.L, -s.D], dirW(s, 0, -1, 0)],\n ];\n for (const [q0, q1, out] of lines) {\n const at = (t: number): Vec2 => [q0[0] + (q1[0] - q0[0]) * t, q0[1] + (q1[1] - q0[1]) * t];\n const ts = new Set([0, 1]);\n s.under.forEach((p, i) => {\n s.under.forEach((q, j) => {\n if (j <= i) return;\n const d0 = zAt(p, q0) - zAt(q, q0);\n const d1 = zAt(p, q1) - zAt(q, q1);\n if (Math.abs(d0 - d1) < 1e-12) return;\n const t = d0 / (d0 - d1);\n if (t > 1e-6 && t < 1 - 1e-6 && Math.abs(envelope(s.under, at(t)) - zAt(p, at(t))) < 1e-7)\n ts.add(t);\n });\n });\n const prof = [...ts]\n .sort((x, y) => x - y)\n .map((t) => [at(t), envelope(s.under, at(t))] as const);\n if (Math.max(...prof.map(([, z]) => z)) < 0.01) continue;\n const pts: Vec3[] = [W(s, q0, 0, o.at)];\n for (const [q, z] of prof) pts.push(W(s, q, Math.max(0, z), o.at));\n pts.push(W(s, q1, 0, o.at));\n emitFace(b, {\n points: pts,\n normal: out,\n up: [0, 0, 1],\n vOrigin: o.at,\n color: wall.color,\n strip: wall.strip ?? 'plain',\n banded,\n });\n }\n}\n\n/** Ridge / hip / knee caps: a round roll on every crease between two top facets. */\nfunction caps(s: RoofShape, o: RoofMeshOptions, cells: [Plane, Vec2[]][], trim: Vec3, lod: Lod) {\n const seen = new Set<string>();\n const out: Mesh[] = [];\n const r = Math.max(0.06, s.thickness * 0.5);\n for (const [p, cell] of cells) {\n cell.forEach((q0, i) => {\n const q1 = cell[(i + 1) % cell.length] ?? q0;\n const mid: Vec2 = [(q0[0] + q1[0]) / 2, (q0[1] + q1[1]) / 2];\n if (onOutline(s.outline, mid) || Math.hypot(q1[0] - q0[0], q1[1] - q0[1]) < 1e-3) return;\n const key = [q0, q1]\n .map((q) => `${q[0].toFixed(4)},${q[1].toFixed(4)}`)\n .sort()\n .join('|');\n if (seen.has(key)) return;\n seen.add(key);\n const lift = r * 0.3;\n out.push(\n beam({\n from: W(s, q0, zAt(p, q0) + lift, o.at),\n to: W(s, q1, zAt(p, q1) + lift, o.at),\n width: r * 2,\n segments: lod === 0 ? 8 : 5,\n color: trim,\n strip: 'plain',\n }),\n );\n });\n }\n return out;\n}\n\n/** The roof as one mesh at a detail level. Pure: compose with place/merge or pass to ctx.part. */\nexport function roofMesh(o: RoofMeshOptions, lod: Lod = 0): Mesh {\n const s = roofShape(o);\n const trim = o.trim ?? [o.color[0] * 0.55, o.color[1] * 0.55, o.color[2] * 0.55];\n const strip = o.strip ?? 'slate';\n const b = new MeshBuilder();\n const extra: Mesh[] = [];\n if (lod === 2) {\n // Bare slopes on the underside envelope: it rests on the walls with no slab.\n slopes(b, s, s.under, o, { down: false, color: o.color, strip, banded: false });\n } else {\n const top = slopes(b, s, s.top, o, { down: false, color: o.color, strip, banded: true });\n const under = slopes(b, s, s.under, o, {\n down: true,\n color: trim,\n strip: 'wood',\n banded: lod === 0,\n });\n const verts = [...top, ...under].flatMap(([, cell]) => cell);\n fascia(b, s, o, trim, verts);\n if (o.caps !== false) extra.push(...caps(s, o, top, trim, lod));\n }\n gableWalls(b, s, o, lod < 2);\n for (const c of o.chimneys ?? []) {\n extra.push(chimney(c, (x, y) => roofHeightAt(o, x, y), o.at, lod));\n }\n return merge([b.build(), ...extra]);\n}\n\n/** Add the roof as part `name` (default 'roof') at the context's LOD; returns its heights. */\nexport function roof(ctx: BuildContext, o: RoofMeshOptions & { readonly name?: string }): RoofInfo {\n ctx.part(o.name ?? 'roof', roofMesh(o, ctx.lod));\n return roofInfo(o);\n}\n\nexport function roofInfo(o: RoofOptions): RoofInfo {\n const s = roofShape(o);\n const eave = Math.min(...s.outline.map((q) => envelope(s.under, q)));\n return {\n ridge: ridgeHeight(o),\n eave: o.at[2] + eave,\n heightAt: (x, y) => roofHeightAt(o, x, y),\n };\n}\n",
33
+ "// Palm fronds: pinnate leaves as curved card strips — narrow double-sided leaflets either side of\n// each rachis, folded into a V and drooping, longest mid-frond. Plus coconuts tucked under the\n// crown. The rachis itself is a swept stem (in `branches`); leaflets root on its bark.\n\nimport { type Mesh, MeshBuilder, merge, type Rng, type Vec3 } from '../core/index.ts';\nimport { arcLengths, lathe, transportFrames } from '../primitives/index.ts';\nimport type { CrownShade } from './vegetation-leaves.ts';\nimport type { LeafParams } from './vegetation-params.ts';\nimport type { Stem } from './vegetation-skeleton.ts';\n\ntype V = [number, number, number];\n\nfunction tri(mb: MeshBuilder, a: Vec3, b: Vec3, c: Vec3, col: Vec3, tipCol: Vec3): void {\n const e1: V = [b[0] - a[0], b[1] - a[1], b[2] - a[2]];\n const e2: V = [c[0] - a[0], c[1] - a[1], c[2] - a[2]];\n const n: V = [\n e1[1] * e2[2] - e1[2] * e2[1],\n e1[2] * e2[0] - e1[0] * e2[2],\n e1[0] * e2[1] - e1[1] * e2[0],\n ];\n const l = Math.hypot(n[0], n[1], n[2]) || 1;\n for (const s of [1, -1]) {\n const nn: Vec3 = [(n[0] / l) * s, (n[1] / l) * s, (n[2] / l) * s];\n const i = mb.vertex({ p: a, n: nn, uv: [0, 0], color: col });\n const j = mb.vertex({ p: b, n: nn, uv: [0, 0], color: col });\n const k = mb.vertex({ p: c, n: nn, uv: [0, 0], color: tipCol });\n if (s > 0) mb.tri(i, j, k);\n else mb.tri(i, k, j);\n }\n}\n\n/**\n * Leaflets along every frond (stem at `level`). `perSide` leaflets each side; `from` overrides\n * each frond's first rachis point (LOD2 roots them all on the trunk's top cap centre).\n */\nexport function frondLeaflets(\n stems: readonly Stem[],\n level: number,\n leaf: LeafParams,\n perSide: number,\n shade: CrownShade,\n rng: Rng,\n): Mesh {\n const mb = new MeshBuilder();\n for (const st of stems) {\n if (st.level !== level) continue;\n const arc = arcLengths(st.pts);\n const frames = transportFrames(st.pts);\n const k = 1 + rng.range(-leaf.colorVar, leaf.colorVar);\n const step = (st.length * 0.9) / perSide;\n for (let i = 0; i < perSide; i++) {\n const u = 0.1 + (0.9 * (i + 0.5)) / perSide;\n const s = u * st.length;\n let j = 0;\n while (j < arc.length - 2 && (arc[j + 1] ?? 0) < s) j++;\n const a = st.pts[j] ?? [0, 0, 0];\n const b = st.pts[j + 1] ?? a;\n const f = (s - (arc[j] ?? 0)) / ((arc[j + 1] ?? 1) - (arc[j] ?? 0) || 1);\n const fr = frames[j] ?? { t: [1, 0, 0] as Vec3, n: [0, 0, 1] as Vec3, b: [0, 1, 0] as Vec3 };\n const r = (st.radii[j] ?? 0) * (1 - f) + (st.radii[j + 1] ?? 0) * f;\n const c: Vec3 = [\n a[0] + (b[0] - a[0]) * f,\n a[1] + (b[1] - a[1]) * f,\n a[2] + (b[2] - a[2]) * f,\n ];\n const len = st.length * leaf.width * Math.sin(Math.PI * (0.12 + 0.88 * u)) ** 0.6;\n const ao =\n 0.6 +\n 0.4 *\n Math.min(1, Math.hypot(c[0] - shade.centre[0], c[1] - shade.centre[1]) / shade.radius);\n const col: Vec3 = [\n leaf.color[0] * k * ao * 0.75,\n leaf.color[1] * k * ao * 0.75,\n leaf.color[2] * k * ao * 0.75,\n ];\n const tipCol: Vec3 = [col[0] * 1.45, col[1] * 1.35, col[2] * 1.2];\n for (const side of [1, -1]) {\n const o: Vec3 = [fr.b[0] * side, fr.b[1] * side, fr.b[2] * side];\n const root = (d: number): Vec3 => [\n c[0] + o[0] * r + fr.t[0] * d,\n c[1] + o[1] * r + fr.t[1] * d,\n c[2] + o[2] * r + fr.t[2] * d,\n ];\n const tip: Vec3 = [\n c[0] + (o[0] * 0.8 + fr.t[0] * 0.45 - fr.n[0] * 0.35) * len,\n c[1] + (o[1] * 0.8 + fr.t[1] * 0.45 - fr.n[1] * 0.35) * len,\n c[2] + (o[2] * 0.8 + fr.t[2] * 0.45 - fr.n[2] * 0.35) * len - 0.2 * len,\n ];\n tri(mb, root(-step * 0.35), root(step * 0.35), tip, col, tipCol);\n }\n }\n }\n return mb.build();\n}\n\n/** Coconuts: `count` spheres hugging the trunk just below the frond bases. */\nexport function fruit(\n trunk: Stem,\n at: number,\n o: { count: number; radius: number; color: Vec3 },\n rng: Rng,\n): Mesh {\n const j = Math.max(0, Math.min(trunk.pts.length - 1, Math.round(at * (trunk.pts.length - 1))));\n const c = trunk.pts[j] ?? [0, 0, 0];\n const rt = trunk.radii[j] ?? 0.2;\n const profile = [0, 1, 2, 3, 4].map((i): [number, number] => {\n const a = -Math.PI / 2 + (i / 4) * Math.PI;\n return [Math.max(0.0001, Math.cos(a)) * o.radius, Math.sin(a) * o.radius];\n });\n const out: Mesh[] = [];\n for (let i = 0; i < o.count; i++) {\n const a = (i / o.count) * Math.PI * 2 + rng.range(-0.3, 0.3);\n const d = rt + o.radius * 0.6;\n const dz = rng.range(-1, 0.5) * o.radius;\n out.push(\n lathe({\n profile,\n segments: 6,\n caps: false,\n at: [c[0] + Math.cos(a) * d, c[1] + Math.sin(a) * d, c[2] + dz],\n color: o.color,\n }),\n );\n }\n return merge(out);\n}\n",
34
+ "// LOD2 stand-ins, < 300 triangles. 'blob': a lathe of the real crown envelope (binned from the\n// full skeleton, so it is THIS tree's silhouette) whose top apex is the trunk's tip — one shared\n// point, so the crown provably touches the trunk. 'cards': a dozen coarse folded frond strips\n// rooted on the trunk's top cap centre (palms). Smooth normals on the blob, flat on the cards.\n\nimport { type Mesh, MeshBuilder, type Rng, type Vec3 } from '../core/index.ts';\nimport { lathe, sweep, transportFrames } from '../primitives/index.ts';\nimport type { TreeParams } from './vegetation-params.ts';\nimport type { Stem } from './vegetation-skeleton.ts';\n\nexport interface Impostor {\n readonly trunk: Mesh;\n readonly leaves: Mesh;\n}\n\n/** Trunk at 4 path points; `apex` extends it straight up to a point (blob's top). */\nfunction coarseTrunk(trunk: Stem, p: TreeParams, apex: number | null): Mesh {\n const n = trunk.pts.length - 1;\n const idx = [...new Set([0, Math.round(n / 3), Math.round((2 * n) / 3), n])];\n const pts = idx.map((i): Vec3 => trunk.pts[i] ?? [0, 0, 0]);\n const radii = idx.map((i) => trunk.radii[i] ?? 0.1);\n const last = pts.length - 1;\n const tip = pts[last] ?? [0, 0, 1];\n if (apex !== null && apex > tip[2] + 1e-6) {\n pts.push([tip[0], tip[1], apex]);\n radii.push(0);\n } else radii[last] = 0;\n return sweep({\n section: { radius: 1, segments: 5 },\n path: pts,\n scale: radii,\n color: p.bark,\n strip: 'wood',\n caps: apex === null ? 'end' : false,\n });\n}\n\nexport function blob(stems: readonly Stem[], p: TreeParams, rng: Rng): Impostor {\n const trunk = stems[0];\n if (!trunk) return { trunk: new MeshBuilder().build(), leaves: new MeshBuilder().build() };\n const tip = trunk.pts[trunk.pts.length - 1] ?? [0, 0, 1];\n const margin = p.leaves.size * 0.6;\n let z0 = Infinity;\n let z1 = tip[2];\n for (const s of stems)\n for (const q of s.level > 0 ? s.pts : []) {\n z0 = Math.min(z0, q[2] - margin * (1 + (p.leaves.hang ?? 0) * 2));\n z1 = Math.max(z1, q[2] + margin);\n }\n if (!Number.isFinite(z0)) z0 = tip[2] * 0.5;\n const BINS = 6;\n const r = new Array<number>(BINS).fill(0.2);\n for (const s of stems)\n for (const q of s.level > 0 ? s.pts : []) {\n const b = Math.min(BINS - 1, Math.max(0, Math.floor(((q[2] - z0) / (z1 - z0)) * BINS)));\n r[b] = Math.max(r[b] ?? 0, Math.hypot(q[0] - tip[0], q[1] - tip[1]) + margin);\n }\n const profile: [number, number][] = [[0, z0]];\n for (let b = 0; b < BINS; b++) profile.push([r[b] ?? 0.2, z0 + ((b + 0.5) / BINS) * (z1 - z0)]);\n profile.push([0, z1]);\n const leaves = lathe({ profile, segments: 10, color: p.leaves.color, at: [tip[0], tip[1], 0] });\n const [cr, cg, cb] = p.leaves.color;\n for (let i = 0; i < leaves.colors.length / 3; i++) {\n const t = ((leaves.positions[i * 3 + 2] ?? 0) - z0) / (z1 - z0);\n const k = (0.55 + 0.5 * t) * (1 + rng.range(-0.08, 0.08));\n leaves.colors.set([cr * k, cg * k, cb * k], i * 3);\n }\n return { trunk: coarseTrunk(trunk, p, z1), leaves };\n}\n\nexport function frondCards(stems: readonly Stem[], p: TreeParams, level: number): Impostor {\n const trunk = stems[0];\n const mb = new MeshBuilder();\n if (!trunk) return { trunk: mb.build(), leaves: mb.build() };\n const top = trunk.pts[trunk.pts.length - 1] ?? [0, 0, 1];\n const fronds = stems.filter((s) => s.level === level);\n const every = Math.max(1, Math.ceil(fronds.length / 12));\n const [cr, cg, cb] = p.leaves.color;\n for (const [fi, st] of fronds.entries()) {\n if (fi % every !== 0) continue;\n const n = st.pts.length - 1;\n const pts = [top, st.pts[Math.round(n / 2)] ?? top, st.pts[n] ?? top];\n const fr = transportFrames(pts);\n const w = [0.25, 1, 0.35].map((k) => k * st.length * p.leaves.width);\n for (const side of [1, -1]) {\n const edge = pts.map((c, j): Vec3 => {\n const f = fr[j];\n const ww = (w[j] ?? 0) * side;\n if (!f) return c;\n return [\n c[0] + (f.b[0] * 0.85 - f.n[0] * 0.45 * side) * ww,\n c[1] + (f.b[1] * 0.85 - f.n[1] * 0.45 * side) * ww,\n c[2] + (f.b[2] * 0.85 - f.n[2] * 0.45 * side) * ww,\n ];\n });\n for (let j = 0; j < 2; j++) {\n const q = [pts[j], pts[j + 1], edge[j + 1], edge[j]] as Vec3[];\n const [a, b, c] = [q[0] ?? top, q[1] ?? top, q[2] ?? top];\n const e1 = [b[0] - a[0], b[1] - a[1], b[2] - a[2]];\n const e2 = [c[0] - a[0], c[1] - a[1], c[2] - a[2]];\n const nx = (e1[1] ?? 0) * (e2[2] ?? 0) - (e1[2] ?? 0) * (e2[1] ?? 0);\n const ny = (e1[2] ?? 0) * (e2[0] ?? 0) - (e1[0] ?? 0) * (e2[2] ?? 0);\n const nz = (e1[0] ?? 0) * (e2[1] ?? 0) - (e1[1] ?? 0) * (e2[0] ?? 0);\n const l = Math.hypot(nx, ny, nz) || 1;\n for (const s of [1, -1]) {\n const nn: Vec3 = [(nx / l) * s, (ny / l) * s, (nz / l) * s];\n const ids = q.map((v, k) => {\n const sh = k < 2 ? 0.7 : 1;\n return mb.vertex({ p: v, n: nn, uv: [0, 0], color: [cr * sh, cg * sh, cb * sh] });\n });\n const [i0 = 0, i1 = 0, i2 = 0, i3 = 0] = s > 0 ? ids : [...ids].reverse();\n mb.quad(i0, i1, i2, i3);\n }\n }\n }\n }\n return { trunk: coarseTrunk(trunk, p, null), leaves: mb.build() };\n}\n",
35
+ "// Tree vocabulary: Weber & Penn 1995 (\"Creation and Rendering of Realistic Trees\", SIGGRAPH)\n// parameters, trimmed to what a game tree needs. Plain data, so presets are objects a recipe\n// spreads and overrides.\n\nimport type { Vec2, Vec3 } from '../core/index.ts';\n\n/** Crown envelope: how level-1 branch length varies up the trunk (Weber–Penn `Shape`). */\nexport type CrownShape =\n | 'conical'\n | 'spherical'\n | 'hemispherical'\n | 'cylindrical'\n | 'tapered'\n | 'flame';\n\n/** One recursion level. Level 0 is the trunk; levels 1–3 are branches, sub-branches, twigs. */\nexport interface BranchLevel {\n /** Children per parent (level 1: along the trunk). Ignored for level 0. */\n readonly branches: number;\n /** Level 0: fraction of tree height. Level ≥ 1: fraction of the parent's length. */\n readonly length: number;\n /** ± relative random length variation. */\n readonly lengthVar?: number;\n /** Degrees between child and parent axis at the attachment. */\n readonly downAngle: number;\n /** Added to downAngle from the first child (bottom) to the last (top) of the parent's zone. */\n readonly downAngleV?: number;\n /** Phyllotaxis step about the parent, degrees (golden angle 137.5° by default). */\n readonly rotate?: number;\n /** Total bend over the stem, degrees: + towards the sky, − towards the ground. Trunk: + bends\n * back against `lean` (towards −X). */\n readonly curve?: number;\n /** If set, the second half bends by this instead (S-curves, weeping tips). */\n readonly curveBack?: number;\n /** Seeded wobble per path segment, ± degrees. */\n readonly curveVar?: number;\n /** Where children start along this stem's parent, as a fraction (level 1 uses `baseSize`). */\n readonly start?: number;\n /** Path segments at LOD0 (LOD1 halves them). */\n readonly segments: number;\n}\n\nexport type LeafShape = 'oval' | 'lobed' | 'tuft' | 'strand' | 'frond';\n\n/** Card outlines: u along the card (0 = stem end), v across (±0.5). */\nexport const OUTLINES: Record<Exclude<LeafShape, 'frond'>, readonly Vec2[]> = {\n oval: [\n [0, 0],\n [0.25, -0.4],\n [0.65, -0.5],\n [1, 0],\n [0.65, 0.5],\n [0.25, 0.4],\n ],\n lobed: [\n [0, 0],\n [0.3, -0.45],\n [0.5, -0.3],\n [0.75, -0.5],\n [1, 0],\n [0.75, 0.5],\n [0.5, 0.3],\n [0.3, 0.45],\n ],\n tuft: [\n [0, 0],\n [0.35, -0.5],\n [0.45, -0.15],\n [0.75, -0.4],\n [1, 0],\n [0.75, 0.4],\n [0.45, 0.15],\n [0.35, 0.5],\n ],\n strand: [\n [0, 0],\n [0.1, -0.5],\n [1, 0],\n [0.1, 0.5],\n ],\n};\n\nexport interface LeafParams {\n readonly shape: LeafShape;\n /** Card length at LOD0, metres. Cards stand for a cluster of leaves, not one leaf. */\n readonly size: number;\n /** Card width as a fraction of its length (fronds: leaflet length as a fraction of frond). */\n readonly width: number;\n /** Cards per terminal stem (fronds: leaflets per side). */\n readonly perStem: number;\n /** Where cards start along a terminal stem, 0–1 (default 0.3; tufts sit near the tip). */\n readonly from?: number;\n readonly color: Vec3;\n /** ± relative colour variation per card. */\n readonly colorVar: number;\n /** 0–1: lay cards level, like the horizontal needle pads of a pine. */\n readonly flat?: number;\n /** 0 = cards splay outward, 1 = they hang straight down (willow strands). */\n readonly hang?: number;\n}\n\nexport interface TreeParams {\n readonly shape: CrownShape;\n /** Fraction of the trunk free of branches (clear bole). */\n readonly baseSize: number;\n /** [trunk, level 1, level 2?, level 3?]. */\n readonly levels: readonly BranchLevel[];\n /** Child radius = parent radius · (child length / parent length)^ratioPower. */\n readonly ratioPower: number;\n /** Trunk radius at the top as a fraction of its radius at breast height. */\n readonly taper: number;\n /** Trunk lean from vertical towards +X, degrees. The trunk stays in the XZ plane. */\n readonly lean?: number;\n readonly bark: Vec3;\n /** Bark colour at the top of the trunk (Scots pine's orange upper bark); default `bark`. */\n readonly barkTop?: Vec3;\n /** Dark bark marks scattered per vertex (birch lenticels): colour + fraction of vertices. */\n readonly barkMarks?: { readonly color: Vec3; readonly amount: number };\n readonly leaves: LeafParams;\n /** Buttress lobes in the root flare at the base (LOD0/1); 0 or absent = no `roots` part. */\n readonly roots?: number;\n /** Fruit hung under the crown (coconuts), merged into `branches`. LOD0 only. */\n readonly fruit?: { readonly count: number; readonly radius: number; readonly color: Vec3 };\n /** LOD2 stand-in: a lathe of the crown envelope, or a few coarse frond cards. */\n readonly impostor: 'blob' | 'cards';\n /** Typical mature size this preset was tuned on (used when the caller omits spread/dbh). */\n readonly typical: { readonly height: number; readonly spread: number; readonly dbh: number };\n}\n\n/** Weber–Penn ShapeRatio; `r` is 1 at the crown base and 0 at the trunk tip. */\nexport function shapeRatio(shape: CrownShape, r: number): number {\n const x = Math.min(1, Math.max(0, r));\n switch (shape) {\n case 'conical':\n return 0.2 + 0.8 * x;\n case 'spherical':\n return 0.2 + 0.8 * Math.sin(Math.PI * x);\n case 'hemispherical':\n return 0.2 + 0.8 * Math.sin((Math.PI / 2) * x);\n case 'cylindrical':\n return 1;\n case 'tapered':\n return 0.5 + 0.5 * x;\n case 'flame':\n return x <= 0.7 ? 0.15 + (0.85 * x) / 0.7 : 0.15 + (0.85 * (1 - x)) / 0.3;\n }\n}\n",
36
+ "// Leaf cards: double-sided `planar` polygons, each standing for a cluster of leaves, with per-vertex\n// colour (darker at the stem, lighter at the tip, darker deep inside the crown). LOD0 roots every\n// card on an exact twig vertex (`transportFrames` = the sweep's own frames); LOD1 replaces each\n// twig by one bigger cluster card rooted on its parent's bark.\n\nimport { type Mesh, merge, type Rng, type Vec3 } from '../core/index.ts';\nimport { planar, transportFrames } from '../primitives/index.ts';\nimport { type LeafParams, OUTLINES } from './vegetation-params.ts';\nimport type { Stem } from './vegetation-skeleton.ts';\n\nconst unit = (a: Vec3): Vec3 => {\n const l = Math.hypot(a[0], a[1], a[2]) || 1;\n return [a[0] / l, a[1] / l, a[2] / l];\n};\n\n/** Crown occlusion: cards deep inside / low in the crown are darker. */\nexport interface CrownShade {\n readonly centre: Vec3;\n readonly radius: number;\n readonly zMin: number;\n readonly zMax: number;\n}\n\nexport function crownShade(stems: readonly Stem[], level: number): CrownShade {\n let r = 0.1;\n let z0 = Infinity;\n let z1 = -Infinity;\n const t = stems[0]?.pts;\n const c = t?.[t.length - 1] ?? [0, 0, 0];\n for (const s of stems) {\n if (s.level < level) continue;\n for (const p of s.pts) {\n r = Math.max(r, Math.hypot(p[0] - c[0], p[1] - c[1]));\n z0 = Math.min(z0, p[2]);\n z1 = Math.max(z1, p[2]);\n }\n }\n return { centre: c, radius: r, zMin: z0, zMax: Math.max(z1, z0 + 0.1) };\n}\n\nfunction card(\n leaf: LeafParams,\n base: Vec3,\n dir: Vec3,\n side: Vec3,\n len: number,\n shade: CrownShade,\n rng: Rng,\n): Mesh {\n const outline = OUTLINES[leaf.shape === 'frond' ? 'oval' : leaf.shape];\n const w = len * leaf.width;\n const points = outline.map(\n ([u, v]): Vec3 => [\n base[0] + dir[0] * u * len + side[0] * v * w,\n base[1] + dir[1] * u * len + side[1] * v * w,\n base[2] + dir[2] * u * len + side[2] * v * w,\n ],\n );\n const m = planar({ points, color: leaf.color, doubleSided: true });\n const k = 1 + rng.range(-leaf.colorVar, leaf.colorVar);\n const hue = rng.range(-leaf.colorVar, leaf.colorVar) * 0.6;\n const radial = Math.hypot(base[0] - shade.centre[0], base[1] - shade.centre[1]) / shade.radius;\n const up = (base[2] - shade.zMin) / (shade.zMax - shade.zMin);\n const ao = 0.5 + 0.35 * Math.min(1, radial) ** 0.8 + 0.2 * Math.max(0, Math.min(1, up));\n const [r, g, b] = leaf.color;\n for (let i = 0; i < m.colors.length / 3; i++) {\n const u = outline[i % outline.length]?.[0] ?? 0;\n const s = ao * k * (0.7 + 0.4 * u);\n m.colors[i * 3] = r * s * (1 + hue);\n m.colors[i * 3 + 1] = g * s;\n m.colors[i * 3 + 2] = b * s * (1 - hue);\n }\n return m;\n}\n\n/** Splay outward from the stem, lift a little, then droop towards the ground by `hang`. */\nfunction aim(radial: Vec3, along: Vec3, leaf: LeafParams, rng: Rng): { dir: Vec3; side: Vec3 } {\n const hang = leaf.hang ?? 0;\n const flat = leaf.flat ?? 0;\n const lift = rng.range(-0.3, 0.5);\n const out = unit([\n radial[0] * 0.9 + along[0] * 0.7,\n radial[1] * 0.9 + along[1] * 0.7,\n radial[2] * 0.9 + along[2] * 0.7 + lift,\n ]);\n const d0 = unit([out[0] * (1 - hang), out[1] * (1 - hang), out[2] * (1 - hang) - hang]);\n const dir = unit([d0[0], d0[1], d0[2] * (1 - flat)]);\n const level = unit([-dir[1], dir[0], 0]);\n const s1 = unit([\n dir[1] * radial[2] - dir[2] * radial[1],\n dir[2] * radial[0] - dir[0] * radial[2],\n dir[0] * radial[1] - dir[1] * radial[0],\n ]);\n const s0 = Math.hypot(...s1) < 0.5 ? level : s1;\n // Flat cards (pine pads) lie level: side goes horizontal, roll fades out.\n const side = unit([\n s0[0] + (level[0] - s0[0]) * flat,\n s0[1] + (level[1] - s0[1]) * flat,\n s0[2] + (level[2] - s0[2]) * flat,\n ]);\n const roll = rng.range(-0.7, 0.7) * (1 - flat);\n const t: Vec3 = [\n dir[1] * side[2] - dir[2] * side[1],\n dir[2] * side[0] - dir[0] * side[2],\n dir[0] * side[1] - dir[1] * side[0],\n ];\n const c = Math.cos(roll);\n const s = Math.sin(roll);\n return { dir, side: [side[0] * c + t[0] * s, side[1] * c + t[1] * s, side[2] * c + t[2] * s] };\n}\n\n/** LOD0: `perStem` cards along the outer 70% of every terminal stem, rooted on a ring vertex. */\nexport function leafCards(\n stems: readonly Stem[],\n level: number,\n ringSegments: number,\n leaf: LeafParams,\n shade: CrownShade,\n rng: Rng,\n): Mesh {\n const out: Mesh[] = [];\n for (const st of stems) {\n if (st.level !== level) continue;\n const frames = transportFrames(st.pts);\n const res = st.pts.length - 1;\n for (let i = 0; i < leaf.perStem; i++) {\n const from = leaf.from ?? 0.3;\n const t = from + ((1 - from) * (i + 1)) / leaf.perStem;\n const j = Math.max(1, Math.min(res, Math.round(t * res)));\n const f = frames[j];\n const c = st.pts[j];\n if (!f || !c) continue;\n const a = (rng.int(0, ringSegments - 1) / ringSegments) * Math.PI * 2;\n const radial: Vec3 = [\n Math.cos(a) * f.n[0] + Math.sin(a) * f.b[0],\n Math.cos(a) * f.n[1] + Math.sin(a) * f.b[1],\n Math.cos(a) * f.n[2] + Math.sin(a) * f.b[2],\n ];\n const r = st.radii[j] ?? 0;\n const base: Vec3 = [c[0] + radial[0] * r, c[1] + radial[1] * r, c[2] + radial[2] * r];\n const { dir, side } = aim(radial, f.t, leaf, rng);\n out.push(card(leaf, base, dir, side, leaf.size * rng.range(0.8, 1.2), shade, rng));\n }\n }\n return merge(out);\n}\n\n/** LOD1: one cluster card per (unemitted) twig, rooted where the twig would leave its parent. */\nexport function clusterCards(\n stems: readonly Stem[],\n level: number,\n leaf: LeafParams,\n shade: CrownShade,\n rng: Rng,\n): Mesh {\n const out: Mesh[] = [];\n for (const st of stems) {\n if (st.level !== level) continue;\n const tip = st.pts[st.pts.length - 1] ?? st.surface;\n const p0 = st.pts[0] ?? st.surface;\n const along = unit([tip[0] - p0[0], tip[1] - p0[1], tip[2] - p0[2]]);\n const radial = unit([st.surface[0] - p0[0], st.surface[1] - p0[1], st.surface[2] - p0[2]]);\n const { dir, side } = aim(radial, along, leaf, rng);\n const len = st.length * 1.1 + leaf.size;\n out.push(card(leaf, st.surface, dir, side, len, shade, rng));\n }\n return merge(out);\n}\n",
37
+ "// Skeleton → wood meshes: stems as tapered sweeps (LOD sets radial and path resolution), the\n// trunk with a bark gradient and marks, the buttressed root flare as a lobed `loft`. Plus the\n// fit that scales the finished tree onto its real height and crown spread.\n\nimport { boundsOf, type Mesh, merge, type Rng, type Vec3 } from '../core/index.ts';\nimport { loft, ringXY, sweep } from '../primitives/index.ts';\nimport type { TreeParams } from './vegetation-params.ts';\nimport type { Stem } from './vegetation-skeleton.ts';\n\n/** Radial segments per [level][lod]. The trunk's 8 keeps ring vertices on ±Y (exact DBH). */\nconst RADIAL = [\n [8, 6, 5],\n [6, 4, 4],\n [4, 3, 3],\n [3, 3, 3],\n];\nexport const radialSegments = (level: number, lod: number): number =>\n RADIAL[Math.min(3, level)]?.[lod] ?? 3;\n\n/** Every `step`-th path point (always keeping both ends): LOD1 halves path resolution. */\nexport function coarsen(st: Stem, step: number): { pts: Vec3[]; radii: number[] } {\n const pts: Vec3[] = [];\n const radii: number[] = [];\n const last = st.pts.length - 1;\n for (let i = 0; i <= last; i += step) {\n pts.push(st.pts[i] ?? [0, 0, 0]);\n radii.push(st.radii[i] ?? 0);\n }\n if (last % step !== 0) {\n pts.push(st.pts[last] ?? [0, 0, 0]);\n radii.push(st.radii[last] ?? 0);\n }\n return { pts, radii };\n}\n\n/** All stems with level in [lo, hi], merged. */\nexport function stemsMesh(\n stems: readonly Stem[],\n lo: number,\n hi: number,\n lod: number,\n color: Vec3,\n): Mesh {\n const out: Mesh[] = [];\n for (const st of stems) {\n if (st.level < lo || st.level > hi) continue;\n const { pts, radii } = coarsen(st, lod === 0 ? 1 : 2);\n out.push(\n sweep({\n section: { radius: 1, segments: radialSegments(st.level, lod) },\n path: pts,\n scale: radii,\n color,\n strip: 'wood',\n }),\n );\n }\n return merge(out);\n}\n\nconst mix = (a: Vec3, b: Vec3, t: number): [number, number, number] => [\n a[0] + (b[0] - a[0]) * t,\n a[1] + (b[1] - a[1]) * t,\n a[2] + (b[2] - a[2]) * t,\n];\n\n/** Bark colour by height (bark → barkTop) with seeded marks; rewrites the mesh's colours. */\nexport function barkTint(m: Mesh, p: TreeParams, top: number, rng: Rng): Mesh {\n const hi = p.barkTop ?? p.bark;\n for (let i = 0; i < m.colors.length / 3; i++) {\n const z = m.positions[i * 3 + 2] ?? 0;\n const t = Math.min(1, Math.max(0, (z / Math.max(0.1, top) - 0.3) / 0.4));\n let c = mix(p.bark, hi, t * t * (3 - 2 * t));\n if (p.barkMarks && rng.next() < p.barkMarks.amount) c = mix(c, p.barkMarks.color, 0.85);\n const k = 1 + rng.range(-0.06, 0.06);\n m.colors.set([c[0] * k, c[1] * k, c[2] * k], i * 3);\n }\n return m;\n}\n\n/** The trunk, radius scaled by `radiusScale` (the fit's 1/sy keeps DBH exact after scaling). */\nexport function trunkMesh(\n trunk: Stem,\n p: TreeParams,\n lod: number,\n radiusScale: number,\n rng: Rng,\n): Mesh {\n const { pts, radii } = coarsen(trunk, lod === 0 ? 1 : 2);\n const m = sweep({\n section: { radius: 1, segments: radialSegments(0, lod) },\n path: pts,\n scale: radii.map((r) => r * radiusScale),\n color: p.bark,\n strip: 'wood',\n caps: p.impostor === 'cards' ? 'end' : false,\n });\n return barkTint(m, p, pts[pts.length - 1]?.[2] ?? 1, rng);\n}\n\n/** Trunk axis point at height z (linear between path points). */\nfunction axisAt(trunk: Stem, z: number): Vec3 {\n for (let i = 1; i < trunk.pts.length; i++) {\n const a = trunk.pts[i - 1] ?? [0, 0, 0];\n const b = trunk.pts[i] ?? a;\n if (b[2] >= z || i === trunk.pts.length - 1) {\n const f = Math.min(1, Math.max(0, (z - a[2]) / (b[2] - a[2] || 1)));\n return [a[0] + (b[0] - a[0]) * f, a[1] + (b[1] - a[1]) * f, z];\n }\n }\n return [0, 0, z];\n}\n\n/** Buttressed flare: `p.roots` lobes, wide at the ground, melting into the trunk by ~2·DBH. */\nexport function rootsMesh(\n trunk: Stem,\n p: TreeParams,\n lod: number,\n radiusScale: number,\n rng: Rng,\n): Mesh {\n const r0 = (trunk.radii[0] ?? 0.2) * radiusScale;\n const lobes = p.roots ?? 0;\n const phase = rng.range(0, Math.PI * 2);\n const levels = [\n { z: -0.1, k: 1.7, amp: 0.7 },\n { z: 0.5 * r0, k: 1.3, amp: 0.4 },\n { z: 1.3 * r0, k: 1.04, amp: 0.15 },\n { z: 2.4 * r0, k: 0.9, amp: 0 },\n ];\n const segs = lod === 0 ? 16 : 10;\n const rings = levels.map(({ z, k, amp }) => {\n const c = axisAt(trunk, z);\n const lobe = (a: number): number => 1 + amp * Math.max(0, Math.cos(lobes * (a - phase))) ** 2;\n return ringXY(c, r0 * k, r0 * k, segs, lobe);\n });\n const m = loft({ rings, color: p.bark, strip: 'wood' });\n return barkTint(m, p, trunk.pts[trunk.pts.length - 1]?.[2] ?? 1, rng);\n}\n\n/** Per-axis factors that bring the union of `meshes` to `target` = [X, Y, Z] spans. */\nexport function fitFactors(meshes: readonly Mesh[], target: Vec3): Vec3 {\n const lo = [Infinity, Infinity, Infinity];\n const hi = [-Infinity, -Infinity, -Infinity];\n for (const m of meshes) {\n if (m.indices.length === 0) continue;\n const b = boundsOf(m);\n for (let k = 0; k < 3; k++) {\n lo[k] = Math.min(lo[k] ?? 0, b.min[k] ?? 0);\n hi[k] = Math.max(hi[k] ?? 0, b.max[k] ?? 0);\n }\n }\n const f = (k: 0 | 1 | 2): number => target[k] / Math.max(1e-6, (hi[k] ?? 1) - (lo[k] ?? 0));\n return [f(0), f(1), f(2)];\n}\n\n/** Non-uniform scale about the origin; normals by the inverse transpose, renormalised. */\nexport function scaleMesh(m: Mesh, s: Vec3): Mesh {\n const positions = new Float32Array(m.positions.length);\n const normals = new Float32Array(m.normals.length);\n for (let i = 0; i < positions.length; i += 3) {\n positions[i] = (m.positions[i] ?? 0) * s[0];\n positions[i + 1] = (m.positions[i + 1] ?? 0) * s[1];\n positions[i + 2] = (m.positions[i + 2] ?? 0) * s[2];\n const nx = (m.normals[i] ?? 0) / s[0];\n const ny = (m.normals[i + 1] ?? 0) / s[1];\n const nz = (m.normals[i + 2] ?? 0) / s[2];\n const l = Math.hypot(nx, ny, nz) || 1;\n normals[i] = nx / l;\n normals[i + 1] = ny / l;\n normals[i + 2] = nz / l;\n }\n return { ...m, positions, normals };\n}\n",
38
+ "// Species presets: plain `TreeParams` objects — spread one and override what you need\n// (`{ ...oak, leaves: { ...oak.leaves, color: hex('#7a8a2a') } }` is an autumn oak).\n// `typical` sizes are mature open-grown trees; sources in each comment and in recipes/<name>/README.md.\n\nimport { hex } from '../material/index.ts';\nimport type { TreeParams } from './vegetation-params.ts';\n\n/** Quercus robur (English oak): 20–25 m, crown about as wide; girth 4–12 m. Spreading, crooked limbs. */\nexport const oak: TreeParams = {\n shape: 'hemispherical',\n baseSize: 0.3,\n ratioPower: 1.15,\n taper: 0.3,\n levels: [\n { branches: 0, length: 0.55, downAngle: 0, curveVar: 5, segments: 8 },\n {\n branches: 8,\n length: 0.95,\n downAngle: 58,\n downAngleV: -18,\n curve: -8,\n curveVar: 16,\n segments: 7,\n },\n { branches: 6, length: 0.55, downAngle: 50, curve: 12, curveVar: 18, start: 0.2, segments: 4 },\n { branches: 5, length: 0.5, downAngle: 45, curveVar: 14, start: 0.15, segments: 2 },\n ],\n bark: hex('#4a4036'),\n barkTop: hex('#5a5045'),\n leaves: {\n shape: 'lobed',\n size: 1.7,\n width: 0.8,\n perStem: 5,\n color: hex('#3d6022'),\n colorVar: 0.16,\n },\n roots: 5,\n impostor: 'blob',\n typical: { height: 22, spread: 22, dbh: 1.3 },\n};\n\n/** Pinus sylvestris (Scots pine): 25–35 m, DBH up to 1 m; long clean bole, orange upper bark,\n * flat-topped crown in the top third, dark blue-green needle tufts on upturned tips. */\nexport const pine: TreeParams = {\n shape: 'cylindrical',\n baseSize: 0.6,\n ratioPower: 1.2,\n taper: 0.12,\n levels: [\n { branches: 0, length: 0.94, downAngle: 0, curveVar: 3, segments: 10 },\n {\n branches: 13,\n length: 0.34,\n downAngle: 94,\n downAngleV: -14,\n curve: 16,\n curveVar: 14,\n segments: 5,\n },\n { branches: 5, length: 0.42, downAngle: 60, curve: 18, curveVar: 14, start: 0.3, segments: 3 },\n ],\n bark: hex('#4a3a30'),\n barkTop: hex('#c0652c'),\n leaves: {\n shape: 'tuft',\n size: 2.1,\n width: 0.95,\n perStem: 5,\n from: 0.5,\n flat: 0.8,\n color: hex('#24422e'),\n colorVar: 0.1,\n },\n roots: 4,\n impostor: 'blob',\n typical: { height: 25, spread: 9, dbh: 0.6 },\n};\n\n/** Cocos nucifera (coconut palm): up to 30 m; single ringed stem 30–40 cm; 4–6 m pinnate fronds. */\nexport const palm: TreeParams = {\n shape: 'cylindrical',\n baseSize: 0.95,\n ratioPower: 1.1,\n taper: 0.7,\n lean: 12,\n levels: [\n { branches: 0, length: 1, downAngle: 0, curve: 24, curveVar: 1.5, segments: 12 },\n {\n branches: 22,\n length: 0.26,\n downAngle: 115,\n downAngleV: -85,\n rotate: 137.5,\n curve: -55,\n curveVar: 4,\n segments: 8,\n },\n ],\n bark: hex('#6b5d4a'),\n barkTop: hex('#8a7a62'),\n leaves: {\n shape: 'frond',\n size: 0,\n width: 0.2,\n perStem: 26,\n color: hex('#4f7a2a'),\n colorVar: 0.12,\n },\n roots: 9,\n fruit: { count: 7, radius: 0.13, color: hex('#5f6a22') },\n impostor: 'cards',\n typical: { height: 20, spread: 9, dbh: 0.35 },\n};\n\n/** Betula pendula (silver birch): 15–25 m, narrow crown, white bark with black marks, weeping twigs. */\nexport const birch: TreeParams = {\n shape: 'flame',\n baseSize: 0.3,\n ratioPower: 1.4,\n taper: 0.1,\n levels: [\n { branches: 0, length: 1, downAngle: 0, curveVar: 3, segments: 10 },\n {\n branches: 22,\n length: 0.32,\n downAngle: 45,\n downAngleV: 10,\n curve: -25,\n curveVar: 8,\n segments: 4,\n },\n { branches: 5, length: 0.55, downAngle: 30, curve: -45, curveVar: 10, start: 0.2, segments: 3 },\n ],\n bark: hex('#d9d6cc'),\n barkMarks: { color: hex('#24221f'), amount: 0.12 },\n leaves: {\n shape: 'oval',\n size: 0.8,\n width: 0.7,\n perStem: 4,\n color: hex('#6f9a32'),\n colorVar: 0.15,\n },\n impostor: 'blob',\n typical: { height: 18, spread: 8, dbh: 0.4 },\n};\n\n/** Salix babylonica (weeping willow): 10–15 m, wider than tall; long hanging leafy strands. */\nexport const willow: TreeParams = {\n shape: 'hemispherical',\n baseSize: 0.25,\n ratioPower: 1.7,\n taper: 0.35,\n levels: [\n { branches: 0, length: 0.55, downAngle: 0, curveVar: 5, segments: 6 },\n {\n branches: 8,\n length: 0.95,\n downAngle: 42,\n curve: 40,\n curveBack: -70,\n curveVar: 8,\n segments: 6,\n },\n { branches: 7, length: 0.55, downAngle: 35, curve: -80, curveVar: 8, start: 0.3, segments: 4 },\n ],\n bark: hex('#4f463a'),\n leaves: {\n shape: 'strand',\n size: 2.6,\n width: 0.22,\n perStem: 4,\n color: hex('#8aa83e'),\n colorVar: 0.12,\n hang: 0.92,\n },\n roots: 6,\n impostor: 'blob',\n typical: { height: 12, spread: 14, dbh: 0.8 },\n};\n\nexport const SPECIES = { oak, pine, palm, birch, willow } as const;\nexport type SpeciesName = keyof typeof SPECIES;\n",
39
+ "// The botanical skeleton: Weber–Penn recursive stems as plain polylines + radii. Always grown at\n// full depth and LOD0 resolution from one seeded stream, so every LOD is the same tree; meshing\n// decides what to emit. Children start inside their parent (centre offset r_parent − r_child along\n// the attachment normal), so each one physically grows out of the bark.\n\nimport type { Rng, Vec3 } from '../core/index.ts';\nimport { arcLengths, transportFrames } from '../primitives/index.ts';\nimport { type BranchLevel, shapeRatio, type TreeParams } from './vegetation-params.ts';\n\nexport interface Stem {\n readonly level: number;\n readonly pts: readonly Vec3[];\n readonly radii: readonly number[];\n readonly length: number;\n /** Index of the parent stem, −1 for the trunk. */\n readonly parent: number;\n /** Attachment point on the parent's bark (cluster cards root here at LOD1). */\n readonly surface: Vec3;\n /** Nominal length before shape/variation: drives the child count. */\n readonly maxLength: number;\n}\n\nconst deg = Math.PI / 180;\nconst unit = (a: Vec3): Vec3 => {\n const l = Math.hypot(a[0], a[1], a[2]) || 1;\n return [a[0] / l, a[1] / l, a[2] / l];\n};\n\n/** Rodrigues rotation of v about unit axis k by angle a (radians). */\nexport function rotate(v: Vec3, k: Vec3, a: number): Vec3 {\n const c = Math.cos(a);\n const s = Math.sin(a);\n const d = (k[0] * v[0] + k[1] * v[1] + k[2] * v[2]) * (1 - c);\n return [\n v[0] * c + (k[1] * v[2] - k[2] * v[1]) * s + k[0] * d,\n v[1] * c + (k[2] * v[0] - k[0] * v[2]) * s + k[1] * d,\n v[2] * c + (k[0] * v[1] - k[1] * v[0]) * s + k[2] * d,\n ];\n}\n\n/** Axis that turns `dir` towards +Z when rotated by a positive angle. */\nfunction upAxis(dir: Vec3): Vec3 {\n const k: Vec3 = [dir[1], -dir[0], 0]; // dir × Z\n return Math.hypot(k[0], k[1]) < 1e-4 ? [0, 1, 0] : unit(k);\n}\n\n/** A stem's polyline: `res` segments, bending by curve/curveBack plus seeded wobble. */\nfunction path(start: Vec3, dir0: Vec3, len: number, lv: BranchLevel, trunk: boolean, rng: Rng) {\n const res = Math.max(1, lv.segments);\n const step = len / res;\n const pts: Vec3[] = [start];\n let dir = dir0;\n let p = start;\n for (let i = 0; i < res; i++) {\n const half = lv.curveBack !== undefined && i >= res / 2;\n const bend = half\n ? (lv.curveBack ?? 0) / Math.ceil(res / 2)\n : (lv.curve ?? 0) / (lv.curveBack !== undefined ? Math.max(1, Math.floor(res / 2)) : res);\n const wob = lv.curveVar ?? 0;\n // The trunk stays in the XZ plane and bends about Y: + curve swings it back against the lean\n // (−X), so a leaning palm bows and its crown comes back over its base.\n if (trunk) dir = rotate(dir, [0, 1, 0], -(bend + rng.range(-wob, wob)) * deg);\n else {\n dir = rotate(dir, upAxis(dir), (bend + rng.range(-wob, wob)) * deg);\n dir = rotate(dir, [0, 0, 1], rng.range(-wob, wob) * deg);\n }\n dir = unit(dir);\n p = [p[0] + dir[0] * step, p[1] + dir[1] * step, p[2] + dir[2] * step];\n pts.push(p);\n }\n return pts;\n}\n\nexport function grow(p: TreeParams, size: { height: number; dbh: number }, rng: Rng): Stem[] {\n const t0 = p.levels[0];\n if (!t0) return [];\n const L0 = size.height * t0.length;\n const r0 = size.dbh / 2;\n const lean = (p.lean ?? 0) * deg;\n const trunkPts = path([0, 0, -0.05], [Math.sin(lean), 0, Math.cos(lean)], L0, t0, true, rng);\n const arc0 = arcLengths(trunkPts);\n const bh = 1.3; // breast height, metres (forestry DBH convention)\n const trunkR = arc0.map((s) => {\n const f = Math.max(0, (s - bh) / Math.max(0.1, L0 - bh));\n return r0 * (1 - (1 - p.taper) * f);\n });\n const stems: Stem[] = [\n {\n level: 0,\n pts: trunkPts,\n radii: trunkR,\n length: L0,\n parent: -1,\n surface: [0, 0, 0],\n maxLength: L0,\n },\n ];\n for (let si = 0; si < stems.length; si++) {\n const par = stems[si];\n const lv = par ? p.levels[par.level + 1] : undefined;\n if (!par || !lv) continue;\n const arc = arcLengths(par.pts);\n const frames = transportFrames(par.pts);\n const s0 = (par.level === 0 ? p.baseSize : (lv.start ?? 0.1)) * par.length;\n const s1 = par.length * 0.97;\n const fill = par.level === 0 ? 1 : Math.min(1, par.length / par.maxLength);\n const n = par.level === 0 ? lv.branches : Math.round(lv.branches * (0.25 + 0.75 * fill));\n let phi = rng.range(0, 360);\n for (let i = 0; i < n; i++) {\n const s = s0 + ((s1 - s0) * (i + rng.range(0.15, 0.85))) / Math.max(1, n);\n let j = 0;\n while (j < arc.length - 2 && (arc[j + 1] ?? 0) < s) j++;\n const a = par.pts[j] ?? [0, 0, 0];\n const b = par.pts[j + 1] ?? a;\n const f = (s - (arc[j] ?? 0)) / ((arc[j + 1] ?? 1) - (arc[j] ?? 0) || 1);\n const c: Vec3 = [\n a[0] + (b[0] - a[0]) * f,\n a[1] + (b[1] - a[1]) * f,\n a[2] + (b[2] - a[2]) * f,\n ];\n const rp = (par.radii[j] ?? 0) * (1 - f) + (par.radii[j + 1] ?? 0) * f;\n const T = unit([b[0] - a[0], b[1] - a[1], b[2] - a[2]]);\n const fr = frames[j] ?? { n: [1, 0, 0], b: [0, 1, 0] };\n phi += (lv.rotate ?? 137.5) + rng.range(-10, 10);\n const cp = Math.cos(phi * deg);\n const sp = Math.sin(phi * deg);\n const raw: Vec3 = [\n cp * fr.n[0] + sp * fr.b[0],\n cp * fr.n[1] + sp * fr.b[1],\n cp * fr.n[2] + sp * fr.b[2],\n ];\n const tdot = raw[0] * T[0] + raw[1] * T[1] + raw[2] * T[2];\n const np = unit([raw[0] - tdot * T[0], raw[1] - tdot * T[1], raw[2] - tdot * T[2]]);\n const zone = (s - s0) / Math.max(1e-6, s1 - s0);\n const down = (lv.downAngle + (lv.downAngleV ?? 0) * zone + rng.range(-5, 5)) * deg;\n const dir = unit([\n T[0] * Math.cos(down) + np[0] * Math.sin(down),\n T[1] * Math.cos(down) + np[1] * Math.sin(down),\n T[2] * Math.cos(down) + np[2] * Math.sin(down),\n ]);\n const vary = 1 + rng.range(-(lv.lengthVar ?? 0.15), lv.lengthVar ?? 0.15);\n const maxLength = lv.length * par.length;\n const base =\n par.level === 0\n ? maxLength * shapeRatio(p.shape, (par.length - s) / Math.max(1e-6, par.length - s0))\n : lv.length * (par.length - 0.6 * s);\n const len = Math.max(0.15, base * vary);\n const r0c = par.radii[0] ?? rp;\n const rc = Math.max(0.006, Math.min(0.8 * rp, r0c * (len / par.length) ** p.ratioPower));\n const start: Vec3 = [\n c[0] + np[0] * (rp - rc),\n c[1] + np[1] * (rp - rc),\n c[2] + np[2] * (rp - rc),\n ];\n const pts = path(start, dir, len, lv, false, rng);\n stems.push({\n level: par.level + 1,\n pts,\n radii: pts.map((_, k) => rc * (1 - (0.75 * k) / Math.max(1, pts.length - 1))),\n length: len,\n parent: si,\n surface: [c[0] + np[0] * rp, c[1] + np[1] * rp, c[2] + np[2] * rp],\n maxLength,\n });\n }\n }\n return stems;\n}\n",
40
+ "// Vegetation kind: `tree(ctx, …)` grows a Weber–Penn skeleton from species params and emits a\n// game tree — `trunk`, `roots` (buttress flare), and a swaying group `crown` holding `branches`\n// (merged) and `leaves` (merged cards) — then fits it onto its real height and crown spread.\n// LOD policy: LOD0 every level and every leaf card; LOD1 one level fewer (trees with ≥ 3 levels),\n// halved path resolution, twigs replaced by cluster cards; LOD2 an impostor under 300 triangles.\n\nimport {\n BUDGETS,\n type BuildContext,\n defineFamily,\n type Mesh,\n merge,\n type RealDimensions,\n Ts23dError,\n translate,\n triangleCount,\n type Vec3,\n} from '../core/index.ts';\nimport { frondLeaflets, fruit } from './vegetation-fronds.ts';\nimport { blob, frondCards } from './vegetation-impostor.ts';\nimport { clusterCards, crownShade, leafCards } from './vegetation-leaves.ts';\nimport {\n barkTint,\n fitFactors,\n radialSegments,\n rootsMesh,\n scaleMesh,\n stemsMesh,\n trunkMesh,\n} from './vegetation-mesh.ts';\nimport type { TreeParams } from './vegetation-params.ts';\nimport { SPECIES } from './vegetation-presets.ts';\nimport { grow } from './vegetation-skeleton.ts';\n\nexport interface TreeOptions {\n /** A preset name (`oak`, `pine`, `palm`, `birch`, `willow`) or a full parameter set. */\n readonly species?: string | TreeParams;\n /** Overrides on top of the species. */\n readonly params?: Partial<TreeParams>;\n /** Total height, metres (ground to crown top). */\n readonly height: number;\n /** Crown spread (X and Y), metres. Default: the species' typical ratio to height. */\n readonly spread?: number;\n /** Trunk diameter at breast height (1.3 m), metres. Default: the species' typical ratio. */\n readonly dbh?: number;\n readonly seed?: number;\n /** Part-name prefix: `oak_3` → `oak_3_trunk`, `oak_3_crown`, … */\n readonly prefix?: string;\n}\n\nexport interface TreeInfo {\n readonly parts: { trunk: string; crown: string; branches: string; leaves: string; roots: string };\n readonly height: number;\n readonly spread: number;\n readonly dbh: number;\n}\n\nexport function treeParams(o: Pick<TreeOptions, 'species' | 'params'>): TreeParams {\n const s = o.species ?? 'oak';\n const base = typeof s === 'string' ? SPECIES[s as keyof typeof SPECIES] : s;\n if (!base) {\n throw new Ts23dError('T3D_RECIPE_INVALID', {\n cause: `unknown tree species '${String(s)}'`,\n fix: `use one of ${Object.keys(SPECIES).join(', ')} or pass a TreeParams object (spread a preset and override)`,\n });\n }\n return { ...base, ...o.params };\n}\n\nexport function tree(ctx: BuildContext, o: TreeOptions): TreeInfo {\n const p = treeParams(o);\n if (!(o.height > 0) || p.levels.length < 2 || p.levels.length > 4) {\n throw new Ts23dError('T3D_RECIPE_INVALID', {\n cause: `tree height ${o.height} m with ${p.levels.length} branch levels`,\n fix: 'height must be > 0 and levels must hold the trunk plus 1–3 branch levels',\n });\n }\n const k = o.height / p.typical.height;\n const spread = o.spread ?? p.typical.spread * k;\n const dbh = o.dbh ?? p.typical.dbh * k;\n const pre = o.prefix ? `${o.prefix}_` : '';\n const parts = {\n trunk: `${pre}trunk`,\n crown: `${pre}crown`,\n branches: `${pre}branches`,\n leaves: `${pre}leaves`,\n roots: `${pre}roots`,\n };\n const rng = ctx.rng.fork(`tree:${o.prefix ?? ''}:${o.seed ?? 0}`);\n const stems = grow(p, { height: o.height, dbh }, rng.fork('skeleton'));\n const trunkStem = stems[0];\n if (!trunkStem) return { parts, height: o.height, spread, dbh };\n const deepest = p.levels.length - 1;\n const lod = ctx.lod;\n const top = trunkStem.pts[trunkStem.pts.length - 1]?.[2] ?? o.height;\n const shade = crownShade(stems, 1);\n let trunk: (r: number) => Mesh;\n let roots: ((r: number) => Mesh) | null = null;\n let branches: Mesh | null = null;\n let leaves: Mesh;\n if (lod === 2) {\n const imp =\n p.impostor === 'cards' ? frondCards(stems, p, 1) : blob(stems, p, rng.fork('impostor'));\n trunk = () => barkTint(imp.trunk, p, top, rng.fork('bark'));\n leaves = imp.leaves;\n } else {\n const hi = lod === 0 || deepest < 2 ? deepest : deepest - 1;\n trunk = (r) => trunkMesh(trunkStem, p, lod, r, rng.fork('bark'));\n if (p.roots) roots = (r) => rootsMesh(trunkStem, p, lod, r, rng.fork('roots'));\n const wood = [\n barkTint(stemsMesh(stems, 1, hi, lod, p.bark), p, top, rng.fork('bark:branches')),\n ];\n if (p.fruit && lod === 0)\n wood.push(fruit(trunkStem, p.baseSize - 0.01, p.fruit, rng.fork('fruit')));\n branches = merge(wood);\n const lr = rng.fork('leaves');\n leaves =\n p.leaves.shape === 'frond'\n ? frondLeaflets(\n stems,\n deepest,\n p.leaves,\n lod === 0 ? p.leaves.perStem : Math.ceil(p.leaves.perStem / 2),\n shade,\n lr,\n )\n : hi === deepest\n ? leafCards(stems, deepest, radialSegments(deepest, lod), p.leaves, shade, lr)\n : clusterCards(stems, deepest, p.leaves, shade, lr);\n }\n // Fit onto the real envelope; the trunk is rebuilt thinner by 1/sy so DBH (across Y) is exact.\n const s = fitFactors(\n [trunk(1), branches, leaves, roots?.(1) ?? null].filter((m): m is Mesh => m !== null),\n [spread, spread, o.height],\n );\n const fit = (m: Mesh): Mesh => scaleMesh(m, s);\n const base = trunkStem.pts[Math.round(p.baseSize * (trunkStem.pts.length - 1))] ?? [0, 0, 0];\n const pivot: Vec3 = [base[0] * s[0], base[1] * s[1], base[2] * s[2]];\n const back: Vec3 = [-pivot[0], -pivot[1], -pivot[2]];\n ctx.part(parts.trunk, fit(trunk(1 / s[1])));\n if (roots) ctx.part(parts.roots, fit(roots(1 / s[1])));\n ctx.group(parts.crown, {\n at: pivot,\n motion: { kind: 'sway', axis: [1, 0, 0], degrees: 2, hz: 0.4 },\n // The crown grows out of the trunk: they meet by design, and the clash gate's conservative\n // full-turn sway volume would otherwise flag the wood that holds it.\n clearOf: roots ? [parts.trunk, parts.roots] : [parts.trunk],\n });\n if (branches && triangleCount(branches) > 0)\n ctx.part(parts.branches, translate(fit(branches), back), { parent: parts.crown });\n ctx.part(parts.leaves, translate(fit(leaves), back), { parent: parts.crown });\n return { parts, height: o.height, spread, dbh };\n}\n\n/** `real` for a tree recipe: overall envelope plus DBH (trunk across Y) and total height. */\nexport function treeReal(o: {\n height: number;\n spread: number;\n dbh: number;\n prefix?: string;\n source?: string;\n}): RealDimensions {\n const pre = o.prefix ? `${o.prefix}_` : '';\n const src = o.source ? { source: o.source } : {};\n return {\n length: o.spread,\n width: o.spread,\n height: o.height,\n measures: [\n {\n label: 'trunk diameter at breast height',\n value: o.dbh,\n axis: 'y',\n parts: [`${pre}trunk`],\n ...src,\n },\n {\n label: 'total height',\n value: o.height,\n axis: 'z',\n parts: [`${pre}trunk`, `${pre}crown`, `${pre}branches`, `${pre}leaves`, `${pre}roots`],\n ...src,\n },\n ],\n };\n}\n\nexport type TreeFamilyParams = Omit<TreeOptions, 'prefix'>;\n\n/** One family, many species: `trees.variant({ name: 'oak', params: { species: 'oak', height: 22 } })`. */\nexport const trees = defineFamily<TreeFamilyParams>({\n kind: 'vegetation',\n tags: ['vegetation', 'tree'],\n budget: BUDGETS.tree,\n defaults: { species: 'oak', height: 22 },\n build: (ctx, p) => {\n tree(ctx, p);\n },\n});\n",
41
+ "// Vehicle helpers: wheels that spin, tracks, propellers. Named parts follow the engine contract:\n// `axle_*` and `wheel_*` spin about local Y, `prop_*`/`rotor_*` spin about their own axis.\n\nimport { type BuildContext, place, type Vec3 } from '../core/index.ts';\nimport { parseWhyte } from '../grammar/index.ts';\nimport { box, cylinder } from '../primitives/index.ts';\n\nconst segs = (ctx: BuildContext, hi: number): number => [hi, Math.max(8, hi / 2), 6][ctx.lod] ?? 6;\n\n/** A pair of wheels on one spinning axle. */\nexport function axle(\n ctx: BuildContext,\n o: {\n name: string;\n at: Vec3;\n radius: number;\n gauge: number;\n width: number;\n color: Vec3;\n rps: number;\n },\n): void {\n ctx.group(o.name, { at: o.at, motion: { kind: 'spin', axis: [0, 1, 0], rps: o.rps } });\n for (const [s, y] of [\n ['l', o.gauge / 2],\n ['r', -o.gauge / 2],\n ] as const) {\n ctx.part(\n `${o.name}_wheel_${s}`,\n cylinder({\n radius: o.radius,\n length: o.width,\n segments: segs(ctx, 24),\n axis: 'y',\n at: [0, y, 0],\n color: o.color,\n strip: 'iron',\n }),\n { parent: o.name },\n );\n }\n}\n\n/** Lays out wheel groups from a Whyte arrangement along X; returns axle x-positions per role. */\nexport function whyteAxles(\n arrangement: string,\n o: { leading: number; driving: number; trailing: number; spacing: number },\n): { role: string; x: number; radius: number }[] {\n const groups = parseWhyte(arrangement);\n const out: { role: string; x: number; radius: number }[] = [];\n let x = 0;\n for (const g of groups) {\n const r = g.role === 'driving' ? o.driving : g.role === 'leading' ? o.leading : o.trailing;\n for (let i = 0; i < g.count / 2; i++) {\n out.push({ role: g.role, x: x + r, radius: r });\n x += r * 2 + o.spacing;\n }\n }\n const mid = x / 2;\n // Front (+X) is the leading end.\n return out.map((a) => ({ ...a, x: mid - a.x }));\n}\n\n/** One side of a tracked running gear: road wheels (spinning) + a flat track loop. */\nexport function trackRun(\n ctx: BuildContext,\n o: {\n side: 'l' | 'r';\n y: number;\n length: number;\n wheels: number;\n radius: number;\n width: number;\n color: Vec3;\n track: Vec3;\n },\n): void {\n const pitch = o.length / o.wheels;\n for (let i = 0; i < o.wheels; i++) {\n const x = -o.length / 2 + pitch * (i + 0.5);\n ctx.part(\n `road_wheel_${o.side}_${i}`,\n cylinder({\n radius: o.radius,\n length: o.width * 0.8,\n segments: segs(ctx, 20),\n axis: 'y',\n at: [0, 0, 0],\n color: o.color,\n strip: 'iron',\n }),\n { at: [x, o.y, o.radius + 0.06], motion: { kind: 'spin', axis: [0, 1, 0], rps: -0.6 } },\n );\n }\n const t = 0.06;\n ctx.part(\n `track_${o.side}_bottom`,\n box({\n size: [o.length + o.radius, o.width, t],\n at: [0, o.y, 0],\n color: o.track,\n strip: 'iron',\n }),\n );\n ctx.part(\n `track_${o.side}_top`,\n box({\n size: [o.length, o.width, t],\n at: [0, o.y, o.radius * 2 + 0.06],\n color: o.track,\n strip: 'iron',\n }),\n );\n}\n\n/** A propeller hub + blades that spin about X (nose direction). */\nexport function propeller(\n ctx: BuildContext,\n o: { name: string; at: Vec3; radius: number; blades: number; color: Vec3; parent?: string },\n): void {\n ctx.group(o.name, {\n at: o.at,\n ...(o.parent ? { parent: o.parent } : {}),\n motion: { kind: 'spin', axis: [1, 0, 0], rps: 6 },\n });\n ctx.part(\n `${o.name}_hub`,\n cylinder({\n radius: o.radius * 0.12,\n length: o.radius * 0.3,\n segments: segs(ctx, 12),\n axis: 'x',\n color: o.color,\n }),\n { parent: o.name },\n );\n // One blade built pointing up (+Z) from the hub, then rolled about the spin axis per blade.\n const blade = box({ size: [0.03, o.radius * 0.12, o.radius], color: o.color });\n for (let i = 0; i < o.blades; i++) {\n ctx.part(`${o.name}_blade_${i}`, place(blade, { roll: (i / o.blades) * Math.PI * 2 }), {\n parent: o.name,\n });\n }\n}\n"
42
+ ],
43
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,IAAM,MAAM;AAGL,SAAS,QAA+B,CAAC,MAAoB,GAA0B;AAAA,EAC5F,MAAM,MAAW,CAAC;AAAA,EAClB,MAAM,IAAI,KAAK;AAAA,EACf,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK;AAAA,IAC1B,MAAM,IAAI,KAAK;AAAA,IACf,MAAM,IAAI,KAAM,KAAI,KAAK;AAAA,IACzB,IAAI,MAAM,aAAa,MAAM;AAAA,MAAW;AAAA,IACxC,MAAM,KAAK,EAAE,CAAC;AAAA,IACd,MAAM,KAAK,EAAE,CAAC;AAAA,IACd,IAAI,MAAM;AAAA,MAAK,IAAI,KAAK,CAAC;AAAA,IACzB,IAAI,MAAM,QAAQ,MAAM,KAAK;AAAA,MAC3B,MAAM,IAAI,MAAM,KAAK;AAAA,MACrB,IAAI,KAAK,EAAE,IAAI,CAAC,GAAG,MAAM,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC,CAAiB;AAAA,IACrE;AAAA,EACF;AAAA,EACA,OAAO,OAAO,GAAG;AAAA;AAIZ,SAAS,MAA6B,CAAC,MAAyB;AAAA,EACrE,MAAM,MAAW,CAAC;AAAA,EAClB,WAAW,KAAK,MAAM;AAAA,IACpB,MAAM,IAAI,IAAI,GAAG,EAAE;AAAA,IACnB,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,SAAI;AAAA,MAAG,IAAI,KAAK,CAAC;AAAA,EAC1E;AAAA,EACA,MAAM,QAAQ,IAAI;AAAA,EAClB,MAAM,OAAO,IAAI,GAAG,EAAE;AAAA,EACtB,IAAI,IAAI,SAAS,KAAK,SAAS,QAAQ,MAAM,MAAM,CAAC,GAAG,MAAM,KAAK,IAAI,KAAK,KAAK,MAAM,EAAE,IAAI,SAAI;AAAA,IAC9F,IAAI,IAAI;AAAA,EACV,OAAO;AAAA;AAIF,IAAM,QAAQ,CAAC,SACpB,KAAK,OAAO,CAAC,GAAG,GAAG,MAAM;AAAA,EACvB,MAAM,IAAI,KAAM,KAAI,KAAK,KAAK,WAAW;AAAA,EACzC,OAAO,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AAAA,GACjC,CAAC,IAAI;AAGH,IAAM,aAAa,CAAC,UAA2B,eAAc,OAAO,QAAQ,eAAe;AAiB3F,SAAS,QAAQ,CAAC,GAAgB,GAAwB;AAAA,EAC/D,IAAI,EAAE,OAAO,SAAS;AAAA,IAAG,OAAO;AAAA,EAChC,MAAM,IAAI,WAAU,EAAE,MAAM;AAAA,EAC5B,MAAM,SAAS,KAAI,OAAO,EAAE,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,IAAI,EAAE;AAAA,EAC1E,MAAM,OAAO,WAAU,KAAI,EAAE,IAAI,OAAO,GAAG,KAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAAA,EACzD,MAAM,OAAO,OAAM,MAAM,CAAC;AAAA,EAC1B,MAAM,OAAO,WAAU,EAAE,KAAK;AAAA,EAC9B,MAAM,QAAQ,WAAW,EAAE,KAAK;AAAA,EAChC,MAAM,MAAM,CAAC,MAAoB,KAAI,KAAI,GAAG,EAAE,OAAO,GAAG,IAAI;AAAA,EAC5D,MAAM,KAAK,OAAO,IAAI,GAAG;AAAA,EACzB,MAAM,KAAK,KAAK,IAAI,GAAG,EAAE;AAAA,EACzB,MAAM,KAAK,KAAK,IAAI,GAAG,EAAE;AAAA,EACzB,IAAI,KAAK,KAAK;AAAA,IAAM,OAAO;AAAA,EAC3B,MAAM,SAAS,CAAC,MAAmB,OAAO,EAAE,UAAU,aAAa,EAAE,MAAM,CAAC,IAAI,EAAE;AAAA,EAClF,MAAM,QAA4B,CAAC;AAAA,EACnC,IAAI,EAAE,WAAW;AAAA,IAAO,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;AAAA,EAC3C,KAAK;AAAA,IACH,SAAS,IAAI,KAAK,MAAM,KAAK,QAAQ,WAAI,EAAG,IAAI,QAAQ,KAAK,aAAM,KAAK;AAAA,MACtE,MAAM,KAAK,CAAC,IAAI,QAAQ,IAAI,KAAK,KAAK,CAAC;AAAA,IACzC;AAAA;AAAA,EAEF,IAAI,OAAO;AAAA,EACX,YAAY,IAAI,OAAO,OAAO;AAAA,IAC5B,MAAM,OAAO,KAAK;AAAA,IAClB,MAAM,OAAO,SACX,SAAS,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,GACnC,CAAC,MAAM,IAAI,CAAC,IAAI,EAClB;AAAA,IACA,IAAI,KAAK,SAAS;AAAA,MAAG;AAAA,IACrB,MAAM,MAAM,KAAK,IAAI,CAAC,MAAM;AAAA,MAC1B,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC;AAAA,MACvD,OAAO,EAAE,OAAO;AAAA,QACd;AAAA,QACA;AAAA,QACA,IAAI;AAAA,UACF,KAAK,KAAM,KAAI,GAAG,IAAI,IAAI,KAAK,UAAW,KAAK,KAAK,KAAK;AAAA,UACzD,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK;AAAA,QAChC;AAAA,QACA,OAAO,OAAO,CAAC;AAAA,MACjB,CAAC;AAAA,KACF;AAAA,IACD,MAAM,QAAQ,IAAI,MAAM;AAAA,IACxB,SAAS,IAAI,EAAG,IAAI,IAAI,IAAI,QAAQ;AAAA,MAAK,EAAE,IAAI,OAAO,IAAI,MAAM,GAAG,IAAI,IAAI,MAAM,CAAC;AAAA,IAClF,QAAQ,IAAI,SAAS;AAAA,EACvB;AAAA,EACA,OAAO;AAAA;AAIF,SAAS,MAAM,CAAC,MAA6B;AAAA,EAClD,MAAM,IAA8B,CAAC,GAAG,GAAG,CAAC;AAAA,EAC5C,SAAS,IAAI,EAAG,IAAI,KAAK,QAAQ,KAAK;AAAA,IACpC,MAAM,IAAI,KAAK,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,IAC7B,MAAM,IAAI,KAAM,KAAI,KAAK,KAAK,WAAW;AAAA,IACzC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE;AAAA,IAClC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE;AAAA,IAClC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE;AAAA,EACpC;AAAA,EACA,OAAO;AAAA;AAGT,IAAM,SAAS,CAAC,GAAS,MAAoB,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,CAAC;;;ACnHnE,SAAS,KAAI,CAAC,GAAgB,MAAW,GAAS;AAAA,EACvD,OAAO,GAAG,GAAG,KAAK,EAAE;AAAA,EACpB,IAAI,EAAE,IAAI,KAAK,IAAI,KAAK,IAAI;AAAA,IAC1B,MAAM,IAAI,YAAW,sBAAsB;AAAA,MACzC,OAAO,iBAAiB,EAAE,KAAK,KAAK,IAAI;AAAA,MACxC,KAAK;AAAA,IACP,CAAC;AAAA,EACH,OAAO,IAAI,IAAI,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,EACrC,OAAO,IAAI,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EACpF,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,QAAQ,EAAE,SAAS;AAAA,EACzB,MAAM,SAAe,CAAC,GAAG,GAAG,EAAE,gBAAgB,CAAC;AAAA,EAC/C,MAAM,QAAoE;AAAA,IACxE;AAAA,MACE;AAAA,MACA,CAAC,GAAG,GAAG,CAAC;AAAA,MACR;AAAA,QACE,CAAC,IAAI,IAAI,EAAE;AAAA,QACX,CAAC,IAAI,IAAI,EAAE;AAAA,QACX,CAAC,IAAI,IAAI,EAAE;AAAA,QACX,CAAC,IAAI,IAAI,EAAE;AAAA,MACb;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA,CAAC,IAAI,GAAG,CAAC;AAAA,MACT;AAAA,QACE,CAAC,IAAI,IAAI,EAAE;AAAA,QACX,CAAC,IAAI,IAAI,EAAE;AAAA,QACX,CAAC,IAAI,IAAI,EAAE;AAAA,QACX,CAAC,IAAI,IAAI,EAAE;AAAA,MACb;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA,CAAC,GAAG,GAAG,CAAC;AAAA,MACR;AAAA,QACE,CAAC,IAAI,IAAI,EAAE;AAAA,QACX,CAAC,IAAI,IAAI,EAAE;AAAA,QACX,CAAC,IAAI,IAAI,EAAE;AAAA,QACX,CAAC,IAAI,IAAI,EAAE;AAAA,MACb;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA,CAAC,GAAG,IAAI,CAAC;AAAA,MACT;AAAA,QACE,CAAC,IAAI,IAAI,EAAE;AAAA,QACX,CAAC,IAAI,IAAI,EAAE;AAAA,QACX,CAAC,IAAI,IAAI,EAAE;AAAA,QACX,CAAC,IAAI,IAAI,EAAE;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA,YAAY,MAAM,QAAQ,WAAW,OAAO;AAAA,IAC1C,IAAI,EAAE,MAAM,SAAS,IAAI;AAAA,MAAG;AAAA,IAC5B,SAAS,GAAG;AAAA,MACV;AAAA,MACA;AAAA,MACA,IAAI,CAAC,GAAG,GAAG,CAAC;AAAA,MACZ,SAAS;AAAA,MACT,OAAO,EAAE;AAAA,MACT;AAAA,MACA,QAAQ,MAAM;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EACA,YAAY,MAAM,GAAG,MAAM;AAAA,IACzB,CAAC,OAAO,IAAI,CAAC;AAAA,IACb,CAAC,UAAU,IAAI,EAAE;AAAA,EACnB,GAAY;AAAA,IACV,IAAI,EAAE,MAAM,SAAS,IAAI;AAAA,MAAG;AAAA,IAC5B,SAAS,GAAG;AAAA,MACV,QAAQ;AAAA,QACN,CAAC,IAAI,IAAI,CAAC;AAAA,QACV,CAAC,IAAI,IAAI,CAAC;AAAA,QACV,CAAC,IAAI,IAAI,CAAC;AAAA,QACV,CAAC,IAAI,IAAI,CAAC;AAAA,MACZ;AAAA,MACA,QAAQ,CAAC,GAAG,GAAG,CAAC;AAAA,MAChB,IAAI,CAAC,GAAG,GAAG,CAAC;AAAA,MACZ,SAAS,CAAC,IAAI,IAAI,CAAC;AAAA,MACnB,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAAA,EACA,OAAO,EAAE,MAAM;AAAA;;;ACpEjB,IAAM,MAAmC;AAAA,EACvC,OAAO;AAAA,EACP,MAAM,KAAK,KAAK;AAAA,EAChB,MAAM,KAAK;AAAA,EACX,OAAO,CAAC,KAAK,KAAK;AACpB;AAGA,IAAM,SAAS,CAAC,MAAY,GAAW,GAAW,OAAa,UAC7D,KAAI,EAAE,MAAM,IAAI,CAAC,KAAK,KAAK,GAAG,GAAG,CAAC,GAAG,OAAO,MAAM,CAAC,MAAM,MAAO,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAG,CAAC;AAEpF,SAAS,QAAO,CAAC,GAAmB,MAAW,GAAS;AAAA,EAC7D,QAAQ,OAAO,GAAG,QAAQ,MAAM;AAAA,EAChC,IAAI,EAAE,IAAI,OAAO,IAAI,OAAO,OAAO,SAAS,CAAC,KAAK,OAAO,SAAS,CAAC;AAAA,IACjE,MAAM,IAAI,YAAW,sBAAsB;AAAA,MACzC,OAAO,GAAG,EAAE,mBAAmB,OAAO;AAAA,MACtC,KAAK;AAAA,IACP,CAAC;AAAA,EACH,MAAM,IAAI,EAAE,SAAS;AAAA,EACrB,MAAM,IAAI,EAAE,YAAY;AAAA,EACxB,MAAM,OAAO,EAAE,QAAQ,CAAC,MAAM,MAAM,IAAI;AAAA,EACxC,MAAM,OAAO,EAAE,SAAS;AAAA,EACxB,MAAM,QAAgB,CAAC;AAAA,EAEvB,MAAM,KACJ,OACI,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,OAAO,MAAM,IAC1C,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,OAAO,OAAO,CACjD;AAAA,EACA,IAAI,MAAM,GAAG;AAAA,IACX,MAAM,SAAS,EAAE,UAAU;AAAA,IAE3B,MAAM,SAAS,CAAC,MAAY,GAAW,MACrC,MACE;AAAA,MACE;AAAA,MACA,IAAI,CAAC,KAAK,KAAK,GAAG,GAAG,CAAC;AAAA,MACtB,OAAO,EAAE;AAAA,MACT,OAAO,EAAE,aAAa;AAAA,MACtB,cAAc,CAAC,EAAE,GAAG;AAAA,MACpB,MAAM,CAAC,MAAM;AAAA,IACf,GACA,GACF;AAAA,IACF,WAAW,QAAQ,CAAC,IAAI,CAAC;AAAA,MAAG,MAAM,KAAK,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC;AAAA,IACnF,IAAI;AAAA,MAAQ,MAAM,KAAK,OAAO,CAAC,IAAI,MAAM,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,GAAG,GAAG,MAAM,OAAO,CAAC;AAAA,IACrF;AAAA,MAAK,MAAM,KAAK,OAAO,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,IAC/C,IAAI,CAAC,SAAS,EAAE,QAAQ;AAAA,MACtB,MAAM,KAAK,OAAO,CAAC,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,GAAG,GAAG,OAAO,MAAM,OAAO,CAAC;AAAA,IAChF,IAAI,CAAC;AAAA,MAAM,MAAM,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,IAC3C,KAAK,IAAI,QAAQ;AAAA,MAAG,MAAM,KAAK,GAAG,OAAO,GAAG,GAAG,CAAC,CAAC;AAAA,EACnD;AAAA,EACA,OAAO,OAAM,OAAM,KAAK,GAAG,EAAE,KAAK,IAAI,EAAE,SAAS,IAAI,EAAE,GAAG,CAAC;AAAA;AAI7D,SAAS,IAAI,CAAC,GAAmB,GAAW,GAAW,KAAkB;AAAA,EACvE,MAAM,IAAI;AAAA,EACV,MAAM,IAAI;AAAA,EACV,MAAM,MAAM;AAAA,IACV,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,KAAK;AAAA,IAC9C,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,KAAK;AAAA,IAC3C,OAAO,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,KAAK;AAAA,IACvC,OAAO,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,KAAK;AAAA,EAC7C;AAAA,EACA,IAAI,MAAM;AAAA,IAAG,OAAO;AAAA,EACpB,OAAO,QAAQ,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC;AAAA,EACrC,MAAM,MAAM;AAAA,EACZ,SAAS,IAAI,EAAG,IAAI,QAAQ;AAAA,IAC1B,IAAI,KACF,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,KAAM,IAAI,IAAI,KAAK,IAAK,QAAQ,GAAG,EAAE,KAAK,CACvF;AAAA,EACF,SAAS,IAAI,EAAG,IAAI,IAAI;AAAA,IACtB,IAAI,KAAK,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,KAAM,IAAI,IAAI,KAAK,IAAK,KAAK,MAAM,GAAG,EAAE,KAAK,CAAC;AAAA,EAC9F,OAAO;AAAA;AAIT,SAAS,MAAM,CAAC,GAAmB,GAAW,GAAmB;AAAA,EAC/D,MAAM,MAAc,CAAC;AAAA,EACrB,MAAM,MAAM,IAAI,QAAQ;AAAA,EACxB,MAAM,OAAa,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,MAAM,KAAK,MAAM,EAAE,MAAM,KAAK,IAAI;AAAA,EAC3E,WAAW,KAAK,CAAC,IAAI,CAAC;AAAA,IACpB,YAAY,IAAI,OAAO;AAAA,MACrB,CAAC,MAAM,IAAI,IAAI;AAAA,MACf,CAAC,OAAO,IAAI,OAAO,MAAM,IAAI,OAAO,IAAI,IAAI;AAAA,IAC9C;AAAA,MACE,IAAI,KACF,KAAI;AAAA,QACF,MAAM,CAAC,MAAM,IAAI,EAAE;AAAA,QACnB,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,EAAE;AAAA,QAClC,OAAO;AAAA,QACP,MAAM,CAAC,MAAM;AAAA,MACf,CAAC,CACH;AAAA,EAEJ,IAAI,KACF,KAAI,EAAE,MAAM,CAAC,MAAM,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,GAAG,OAAO,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC,CAC9F;AAAA,EACA,OAAO;AAAA;;;ACpGT,IAAM,WAAW,IAAI,IAAI,CAAC,OAAO,QAAQ,QAAQ,MAAM,CAAC;AAEjD,SAAS,OAAM,CAAC,KAAmB,GAAwB;AAAA,EAChE,OAAO,GAAG,KAAK,EAAE;AAAA,EACjB,MAAM,QAAQ,EAAE,eAAe;AAAA,EAC/B,MAAM,QAAQ;AAAA,EACd,WAAW,QAAQ,EAAE,OAAO;AAAA,IAC1B,MAAM,QAAQ,SAAS,WAAW,SAAS,SAAS,IAAI;AAAA,IACxD,SAAS,IAAI,EAAG,IAAI,EAAE,QAAQ,KAAK;AAAA,MACjC,MAAM,OAAO,MAAM,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE;AAAA,MAChD,MAAM,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE;AAAA,MAC1B,OAAM,MAAM,KAAK,EAAE,QAAQ,CAAC,MAAM,MAAM;AAAA,QACtC,IAAI,CAAC,SAAS,IAAI,KAAK,MAAM,KAAK,KAAK,OAAO;AAAA,UAAK;AAAA,QACnD,MAAM,SAAS,KAAK,WAAW,UAAU,KAAK,WAAW;AAAA,QACzD,MAAM,IAAI,SAAS,EAAE,cAAc,OAAO,EAAE,cAAc;AAAA,QAC1D,MAAM,OAAO,SAAS,KAAK,EAAE,cAAc,KAAK;AAAA,QAChD,MAAM,IAAI,KAAK,QAAQ,KAAK,OAAO,IAAI,QAAQ;AAAA,QAC/C,MAAM,QAAQ,KAAK,OAAO;AAAA,QAC1B,MAAM,MACJ,SAAS,UACL,CAAC,EAAE,GAAG,KAAK,IAAI,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,IAAI,IACvC,SAAS,SACP,CAAC,EAAE,GAAG,KAAK,IAAI,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,IAAI,IACvC,SAAS,SACP,CAAC,EAAE,GAAG,KAAK,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,IAAI,IACvC,CAAC,EAAE,GAAG,KAAK,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,IAAI;AAAA,QACjD,MAAM,OAAO,GAAG,EAAE,UAAU,QAAQ,KAAK;AAAA,QACzC,IAAI,EAAE,KAAK;AAAA,UACT,MAAM,IAAI,EAAE;AAAA,UACZ,IAAI,KACF,MACA,SACE;AAAA,YACE,MAAM,SAAS,SAAS;AAAA,YACxB,OAAO,KAAK,IAAI,KAAK,QAAQ,GAAG;AAAA,YAChC,QAAQ,KAAK,SAAS,OAAO;AAAA,YAC7B,IAAI;AAAA,YACJ,QAAQ;AAAA,YACR,OAAO,EAAE;AAAA,YACT,OAAO,EAAE,SAAS,CAAC,MAAM,KAAK,IAAI;AAAA,YAClC,MAAM,EAAE;AAAA,eACJ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,eAC7B,EAAE,UAAU,YAAY,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAAA,eAC9C,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAAA,eAChC,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAAA,UAC1C,GACA,IAAI,GACN,CACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,MAAM,OACJ,SAAS,WAAW,SAAS,SAAS,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC;AAAA,QAC5E,IAAI,KACF,MACA,KAAI;AAAA,UACF;AAAA,UACA,IAAI;AAAA,UACJ,OAAO,SAAU,EAAE,SAAS,EAAE,QAAS,EAAE;AAAA,UACzC,OAAO;AAAA,UACP,MAAM,CAAC,QAAQ;AAAA,QACjB,CAAC,CACH;AAAA,OACD;AAAA,IACH;AAAA,EACF;AAAA;AASK,SAAS,SAAQ,CACtB,KACA,GASQ;AAAA,EACR,IAAI,IAAI;AAAA,EACR,EAAE,MAAM,QAAQ,CAAC,GAAG,MAAM;AAAA,IACxB,MAAM,IAAI,EAAE,SAAS,EAAE;AAAA,IACvB,IAAI,KACF,GAAG,EAAE,UAAU,KACf,KAAI;AAAA,MACF,MAAM,CAAC,EAAE,UAAU,IAAI,EAAE,UAAU,IAAI,CAAC;AAAA,MACxC,IAAI,CAAC,GAAG,GAAG,CAAC;AAAA,MACZ,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,MACP,MAAM,MAAM,IAAI,CAAC,QAAQ,IAAI,CAAC;AAAA,IAChC,CAAC,CACH;AAAA,IACA,IAAI,EAAE;AAAA,MACJ,QAAO,KAAK;AAAA,QACV,QAAQ,GAAG,EAAE,UAAU;AAAA,QACvB,IAAI,CAAC,GAAG,GAAG,CAAC;AAAA,QACZ,WAAW,EAAE;AAAA,QACb,QAAQ,EAAE;AAAA,QACV,aAAa,EAAE;AAAA,QACf,SAAS,EAAE;AAAA,QACX,OAAO,CAAC,SAAS,QAAQ,QAAQ,OAAO;AAAA,QACxC,OAAO,EAAE;AAAA,MACX,CAAC;AAAA,IACH,KAAK;AAAA,GACN;AAAA,EACD,OAAO;AAAA;;AClJT,IAAM,MAAM,MAAM,KAAK;AAGhB,SAAS,MAAM,CAAC,GAAS,OAAO,GAAS;AAAA,EAC9C,MAAM,MAAM,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE;AAAA,EACjC,MAAM,QAAQ,CAAC,KAAK,MAAM,EAAE,IAAI,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;AAAA,EACtD,OAAO,CAAC,MAAM,QAAQ,KAAK,MAAM,GAAG;AAAA;AAI/B,SAAS,MAAM,CAAC,GAAe;AAAA,EACpC,MAAM,MAAM,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK;AAAA,EAC5C,MAAM,OAAO,KAAK,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;AAAA,EAC5D,OAAO,CAAC,GAAG,OAAO,KAAK,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,GAAG;AAAA;AAG9C,IAAM,OAAO,CAAC,MAAkB;AAAA,EACrC,MAAM,IAAI,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK;AAAA,EAC1C,OAAO,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,CAAC;AAAA;AAG/B,IAAM,QAAQ,CAAC,GAAS,GAAS,MAAoB;AAAA,EAC1D,EAAE,KAAK,EAAE,KAAK;AAAA,EACd,EAAE,KAAK,EAAE,KAAK;AAAA,EACd,EAAE,KAAK,EAAE,KAAK;AAChB;;;ACnBA,IAAM,MAAM,KAAK,KAAK;AAGf,SAAS,SAAS,CAAC,GAAe,GAA6B;AAAA,EACpE,MAAM,IAAI,EAAE,KAAK,QAAQ;AAAA,EACzB,IAAI,KAAK;AAAA,IAAG,OAAO,CAAC;AAAA,EACpB,OAAO,IAAI,MAAM,EAAE;AAAA,EACnB,MAAM,IAAI,EAAE;AAAA,EACZ,MAAM,OAAa,CAAC,EAAE,KAAK,QAAQ,OAAO,OAAO,GAAG,EAAE,KAAK,QAAQ,MAAM,KAAK;AAAA,EAC9E,MAAM,QAAc,CAAC,KAAK,IAAI,OAAO,KAAK,IAAI,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,KAAK,EAAE;AAAA,EACrF,MAAM,QAAc;AAAA,IAClB,KAAK,IAAI,MAAM,KAAK,KAAK;AAAA,IACzB,KAAK,IAAI;AAAA,IACT,EAAE,QAAQ,EAAE,KAAK,QAAQ,MAAM,KAAK,KAAK;AAAA,EAC3C;AAAA,EACA,MAAM,MAAY;AAAA,KACf,MAAM,KAAK,MAAM,MAAM;AAAA,IACxB,MAAM,MAAM,MAAM,KAAK,MAAM,MAAM;AAAA,KAClC,MAAM,KAAK,MAAM,MAAM,IAAI;AAAA,EAC9B;AAAA,EACA,OAAO;AAAA,IACL;AAAA,MACE,OAAO;AAAA,QACL,EAAE,OAAO,WAAW,IAAI,OAAO,IAAI,KAAK,MAAM,EAAE;AAAA,QAChD,EAAE,OAAO,WAAW,IAAI,KAAK,IAAI,OAAO,MAAM,IAAI,MAAM,OAAO,MAAM;AAAA,MACvE;AAAA,MACA,OAAO,EAAE,OAAO;AAAA,MAChB,OAAO;AAAA,IACT;AAAA,EACF;AAAA;AAIF,IAAM,QAAQ,CAAC,GAAS,QAA4B;AAAA,EAClD,MAAM,IAAU,CAAC,CAAC,KAAK,IAAI,MAAM,GAAG,GAAG,GAAG,KAAK,IAAI,MAAM,GAAG,CAAC;AAAA,EAC7D,OAAO;AAAA,IACL,OAAO;AAAA,IACP,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;AAAA,IACnC,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,IACd,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AAAA,IACnB,IAAI;AAAA,IACJ,OAAO;AAAA,EACT;AAAA;AAGK,SAAS,UAAU,CAAC,GAAe,GAA6B;AAAA,EACrE,IAAI,EAAE,UAAU;AAAA,IAAQ,OAAO,CAAC;AAAA,EAChC,MAAM,IAAI,EAAE,OAAO;AAAA,EACnB,MAAM,QAAc,CAAC,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,IAAI;AAAA,EAC1D,OAAO,IAAI,IAAI,MAAM,EAAE;AAAA,EACvB,MAAM,KAAK,EAAE;AAAA,EACb,MAAM,KAAK,EAAE,MAAM;AAAA,EACnB,MAAM,OAAO,EAAE,MAAM;AAAA,EACrB,MAAM,OAAO,EAAE,UAAU;AAAA,EACzB,MAAM,OAAmB,OACrB;AAAA,IACE,OAAO;AAAA,IACP,IAAI,EAAE,KAAK,GAAG,MAAM,IAAI,MAAM,IAAI,KAAK,GAAG,MAAM,IAAI,IAAI;AAAA,IACxD,MAAM,EAAE,GAAG,KAAK,MAAM,IAAI,MAAM,KAAK,OAAO,IAAI;AAAA,EAClD,IACA,EAAE,OAAO,aAAa,IAAI,CAAC,GAAG,KAAK,MAAM,GAAG,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,KAAK,KAAK,IAAI,EAAE;AAAA,EAC5F,MAAM,MAAoB;AAAA,IACxB;AAAA,MACE,OAAO;AAAA,QACL;AAAA,QAEA;AAAA,UACE,OAAO;AAAA,UACP,IAAI,CAAC,GAAG,KAAK,OAAO,GAAG,GAAG,KAAK,IAAI;AAAA,UACnC,MAAM,CAAC,MAAM,OAAO,OAAO,MAAM,GAAG;AAAA,UACpC,OAAO;AAAA,QACT;AAAA,QAEA,MAAM,CAAC,EAAE,QAAQ,GAAG,EAAE,SAAS,IAAI,GAAG,OAAO,KAAK,CAAC;AAAA,QAEnD;AAAA,UACE,OAAO;AAAA,UACP,IAAI,CAAC,EAAE,SAAS,MAAM,GAAG,EAAE,SAAS,OAAO,GAAG;AAAA,UAC9C,MAAM,CAAC,MAAM,KAAK,MAAM,OAAO,GAAG;AAAA,UAClC,IAAI;AAAA,UACJ,OAAO;AAAA,QACT;AAAA,QAEA,GAAG,CAAC,OAAO,IAAI,EAAE,IACf,CAAC,OAAmB;AAAA,UAClB,OAAO;AAAA,UACP,IAAI,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,SAAS,IAAI;AAAA,UACrC,IAAI,CAAC,GAAG,KAAK,MAAM,IAAI,KAAK,GAAG,KAAK,IAAI;AAAA,UACxC,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,EACF;AAAA,MACF;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,IAAI,EAAE,UAAU;AAAA,IACd,IAAI,KAAK;AAAA,MACP,OAAO;AAAA,MACP,IAAI,CAAC,GAAG,KAAK,MAAM,OAAO,GAAG,KAAK,IAAI;AAAA,MACtC,IAAI,CAAC,GAAG,KAAK,MAAM,OAAO,GAAG,KAAK,IAAI;AAAA,MACtC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,IACT,CAAC;AAAA,EAEH,MAAM,OAAa,CAAC,EAAE,SAAS,MAAM,OAAO,EAAE,SAAS,OAAO,GAAG;AAAA,EACjE,MAAM,OAAa,CAAC,EAAE,SAAS,OAAO,KAAK,MAAM,EAAE,SAAS,OAAO,GAAG;AAAA,EACtE,MAAM,MAAM,MAAM,MAAM,KAAK,CAAC,MAAM,KAAK,EAAE,CAAC,GAAG,IAAI;AAAA,EACnD,IAAI,KAAK;AAAA,IACP,OAAO;AAAA,MACL,EAAE,OAAO,WAAW,IAAI,MAAM,IAAI,MAAM,MAAM,MAAM;AAAA,MACpD,EAAE,OAAO,WAAW,IAAI,MAAM,IAAI,KAAK,MAAM,OAAO,OAAO,KAAK;AAAA,IAClE;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,EACT,CAAC;AAAA,EACD,OAAO;AAAA;;;ACpGT,IAAM,MAAM,CAAC,GAAS,MAAkB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;AAC9E,IAAM,MAAM,CAAC,GAAS,MAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC;AAChG,IAAM,OAAO,CAAC,GAAS,MAAoB,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC;AAGlE,IAAM,SAAS;AAER,SAAS,OAAO,CAAC,GAAe,GAA0B;AAAA,EAC/D,MAAM,IAAI,EAAE,KAAK,QAAQ;AAAA,EAEzB,MAAM,IAAI,EAAE,OAAO,OAAO,MAAM;AAAA,EAChC,MAAM,KAAK,IAAI;AAAA,EACf,OAAO;AAAA,IACL,IAAI,EAAE,QAAQ,GAAG,KAAK,EAAE,IAAI,SAAS;AAAA,IACrC,GAAG,EAAE,KAAK;AAAA,IACV;AAAA,IACA,OAAO,EAAE;AAAA,IACT;AAAA,IACA;AAAA,IACA,GAAG,EAAE,KAAK;AAAA,IACV,OAAO,KAAK,QAAQ,EAAE,MAAM,KAAK,MAAM,KAAK,QAAQ;AAAA,IACpD,MAAM,EAAE,OAAO,SAAS,OAAO,MAAM;AAAA,EACvC;AAAA;AAIK,SAAS,UAAU,CAAC,GAAc,IAAI,GAAiB;AAAA,EAC5D,QAAQ,IAAI,GAAG,GAAG,GAAG,MAAM;AAAA,EAC3B,MAAM,OAAO,CAAC,MAAkB,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,CAAC;AAAA,EAC7D,MAAM,MAAY,CAAC,KAAK,MAAM,IAAI,KAAK,EAAE,KAAK;AAAA,EAC9C,MAAM,WAAiB,CAAC,KAAK,MAAM,IAAI,MAAM,IAAI,OAAO,OAAO,CAAC;AAAA,EAChE,OAAO;AAAA,IAEL;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,KAAK,MAAM,GAAG,IAAI,IAAI;AAAA,MAC3B,MAAM,KAAK,CAAC,OAAO,OAAO,GAAG,IAAI,MAAM,IAAI,CAAC;AAAA,IAC9C;AAAA,IAEA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,KAAK,MAAM,OAAO,GAAG,IAAI,MAAM,IAAI,OAAO,OAAO,CAAC;AAAA,MACvD,MAAM,KAAK,CAAC,OAAO,OAAO,GAAG,IAAI,MAAM,OAAO,OAAO,CAAC,CAAC;AAAA,MACvD,QAAQ,CAAC,KAAK,GAAG,EAAE;AAAA,MACnB,OAAO;AAAA,IACT;AAAA,IAEA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,KAAK,MAAM,IAAI,KAAK,IAAI,MAAM,OAAO,CAAC;AAAA,MAC3C,MAAM,KAAK,CAAC,OAAO,OAAO,GAAG,OAAO,OAAO,GAAG,OAAO,OAAO,CAAC,CAAC;AAAA,MAC9D,QAAQ,CAAC,KAAK,GAAG,CAAC;AAAA,MAClB,OAAO;AAAA,IACT;AAAA,IAGA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,IAAI,KAAK,QAAQ;AAAA,MACrB,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,OAAO,GAAG,OAAO,OAAO,IAAI,GAAG,OAAO,MAAM,IAAI,CAAC;AAAA,MAClF,QAAQ,OAAO,IAAI,UAAU,GAAG,CAAC;AAAA,MACjC,OAAO,OAAO,OAAO;AAAA,IACvB;AAAA,IAEA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,KAAK,MAAM,IAAI,KAAK,IAAI,IAAI;AAAA,MACjC,IAAI,CAAC,KAAK,MAAM,IAAI,KAAK,IAAI,IAAI;AAAA,MACjC,MAAM,OAAO,OAAO,IAAI;AAAA,MACxB,OAAO;AAAA,IACT;AAAA,IAEA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,KAAK,MAAM,OAAO,GAAG,OAAO,EAAE,KAAK,IAAI;AAAA,MAC5C,IAAI,CAAC,KAAK,GAAK,IAAI,MAAM,IAAI,MAAM,OAAO,CAAC;AAAA,MAC3C,MAAM,OAAO,SAAS,IAAI,KAAK;AAAA,MAC/B,OAAO;AAAA,IACT;AAAA,IAEA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,KAAK,KAAK,IAAI,MAAM,IAAI,GAAG;AAAA,MAChC,MAAM,KAAK,CAAC,OAAO,OAAO,GAAG,OAAO,MAAM,GAAG,GAAG,CAAC;AAAA,MACjD,OAAO;AAAA,IACT;AAAA,IAEA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,KAAK,MAAM,GAAG,EAAE,KAAK,OAAO,OAAO,CAAC;AAAA,MACzC,MAAM,KAAK,CAAC,OAAO,OAAO,GAAG,IAAI,MAAM,OAAO,OAAO,CAAC,CAAC;AAAA,MACvD,OAAO;AAAA,IACT;AAAA,EACF;AAAA;AAIK,SAAS,QAAQ,CAAC,GAAqB;AAAA,EAC5C,MAAM,KAAK;AAAA,EACX,MAAM,KAAK,EAAE,IAAI;AAAA,EACjB,MAAM,KAAK,EAAE,OAAO;AAAA,EACpB,MAAM,IAAI,IAAG,UAAU,CAAC,EAAE,IAAI,GAAG,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;AAAA,EACnD,MAAM,MAAM,IAAG,IAAI,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;AAAA,EACtD,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AAAA;AAI9B,SAAS,OAAO,CAAC,GAAc,IAAI,GAAe;AAAA,EACvD,MAAM,KAAK;AAAA,EACX,MAAM,KAAK,EAAE,IAAI,OAAO;AAAA,EAExB,MAAM,KAAK,EAAE,OAAO,KAAK;AAAA,EACzB,OAAO;AAAA,IACL,OAAO;AAAA,MACL,EAAE,OAAO,aAAa,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE;AAAA,MAC7D,EAAE,OAAO,YAAY,IAAI,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,KAAK,GAAG,CAAC,EAAE;AAAA,IACrE;AAAA,IACA,IAAI;AAAA,IACJ,OAAO;AAAA,EACT;AAAA;AAIK,SAAS,SAAS,CAAC,GAAe,GAAc,OAA2B;AAAA,EAChF,QAAQ,IAAI,GAAG,GAAG,OAAO;AAAA,EACzB,MAAM,QAAQ,EAAE,OAAO;AAAA,EACvB,OAAO;AAAA,IACL;AAAA,MACE,OAAO;AAAA,QACL,GAAG,WAAW,CAAC;AAAA,QACf;AAAA,UACE,OAAO;AAAA,UACP,IAAI,CAAC,KAAK,OAAO,OAAO,GAAG,GAAG,KAAK,IAAI;AAAA,UACvC,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,IAAI,CAAC,KAAK,OAAO,OAAO,GAAG,GAAG,IAAI,GAAG;AAAA,UACrC,IAAI,CAAC,KAAK,OAAO,OAAO,GAAG,GAAG,IAAI,IAAI;AAAA,UACtC,MAAM,OAAO,QAAQ;AAAA,UACrB,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,QACA,QAAQ,CAAC;AAAA,MACX;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAIF,IAAM,WAAW,CAAC,IAAU,GAAW,IAAY,QAA4B;AAAA,EAC7E,OAAO;AAAA,IACL,EAAE,OAAO,WAAW,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,MAAM,EAAE;AAAA,IACpF;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,KAAK,MAAM,CAAC;AAAA,MAChC,MAAM,CAAC,GAAG,GAAG,KAAK,EAAE;AAAA,MACpB,IAAI;AAAA,IACN;AAAA,EACF;AACF;AAKO,SAAS,WAAW,CAAC,GAAe,GAAc,OAAO,GAAiB;AAAA,EAC/E,MAAM,IAAI,EAAE,OAAO,UAAW,CAAC,MAAM,MAAM,IAAI;AAAA,EAC/C,MAAM,QAAc,CAAC,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,IAAI;AAAA,EAC1D,MAAM,IAAI,EAAE,KAAK;AAAA,EACjB,MAAM,IAAI,MAAM,OAAO,EAAE;AAAA,EAEzB,IAAI,OAAO;AAAA,IACT,OAAO;AAAA,MACL,KAAK,SAAS,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,MAAM,EAAE,QAAQ,KAAK,EAAE,OAAO,IAAI,GAAG,OAAO,GAAG,QAAQ,MAAM;AAAA,IAC5F;AAAA,EACF,MAAM,OAAO,EAAE,QAAQ;AAAA,EACvB,OAAO;AAAA,IACL,KAAK,SAAS,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,GAAG,QAAQ,MAAM;AAAA,IAC1E;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,GAAG,GAAG,IAAI;AAAA,MACf,MAAM,CAAC,IAAI,MAAM,KAAK;AAAA,MACtB,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,SACK,SAAS,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,MAAM,MAAM,EAAE,OAAO,IAAI;AAAA,MACpD,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AAAA;;;ACxNF,IAAM,OAAM,KAAK,KAAK;AACtB,IAAM,QAAQ,CAAC,GAAS,MAAoB,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,CAAC;AAGzE,IAAM,QAAQ,CAAC,GAAS,QAA4B;AAAA,EAClD,MAAM,IAAU,CAAC,GAAG,CAAC,KAAK,IAAI,MAAM,IAAG,GAAG,KAAK,IAAI,MAAM,IAAG,CAAC;AAAA,EAC7D,OAAO;AAAA,IACL,OAAO;AAAA,IACP,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;AAAA,IAC1C,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,IACd,QAAQ,CAAC,KAAK,GAAG,CAAC;AAAA,IAClB,IAAI;AAAA,EACN;AAAA;AAIF,IAAM,OAAO,CAAC,GAAS,KAAa,OAA2B;AAAA,EAC7D,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,EACd,QAAQ,CAAC,KAAK,GAAG,CAAC;AAAA,EAClB,IAAI;AACN;AAEA,IAAM,MAAM,CAAC,IAAU,GAAS,GAAW,UAA8B;AAAA,EACvE,OAAO;AAAA,EACP;AAAA,EACA,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,CAAC;AAAA,EACnC,QAAQ,CAAC,MAAM,GAAG,CAAC;AACrB;AAGA,SAAS,KAAK,CACZ,IACA,GACA,MACA,KACA,MACA,GACA,GACc;AAAA,EACd,OAAO;AAAA,IACL;AAAA,MACE,OAAO;AAAA,QACL,IAAI,IAAI,GAAG,GAAG,IAAI;AAAA,QAElB,GAAI,IAAI,KAAK,IAAI,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,WAAoB,CAAC,IAAI,CAAC;AAAA,QACzF,MAAM,KAAK,IAAI;AAAA,MACjB;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,QACL,IAAI,IAAI,GAAG,OAAO,IAAI;AAAA,QACtB,GAAI,IAAI,KAAK,IAAI,GAAG,CAAC,IAAI,MACrB,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,WAAoB,CAAC,IAC3D,CAAC;AAAA,QACL,KAAK,KAAK,MAAM,IAAI;AAAA,MACtB;AAAA,MAEA,OAAO,MAAM,GAAG,GAAG;AAAA,MACnB,OAAO;AAAA,IACT;AAAA,EACF;AAAA;AAIK,SAAS,MAAM,CAAC,GAAe,GAAc,OAAO,GAAiB;AAAA,EAC1E,MAAM,IAAI,KAAK,IAAI,OAAO,OAAO,GAAG;AAAA,EACpC,MAAM,IAAI,EAAE;AAAA,EACZ,QAAQ,IAAI,GAAG,GAAG,OAAO;AAAA,EACzB,MAAM,QAAQ,EAAE;AAAA,EAChB,MAAM,MAAoB,CAAC;AAAA,EAE3B,MAAM,MAAY,CAAC,KAAK,MAAM,IAAI,KAAK,IAAI,IAAI;AAAA,EAC/C,SAAS,IAAI,EAAG,KAAK,GAAG,KAAK;AAAA,IAC3B,MAAM,KAAW,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,OAAO,GAAG,IAAI,KAAK,IAAI,IAAI;AAAA,IAClE,MAAM,IAAU,MAAM,IAAI,CAAC,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,MAAM,IAAI;AAAA,IAChE,MAAM,OAAO,EAAE,KAAK,IAAI;AAAA,IACxB,MAAM,MAAY,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,EAAE,KAAK,IAAI;AAAA,IACpD,IAAI,KAAK,GAAG,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,KAAK,MAAM,MAAM,OAAO,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,IAEhF,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK;AAAA,MAC1B,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO;AAAA,MAC9B,IAAI,KAAK;AAAA,QACP,OAAO;AAAA,QACP,IAAI,CAAC,GAAG,GAAG,KAAK,EAAE,KAAK,MAAM,IAAI,KAAK,OAAO,EAAE,KAAK,OAAO,KAAK,IAAI,CAAC,OAAO,IAAG,IAAI,GAAG;AAAA,QACtF,MAAM;AAAA,QACN,OAAO,MAAM,OAAO,IAAI;AAAA,QACxB,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,QAAc,CAAC,IAAI,IAAI,IAAI,KAAK,MAAM,IAAI,KAAK,IAAI;AAAA,EACzD,IAAI,KAAK;AAAA,IACP,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,MAAM,CAAC,MAAM,OAAO,IAAI;AAAA,IACxB,QAAQ,CAAC,KAAK,GAAG,CAAC;AAAA,IAClB,OAAO,MAAM,OAAO,IAAI;AAAA,IACxB,OAAO;AAAA,EACT,CAAC;AAAA,EACD,SAAS,IAAI,EAAG,IAAI,GAAG;AAAA,IACrB,IAAI,KAAK;AAAA,MACP,OAAO;AAAA,MACP,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,MAAM,MAAM,KAAK,MAAM,MAAM,KAAK,OAAO,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI;AAAA,MAC1F,MAAM,CAAC,OAAO,OAAO,OAAO,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI;AAAA,MAClD,QAAQ,OAAO,KAAK,EAAE,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC;AAAA,MAC7C,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,IACT,CAAC;AAAA,EAEH,MAAM,OAAa,CAAC,IAAI,GAAG,IAAI,IAAI;AAAA,EACnC,IAAI,KACF;AAAA,IACE,OAAO,CAAC,EAAE,OAAO,WAAW,GAAG,IAAI,EAAE,GAAG,KAAK,MAAM,IAAI,IAAI,GAAG,QAAQ,CAAC,CAAC;AAAA,IACxE,OAAO,EAAE;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,EACV,GACA;AAAA,IACE,OAAO;AAAA,MACL,EAAE,OAAO,WAAW,GAAG,KAAK,EAAE;AAAA,MAC9B,QAAQ,CAAC;AAAA,MACT;AAAA,QACE,OAAO;AAAA,QACP,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI;AAAA,QAC7B,MAAM,CAAC,KAAK,MAAM,IAAI;AAAA,QACtB,QAAQ,CAAC,IAAI,GAAG,CAAC;AAAA,QACjB,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,IAAI,CAAC,KAAK,MAAM,MAAM,IAAI,IAAI;AAAA,QAC9B,MAAM,CAAC,KAAK,MAAM,IAAI;AAAA,QACtB,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA,OAAO,MAAM,OAAO,GAAG;AAAA,IACvB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV,CACF;AAAA,EAEA,MAAM,MAAM,EAAE,OAAO,EAAE;AAAA,EACvB,MAAM,IAAI,EAAE,IAAI;AAAA,EAChB,SAAS,MAAM,EAAG,MAAM,GAAG;AAAA,IACzB,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK;AAAA,MAC1B,MAAM,KAAK,MAAM,IAAI,KAAK,MAAM,MAAM;AAAA,MACtC,MAAM,KAAK,IAAI,MAAM;AAAA,MACrB,MAAM,OAAa;AAAA,QACjB,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK;AAAA,QACxC,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK;AAAA,QAC7B,KAAK,OAAO,MAAM;AAAA,MACpB;AAAA,MACA,MAAM,MAAM,KAAK,CAAC,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,SAAU,IAAI,OAAO,IAAK,GAAG,CAAC;AAAA,MACnF,IAAI,KAAK;AAAA,QACP,OAAO;AAAA,QACP,IAAI;AAAA,QACJ,MAAM,CAAC,QAAQ,MAAM,OAAO,OAAO,QAAS,IAAI,OAAO,IAAK,IAAI;AAAA,QAChE,QAAQ,OAAO,GAAG;AAAA,QAClB,QAAQ,IAAI,OAAO,IAAI,MAAM,MAAM,KAAK,IAAI;AAAA,QAC5C,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AAAA;;;ACvKT,IAAM,SAAQ,CAAC,GAAS,MAAoB,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,CAAC;AAElE,SAAS,IAAI,CAAC,GAAe,GAA4B;AAAA,EAC9D,MAAM,IAAI,EAAE;AAAA,EACZ,QAAQ,IAAI,GAAG,GAAG,IAAI,MAAM;AAAA,EAC5B,MAAM,QAAQ,EAAE,SAAS,EAAE;AAAA,EAC3B,MAAM,OAAO,EAAE,QAAQ,OAAM,EAAE,OAAO,GAAG;AAAA,EACzC,MAAM,MAAoB;AAAA,IAExB;AAAA,MACE,OAAO;AAAA,QACL,EAAE,OAAO,WAAW,GAAG,KAAK,EAAE;AAAA,QAC9B;AAAA,UACE,OAAO;AAAA,UACP,IAAI,CAAC,KAAK,MAAM,GAAG,KAAK,IAAI;AAAA,UAC5B,MAAM,CAAC,KAAK,MAAM,IAAI;AAAA,UACtB,IAAI;AAAA,UACJ,OAAO;AAAA,QACT;AAAA,QACA,QAAQ,CAAC;AAAA,MACX;AAAA,MACA,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IAEA;AAAA,MACE,OAAO;AAAA,QACL,EAAE,OAAO,WAAW,GAAG,KAAK,EAAE;AAAA,QAC9B;AAAA,UACE,OAAO;AAAA,UACP,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,GAAG;AAAA,UACzB,MAAM,CAAC,KAAK,KAAK,CAAC;AAAA,UAClB,QAAQ,CAAC,GAAG,IAAI,CAAC;AAAA,UACjB,OAAO;AAAA,UACP,IAAI;AAAA,UACJ,OAAO;AAAA,QACT;AAAA,QAEA;AAAA,UACE,OAAO;AAAA,UACP,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,IAAI,IAAI;AAAA,UAClC,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,OAAO;AAAA,QACT;AAAA,QACA,QAAQ,CAAC;AAAA,MACX;AAAA,MACA,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IAEA;AAAA,MACE,OAAO;AAAA,QACL,EAAE,OAAO,WAAW,GAAG,KAAK,EAAE;AAAA,QAC9B;AAAA,UACE,OAAO;AAAA,UACP,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI;AAAA,UACpB,MAAM,CAAC,GAAG,GAAG,IAAI;AAAA,UACjB,QAAQ,CAAC,KAAK,GAAG,CAAC;AAAA,UAClB,IAAI;AAAA,QACN;AAAA,QACA,QAAQ,CAAC;AAAA,MACX;AAAA,MACA,OAAO,OAAM,EAAE,SAAS,IAAI;AAAA,MAC5B,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,OAAO;AAAA,QACL,EAAE,OAAO,WAAW,GAAG,KAAK,EAAE;AAAA,QAC9B;AAAA,UACE,OAAO;AAAA,UACP,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,IAAI;AAAA,UAC9B,MAAM,CAAC,KAAK,KAAK,GAAG;AAAA,UACpB,QAAQ,CAAC,KAAK,GAAG,CAAC;AAAA,UAClB,IAAI;AAAA,QACN;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,IAAI;AAAA,UAC9B,MAAM,CAAC,MAAM,MAAM,IAAI;AAAA,UACvB,QAAQ,CAAC,KAAK,GAAG,CAAC;AAAA,UAClB,IAAI;AAAA,QACN;AAAA,MACF;AAAA,MACA,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,IAGA;AAAA,MACE,OAAO;AAAA,QACL;AAAA,UACE,OAAO;AAAA,UACP,IAAI,CAAC,KAAK,KAAK,GAAG,KAAK,IAAI;AAAA,UAC3B,MAAM,CAAC,IAAI,MAAM,IAAI;AAAA,UACrB,QAAQ,CAAC,GAAG,KAAK,CAAC;AAAA,QACpB;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,IAAI,CAAC,KAAK,MAAM,GAAG,EAAE;AAAA,UACrB,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,UACd,IAAI;AAAA,UACJ,OAAO;AAAA,QACT;AAAA,MACF;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,QACL,EAAE,OAAO,aAAa,IAAI,CAAC,KAAK,MAAM,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,IAAI,EAAE;AAAA,QACjF;AAAA,UACE,OAAO;AAAA,UACP,IAAI,CAAC,KAAK,MAAM,GAAG,KAAK,IAAI;AAAA,UAC5B,MAAM,CAAC,KAAK,OAAO,IAAI;AAAA,UACvB,QAAQ,OAAO,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;AAAA,UACnC,OAAO;AAAA,QACT;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,IAAI,CAAC,KAAK,KAAK,GAAG,KAAK,IAAI;AAAA,UAC3B,MAAM,CAAC,MAAM,IAAI,MAAM,GAAG;AAAA,UAC1B,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,OAAO,OAAM,MAAM,IAAI;AAAA,QACzB;AAAA,MACF;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,IAEA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,KAAK,MAAM,GAAG,KAAK,IAAI;AAAA,MAC5B,MAAM,CAAC,IAAI,MAAM,KAAK;AAAA,MACtB,QAAQ,CAAC,GAAG,KAAK,CAAC;AAAA,MAClB,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,MAAM,OAAa,CAAC,KAAK,IAAI,KAAK,IAAI,MAAM,KAAK,IAAI;AAAA,EACrD,IAAI,KAAK;AAAA,IACP,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,MAAM,CAAC,MAAM,MAAM,IAAI;AAAA,IACvB,OAAO,OAAM,OAAO,IAAI;AAAA,IACxB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV,CAAC;AAAA,EACD,YAAY,IAAI,KAAK,OAAO;AAAA,IAC1B,CAAC,KAAK,KAAK,KAAK;AAAA,IAChB,CAAC,KAAK,MAAM,IAAI;AAAA,EAClB,GAAY;AAAA,IACV,MAAM,MAAM,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;AAAA,IAC9B,IAAI,KAAK;AAAA,MACP,OAAO;AAAA,MACP,IAAI,CAAC,KAAK,KAAK,MAAM,KAAK,KAAK,KAAK,MAAM,KAAK,KAAK,IAAI;AAAA,MACxD,MAAM,CAAC,IAAI,KAAK,KAAK,GAAG;AAAA,MACxB,QAAQ,OAAO,GAAG;AAAA,MAClB,OAAO,KAAK,MAAM,QAAQ,OAAM,OAAO,GAAG;AAAA,MAC1C,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAAA,EACA,OAAO;AAAA;;;AC/JT,SAAS,IAAI,CAAC,GAAe,IAAY,IAA0B;AAAA,EACjE,MAAM,IAAI,EAAE;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,KAAK,MAAM,GAAG,KAAK,IAAI;AAAA,MAC5B,MAAM,CAAC,EAAE,KAAK,SAAS,MAAM,IAAI;AAAA,MACjC,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,KAAK,MAAM,GAAG,KAAK,IAAI;AAAA,MAC5B,MAAM,CAAC,MAAM,KAAK,GAAG;AAAA,MACrB,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,KAAK,MAAM,GAAG,KAAK,GAAG;AAAA,MAC3B,MAAM,CAAC,MAAM,MAAM,IAAI;AAAA,MACvB,QAAQ,CAAC,GAAG,MAAM,CAAC;AAAA,MACnB,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,KAAK,KAAK,MAAM,KAAK,IAAI;AAAA,MAC9B,MAAM,CAAC,MAAM,KAAK,IAAI;AAAA,MACtB,OAAO;AAAA,MACP,QAAQ,CAAC,IAAI,GAAG,CAAC;AAAA,MACjB,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,KAAK,MAAM,MAAM,KAAK,IAAI;AAAA,MAC/B,IAAI,CAAC,KAAK,MAAM,MAAM,KAAK,IAAI;AAAA,MAC/B,MAAM;AAAA,MACN,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,IACT;AAAA,EACF;AAAA;AAGF,SAAS,KAAK,CAAC,GAAe,GAA4B;AAAA,EACxD,MAAM,IAAI,EAAE;AAAA,EACZ,QAAQ,IAAI,GAAG,GAAG,OAAO;AAAA,EACzB,MAAM,QAAQ,CAAC,OAA2B,EAAE,OAAO,WAAW,GAAG,CAAC,EAAE;AAAA,EACpE,MAAM,QAAQ,aAAY,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,QAAQ,IAAI,CAAC,EAAE;AAAA,EAC1E,MAAM,QAAQ,CAAC,MAAsB;AAAA,IACnC,IAAI,IAAI,KAAK;AAAA,IACb,SAAS,IAAI,EAAG,IAAI,OAAO,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,GAAG;AAAA,MAAK,KAAK;AAAA,IAC3D,OAAO;AAAA;AAAA,EAET,MAAM,IAAI,EAAE,KAAK;AAAA,EACjB,MAAM,OAAO,CAAC,MAAoB,CAAC,KAAK,MAAM,GAAG,CAAC;AAAA,EAClD,MAAM,SAAS,CAAC,OAA2B;AAAA,IACzC,OAAO;AAAA,IACP,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,IAAI;AAAA,IAC1B,MAAM,CAAC,OAAO,GAAG,IAAI,OAAO,GAAG,MAAM,CAAC;AAAA,EACxC;AAAA,EACA,MAAM,UAAsB;AAAA,IAC1B,OAAO;AAAA,IACP,IAAI,CAAC,KAAK,MAAM,GAAG,KAAK,GAAG;AAAA,IAC3B,MAAM,CAAC,KAAK,IAAI,MAAM,GAAG;AAAA,IACzB,IAAI;AAAA,IACJ,OAAO;AAAA,EACT;AAAA,EACA,MAAM,SAAS,CAAC,OAA2B;AAAA,IACzC,OAAO;AAAA,MACL,OAAO,IAAI;AAAA,MACX,EAAE,OAAO,UAAU,IAAI,CAAC,KAAK,MAAM,GAAG,IAAI,GAAG,GAAG,MAAM,OAAO,IAAI,YAAY;AAAA,IAC/E;AAAA,IACA,OAAO,EAAE;AAAA,IACT,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IAEL;AAAA,MACE,OAAO;AAAA,QACL,OAAO,CAAC;AAAA,QACR,EAAE,OAAO,YAAY,IAAI,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,YAAY;AAAA,QAC/E;AAAA,QACA,QAAQ,CAAC;AAAA,MACX;AAAA,MACA,OAAO,EAAE,QAAQ,EAAE;AAAA,MACnB,OAAO;AAAA,IACT;AAAA,IACA,OAAO,IAAI,GAAG;AAAA,IAEd;AAAA,MACE,OAAO;AAAA,QACL,EAAE,OAAO,WAAW,IAAI,KAAK,KAAK,IAAI,GAAG,IAAI,KAAK,KAAK,GAAG,GAAG,MAAM,IAAI,KAAK;AAAA,QAC5E;AAAA,UACE,OAAO;AAAA,UACP,IAAI,KAAK,KAAK,GAAG;AAAA,UACjB,IAAI,KAAK,KAAK,GAAG;AAAA,UACjB,MAAM,IAAI;AAAA,UACV,IAAI;AAAA,QACN;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,IAAI,CAAC,KAAK,KAAK,GAAG,KAAK,IAAI;AAAA,UAC3B,MAAM,CAAC,MAAM,MAAM,IAAI;AAAA,UACvB,IAAI;AAAA,UACJ,OAAO;AAAA,QACT;AAAA,MACF;AAAA,MACA,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IAEA;AAAA,MACE,OAAO;AAAA,QACL,MAAM,KAAK;AAAA,QACX,EAAE,OAAO,YAAY,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,MAAM,GAAG,GAAG,IAAI,YAAY;AAAA,MAC3F;AAAA,MACA,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,IAEA,GAAG,CAAC,KAAK,MAAM,IAAI,EAAE,IACnB,CAAC,OAAmB;AAAA,MAClB,OAAO;AAAA,MACP,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC;AAAA,MACnC,MAAM;AAAA,MACN,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,EACF;AAAA,EACF;AAAA;AAIK,SAAS,SAAS,CAAC,GAAe,GAAe,OAAO,GAAiB;AAAA,EAC9E,MAAM,IAAI,EAAE;AAAA,EACZ,MAAM,IAAI,QAAQ,GAAG,CAAC;AAAA,EACtB,MAAM,QAAQ,EAAE,KAAK;AAAA,EACrB,MAAM,OAAO,UAAU,eAAe,UAAU;AAAA,EAChD,MAAM,IAAkB;AAAA,IACtB,GAAG,UAAU,GAAG,GAAG,OAAO,EAAE,OAAO,EAAE,KAAK;AAAA,IAG1C;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,EAAE,KAAK,MAAM,GAAG,EAAE,KAAK,IAAI;AAAA,MAChC,MAAM,CAAC,EAAE,IAAI,MAAM,EAAE,IAAI,MAAM,IAAI;AAAA,MACnC,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,IAAI,UAAU;AAAA,IAAa,EAAE,KAAK,GAAG,OAAO,GAAG,GAAG,IAAI,CAAC;AAAA,EACvD,KAAK,IAAI,UAAU;AAAA,IAAQ,EAAE,KAAK,GAAG,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;AAAA,EACxD,KAAK,IAAI,UAAU;AAAA,IAAQ,EAAE,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;AAAA,EAC/C;AAAA,IAAK,EAAE,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC;AAAA,EAC1B,EAAE,KAAK,GAAG,YAAY,GAAG,GAAG,OAAO,GAAG,CAAC;AAAA,EAEvC,EAAE,KAAK,EAAE,OAAO,YAAY,IAAI,CAAC,GAAG,GAAG,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,WAAW,CAAC;AAAA,EACtF,OAAO;AAAA;;;AC5KT,IAAM,OAAM,KAAK,KAAK;AAGf,SAAS,QAAQ,CAAC,GAAe,GAAe,WAAW,GAAiB;AAAA,EACjF,QAAQ,QAAQ,OAAO,OAAO,MAAM,UAAU,EAAE;AAAA,EAChD,MAAM,KAAK,EAAE,QAAQ,GAAG;AAAA,EACxB,MAAM,KAAK,EAAE,QAAQ,EAAE;AAAA,EACvB,MAAM,OAAa,CAAC,KAAK,MAAM,KAAK,KAAK,EAAE,IAAI,KAAK,IAAI;AAAA,EACxD,MAAM,IAAI,KAAK,CAAC,CAAC,KAAK,IAAI,QAAQ,IAAG,GAAG,KAAK,IAAI,QAAQ,IAAG,GAAG,KAAK,IAAI,OAAO,IAAG,CAAC,CAAC;AAAA,EACpF,MAAM,MAAM,OAAO,GAAG,UAAU,YAAY,MAAM,CAAC;AAAA,EACnD,MAAM,QAAQ,KAAK,IAAI,QAAQ,QAAQ,MAAM,QAAQ;AAAA,EACrD,MAAM,QAAc,CAAC,KAAK,IAAI,QAAQ,IAAG,GAAG,KAAK,IAAI,QAAQ,IAAG,GAAG,CAAC;AAAA,EACpE,MAAM,QAAQ,EAAE,OAAO;AAAA,EACvB,IAAI,UAAU,SAAS;AAAA,IAErB,MAAM,KAAK,MAAM,MAAM,GAAG,IAAI;AAAA,IAC9B,MAAM,OAAa,CAAC,GAAG,CAAC,MAAM,KAAK,KAAK;AAAA,IACxC,OAAO;AAAA,MACL,EAAE,OAAO,aAAa,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,SAAS,CAAC,GAAG,QAAQ,MAAM,OAAO,KAAK;AAAA,MAC1F;AAAA,QACE,OAAO;AAAA,QACP,IAAI,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,GAAG,OAAO,KAAK;AAAA,QACjD,MAAM,CAAC,QAAQ,KAAK,QAAQ,MAAM,SAAS,GAAG;AAAA,QAC9C,QAAQ;AAAA,QACR,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,QAAQ,KAAK,GAAG,KAAK,SAAS,IAAI;AAAA,QACtD,MAAM,CAAC,QAAQ,MAAM,QAAQ,KAAK,SAAS,IAAI;AAAA,QAC/C,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL;AAAA,MACE,OAAO;AAAA,MACP,IAAI,MAAM,MAAM,GAAG,SAAS,GAAG;AAAA,MAC/B,MAAM,CAAC,SAAS,MAAM,OAAO,QAAQ,GAAG;AAAA,MACxC,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,MAAM,MAAM,GAAG,SAAS,IAAI;AAAA,MAChC,MAAM,CAAC,SAAS,MAAM,QAAQ,MAAM,QAAQ,IAAI;AAAA,MAChD,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,MAAM,MAAM,MAAM,GAAG,SAAS,IAAI,GAAG,OAAO,QAAQ,IAAI;AAAA,MAC5D,MAAM,CAAC,SAAS,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAAA,MAC9C,QAAQ;AAAA,MACR,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA,EAAE,OAAO,UAAU,IAAI,MAAM,MAAM,MAAM,OAAO,KAAK;AAAA,EACvD;AAAA;AAKK,SAAS,SAAS,CAAC,GAAe,GAAe,OAAO,GAAiB;AAAA,EAC9E,MAAM,IAAI,EAAE;AAAA,EACZ,IAAI,CAAC;AAAA,IAAG,OAAO,CAAC;AAAA,EAChB,MAAM,MAAoB,CAAC;AAAA,EAC3B,IAAI,KAAW,CAAC,EAAE,SAAS,OAAO,EAAE,IAAI,YAAY,KAAK,EAAE,QAAQ,EAAE,SAAS,IAAI;AAAA,EAClF,IAAI,MAAM,KAAK,CAAC,MAAM,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,EACvC,MAAM,MAAM,EAAE,SAAS;AAAA,EACvB,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK;AAAA,IAC1B,MAAM,KAAK,KAAK,IAAI,EAAE,UAAU,IAAI,IAAI,MAAM,IAAI;AAAA,IAClD,MAAM,KAAK,KAAK,IAAI,EAAE,UAAU,KAAK,IAAI,KAAK,MAAM,OAAO,GAAG;AAAA,IAC9D,IAAI,KAAK;AAAA,MACP,OAAO;AAAA,MACP;AAAA,MACA,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,GAAG,MAAM,IAAI;AAAA,MAC1C,QAAQ,OAAO,GAAG;AAAA,MAClB,OAAO,EAAE,OAAO;AAAA,MAChB,OAAO,MAAM,IAAI,OAAO;AAAA,IAC1B,CAAC;AAAA,IACD,KAAK,MAAM,IAAI,KAAK,GAAG;AAAA,IACvB,MAAM,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,EAAE,QAAQ,MAAM,IAAI,EAAE,CAAC;AAAA,EAC7D;AAAA,EACA,OAAO;AAAA;AAMF,SAAS,UAAU,CAAC,GAAe,GAA6B;AAAA,EACrE,MAAM,IAAI,EAAE,OAAO;AAAA,EACnB,IAAI,CAAC;AAAA,IAAG,OAAO,CAAC;AAAA,EAChB,OAAO,IAAI,IAAI,MAAM,EAAE;AAAA,EACvB,MAAM,OAAO,CAAC,IAAU,GAAS,SAAS,MAAM,OAAO,OAAmB;AAAA,IACxE,OAAO;AAAA,IACP;AAAA,IACA,MAAM;AAAA,IACN,QAAQ,CAAC,MAAM,GAAG,CAAC;AAAA,IACnB,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO;AAAA,IACP;AAAA,EACF;AAAA,EACA,MAAM,SAAS,EAAE,SAAS,EAAE,KAAK,MAAM,IAAI;AAAA,EAC3C,OAAO;AAAA,IACL,KAAK,CAAC,KAAK,KAAK,KAAK,OAAO,KAAK,IAAI,GAAG,CAAC,MAAM,OAAO,IAAI,GAAG,MAAM,EAAE;AAAA,IACrE,KAAK,CAAC,KAAK,KAAK,KAAK,OAAO,KAAK,IAAI,GAAG,CAAC,MAAM,OAAO,KAAK,GAAG,MAAM,EAAE;AAAA,IACtE,KAAK,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,EAAE,QAAQ,IAAI,GAAG,CAAC,KAAK,OAAO,IAAI,GAAG,KAAK;AAAA,IACpE,KAAK,CAAC,EAAE,KAAK,IAAI,GAAG,KAAK,GAAG,CAAC,KAAK,OAAO,IAAI,GAAG,KAAK;AAAA,IACrD,KAAK,CAAC,EAAE,KAAK,IAAI,OAAO,KAAK,GAAG,CAAC,KAAK,OAAO,IAAI,CAAC;AAAA,EACpD;AAAA;AAIK,SAAS,SAAS,CAAC,GAAe,GAAe,KAAwB;AAAA,EAC9E,MAAM,KAAK,EAAE,QAAQ,GAAG;AAAA,EACxB,OAAO,IAAI,IAAI,MAAM,EAAE,QAAQ;AAAA,EAC/B,OAAO,MAAM,KAAK,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAkB;AAAA,IACvD,MAAM,MAAM,IAAI,MAAM,MAAM,GAAG;AAAA,IAC/B,MAAM,KAAK,IAAI,MAAM,MAAM,GAAG;AAAA,IAC9B,MAAM,KAAW;AAAA,MACf,KAAK,KAAK,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG;AAAA,MACrC,KAAK,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG;AAAA,MAChC,EAAE,QAAQ,GAAG,KAAK,KAAK,KAAK,IAAI,EAAE;AAAA,IACpC;AAAA,IACA,OAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA,MAAM,IAAI,MAAM,OAAO,KAAK;AAAA,MAC5B,OAAO,EAAE,OAAO;AAAA,MAChB,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,GACD;AAAA;;;AC1II,SAAS,UAAU,CAAC,GAAe,GAAe,QAAQ,MAAoB;AAAA,EACnF,MAAM,IAAI,EAAE;AAAA,EACZ,MAAM,OAAO,EAAE,MAAM;AAAA,EACrB,MAAM,KAAK,EAAE,MAAM;AAAA,EACnB,MAAM,IAAI,EAAE,MAAM;AAAA,EAClB,MAAM,MAAoB;AAAA,IACxB;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,EAAE,SAAS,MAAM,GAAG,EAAE,SAAS,OAAO,GAAG;AAAA,MAC9C,MAAM,CAAC,OAAO,IAAI,IAAI;AAAA,MACtB,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,EAAE,SAAS,QAAQ,EAAE,IAAI,YAAY,KAAK,GAAG,EAAE,SAAS,OAAO,GAAG;AAAA,MACvE,MAAM,CAAC,QAAQ,EAAE,IAAI,YAAY,KAAK,KAAK,MAAM,QAAQ,MAAM,EAAE,IAAI,YAAY,EAAE;AAAA,MACnF,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,IAAI,IAAI,OAAO,CAAC,OAAO;AAAA,IACrB,IAAI,KAAK;AAAA,MACP,OAAO;AAAA,MACP,IAAI,CAAC,EAAE,SAAS,MAAM,GAAG,EAAE,MAAM;AAAA,MACjC,IAAI,CAAC,EAAE,SAAS,OAAO,OAAO,GAAG,KAAK,MAAM,EAAE,SAAS,QAAQ,IAAI,OAAO,EAAE,KAAK,QAAQ,GAAG;AAAA,MAC5F,MAAM,QAAQ,IAAI;AAAA,MAClB,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,EAAE;AAAA,IACX,CAAC;AAAA,IACD,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,QAAQ,IAAI;AAAA,EACtB,MAAM,KAAK,EAAE,SAAS,IAAI;AAAA,EAC1B,MAAM,OAAO,KAAK;AAAA,EAClB,IAAI,KAAK;AAAA,IACP,OAAO;AAAA,MACL,EAAE,OAAO,aAAa,IAAI,CAAC,EAAE,SAAS,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,MAAM,IAAI,CAAC,EAAE;AAAA,MAC/E;AAAA,QACE,OAAO;AAAA,QACP,IAAI,CAAC,EAAE,SAAS,OAAO,MAAM,GAAG,KAAK,IAAI,GAAG;AAAA,QAC5C,MAAM,CAAC,OAAO,MAAM,KAAK,KAAK,IAAI,GAAG;AAAA,QACrC,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO,EAAE;AAAA,EACX,CAAC;AAAA,EAED,IAAI;AAAA,IACF,IAAI,KAAK;AAAA,MACP,OAAO;AAAA,MACP,IAAI,CAAC,EAAE,SAAS,OAAO,KAAK,GAAG,EAAE,SAAS,IAAI,GAAG;AAAA,MACjD,MAAM,CAAC,OAAO,KAAK,KAAK,MAAM,IAAI,IAAI;AAAA,MACtC,OAAO,CAAC,MAAM,MAAM,IAAI;AAAA,MACxB,OAAO;AAAA,IACT,CAAC;AAAA,EAEH,IAAI,KAAK;AAAA,IACP,OAAO;AAAA,IACP,IAAI,CAAC,EAAE,SAAS,MAAM,KAAK,MAAM,KAAK,IAAI,GAAG;AAAA,IAC7C,MAAM,CAAC,MAAM,OAAO,OAAO,IAAI,IAAI;AAAA,IACnC,QAAQ,CAAC,KAAK,GAAG,CAAC;AAAA,IAClB,OAAO;AAAA,EACT,CAAC;AAAA,EAED,MAAM,IAAI,QAAQ,IAAI;AAAA,EACtB,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK;AAAA,IAC1B,MAAM,KAAK,OAAO,KAAK;AAAA,IACvB,MAAM,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK;AAAA,IAC7B,MAAM,IAAI,EAAE,SAAS,QAAQ,IAAI,KAAK,IAAI,CAAC,KAAK,OAAO;AAAA,IAEvD,MAAM,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,CAAC,CAAC;AAAA,IAC5D,MAAM,KAAK,KAAK,IAAI,MAAM,IAAI,MAAM,KAAK,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,SAAS,CAAC,CAAC;AAAA,IACpF,MAAM,MAAM,OAAO,IAAI,QAAQ,IAAI;AAAA,IACnC,MAAM,IAAI,QAAQ,IAAI,QAAQ,IAAI;AAAA,IAClC,IAAI,KACF;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,GAAG,GAAG,KAAK,KAAK;AAAA,MACrB,MAAM,CAAC,GAAG,OAAO,GAAG;AAAA,MACpB,QAAQ,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC;AAAA,MAC5B,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,IACT,GACA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,IAAI,OAAO,IAAI,MAAM,KAAK,KAAK;AAAA,MACpC,MAAM,CAAC,IAAI,MAAM,OAAO,MAAM,GAAG;AAAA,MACjC,QAAQ,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;AAAA,MAC1B,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,IACT,CACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;;;AChGF,SAAS,YAAY,CAAC,GAA6B;AAAA,EACxD,OAAO,MAAM,MAAM,EAAE,QAAQ;AAAA,EAC7B,OAAO,IAAI,IAAI,MAAM,EAAE,QAAQ;AAAA,EAC/B,OAAO;AAAA,IACL,EAAE,OAAO,aAAa,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE;AAAA,IAC1D;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,EAAE,QAAQ,MAAM,GAAG,EAAE,IAAI,KAAK,IAAI;AAAA,MACvC,MAAM,CAAC,KAAK,KAAK,MAAM,IAAI;AAAA,MAC3B,OAAO;AAAA,IACT;AAAA,EACF;AAAA;AAKK,SAAS,UAAU,CAAC,GAAe,GAAe,OAAO,GAAiB;AAAA,EAC/E,MAAM,OAAO,OAAO;AAAA,EACpB,MAAM,OAAO,KAAK,IAAI,EAAE,KAAK,KAAK,OAAO,GAAG;AAAA,EAC5C,MAAM,IAAI,EAAE;AAAA,EACZ,MAAM,KAAK,EAAE,QAAQ,GAAG;AAAA,EACxB,OAAO,IAAI,IAAI,MAAM,EAAE;AAAA,EACvB,MAAM,IAAI,EAAE;AAAA,EACZ,MAAM,KAAK,EAAE,MAAM;AAAA,EACnB,OAAO,IAAI,IAAI,MAAM,EAAE;AAAA,EACvB,OAAO,IAAI,MAAM,EAAE;AAAA,EACnB,MAAM,OAAO,EAAE;AAAA,EACf,MAAM,OAAO,EAAE,QAAQ,OAAO,EAAE,KAAK,SAAS,OAAO,EAAE,KAAK,SAAS,EAAE,IAAI,SAAS;AAAA,EACpF,MAAM,OAAO,EAAE,QAAQ,QAAQ,EAAE,KAAK;AAAA,EACtC,MAAM,MAAY,CAAC,KAAK,IAAI,MAAM,MAAM,EAAE,QAAQ,EAAE,KAAK,KAAK;AAAA,EAC9D,MAAM,OAAa,CAAC,KAAK,IAAI,MAAM,KAAK,IAAI,KAAK,EAAE,QAAQ,EAAE,KAAK,QAAQ,GAAG;AAAA,EAC7E,MAAM,IAAkB;AAAA,IAEtB,GAAG,aAAa,CAAC;AAAA,IACjB;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,KAAK,OAAO,KAAK,QAAQ,EAAE,OAAO,OAAO,KAAK,IAAI,QAAQ,EAAE,OAAO,IAAI;AAAA,MAC5E,MAAM,CAAC,QAAQ,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,MAAM,QAAQ,EAAE,OAAO,IAAI;AAAA,MACzE,QAAQ,CAAC,GAAG,GAAG,EAAE;AAAA,MACjB,OAAO;AAAA,IACT;AAAA,IAEA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,KAAK,IAAI,MAAM,KAAK,QAAQ,EAAE,OAAO,OAAO,KAAK,IAAI,IAAI;AAAA,MAC9D,IAAI,CAAC,KAAK,MAAM,EAAE,QAAQ,EAAE,KAAK,MAAM,KAAK,IAAI;AAAA,MAChD,MAAM,QAAQ,EAAE,OAAO;AAAA,MACvB,OAAO;AAAA,IACT;AAAA,IAEA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,EAAE,QAAQ,OAAO,EAAE,IAAI,SAAS,KAAK,GAAG,EAAE,QAAQ,IAAI;AAAA,MAC3D,MAAM,CAAC,MAAM,MAAM,EAAE,OAAO,OAAO,IAAI;AAAA,MACvC,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,EAAE,SAAS,MAAM,GAAG,EAAE,SAAS,IAAI;AAAA,MACxC,MAAM,CAAC,MAAM,KAAK,IAAI,KAAK,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,OAAO,GAAG;AAAA,MAC/D,OAAO;AAAA,IACT;AAAA,IAEA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,EAAE,KAAK,KAAK,MAAM,IAAI,MAAM,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI;AAAA,MAC5D,MAAM,CAAC,KAAK,KAAK,KAAK,MAAM,KAAK,MAAM,OAAO,EAAE,IAAI,OAAO,GAAG;AAAA,MAC9D,OAAO;AAAA,MACP,QAAQ,CAAC,GAAG,KAAK,MAAM,KAAK,KAAK,IAAI,KAAK,KAAK,EAAE,KAAK,MAAM,KAAK,MAAM,KAAK,CAAC;AAAA,MAC7E,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,KAAK,MAAM,KAAK,MAAM,EAAE;AAAA,MAC7B,IAAI,CAAC,IAAI,IAAI,EAAE;AAAA,MACf,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,IACA,EAAE,OAAO,UAAU,IAAI,CAAC,KAAK,MAAM,KAAK,MAAM,EAAE,GAAG,MAAM,OAAO,OAAO,KAAK;AAAA,IAC5E;AAAA,MACE,OAAO;AAAA,MACP,IAAI;AAAA,MACJ,MAAM,CAAC,OAAO,EAAE,IAAI,MAAM,OAAO,EAAE,IAAI,MAAM,OAAO,EAAE,IAAI,IAAI;AAAA,MAC9D,OAAO,OAAO,EAAE,IAAI;AAAA,MACpB,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,KAAK,MAAM,GAAG,KAAK,IAAI;AAAA,MAC5B,IAAI,CAAC,KAAK,MAAM,GAAG,EAAE,OAAO,IAAI;AAAA,MAChC,MAAM,EAAE,KAAK;AAAA,MACb,OAAO;AAAA,IACT;AAAA,IAEA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,KAAK,MAAM,EAAE,QAAQ,EAAE,KAAK,MAAM,KAAK,IAAI;AAAA,MAChD,IAAI,CAAC,KAAK,EAAE,KAAK,SAAS,KAAK,MAAM,EAAE,OAAO,IAAI;AAAA,MAClD,MAAM,EAAE,KAAK,SAAS;AAAA,MACtB,OAAO;AAAA,IACT;AAAA,IAGA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,EAAE,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK,MAAM,CAAC;AAAA,MAC3E,MAAM;AAAA,QACJ,KAAK,MAAM,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,EAAE,IAAI,IAAI,EAAE,KAAK,QAAQ;AAAA,QACtF,EAAE,KAAK,QAAQ;AAAA,QACf,EAAE,KAAK,QAAQ;AAAA,MACjB;AAAA,MACA,QAAQ,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;AAAA,MACrE,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,IAAI,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,KAAK,QAAQ,IAAI;AAAA,MACnD,MAAM,EAAE,KAAK,QAAQ;AAAA,MACrB,OAAO;AAAA,IACT;AAAA,IACA,EAAE,OAAO,UAAU,IAAI,EAAE,KAAK,MAAM,IAAI,MAAM,IAAI,YAAY,OAAO,IAAI,KAAK,OAAO,EAAE,MAAM;AAAA,EAC/F;AAAA,EAGA,MAAM,MAAM,CAAC,KAAa,UAA+B;AAAA,IACvD,MAAM,IAAK,MAAM,KAAK,KAAM;AAAA,IAC5B,MAAM,IAAU,QAAQ,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,CAAC;AAAA,IACrF,MAAM,IAAI,QAAQ,IAAI;AAAA,IACtB,OAAO;AAAA,MACL,OAAO;AAAA,QACL,EAAE,OAAO,UAAU,IAAI,EAAE,KAAK,MAAM,KAAK,QAAQ,OAAO,KAAK;AAAA,QAC7D;AAAA,UACE,OAAO;AAAA,UACP,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,KAAK,EAAE,KAAK,CAAC;AAAA,UACrC,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,UACd,QAAQ,CAAC,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC;AAAA,UACjC,IAAI;AAAA,QACN;AAAA,MACF;AAAA,MACA,OAAO,IAAI;AAAA,IACb;AAAA;AAAA,EAEF,EAAE,KAAK,IAAI,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,EAAE,KAAK,UAAU,KAAK,CAAC;AAAA,EAEzD,MAAM,OAAO,EAAE,KAAK,SAAS,OAAO,OAAO;AAAA,EAC3C,MAAM,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI,MAAM,EAAE,KAAK,QAAQ,KAAK,CAAC,IAAI;AAAA,EACnE,MAAM,QAAQ,KAAK,IAAI,OAAO,EAAE,KAAK,QAAQ,KAAK,OAAO,IAAI;AAAA,EAE7D,MAAM,QAAQ,KAAK,IAAI,OAAO,EAAE,KAAK,MAAM,KAAK,EAAE,QAAQ,MAAM,EAAE,IAAI,SAAS,GAAG;AAAA,EAClF,MAAM,WAAiB,CAAC,KAAK,IAAI,KAAK,GAAG,KAAK,IAAI,GAAG;AAAA,EACrD,MAAM,UAAgB,CAAC,OAAO,SAAS,IAAI,GAAG,OAAO,OAAO,SAAS,EAAE;AAAA,EACvE,MAAM,UAAgB;AAAA,KACnB,KAAK,IAAI,MAAM,QAAQ;AAAA,IACxB;AAAA,KACC,KAAK,OAAO,QAAQ,IAAI,EAAE,KAAK,OAAO,MAAM;AAAA,EAC/C;AAAA,EACA,EAAE,KACA;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,MAAM,CAAC,OAAO,OAAO,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC;AAAA,IACjD,QAAQ,OAAO,OAAO;AAAA,IACtB,OAAO;AAAA,EACT,GACA;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,OAAQ,QAAQ,QAAQ,IAAK,OAAO,KAAK,IAAI,GAAG,EAAE,KAAK,IAAI,IAAI;AAAA,IAC/D,OAAO;AAAA,EACT,GACA,EAAE,OAAO,UAAU,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,MAAM,MAAM,OAAO,MAAM,GAEjE,GAAI,EAAE,KAAK,OAAO,OACd;AAAA,IACE;AAAA,MACE,OAAO;AAAA,MACP,IAAI,CAAC,MAAM,GAAG,IAAI;AAAA,MAClB,MAAM,CAAC,OAAO,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,OAAO,GAAG;AAAA,MACvD,QAAQ,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC;AAAA,MAC3B,OAAO;AAAA,IACT;AAAA,EACF,IACA,CAAC,GACL;AAAA,IACE,OAAO;AAAA,IACP,IAAI,CAAC,OAAO,EAAE,KAAK,OAAO,EAAE,QAAQ,IAAI;AAAA,IACxC,MAAM,CAAC,QAAQ,MAAM,QAAQ,MAAM,QAAQ,IAAI;AAAA,IAC/C,OAAO;AAAA,EACT,GACA;AAAA,IACE,OAAO;AAAA,IACP,IAAI,CAAC,KAAK,IAAI,OAAO,EAAE,KAAK,MAAM,KAAK,QAAQ,KAAK,GAAG,EAAE,KAAK,QAAQ,MAAM,EAAE,QAAQ,KAAK;AAAA,IAC3F,MAAM,CAAC,QAAQ,MAAM,QAAQ,MAAM,QAAQ,IAAI;AAAA,IAC/C,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO,EAAE;AAAA,EACX,CACF;AAAA,EACA,EAAE,KAAK,GAAG,WAAW,GAAG,GAAG,IAAI,CAAC;AAAA,EAEhC,MAAM,OAAO,KAAK,CAAC,OAAO,KAAK,EAAE,KAAK,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC;AAAA,EAChE,EAAE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,IAAI,CAAC,OAAO,EAAE,KAAK,MAAM,MAAM,OAAO,EAAE,KAAK,QAAQ,MAAM,EAAE,QAAQ,KAAK;AAAA,IAC1E,MAAM,CAAC,MAAM,OAAO,KAAK;AAAA,IACzB,QAAQ,OAAO,IAAI;AAAA,IACnB,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO,EAAE;AAAA,EACX,CAAC;AAAA,EAGD,WAAW,MAAM,EAAE,QAAQ;AAAA,EAC3B,OAAO,OAAO,OAAO,EAAE,QAAQ;AAAA,EAC/B,SAAS,IAAI,EAAG,KAAK,EAAE,YAAY,IAAI,KAAK;AAAA,IAC1C,MAAM,IAAI,EAAE,QAAQ,OAAO,IAAI;AAAA,IAC/B,MAAM,IAAI,KAAK,MAAM,KAAK,KAAK,KAAK,IAAI,GAAG,MAAM,IAAI,MAAM,QAAQ,CAAC,CAAC,IAAI;AAAA,IACzE,EAAE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,IAAI,CAAC,GAAG,MAAM,IAAI,KAAK;AAAA,MACvB,MAAM,CAAC,MAAM,OAAO,IAAI,OAAO,KAAK;AAAA,MACpC,QAAQ,CAAC,KAAK,KAAK,CAAC;AAAA,MACpB,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,EAAE;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EACA,OAAO;AAAA;;;ACtOT,IAAM,OAAM,KAAK,KAAK;AAEf,SAAS,SAAS,CAAC,GAAe,GAA6B;AAAA,EACpE,MAAM,IAAI,EAAE,OAAO;AAAA,EACnB,OAAO,MAAM,MAAM,EAAE,QAAQ;AAAA,EAC7B,OAAO,IAAI,IAAI,MAAM,EAAE,QAAQ;AAAA,EAC/B,MAAM,MAAM,EAAE;AAAA,EACd,QAAQ,EAAE;AAAA,IACR,KAAK,WAAW;AAAA,MAGd,MAAM,OAAa,CAAC,KAAK,MAAM,GAAG,MAAM,IAAI;AAAA,MAC5C,MAAM,OAAa,CAAC,KAAK,KAAK,GAAG,MAAM,IAAI;AAAA,MAC3C,MAAM,OAAa,CAAC,KAAK,MAAM,GAAG,MAAM,IAAI;AAAA,MAC5C,MAAM,MAAY,CAAC,KAAK,KAAK,MAAM,GAAG,KAAK,IAAI;AAAA,MAC/C,MAAM,MAAM,CAAC,GAAS,GAAS,IAAY,QAA4B;AAAA,QACrE,OAAO;AAAA,QACP,IAAI;AAAA,QACJ,MAAM,CAAC,IAAI,IAAI,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;AAAA,QAChE,QAAQ,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;AAAA,QACtD,OAAO;AAAA,MACT;AAAA,MACA,MAAM,OAAO,CAAC,IAAU,SAA6B;AAAA,QACnD,OAAO;AAAA,QACP;AAAA,QACA,MAAM,CAAC,MAAM,KAAK;AAAA,QAClB,QAAQ,CAAC,GAAG,KAAK,CAAC;AAAA,QAClB,OAAO,EAAE,OAAO;AAAA,QAChB,OAAO;AAAA,MACT;AAAA,MACA,OAAO;AAAA,QACL;AAAA,UACE,OAAO;AAAA,YACL,IAAI,MAAM,MAAM,OAAO,KAAK;AAAA,YAC5B,IAAI,MAAM,MAAM,MAAM,IAAI;AAAA,YAC1B,IAAI,MAAM,KAAK,MAAM,KAAK;AAAA,UAC5B;AAAA,UACA,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,QACA,KAAK,CAAC,KAAK,KAAK,MAAM,GAAG,KAAK,KAAK,IAAI,GAAG,GAAG;AAAA,QAC7C,KAAK,CAAC,KAAK,KAAK,MAAM,GAAG,KAAK,KAAK,IAAI,GAAG,GAAG;AAAA,MAC/C;AAAA,IACF;AAAA,IACA,KAAK;AAAA,MACH,OAAO,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAkB;AAAA,QACrD,MAAM,KAAK,MAAM,IAAI,MAAM;AAAA,QAC3B,OAAO;AAAA,UACL,OAAO;AAAA,UACP,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,MAAM,GAAG,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI;AAAA,UAClE,MAAM,CAAC,MAAM,OAAO,IAAI;AAAA,UACxB,QAAQ,CAAC,GAAI,IAAI,MAAO,KAAK,KAAK,IAAI,CAAC;AAAA,UACvC,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,OACD;AAAA,IACH,KAAK,SAAS;AAAA,MAGZ,MAAM,IAAU,CAAC,KAAK,MAAM,GAAG,KAAK,IAAI;AAAA,MACxC,MAAM,IAAU,CAAC,KAAK,OAAO,KAAK,MAAM,KAAK,IAAI;AAAA,MACjD,MAAM,KAAK,CAAC,IAAY,IAAY,OAAO,MAAY;AAAA,QACrD,EAAE,MAAM,EAAE,KAAK,QAAQ,KAAK,IAAI,KAAK,IAAG,IAAI,KAAK,IAAI,KAAK,IAAG;AAAA,QAC7D,EAAE,MAAM,EAAE,KAAK,QAAQ,KAAK,IAAI,KAAK,IAAG,IAAI,KAAK,IAAI,KAAK,IAAG;AAAA,QAC7D,EAAE,MAAM,EAAE,KAAK,QAAQ,KAAK,IAAI,KAAK,IAAG;AAAA,MAC1C;AAAA,MACA,MAAM,QAAc,CAAC,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,IAAI;AAAA,MAE1D,MAAM,OAAO,CAAC,GAAS,GAAS,IAAY,QAA4B;AAAA,QACtE,OAAO;AAAA,QACP,IAAI;AAAA,QACJ,MAAM,CAAC,IAAI,IAAI,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;AAAA,QAChE,QAAQ,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;AAAA,MACxD;AAAA,MACA,MAAM,OAAO,CAAC,IAAY,IAAY,KAAa,GAAW,MAA0B;AAAA,QACtF,MAAM,IAAI,GAAG,IAAI,IAAI,MAAM;AAAA,QAC3B,MAAM,IAAI,GAAG,KAAK,MAAM,KAAK,KAAK,MAAM,MAAM,MAAM;AAAA,QACpD,MAAM,IAAI,GAAG,KAAK,MAAM,KAAK,KAAK,KAAK,MAAM;AAAA,QAC7C,OAAO;AAAA,UACL,OAAO,CAAC,KAAK,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,KAAK,GAAG,GAAG,IAAI,MAAM,IAAI,IAAI,CAAC;AAAA,UAC/D,OAAO,IAAI,IAAI,IAAI;AAAA,UACnB,OAAO;AAAA,aACH,OAAO,IAAI,EAAE,QAAQ,MAAM,IAAI,CAAC;AAAA,QACtC;AAAA;AAAA,MAEF,OAAO;AAAA,QACL;AAAA,UACE,OAAO;AAAA,YACL,EAAE,OAAO,aAAa,IAAI,GAAG,MAAM,EAAE;AAAA,YACrC;AAAA,cACE,OAAO;AAAA,cACP,IAAI,CAAC,EAAE,QAAQ,MAAM,GAAG,EAAE,IAAI,KAAK,IAAI;AAAA,cACvC,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI;AAAA,cAC5B,IAAI;AAAA,cACJ,OAAO;AAAA,YACT;AAAA,YACA;AAAA,cACE,OAAO;AAAA,cACP,IAAI,CAAC,KAAK,MAAM,IAAI,EAAE,IAAI,KAAK,IAAI;AAAA,cACnC,MAAM,CAAC,MAAM,MAAM,IAAI;AAAA,cACvB,IAAI;AAAA,cACJ,OAAO;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,QACA,KAAK,GAAG,IAAI,IAAI,MAAM,CAAC;AAAA,QACvB,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC;AAAA,QACxB,KAAK,IAAI,IAAI,IAAI,OAAO,CAAC;AAAA,QACzB,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC;AAAA,QACxB,KAAK,IAAI,IAAI,IAAI,OAAO,CAAC;AAAA,QACzB,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AAAA,MAGZ,MAAM,MAAoB,CAAC;AAAA,MAC3B,MAAM,QAA0D;AAAA,QAC9D,CAAC,IAAI,IAAI,IAAI;AAAA,QACb,CAAC,KAAK,IAAI,IAAI;AAAA,QACd,CAAC,IAAI,IAAI,IAAI;AAAA,QACb,CAAC,KAAK,IAAI,GAAG;AAAA,QACb,CAAC,KAAK,IAAI,GAAG;AAAA,QACb,CAAC,KAAK,IAAI,IAAI;AAAA,QACd,CAAC,MAAM,IAAI,IAAI;AAAA,MACjB;AAAA,MACA,YAAY,IAAI,IAAI,QAAQ,OAAO;AAAA,QACjC,MAAM,IAAI,KAAK;AAAA,QACf,MAAM,IAAI,KAAK;AAAA,QACf,MAAM,IAAU,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;AAAA,QAClF,MAAM,OAAa,CAAC,KAAK,OAAO,KAAK,OAAO,EAAE,IAAI,KAAK,OAAO,EAAE,IAAI,KAAK,KAAK,OAAO,EAAE,EAAE;AAAA,QACzF,MAAM,KAAW,CAAC,EAAE,KAAK,KAAK,EAAE,KAAK,KAAK,EAAE,KAAK,MAAM,IAAI;AAAA,QAC3D,MAAM,KAAK,KAAK,MAAM,GAAG,EAAE;AAAA,QAC3B,MAAM,MAAY;AAAA,UAChB,KAAK,KAAM,GAAG,KAAK,KAAM,MAAM;AAAA,UAC/B,KAAK,KAAM,GAAG,KAAK,KAAM,MAAM;AAAA,UAC/B,KAAK,KAAM,GAAG,KAAK,KAAM,MAAM;AAAA,QACjC;AAAA,QACA,MAAM,KAAW,CAAC,GAAG,KAAK,KAAK,GAAG,KAAK,KAAK,IAAI;AAAA,QAChD,IAAI,KAAK;AAAA,UACP,OAAO;AAAA,YACL,EAAE,OAAO,QAAQ,IAAI,MAAM,MAAM,CAAC,OAAO,OAAO,MAAM,IAAI,GAAG,QAAQ,OAAO,EAAE,EAAE;AAAA,YAChF;AAAA,cACE,OAAO;AAAA,cACP,IAAI;AAAA,cACJ,MAAM,CAAC,OAAO,OAAO,MAAM,GAAG;AAAA,cAC9B,QAAQ,OAAO,EAAE;AAAA,cACjB,OAAO;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ,OAAO,MAAM,OAAO,OAAO,OAAO;AAAA,QAC5C,CAAC;AAAA,MACH;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IACA,KAAK;AAAA,MACH,OAAO;AAAA,QACL,KAAK,MAAM,GAAG,CAAC,EAAE;AAAA,QACjB;AAAA,UACE,OAAO;AAAA,UACP,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,UACjC,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,UACjC,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,MACE,OAAO,CAAC;AAAA;AAAA;AAId,IAAM,QAAQ,CAAC,GAAe,OAAyB;AAAA,EACrD,OAAO;AAAA,EACP,IAAI,CAAC,EAAE,QAAQ,GAAG,KAAK,MAAM,GAAG,EAAE,QAAQ,GAAG,KAAK,IAAI;AAAA,EACtD,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,MAAM,EAAE,QAAQ,EAAE,KAAK,OAAO,EAAE,QAAQ,EAAE,EAAE;AAAA,EACpE,OAAO;AAAA,EACP,OAAO;AACT;;;ACjKO,SAAS,UAAU,CAAC,GAA2B;AAAA,EACpD,MAAM,IAAI,EAAE,KAAK;AAAA,EACjB,MAAM,MAAM,EAAE,QAAQ;AAAA,EACtB,MAAM,KAAK,EAAE,QAAQ,QAAQ;AAAA,EAC7B,MAAM,KAAK,EAAE,QAAQ,QAAQ;AAAA,EAC7B,MAAM,KAAK,MAAM;AAAA,EACjB,MAAM,KAAK,QAAQ,EAAE,IAAI,SAAS;AAAA,EAClC,MAAM,KAAK,IAAI,MAAM;AAAA,EACrB,MAAM,QAAQ,KAAK,KAAK;AAAA,EACxB,MAAM,MAAM,EAAE,IAAI;AAAA,EAClB,MAAM,OAAO,EAAE,KAAK;AAAA,EACpB,MAAM,MAAY,CAAC,QAAQ,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,CAAC;AAAA,EACpE,MAAM,QAAQ,IAAI,EAAE,KAAK;AAAA,EACzB,MAAM,SAAS,QAAQ,MAAM,EAAE,IAAI,OAAO;AAAA,EAC1C,MAAM,QAAQ,CAAC,EAAE,IAAI;AAAA,EACrB,MAAM,SAAS,QAAQ,OAAO,MAAM,EAAE,IAAI,YAAY;AAAA,EACtD,OAAO;AAAA,IACL,SAAS,EAAE,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,IAAI,OAAO,MAAM,EAAE,KAAK,QAAQ;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,CAAC,QAAQ,OAAO,MAAM,EAAE,IAAI,WAAW,GAAG,QAAQ,OAAO,EAAE,IAAI,IAAI;AAAA,IACzE,OAAO,CAAC,KAAK,MAAM,IAAI,IAAI;AAAA,IAC3B,OAAO,CAAC,KAAK,MAAM,EAAE,IAAI,OAAO,OAAO,EAAE,IAAI,OAAO,GAAG;AAAA,IACvD,OAAO,KAAK;AAAA,IACZ,MAAM,QAAQ,EAAE,IAAI,OAAO;AAAA,EAC7B;AAAA;;;AChDF,SAAS,IAAI,CAAC,GAAU,GAAS,GAAW,KAAiB;AAAA,EAC3D,MAAM,IAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;AAAA,EAC/B,MAAM,KAAK,CAAC,IAAY,IAAY,OAAuB;AAAA,IACzD,EAAE,KAAK,EAAE,KAAK;AAAA,IACd,EAAE,KAAK,EAAE,KAAK;AAAA,IACd,EAAE,KAAK,EAAE,KAAK;AAAA,IACd,OAAO,EAAE,CAAC;AAAA;AAAA,EAEZ,IAAI,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI;AAAA,EAC7C,IAAI,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI;AAAA,EAC7C,IAAI,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,MAAM,IAAI;AAAA,EAC7C,OAAO,EAAE,CAAC;AAAA;AAIZ,SAAS,OAAO,CAAC,GAAU,GAAO,GAAW,aAA4B;AAAA,EACvE,MAAM,IAAQ,CAAC,GAAG,GAAG,CAAC;AAAA,EACtB,MAAM,IAAI,KAAK,GAAG,GAAG,GAAG,CAAC;AAAA,EACzB,IAAI,eAAe,KAAK;AAAA,IAAG;AAAA,EAC3B,MAAM,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AAAA,EAChD,IAAI,KAAK;AAAA,IAAO;AAAA,EAChB,SAAS,IAAI,EAAG,IAAI,GAAG;AAAA,IAAK,EAAE,MAAM,EAAE,MAAM,KAAM,KAAK,EAAE,MAAM,KAAM;AAAA;AAKhE,SAAS,UAAU,CAAC,GAAS,OAAc,MAAa,MAAa,KAAmB;AAAA,EAC7F,MAAM,YAAY,IAAI,aAAa,EAAE,SAAS;AAAA,EAC9C,MAAM,UAAU,IAAI,aAAa,EAAE,OAAO;AAAA,EAC1C,MAAM,IAAI,MAAM;AAAA,EAChB,MAAM,KAAS,CAAC,GAAG,GAAG,CAAC;AAAA,EACvB,MAAM,KAAS,CAAC,GAAG,GAAG,CAAC;AAAA,EACvB,SAAS,IAAI,EAAG,IAAI,UAAU,QAAQ,KAAK,GAAG;AAAA,IAC5C,MAAM,IAAQ,CAAC,UAAU,MAAM,GAAG,UAAU,IAAI,MAAM,GAAG,UAAU,IAAI,MAAM,CAAC;AAAA,IAE9E,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,IAAI,MAAM;AAAA,MAAG;AAAA,IACjC,MAAM,IAAI,KAAK,MAAM,GAAG,GAAG,EAAE;AAAA,IAC7B,MAAM,IAAI,KAAK,OAAO,GAAG,GAAG,EAAE;AAAA,IAC9B,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM;AAAA,MAAG;AAAA,IAE3B,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,IAAI,MAAM;AAAA,MAAK;AAAA,IAC1C,MAAM,IAAU,CAAC,QAAQ,MAAM,GAAG,QAAQ,IAAI,MAAM,GAAG,QAAQ,IAAI,MAAM,CAAC;AAAA,IAC1E,MAAM,KAAK,KAAK,MAAM,GAAG,EAAE,KAAK;AAAA,IAChC,MAAM,KAAK,KAAK,MAAM,GAAG,EAAE,KAAK;AAAA,IAChC,MAAM,UACH,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,MAAM,OAC9C,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,MAAM;AAAA,IACjD,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK;AAAA,MAC1B,IAAI,QAAQ;AAAA,QACV,QAAQ,OAAO,GAAG,GAAG,KAAK;AAAA,QAC1B,QAAQ,MAAM,GAAG,GAAG,IAAI;AAAA,MAC1B,EAAE,KAAK;AAAA,QACL,QAAQ,MAAM,GAAG,GAAG,KAAK;AAAA,QACzB,QAAQ,OAAO,GAAG,GAAG,IAAI;AAAA;AAAA,IAE7B;AAAA,IAGA,MAAM,QAAQ,SAAS,KAAK,CAAC,IAAI,MAAM,CAAC;AAAA,IACxC,IAAI,QAAQ,CAAC,MAAM;AAAA,MACjB,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK;AAAA,QAC1B,QAAQ,OAAO,GAAG,GAAG,KAAK;AAAA,QAC1B,QAAQ,MAAM,GAAG,GAAG,KAAK;AAAA,MAC3B;AAAA,IACF,UAAU,KAAK,EAAE;AAAA,IACjB,UAAU,IAAI,KAAK,EAAE;AAAA,IACrB,UAAU,IAAI,KAAK,EAAE;AAAA,IACrB,IAAI,QAAQ;AAAA,MACV,KAAK,OAAO,GAAG,GAAG,EAAE;AAAA,MACpB,MAAM,IAAI,KAAK,MAAM,GAAG,EAAE,KAAK;AAAA,MAC/B,QAAQ,KAAK,GAAG,KAAK;AAAA,MACrB,QAAQ,IAAI,KAAK,GAAG,KAAK;AAAA,MACzB,QAAQ,IAAI,KAAK,GAAG,KAAK;AAAA,IAC3B;AAAA,EACF;AAAA,EACA,OAAO,KAAK,GAAG,WAAW,QAAQ;AAAA;AAO7B,SAAS,aAAa,CAAC,GAAS,SAAS,KAAW;AAAA,EACzD,MAAM,IAAI,EAAE;AAAA,EACZ,MAAM,MAAM,IAAI,aAAa,EAAE,MAAM;AAAA,EACrC,SAAS,IAAI,EAAG,IAAI,EAAE,QAAQ,QAAQ,KAAK,GAAG;AAAA,IAC5C,MAAM,KAAK,EAAE,QAAQ,MAAM,KAAK;AAAA,IAChC,MAAM,KAAK,EAAE,QAAQ,IAAI,MAAM,KAAK;AAAA,IACpC,MAAM,KAAK,EAAE,QAAQ,IAAI,MAAM,KAAK;AAAA,IACpC,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM;AAAA,IAClC,MAAM,MAAM,EAAE,IAAI,MAAM,MAAM,EAAE,IAAI,MAAM;AAAA,IAC1C,MAAM,MAAM,EAAE,IAAI,MAAM,MAAM,EAAE,IAAI,MAAM;AAAA,IAC1C,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM;AAAA,IAClC,MAAM,MAAM,EAAE,IAAI,MAAM,MAAM,EAAE,IAAI,MAAM;AAAA,IAC1C,MAAM,MAAM,EAAE,IAAI,MAAM,MAAM,EAAE,IAAI,MAAM;AAAA,IAC1C,MAAM,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE;AAAA,IAClE,WAAW,KAAK,CAAC,GAAG,GAAG,CAAC;AAAA,MACtB,SAAS,IAAI,EAAG,IAAI,GAAG;AAAA,QAAK,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,MAAM,EAAE,MAAM;AAAA,EAC1E;AAAA,EACA,MAAM,UAAU,IAAI,aAAa,EAAE,OAAO;AAAA,EAC1C,SAAS,IAAI,EAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;AAAA,IAC1C,MAAM,IAAI,KAAK,MAAM,IAAI,MAAM,GAAG,IAAI,IAAI,MAAM,GAAG,IAAI,IAAI,MAAM,CAAC;AAAA,IAClE,IAAI,IAAI;AAAA,MAAO;AAAA,IACf,MAAM,IAAI,EAAE,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,MAAM,KAAK,CAAC;AAAA,IAC1E,MAAM,KACH,QAAQ,MAAM,MAAM,EAAE,MAAM,MAC5B,QAAQ,IAAI,MAAM,MAAM,EAAE,MAAM,MAChC,QAAQ,IAAI,MAAM,MAAM,EAAE,MAAM;AAAA,IACnC,IAAI,KAAK;AAAA,MAAQ;AAAA,IACjB,QAAQ,KAAK,EAAE,MAAM;AAAA,IACrB,QAAQ,IAAI,KAAK,EAAE,MAAM;AAAA,IACzB,QAAQ,IAAI,KAAK,EAAE,MAAM;AAAA,EAC3B;AAAA,EACA,OAAO,KAAK,GAAG,QAAQ;AAAA;;;AC9GlB,SAAS,KAAK,CAAC,OAAc,SAA4B,GAAmC;AAAA,EACjG,MAAM,IAAI,EAAE,YAAY;AAAA,EACxB,MAAM,IAAI,EAAE;AAAA,EACZ,MAAM,IAAI,IAAI;AAAA,EACd,OAAO,CAAC,MAAM;AAAA,IACZ,MAAM,IAAI,QAAQ,CAAC;AAAA,IACnB,OAAO,GAAG,GAAG,KAAK;AAAA,IAClB,MAAM,KAAK,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;AAAA,IACrD,MAAM,KAAK,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;AAAA,IACrD,MAAM,KAAK,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;AAAA,IACrD,MAAM,KAAK,KAAK,MAAM,IAAI,IAAI,EAAE,KAAK;AAAA,IACrC,MAAM,IAAU,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE;AAAA,IAE1C,IAAI,MAAM;AAAA,IACV,SAAS,IAAI,EAAG,KAAK,GAAG,KAAK;AAAA,MAC3B,MAAM,IAAK,IAAI,IAAK;AAAA,MACpB,OAAO,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;AAAA,IAClF;AAAA,IACA,MAAM,MAAM,KAAK,IAAI,GAAG,MAAM,GAAG,IAAI;AAAA,IACrC,MAAM,KAAK,EAAE,KAAK;AAAA,IAClB,MAAM,OAAO,KAAK,IAAI,IAAI,KAAK,OAAO,IAAI,KAAK;AAAA,IAC/C,MAAM,OACJ,KAAK,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,IAAI;AAAA,IAC1F,MAAM,OAAO,IAAI,MAAM;AAAA,IACvB,MAAM,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;AAAA,IAEnC,MAAM,MAAM,IAAI,MAAM;AAAA,IACtB,OAAO;AAAA,MACL,OAAO,OAAO,EAAE,KAAK,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE;AAAA,MACxD,OAAO,OAAO,EAAE,KAAK,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE;AAAA,MACxD,OAAO,OAAO,EAAE,KAAK,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE;AAAA,IAC1D;AAAA;AAAA;AAIJ,IAAM,QAAQ,CAAC,MAAsB,KAAK,IAAI,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC;;;ACtC/D,IAAM,QAAQ;AAEP,IAAM,UAAe,CAAC,MAAM,MAAM,IAAI;AAKtC,SAAS,SAAS,CACvB,GACA,GAC6C;AAAA,EAC7C,MAAM,OAAO,EAAE;AAAA,EACf,MAAM,QAAQ,KAAK,IAAI,EAAE,MAAM,QAAQ,OAAO,EAAE,OAAO,UAAU,KAAK,EAAE,MAAM,QAAQ,GAAG;AAAA,EACzF,MAAM,SAAe,CAAC,EAAE,SAAS,MAAM,GAAG,EAAE,MAAM;AAAA,EAClD,MAAM,QAAc,CAAC,KAAK,IAAI,MAAM,EAAE,SAAS,KAAK,KAAK,GAAG,GAAG,OAAO,EAAE,SAAS,KAAK,KAAK,GAAG;AAAA,EAC9F,MAAM,IAAI,IAAG,UAAU,QAAQ,KAAK;AAAA,EACpC,OAAO,EAAE,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,QAAQ,MAAM;AAAA;AAGxE,IAAM,cAAc,CAAC,GAA0B,MAC7C,IACI;AAAA,EACE,CAAC,KAAK,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;AAAA,EACnF,CAAC,KAAK,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;AACrF,IACA,CAAC,EAAE,IAAI,EAAE,EAAE;AAGjB,SAAS,WAAW,CAAC,GAAe,GAAkC,MAA0B;AAAA,EAC9F,MAAM,KAAK,EAAE,OAAO;AAAA,EACpB,OAAO,IAAI,IAAI,MAAM,EAAE;AAAA,EACvB,OAAO;AAAA,IACL,OAAO;AAAA,MACL,EAAE,OAAO,aAAa,IAAI,EAAE,QAAQ,MAAM,CAAC,KAAK,MAAM,KAAK,MAAM,KAAK,IAAI,EAAE;AAAA,MAC5E;AAAA,QACE,OAAO;AAAA,QACP,IAAI,CAAC,IAAI,GAAG,EAAE,SAAS,OAAO,CAAC;AAAA,QAC/B,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,QACd,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AAAA;AAcK,SAAS,UAAU,CACxB,GACA,GACA,KACA,KAC2B;AAAA,EAC3B,MAAM,OAAO,EAAE,OAAO,EAAE,OAAO,MAAM,QAAQ,IAAa;AAAA,EAC1D,MAAM,SAAS,UAAU,GAAG,CAAC;AAAA,EAC7B,MAAM,MAAM,OAAO;AAAA,EAGnB,MAAM,MAAM,MAAM;AAAA,EAClB,MAAM,QAAQ,MAAM;AAAA,EACpB,MAAM,OAAqB,IAAI,KAAK,SAAS,IAAI,CAAC,EAAE,OAAO,IAAI,MAAM,OAAO,KAAK,CAAC,IAAI,CAAC;AAAA,EACvF,MAAM,QAAsB,IAAI,MAAM,SAAS,IAAI,CAAC,EAAE,OAAO,IAAI,OAAO,OAAO,KAAK,CAAC,IAAI,CAAC;AAAA,EAC1F,MAAM,IAAI,aACR,CAAC,GAAG,IAAI,OAAO,GAAG,MAAM,KAAK,YAAY,GAAG,QAAQ,CAAC,GAAG,IAAI,WAAW,CAAC,GACxE,IACF;AAAA,EACA,MAAM,OAAO,aACX,CAAC,GAAG,IAAI,OAAO,KAAK,YAAY,GAAG,QAAQ,GAAG,GAAG,IAAI,YAAY,GAAG,GAAG,KAAK,GAC5E,IACF;AAAA,EACA,MAAM,SAAgB,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI;AAAA,EAC7C,MAAM,QAAQ,EAAE,OAAO;AAAA,EAEvB,MAAM,QAAQ,aAAY,IAAI,OAAO,IAAI,EAAE;AAAA,EAG3C,MAAM,QAAQ,CAAC,MACb,EAAE,SAAS,KAEL,CAAC,MACD,CAAC,MACC,KAAK,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,GACzB,aAAY,GAAG,IAAI,EAAE,KAAK,IAC5B;AAAA,EACN,MAAM,WAAW,MAAM,IAAI,IAAI;AAAA,EAC/B,MAAM,UAAU,MAAM,IAAI,KAAK;AAAA,EAC/B,MAAM,OAAO,CAAC,KAAK,IAAI,MAAM,GAAG,IAAI;AAAA,EACpC,MAAM,QACJ,CAAC,YACD,CAAC,MACC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,MAAM,OAAO,MAAM,CAAC,IAAI,OAAO,QAAQ,QAAQ,CAAC;AAAA,EACvE,OAAO,IAAI,MAAM,CAAC,OAAO,QAAQ,OAAO,KAAK;AAAA,EAC7C,MAAM,KAAmB;AAAA,IACvB,CAAC,GAAG,KAAK,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG;AAAA,IACvD,CAAC,GAAG,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,MAAM,IAAI;AAAA,EACvD;AAAA,EACA,MAAM,KAAK,IAAI,MAAM,SAAS,IAAI,aAAY,IAAI,OAAO,IAAI,EAAE,SAAS;AAAA,EACxE,MAAM,OAAO,KAAI;AAAA,IACf,OAAO,EAAE;AAAA,IACT,QAAQ,EAAE;AAAA,IACV,YAAY;AAAA,IACZ,OAAO,MAAM,UAAU,MAAM,EAAE,OAAO,GAAG,EAAE,OAAO,MAAM,CAAC;AAAA,IACzD,UAAU;AAAA,EACZ,CAAC;AAAA,EACD,MAAM,MAAM,KAAI;AAAA,IACd,OAAO;AAAA,IACP,QAAQ,YAAY,IAAI,EAAE;AAAA,IAC1B,YAAY;AAAA,IACZ,OAAO,MAAM,SAAS,MAAM,KAAK,OAAO,GAAG,EAAE,OAAO,MAAM,CAAC;AAAA,IAC3D,UAAU;AAAA,EACZ,CAAC;AAAA,EAED,IAAI,MAAM;AAAA,IAAM,OAAO,EAAE,MAAM,cAAc,IAAI,GAAG,KAAK,cAAc,GAAG,EAAE;AAAA,EAC5E,MAAM,WAAkB,CAAC,MAAM,MAAM,CAAC,IAAI;AAAA,EAC1C,OAAO;AAAA,IAEL,MAAM,cAAc,IAAI;AAAA,IACxB,KAAK,cAAc,WAAW,KAAK,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,QAAQ,GAAG,CAAC;AAAA,EAChF;AAAA;AAIF,SAAS,KAAK,CAAC,KAAY,GAAS,GAAS,KAAsB;AAAA,EACjE,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,MAAM;AAAA,IAAK,OAAO;AAAA,EACzC,MAAM,IAAI,MAAM;AAAA,EAChB,MAAM,IAAU;AAAA,IACd,IAAI,CAAC,EAAE,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;AAAA,IACxD,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,EAAE,EAAE,CAAC;AAAA,IACxD,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAAA,EAC1D;AAAA,EACA,MAAM,IAAI,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK;AAAA,EAC1C,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI;AAAA;AAGlD,SAAS,QAAQ,CAAC,GAAe,KAAkB,KAAmB;AAAA,EAC3E,MAAM,IAAI,aAAY,IAAI,MAAM,EAAE,OAAO,EAAE,OAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,EACrE,MAAM,OAAO,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,QAAQ,IAAI,CAAC;AAAA,EAC7D,MAAM,MAAM,IAAI;AAAA,EAChB,MAAM,OAAO,EAAE,OAAO,UAAU;AAAA,EAChC,MAAM,OAAa,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EAC/D,OAAO,KAAI;AAAA,IACT,OAAO,EAAE;AAAA,IACT,QAAQ,EAAE;AAAA,IACV,YAAY;AAAA,IAEZ,OAAO,MAAM,CAAC,GAAG,MAAO,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,OAAO,KAAK,CAAC,IAAK;AAAA,IAClE,UAAU;AAAA,EACZ,CAAC;AAAA;AAII,SAAS,OAAO,CAAC,GAAe,GAAW,KAAmB;AAAA,EACnE,MAAM,IAAI,EAAE;AAAA,EACZ,MAAM,OAAO,KAAK,IAAI,IAAI;AAAA,EAC1B,MAAM,SAAS,KAAK,IAAI,GAAG;AAAA,EAC3B,MAAM,QAAQ,KAAK,IAAI,GAAG;AAAA,EAC1B,OAAO,KAAI;AAAA,IACT,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI;AAAA,IAC7C,QAAQ;AAAA,MACN,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG;AAAA,MAC7B,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG;AAAA,IAC5B;AAAA,IACA,YAAY;AAAA,IACZ,OAAO,CAAC,MAAM;AAAA,MACZ,MAAM,MAAM,EAAE,MAAM,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK;AAAA,MACpD,IAAI,MAAM;AAAA,QAAO,OAAO,EAAE;AAAA,MAC1B,IAAI,MAAM;AAAA,QAAM,OAAO,EAAE;AAAA,MACzB,IAAI,MAAM;AAAA,QAAQ,OAAO,CAAC,EAAE,KAAK,KAAK,MAAM,EAAE,KAAK,KAAK,MAAM,EAAE,KAAK,KAAK,IAAI;AAAA,MAC9E,OAAO,EAAE;AAAA;AAAA,EAEb,CAAC;AAAA;;;ACxFH,IAAM,MAAM,CAAC,OAAe,QAAuB;AAAA,EACjD,MAAM,IAAI,YAAW,sBAAsB,EAAE,OAAO,IAAI,CAAC;AAAA;AAI3D,SAAS,OAAO,CAAC,GAAY,MAAc,KAAoC;AAAA,EAC7E,IAAI,OAAO,MAAM;AAAA,IAAU,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AAAA,EAC7C,KAAK,IAAI,KAAK,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC;AAAA,IACrD,YAAY,GAAG,MAAM,OAAO,QAAQ,CAAC;AAAA,MAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,MAAM,GAAG,GAAG;AAAA;AAGrF,IAAM,SAAS,IAAI,IAAI;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,UAAU,IAAI,IAAI;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,SAAS,UAAS,CAAC,GAA2B;AAAA,EACnD,IAAI,EAAE,EAAE,UAAU,QAAQ,EAAE,UAAU;AAAA,IACpC,IAAI,eAAe,EAAE,YAAY,6DAA6D;AAAA,EAChG,MAAM,OAAgC,CAAC;AAAA,EACvC,QAAQ,KAAK,GAAG,QAAQ,WAAW,QAAQ,UAAU,GAAG,IAAI,IAAI;AAAA,EAChE,YAAY,GAAG,MAAM,MAAM;AAAA,IACzB,IAAI,CAAC,OAAO,SAAS,CAAC;AAAA,MAAG,IAAI,cAAc,QAAQ,KAAK,iCAAiC;AAAA,IACzF,IAAI,OAAO,IAAI,CAAC;AAAA,MAAG;AAAA,IACnB,IAAI,IAAI,KAAM,MAAM,KAAK,CAAC,QAAQ,IAAI,CAAC;AAAA,MACrC,IAAI,cAAc,QAAQ,KAAK,QAAQ,uCAAuC;AAAA,EAClF;AAAA,EACA,MAAM,IAAI,EAAE;AAAA,EACZ,IAAI,EAAE,OAAO,OAAO,EAAE,OAAO;AAAA,IAC3B,IAAI,aAAa,EAAE,QAAQ,0DAA0D;AAAA,EACvF,IAAI,EAAE,UAAU,EAAE,SAAS;AAAA,IACzB,IACE,gBAAgB,EAAE,yBAAyB,EAAE,sCAC7C,8DACF;AAAA,EACF,IAAI,EAAE,OAAO,EAAE,WAAW,MAAM,EAAE,MAAM;AAAA,IACtC,IAAI,YAAY,EAAE,QAAQ,EAAE,8BAA8B,oCAAoC;AAAA,EAChG,IAAI,EAAE,MAAM,OAAO;AAAA,IAAG,IAAI,cAAc,EAAE,MAAM,QAAQ,iCAAiC;AAAA,EACzF,IAAI,EAAE,SAAS,EAAE,MAAM,SAAS;AAAA,IAC9B,IAAI,gBAAgB,EAAE,MAAM,UAAU,gDAAgD;AAAA,EACxF,OAAO;AAAA;;;ACvJF,IAAM,QAAoB;AAAA,EAC/B,QAAQ;AAAA,EACR,SAAS,EAAE,OAAO,MAAM,OAAO,MAAM,QAAQ,IAAI;AAAA,EACjD,MAAM,EAAE,OAAO,OAAO,UAAU,MAAM,OAAO,OAAO,MAAM,MAAM;AAAA,EAChE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE;AAAA,EAC5B,KAAK,EAAE,QAAQ,GAAG,OAAO,MAAM,MAAM,MAAM,WAAW,GAAG,MAAM,EAAE;AAAA,EACjE,MAAM,EAAE,QAAQ,MAAM,OAAO,MAAM,KAAK,OAAO,MAAM,GAAG,QAAQ,EAAE;AAAA,EAClE,MAAM,EAAE,OAAO,SAAS,QAAQ,MAAM,OAAO,MAAM,OAAO,IAAI,MAAM,EAAE;AAAA,EACtE,MAAM,EAAE,QAAQ,OAAO,SAAS,OAAO,MAAM,KAAK,KAAK,IAAI,UAAU,GAAG;AAAA,EACxE,OAAO,EAAE,OAAO,KAAK,MAAM,OAAO,MAAM,EAAE;AAAA,EAC1C,OAAO;AAAA,EACP,MAAM,EAAE,QAAQ,KAAK;AAAA,EACrB,MAAM,EAAE,WAAW,MAAM,OAAO,QAAQ;AAAA,EACxC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,IACN,MAAM,KAAI,SAAS;AAAA,IACnB,OAAO,KAAI,SAAS;AAAA,IACpB,MAAM,KAAI,SAAS;AAAA,IACnB,QAAQ,KAAI,SAAS;AAAA,IACrB,MAAM,KAAI,SAAS;AAAA,IACnB,OAAO,KAAI,SAAS;AAAA,IACpB,OAAO,KAAI,SAAS;AAAA,IACpB,OAAO,KAAI,SAAS;AAAA,IACpB,MAAM,KAAI,SAAS;AAAA,IACnB,OAAO,KAAI,SAAS;AAAA,IACpB,MAAM,KAAI,SAAS;AAAA,IACnB,SAAS,KAAI,SAAS;AAAA,IACtB,OAAO,KAAI,SAAS;AAAA,EACtB;AACF;AAGO,IAAM,MAAkB;AAAA,EAC7B,QAAQ;AAAA,EACR,SAAS,EAAE,OAAO,KAAK,OAAO,MAAM,QAAQ,KAAK;AAAA,EACjD,MAAM,EAAE,OAAO,OAAO,UAAU,MAAM,OAAO,KAAK;AAAA,EAClD,QAAQ,EAAE,MAAM,KAAK,OAAO,KAAK;AAAA,EACjC,KAAK,EAAE,QAAQ,KAAK,OAAO,KAAK,MAAM,KAAK,WAAW,KAAK,MAAM,IAAI;AAAA,EACrE,MAAM,EAAE,QAAQ,MAAM,OAAO,KAAK,KAAK,OAAO,MAAM,OAAO,QAAQ,MAAM;AAAA,EACzE,MAAM,EAAE,OAAO,WAAW,QAAQ,MAAM,OAAO,MAAM,OAAO,IAAI,MAAM,GAAG;AAAA,EACzE,MAAM,EAAE,QAAQ,OAAO,SAAS,OAAO,MAAM,MAAM,KAAK,IAAI,UAAU,GAAG;AAAA,EACzE,OAAO,EAAE,OAAO,MAAM,MAAM,OAAO,MAAM,EAAE;AAAA,EAC3C,OAAO,EAAE,QAAQ,MAAM,QAAQ,OAAO,QAAQ,MAAM,OAAO,KAAK;AAAA,EAChE,MAAM,EAAE,QAAQ,KAAK;AAAA,EACrB,MAAM,EAAE,WAAW,GAAK,OAAO,aAAa,MAAM,EAAE;AAAA,EACpD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,IACN,MAAM,KAAI,SAAS;AAAA,IACnB,OAAO,KAAI,SAAS;AAAA,IACpB,MAAM,KAAI,SAAS;AAAA,IACnB,QAAQ,KAAI,SAAS;AAAA,IACrB,MAAM,KAAI,SAAS;AAAA,IACnB,OAAO,KAAI,SAAS;AAAA,IACpB,OAAO,KAAI,SAAS;AAAA,IACpB,OAAO,KAAI,SAAS;AAAA,IACpB,MAAM,KAAI,SAAS;AAAA,IACnB,OAAO,KAAI,SAAS;AAAA,IACpB,SAAS,KAAI,SAAS;AAAA,IACtB,OAAO,KAAI,SAAS;AAAA,IACpB,KAAK,KAAI,SAAS;AAAA,IAClB,OAAO,KAAI,SAAS;AAAA,EACtB;AACF;AAGO,IAAM,SAAqB;AAAA,EAChC,QAAQ;AAAA,EACR,SAAS,EAAE,OAAO,MAAM,OAAO,MAAM,QAAQ,IAAI;AAAA,EACjD,MAAM,EAAE,OAAO,OAAO,UAAU,MAAM,OAAO,KAAK;AAAA,EAClD,QAAQ,EAAE,MAAM,MAAM,OAAO,KAAK;AAAA,EAClC,KAAK,EAAE,QAAQ,MAAM,OAAO,MAAM,MAAM,MAAM,WAAW,GAAG,MAAM,EAAE;AAAA,EACpE,MAAM,EAAE,QAAQ,KAAK,OAAO,MAAM,KAAK,OAAO,MAAM,OAAO,QAAQ,KAAK;AAAA,EACxE,MAAM,EAAE,OAAO,WAAW,QAAQ,MAAM,OAAO,KAAK,OAAO,IAAI,MAAM,EAAE;AAAA,EACvE,MAAM,EAAE,QAAQ,MAAM,SAAS,OAAO,MAAM,KAAK,KAAK,IAAI,UAAU,GAAG;AAAA,EACvE,OAAO,EAAE,OAAO,MAAM,MAAM,OAAO,MAAM,IAAI;AAAA,EAC7C,OAAO;AAAA,EACP,MAAM,EAAE,QAAQ,KAAK;AAAA,EACrB,MAAM,EAAE,WAAW,MAAM,OAAO,QAAQ,MAAM,EAAE;AAAA,EAChD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,IACN,MAAM,KAAI,SAAS;AAAA,IACnB,OAAO,KAAI,SAAS;AAAA,IACpB,MAAM,KAAI,SAAS;AAAA,IACnB,QAAQ,KAAI,SAAS;AAAA,IACrB,MAAM,KAAI,SAAS;AAAA,IACnB,OAAO,KAAI,SAAS;AAAA,IACpB,OAAO,KAAI,SAAS;AAAA,IACpB,OAAO,KAAI,SAAS;AAAA,IACpB,MAAM,KAAI,SAAS;AAAA,IACnB,OAAO,KAAI,SAAS;AAAA,IACpB,MAAM,KAAI,SAAS;AAAA,IACnB,SAAS,KAAI,SAAS;AAAA,IACtB,OAAO,KAAI,SAAS;AAAA,IACpB,OAAO,KAAI,SAAS;AAAA,EACtB;AACF;AAGO,IAAM,QAAoB;AAAA,KAC5B;AAAA,EACH,QAAQ;AAAA,EACR,SAAS,EAAE,OAAO,MAAM,OAAO,MAAM,QAAQ,KAAK;AAAA,EAClD,MAAM,EAAE,OAAO,MAAM,UAAU,MAAM,OAAO,MAAM,MAAM,MAAM;AAAA,EAC9D,QAAQ,EAAE,MAAM,MAAM,OAAO,IAAI;AAAA,EACjC,KAAK,EAAE,QAAQ,MAAM,OAAO,MAAM,MAAM,KAAK,WAAW,GAAG,MAAM,KAAK;AAAA,EACtE,MAAM,EAAE,QAAQ,KAAK,OAAO,MAAM,KAAK,MAAM,MAAM,MAAM,QAAQ,KAAK;AAAA,EACtE,MAAM,EAAE,QAAQ,OAAO,SAAS,MAAM,MAAM,MAAM,KAAK,IAAI,UAAU,GAAG;AAAA,EACxE,MAAM,EAAE,QAAQ,KAAK;AAAA,EACrB,MAAM,EAAE,WAAW,KAAK,OAAO,QAAQ;AAAA,EACvC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ,KAAK,MAAM,QAAQ,MAAM,KAAI,SAAS,GAAG,MAAM,KAAI,SAAS,GAAG,OAAO,KAAI,SAAS,EAAE;AAC/F;AAGO,IAAM,MAAkB;AAAA,KAC1B;AAAA,EACH,QAAQ;AAAA,EACR,SAAS,EAAE,OAAO,MAAM,OAAO,MAAM,QAAQ,KAAK;AAAA,EAClD,MAAM,EAAE,OAAO,OAAO,UAAU,MAAM,OAAO,OAAO,MAAM,MAAM;AAAA,EAChE,QAAQ,EAAE,MAAM,KAAK,OAAO,KAAK;AAAA,EACjC,KAAK,EAAE,QAAQ,GAAG,OAAO,MAAM,MAAM,MAAM,WAAW,GAAG,MAAM,EAAE;AAAA,EACjE,MAAM,EAAE,QAAQ,MAAM,OAAO,OAAO,KAAK,OAAO,MAAM,GAAG,QAAQ,KAAK;AAAA,EACtE,MAAM,EAAE,OAAO,WAAW,QAAQ,MAAM,OAAO,MAAM,OAAO,IAAI,MAAM,GAAG;AAAA,EACzE,MAAM,EAAE,QAAQ,MAAM,SAAS,MAAM,MAAM,KAAK,KAAK,IAAI,UAAU,GAAG;AAAA,EACtE,MAAM,EAAE,WAAW,MAAM,OAAO,QAAQ;AAAA,EACxC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,OACH,MAAM;AAAA,IACT,MAAM,KAAI,SAAS;AAAA,IACnB,MAAM,KAAI,SAAS;AAAA,IACnB,MAAM,KAAI,SAAS;AAAA,IACnB,OAAO,KAAI,SAAS;AAAA,EACtB;AACF;AAEO,IAAM,SAAQ,EAAE,OAAO,KAAK,QAAQ,OAAO,IAAI;;;ACtG/C,SAAS,WAAU,CAAC,IAA0C,CAAC,GAAe;AAAA,EACnF,MAAM,IAAI,EAAE,QAAQ;AAAA,EACpB,MAAM,OAAO,OAAO,MAAM,WAAW,OAAM,KAAK;AAAA,EAChD,IAAI,CAAC;AAAA,IACH,MAAM,IAAI,YAAW,sBAAsB;AAAA,MACzC,OAAO,sBAAsB,OAAO,CAAC;AAAA,MACrC,KAAK,cAAc,OAAO,KAAK,MAAK,EAAE,KAAK,IAAI;AAAA,IACjD,CAAC;AAAA,EACH,MAAM,MAA+B,KAAK,KAAK;AAAA,EAC/C,YAAY,GAAG,MAAM,OAAO,QAAQ,EAAE,UAAU,CAAC,CAAC,GAAG;AAAA,IACnD,MAAM,MAAM,IAAI;AAAA,IAChB,IAAI,KACF,KAAK,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC,KAAK,OAAO,OAAO,QAAQ,WACrE,KAAK,QAAQ,EAAE,IACf;AAAA,EACR;AAAA,EACA,OAAO,WAAU,GAA4B;AAAA;AAK/C,SAAS,QAAQ,CAAC,GAAe,GAA2B;AAAA,EAC1D,MAAM,IAAI,aAAY,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,KAAK,CAAC,EAAE;AAAA,EACjE,SAAS,IAAI,MAAM,EAAE;AAAA,EACrB,IAAI,IAAI,EAAE,QAAQ;AAAA,EAClB,SAAS,IAAI,EAAG,IAAI,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,GAAG;AAAA,IAAK,KAAK;AAAA,EACzD,MAAM,IAAI,EAAE;AAAA,EACZ,OAAO,KAAK,GAAG,KAAK,CAAC,IAAI,IAAI,MAAM,EAAE,KAAK,WAAW,KAAK,IAAI,EAAE,EAAE;AAAA;AAIpE,IAAM,YAAY;AAGX,IAAM,YAAW,CAAC,MAAM,OAAO,IAAI;AAGnC,SAAS,UAAS,CACvB,GACA,KACA,MAAiB,GACqB;AAAA,EACtC,MAAM,IAAI,SAAS,GAAG,WAAW,CAAC,CAAC;AAAA,EACnC,MAAM,MAAM,UAAS;AAAA,EACrB,MAAM,QAAQ,MAAM,IAAI,UAAU,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EAChD,MAAM,OAAO,MAAM,KAAK,EAAE,SAAS,UAAU,UAAU,GAAG,CAAC,IAAI,CAAC;AAAA,EAChE,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,MACL,GAAG,WAAW,GAAG,GAAG,GAAG;AAAA,MACvB,GAAG;AAAA,MACH,GAAG,UAAU,GAAG,CAAC;AAAA,MACjB,GAAG,WAAW,GAAG,CAAC;AAAA,MAClB,GAAG;AAAA,MACH,GAAG,WAAW,GAAG,CAAC;AAAA,IACpB;AAAA,IACA,MAAM,SAAS,GAAG,GAAG,MAAM,GAAG;AAAA,IAC9B,OAAO,UAAU,GAAG,GAAG,MAAM,IAAI;AAAA,IACjC,MAAM,UAAU,GAAG,GAAG,MAAM,SAAS;AAAA,IACrC,SAAS,SAAS,QAAQ,GAAG,CAAC,CAAC;AAAA,EACjC;AAAA;AAGK,SAAS,KAAI,CAAC,KAAmB,IAAiB,CAAC,GAAa;AAAA,EACrE,MAAM,IAAI,YAAW,CAAC;AAAA,EACtB,MAAM,MAAM,WAAU,GAAG,IAAI,IAAI,KAAK,MAAM,GAAG,IAAI,GAAG;AAAA,EACtD,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,IAAI,EAAE;AAAA,EACZ,MAAM,MAAM,UAAS,IAAI;AAAA,EACzB,QAAQ,MAAM,IAAI,KAAK,OAAO,WAAW,GAAG,GAAG,KAAK,GAAG;AAAA,EACvD,MAAM,KAAK,SAAS,GAAG,KAAK,MAAM,SAAS;AAAA,EAC3C,MAAM,MAAM,QAAQ,GAAG,EAAE,MAAM,EAAE,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAAA,EAC/D,OAAO,IAAI,IAAI,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,EACrC,MAAM,UAAU,CAAC,GAAS,KAAW,CAAC,GAAG,GAAG,CAAC,MAC3C,OAAM,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;AAAA,EAExF,MAAM,KAAK,EAAE,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,MAAM;AAAA,EACjD,SAAS,IAAI,MAAM,EAAE;AAAA,EACrB,MAAM,QAAQ;AAAA,IACZ,MAAM,QAAQ,EAAE;AAAA,IAChB,MAAM,QAAQ,EAAE;AAAA,IAChB,KAAK,QAAQ,EAAE;AAAA,IACf,OAAO,QAAQ,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;AAAA,IAChC,OAAO,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AAAA,EACnC;AAAA,EAGA,MAAM,MAAM,CAAC,SAAqB,OAAM,OAAO,OAAO,KAAK,EAAE,OAAO,CAAC,MAAM,MAAM,IAAI,CAAC;AAAA,EACtF,MAAM,UAAU,IAAI,MAAM,GAAG;AAAA,EAC7B,MAAM,SAAS,IAAI,MAAM,IAAI;AAAA,EAC7B,MAAM,KAAK,CAAC,GAAS,KAAW,YAC9B,IAAI,MAAM,IACN,QAAO,GAAG,EAAE,SAAS,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,QAAS,OAAO,IAAK,MAAM,UAAU,KAAK,GAAG,EAAE,IAC3F;AAAA,EACN,MAAM,MAAM,EAAE,SAAS,GAAG,EAAE,YAAY;AAAA,EACxC,MAAM,QAAQ,CAAC,GAAW,GAAW,MAAoB;AAAA,IACvD,KAAK,IAAI;AAAA,IACT,KAAK,IAAI;AAAA,IACT,MAAM,IAAI,EAAE,QAAQ;AAAA,EACtB;AAAA,EACA,MAAM,QAAQ,CAAC,GAAS,IAAU,OAChC,OAAM,GAAG,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AAAA,EACnD,MAAM,QAAQ,MAAM,EAAE,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE;AAAA,EAC7C,MAAM,OAAO,MAAM,IAAI,IAAI,EAAE;AAAA,EAC7B,MAAM,OAAO,MAAM,IAAI,CAAC,IAAI,EAAE;AAAA,EAC9B,MAAM,QAAQ;AAAA,IACZ,MAAM,GAAG;AAAA,IACT,MAAM,GAAG;AAAA,IACT,KAAK,GAAG;AAAA,IACR,MAAM,GAAG;AAAA,IACT,MAAM,GAAG;AAAA,EACX;AAAA,EACA,IAAI,KAAK,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;AAAA,EACnC,IAAI,KAAK,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;AAAA,EACnC,MAAM,OAAO,EAAE,WAAW;AAAA,EAC1B,IAAI,KAAK,MAAM,KAAK,MAAM,MAAM,KAAK,OAAO,MAAM,GAAG;AAAA,IACnD,IAAI;AAAA,OACA,OAAO,IACP,EAAE,QAAQ,EAAE,MAAM,QAAQ,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,SAAS,MAAM,IAAI,IAAI,GAAG,SAAS,CAAC,MAAM,IAAI,EAAE,IAC3F,CAAC;AAAA,EACP,CAAC;AAAA,EACD,IAAI,KAAK,MAAM,MAAM,MAAM,MAAM,OAAO,IAAI,GAAG,EAAE,IAAI,KAAK,CAAC;AAAA,EAC3D,IAAI,KAAK,MAAM,MAAM,MAAM,MAAM,OAAO,IAAI,GAAG,EAAE,IAAI,KAAK,CAAC;AAAA,EAC3D,OAAO,EAAE,OAAO,OAAO,SAAS,EAAE,QAAQ,EAAE,QAAQ,GAAG,QAAQ,EAAE;AAAA;;AC3GnE,IAAM,OAAM,CAAC,OAAe,QAC1B,IAAI,YAAW,sBAAsB,EAAE,OAAO,IAAI,CAAC;AAE9C,SAAS,YAAY,CAAC,GAAsB;AAAA,EACjD,MAAM,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EACpD,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,IAAI,KAAK,OAAO,SAAS,CAAC,CAAC;AAAA,IAChD,MAAM,KACJ,sCAAsC,KAAK,KAAK,KAAK,KACrD,gEACF;AAAA,EACF,IAAI,EAAE,OAAO,EAAE,SAAS;AAAA,IACtB,MAAM,KACJ,aAAa,EAAE,6BAA6B,EAAE,UAC9C,iEACF;AAAA,EACF,MAAM,IAAI,EAAE,YAAY;AAAA,EACxB,IAAI,EAAE,KAAK,OAAO,KAAK;AAAA,IAAI,MAAM,KAAI,oBAAoB,KAAK,8BAA8B;AAAA,EAC5F,MAAM,KAAK,EAAE,gBAAgB;AAAA,EAC7B,IAAI,EAAE,KAAK,KAAK,MAAM;AAAA,IACpB,MAAM,KAAI,wBAAwB,MAAM,oCAAoC;AAAA;AAGhF,IAAM,SAAS,CAAC,MAAuB,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI;AAE3E,SAAS,UAAS,CAAC,GAA2B;AAAA,EACnD,aAAa,CAAC;AAAA,EACd,MAAM,IAAI,EAAE;AAAA,EACZ,MAAM,OAAO,IAAI;AAAA,EACjB,OAAO,IAAI,MAAM,EAAE,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAAA,EACjD,MAAM,SAAS,EAAE,SAAS,aAAa;AAAA,EACvC,MAAM,KAAK,EAAE,gBAAgB;AAAA,EAC7B,MAAM,KAAK,EAAE,YAAY;AAAA,EACzB,MAAM,IAAI,EAAE,YAAY;AAAA,EACxB,MAAM,QAAQ,EAAE,SAAS;AAAA,EACzB,MAAM,OAAO,KAAK,KAAM,EAAE,eAAe,KAAK,KAAK,KAAM,GAAG;AAAA,EAE5D,MAAM,KAAK,MAAM;AAAA,EACjB,MAAM,KAAK,QAAQ;AAAA,EACnB,MAAM,KAAK,OAAO;AAAA,EAClB,MAAM,KAAK,QAAQ;AAAA,EACnB,MAAM,OAAO,CAAC,MAAsB;AAAA,IAClC,MAAM,IAAI,IAAI;AAAA,IACd,OAAO,EAAE,aAAa,IAAI,IAAI,KAAK,MAAM,IAAI;AAAA;AAAA,EAE/C,MAAM,OAAO,CAAC,MAAsB;AAAA,IAClC,IAAI,IAAI;AAAA,MAAI,OAAO,MAAM,IAAI,OAAO,OAAO,QAAQ;AAAA,IACnD,IAAI,IAAI,IAAI;AAAA,MACV,MAAM,IAAI,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,KAAK;AAAA,MAC5C,OAAO,QAAQ,KAAK,KAAK,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,MAAM,IAAI;AAAA,IACxE;AAAA,IACA,OAAO;AAAA;AAAA,EAET,MAAM,cAAc,CAAC,MAAuB,EAAE,OAAO,IAAK,KAAK,IAAI,GAAG,KAAK,CAAC,CAAC;AAAA,EAC7E,MAAM,UAAU,QAAQ,OAAO,EAAE,YAAY,OAAO,EAAE;AAAA,EACtD,MAAM,OAAO,CAAC,MAAsB;AAAA,IAClC,IAAI,IAAI,IAAI;AAAA,MACV,MAAM,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,OAAO,GAAG;AAAA,MAC5C,OAAO,CAAC,EAAE,SAAS,KAAK,IAAI,IAAI,EAAE,SAAS,KAAK;AAAA,IAClD;AAAA,IACA,IAAI,IAAI,IAAI;AAAA,MACV,MAAM,IAAI,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,KAAK;AAAA,MAC5C,OAAO,CAAC,EAAE,SAAS,UAAU,EAAE,SAAS,KAAK;AAAA,IAC/C;AAAA,IACA,OAAO,CAAC,EAAE;AAAA;AAAA,EAEZ,MAAM,UAAU,CAAC,GAAW,UAAoC;AAAA,IAC9D,MAAM,IAAI,KAAK,CAAC;AAAA,IAEhB,MAAM,KAAK,OAAO,IAAI,OAAO,OAAO,IAAI,GAAG;AAAA,IAC3C,MAAM,IAAI,KAAK,IAAI,KAAK,MAAM,IAAI;AAAA,IAClC,MAAM,IAAI,KAAK,IAAI,KAAK,MAAM,IAAI;AAAA,IAClC,MAAM,KAAK,KAAK,CAAC;AAAA,IACjB,MAAM,KAAK,KAAK,CAAC;AAAA,IACjB,MAAM,KAAK,IAAI;AAAA,IACf,MAAM,IAAI,YAAY,CAAC,KAAK,IAAI,QAAQ,QAAQ,KAAK,MAAM;AAAA,IAC3D,OAAO,CAAC,GAAG,MAAM,KAAK,MAAM,KAAK,OAAO,IAAI,CAAC;AAAA;AAAA,EAE/C,OAAO,EAAE,GAAG,aAAa,MAAM,MAAM,QAAQ;AAAA;AAIxC,SAAS,OAAO,CAAC,OAAkB,GAAW,GAAmB;AAAA,EACtE,IAAI,KAAK;AAAA,EACT,IAAI,KAAK,KAAK,KAAK;AAAA,EACnB,IAAI,MAAM,QAAQ,GAAG,EAAE,EAAE,MAAM;AAAA,IAAG,OAAO;AAAA,EACzC,IAAI,MAAM,QAAQ,GAAG,EAAE,EAAE,MAAM;AAAA,IAAG,OAAO;AAAA,EACzC,SAAS,IAAI,EAAG,IAAI,IAAI,KAAK;AAAA,IAC3B,MAAM,OAAO,KAAK,MAAM;AAAA,IACxB,IAAI,MAAM,QAAQ,GAAG,GAAG,EAAE,KAAK;AAAA,MAAG,KAAK;AAAA,IACvC;AAAA,MAAK,KAAK;AAAA,EACZ;AAAA,EACA,QAAQ,KAAK,MAAM;AAAA;;;ACtJrB,IAAM,OAAO,CAAC,GAAS,MAAkB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;AAC/E,IAAM,SAAS,CAAC,GAAS,MAAkB;AAAA,EACzC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AAAA,EACvB,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AAAA,EACvB,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AACzB;AAGO,SAAS,SAAS,CAAC,GAAe;AAAA,EACvC,MAAM,IAAI,EAAE;AAAA,EACZ,MAAM,MAAY,EAAE,IAAI,CAAC,KAAK,MAC5B,IAAI,IAAI,CAAC,GAAG,MAAM;AAAA,IAChB,MAAM,IAAI,CAAC,MAAsB,EAAE,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,MAAM;AAAA,IACvE,MAAM,KAAK,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC;AAAA,IAClD,MAAM,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;AAAA,IACvF,MAAM,IAAI,OAAO,IAAI,EAAE;AAAA,IACvB,MAAM,IAAI,KAAK,MAAM,GAAG,CAAC;AAAA,IACzB,OAAO,IAAI,cAAQ,CAAC,GAAG,GAAG,CAAC,IAAc,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,CAAC;AAAA,GACvE,CACH;AAAA,EAEA,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK;AAAA,IAC1B,MAAM,MAAM,IAAI,MAAM,CAAC;AAAA,IACvB,IAAI,QAAQ,CAAC,GAAG,MAAM;AAAA,MACpB,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;AAAA,QAAI;AAAA,MAC1B,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK;AAAA,QAC1B,MAAM,IAAI,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK;AAAA,QAC1C,IAAI,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;AAAA,UAC/B,IAAI,KAAK;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,KACD;AAAA,EACH;AAAA,EACA,OAAO;AAAA;AAIF,SAAS,QAAQ,CACtB,GACA,GACA,KACA,IACA,IACA,OACA,QACM;AAAA,EACN,MAAM,OAAO,WAAU,OAAO;AAAA,EAC9B,WAAW,QAAQ,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG;AAAA,IACzC,MAAM,MAAM,EAAE,IAAI,CAAC,KAAK,MACtB,IAAI,MAAM,IAAI,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM;AAAA,MAClC,MAAM,IAAI,IAAI,KAAK,KAAK,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,MACtC,OAAO,EAAE,OAAO;AAAA,QACd,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,MAAM,EAAE,EAAE;AAAA,QAC3B,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,MAAM,EAAE,EAAE;AAAA,QAC3B,IAAI;AAAA,UACF,KAAK,KAAK,EAAE,KAAK,KAAK;AAAA,UACtB,KAAK,KAAM,IAAI,KAAK,IAAI,GAAG,KAAK,EAAE,KAAM,KAAK,KAAK,KAAK;AAAA,QACzD;AAAA,QACA;AAAA,MACF,CAAC;AAAA,KACF,CACH;AAAA,IACA,SAAS,IAAI,EAAG,IAAI,IAAI,IAAI,QAAQ,KAAK;AAAA,MACvC,SAAS,IAAI,EAAG,IAAI,KAAK,IAAI,KAAK;AAAA,QAChC,MAAM,IAAI,IAAI,KAAK,MAAM;AAAA,QACzB,MAAM,IAAI,IAAI,KAAK,IAAI,MAAM;AAAA,QAC7B,MAAM,IAAI,IAAI,IAAI,KAAK,IAAI,MAAM;AAAA,QACjC,MAAM,IAAI,IAAI,IAAI,KAAK,MAAM;AAAA,QAC7B,IAAI,OAAO;AAAA,UAAG,EAAE,KAAK,GAAG,GAAG,GAAG,CAAC;AAAA,QAC/B;AAAA,UAAK,EAAE,KAAK,GAAG,GAAG,GAAG,CAAC;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA;;;AC1DF,IAAM,WAAW,CAAC,GAAgB,QAAsB,QAAQ,IAAI,EAAE,OAAO,WAAW,MAAM;AAG9F,SAAS,QAAQ,CAAC,GAAgB,IAAe,IAAuB,OAAe,KAAU;AAAA,EAC/F,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,OAAO,WAAU,MAAM;AAAA,EAC7B,MAAM,IAAI,SAAS,GAAG,GAAG;AAAA,EACzB,MAAM,SAAS,EAAE,UAAU,EAAE,OAAO;AAAA,EACpC,MAAM,KAAK,CAAC,MAAsB,KAAK,IAAI,GAAG,GAAG,YAAY,CAAC,IAAI,KAAK;AAAA,EACvE,SAAS,KAAK,CAAC,KAAK,KAAK,EAAE,OAAO,IAAI,CAAC,IAAI,EAAG,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG;AAAA,IACtE,MAAM,KAAK,CAAC,GAAW,MAAoB;AAAA,MACzC,MAAM,IAAI,GAAG,CAAC;AAAA,MACd,MAAM,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC;AAAA,MACrC,OAAO,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,MAAM,KAAK,EAAE;AAAA;AAAA,IAEtE,SAAS,IAAI,EAAG,IAAI,IAAI,GAAG,QAAQ,KAAK;AAAA,MACtC,MAAM,KAAK,GAAG,MAAM;AAAA,MACpB,MAAM,KAAK,GAAG,IAAI,MAAM;AAAA,MACxB,MAAM,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;AAAA,MACjE,IACE,KAAK,KAAK,EAAE,KAAK,MAAM,MAAM,EAAE,KAAK,MAAM,EAAE,IAC1C,KAAK,KAAK,EAAE,KAAK,MAAM,MAAM,EAAE,KAAK,MAAM,EAAE,IAC9C;AAAA,QAEA;AAAA,MACF,MAAM,MAAM,EAAE,IAAI,CAAC,MACjB,EAAE,OAAO;AAAA,QACP;AAAA,QACA,GAAG,CAAC,GAAG,GAAG,CAAC;AAAA,QACX,IAAI,CAAC,KAAK,KAAK,EAAE,KAAK,KAAK,QAAQ,KAAK,MAAO,EAAE,KAAK,MAAM,KAAM,KAAK,KAAK,KAAK,GAAG;AAAA,QACpF,OAAO,EAAE,OAAO;AAAA,MAClB,CAAC,CACH;AAAA,MACA,EAAE,KAAK,IAAI,MAAM,GAAG,IAAI,MAAM,GAAG,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC;AAAA,IAC3D;AAAA,EACF;AAAA,EACA,OAAO,EAAE,MAAM;AAAA;AAUV,SAAS,SAAQ,CAAC,GAAgB,MAAW,GAAa;AAAA,EAC/D,MAAM,KAAK,WAAU,CAAC;AAAA,EACtB,MAAM,OAAO,EAAE,SAAS;AAAA,EACxB,MAAM,WAAW,CAAC,IAAI,IAAI,CAAC,EAAE,QAAQ;AAAA,EACrC,MAAM,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE,QAAQ;AAAA,EAC7B,MAAM,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE,QAAQ;AAAA,EAE7B,MAAM,KAAK,MAAM,KACf,EAAE,QAAQ,WAAW,EAAE,GACvB,CAAC,GAAG,MAAM,CAAC,OAAQ,EAAE,UAAU,IAAI,KAAK,IAAK,KAAK,KAAK,IAAK,QAAQ,KAAM,CAC5E;AAAA,EACA,MAAM,OAAO,EAAE,WAAW;AAAA,EAC1B,MAAM,KAAK,EAAE,WAAW;AAAA,EACxB,MAAM,KAAK;AAAA,EACX,MAAM,OAAa,GAAG,IAAI,CAAC,MAAM;AAAA,IAC/B,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC;AAAA,IAC3B,MAAM,MAAM,QAAQ,IAAI,GAAG,IAAI;AAAA,IAC/B,MAAM,MAAc,CAAC;AAAA,IACrB,MAAM,MAAM,CAAC,IAAY,IAAY,GAAW,UAAmB;AAAA,MACjE,SAAS,IAAI,QAAQ,IAAI,EAAG,KAAK,GAAG,KAAK;AAAA,QACvC,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAO,KAAK,MAAM,IAAK,CAAC;AAAA,QACrD,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,MACpB;AAAA;AAAA,IAEF,IAAI,GAAG,IAAI,IAAI,IAAI;AAAA,IACnB,IAAI,IAAI,KAAK,GAAG,KAAK;AAAA,IACrB,IAAI,KAAK,KAAK,KAAK,GAAG,IAAI,KAAK;AAAA,IAC/B,OAAO;AAAA,GACR;AAAA,EACD,MAAM,MAAM,UAAU,IAAI;AAAA,EAC1B,WAAW,OAAO,KAAK;AAAA,IACrB,MAAM,IAAI,IAAI;AAAA,IACd,IAAI,GAAG;AAAA,MACL,MAAM,IAAI,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE,KAAK;AAAA,MACpC,IAAI,KAAK,CAAC,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,CAAC;AAAA,IACjC;AAAA,EACF;AAAA,EACA,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,IAAI,EAAE;AAAA,EACZ,SAAS,GAAG,MAAM,KAAK,GAAG,IAAI,EAAE,QAAQ,IAAI;AAAA,EAC5C,SAAS,GAAG,MAAM,KAAK,IAAI,KAAK,GAAG,EAAE,QAAQ,CAAC,MAAM,MAAM,IAAI,GAAG,IAAI;AAAA,EACrE,SAAS,GAAG,MAAM,KAAK,KAAK,GAAG,KAAK,IAAI,IAAI,EAAE,UAAU,IAAI;AAAA,EAC5D,MAAM,QAAQ,CAAC,EAAE,MAAM,CAAC;AAAA,EACxB,IAAI,KAAK;AAAA,IAAG,MAAM,KAAK,SAAS,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,EAClD,IAAI,EAAE,UAAU,MAAM;AAAA,IAAG,MAAM,KAAK,GAAG,QAAQ,EAAE,QAAQ,IAAI,IAAI,GAAG,CAAC;AAAA,EACrE,KAAK,EAAE,SAAS,aAAa,WAAW;AAAA,IACtC,MAAM,IAAI,GAAG,MAAM,CAAC;AAAA,IACpB,MAAM,QAAQ,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;AAAA,IACzC,IAAI,KAAK;AAAA,MAAG,KAAK,KAAK,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;AAAA,IAC7D,MAAM,OAAO,CAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAY,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;AAAA,IAErE,MAAM,KAAK,GAAG,YAAY,CAAC;AAAA,IAC3B,MAAM,MAAc,CAAC;AAAA,IACrB,MAAM,IAAI,SAAS,GAAG,GAAG;AAAA,IACzB,SAAS,IAAI,KAAK,KAAK,EAAE,OAAO,IAAI,CAAC,IAAI,EAAG,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG;AAAA,MACnE,IAAI,OAAO,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK;AAAA,QACjC,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,OAAO,KAAK,IAAI,OAAO,EAAE,CAAC;AAAA,IACjF;AAAA,IACA,MAAM,KAAK,QAAQ,OAAO,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC;AAAA,EACjF;AAAA,EACA,MAAM,KAAK,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,EAC3B,OAAO;AAAA,IACL,OAAO,WAAU,OAAM,KAAK,GAAG,EAAE;AAAA,IACjC,MAAM,WAAU,SAAS,GAAG,IAAI,IAAI,KAAK,IAAI,KAAK,GAAG,GAAG,GAAG,EAAE;AAAA,IAC7D,OAAO;AAAA,EACT;AAAA;AAIF,SAAS,QAAQ,CACf,GACA,IACA,IACA,IACA,IACM;AAAA,EACN,MAAM,IAAU,GAAG,IAAI,CAAC,MAAM;AAAA,IAC5B,MAAM,IAAI,GAAG,YAAY,CAAC;AAAA,IAC1B,MAAM,IAAI,GAAG,KAAK,CAAC;AAAA,IACnB,MAAM,KAAK,KAAK,IAAI,GAAG,IAAI,EAAE;AAAA,IAC7B,OAAO;AAAA,MACL,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,IAAI,EAAE;AAAA,MACb,CAAC,GAAG,IAAI,IAAI,EAAE;AAAA,MACd,CAAC,GAAG,IAAI,CAAC;AAAA,IACX;AAAA,GACD;AAAA,EACD,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,MAAM,EAAE,OAAO,WAAW,EAAE,OAAO;AAAA,EAEzC,YAAY,IAAI,UAAU;AAAA,IACxB,CAAC,GAAG,EAAE,OAAO,QAAQ;AAAA,IACrB,CAAC,GAAG,GAAG;AAAA,IACP,CAAC,GAAG,GAAG;AAAA,EACT,GAAY;AAAA,IACV,MAAM,SAAS,EAAE,IAAI,CAAC,QAAQ,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC;AAAA,IACnD,SAAS,GAAG,QAAQ,UAAU,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI;AAAA,EAC1D;AAAA,EACA,OAAO,EAAE,MAAM;AAAA;AAIjB,SAAS,OAAO,CACd,GACA,IACA,IACA,KACA;AAAA,EACA,MAAM,IAAI,EAAE,UAAU;AAAA,EACtB,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,SAClB,OAAM;AAAA,IACJ,SAAS,EAAE,QAAQ,GAAG,UAAU,QAAQ,IAAI,IAAI,EAAE;AAAA,IAClD,MAAM,GAAG,IAAI,CAAC,MAAY,CAAC,GAAG,QAAQ,GAAG,YAAY,CAAC,IAAI,IAAI,MAAM,GAAG,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC;AAAA,IACzF,OAAO,EAAE;AAAA,IACT,MAAM;AAAA,EACR,CAAC,CACH;AAAA;AAIF,SAAS,OAAO,CAAC,QAAyB,OAAmB;AAAA,EAC3D,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,OAAO,WAAU,OAAO;AAAA,EAC9B,MAAM,MAAM,OAAO,IAAI,CAAC,MACtB,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK,EAAE,KAAK,KAAK,QAAQ,KAAK,EAAE,GAAG,MAAM,CAAC,CACnF;AAAA,EAEA,YAAY,GAAG,GAAG,MAAM,aAAY,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;AAAA,IACjE,EAAE,IAAI,IAAI,MAAM,GAAG,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC;AAAA,EAC7C,OAAO,EAAE,MAAM;AAAA;AAIV,SAAS,KAAI,CAAC,KAAmB,GAAwD;AAAA,EAC9F,MAAM,OAAO,EAAE,QAAQ;AAAA,EACvB,MAAM,IAAI,UAAS,GAAG,IAAI,GAAG;AAAA,EAC7B,IAAI,KAAK,MAAM,EAAE,KAAK;AAAA,EACtB,IAAI,KAAK,GAAG,aAAa,EAAE,IAAI;AAAA,EAC/B,OAAO,EAAE;AAAA;;ACzMJ,SAAS,SAAQ,CACtB,MACA,IACM;AAAA,EACN,gBAAe,mCAAmC,2BAA2B;AAAA;;ACcxE,SAAS,OAAO,CACrB,GACA,UACA,IACA,KACM;AAAA,EACN,OAAO,GAAG,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG;AAAA,EAClC,MAAM,KAAK,GAAG,KAAK,EAAE,GAAG;AAAA,EACxB,MAAM,KAAK,GAAG,KAAK,EAAE,GAAG;AAAA,EACxB,MAAM,UAA8B;AAAA,IAClC,CAAC,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAAA,IACvB,CAAC,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAAA,IACvB,CAAC,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAAA,IACvB,CAAC,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAAA,EACzB;AAAA,EACA,MAAM,OAAO,KAAK,IAAI,GAAG,QAAQ,IAAI,EAAE,GAAG,OAAO,SAAS,GAAG,CAAC,CAAC,CAAC;AAAA,EAChE,MAAM,MAAM,QAAQ,EAAE,UAAU;AAAA,EAChC,MAAM,KAAK,GAAG;AAAA,EACd,MAAM,QAAQ,EAAE,SAAS;AAAA,EACzB,MAAM,IAAI,IAAI;AAAA,EACd,QAAQ,QAAQ,EAAE,IAAI,KAAK,MAAM;AAAA,IAC/B,OAAO,IAAI,MAAM,QAAS,KAAI,KAAK,MAAM,CAAC,IAAI,EAAE;AAAA,IAChD,SAAS,GAAG;AAAA,MACV,QAAQ;AAAA,QACN,CAAC,IAAI,IAAI,EAAE;AAAA,QACX,CAAC,IAAI,IAAI,EAAE;AAAA,QACX,CAAC,IAAI,IAAI,GAAG;AAAA,QACZ,CAAC,IAAI,IAAI,GAAG;AAAA,MACd;AAAA,MACA,QAAQ,CAAC,KAAK,IAAI,EAAE,KAAK,KAAK,CAAC;AAAA,MAC/B,IAAI,CAAC,GAAG,GAAG,CAAC;AAAA,MACZ,SAAS,CAAC,GAAG,GAAG,EAAE;AAAA,MAClB,OAAO,EAAE;AAAA,MACT;AAAA,MACA,QAAQ,MAAM;AAAA,IAChB,CAAC;AAAA,GACF;AAAA,EACD,SAAS,GAAG;AAAA,IACV,QAAQ,QAAQ,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,CAAS;AAAA,IACnD,QAAQ,CAAC,GAAG,GAAG,CAAC;AAAA,IAChB,IAAI,CAAC,GAAG,GAAG,CAAC;AAAA,IACZ,SAAS,CAAC,IAAI,IAAI,GAAG;AAAA,IACrB,OAAO,EAAE;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,EACV,CAAC;AAAA,EACD,MAAM,QAAQ,CAAC,EAAE,MAAM,CAAC;AAAA,EACxB,IAAI,MAAM,GAAG;AAAA,IACX,MAAM,IAAI;AAAA,IACV,MAAM,MAAY,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,MAAM,KAAK,MAAM,EAAE,MAAM,KAAK,IAAI;AAAA,IAC1E,MAAM,KAAK,KAAI,EAAE,MAAM,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,CAAC;AAAA,IAC3F,MAAM,KAAK,KAAI,EAAE,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,CAAC;AAAA,EACtF;AAAA,EACA,IAAI,QAAQ,GAAG;AAAA,IACb,MAAM,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,CAAC;AAAA,IACnD,MAAM,MAAM,EAAE,YAAY,CAAC,MAAM,MAAM,GAAG;AAAA,IAC1C,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK;AAAA,MAC1B,MAAM,IAAI,KAAK,IAAI,IAAK,KAAK,IAAI,OAAQ;AAAA,MACzC,MAAM,KACJ,OAAM;AAAA,QACJ,SAAS;AAAA,UACP,CAAC,MAAM,CAAC;AAAA,UACR,CAAC,KAAK,IAAI;AAAA,UACV,CAAC,OAAO,GAAG;AAAA,UACX,CAAC,OAAO,IAAI;AAAA,QACd;AAAA,QACA,UAAU;AAAA,QACV,MAAM;AAAA,QACN,IAAI,CAAC,GAAG,IAAI,MAAM,IAAI;AAAA,QACtB,OAAO;AAAA,MACT,CAAC,CACH;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO,OAAM,KAAK;AAAA;;;ACrCpB,IAAM,OAAM,KAAK,KAAK;AACtB,IAAM,SAAyC;AAAA,EAE7C,OAAO;AAAA,IACL,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,IAAI,CAAC;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,CAAC,GAAG,EAAE;AAAA,IACN,CAAC,GAAG,CAAC;AAAA,EACP;AAAA,EACA,MAAM;AAAA,IACJ,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,GAAG,EAAE;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,GAAG,CAAC;AAAA,EACP;AACF;AAEA,IAAM,OAAM,CAAC,OAAe,QAC1B,IAAI,YAAW,sBAAsB,EAAE,OAAO,IAAI,CAAC;AAE9C,SAAS,YAAY,CAAC,GAAsB;AAAA,EACjD,OAAO,GAAG,KAAK,EAAE;AAAA,EACjB,IAAI,EAAE,IAAI,KAAK,IAAI,KAAK,OAAO,SAAS,CAAC,KAAK,OAAO,SAAS,CAAC;AAAA,IAC7D,MAAM,KACJ,sBAAsB,MAAM,MAC5B,2DACF;AAAA,EACF,MAAM,WAAW,EAAE,SAAS,aAAa,EAAE,SAAS,YAAY,KAAK;AAAA,EACrE,IAAI,EAAE,EAAE,YAAY,KAAK,EAAE,YAAY;AAAA,IACrC,MAAM,KACJ,GAAG,EAAE,yBAAyB,EAAE,YAChC,SAAS,mFACX;AAAA,EACF,MAAM,IAAI,EAAE,aAAa;AAAA,EACzB,IAAI,EAAE,IAAI,KAAK,IAAI;AAAA,IACjB,MAAM,KAAI,qBAAqB,KAAK,0CAA0C;AAAA,EAChF,MAAM,KAAK,EAAE,YAAY;AAAA,EACzB,IAAI,EAAE,MAAM,KAAK,KAAK,MAAM,GAAG,EAAE,QAAQ,OAAO;AAAA,IAC9C,MAAM,KAAI,oBAAoB,MAAM,qDAAqD;AAAA,EAC3F,IAAI,EAAE,SAAS,aAAa,EAAE,SAAS,WAAW;AAAA,IAChD,MAAM,KAAK,EAAE,kBAAkB,EAAE,SAAS,YAAY,KAAK;AAAA,IAC3D,IAAI,EAAE,KAAK,KAAK,KAAK,EAAE;AAAA,MACrB,MAAM,KACJ,GAAG,EAAE,sBAAsB,4BAA4B,EAAE,YACzD,yFACF;AAAA,IACF,MAAM,IAAI,EAAE,QAAQ;AAAA,IACpB,IAAI,EAAE,IAAI,KAAK,IAAI;AAAA,MACjB,MAAM,KAAI,GAAG,EAAE,gBAAgB,KAAK,0CAA0C;AAAA,EAClF;AAAA;AAIF,SAAS,WAAW,CAAC,GAAgB,GAAW,GAAoB;AAAA,EAClE,MAAM,KAAK,KAAK,IAAI,EAAE,WAAW,IAAG;AAAA,EACpC,MAAM,OAAO,CAAC,GAAW,IAAI,GAAG,IAAI,MAAe;AAAA,IACjD,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE;AAAA,IAC9B,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE;AAAA,EAC/B;AAAA,EACA,MAAM,OAAO,CAAC,GAAW,IAAI,GAAG,IAAI,MAAe;AAAA,IACjD,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE;AAAA,IAC9B,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE;AAAA,EAC/B;AAAA,EACA,QAAQ,EAAE;AAAA,IACR,KAAK;AAAA,MACH,OAAO,KAAK,EAAE;AAAA,IAChB,KAAK;AAAA,MACH,OAAO,CAAC,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC;AAAA,IACtC,KAAK;AAAA,MACH,OAAO,CAAC,GAAG,KAAK,EAAE,GAAG,GAAG,KAAK,EAAE,CAAC;AAAA,IAClC,KAAK,WAAW;AAAA,MACd,MAAM,IAAI,KAAK,IAAI,GAAG,CAAC,IAAI;AAAA,MAC3B,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,CAAC;AAAA,IACxC;AAAA,IACA,KAAK;AAAA,IACL,KAAK,WAAW;AAAA,MACd,MAAM,KAAK,KAAK,KAAK,EAAE,kBAAkB,EAAE,SAAS,YAAY,KAAK,OAAO,IAAG;AAAA,MAC/E,MAAM,KAAK,EAAE,SAAS,EAAE,SAAS,YAAY,MAAM,SAAS,KAAK,IAAI,GAAG,CAAC;AAAA,MAEzE,MAAM,QAAQ,CAAC,SAAyB,IAAI,MAAM,OAAO,KAAK,KAAK,OAAO;AAAA,MAC1E,MAAM,QAAQ,CAAC,GAAG,KAAK,EAAE,GAAG,GAAI,EAAE,SAAS,YAAY,KAAK,EAAE,IAAI,CAAC,CAAE;AAAA,MACrE,MAAM,MAAM;AAAA,QACV,GAAG,KAAK,IAAI,MAAM,CAAC,GAAG,EAAE;AAAA,QACxB,GAAI,EAAE,SAAS,YAAY,KAAK,IAAI,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC;AAAA,MACvD;AAAA,MACA,OAAO,CAAC,GAAG,OAAO,GAAG,GAAG;AAAA,IAC1B;AAAA;AAAA;AAIG,SAAS,SAAS,CAAC,GAA2B;AAAA,EACnD,aAAa,CAAC;AAAA,EACd,OAAO,GAAG,KAAK,EAAE;AAAA,EACjB,MAAM,QAAQ,EAAE,UAAU,KAAK,IAAI,MAAM;AAAA,EACzC,MAAM,MAAgB,EAAE,SAAS,SAAU,EAAE,OAAO,UAAW,UAAU,MAAM,UAAU;AAAA,EACzF,OAAO,IAAI,MAAM,OAAO;AAAA,EACxB,MAAM,KAAK,KAAK,IAAI,GAAG,EAAE,IAAI,MAAM,IAAI,KAAK;AAAA,EAC5C,MAAM,KAAK,KAAK,IAAI,GAAG,EAAE,IAAI,MAAM,IAAI,KAAK;AAAA,EAC5C,MAAM,KAAK,EAAE,YAAY;AAAA,EACzB,MAAM,IAAI,EAAE,aAAa;AAAA,EACzB,MAAM,QAAQ,YAAY,GAAG,GAAG,CAAC;AAAA,EACjC,MAAM,MAAM,MAAM,IAAI,CAAC,OAAO,KAAK,GAAG,GAAG,EAAE,IAAI,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;AAAA,EAC/E,MAAM,SAAS,EAAE,SAAS,SAAS,EAAE,SAAS,aAAa,EAAE,SAAS;AAAA,EACtE,MAAM,IAAI,SAAS,KAAK,IAAI,IAAI,MAAM,KAAK,EAAE,QAAQ;AAAA,EACrD,MAAM,IAAI,IAAI;AAAA,EAEd,MAAM,KAAK,MAAM,MAAM,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE;AAAA,EAC5C,MAAM,QAAQ,CAAC,KAAK,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE;AAAA,EAC3C,IAAI,UAAkB;AAAA,IACpB,CAAC,CAAC,GAAG,CAAC,CAAC;AAAA,IACP,CAAC,GAAG,CAAC,CAAC;AAAA,IACN,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,CAAC,GAAG,CAAC;AAAA,EACR;AAAA,EACA,WAAW,KAAK;AAAA,IAAO,UAAU,SAAS,SAAS,CAAC,MAAM,QAAQ,IAAI,GAAG,CAAC,CAAC;AAAA,EAC3E,OAAO,EAAE,GAAG,GAAG,OAAO,KAAK,SAAS,IAAI,IAAI,WAAW,EAAE;AAAA;AAGpD,IAAM,MAAM,CAAC,GAAU,MAAoB,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AAGxE,IAAM,WAAW,CAAC,QAA0B,MACjD,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC;AAGnC,SAAS,MAAM,CAAC,QAA0B,SAA6C;AAAA,EAC5F,MAAM,MAAyB,CAAC;AAAA,EAChC,OAAO,QAAQ,CAAC,GAAG,MAAM;AAAA,IACvB,IAAI,OAAe,CAAC,GAAG,OAAO;AAAA,IAC9B,OAAO,QAAQ,CAAC,GAAG,MAAM;AAAA,MACvB,IAAI,MAAM,KAAK,KAAK,UAAU;AAAA,QAAG,OAAO,SAAS,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,KACpF;AAAA,IACD,IAAI,KAAK,UAAU,KAAK,KAAK,IAAI,MAAM,IAAI,CAAC,IAAI;AAAA,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC;AAAA,GACzE;AAAA,EACD,OAAO;AAAA;AAIF,IAAM,UAAU,CAAC,GAAc,GAAS,GAAW,OAAmB;AAAA,EAC3E,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE;AAAA,EACrC,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE;AAAA,EACrC,GAAG,KAAK;AACV;AAGO,IAAM,UAAU,CAAC,GAAc,GAAW,GAAW,OAAmB;AAAA,EAC7E,MAAM,KAAK,IAAI,GAAG;AAAA,EAClB,MAAM,KAAK,IAAI,GAAG;AAAA,EAClB,OAAO,CAAC,KAAK,EAAE,GAAG,KAAK,KAAK,EAAE,GAAG,IAAI,KAAK,EAAE,GAAG,KAAK,KAAK,EAAE,GAAG,EAAE;AAAA;AAI3D,SAAS,aAAY,CAAC,GAAgB,GAAW,GAAmB;AAAA,EACzE,MAAM,IAAI,UAAU,CAAC;AAAA,EACrB,OAAO,EAAE,GAAG,KAAK,SAAS,EAAE,KAAK,QAAQ,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC;AAAA;AAIlD,SAAS,YAAW,CAAC,GAAwB;AAAA,EAClD,MAAM,IAAI,UAAU,CAAC;AAAA,EACrB,IAAI,IAAI;AAAA,EACR,YAAY,GAAG,SAAS,OAAO,EAAE,KAAK,EAAE,OAAO;AAAA,IAC7C,WAAW,KAAK;AAAA,MAAM,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;AAAA,EACjD,OAAO,EAAE,GAAG,KAAK;AAAA;;;AClLnB,IAAM,IAAI,CAAC,GAAc,GAAS,GAAW,OAAmB,QAAQ,GAAG,GAAG,GAAG,EAAE;AACnF,IAAM,OAAO,CAAC,GAAc,GAAW,GAAW,MAAoB;AAAA,EACpE,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,KAAK;AAAA,EACxB,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,KAAK;AAAA,EACxB;AACF;AAEA,IAAM,YAAY,CAAC,SAA0B,MAC3C,QAAQ,KAAK,CAAC,GAAG,MAAM;AAAA,EACrB,MAAM,IAAI,QAAS,KAAI,KAAK,QAAQ,WAAW;AAAA,EAC/C,MAAM,KAAK,EAAE,KAAK,EAAE;AAAA,EACpB,MAAM,KAAK,EAAE,KAAK,EAAE;AAAA,EACpB,MAAM,KAAK,KAAK,KAAK,KAAK,MAAM;AAAA,EAChC,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,EAAE,KAAK,EAAE,MAAM,MAAM,EAAE,KAAK,EAAE,MAAM,MAAM,EAAE,CAAC;AAAA,EACjF,OAAO,KAAK,MAAM,EAAE,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,EAAE,IAAI;AAAA,CACjE;AAGH,SAAS,MAAM,CACb,GACA,GACA,QACA,GACA,MACmB;AAAA,EACnB,MAAM,QAAQ,OAAO,QAAQ,EAAE,OAAO;AAAA,EACtC,YAAY,GAAG,SAAS,OAAO;AAAA,IAC7B,MAAM,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;AAAA,IACpD,MAAM,MAAM,IAAI,OAAO,CAAC,GAAG,MAAO,EAAE,KAAK,EAAE,KAAK,IAAI,GAAI,IAAI,MAAM,EAAE,EAAE;AAAA,IACtE,MAAM,IAAI,KAAK,OAAO,KAAK;AAAA,IAC3B,SAAS,GAAG;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,MACvC,IAAI,CAAC,GAAG,GAAG,CAAC;AAAA,MACZ,SAAS;AAAA,MACT,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EACA,OAAO;AAAA;AAIT,SAAS,MAAM,CAAC,GAAgB,GAAc,GAAoB,MAAY,OAAqB;AAAA,EACjG,MAAM,IAAI,EAAE,QAAQ;AAAA,EACpB,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK;AAAA,IAC1B,MAAM,IAAI,EAAE,QAAQ,MAAM,CAAC,GAAG,CAAC;AAAA,IAC/B,MAAM,IAAI,EAAE,QAAS,KAAI,KAAK,MAAM;AAAA,IACpC,MAAM,KAAK,EAAE,KAAK,EAAE;AAAA,IACpB,MAAM,KAAK,EAAE,KAAK,EAAE;AAAA,IACpB,MAAM,OAAO,KAAK,KAAK,KAAK;AAAA,IAC5B,IAAI,OAAO;AAAA,MAAO;AAAA,IAClB,MAAM,KAAK,CAAC,GAAG,CAAC;AAAA,IAChB,WAAW,KAAK,OAAO;AAAA,MACrB,MAAM,MAAM,EAAE,KAAK,EAAE,MAAM,MAAM,EAAE,KAAK,EAAE,MAAM,MAAM;AAAA,MACtD,MAAM,MAAM,KAAK,KAAK,EAAE,KAAK,EAAE,MAAM,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,KAAK,KAAK,IAAI;AAAA,MAC9E,IAAI,IAAI,YAAQ,IAAI,IAAI,YAAQ,MAAM;AAAA,QAAM,GAAG,KAAK,CAAC;AAAA,IACvD;AAAA,IACA,GAAG,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,IACvB,MAAM,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;AAAA,IAC9B,SAAS,IAAI,EAAG,IAAI,IAAI,GAAG,QAAQ,KAAK;AAAA,MACtC,MAAM,KAAW,CAAC,EAAE,KAAK,MAAM,GAAG,MAAM,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,EAAE;AAAA,MACpE,MAAM,KAAW,CAAC,EAAE,KAAK,MAAM,GAAG,IAAI,MAAM,IAAI,EAAE,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;AAAA,MAC5E,IAAI,KAAK,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,EAAE,IAAI;AAAA,QAAM;AAAA,MACrD,SAAS,GAAG;AAAA,QACV,QAAQ;AAAA,UACN,EAAE,GAAG,IAAI,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;AAAA,UACpC,EAAE,GAAG,IAAI,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;AAAA,UACpC,EAAE,GAAG,IAAI,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;AAAA,UAClC,EAAE,GAAG,IAAI,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;AAAA,QACpC;AAAA,QACA,QAAQ;AAAA,QACR,IAAI,CAAC,GAAG,GAAG,CAAC;AAAA,QACZ,SAAS,EAAE;AAAA,QACX,OAAO;AAAA,QACP,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAIF,SAAS,UAAU,CAAC,GAAgB,GAAc,GAAoB,QAAuB;AAAA,EAC3F,MAAM,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,MAAM,IAAI,EAAU;AAAA,EAC1D,MAAM,QAA8B;AAAA,IAClC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;AAAA,IAC1C,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC;AAAA,IAC7C,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;AAAA,IAC1C,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,GAAG,GAAG,IAAI,CAAC,CAAC;AAAA,EAC/C;AAAA,EACA,YAAY,IAAI,IAAI,QAAQ,OAAO;AAAA,IACjC,MAAM,KAAK,CAAC,MAAoB,CAAC,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAAA,IACzF,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;AAAA,IACzB,EAAE,MAAM,QAAQ,CAAC,GAAG,MAAM;AAAA,MACxB,EAAE,MAAM,QAAQ,CAAC,GAAG,MAAM;AAAA,QACxB,IAAI,KAAK;AAAA,UAAG;AAAA,QACZ,MAAM,KAAK,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE;AAAA,QACjC,MAAM,KAAK,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE;AAAA,QACjC,IAAI,KAAK,IAAI,KAAK,EAAE,IAAI;AAAA,UAAO;AAAA,QAC/B,MAAM,IAAI,MAAM,KAAK;AAAA,QACrB,IAAI,IAAI,YAAQ,IAAI,IAAI,YAAQ,KAAK,IAAI,SAAS,EAAE,OAAO,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI;AAAA,UACnF,GAAG,IAAI,CAAC;AAAA,OACX;AAAA,KACF;AAAA,IACD,MAAM,OAAO,CAAC,GAAG,EAAE,EAChB,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,EACpB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAU;AAAA,IACxD,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,IAAI;AAAA,MAAM;AAAA,IAChD,MAAM,MAAc,CAAC,EAAE,GAAG,IAAI,GAAG,EAAE,EAAE,CAAC;AAAA,IACtC,YAAY,GAAG,MAAM;AAAA,MAAM,IAAI,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;AAAA,IACjE,IAAI,KAAK,EAAE,GAAG,IAAI,GAAG,EAAE,EAAE,CAAC;AAAA,IAC1B,SAAS,GAAG;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,IAAI,CAAC,GAAG,GAAG,CAAC;AAAA,MACZ,SAAS,EAAE;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK,SAAS;AAAA,MACrB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAIF,SAAS,IAAI,CAAC,GAAc,GAAoB,OAA0B,MAAY,KAAU;AAAA,EAC9F,MAAM,OAAO,IAAI;AAAA,EACjB,MAAM,MAAc,CAAC;AAAA,EACrB,MAAM,IAAI,KAAK,IAAI,MAAM,EAAE,YAAY,GAAG;AAAA,EAC1C,YAAY,GAAG,SAAS,OAAO;AAAA,IAC7B,KAAK,QAAQ,CAAC,IAAI,MAAM;AAAA,MACtB,MAAM,KAAK,KAAM,KAAI,KAAK,KAAK,WAAW;AAAA,MAC1C,MAAM,MAAY,EAAE,GAAG,KAAK,GAAG,MAAM,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;AAAA,MAC3D,IAAI,UAAU,EAAE,SAAS,GAAG,KAAK,KAAK,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,EAAE,IAAI;AAAA,QAAM;AAAA,MAClF,MAAM,MAAM,CAAC,IAAI,EAAE,EAChB,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC,GAAG,EAClD,KAAK,EACL,KAAK,GAAG;AAAA,MACX,IAAI,KAAK,IAAI,GAAG;AAAA,QAAG;AAAA,MACnB,KAAK,IAAI,GAAG;AAAA,MACZ,MAAM,OAAO,IAAI;AAAA,MACjB,IAAI,KACF,MAAK;AAAA,QACH,MAAM,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,IAAI,MAAM,EAAE,EAAE;AAAA,QACtC,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,IAAI,MAAM,EAAE,EAAE;AAAA,QACpC,OAAO,IAAI;AAAA,QACX,UAAU,QAAQ,IAAI,IAAI;AAAA,QAC1B,OAAO;AAAA,QACP,OAAO;AAAA,MACT,CAAC,CACH;AAAA,KACD;AAAA,EACH;AAAA,EACA,OAAO;AAAA;AAIF,SAAS,SAAQ,CAAC,GAAoB,MAAW,GAAS;AAAA,EAC/D,MAAM,IAAI,UAAU,CAAC;AAAA,EACrB,MAAM,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,MAAM,KAAK,MAAM,EAAE,MAAM,KAAK,IAAI;AAAA,EAC/E,MAAM,QAAQ,EAAE,SAAS;AAAA,EACzB,MAAM,IAAI,IAAI;AAAA,EACd,MAAM,QAAgB,CAAC;AAAA,EACvB,IAAI,QAAQ,GAAG;AAAA,IAEb,OAAO,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,MAAM,OAAO,OAAO,EAAE,OAAO,OAAO,QAAQ,MAAM,CAAC;AAAA,EAChF,EAAE,KAAK;AAAA,IACL,MAAM,MAAM,OAAO,GAAG,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,OAAO,EAAE,OAAO,OAAO,QAAQ,KAAK,CAAC;AAAA,IACvF,MAAM,QAAQ,OAAO,GAAG,GAAG,EAAE,OAAO,GAAG;AAAA,MACrC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,IACD,MAAM,QAAQ,CAAC,GAAG,KAAK,GAAG,KAAK,EAAE,QAAQ,IAAI,UAAU,IAAI;AAAA,IAC3D,OAAO,GAAG,GAAG,GAAG,MAAM,KAAK;AAAA,IAC3B,IAAI,EAAE,SAAS;AAAA,MAAO,MAAM,KAAK,GAAG,KAAK,GAAG,GAAG,KAAK,MAAM,GAAG,CAAC;AAAA;AAAA,EAEhE,WAAW,GAAG,GAAG,GAAG,MAAM,CAAC;AAAA,EAC3B,WAAW,KAAK,EAAE,YAAY,CAAC,GAAG;AAAA,IAChC,MAAM,KAAK,QAAQ,GAAG,CAAC,GAAG,MAAM,cAAa,GAAG,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC;AAAA,EACnE;AAAA,EACA,OAAO,OAAM,CAAC,EAAE,MAAM,GAAG,GAAG,KAAK,CAAC;AAAA;AAI7B,SAAS,KAAI,CAAC,KAAmB,GAA2D;AAAA,EACjG,IAAI,KAAK,EAAE,QAAQ,QAAQ,UAAS,GAAG,IAAI,GAAG,CAAC;AAAA,EAC/C,OAAO,UAAS,CAAC;AAAA;AAGZ,SAAS,SAAQ,CAAC,GAA0B;AAAA,EACjD,MAAM,IAAI,UAAU,CAAC;AAAA,EACrB,MAAM,OAAO,KAAK,IAAI,GAAG,EAAE,QAAQ,IAAI,CAAC,MAAM,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AAAA,EACnE,OAAO;AAAA,IACL,OAAO,aAAY,CAAC;AAAA,IACpB,MAAM,EAAE,GAAG,KAAK;AAAA,IAChB,UAAU,CAAC,GAAG,MAAM,cAAa,GAAG,GAAG,CAAC;AAAA,EAC1C;AAAA;;AC5OF,SAAS,GAAG,CAAC,IAAiB,GAAS,GAAS,GAAS,KAAW,QAAoB;AAAA,EACtF,MAAM,KAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;AAAA,EACpD,MAAM,KAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;AAAA,EACpD,MAAM,IAAO;AAAA,IACX,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG;AAAA,IAC3B,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG;AAAA,IAC3B,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG;AAAA,EAC7B;AAAA,EACA,MAAM,IAAI,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK;AAAA,EAC1C,WAAW,KAAK,CAAC,GAAG,EAAE,GAAG;AAAA,IACvB,MAAM,KAAW,CAAE,EAAE,KAAK,IAAK,GAAI,EAAE,KAAK,IAAK,GAAI,EAAE,KAAK,IAAK,CAAC;AAAA,IAChE,MAAM,IAAI,GAAG,OAAO,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,IAAI,CAAC;AAAA,IAC3D,MAAM,IAAI,GAAG,OAAO,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,IAAI,CAAC;AAAA,IAC3D,MAAM,IAAI,GAAG,OAAO,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,OAAO,CAAC;AAAA,IAC9D,IAAI,IAAI;AAAA,MAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AAAA,IACzB;AAAA,MAAK,GAAG,IAAI,GAAG,GAAG,CAAC;AAAA,EACrB;AAAA;AAOK,SAAS,aAAa,CAC3B,OACA,OACA,MACA,SACA,OACA,KACM;AAAA,EACN,MAAM,KAAK,IAAI;AAAA,EACf,WAAW,MAAM,OAAO;AAAA,IACtB,IAAI,GAAG,UAAU;AAAA,MAAO;AAAA,IACxB,MAAM,MAAM,YAAW,GAAG,GAAG;AAAA,IAC7B,MAAM,SAAS,iBAAgB,GAAG,GAAG;AAAA,IACrC,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,UAAU,KAAK,QAAQ;AAAA,IACrD,MAAM,OAAQ,GAAG,SAAS,MAAO;AAAA,IACjC,SAAS,IAAI,EAAG,IAAI,SAAS,KAAK;AAAA,MAChC,MAAM,IAAI,MAAO,OAAO,IAAI,OAAQ;AAAA,MACpC,MAAM,IAAI,IAAI,GAAG;AAAA,MACjB,IAAI,IAAI;AAAA,MACR,OAAO,IAAI,IAAI,SAAS,MAAM,IAAI,IAAI,MAAM,KAAK;AAAA,QAAG;AAAA,MACpD,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,MAC/B,MAAM,IAAI,GAAG,IAAI,IAAI,MAAM;AAAA,MAC3B,MAAM,KAAK,KAAK,IAAI,MAAM,QAAQ,IAAI,IAAI,MAAM,MAAM,IAAI,MAAM,MAAM;AAAA,MACtE,MAAM,KAAK,OAAO,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,GAAW,GAAG,CAAC,GAAG,GAAG,CAAC,GAAW,GAAG,CAAC,GAAG,GAAG,CAAC,EAAU;AAAA,MAC3F,MAAM,KAAK,GAAG,MAAM,MAAM,MAAM,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,KAAK;AAAA,MAClE,MAAM,IAAU;AAAA,QACd,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;AAAA,QACvB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;AAAA,QACvB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;AAAA,MACzB;AAAA,MACA,MAAM,MAAM,GAAG,SAAS,KAAK,QAAQ,KAAK,IAAI,KAAK,MAAM,OAAO,OAAO,EAAE,KAAK;AAAA,MAC9E,MAAM,KACJ,MACA,MACE,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,KAAK,MAAM,OAAO,IAAI,EAAE,KAAK,MAAM,OAAO,EAAE,IAAI,MAAM,MAAM;AAAA,MACzF,MAAM,MAAY;AAAA,QAChB,KAAK,MAAM,KAAK,IAAI,KAAK;AAAA,QACzB,KAAK,MAAM,KAAK,IAAI,KAAK;AAAA,QACzB,KAAK,MAAM,KAAK,IAAI,KAAK;AAAA,MAC3B;AAAA,MACA,MAAM,SAAe,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,GAAG;AAAA,MAChE,WAAW,QAAQ,CAAC,GAAG,EAAE,GAAG;AAAA,QAC1B,MAAM,IAAU,CAAC,GAAG,EAAE,KAAK,MAAM,GAAG,EAAE,KAAK,MAAM,GAAG,EAAE,KAAK,IAAI;AAAA,QAC/D,MAAM,OAAO,CAAC,MAAoB;AAAA,UAChC,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,EAAE,KAAK;AAAA,UAC5B,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,EAAE,KAAK;AAAA,UAC5B,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,EAAE,KAAK;AAAA,QAC9B;AAAA,QACA,MAAM,MAAY;AAAA,UAChB,EAAE,MAAM,EAAE,KAAK,MAAM,GAAG,EAAE,KAAK,OAAO,GAAG,EAAE,KAAK,QAAQ;AAAA,UACxD,EAAE,MAAM,EAAE,KAAK,MAAM,GAAG,EAAE,KAAK,OAAO,GAAG,EAAE,KAAK,QAAQ;AAAA,UACxD,EAAE,MAAM,EAAE,KAAK,MAAM,GAAG,EAAE,KAAK,OAAO,GAAG,EAAE,KAAK,QAAQ,MAAM,MAAM;AAAA,QACtE;AAAA,QACA,IAAI,IAAI,KAAK,CAAC,OAAO,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,KAAK,MAAM;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO,GAAG,MAAM;AAAA;AAIX,SAAS,KAAK,CACnB,OACA,IACA,GACA,KACM;AAAA,EACN,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,IAAI,SAAS,GAAG,KAAK,MAAM,MAAM,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;AAAA,EAC7F,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,EAClC,MAAM,KAAK,MAAM,MAAM,MAAM;AAAA,EAC7B,MAAM,UAAU,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,MAAwB;AAAA,IAC3D,MAAM,IAAI,CAAC,KAAK,KAAK,IAAK,IAAI,IAAK,KAAK;AAAA,IACxC,OAAO,CAAC,KAAK,IAAI,QAAQ,KAAK,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC,IAAI,EAAE,MAAM;AAAA,GACzE;AAAA,EACD,MAAM,MAAc,CAAC;AAAA,EACrB,SAAS,IAAI,EAAG,IAAI,EAAE,OAAO,KAAK;AAAA,IAChC,MAAM,IAAK,IAAI,EAAE,QAAS,KAAK,KAAK,IAAI,IAAI,MAAM,MAAM,GAAG;AAAA,IAC3D,MAAM,IAAI,KAAK,EAAE,SAAS;AAAA,IAC1B,MAAM,KAAK,IAAI,MAAM,IAAI,GAAG,IAAI,EAAE;AAAA,IAClC,IAAI,KACF,OAAM;AAAA,MACJ;AAAA,MACA,UAAU;AAAA,MACV,MAAM;AAAA,MACN,IAAI,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,IAAI,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC,IAAI,GAAG,EAAE,KAAK,EAAE;AAAA,MAC9D,OAAO,EAAE;AAAA,IACX,CAAC,CACH;AAAA,EACF;AAAA,EACA,OAAO,OAAM,GAAG;AAAA;;;AC5GlB,SAAS,WAAW,CAAC,OAAa,GAAe,MAA2B;AAAA,EAC1E,MAAM,IAAI,MAAM,IAAI,SAAS;AAAA,EAC7B,MAAM,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM,IAAI,CAAC,GAAG,KAAK,MAAO,IAAI,IAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAAA,EAC3E,MAAM,MAAM,IAAI,IAAI,CAAC,MAAY,MAAM,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,EAC1D,MAAM,QAAQ,IAAI,IAAI,CAAC,MAAM,MAAM,MAAM,MAAM,GAAG;AAAA,EAClD,MAAM,OAAO,IAAI,SAAS;AAAA,EAC1B,MAAM,MAAM,IAAI,SAAS,CAAC,GAAG,GAAG,CAAC;AAAA,EACjC,IAAI,SAAS,QAAQ,OAAO,IAAI,KAAK,UAAM;AAAA,IACzC,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC;AAAA,IAC/B,MAAM,KAAK,CAAC;AAAA,EACd,EAAE;AAAA,IAAK,MAAM,QAAQ;AAAA,EACrB,OAAO,OAAM;AAAA,IACX,SAAS,EAAE,QAAQ,GAAG,UAAU,EAAE;AAAA,IAClC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO,EAAE;AAAA,IACT,OAAO;AAAA,IACP,MAAM,SAAS,OAAO,QAAQ;AAAA,EAChC,CAAC;AAAA;AAGI,SAAS,IAAI,CAAC,OAAwB,GAAe,KAAoB;AAAA,EAC9E,MAAM,QAAQ,MAAM;AAAA,EACpB,IAAI,CAAC;AAAA,IAAO,OAAO,EAAE,OAAO,IAAI,aAAY,EAAE,MAAM,GAAG,QAAQ,IAAI,aAAY,EAAE,MAAM,EAAE;AAAA,EACzF,MAAM,MAAM,MAAM,IAAI,MAAM,IAAI,SAAS,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,EACvD,MAAM,SAAS,EAAE,OAAO,OAAO;AAAA,EAC/B,IAAI,KAAK;AAAA,EACT,IAAI,KAAK,IAAI;AAAA,EACb,WAAW,KAAK;AAAA,IACd,WAAW,KAAK,EAAE,QAAQ,IAAI,EAAE,MAAM,CAAC,GAAG;AAAA,MACxC,KAAK,KAAK,IAAI,IAAI,EAAE,KAAK,UAAU,KAAK,EAAE,OAAO,QAAQ,KAAK,EAAE;AAAA,MAChE,KAAK,KAAK,IAAI,IAAI,EAAE,KAAK,MAAM;AAAA,IACjC;AAAA,EACF,IAAI,CAAC,OAAO,SAAS,EAAE;AAAA,IAAG,KAAK,IAAI,KAAK;AAAA,EACxC,MAAM,OAAO;AAAA,EACb,MAAM,IAAI,IAAI,MAAc,IAAI,EAAE,KAAK,GAAG;AAAA,EAC1C,WAAW,KAAK;AAAA,IACd,WAAW,KAAK,EAAE,QAAQ,IAAI,EAAE,MAAM,CAAC,GAAG;AAAA,MACxC,MAAM,IAAI,KAAK,IAAI,OAAO,GAAG,KAAK,IAAI,GAAG,KAAK,OAAQ,EAAE,KAAK,OAAO,KAAK,MAAO,IAAI,CAAC,CAAC;AAAA,MACtF,EAAE,KAAK,KAAK,IAAI,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,IAAI,MAAM;AAAA,IAC9E;AAAA,EACF,MAAM,UAA8B,CAAC,CAAC,GAAG,EAAE,CAAC;AAAA,EAC5C,SAAS,IAAI,EAAG,IAAI,MAAM;AAAA,IAAK,QAAQ,KAAK,CAAC,EAAE,MAAM,KAAK,MAAO,IAAI,OAAO,QAAS,KAAK,GAAG,CAAC;AAAA,EAC9F,QAAQ,KAAK,CAAC,GAAG,EAAE,CAAC;AAAA,EACpB,MAAM,SAAS,OAAM,EAAE,SAAS,UAAU,IAAI,OAAO,EAAE,OAAO,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;AAAA,EAC9F,OAAO,IAAI,IAAI,MAAM,EAAE,OAAO;AAAA,EAC9B,SAAS,IAAI,EAAG,IAAI,OAAO,OAAO,SAAS,GAAG,KAAK;AAAA,IACjD,MAAM,MAAM,OAAO,UAAU,IAAI,IAAI,MAAM,KAAK,OAAO,KAAK;AAAA,IAC5D,MAAM,KAAK,OAAO,MAAM,MAAM,IAAI,IAAI,MAAM,OAAO,IAAI;AAAA,IACvD,OAAO,OAAO,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC;AAAA,EACnD;AAAA,EACA,OAAO,EAAE,OAAO,YAAY,OAAO,GAAG,EAAE,GAAG,OAAO;AAAA;AAG7C,SAAS,UAAU,CAAC,OAAwB,GAAe,OAAyB;AAAA,EACzF,MAAM,QAAQ,MAAM;AAAA,EACpB,MAAM,KAAK,IAAI;AAAA,EACf,IAAI,CAAC;AAAA,IAAO,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,EAAE;AAAA,EAC3D,MAAM,MAAM,MAAM,IAAI,MAAM,IAAI,SAAS,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,EACvD,MAAM,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,UAAU,KAAK;AAAA,EACpD,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK,OAAO,SAAS,EAAE,CAAC;AAAA,EACvD,OAAO,IAAI,IAAI,MAAM,EAAE,OAAO;AAAA,EAC9B,YAAY,IAAI,OAAO,OAAO,QAAQ,GAAG;AAAA,IACvC,IAAI,KAAK,UAAU;AAAA,MAAG;AAAA,IACtB,MAAM,IAAI,GAAG,IAAI,SAAS;AAAA,IAC1B,MAAM,MAAM,CAAC,KAAK,GAAG,IAAI,KAAK,MAAM,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,GAAG;AAAA,IACpE,MAAM,KAAK,iBAAgB,GAAG;AAAA,IAC9B,MAAM,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,GAAG,SAAS,EAAE,OAAO,KAAK;AAAA,IACnE,WAAW,QAAQ,CAAC,GAAG,EAAE,GAAG;AAAA,MAC1B,MAAM,OAAO,IAAI,IAAI,CAAC,GAAG,MAAY;AAAA,QACnC,MAAM,IAAI,GAAG;AAAA,QACb,MAAM,MAAM,EAAE,MAAM,KAAK;AAAA,QACzB,IAAI,CAAC;AAAA,UAAG,OAAO;AAAA,QACf,OAAO;AAAA,UACL,EAAE,MAAM,EAAE,EAAE,KAAK,OAAO,EAAE,EAAE,KAAK,OAAO,QAAQ;AAAA,UAChD,EAAE,MAAM,EAAE,EAAE,KAAK,OAAO,EAAE,EAAE,KAAK,OAAO,QAAQ;AAAA,UAChD,EAAE,MAAM,EAAE,EAAE,KAAK,OAAO,EAAE,EAAE,KAAK,OAAO,QAAQ;AAAA,QAClD;AAAA,OACD;AAAA,MACD,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK;AAAA,QAC1B,MAAM,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,EAAE;AAAA,QACnD,OAAO,GAAG,GAAG,KAAK,CAAC,EAAE,MAAM,KAAK,EAAE,MAAM,KAAK,EAAE,MAAM,GAAG;AAAA,QACxD,MAAM,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;AAAA,QACjD,MAAM,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;AAAA,QACjD,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,MAAM;AAAA,QAClE,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,MAAM;AAAA,QAClE,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,MAAM;AAAA,QAClE,MAAM,IAAI,KAAK,MAAM,IAAI,IAAI,EAAE,KAAK;AAAA,QACpC,WAAW,KAAK,CAAC,GAAG,EAAE,GAAG;AAAA,UACvB,MAAM,KAAW,CAAE,KAAK,IAAK,GAAI,KAAK,IAAK,GAAI,KAAK,IAAK,CAAC;AAAA,UAC1D,MAAM,MAAM,EAAE,IAAI,CAAC,GAAG,MAAM;AAAA,YAC1B,MAAM,KAAK,IAAI,IAAI,MAAM;AAAA,YACzB,OAAO,GAAG,OAAO,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE,EAAE,CAAC;AAAA,WACjF;AAAA,UACD,OAAO,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,GAAG,EAAE,QAAQ;AAAA,UACxE,GAAG,KAAK,IAAI,IAAI,IAAI,EAAE;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO,EAAE,OAAO,YAAY,OAAO,GAAG,IAAI,GAAG,QAAQ,GAAG,MAAM,EAAE;AAAA;;;ACvE3D,IAAM,WAAiE;AAAA,EAC5E,MAAM;AAAA,IACJ,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,MAAM,IAAI;AAAA,IACX,CAAC,MAAM,IAAI;AAAA,IACX,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,MAAM,GAAG;AAAA,IACV,CAAC,MAAM,GAAG;AAAA,EACZ;AAAA,EACA,OAAO;AAAA,IACL,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,KAAK,KAAK;AAAA,IACX,CAAC,KAAK,IAAI;AAAA,IACV,CAAC,MAAM,IAAI;AAAA,IACX,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,MAAM,GAAG;AAAA,IACV,CAAC,KAAK,GAAG;AAAA,IACT,CAAC,KAAK,IAAI;AAAA,EACZ;AAAA,EACA,MAAM;AAAA,IACJ,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,MAAM,IAAI;AAAA,IACX,CAAC,MAAM,KAAK;AAAA,IACZ,CAAC,MAAM,IAAI;AAAA,IACX,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,MAAM,GAAG;AAAA,IACV,CAAC,MAAM,IAAI;AAAA,IACX,CAAC,MAAM,GAAG;AAAA,EACZ;AAAA,EACA,QAAQ;AAAA,IACN,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,KAAK,IAAI;AAAA,IACV,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,KAAK,GAAG;AAAA,EACX;AACF;AAkDO,SAAS,UAAU,CAAC,OAAmB,GAAmB;AAAA,EAC/D,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC;AAAA,EACpC,QAAQ;AAAA,IACN,KAAK;AAAA,MACH,OAAO,MAAM,MAAM;AAAA,IACrB,KAAK;AAAA,MACH,OAAO,MAAM,MAAM,KAAK,IAAI,KAAK,KAAK,CAAC;AAAA,IACzC,KAAK;AAAA,MACH,OAAO,MAAM,MAAM,KAAK,IAAK,KAAK,KAAK,IAAK,CAAC;AAAA,IAC/C,KAAK;AAAA,MACH,OAAO;AAAA,IACT,KAAK;AAAA,MACH,OAAO,MAAM,MAAM;AAAA,IACrB,KAAK;AAAA,MACH,OAAO,KAAK,MAAM,OAAQ,OAAO,IAAK,MAAM,OAAQ,QAAQ,IAAI,KAAM;AAAA;AAAA;;;ACtI5E,IAAM,QAAO,CAAC,MAAkB;AAAA,EAC9B,MAAM,IAAI,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK;AAAA,EAC1C,OAAO,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,CAAC;AAAA;AAW/B,SAAS,UAAU,CAAC,OAAwB,OAA2B;AAAA,EAC5E,IAAI,IAAI;AAAA,EACR,IAAI,KAAK;AAAA,EACT,IAAI,KAAK;AAAA,EACT,MAAM,IAAI,MAAM,IAAI;AAAA,EACpB,MAAM,IAAI,IAAI,EAAE,SAAS,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,EACvC,WAAW,KAAK,OAAO;AAAA,IACrB,IAAI,EAAE,QAAQ;AAAA,MAAO;AAAA,IACrB,WAAW,KAAK,EAAE,KAAK;AAAA,MACrB,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;AAAA,MACpD,KAAK,KAAK,IAAI,IAAI,EAAE,EAAE;AAAA,MACtB,KAAK,KAAK,IAAI,IAAI,EAAE,EAAE;AAAA,IACxB;AAAA,EACF;AAAA,EACA,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,GAAG,EAAE;AAAA;AAGxE,SAAS,IAAI,CACX,MACA,MACA,KACA,MACA,KACA,OACA,KACM;AAAA,EACN,MAAM,UAAU,SAAS,KAAK,UAAU,UAAU,SAAS,KAAK;AAAA,EAChE,MAAM,IAAI,MAAM,KAAK;AAAA,EACrB,MAAM,SAAS,QAAQ,IACrB,EAAE,GAAG,OAAa;AAAA,IAChB,KAAK,KAAK,IAAI,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI;AAAA,IAC3C,KAAK,KAAK,IAAI,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI;AAAA,IAC3C,KAAK,KAAK,IAAI,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI;AAAA,EAC7C,CACF;AAAA,EACA,MAAM,IAAI,QAAO,EAAE,QAAQ,OAAO,KAAK,OAAO,aAAa,KAAK,CAAC;AAAA,EACjE,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,UAAU,KAAK,QAAQ;AAAA,EACrD,MAAM,MAAM,IAAI,MAAM,CAAC,KAAK,UAAU,KAAK,QAAQ,IAAI;AAAA,EACvD,MAAM,SAAS,KAAK,MAAM,KAAK,KAAK,MAAM,OAAO,IAAI,KAAK,KAAK,MAAM,OAAO,EAAE,IAAI,MAAM;AAAA,EACxF,MAAM,MAAM,KAAK,KAAK,MAAM,SAAS,MAAM,OAAO,MAAM;AAAA,EACxD,MAAM,KAAK,MAAM,OAAO,KAAK,IAAI,GAAG,MAAM,KAAK,MAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;AAAA,EACtF,OAAO,GAAG,GAAG,KAAK,KAAK;AAAA,EACvB,SAAS,IAAI,EAAG,IAAI,EAAE,OAAO,SAAS,GAAG,KAAK;AAAA,IAC5C,MAAM,IAAI,QAAQ,IAAI,QAAQ,UAAU,MAAM;AAAA,IAC9C,MAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAAA,IAChC,EAAE,OAAO,IAAI,KAAK,IAAI,KAAK,IAAI;AAAA,IAC/B,EAAE,OAAO,IAAI,IAAI,KAAK,IAAI;AAAA,IAC1B,EAAE,OAAO,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI;AAAA,EACrC;AAAA,EACA,OAAO;AAAA;AAIT,SAAS,GAAG,CAAC,QAAc,OAAa,MAAkB,KAAqC;AAAA,EAC7F,MAAM,OAAO,KAAK,QAAQ;AAAA,EAC1B,MAAM,OAAO,KAAK,QAAQ;AAAA,EAC1B,MAAM,OAAO,IAAI,MAAM,MAAM,GAAG;AAAA,EAChC,MAAM,MAAM,MAAK;AAAA,IACf,OAAO,KAAK,MAAM,MAAM,KAAK;AAAA,IAC7B,OAAO,KAAK,MAAM,MAAM,KAAK;AAAA,IAC7B,OAAO,KAAK,MAAM,MAAM,KAAK,MAAM;AAAA,EACrC,CAAC;AAAA,EACD,MAAM,KAAK,MAAK,CAAC,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM,IAAI,QAAQ,IAAI,CAAC;AAAA,EACtF,MAAM,MAAM,MAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,IAAI,KAAK,CAAC;AAAA,EACnD,MAAM,QAAQ,MAAK,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC;AAAA,EACvC,MAAM,KAAK,MAAK;AAAA,IACd,IAAI,KAAK,OAAO,KAAK,IAAI,KAAK,OAAO;AAAA,IACrC,IAAI,KAAK,OAAO,KAAK,IAAI,KAAK,OAAO;AAAA,IACrC,IAAI,KAAK,OAAO,KAAK,IAAI,KAAK,OAAO;AAAA,EACvC,CAAC;AAAA,EACD,MAAM,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM,QAAQ;AAAA,EAE7C,MAAM,OAAO,MAAK;AAAA,IAChB,GAAG,MAAM,MAAM,KAAK,GAAG,MAAM;AAAA,IAC7B,GAAG,MAAM,MAAM,KAAK,GAAG,MAAM;AAAA,IAC7B,GAAG,MAAM,MAAM,KAAK,GAAG,MAAM;AAAA,EAC/B,CAAC;AAAA,EACD,MAAM,OAAO,IAAI,MAAM,MAAM,GAAG,KAAK,IAAI;AAAA,EACzC,MAAM,IAAU;AAAA,IACd,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK;AAAA,IACjC,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK;AAAA,IACjC,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK;AAAA,EACnC;AAAA,EACA,MAAM,IAAI,KAAK,IAAI,IAAI;AAAA,EACvB,MAAM,IAAI,KAAK,IAAI,IAAI;AAAA,EACvB,OAAO,EAAE,KAAK,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,KAAK,GAAG,KAAK,KAAK,IAAI,EAAE,KAAK,GAAG,KAAK,KAAK,IAAI,EAAE,KAAK,CAAC,EAAE;AAAA;AAIxF,SAAS,SAAS,CACvB,OACA,OACA,cACA,MACA,OACA,KACM;AAAA,EACN,MAAM,MAAc,CAAC;AAAA,EACrB,WAAW,MAAM,OAAO;AAAA,IACtB,IAAI,GAAG,UAAU;AAAA,MAAO;AAAA,IACxB,MAAM,SAAS,iBAAgB,GAAG,GAAG;AAAA,IACrC,MAAM,MAAM,GAAG,IAAI,SAAS;AAAA,IAC5B,SAAS,IAAI,EAAG,IAAI,KAAK,SAAS,KAAK;AAAA,MACrC,MAAM,OAAO,KAAK,QAAQ;AAAA,MAC1B,MAAM,IAAI,QAAS,IAAI,SAAS,IAAI,KAAM,KAAK;AAAA,MAC/C,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,IAAI,GAAG,CAAC,CAAC;AAAA,MACxD,MAAM,IAAI,OAAO;AAAA,MACjB,MAAM,IAAI,GAAG,IAAI;AAAA,MACjB,IAAI,CAAC,KAAK,CAAC;AAAA,QAAG;AAAA,MACd,MAAM,IAAK,IAAI,IAAI,GAAG,eAAe,CAAC,IAAI,eAAgB,KAAK,KAAK;AAAA,MACpE,MAAM,SAAe;AAAA,QACnB,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE;AAAA,QACzC,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE;AAAA,QACzC,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE;AAAA,MAC3C;AAAA,MACA,MAAM,IAAI,GAAG,MAAM,MAAM;AAAA,MACzB,MAAM,OAAa,CAAC,EAAE,KAAK,OAAO,KAAK,GAAG,EAAE,KAAK,OAAO,KAAK,GAAG,EAAE,KAAK,OAAO,KAAK,CAAC;AAAA,MACpF,QAAQ,KAAK,SAAS,IAAI,QAAQ,EAAE,GAAG,MAAM,GAAG;AAAA,MAChD,IAAI,KAAK,KAAK,MAAM,MAAM,KAAK,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,GAAG,GAAG,OAAO,GAAG,CAAC;AAAA,IACnF;AAAA,EACF;AAAA,EACA,OAAO,OAAM,GAAG;AAAA;AAIX,SAAS,YAAY,CAC1B,OACA,OACA,MACA,OACA,KACM;AAAA,EACN,MAAM,MAAc,CAAC;AAAA,EACrB,WAAW,MAAM,OAAO;AAAA,IACtB,IAAI,GAAG,UAAU;AAAA,MAAO;AAAA,IACxB,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,SAAS,MAAM,GAAG;AAAA,IAC5C,MAAM,KAAK,GAAG,IAAI,MAAM,GAAG;AAAA,IAC3B,MAAM,QAAQ,MAAK,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;AAAA,IACnE,MAAM,SAAS,MAAK,CAAC,GAAG,QAAQ,KAAK,GAAG,IAAI,GAAG,QAAQ,KAAK,GAAG,IAAI,GAAG,QAAQ,KAAK,GAAG,EAAE,CAAC;AAAA,IACzF,QAAQ,KAAK,SAAS,IAAI,QAAQ,OAAO,MAAM,GAAG;AAAA,IAClD,MAAM,MAAM,GAAG,SAAS,MAAM,KAAK;AAAA,IACnC,IAAI,KAAK,KAAK,MAAM,GAAG,SAAS,KAAK,MAAM,KAAK,OAAO,GAAG,CAAC;AAAA,EAC7D;AAAA,EACA,OAAO,OAAM,GAAG;AAAA;;;AC5JlB,IAAM,SAAS;AAAA,EACb,CAAC,GAAG,GAAG,CAAC;AAAA,EACR,CAAC,GAAG,GAAG,CAAC;AAAA,EACR,CAAC,GAAG,GAAG,CAAC;AAAA,EACR,CAAC,GAAG,GAAG,CAAC;AACV;AACO,IAAM,iBAAiB,CAAC,OAAe,QAC5C,OAAO,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ;AAGhC,SAAS,OAAO,CAAC,IAAU,MAAgD;AAAA,EAChF,MAAM,MAAc,CAAC;AAAA,EACrB,MAAM,QAAkB,CAAC;AAAA,EACzB,MAAM,OAAO,GAAG,IAAI,SAAS;AAAA,EAC7B,SAAS,IAAI,EAAG,KAAK,MAAM,KAAK,MAAM;AAAA,IACpC,IAAI,KAAK,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,IAC/B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC;AAAA,EAC7B;AAAA,EACA,IAAI,OAAO,SAAS,GAAG;AAAA,IACrB,IAAI,KAAK,GAAG,IAAI,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,IAClC,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC;AAAA,EAChC;AAAA,EACA,OAAO,EAAE,KAAK,MAAM;AAAA;AAIf,SAAS,SAAS,CACvB,OACA,IACA,IACA,KACA,OACM;AAAA,EACN,MAAM,MAAc,CAAC;AAAA,EACrB,WAAW,MAAM,OAAO;AAAA,IACtB,IAAI,GAAG,QAAQ,MAAM,GAAG,QAAQ;AAAA,MAAI;AAAA,IACpC,QAAQ,KAAK,UAAU,QAAQ,IAAI,QAAQ,IAAI,IAAI,CAAC;AAAA,IACpD,IAAI,KACF,OAAM;AAAA,MACJ,SAAS,EAAE,QAAQ,GAAG,UAAU,eAAe,GAAG,OAAO,GAAG,EAAE;AAAA,MAC9D,MAAM;AAAA,MACN,OAAO;AAAA,MACP;AAAA,MACA,OAAO;AAAA,IACT,CAAC,CACH;AAAA,EACF;AAAA,EACA,OAAO,OAAM,GAAG;AAAA;AAGlB,IAAM,MAAM,CAAC,GAAS,GAAS,MAAwC;AAAA,EACrE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;AAAA,EACvB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;AAAA,EACvB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;AACzB;AAGO,SAAS,QAAQ,CAAC,GAAS,GAAe,KAAa,KAAgB;AAAA,EAC5E,MAAM,KAAK,EAAE,WAAW,EAAE;AAAA,EAC1B,SAAS,IAAI,EAAG,IAAI,EAAE,OAAO,SAAS,GAAG,KAAK;AAAA,IAC5C,MAAM,IAAI,EAAE,UAAU,IAAI,IAAI,MAAM;AAAA,IACpC,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,GAAG,IAAI,OAAO,GAAG,CAAC;AAAA,IACvE,IAAI,IAAI,IAAI,EAAE,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE;AAAA,IAC3C,IAAI,EAAE,aAAa,IAAI,KAAK,IAAI,EAAE,UAAU;AAAA,MAAQ,IAAI,IAAI,GAAG,EAAE,UAAU,OAAO,IAAI;AAAA,IACtF,MAAM,IAAI,IAAI,IAAI,MAAM,OAAO,IAAI;AAAA,IACnC,EAAE,OAAO,IAAI,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;AAAA,EACpD;AAAA,EACA,OAAO;AAAA;AAIF,SAAS,SAAS,CACvB,OACA,GACA,KACA,aACA,KACM;AAAA,EACN,QAAQ,KAAK,UAAU,QAAQ,OAAO,QAAQ,IAAI,IAAI,CAAC;AAAA,EACvD,MAAM,IAAI,OAAM;AAAA,IACd,SAAS,EAAE,QAAQ,GAAG,UAAU,eAAe,GAAG,GAAG,EAAE;AAAA,IACvD,MAAM;AAAA,IACN,OAAO,MAAM,IAAI,CAAC,MAAM,IAAI,WAAW;AAAA,IACvC,OAAO,EAAE;AAAA,IACT,OAAO;AAAA,IACP,MAAM,EAAE,aAAa,UAAU,QAAQ;AAAA,EACzC,CAAC;AAAA,EACD,OAAO,SAAS,GAAG,GAAG,IAAI,IAAI,SAAS,KAAK,MAAM,GAAG,GAAG;AAAA;AAI1D,SAAS,MAAM,CAAC,OAAa,GAAiB;AAAA,EAC5C,SAAS,IAAI,EAAG,IAAI,MAAM,IAAI,QAAQ,KAAK;AAAA,IACzC,MAAM,IAAI,MAAM,IAAI,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,IACtC,MAAM,IAAI,MAAM,IAAI,MAAM;AAAA,IAC1B,IAAI,EAAE,MAAM,KAAK,MAAM,MAAM,IAAI,SAAS,GAAG;AAAA,MAC3C,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAAA,MAClE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC;AAAA,IAC/D;AAAA,EACF;AAAA,EACA,OAAO,CAAC,GAAG,GAAG,CAAC;AAAA;AAIV,SAAS,SAAS,CACvB,OACA,GACA,KACA,aACA,KACM;AAAA,EACN,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO;AAAA,EACrC,MAAM,QAAQ,EAAE,SAAS;AAAA,EACzB,MAAM,QAAQ,IAAI,MAAM,GAAG,KAAK,KAAK,CAAC;AAAA,EACtC,MAAM,SAAS;AAAA,IACb,EAAE,GAAG,MAAM,GAAG,KAAK,KAAK,IAAI;AAAA,IAC5B,EAAE,GAAG,MAAM,IAAI,GAAG,KAAK,KAAK,IAAI;AAAA,IAChC,EAAE,GAAG,MAAM,IAAI,GAAG,MAAM,KAAK,KAAK;AAAA,IAClC,EAAE,GAAG,MAAM,IAAI,GAAG,KAAK,KAAK,EAAE;AAAA,EAChC;AAAA,EACA,MAAM,OAAO,QAAQ,IAAI,KAAK;AAAA,EAC9B,MAAM,QAAQ,OAAO,IAAI,GAAG,GAAG,GAAG,UAAU;AAAA,IAC1C,MAAM,IAAI,OAAO,OAAO,CAAC;AAAA,IACzB,MAAM,OAAO,CAAC,MAAsB,IAAI,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,IAAI,MAAM,CAAC,KAAK;AAAA,IAC5F,OAAO,QAAO,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,IAAI;AAAA,GAC5C;AAAA,EACD,MAAM,IAAI,MAAK,EAAE,OAAO,OAAO,EAAE,MAAM,OAAO,OAAO,CAAC;AAAA,EACtD,OAAO,SAAS,GAAG,GAAG,MAAM,IAAI,MAAM,IAAI,SAAS,KAAK,MAAM,GAAG,GAAG;AAAA;AAI/D,SAAS,UAAU,CAAC,QAAyB,QAAoB;AAAA,EACtE,MAAM,KAAK,CAAC,UAAU,UAAU,QAAQ;AAAA,EACxC,MAAM,KAAK,CAAC,WAAW,WAAW,SAAS;AAAA,EAC3C,WAAW,KAAK,QAAQ;AAAA,IACtB,IAAI,EAAE,QAAQ,WAAW;AAAA,MAAG;AAAA,IAC5B,MAAM,IAAI,UAAS,CAAC;AAAA,IACpB,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK;AAAA,MAC1B,GAAG,KAAK,KAAK,IAAI,GAAG,MAAM,GAAG,EAAE,IAAI,MAAM,CAAC;AAAA,MAC1C,GAAG,KAAK,KAAK,IAAI,GAAG,MAAM,GAAG,EAAE,IAAI,MAAM,CAAC;AAAA,IAC5C;AAAA,EACF;AAAA,EACA,MAAM,IAAI,CAAC,MAAyB,OAAO,KAAK,KAAK,IAAI,WAAO,GAAG,MAAM,MAAM,GAAG,MAAM,EAAE;AAAA,EAC1F,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA;AAInB,SAAS,SAAS,CAAC,GAAS,GAAe;AAAA,EAChD,MAAM,YAAY,IAAI,aAAa,EAAE,UAAU,MAAM;AAAA,EACrD,MAAM,UAAU,IAAI,aAAa,EAAE,QAAQ,MAAM;AAAA,EACjD,SAAS,IAAI,EAAG,IAAI,UAAU,QAAQ,KAAK,GAAG;AAAA,IAC5C,UAAU,MAAM,EAAE,UAAU,MAAM,KAAK,EAAE;AAAA,IACzC,UAAU,IAAI,MAAM,EAAE,UAAU,IAAI,MAAM,KAAK,EAAE;AAAA,IACjD,UAAU,IAAI,MAAM,EAAE,UAAU,IAAI,MAAM,KAAK,EAAE;AAAA,IACjD,MAAM,MAAM,EAAE,QAAQ,MAAM,KAAK,EAAE;AAAA,IACnC,MAAM,MAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,EAAE;AAAA,IACvC,MAAM,MAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,EAAE;AAAA,IACvC,MAAM,IAAI,KAAK,MAAM,IAAI,IAAI,EAAE,KAAK;AAAA,IACpC,QAAQ,KAAK,KAAK;AAAA,IAClB,QAAQ,IAAI,KAAK,KAAK;AAAA,IACtB,QAAQ,IAAI,KAAK,KAAK;AAAA,EACxB;AAAA,EACA,OAAO,KAAK,GAAG,WAAW,QAAQ;AAAA;;;ACpK7B,IAAM,OAAkB;AAAA,EAC7B,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,IACN,EAAE,UAAU,GAAG,QAAQ,MAAM,WAAW,GAAG,UAAU,GAAG,UAAU,EAAE;AAAA,IACpE;AAAA,MACE,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,IACA,EAAE,UAAU,GAAG,QAAQ,MAAM,WAAW,IAAI,OAAO,IAAI,UAAU,IAAI,OAAO,KAAK,UAAU,EAAE;AAAA,IAC7F,EAAE,UAAU,GAAG,QAAQ,KAAK,WAAW,IAAI,UAAU,IAAI,OAAO,MAAM,UAAU,EAAE;AAAA,EACpF;AAAA,EACA,MAAM,KAAI,SAAS;AAAA,EACnB,SAAS,KAAI,SAAS;AAAA,EACtB,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO,KAAI,SAAS;AAAA,IACpB,UAAU;AAAA,EACZ;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS,EAAE,QAAQ,IAAI,QAAQ,IAAI,KAAK,IAAI;AAC9C;AAIO,IAAM,QAAmB;AAAA,EAC9B,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,IACN,EAAE,UAAU,GAAG,QAAQ,MAAM,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG;AAAA,IACrE;AAAA,MACE,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,IACA,EAAE,UAAU,GAAG,QAAQ,MAAM,WAAW,IAAI,OAAO,IAAI,UAAU,IAAI,OAAO,KAAK,UAAU,EAAE;AAAA,EAC/F;AAAA,EACA,MAAM,KAAI,SAAS;AAAA,EACnB,SAAS,KAAI,SAAS;AAAA,EACtB,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO,KAAI,SAAS;AAAA,IACpB,UAAU;AAAA,EACZ;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS,EAAE,QAAQ,IAAI,QAAQ,GAAG,KAAK,IAAI;AAC7C;AAGO,IAAM,QAAmB;AAAA,EAC9B,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,EAAE,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,IAAI,UAAU,KAAK,UAAU,GAAG;AAAA,IAC/E;AAAA,MACE,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,MAAM,KAAI,SAAS;AAAA,EACnB,SAAS,KAAI,SAAS;AAAA,EACtB,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO,KAAI,SAAS;AAAA,IACpB,UAAU;AAAA,EACZ;AAAA,EACA,OAAO;AAAA,EACP,OAAO,EAAE,OAAO,GAAG,QAAQ,MAAM,OAAO,KAAI,SAAS,EAAE;AAAA,EACvD,UAAU;AAAA,EACV,SAAS,EAAE,QAAQ,IAAI,QAAQ,GAAG,KAAK,KAAK;AAC9C;AAGO,IAAM,SAAoB;AAAA,EAC/B,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,IACN,EAAE,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG;AAAA,IAClE;AAAA,MACE,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,IACA,EAAE,UAAU,GAAG,QAAQ,MAAM,WAAW,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,UAAU,EAAE;AAAA,EAChG;AAAA,EACA,MAAM,KAAI,SAAS;AAAA,EACnB,WAAW,EAAE,OAAO,KAAI,SAAS,GAAG,QAAQ,KAAK;AAAA,EACjD,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO,KAAI,SAAS;AAAA,IACpB,UAAU;AAAA,EACZ;AAAA,EACA,UAAU;AAAA,EACV,SAAS,EAAE,QAAQ,IAAI,QAAQ,GAAG,KAAK,IAAI;AAC7C;AAGO,IAAM,UAAqB;AAAA,EAChC,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,IACN,EAAE,UAAU,GAAG,QAAQ,MAAM,WAAW,GAAG,UAAU,GAAG,UAAU,EAAE;AAAA,IACpE;AAAA,MACE,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,OAAO;AAAA,MACP,WAAW;AAAA,MACX,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,IACA,EAAE,UAAU,GAAG,QAAQ,MAAM,WAAW,IAAI,OAAO,KAAK,UAAU,GAAG,OAAO,KAAK,UAAU,EAAE;AAAA,EAC/F;AAAA,EACA,MAAM,KAAI,SAAS;AAAA,EACnB,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO,KAAI,SAAS;AAAA,IACpB,UAAU;AAAA,IACV,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS,EAAE,QAAQ,IAAI,QAAQ,IAAI,KAAK,IAAI;AAC9C;AAEO,IAAM,WAAU,EAAE,WAAK,aAAM,aAAM,eAAO,gBAAO;;;AChKxD,IAAM,MAAM,KAAK,KAAK;AACtB,IAAM,QAAO,CAAC,MAAkB;AAAA,EAC9B,MAAM,IAAI,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK;AAAA,EAC1C,OAAO,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,CAAC;AAAA;AAI/B,SAAS,MAAM,CAAC,GAAS,GAAS,GAAiB;AAAA,EACxD,MAAM,IAAI,KAAK,IAAI,CAAC;AAAA,EACpB,MAAM,IAAI,KAAK,IAAI,CAAC;AAAA,EACpB,MAAM,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI;AAAA,EAC3D,OAAO;AAAA,IACL,EAAE,KAAK,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,KAAK;AAAA,IACpD,EAAE,KAAK,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,KAAK;AAAA,IACpD,EAAE,KAAK,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,KAAK;AAAA,EACtD;AAAA;AAIF,SAAS,MAAM,CAAC,KAAiB;AAAA,EAC/B,MAAM,IAAU,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;AAAA,EACnC,OAAO,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,SAAO,CAAC,GAAG,GAAG,CAAC,IAAI,MAAK,CAAC;AAAA;AAI3D,SAAS,IAAI,CAAC,OAAa,MAAY,KAAa,IAAiB,OAAgB,KAAU;AAAA,EAC7F,MAAM,MAAM,KAAK,IAAI,GAAG,GAAG,QAAQ;AAAA,EACnC,MAAM,OAAO,MAAM;AAAA,EACnB,MAAM,MAAc,CAAC,KAAK;AAAA,EAC1B,IAAI,MAAM;AAAA,EACV,IAAI,IAAI;AAAA,EACR,SAAS,IAAI,EAAG,IAAI,KAAK,KAAK;AAAA,IAC5B,MAAM,OAAO,GAAG,cAAc,aAAa,KAAK,MAAM;AAAA,IACtD,MAAM,OAAO,QACR,GAAG,aAAa,KAAK,KAAK,KAAK,MAAM,CAAC,KACtC,GAAG,SAAS,MAAM,GAAG,cAAc,YAAY,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,CAAC,CAAC,IAAI;AAAA,IACvF,MAAM,MAAM,GAAG,YAAY;AAAA,IAG3B,IAAI;AAAA,MAAO,MAAM,OAAO,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,GAAG,KAAK,GAAG;AAAA,IAC5E,KAAK;AAAA,MACH,MAAM,OAAO,KAAK,OAAO,GAAG,IAAI,OAAO,IAAI,MAAM,CAAC,KAAK,GAAG,KAAK,GAAG;AAAA,MAClE,MAAM,OAAO,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,GAAG,IAAI,GAAG;AAAA;AAAA,IAEzD,MAAM,MAAK,GAAG;AAAA,IACd,IAAI,CAAC,EAAE,KAAK,IAAI,KAAK,MAAM,EAAE,KAAK,IAAI,KAAK,MAAM,EAAE,KAAK,IAAI,KAAK,IAAI;AAAA,IACrE,IAAI,KAAK,CAAC;AAAA,EACZ;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,IAAI,CAAC,GAAe,MAAuC,KAAkB;AAAA,EAC3F,MAAM,KAAK,EAAE,OAAO;AAAA,EACpB,IAAI,CAAC;AAAA,IAAI,OAAO,CAAC;AAAA,EACjB,MAAM,KAAK,KAAK,SAAS,GAAG;AAAA,EAC5B,MAAM,KAAK,KAAK,MAAM;AAAA,EACtB,MAAM,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAC7B,MAAM,WAAW,KAAK,CAAC,GAAG,GAAG,KAAK,GAAG,CAAC,KAAK,IAAI,IAAI,GAAG,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,MAAM,GAAG;AAAA,EAC3F,MAAM,OAAO,YAAW,QAAQ;AAAA,EAChC,MAAM,KAAK;AAAA,EACX,MAAM,SAAS,KAAK,IAAI,CAAC,MAAM;AAAA,IAC7B,MAAM,IAAI,KAAK,IAAI,IAAI,IAAI,MAAM,KAAK,IAAI,KAAK,KAAK,EAAE,CAAC;AAAA,IACvD,OAAO,MAAM,KAAK,IAAI,EAAE,SAAS;AAAA,GAClC;AAAA,EACD,MAAM,QAAgB;AAAA,IACpB;AAAA,MACE,OAAO;AAAA,MACP,KAAK;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,SAAS,CAAC,GAAG,GAAG,CAAC;AAAA,MACjB,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,SAAS,KAAK,EAAG,KAAK,MAAM,QAAQ,MAAM;AAAA,IACxC,MAAM,MAAM,MAAM;AAAA,IAClB,MAAM,KAAK,MAAM,EAAE,OAAO,IAAI,QAAQ,KAAK;AAAA,IAC3C,IAAI,CAAC,OAAO,CAAC;AAAA,MAAI;AAAA,IACjB,MAAM,MAAM,YAAW,IAAI,GAAG;AAAA,IAC9B,MAAM,SAAS,iBAAgB,IAAI,GAAG;AAAA,IACtC,MAAM,MAAM,IAAI,UAAU,IAAI,EAAE,WAAY,GAAG,SAAS,OAAQ,IAAI;AAAA,IACpE,MAAM,KAAK,IAAI,SAAS;AAAA,IACxB,MAAM,OAAO,IAAI,UAAU,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,SAAS,IAAI,SAAS;AAAA,IACzE,MAAM,IAAI,IAAI,UAAU,IAAI,GAAG,WAAW,KAAK,MAAM,GAAG,YAAY,OAAO,OAAO,KAAK;AAAA,IACvF,IAAI,MAAM,IAAI,MAAM,GAAG,GAAG;AAAA,IAC1B,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK;AAAA,MAC1B,MAAM,IAAI,MAAO,KAAK,OAAO,IAAI,IAAI,MAAM,MAAM,IAAI,KAAM,KAAK,IAAI,GAAG,CAAC;AAAA,MACxE,IAAI,IAAI;AAAA,MACR,OAAO,IAAI,IAAI,SAAS,MAAM,IAAI,IAAI,MAAM,KAAK;AAAA,QAAG;AAAA,MACpD,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,MAChC,MAAM,IAAI,IAAI,IAAI,IAAI,MAAM;AAAA,MAC5B,MAAM,KAAK,KAAK,IAAI,MAAM,QAAQ,IAAI,IAAI,MAAM,MAAM,IAAI,MAAM,MAAM;AAAA,MACtE,MAAM,IAAU;AAAA,QACd,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;AAAA,QACvB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;AAAA,QACvB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;AAAA,MACzB;AAAA,MACA,MAAM,MAAM,IAAI,MAAM,MAAM,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK;AAAA,MACrE,MAAM,IAAI,MAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;AAAA,MACtD,MAAM,KAAK,OAAO,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE;AAAA,MACrD,QAAQ,GAAG,UAAU,SAAS,IAAI,MAAM,KAAK,EAAE;AAAA,MAC/C,MAAM,KAAK,KAAK,IAAI,MAAM,GAAG;AAAA,MAC7B,MAAM,KAAK,KAAK,IAAI,MAAM,GAAG;AAAA,MAC7B,MAAM,MAAY;AAAA,QAChB,KAAK,GAAG,EAAE,KAAK,KAAK,GAAG,EAAE;AAAA,QACzB,KAAK,GAAG,EAAE,KAAK,KAAK,GAAG,EAAE;AAAA,QACzB,KAAK,GAAG,EAAE,KAAK,KAAK,GAAG,EAAE;AAAA,MAC3B;AAAA,MACA,MAAM,OAAO,IAAI,KAAK,EAAE,KAAK,IAAI,KAAK,EAAE,KAAK,IAAI,KAAK,EAAE;AAAA,MACxD,MAAM,KAAK,MAAK,CAAC,IAAI,KAAK,OAAO,EAAE,IAAI,IAAI,KAAK,OAAO,EAAE,IAAI,IAAI,KAAK,OAAO,EAAE,EAAE,CAAC;AAAA,MAClF,MAAM,QAAQ,IAAI,MAAM,KAAK,IAAI,UAAM,KAAK,EAAE;AAAA,MAC9C,MAAM,QAAQ,GAAG,aAAa,GAAG,cAAc,KAAK,OAAO,IAAI,MAAM,IAAI,CAAC,KAAK;AAAA,MAC/E,MAAM,MAAM,MAAK;AAAA,QACf,EAAE,KAAK,KAAK,IAAI,IAAI,IAAI,GAAG,KAAK,KAAK,IAAI,IAAI;AAAA,QAC7C,EAAE,KAAK,KAAK,IAAI,IAAI,IAAI,GAAG,KAAK,KAAK,IAAI,IAAI;AAAA,QAC7C,EAAE,KAAK,KAAK,IAAI,IAAI,IAAI,GAAG,KAAK,KAAK,IAAI,IAAI;AAAA,MAC/C,CAAC;AAAA,MACD,MAAM,OAAO,IAAI,IAAI,MAAM,EAAE,GAAG,aAAa,OAAO,GAAG,aAAa,IAAI;AAAA,MACxE,MAAM,YAAY,GAAG,SAAS,IAAI;AAAA,MAClC,MAAM,OACJ,IAAI,UAAU,IACV,YAAY,WAAW,EAAE,QAAQ,IAAI,SAAS,KAAK,KAAK,IAAI,UAAM,IAAI,SAAS,EAAE,CAAC,IAClF,GAAG,UAAU,IAAI,SAAS,MAAM;AAAA,MACtC,MAAM,MAAM,KAAK,IAAI,MAAM,OAAO,IAAI;AAAA,MACtC,MAAM,MAAM,IAAI,MAAM,MAAM;AAAA,MAC5B,MAAM,KAAK,KAAK,IAAI,OAAO,KAAK,IAAI,MAAM,IAAI,OAAO,MAAM,IAAI,WAAW,EAAE,UAAU,CAAC;AAAA,MACvF,MAAM,QAAc;AAAA,QAClB,EAAE,KAAK,GAAG,MAAM,KAAK;AAAA,QACrB,EAAE,KAAK,GAAG,MAAM,KAAK;AAAA,QACrB,EAAE,KAAK,GAAG,MAAM,KAAK;AAAA,MACvB;AAAA,MACA,MAAM,MAAM,KAAK,OAAO,KAAK,KAAK,IAAI,OAAO,GAAG;AAAA,MAChD,MAAM,KAAK;AAAA,QACT,OAAO,IAAI,QAAQ;AAAA,QACnB;AAAA,QACA,OAAO,IAAI,IAAI,CAAC,GAAG,MAAM,MAAM,IAAK,OAAO,IAAK,KAAK,IAAI,GAAG,IAAI,SAAS,CAAC,EAAE;AAAA,QAC5E,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,SAAS,CAAC,EAAE,KAAK,GAAG,KAAK,IAAI,EAAE,KAAK,GAAG,KAAK,IAAI,EAAE,KAAK,GAAG,KAAK,EAAE;AAAA,QACjE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA,OAAO;AAAA;;;AC7GF,SAAS,WAAU,CAAC,GAAwD;AAAA,EACjF,MAAM,IAAI,EAAE,WAAW;AAAA,EACvB,MAAM,OAAO,OAAO,MAAM,WAAW,SAAQ,KAA6B;AAAA,EAC1E,IAAI,CAAC,MAAM;AAAA,IACT,MAAM,IAAI,YAAW,sBAAsB;AAAA,MACzC,OAAO,yBAAyB,OAAO,CAAC;AAAA,MACxC,KAAK,cAAc,OAAO,KAAK,QAAO,EAAE,KAAK,IAAI;AAAA,IACnD,CAAC;AAAA,EACH;AAAA,EACA,OAAO,KAAK,SAAS,EAAE,OAAO;AAAA;AAGzB,SAAS,KAAI,CAAC,KAAmB,GAA0B;AAAA,EAChE,MAAM,IAAI,YAAW,CAAC;AAAA,EACtB,IAAI,EAAE,EAAE,SAAS,MAAM,EAAE,OAAO,SAAS,KAAK,EAAE,OAAO,SAAS,GAAG;AAAA,IACjE,MAAM,IAAI,YAAW,sBAAsB;AAAA,MACzC,OAAO,eAAe,EAAE,iBAAiB,EAAE,OAAO;AAAA,MAClD,KAAK;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EACA,MAAM,IAAI,EAAE,SAAS,EAAE,QAAQ;AAAA,EAC/B,MAAM,SAAS,EAAE,UAAU,EAAE,QAAQ,SAAS;AAAA,EAC9C,MAAM,MAAM,EAAE,OAAO,EAAE,QAAQ,MAAM;AAAA,EACrC,MAAM,MAAM,EAAE,SAAS,GAAG,EAAE,YAAY;AAAA,EACxC,MAAM,QAAQ;AAAA,IACZ,OAAO,GAAG;AAAA,IACV,OAAO,GAAG;AAAA,IACV,UAAU,GAAG;AAAA,IACb,QAAQ,GAAG;AAAA,IACX,OAAO,GAAG;AAAA,EACZ;AAAA,EACA,MAAM,MAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,UAAU,MAAM,EAAE,QAAQ,GAAG;AAAA,EAChE,MAAM,QAAQ,KAAK,GAAG,EAAE,QAAQ,EAAE,QAAQ,IAAI,GAAG,IAAI,KAAK,UAAU,CAAC;AAAA,EACrE,MAAM,YAAY,MAAM;AAAA,EACxB,IAAI,CAAC;AAAA,IAAW,OAAO,EAAE,OAAO,QAAQ,EAAE,QAAQ,QAAQ,IAAI;AAAA,EAC9D,MAAM,UAAU,EAAE,OAAO,SAAS;AAAA,EAClC,MAAM,MAAM,IAAI;AAAA,EAChB,MAAM,MAAM,UAAU,IAAI,UAAU,IAAI,SAAS,KAAK,MAAM,EAAE;AAAA,EAC9D,MAAM,QAAQ,WAAW,OAAO,CAAC;AAAA,EACjC,IAAI;AAAA,EACJ,IAAI,QAAsC;AAAA,EAC1C,IAAI,WAAwB;AAAA,EAC5B,IAAI;AAAA,EACJ,IAAI,QAAQ,GAAG;AAAA,IACb,MAAM,MACJ,EAAE,aAAa,UAAU,WAAW,OAAO,GAAG,CAAC,IAAI,KAAK,OAAO,GAAG,IAAI,KAAK,UAAU,CAAC;AAAA,IACxF,QAAQ,MAAM,SAAS,IAAI,OAAO,GAAG,KAAK,IAAI,KAAK,MAAM,CAAC;AAAA,IAC1D,SAAS,IAAI;AAAA,EACf,EAAE,KAAK;AAAA,IACL,MAAM,KAAK,QAAQ,KAAK,UAAU,IAAI,UAAU,UAAU;AAAA,IAC1D,QAAQ,CAAC,MAAM,UAAU,WAAW,GAAG,KAAK,GAAG,IAAI,KAAK,MAAM,CAAC;AAAA,IAC/D,IAAI,EAAE;AAAA,MAAO,QAAQ,CAAC,MAAM,UAAU,WAAW,GAAG,KAAK,GAAG,IAAI,KAAK,OAAO,CAAC;AAAA,IAC7E,MAAM,OAAO;AAAA,MACX,SAAS,UAAU,OAAO,GAAG,IAAI,KAAK,EAAE,IAAI,GAAG,GAAG,KAAK,IAAI,KAAK,eAAe,CAAC;AAAA,IAClF;AAAA,IACA,IAAI,EAAE,SAAS,QAAQ;AAAA,MACrB,KAAK,KAAK,MAAM,WAAW,EAAE,WAAW,MAAM,EAAE,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC;AAAA,IAC3E,WAAW,OAAM,IAAI;AAAA,IACrB,MAAM,KAAK,IAAI,KAAK,QAAQ;AAAA,IAC5B,SACE,EAAE,OAAO,UAAU,UACf,cACE,OACA,SACA,EAAE,QACF,QAAQ,IAAI,EAAE,OAAO,UAAU,KAAK,KAAK,EAAE,OAAO,UAAU,CAAC,GAC7D,OACA,EACF,IACA,OAAO,UACL,UAAU,OAAO,SAAS,eAAe,SAAS,GAAG,GAAG,EAAE,QAAQ,OAAO,EAAE,IAC3E,aAAa,OAAO,SAAS,EAAE,QAAQ,OAAO,EAAE;AAAA;AAAA,EAG1D,MAAM,IAAI,WACR,CAAC,MAAM,CAAC,GAAG,UAAU,QAAQ,QAAQ,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,MAAiB,MAAM,IAAI,GACpF,CAAC,QAAQ,QAAQ,EAAE,MAAM,CAC3B;AAAA,EACA,MAAM,MAAM,CAAC,MAAkB,UAAU,GAAG,CAAC;AAAA,EAC7C,MAAM,OAAO,UAAU,IAAI,KAAK,MAAM,EAAE,YAAY,UAAU,IAAI,SAAS,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,EAC3F,MAAM,QAAc,CAAC,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,EAAE,EAAE;AAAA,EACnE,MAAM,OAAa,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE;AAAA,EACnD,IAAI,KAAK,MAAM,OAAO,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC;AAAA,EAC1C,IAAI;AAAA,IAAO,IAAI,KAAK,MAAM,OAAO,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC;AAAA,EACrD,IAAI,MAAM,MAAM,OAAO;AAAA,IACrB,IAAI;AAAA,IACJ,QAAQ,EAAE,MAAM,QAAQ,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,SAAS,GAAG,IAAI,IAAI;AAAA,IAG7D,SAAS,QAAQ,CAAC,MAAM,OAAO,MAAM,KAAK,IAAI,CAAC,MAAM,KAAK;AAAA,EAC5D,CAAC;AAAA,EACD,IAAI,YAAY,eAAc,QAAQ,IAAI;AAAA,IACxC,IAAI,KAAK,MAAM,UAAU,WAAU,IAAI,QAAQ,GAAG,IAAI,GAAG,EAAE,QAAQ,MAAM,MAAM,CAAC;AAAA,EAClF,IAAI,KAAK,MAAM,QAAQ,WAAU,IAAI,MAAM,GAAG,IAAI,GAAG,EAAE,QAAQ,MAAM,MAAM,CAAC;AAAA,EAC5E,OAAO,EAAE,OAAO,QAAQ,EAAE,QAAQ,QAAQ,IAAI;AAAA;AAIzC,SAAS,SAAQ,CAAC,GAMN;AAAA,EACjB,MAAM,MAAM,EAAE,SAAS,GAAG,EAAE,YAAY;AAAA,EACxC,MAAM,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,IAAI,CAAC;AAAA,EAC/C,OAAO;AAAA,IACL,QAAQ,EAAE;AAAA,IACV,OAAO,EAAE;AAAA,IACT,QAAQ,EAAE;AAAA,IACV,UAAU;AAAA,MACR;AAAA,QACE,OAAO;AAAA,QACP,OAAO,EAAE;AAAA,QACT,MAAM;AAAA,QACN,OAAO,CAAC,GAAG,UAAU;AAAA,WAClB;AAAA,MACL;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO,EAAE;AAAA,QACT,MAAM;AAAA,QACN,OAAO,CAAC,GAAG,YAAY,GAAG,YAAY,GAAG,eAAe,GAAG,aAAa,GAAG,UAAU;AAAA,WAClF;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA;AAMK,IAAM,SAAQ,cAA+B;AAAA,EAClD,MAAM;AAAA,EACN,MAAM,CAAC,cAAc,MAAM;AAAA,EAC3B,QAAQ,SAAQ;AAAA,EAChB,UAAU,EAAE,SAAS,OAAO,QAAQ,GAAG;AAAA,EACvC,OAAO,CAAC,KAAK,MAAM;AAAA,IACjB,MAAK,KAAK,CAAC;AAAA;AAEf,CAAC;;AC/LD,IAAM,OAAO,CAAC,KAAmB,OAAuB,CAAC,IAAI,KAAK,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,QAAQ;AAG1F,SAAS,KAAI,CAClB,KACA,GASM;AAAA,EACN,IAAI,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,QAAQ,EAAE,MAAM,QAAQ,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;AAAA,EACrF,YAAY,GAAG,MAAM;AAAA,IACnB,CAAC,KAAK,EAAE,QAAQ,CAAC;AAAA,IACjB,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;AAAA,EACpB,GAAY;AAAA,IACV,IAAI,KACF,GAAG,EAAE,cAAc,KACnB,UAAS;AAAA,MACP,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE;AAAA,MACV,UAAU,KAAK,KAAK,EAAE;AAAA,MACtB,MAAM;AAAA,MACN,IAAI,CAAC,GAAG,GAAG,CAAC;AAAA,MACZ,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,IACT,CAAC,GACD,EAAE,QAAQ,EAAE,KAAK,CACnB;AAAA,EACF;AAAA;AAIK,SAAS,WAAU,CACxB,aACA,GAC+C;AAAA,EAC/C,MAAM,SAAS,YAAW,WAAW;AAAA,EACrC,MAAM,MAAqD,CAAC;AAAA,EAC5D,IAAI,IAAI;AAAA,EACR,WAAW,KAAK,QAAQ;AAAA,IACtB,MAAM,IAAI,EAAE,SAAS,YAAY,EAAE,UAAU,EAAE,SAAS,YAAY,EAAE,UAAU,EAAE;AAAA,IAClF,SAAS,IAAI,EAAG,IAAI,EAAE,QAAQ,GAAG,KAAK;AAAA,MACpC,IAAI,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,EAAE,CAAC;AAAA,MAC9C,KAAK,IAAI,IAAI,EAAE;AAAA,IACjB;AAAA,EACF;AAAA,EACA,MAAM,MAAM,IAAI;AAAA,EAEhB,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG,GAAG,MAAM,EAAE,EAAE,EAAE;AAAA;AAIzC,SAAS,SAAQ,CACtB,KACA,GAUM;AAAA,EACN,MAAM,QAAQ,EAAE,SAAS,EAAE;AAAA,EAC3B,SAAS,IAAI,EAAG,IAAI,EAAE,QAAQ,KAAK;AAAA,IACjC,MAAM,IAAI,CAAC,EAAE,SAAS,IAAI,SAAS,IAAI;AAAA,IACvC,IAAI,KACF,cAAc,EAAE,QAAQ,KACxB,UAAS;AAAA,MACP,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE,QAAQ;AAAA,MAClB,UAAU,KAAK,KAAK,EAAE;AAAA,MACtB,MAAM;AAAA,MACN,IAAI,CAAC,GAAG,GAAG,CAAC;AAAA,MACZ,OAAO,EAAE;AAAA,MACT,OAAO;AAAA,IACT,CAAC,GACD,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,IAAI,GAAG,QAAQ,EAAE,MAAM,QAAQ,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,KAAK,EAAE,CACxF;AAAA,EACF;AAAA,EACA,MAAM,IAAI;AAAA,EACV,IAAI,KACF,SAAS,EAAE,eACX,KAAI;AAAA,IACF,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC;AAAA,IACtC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC;AAAA,IACd,OAAO,EAAE;AAAA,IACT,OAAO;AAAA,EACT,CAAC,CACH;AAAA,EACA,IAAI,KACF,SAAS,EAAE,YACX,KAAI;AAAA,IACF,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC;AAAA,IAC3B,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,IAAI,IAAI;AAAA,IAChC,OAAO,EAAE;AAAA,IACT,OAAO;AAAA,EACT,CAAC,CACH;AAAA;AAIK,SAAS,UAAS,CACvB,KACA,GACM;AAAA,EACN,IAAI,MAAM,EAAE,MAAM;AAAA,IAChB,IAAI,EAAE;AAAA,OACF,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,IAAI,CAAC;AAAA,IACvC,QAAQ,EAAE,MAAM,QAAQ,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,EAAE;AAAA,EAClD,CAAC;AAAA,EACD,IAAI,KACF,GAAG,EAAE,YACL,UAAS;AAAA,IACP,QAAQ,EAAE,SAAS;AAAA,IACnB,QAAQ,EAAE,SAAS;AAAA,IACnB,UAAU,KAAK,KAAK,EAAE;AAAA,IACtB,MAAM;AAAA,IACN,OAAO,EAAE;AAAA,EACX,CAAC,GACD,EAAE,QAAQ,EAAE,KAAK,CACnB;AAAA,EAEA,MAAM,QAAQ,KAAI,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;AAAA,EAC7E,SAAS,IAAI,EAAG,IAAI,EAAE,QAAQ,KAAK;AAAA,IACjC,IAAI,KAAK,GAAG,EAAE,cAAc,KAAK,OAAM,OAAO,EAAE,MAAO,IAAI,EAAE,SAAU,KAAK,KAAK,EAAE,CAAC,GAAG;AAAA,MACrF,QAAQ,EAAE;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;",
44
+ "debugId": "AF041752F55E532164756E2164756E21",
45
+ "names": []
46
+ }