@adatechnology/game-fluids 0.1.7 → 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.
- package/README.md +39 -5
- package/dist/index.d.ts +349 -3
- package/dist/index.global.js +1036 -10
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +1036 -10
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
package/dist/index.global.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/data/liquids.json","../src/liquids.ts","../src/math.ts","../src/landing.ts","../src/locale.ts","../src/shapes.ts","../src/stains.ts","../src/world.ts","../src/data/item-uses.json","../src/item-use.ts"],"sourcesContent":["export { createFluids } from './world'\nexport { LIQUIDS } from './liquids'\nexport { ITEM_USES, createItemUse } from './item-use'\nexport type { HandTransform } from './item-use'\nexport { describeEvent, locales, resolveStrings } from './locale'\nexport type { FluidLocale, FluidStrings } from './locale'\nexport { ballistic, sampleStream } from './landing'\nexport { SAMPLES as STAIN_SAMPLES, stainDirection } from './stains'\nexport type {\n ContainerSpec,\n ContainerState,\n FluidEvent,\n FluidOptions,\n FluidWorld,\n ItemUseDef,\n ItemUsePlayer,\n LiquidDef,\n LiquidId,\n Quat,\n StainState,\n StreamCause,\n StreamState,\n SurfaceSpec,\n TapSpec,\n TapState,\n Vec3,\n} from './types'\n","[\n {\n \"id\": \"water\",\n \"color\": 11064558,\n \"opacity\": 0.35,\n \"stainColor\": 7309206,\n \"viscosity\": 1,\n \"density\": 1000,\n \"dryTime\": 600,\n \"gloss\": 0.9,\n \"drink\": {\n \"thirst\": 100,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"clear\"\n ]\n },\n {\n \"id\": \"coffee\",\n \"color\": 3875604,\n \"opacity\": 0.95,\n \"stainColor\": 2824202,\n \"viscosity\": 1.5,\n \"density\": 1005,\n \"dryTime\": 900,\n \"gloss\": 0.8,\n \"leavesMark\": true,\n \"steamC\": 60,\n \"drink\": {\n \"thirst\": 80,\n \"effects\": [\n \"caffeine\"\n ]\n },\n \"tags\": [\n \"drink\",\n \"hot\"\n ]\n },\n {\n \"id\": \"tea\",\n \"color\": 9063188,\n \"opacity\": 0.8,\n \"stainColor\": 6961682,\n \"viscosity\": 1.4,\n \"density\": 1005,\n \"dryTime\": 800,\n \"gloss\": 0.8,\n \"leavesMark\": true,\n \"steamC\": 60,\n \"drink\": {\n \"thirst\": 90,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"hot\"\n ]\n },\n {\n \"id\": \"milk\",\n \"color\": 16052712,\n \"opacity\": 0.98,\n \"stainColor\": 14473160,\n \"viscosity\": 2,\n \"density\": 1030,\n \"dryTime\": 900,\n \"gloss\": 0.5,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 70,\n \"effects\": []\n },\n \"tags\": [\n \"drink\"\n ]\n },\n {\n \"id\": \"soda\",\n \"color\": 3808530,\n \"opacity\": 0.85,\n \"stainColor\": 2757901,\n \"viscosity\": 1.3,\n \"density\": 1040,\n \"dryTime\": 1200,\n \"gloss\": 0.85,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 60,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"sticky\"\n ]\n },\n {\n \"id\": \"juice\",\n \"color\": 15239467,\n \"opacity\": 0.9,\n \"stainColor\": 12741916,\n \"viscosity\": 2,\n \"density\": 1045,\n \"dryTime\": 1100,\n \"gloss\": 0.8,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 75,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"sticky\"\n ]\n },\n {\n \"id\": \"beer\",\n \"color\": 14259740,\n \"opacity\": 0.8,\n \"stainColor\": 11039764,\n \"viscosity\": 1.4,\n \"density\": 1010,\n \"dryTime\": 900,\n \"gloss\": 0.8,\n \"drink\": {\n \"thirst\": 50,\n \"effects\": [\n \"alcohol\"\n ]\n },\n \"tags\": [\n \"drink\",\n \"alcohol\"\n ]\n },\n {\n \"id\": \"wine\",\n \"color\": 7016223,\n \"opacity\": 0.9,\n \"stainColor\": 5048854,\n \"viscosity\": 1.6,\n \"density\": 990,\n \"dryTime\": 800,\n \"gloss\": 0.85,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 40,\n \"effects\": [\n \"alcohol\"\n ]\n },\n \"tags\": [\n \"drink\",\n \"alcohol\"\n ]\n },\n {\n \"id\": \"spirits\",\n \"color\": 13214042,\n \"opacity\": 0.6,\n \"stainColor\": 10320959,\n \"viscosity\": 1.8,\n \"density\": 940,\n \"dryTime\": 200,\n \"gloss\": 0.85,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 5,\n \"effects\": [\n \"alcohol\"\n ]\n },\n \"tags\": [\n \"drink\",\n \"alcohol\"\n ]\n },\n {\n \"id\": \"fuel\",\n \"color\": 14926682,\n \"opacity\": 0.6,\n \"stainColor\": 7232298,\n \"viscosity\": 0.6,\n \"density\": 740,\n \"dryTime\": 120,\n \"gloss\": 0.95,\n \"leavesMark\": true,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"fuel\",\n \"gasoline\"\n ]\n },\n {\n \"id\": \"diesel\",\n \"color\": 12098094,\n \"opacity\": 0.8,\n \"stainColor\": 5917208,\n \"viscosity\": 3,\n \"density\": 830,\n \"dryTime\": 3600,\n \"gloss\": 0.95,\n \"leavesMark\": true,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"fuel\"\n ]\n },\n {\n \"id\": \"motor_oil\",\n \"color\": 3877388,\n \"opacity\": 0.95,\n \"stainColor\": 1840134,\n \"viscosity\": 100,\n \"density\": 880,\n \"dryTime\": 0,\n \"gloss\": 1,\n \"leavesMark\": true,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"oil\"\n ]\n },\n {\n \"id\": \"cooking_oil\",\n \"color\": 14267708,\n \"opacity\": 0.85,\n \"stainColor\": 11110698,\n \"viscosity\": 60,\n \"density\": 920,\n \"dryTime\": 0,\n \"gloss\": 1,\n \"leavesMark\": true,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"oil\",\n \"food\"\n ]\n },\n {\n \"id\": \"blood\",\n \"color\": 7997964,\n \"opacity\": 0.92,\n \"stainColor\": 4850950,\n \"viscosity\": 4,\n \"density\": 1060,\n \"dryTime\": 1200,\n \"gloss\": 0.75,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 10,\n \"effects\": [\n \"disgust\"\n ]\n },\n \"tags\": [\n \"organic\"\n ]\n },\n {\n \"id\": \"sap\",\n \"color\": 13146940,\n \"opacity\": 0.8,\n \"stainColor\": 10122282,\n \"viscosity\": 200,\n \"density\": 1100,\n \"dryTime\": 3600,\n \"gloss\": 0.8,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 20,\n \"effects\": []\n },\n \"tags\": [\n \"organic\",\n \"sticky\"\n ]\n },\n {\n \"id\": \"acid\",\n \"color\": 10146378,\n \"opacity\": 0.6,\n \"stainColor\": 7313970,\n \"viscosity\": 1.5,\n \"density\": 1200,\n \"dryTime\": 900,\n \"gloss\": 0.9,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"corrosive\"\n ]\n },\n {\n \"id\": \"paint\",\n \"color\": 11740715,\n \"opacity\": 0.98,\n \"stainColor\": 9050655,\n \"viscosity\": 300,\n \"density\": 1300,\n \"dryTime\": 1800,\n \"gloss\": 0.6,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"paint\"\n ]\n },\n {\n \"id\": \"bleach\",\n \"color\": 15134688,\n \"opacity\": 0.7,\n \"stainColor\": 13621446,\n \"viscosity\": 1.2,\n \"density\": 1100,\n \"dryTime\": 900,\n \"gloss\": 0.85,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"corrosive\"\n ]\n },\n {\n \"id\": \"honey\",\n \"color\": 14193162,\n \"opacity\": 0.9,\n \"stainColor\": 12089350,\n \"viscosity\": 3000,\n \"density\": 1420,\n \"dryTime\": 14400,\n \"gloss\": 0.95,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 10,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"sticky\"\n ]\n }\n]","import liquidsData from './data/liquids.json'\nimport type { LiquidDef } from './types'\n\n/**\n * Built-in liquids (data in `data/liquids.json`; colours are `0xRRGGBB` stored as integers).\n * Viscosity is relative to water, density in kg/m³, `dryTime` in seconds for a thin film at 20 °C (0 = never dries).\n */\nexport const LIQUIDS: LiquidDef[] = liquidsData as unknown as LiquidDef[]\n","import type { Quat, Vec3 } from './types'\n\nexport const GRAVITY = 9.81\nexport const EPS = 1e-7\n\nexport const clamp = (v: number, lo: number, hi: number): number => (v < lo ? lo : v > hi ? hi : v)\nexport const lerp = (a: number, b: number, t: number): number => a + (b - a) * t\n\nexport const add = (a: Vec3, b: Vec3): Vec3 => [a[0] + b[0], a[1] + b[1], a[2] + b[2]]\nexport const sub = (a: Vec3, b: Vec3): Vec3 => [a[0] - b[0], a[1] - b[1], a[2] - b[2]]\nexport const scale = (a: Vec3, s: number): Vec3 => [a[0] * s, a[1] * s, a[2] * s]\nexport const dot = (a: Vec3, b: Vec3): number => a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\nexport const cross = (a: Vec3, b: Vec3): Vec3 => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]\nexport const length = (a: Vec3): number => Math.hypot(a[0], a[1], a[2])\nexport const distance = (a: Vec3, b: Vec3): number => Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2])\nexport const normalize = (a: Vec3, fallback: Vec3 = [0, 1, 0]): Vec3 => {\n const l = length(a)\n return l < 1e-9 ? [fallback[0], fallback[1], fallback[2]] : [a[0] / l, a[1] / l, a[2] / l]\n}\nexport const copy3 = (a: Vec3): Vec3 => [a[0], a[1], a[2]]\nexport const lerp3 = (a: Vec3, b: Vec3, t: number): Vec3 => [lerp(a[0], b[0], t), lerp(a[1], b[1], t), lerp(a[2], b[2], t)]\n\n/** Rotate `v` by the unit quaternion `q` (x, y, z, w). */\nexport const quatRotate = (q: Quat, v: Vec3): Vec3 => {\n const u: Vec3 = [q[0], q[1], q[2]]\n const c1 = cross(u, v)\n const c2 = cross(u, c1)\n return [v[0] + 2 * (q[3] * c1[0] + c2[0]), v[1] + 2 * (q[3] * c1[1] + c2[1]), v[2] + 2 * (q[3] * c1[2] + c2[2])]\n}\nexport const quatConjugate = (q: Quat): Quat => [-q[0], -q[1], -q[2], q[3]]\nexport const quatMultiply = (a: Quat, b: Quat): Quat => [\n a[3] * b[0] + a[0] * b[3] + a[1] * b[2] - a[2] * b[1],\n a[3] * b[1] - a[0] * b[2] + a[1] * b[3] + a[2] * b[0],\n a[3] * b[2] + a[0] * b[1] - a[1] * b[0] + a[2] * b[3],\n a[3] * b[3] - a[0] * b[0] - a[1] * b[1] - a[2] * b[2],\n]\nexport const quatNormalize = (q: Quat): Quat => {\n const l = Math.hypot(q[0], q[1], q[2], q[3])\n return l < 1e-9 ? [0, 0, 0, 1] : [q[0] / l, q[1] / l, q[2] / l, q[3] / l]\n}\n/** Quaternion from Euler angles in XYZ order (the same convention as three.js). */\nexport const quatFromEuler = (x: number, y: number, z: number): Quat => {\n const c1 = Math.cos(x / 2)\n const c2 = Math.cos(y / 2)\n const c3 = Math.cos(z / 2)\n const s1 = Math.sin(x / 2)\n const s2 = Math.sin(y / 2)\n const s3 = Math.sin(z / 2)\n return [s1 * c2 * c3 + c1 * s2 * s3, c1 * s2 * c3 - s1 * c2 * s3, c1 * c2 * s3 + s1 * s2 * c3, c1 * c2 * c3 - s1 * s2 * s3]\n}\n\n/** Small seeded generator (mulberry32). Its whole state is one integer, so it serialises trivially. */\nexport class Rng {\n state: number\n constructor(seed: number) {\n this.state = (Math.imul((seed | 0) ^ 0x9e3779b9, 0x85ebca6b) >>> 0) || 1\n }\n next(): number {\n this.state = (this.state + 0x6d2b79f5) >>> 0\n let t = this.state\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n","import type { StreamState, Vec3 } from './types'\nimport { dot, sub } from './math'\nimport type { Basis } from './stains'\n\nexport const GROUND_ID = 'ground'\n/** Longest flight simulated for a stream before it counts as landing nowhere. */\nexport const MAX_FLIGHT = 3\n\n/** Position of a ballistic jet `t` seconds after leaving its origin. */\nexport const ballistic = (origin: Vec3, velocity: Vec3, gravity: number, t: number): Vec3 => [\n origin[0] + velocity[0] * t,\n origin[1] + velocity[1] * t - 0.5 * gravity * t * t,\n origin[2] + velocity[2] * t,\n]\n\n/** Point of a stream's path `t` seconds after its origin (use with `StreamState.flightTime` and the world's `gravity`). */\nexport const sampleStream = (stream: Pick<StreamState, 'origin' | 'velocity'>, gravity: number, t: number): Vec3 =>\n ballistic(stream.origin, stream.velocity, gravity, t)\n\nexport interface LandingSurface extends Basis {\n id: string\n point: Vec3\n half: [number, number]\n}\n\nexport interface Hit {\n t: number\n point: Vec3\n normal: Vec3\n surface: string\n /** Velocity of the jet at impact. */\n velocity: Vec3\n}\n\nconst velocityAt = (velocity: Vec3, gravity: number, t: number): Vec3 => [velocity[0], velocity[1] - gravity * t, velocity[2]]\n\n/** First thing a jet hits: an authored surface (plane with half extents) or else the ground. */\nexport const trace = (\n surfaces: Iterable<LandingSurface>,\n groundAt: (x: number, z: number) => number,\n origin: Vec3,\n velocity: Vec3,\n gravity: number,\n): Hit | null => {\n let best: Hit | null = null\n for (const s of surfaces) {\n const n = s.normal\n const c = dot(n, sub(origin, s.point))\n if (c < -0.005) continue\n const a = -0.5 * gravity * n[1]\n const b = dot(n, velocity)\n let t = Infinity\n if (Math.abs(a) < 1e-9) {\n if (b < -1e-9) t = -c / b\n } else {\n const disc = b * b - 4 * a * c\n if (disc >= 0) {\n const sq = Math.sqrt(disc)\n for (const root of [(-b - sq) / (2 * a), (-b + sq) / (2 * a)]) {\n if (root >= -1e-6 && b + 2 * a * root < 0 && root < t) t = root\n }\n }\n }\n if (!Number.isFinite(t) || t > MAX_FLIGHT) continue\n t = Math.max(0, t)\n if (best && t >= best.t) continue\n const p = ballistic(origin, velocity, gravity, t)\n const rel = sub(p, s.point)\n if (Math.abs(dot(rel, s.t1)) > s.half[0] || Math.abs(dot(rel, s.t2)) > s.half[1]) continue\n best = { t, point: p, normal: n, surface: s.id, velocity: velocityAt(velocity, gravity, t) }\n }\n\n // Ground: march the path and refine the crossing.\n const step = 0.02\n let prevT = 0\n const startOver = origin[1] - groundAt(origin[0], origin[2])\n const limit = best ? best.t : MAX_FLIGHT\n if (startOver <= 0) {\n return best && best.t <= 0 ? best : { t: 0, point: [origin[0], groundAt(origin[0], origin[2]), origin[2]], normal: [0, 1, 0], surface: GROUND_ID, velocity }\n }\n for (let t = step; t <= limit + step; t += step) {\n const tt = Math.min(t, limit)\n const p = ballistic(origin, velocity, gravity, tt)\n const over = p[1] - groundAt(p[0], p[2])\n if (over <= 0) {\n let lo = prevT\n let hi = tt\n for (let i = 0; i < 18; i++) {\n const mid = (lo + hi) / 2\n const q = ballistic(origin, velocity, gravity, mid)\n if (q[1] - groundAt(q[0], q[2]) > 0) lo = mid\n else hi = mid\n }\n if (best && hi >= best.t - 1e-3) return best\n const q = ballistic(origin, velocity, gravity, hi)\n return { t: hi, point: [q[0], groundAt(q[0], q[2]), q[2]], normal: [0, 1, 0], surface: GROUND_ID, velocity: velocityAt(velocity, gravity, hi) }\n }\n prevT = tt\n if (tt >= limit) break\n }\n return best\n}\n","import type { FluidEvent, LiquidId } from './types'\n\n/** Locales shipped with the package. Unknown locales fall back to `en`. */\nexport type FluidLocale = 'en' | 'pt-BR'\n\nexport interface FluidStrings {\n /** Display name per liquid id (unknown ids fall back to the id itself). */\n liquids: Record<LiquidId, string>\n /** Short label per event type. */\n events: Record<FluidEvent['type'], string>\n on: string\n off: string\n}\n\nexport const locales: Record<FluidLocale, FluidStrings> = {\n en: {\n liquids: {\n water: 'water',\n coffee: 'coffee',\n tea: 'tea',\n milk: 'milk',\n soda: 'soda',\n juice: 'juice',\n beer: 'beer',\n wine: 'wine',\n spirits: 'spirits',\n fuel: 'gasoline',\n diesel: 'diesel',\n motor_oil: 'motor oil',\n cooking_oil: 'cooking oil',\n blood: 'blood',\n sap: 'sap',\n acid: 'acid',\n paint: 'paint',\n bleach: 'bleach',\n honey: 'honey',\n },\n events: {\n fill: 'filled',\n pour: 'poured',\n spill: 'spilled',\n leak: 'leaking',\n drink: 'drank',\n empty: 'emptied',\n stream_end: 'stream ended',\n splash: 'splash',\n stain: 'stain',\n dried: 'dried',\n steam: 'steam',\n mix: 'mixed',\n tap: 'tap',\n },\n on: 'on',\n off: 'off',\n },\n 'pt-BR': {\n liquids: {\n water: 'água',\n coffee: 'café',\n tea: 'chá',\n milk: 'leite',\n soda: 'refrigerante',\n juice: 'suco',\n beer: 'cerveja',\n wine: 'vinho',\n spirits: 'destilado',\n fuel: 'gasolina',\n diesel: 'diesel',\n motor_oil: 'óleo de motor',\n cooking_oil: 'óleo de cozinha',\n blood: 'sangue',\n sap: 'seiva',\n acid: 'ácido',\n paint: 'tinta',\n bleach: 'água sanitária',\n honey: 'mel',\n },\n events: {\n fill: 'encheu',\n pour: 'despejou',\n spill: 'derramou',\n leak: 'vazando',\n drink: 'bebeu',\n empty: 'esvaziou',\n stream_end: 'parou de escorrer',\n splash: 'respingo',\n stain: 'mancha',\n dried: 'secou',\n steam: 'vapor',\n mix: 'misturou',\n tap: 'torneira',\n },\n on: 'ligado',\n off: 'desligado',\n },\n}\n\nexport const resolveStrings = (locale: string | undefined): FluidStrings => locales[(locale as FluidLocale) ?? 'en'] ?? locales.en\n\nconst fmt = (n: number): string => `${(Math.round(n * 1000) / 1000).toString()} l`\nconst pt = (p: [number, number, number]): string => `(${p.map((v) => Math.round(v * 100) / 100).join(', ')})`\n\n/** One-line description of an event for logs and debug panels, e.g. `drank: coffee 0.03 l`. */\nexport const describeEvent = (strings: FluidStrings, event: FluidEvent): string => {\n const label = strings.events[event.type]\n const name = (id: LiquidId) => strings.liquids[id] ?? id\n switch (event.type) {\n case 'fill':\n return `${label}: ${event.container} ${name(event.liquid)} ${fmt(event.liters)}`\n case 'pour':\n case 'spill':\n return `${label}: ${event.container} ${name(event.liquid)} ${fmt(event.rate)}/s`\n case 'leak':\n return `${label}: ${event.container} ${name(event.liquid)} ${fmt(event.rate)}/s ${pt(event.point)}`\n case 'drink':\n return `${label}: ${event.container} ${name(event.liquid)} ${fmt(event.liters)}${event.effects.length ? ` [${event.effects.join(', ')}]` : ''}${event.burn ? ' !' : ''}`\n case 'empty':\n return `${label}: ${event.container}`\n case 'stream_end':\n return `${label}: ${event.stream}`\n case 'splash':\n return `${label}: ${name(event.liquid)} ${pt(event.point)}`\n case 'stain':\n return `${label}: ${event.stain} ${name(event.liquid)} ${event.surface} ${pt(event.point)}`\n case 'dried':\n return `${label}: ${event.stain}${event.mark ? ' (mark)' : ''}`\n case 'steam':\n return `${label}: ${event.container} ${event.on ? strings.on : strings.off}`\n case 'mix':\n return `${label}: ${event.container} ${name(event.from)} -> ${name(event.into)}`\n case 'tap':\n return `${label}: ${event.tap} ${event.on ? strings.on : strings.off}`\n }\n}\n","import type { ContainerSpec, Vec3 } from './types'\nimport { clamp, normalize } from './math'\n\nexport type Shape = ContainerSpec['shape']\n\n/** Sample columns of a container's inner volume: equal-weight (x, z) positions with the full height `h`. */\nexport interface Columns {\n x: Float64Array\n z: Float64Array\n h: number\n /** Radius (cylinder) or half extents (box) used for the extent of a plane. */\n kind: 'cylinder' | 'box'\n r: number\n hx: number\n hz: number\n}\n\nconst RINGS = 8\nconst SEGMENTS = 16\nconst GRID = 12\n\nexport const makeColumns = (shape: Shape): Columns => {\n if (shape.kind === 'cylinder') {\n const x = new Float64Array(RINGS * SEGMENTS)\n const z = new Float64Array(RINGS * SEGMENTS)\n let n = 0\n for (let k = 0; k < RINGS; k++) {\n const rr = shape.radius * Math.sqrt((k + 0.5) / RINGS)\n for (let m = 0; m < SEGMENTS; m++) {\n // Offset every other ring so the samples do not line up radially.\n const a = ((m + (k % 2) * 0.5) / SEGMENTS) * Math.PI * 2\n x[n] = Math.cos(a) * rr\n z[n] = Math.sin(a) * rr\n n++\n }\n }\n return { x, z, h: shape.height, kind: 'cylinder', r: shape.radius, hx: shape.radius, hz: shape.radius }\n }\n const [sx, sy, sz] = shape.size\n const x = new Float64Array(GRID * GRID)\n const z = new Float64Array(GRID * GRID)\n let n = 0\n for (let i = 0; i < GRID; i++) {\n for (let j = 0; j < GRID; j++) {\n x[n] = ((i + 0.5) / GRID - 0.5) * sx\n z[n] = ((j + 0.5) / GRID - 0.5) * sz\n n++\n }\n }\n return { x, z, h: sy, kind: 'box', r: Math.hypot(sx, sz) / 2, hx: sx / 2, hz: sz / 2 }\n}\n\n/** Range of `u · p` over the container: below `lo` it is empty, above `hi` it is full. */\nexport const planeRange = (c: Columns, u: Vec3): [number, number] => {\n const horizontal = c.kind === 'cylinder' ? c.r * Math.hypot(u[0], u[2]) : Math.abs(u[0]) * c.hx + Math.abs(u[2]) * c.hz\n const top = u[1] * c.h\n return [-horizontal + Math.min(0, top), horizontal + Math.max(0, top)]\n}\n\n/** Fraction (0..1) of the inner volume with `u · p <= d` (the liquid for a surface plane with normal `u` at offset `d`). */\nexport const planeFraction = (c: Columns, u: Vec3, d: number): number => {\n const uy = u[1]\n let total = 0\n const n = c.x.length\n for (let i = 0; i < n; i++) {\n const s0 = u[0] * c.x[i] + u[2] * c.z[i]\n let len: number\n if (uy > 1e-6) len = clamp((d - s0) / uy, 0, c.h)\n else if (uy < -1e-6) len = c.h - clamp((d - s0) / uy, 0, c.h)\n else len = s0 <= d ? c.h : 0\n total += len\n }\n return total / (n * c.h)\n}\n\n/** Plane offset `d` along unit normal `u` for which the liquid takes the volume fraction `f`. */\nexport const levelFor = (c: Columns, u: Vec3, f: number): number => {\n const [lo0, hi0] = planeRange(c, u)\n if (f <= 0) return lo0\n if (f >= 1) return hi0\n if (Math.abs(u[0]) + Math.abs(u[2]) < 1e-9) {\n return u[1] > 0 ? f * c.h * u[1] : u[1] * c.h - f * c.h * u[1]\n }\n let lo = lo0\n let hi = hi0\n for (let i = 0; i < 28; i++) {\n const mid = (lo + hi) / 2\n if (planeFraction(c, u, mid) < f) lo = mid\n else hi = mid\n }\n return (lo + hi) / 2\n}\n\n/** Radius of the lip circle (the opening); a closed spec (`opening` 0) uses half the container width once opened. */\nexport const lipRadius = (shape: Shape, opening: number): number => {\n const limit = shape.kind === 'cylinder' ? shape.radius : Math.min(shape.size[0], shape.size[2]) / 2\n return opening > 0 ? Math.min(opening, limit) : limit * 0.5\n}\n\nexport const shapeHeight = (shape: Shape): number => (shape.kind === 'cylinder' ? shape.height : shape.size[1])\n\nexport interface Lip {\n /** Lowest lip point along the surface normal, container space. */\n point: Vec3\n /** Centre of the lip circle, container space. */\n center: Vec3\n /** Outward direction (container space, horizontal in the container frame) the liquid leaves along, or null when upright. */\n outward: Vec3 | null\n /** `u · point`: the surface offset above which the liquid spills. */\n level: number\n}\n\nexport const lipOf = (shape: Shape, opening: number, u: Vec3): Lip => {\n const h = shapeHeight(shape)\n const ro = lipRadius(shape, opening)\n const center: Vec3 = [0, h, 0]\n const uh = Math.hypot(u[0], u[2])\n if (uh < 1e-6) return { point: center, center, outward: null, level: u[1] * h }\n const out: Vec3 = normalize([-u[0], 0, -u[2]])\n const point: Vec3 = [out[0] * ro, h, out[2] * ro]\n return { point, center, outward: out, level: u[0] * point[0] + u[1] * point[1] + u[2] * point[2] }\n}\n","import type { LiquidDef, StainState, Vec3 } from './types'\nimport { Rng, add, clamp, cross, dot, length, normalize, scale, sub } from './math'\n\n/** Number of radial samples of the flow front. */\nexport const SAMPLES = 16\n\nconst COS: number[] = []\nconst SIN: number[] = []\nfor (let i = 0; i < SAMPLES; i++) {\n COS.push(Math.cos((i / SAMPLES) * Math.PI * 2))\n SIN.push(Math.sin((i / SAMPLES) * Math.PI * 2))\n}\n\n/** Orthonormal frame of a surface: `normal`, `t1` (tangent) and `t2 = normal × t1`. */\nexport interface Basis {\n normal: Vec3\n t1: Vec3\n t2: Vec3\n}\n\nexport const makeBasis = (normalIn: Vec3, tangentIn?: Vec3): Basis => {\n const normal = normalize(normalIn)\n const ref: Vec3 = tangentIn && length(tangentIn) > 1e-6 ? tangentIn : Math.abs(normal[1]) > 0.9 ? [1, 0, 0] : [0, 1, 0]\n const t1 = normalize(sub(ref, scale(normal, dot(ref, normal))), [1, 0, 0])\n return { normal, t1, t2: cross(normal, t1) }\n}\n\n/** What a stain needs to know about the surface it lies on. */\nexport interface StainSurface extends Basis {\n point: Vec3\n half: [number, number]\n porosity: number\n}\n\nexport interface StainInt extends StainState {\n normal: Vec3\n tangent: Vec3\n noise: number[]\n /** Seconds since the last inflow. */\n sinceInflow: number\n /** Drying progress 0..1. */\n dry: number\n mark: boolean\n age: number\n}\n\n/** Direction (world space) of radial sample `i` on a surface frame. */\nexport const sampleDir = (b: Basis, i: number): Vec3 => [\n b.t1[0] * COS[i] + b.t2[0] * SIN[i],\n b.t1[1] * COS[i] + b.t2[1] * SIN[i],\n b.t1[2] * COS[i] + b.t2[2] * SIN[i],\n]\n\nexport const stainArea = (front: number[]): number => {\n let a = 0\n for (let i = 0; i < SAMPLES; i++) a += front[i] * front[(i + 1) % SAMPLES]\n return 0.5 * Math.sin((Math.PI * 2) / SAMPLES) * a\n}\n\nexport const meanRadius = (front: number[]): number => front.reduce((s, v) => s + v, 0) / front.length\n\n/** Thickness (m) a puddle of this liquid cannot get thinner than: 1 mm for water, thicker for viscous liquids. */\nexport const minFilm = (def: LiquidDef): number => 0.001 * (1 + 0.8 * Math.log10(Math.max(1, def.viscosity)))\n\n/** Per-direction growth multipliers: low harmonics plus smoothed seeded noise, so the outline is never a disc. */\nexport const makeNoise = (rng: Rng): number[] => {\n const amp = [0.12 + rng.next() * 0.18, 0.08 + rng.next() * 0.14, 0.05 + rng.next() * 0.08]\n const phase = [rng.next() * Math.PI * 2, rng.next() * Math.PI * 2, rng.next() * Math.PI * 2]\n const raw: number[] = []\n for (let i = 0; i < SAMPLES; i++) {\n const a = (i / SAMPLES) * Math.PI * 2\n let v = 1 + (rng.next() - 0.5) * 0.3\n for (let k = 0; k < 3; k++) v += amp[k] * Math.sin((k + 2) * a + phase[k])\n raw.push(v)\n }\n const out = raw.map((v, i) => 0.25 * raw[(i + SAMPLES - 1) % SAMPLES] + 0.5 * v + 0.25 * raw[(i + 1) % SAMPLES])\n return out.map((v) => clamp(v, 0.45, 1.7))\n}\n\n/** Horizontal run direction on a surface (downhill, unit, in the plane) and the slope strength 0..1 (sin of the angle). */\nexport const downhill = (normal: Vec3): { dir: Vec3; slope: number } => {\n const d = add([0, -1, 0], scale(normal, normal[1]))\n const slope = length(d)\n return slope < 1e-6 ? { dir: [0, 0, 0], slope: 0 } : { dir: scale(d, 1 / slope), slope }\n}\n\n/** Creates a stain at `center` (on the surface) with a small starting front. */\nexport const createStain = (\n id: string,\n surfaceId: string,\n def: LiquidDef,\n basis: Basis,\n center: Vec3,\n liters: number,\n rng: Rng,\n): StainInt => {\n const r0 = clamp(Math.sqrt(liters / 1000 / minFilm(def) / Math.PI) * 0.4, 0.012, 0.12)\n return {\n id,\n surface: surfaceId,\n liquid: def.id,\n center: [center[0], center[1], center[2]],\n front: new Array(SAMPLES).fill(r0),\n liters,\n soaked: 0,\n wetness: 1,\n wetRadius: 1,\n normal: basis.normal,\n tangent: basis.t1,\n noise: makeNoise(rng),\n sinceInflow: 0,\n dry: 0,\n mark: false,\n age: 0,\n }\n}\n\n/** Adds liquid to a stain (rewets a dried mark). `velocity` makes the front stretch the way the liquid came in. */\nexport const addInflow = (s: StainInt, liters: number, velocity: Vec3 | null): void => {\n s.liters += liters\n s.sinceInflow = 0\n if (s.dry > 0 || s.mark) {\n s.dry = 0\n s.mark = false\n s.wetness = 1\n s.wetRadius = 1\n }\n if (velocity) {\n const n = s.normal\n const tangential = sub(velocity, scale(n, dot(velocity, n)))\n if (length(tangential) > 0.2) s.flow = normalize(tangential)\n }\n}\n\n/** Moves the centre towards an inflow point without moving the outline. */\nexport const nudgeCenter = (s: StainInt, point: Vec3, weight: number, basis: Basis): void => {\n const delta = scale(sub(point, s.center), weight)\n if (length(delta) < 1e-6) return\n s.center = add(s.center, delta)\n for (let i = 0; i < SAMPLES; i++) s.front[i] = Math.max(0.008, s.front[i] - dot(delta, sampleDir(basis, i)))\n}\n\nexport type StainStatus = 'alive' | 'dried_mark' | 'dried_gone'\n\n/** Largest radius along each sample direction before the centre's surface rectangle ends. */\nconst edgeLimit = (s: StainInt, surface: StainSurface, i: number): number => {\n if (!Number.isFinite(surface.half[0]) && !Number.isFinite(surface.half[1])) return Infinity\n const rel = sub(s.center, surface.point)\n const cx = dot(rel, surface.t1)\n const cy = dot(rel, surface.t2)\n let limit = Infinity\n if (COS[i] > 1e-6) limit = Math.min(limit, (surface.half[0] - cx) / COS[i])\n else if (COS[i] < -1e-6) limit = Math.min(limit, (-surface.half[0] - cx) / COS[i])\n if (SIN[i] > 1e-6) limit = Math.min(limit, (surface.half[1] - cy) / SIN[i])\n else if (SIN[i] < -1e-6) limit = Math.min(limit, (-surface.half[1] - cy) / SIN[i])\n return Math.max(0.01, limit)\n}\n\n/**\n * Advances a stain: the front grows (faster downhill, with seeded noise, tapering as the area approaches what the liquid can cover at its\n * minimum film thickness), porous surfaces soak the pool, and once the inflow stopped the stain dries from the edge in.\n */\nexport const stepStain = (s: StainInt, def: LiquidDef, surface: StainSurface, ambientC: number, dt: number): StainStatus => {\n s.age += dt\n s.sinceInflow += dt\n const basis: Basis = surface\n const { dir: down, slope } = downhill(s.normal)\n\n // Soak into porous surfaces.\n if (s.liters > 0 && surface.porosity > 0) {\n const soak = Math.min(s.liters, surface.porosity * 0.2 * stainArea(s.front) * dt)\n s.liters -= soak\n s.soaked += soak\n }\n\n // Grow the flow front.\n if (s.liters > 1e-7 && s.wetness > 0) {\n const area = stainArea(s.front)\n const cover = s.liters / 1000 / (minFilm(def) * (1 - 0.7 * slope))\n if (area < cover) {\n const taper = clamp(1 - area / cover, 0, 1)\n const v0 = (0.02 + 0.2 * Math.sqrt(s.liters)) / Math.sqrt(Math.max(1, def.viscosity))\n const delta: number[] = []\n for (let i = 0; i < SAMPLES; i++) {\n let m = s.noise[i]\n if (s.flow) m *= 1 + 0.5 * Math.max(0, dot(sampleDir(basis, i), s.flow))\n if (slope > 0.02) {\n const a = dot(sampleDir(basis, i), down)\n m *= a > 0 ? 1 + 14 * slope * a : Math.max(0.1, 1 + 2.5 * slope * a)\n }\n delta.push(Math.max(0, Math.min(s.front[i] + v0 * m * taper * dt, edgeLimit(s, surface, i)) - s.front[i]))\n }\n // Never overshoot the area the liquid can cover: scale the growth (not the outline) down to fit.\n let lambda = 1\n const apply = (k: number) => s.front.map((r, i) => r + delta[i] * k)\n if (stainArea(apply(1)) > cover) {\n let lo = 0\n let hi = 1\n for (let i = 0; i < 14; i++) {\n const mid = (lo + hi) / 2\n if (stainArea(apply(mid)) > cover) hi = mid\n else lo = mid\n }\n lambda = lo\n }\n s.front = apply(lambda)\n }\n }\n\n // Dry from the edge in once the inflow stopped.\n if (s.sinceInflow > 1 && def.dryTime > 0 && s.dry < 1) {\n const warm = Math.pow(2, (ambientC - 20) / 12)\n const ds = (dt * warm * (1 + 0.5 * surface.porosity)) / def.dryTime\n const before = s.dry\n s.dry = Math.min(1, s.dry + ds)\n if (before < 1) s.liters *= 1 - (s.dry - before) / (1 - before)\n s.wetness = 1 - s.dry\n s.wetRadius = Math.sqrt(Math.max(0, 1 - s.dry))\n if (s.dry >= 1) {\n s.liters = 0\n s.wetness = 0\n s.wetRadius = 0\n if (def.leavesMark) {\n s.mark = true\n return 'dried_mark'\n }\n return 'dried_gone'\n }\n }\n return 'alive'\n}\n\n/** Unit direction (world space) of front sample `i` of a stain, from its `normal` and `tangent`. */\nexport const stainDirection = (s: Pick<StainState, 'normal' | 'tangent'>, i: number): Vec3 => sampleDir(makeBasis(s.normal ?? [0, 1, 0], s.tangent), i)\n","import { LIQUIDS } from './liquids'\nimport { GROUND_ID, MAX_FLIGHT, ballistic, trace } from './landing'\nimport type { Hit, LandingSurface } from './landing'\nimport { describeEvent, resolveStrings } from './locale'\nimport { GRAVITY, Rng, add, clamp, copy3, cross, distance, dot, length, normalize, quatConjugate, quatRotate, scale } from './math'\nimport { levelFor, lipOf, lipRadius, makeColumns, planeFraction, planeRange, shapeHeight } from './shapes'\nimport type { Columns } from './shapes'\nimport { addInflow, createStain, makeBasis, meanRadius, nudgeCenter, stepStain } from './stains'\nimport type { Basis, StainInt, StainSurface } from './stains'\nimport type {\n ContainerSpec,\n ContainerState,\n FluidEvent,\n FluidOptions,\n FluidWorld,\n LiquidDef,\n LiquidId,\n Quat,\n StainState,\n StreamCause,\n StreamState,\n SurfaceSpec,\n Vec3,\n} from './types'\n\ninterface Hole {\n point: Vec3\n normal: Vec3\n diameter: number\n}\n\ninterface ContainerInt {\n id: string\n spec: ContainerSpec\n cols: Columns\n liquid: LiquidId | null\n liters: number\n temperature: number\n closed: boolean\n position: Vec3\n rotation: Quat\n velocity: Vec3\n prevVelocity: Vec3\n hasPrev: boolean\n holes: Hole[]\n /** Slosh of the liquid surface: tilt offsets and their rates (x, z, vx, vz). */\n slosh: [number, number, number, number]\n /** Surface normal in world space (up plus slosh) and in container space, and the surface offset along it. */\n normal: Vec3\n u: Vec3\n d: number\n steaming: boolean\n outflow: number\n /** Stream key (`spill`, `pour`, `leak:<n>`) to stream id. */\n streams: Record<string, string>\n pourRate: number\n pourTTL: number\n pourVisual: boolean\n lastMix: number\n}\n\ninterface TapInt {\n id: string\n position: Vec3\n direction: Vec3\n liquid: LiquidId\n rate: number\n temperature: number\n on: boolean\n stream?: string\n}\n\ninterface StreamInt extends StreamState {\n key: string\n lastSplash: number\n visualOnly: boolean\n temperature: number\n}\n\ninterface SurfaceInt extends SurfaceSpec, StainSurface {}\n\ninterface Snapshot {\n version: 1\n time: number\n rng: number\n counters: { container: number; stream: number; stain: number; tap?: number }\n taps?: TapInt[]\n containers: Array<Omit<ContainerInt, 'cols'>>\n surfaces: SurfaceSpec[]\n streams: StreamInt[]\n stains: StainInt[]\n}\n\nconst GROUND_POROSITY = 0.2\nconst MAX_STEP = 0.1\nconst MAX_SUBSTEPS = 50\nconst MAX_HOLES = 32\n\nconst clone = <T>(v: T): T => JSON.parse(JSON.stringify(v)) as T\n\nexport function createFluids(options: FluidOptions = {}): FluidWorld {\n const strings = resolveStrings(options.locale)\n const liquids = new Map<LiquidId, LiquidDef>()\n for (const def of LIQUIDS) liquids.set(def.id, def)\n for (const def of options.liquids ?? []) liquids.set(def.id, def)\n const ambientC = options.ambientC ?? 20\n const gravity = options.gravity ?? GRAVITY\n const groundAt = options.groundAt ?? (() => 0)\n const mergeDistance = options.mergeDistance ?? 0.15\n const maxStains = options.maxStains ?? 64\n\n let rng = new Rng(options.seed ?? 1)\n let time = 0\n const counters = { container: 0, stream: 0, stain: 0, tap: 0 }\n let containers = new Map<string, ContainerInt>()\n let surfaces = new Map<string, SurfaceInt>()\n let streams = new Map<string, StreamInt>()\n let taps = new Map<string, TapInt>()\n let stains = new Map<string, StainInt>()\n const listeners = new Map<string, Set<(e: FluidEvent) => void>>()\n let queue: FluidEvent[] = []\n /** Only events produced by `update` are queued and returned by it; direct calls just notify the listeners. */\n let updating = false\n\n const groundSurface: StainSurface = {\n normal: [0, 1, 0],\n t1: [1, 0, 0],\n t2: [0, 0, -1],\n point: [0, 0, 0],\n half: [Infinity, Infinity],\n porosity: GROUND_POROSITY,\n }\n\n // ---- events ----\n\n const emit = (e: FluidEvent): void => {\n if (updating) queue.push(e)\n options.onEvent?.(e)\n listeners.get(e.type)?.forEach((fn) => fn(e))\n listeners.get('*')?.forEach((fn) => fn(e))\n }\n\n // ---- helpers ----\n\n const toWorld = (c: ContainerInt, p: Vec3): Vec3 => add(c.position, quatRotate(c.rotation, p))\n const defOf = (c: ContainerInt): LiquidDef | null => (c.liquid ? (liquids.get(c.liquid) ?? null) : null)\n const viscScale = (def: LiquidDef): number => 1 / Math.sqrt(Math.max(1, def.viscosity))\n\n const refreshLevel = (c: ContainerInt): void => {\n c.normal = normalize([c.slosh[0], 1, c.slosh[1]])\n c.u = normalize(quatRotate(quatConjugate(c.rotation), c.normal))\n c.d = levelFor(c.cols, c.u, c.spec.capacity > 0 ? c.liters / c.spec.capacity : 0)\n }\n\n const surfaceFor = (id: string): StainSurface => (id === GROUND_ID ? groundSurface : (surfaces.get(id) ?? groundSurface))\n\n const landingSurfaces = (): LandingSurface[] => {\n const list: LandingSurface[] = []\n for (const [id, s] of surfaces) list.push({ id, normal: s.normal, t1: s.t1, t2: s.t2, point: s.point, half: s.half })\n return list\n }\n\n const stopStream = (id: string): void => {\n const s = streams.get(id)\n if (!s) return\n streams.delete(id)\n const c = s.container ? containers.get(s.container) : undefined\n if (c) delete c.streams[s.key]\n const tap = s.tap ? taps.get(s.tap) : undefined\n if (tap && tap.stream === id) tap.stream = undefined\n emit({ type: 'stream_end', stream: id })\n }\n\n const endStreamKey = (c: ContainerInt, key: string): void => {\n const id = c.streams[key]\n if (id) stopStream(id)\n }\n\n /** Create or update the stream under `key` of a container; creating one emits the matching cause event. */\n const syncStream = (\n c: ContainerInt,\n key: string,\n cause: StreamCause,\n rate: number,\n origin: Vec3,\n velocity: Vec3,\n visualOnly = false,\n ): void => {\n if (rate < 1e-5 || !c.liquid) {\n endStreamKey(c, key)\n return\n }\n const existing = c.streams[key] ? streams.get(c.streams[key]) : undefined\n if (existing) {\n existing.rate = rate\n existing.origin = origin\n existing.velocity = velocity\n existing.thin = rate < 0.04\n existing.visualOnly = visualOnly\n existing.temperature = c.temperature\n return\n }\n const id = `stream_${++counters.stream}`\n const stream: StreamInt = {\n id,\n liquid: c.liquid,\n cause,\n container: c.id,\n origin,\n velocity,\n rate,\n landing: null,\n thin: rate < 0.04,\n flightTime: MAX_FLIGHT,\n key,\n lastSplash: -1,\n visualOnly,\n temperature: c.temperature,\n }\n streams.set(id, stream)\n c.streams[key] = id\n if (cause === 'leak') emit({ type: 'leak', container: c.id, liquid: c.liquid, rate, stream: id, point: copy3(origin) })\n else if (cause === 'spill') emit({ type: 'spill', container: c.id, liquid: c.liquid, rate, stream: id })\n else emit({ type: 'pour', container: c.id, liquid: c.liquid, rate, stream: id })\n }\n\n /** Speed (m/s) at which a tap's liquid leaves the nozzle. */\n const TAP_SPEED = 1.2\n\n /** Create or update the `tap` stream of a tap that is on; end it when it is off. */\n const syncTap = (t: TapInt): void => {\n if (!t.on || t.rate < 1e-5 || !liquids.has(t.liquid)) {\n if (t.stream) stopStream(t.stream)\n return\n }\n const velocity: Vec3 = [t.direction[0] * TAP_SPEED, t.direction[1] * TAP_SPEED, t.direction[2] * TAP_SPEED]\n const existing = t.stream ? streams.get(t.stream) : undefined\n if (existing) {\n existing.rate = t.rate\n existing.thin = t.rate < 0.04\n existing.temperature = t.temperature\n existing.velocity = velocity\n return\n }\n const id = `stream_${++counters.stream}`\n streams.set(id, {\n id,\n liquid: t.liquid,\n cause: 'tap',\n tap: t.id,\n origin: copy3(t.position),\n velocity,\n rate: t.rate,\n landing: null,\n thin: t.rate < 0.04,\n flightTime: MAX_FLIGHT,\n key: `tap:${t.id}`,\n lastSplash: -1,\n visualOnly: false,\n temperature: t.temperature,\n })\n t.stream = id\n }\n\n /** Where and how fast the liquid leaves over the lowest lip point. */\n const lipFlow = (c: ContainerInt, head: number): { origin: Vec3; velocity: Vec3 } => {\n const lip = lipOf(c.spec.shape, c.spec.opening, c.u)\n const origin = toWorld(c, lip.point)\n let dir: Vec3 = [1, 0, 0]\n const horizontal = (v: Vec3): Vec3 | null => (Math.hypot(v[0], v[2]) > 1e-3 ? normalize([v[0], 0, v[2]]) : null)\n if (lip.outward) dir = horizontal(quatRotate(c.rotation, lip.outward)) ?? horizontal(quatRotate(c.rotation, [1, 0, 0])) ?? dir\n else dir = horizontal(quatRotate(c.rotation, [1, 0, 0])) ?? dir\n const speed = clamp(0.3 + 0.5 * Math.sqrt(2 * gravity * Math.max(0, head)), 0.2, 2.5)\n return { origin, velocity: [dir[0] * speed, -0.1, dir[2] * speed] }\n }\n\n const removeLiters = (c: ContainerInt, amount: number): void => {\n c.liters = Math.max(0, c.liters - amount)\n }\n\n /** Clear a container that ran out and emit `empty` once. */\n const settle = (c: ContainerInt): void => {\n if (c.liquid && c.liters <= 1e-6) {\n c.liters = 0\n c.liquid = null\n emit({ type: 'empty', container: c.id })\n }\n }\n\n const fillInternal = (c: ContainerInt, liquid: LiquidId, liters: number, temperature: number | undefined, announce: boolean): number => {\n if (!(liters > 0) || !liquids.has(liquid)) return 0\n const room = c.spec.capacity - c.liters\n const accepted = Math.min(liters, Math.max(0, room))\n if (accepted <= 0) return 0\n const t = temperature ?? ambientC\n if (c.liquid && c.liquid !== liquid && c.liters > 1e-6) {\n const incomingWins = accepted > c.liters\n const into = incomingWins ? liquid : c.liquid\n const from = incomingWins ? c.liquid : liquid\n if (announce || time - c.lastMix > 0.5) {\n c.lastMix = time\n emit({ type: 'mix', container: c.id, from, into })\n }\n c.liquid = into\n } else if (!c.liquid || c.liters <= 1e-6) {\n c.liquid = liquid\n }\n c.temperature = c.liters > 1e-6 ? (c.temperature * c.liters + t * accepted) / (c.liters + accepted) : t\n c.liters += accepted\n if (announce) emit({ type: 'fill', container: c.id, liquid, liters: accepted })\n return accepted\n }\n\n // ---- stains ----\n\n const stainAt = (surfaceId: string, liquid: LiquidId, point: Vec3): StainInt | null => {\n let best: StainInt | null = null\n let bestD = Infinity\n for (const s of stains.values()) {\n if (s.surface !== surfaceId || s.liquid !== liquid) continue\n const d = distance(point, s.center)\n if (d < mergeDistance + 0.5 * meanRadius(s.front) && d < bestD) {\n best = s\n bestD = d\n }\n }\n return best\n }\n\n const evictStain = (): void => {\n let victim: StainInt | null = null\n for (const s of stains.values()) {\n const rank = (x: StainInt) => (x.wetness <= 0 ? 0 : 1) * 1e9 - x.age\n if (!victim || rank(s) < rank(victim)) victim = s\n }\n if (victim) stains.delete(victim.id)\n }\n\n const deposit = (liquid: LiquidId, hit: Pick<Hit, 'point' | 'surface' | 'normal'>, liters: number, velocity: Vec3 | null): void => {\n const def = liquids.get(liquid)\n if (!def || liters <= 0) return\n let s = stainAt(hit.surface, liquid, hit.point)\n if (s) {\n const basis: Basis = { normal: s.normal, t1: s.tangent, t2: cross(s.normal, s.tangent) }\n nudgeCenter(s, hit.point, clamp((liters / (s.liters + liters)) * 0.5, 0, 0.5), basis)\n addInflow(s, liters, velocity)\n return\n }\n while (stains.size >= maxStains) evictStain()\n const surface = surfaceFor(hit.surface)\n const basis: Basis = hit.surface === GROUND_ID ? makeBasis(hit.normal) : surface\n s = createStain(`stain_${++counters.stain}`, hit.surface, def, basis, hit.point, liters, rng)\n if (velocity) addInflow(s, 0, velocity)\n s.sinceInflow = 0\n stains.set(s.id, s)\n emit({ type: 'stain', stain: s.id, surface: hit.surface, liquid, point: copy3(hit.point) })\n }\n\n // ---- streams ----\n\n const lipCenterWorld = (c: ContainerInt): Vec3 => toWorld(c, [0, shapeHeight(c.spec.shape), 0])\n\n /** A container whose opening the jet passes through before it lands (pouring into a cup). */\n const catcher = (s: StreamInt, landingT: number): { container: ContainerInt; t: number; point: Vec3 } | null => {\n let best: { container: ContainerInt; t: number; point: Vec3 } | null = null\n for (const oc of containers.values()) {\n if (oc.id === s.container || oc.closed || oc.liters >= oc.spec.capacity) continue\n const lip = lipCenterWorld(oc)\n const disc = s.velocity[1] * s.velocity[1] - 2 * gravity * (lip[1] - s.origin[1])\n if (disc < 0) continue\n const t = (s.velocity[1] + Math.sqrt(disc)) / gravity\n if (t <= 0 || t >= landingT || (best && t >= best.t)) continue\n const p = ballistic(s.origin, s.velocity, gravity, t)\n if (Math.hypot(p[0] - lip[0], p[2] - lip[2]) <= lipRadius(oc.spec.shape, oc.spec.opening) + 0.01) best = { container: oc, t, point: p }\n }\n return best\n }\n\n const stepStream = (s: StreamInt, dt: number): void => {\n const hit = trace(landingSurfaces(), groundAt, s.origin, s.velocity, gravity)\n const caught = catcher(s, hit ? hit.t : MAX_FLIGHT)\n if (caught) {\n s.landing = caught.point\n s.flightTime = caught.t\n if (!s.visualOnly) fillInternal(caught.container, s.liquid, s.rate * dt, s.temperature, false)\n return\n }\n s.landing = hit ? copy3(hit.point) : null\n s.flightTime = hit ? hit.t : MAX_FLIGHT\n if (!hit || s.visualOnly) return\n const speed = length(hit.velocity)\n if (time - s.lastSplash >= 0.12) {\n s.lastSplash = time\n emit({ type: 'splash', liquid: s.liquid, point: copy3(hit.point), intensity: clamp(0.15 + s.rate * 1.2 + speed * 0.05, 0, 1) })\n }\n deposit(s.liquid, hit, s.rate * dt, hit.velocity)\n }\n\n // ---- containers ----\n\n const spillRate = (c: ContainerInt, def: LiquidDef, h: number): number => {\n const ro = lipRadius(c.spec.shape, c.spec.opening)\n const area = 2 * ro * Math.min(h, ro)\n return Math.max(0.6 * area * Math.sqrt(2 * gravity * h) * 1000 * viscScale(def), 0.004)\n }\n\n const steamThreshold = (def: LiquidDef): number => def.steamC ?? (def.drink && def.drink.thirst > 0 ? 60 : Infinity)\n\n const stepContainer = (c: ContainerInt, dt: number): void => {\n // Slosh: the surface tilts towards the horizontal acceleration and settles with a damped spring.\n if (c.hasPrev && dt > 0) {\n const ax = (c.velocity[0] - c.prevVelocity[0]) / dt\n const az = (c.velocity[2] - c.prevVelocity[2]) / dt\n const tx = clamp(ax / gravity, -0.35, 0.35)\n const tz = clamp(az / gravity, -0.35, 0.35)\n const w = 9\n const z = 0.12\n c.slosh[2] += (w * w * (tx - c.slosh[0]) - 2 * z * w * c.slosh[2]) * dt\n c.slosh[3] += (w * w * (tz - c.slosh[1]) - 2 * z * w * c.slosh[3]) * dt\n } else {\n c.slosh[2] *= 0.5\n c.slosh[3] *= 0.5\n }\n c.slosh[0] += c.slosh[2] * dt\n c.slosh[1] += c.slosh[3] * dt\n if (Math.abs(c.slosh[0]) + Math.abs(c.slosh[1]) + Math.abs(c.slosh[2]) + Math.abs(c.slosh[3]) < 1e-5) c.slosh = [0, 0, 0, 0]\n c.prevVelocity = copy3(c.velocity)\n c.hasPrev = true\n\n // Cooling towards ambient (insulated containers 10× slower).\n if (c.temperature !== ambientC) {\n const tau = (600 + 2400 * c.liters) * (c.spec.insulated ? 10 : 1)\n c.temperature = ambientC + (c.temperature - ambientC) * Math.exp(-dt / tau)\n if (Math.abs(c.temperature - ambientC) < 0.01) c.temperature = ambientC\n }\n\n refreshLevel(c)\n const def = defOf(c)\n\n const steaming = !!def && c.liters > 1e-6 && !c.closed && c.temperature > steamThreshold(def)\n if (steaming !== c.steaming) {\n c.steaming = steaming\n emit({ type: 'steam', container: c.id, on: steaming })\n }\n\n c.outflow = 0\n if (!def || c.liters <= 1e-6) {\n for (const key of Object.keys(c.streams)) endStreamKey(c, key)\n c.pourTTL = 0\n settle(c)\n return\n }\n\n // Pour (driven by `pour()`), else spill over the lip when the tilted surface rises above it.\n if (c.pourTTL > 0) {\n c.pourTTL -= dt\n if (c.pourTTL > 0) {\n const flow = lipFlow(c, 0.05)\n syncStream(c, 'pour', 'pour', c.pourRate, flow.origin, flow.velocity, c.pourVisual)\n c.outflow += c.pourRate\n } else endStreamKey(c, 'pour')\n endStreamKey(c, 'spill')\n } else {\n endStreamKey(c, 'pour')\n const lip = lipOf(c.spec.shape, c.spec.opening, c.u)\n const h = c.d - lip.level\n let handled = false\n if (!c.closed && h > 1e-5) {\n const excess = c.liters - c.spec.capacity * planeFraction(c.cols, c.u, lip.level)\n if (excess > 1e-6) {\n const rate = Math.min(spillRate(c, def, h), excess / Math.max(dt, 1e-6))\n removeLiters(c, Math.min(rate * dt, excess, c.liters))\n const flow = lipFlow(c, h)\n syncStream(c, 'spill', 'spill', rate, flow.origin, flow.velocity)\n c.outflow += rate\n handled = true\n }\n }\n if (!handled) endStreamKey(c, 'spill')\n }\n\n // Holes leak by Torricelli with the head above each hole.\n for (let i = 0; i < c.holes.length; i++) {\n const hole = c.holes[i]\n const key = `leak:${i}`\n const hh = dot(c.u, hole.point)\n const head = c.d - hh\n if (c.liters > 1e-6 && head > 1e-4) {\n const area = Math.PI * (hole.diameter / 2) ** 2\n const natural = 0.6 * area * Math.sqrt(2 * gravity * head) * 1000 * viscScale(def)\n const avail = c.liters - c.spec.capacity * planeFraction(c.cols, c.u, hh)\n if (avail > 1e-7) {\n const rate = Math.min(natural, avail / Math.max(dt, 1e-6))\n removeLiters(c, Math.min(rate * dt, avail))\n const nW = normalize(quatRotate(c.rotation, hole.normal))\n const v = Math.min(3, 0.6 * Math.sqrt(2 * gravity * head))\n syncStream(c, key, 'leak', rate, toWorld(c, hole.point), [nW[0] * v, nW[1] * v - 0.05, nW[2] * v])\n c.outflow += rate\n continue\n }\n }\n endStreamKey(c, key)\n }\n if (c.holes.length > 0 || c.outflow > 0) refreshLevel(c)\n settle(c)\n }\n\n const step = (dt: number): void => {\n time += dt\n for (const c of [...containers.values()]) stepContainer(c, dt)\n for (const s of [...streams.values()]) stepStream(s, dt)\n for (const st of [...stains.values()]) {\n const def = liquids.get(st.liquid)\n if (!def) continue\n const status = stepStain(st, def, surfaceFor(st.surface), ambientC, dt)\n if (status === 'dried_mark') emit({ type: 'dried', stain: st.id, mark: true })\n else if (status === 'dried_gone') {\n stains.delete(st.id)\n emit({ type: 'dried', stain: st.id, mark: false })\n }\n }\n }\n\n // ---- public state views ----\n\n const stateOf = (c: ContainerInt): ContainerState => ({\n id: c.id,\n liquid: c.liquid,\n liters: c.liters,\n capacity: c.spec.capacity,\n temperature: c.temperature,\n closed: c.closed,\n surfaceHeight: c.liters > 0 ? c.d : 0,\n surfacePoint: add(c.position, scale(c.normal, c.liters > 0 ? c.d : 0)),\n surfaceNormal: copy3(c.normal),\n holes: c.holes.map((h) => ({ point: copy3(h.point), normal: copy3(h.normal), diameter: h.diameter })),\n outflow: c.outflow,\n steaming: c.steaming,\n shape: c.spec.shape,\n lipRadius: lipRadius(c.spec.shape, c.spec.opening),\n position: copy3(c.position),\n rotation: [...c.rotation] as Quat,\n })\n\n const streamView = (s: StreamInt): StreamState => ({\n id: s.id,\n liquid: s.liquid,\n cause: s.cause,\n container: s.container,\n tap: s.tap,\n origin: copy3(s.origin),\n velocity: copy3(s.velocity),\n rate: s.rate,\n landing: s.landing ? copy3(s.landing) : null,\n thin: s.thin,\n flightTime: s.flightTime,\n })\n\n const stainView = (s: StainInt): StainState => ({\n id: s.id,\n surface: s.surface,\n liquid: s.liquid,\n center: copy3(s.center),\n front: [...s.front],\n liters: s.liters,\n soaked: s.soaked,\n wetness: s.wetness,\n wetRadius: s.wetRadius,\n normal: copy3(s.normal),\n tangent: copy3(s.tangent),\n flow: s.flow ? copy3(s.flow) : undefined,\n mark: s.mark,\n age: s.age,\n })\n\n // ---- world API ----\n\n const world: FluidWorld = {\n liquids,\n gravity,\n describe: (event) => describeEvent(strings, event),\n\n addContainer(spec, opts = {}) {\n const id = opts.id ?? `container_${++counters.container}`\n if (containers.has(id)) world.removeContainer(id)\n const liquid = spec.liquid && liquids.has(spec.liquid) ? spec.liquid : null\n const liters = liquid ? clamp(spec.liters ?? 0, 0, spec.capacity) : 0\n const c: ContainerInt = {\n id,\n spec: clone(spec),\n cols: makeColumns(spec.shape),\n liquid: liters > 0 ? liquid : null,\n liters,\n temperature: spec.temperature ?? ambientC,\n closed: spec.closed ?? spec.opening <= 0,\n position: copy3(opts.position ?? [0, 0, 0]),\n rotation: opts.rotation ? ([...opts.rotation] as Quat) : [0, 0, 0, 1],\n velocity: [0, 0, 0],\n prevVelocity: [0, 0, 0],\n hasPrev: false,\n holes: [],\n slosh: [0, 0, 0, 0],\n normal: [0, 1, 0],\n u: [0, 1, 0],\n d: 0,\n steaming: false,\n outflow: 0,\n streams: {},\n pourRate: 0,\n pourTTL: 0,\n pourVisual: false,\n lastMix: -10,\n }\n containers.set(id, c)\n refreshLevel(c)\n return id\n },\n\n addTap(spec) {\n const id = spec.id ?? `tap_${++counters.tap}`\n if (taps.has(id)) world.removeTap(id)\n const d = spec.direction ?? [0, -1, 0]\n const len = Math.hypot(d[0], d[1], d[2]) || 1\n const t: TapInt = {\n id,\n position: copy3(spec.position),\n direction: [d[0] / len, d[1] / len, d[2] / len],\n liquid: spec.liquid,\n rate: Math.max(0, spec.rate),\n temperature: spec.temperature ?? ambientC,\n on: false,\n }\n taps.set(id, t)\n if (spec.on ?? true) world.setTap(id, true)\n return id\n },\n\n setTap(id, on, rate) {\n const t = taps.get(id)\n if (!t) return\n if (rate !== undefined) t.rate = Math.max(0, rate)\n const changed = t.on !== on\n t.on = on\n syncTap(t)\n if (changed) emit({ type: 'tap', tap: id, on })\n },\n\n removeTap(id) {\n const t = taps.get(id)\n if (!t) return\n t.on = false\n syncTap(t)\n taps.delete(id)\n },\n\n taps: () => [...taps.values()].map((t) => ({ id: t.id, position: copy3(t.position), direction: copy3(t.direction), liquid: t.liquid, rate: t.rate, temperature: t.temperature, on: t.on, stream: t.stream })),\n\n removeContainer(id) {\n const c = containers.get(id)\n if (!c) return\n for (const key of Object.keys(c.streams)) endStreamKey(c, key)\n containers.delete(id)\n },\n\n setTransform(id, position, rotation, velocity) {\n const c = containers.get(id)\n if (!c) return\n c.position = copy3(position)\n c.rotation = [...rotation] as Quat\n if (velocity) c.velocity = copy3(velocity)\n refreshLevel(c)\n },\n\n open(id) {\n const c = containers.get(id)\n if (c) c.closed = false\n },\n\n close(id) {\n const c = containers.get(id)\n if (!c) return\n c.closed = true\n for (const key of ['pour', 'spill']) endStreamKey(c, key)\n c.pourTTL = 0\n },\n\n fill(id, liquid, liters, temperature) {\n const c = containers.get(id)\n if (!c || c.closed) return 0\n const accepted = fillInternal(c, liquid, liters, temperature, true)\n refreshLevel(c)\n return accepted\n },\n\n pour(id, dt, into) {\n const c = containers.get(id)\n const def = c ? defOf(c) : null\n if (!c || !def || c.closed || c.liters <= 1e-6 || !(dt > 0)) return 0\n refreshLevel(c)\n const lip = lipOf(c.spec.shape, c.spec.opening, c.u)\n const depth = Math.max(0, c.d - planeRange(c.cols, c.u)[0])\n const head = Math.max(c.d - lip.level, 0.02 + 0.5 * depth)\n const ro = lipRadius(c.spec.shape, c.spec.opening)\n const natural = 0.6 * Math.PI * ro * ro * Math.sqrt(2 * gravity * head) * 1000\n const rate = Math.min(natural, 0.15 + 12 * ro) * viscScale(def)\n const out = Math.min(rate * dt, c.liters)\n const target = into ? containers.get(into) : undefined\n let delivered = out\n if (target) {\n delivered = fillInternal(target, c.liquid as LiquidId, out, c.temperature, false)\n refreshLevel(target)\n const overflow = out - delivered\n if (overflow > 1e-6) {\n const flow = lipFlow(c, head)\n const hit = trace(landingSurfaces(), groundAt, flow.origin, flow.velocity, gravity)\n if (hit) deposit(c.liquid as LiquidId, hit, overflow, hit.velocity)\n }\n }\n removeLiters(c, out)\n c.pourRate = out / dt\n c.pourTTL = Math.max(0.12, dt * 1.5)\n c.pourVisual = !!target\n const flow = lipFlow(c, head)\n syncStream(c, 'pour', 'pour', c.pourRate, flow.origin, flow.velocity, c.pourVisual)\n refreshLevel(c)\n settle(c)\n return out\n },\n\n drink(id, liters) {\n const c = containers.get(id)\n const def = c ? defOf(c) : null\n if (!c || !def || c.closed || c.liters <= 1e-6 || !(liters > 0)) return null\n const amount = Math.min(liters, c.liters)\n removeLiters(c, amount)\n const event: Extract<FluidEvent, { type: 'drink' }> = {\n type: 'drink',\n container: c.id,\n liquid: def.id,\n liters: amount,\n temperature: c.temperature,\n thirst: (def.drink?.thirst ?? 0) * amount,\n effects: [...(def.drink?.effects ?? [])],\n burn: c.temperature > 65,\n }\n emit(event)\n refreshLevel(c)\n settle(c)\n return event\n },\n\n puncture(id, point, normal, diameter) {\n const c = containers.get(id)\n if (!c || !(diameter > 0) || c.holes.length >= MAX_HOLES) return\n c.holes.push({ point: copy3(point), normal: normalize(normal), diameter })\n },\n\n heat(id, deltaC) {\n const c = containers.get(id)\n if (c) c.temperature = clamp(c.temperature + deltaC, -50, 1000)\n },\n\n addSurface(spec) {\n const basis = makeBasis(spec.normal, spec.tangent)\n surfaces.set(spec.id, {\n ...clone(spec),\n ...basis,\n point: copy3(spec.point),\n half: [spec.halfSize[0], spec.halfSize[1]],\n })\n },\n\n removeSurface(id) {\n surfaces.delete(id)\n for (const s of [...stains.values()]) if (s.surface === id) stains.delete(s.id)\n },\n\n splash(liquid, point, liters, velocity) {\n if (!liquids.has(liquid) || !(liters > 0)) return\n const v: Vec3 = velocity ?? [0, -0.1, 0]\n const origin = add(point, [0, 0.02, 0])\n const hit = trace(landingSurfaces(), groundAt, origin, v, gravity)\n if (!hit) return\n emit({ type: 'splash', liquid, point: copy3(hit.point), intensity: clamp(0.3 + liters * 2, 0, 1) })\n deposit(liquid, hit, liters, length(v) > 0.3 ? hit.velocity : null)\n },\n\n clearStains(point, radius) {\n for (const s of [...stains.values()]) {\n if (distance(point, s.center) <= radius + 0.5 * meanRadius(s.front)) {\n stains.delete(s.id)\n emit({ type: 'dried', stain: s.id, mark: false })\n }\n }\n },\n\n update(dt) {\n if (dt > 0) {\n const n = clamp(Math.ceil(dt / MAX_STEP), 1, MAX_SUBSTEPS)\n updating = true\n try {\n for (let i = 0; i < n; i++) step(dt / n)\n } finally {\n updating = false\n }\n }\n const out = queue\n queue = []\n return out\n },\n\n container: (id) => {\n const c = containers.get(id)\n return c ? stateOf(c) : null\n },\n containers: () => [...containers.values()].map(stateOf),\n streams: () => [...streams.values()].map(streamView),\n stains: () => [...stains.values()].map(stainView),\n\n on(type, fn) {\n let set = listeners.get(type)\n if (!set) listeners.set(type, (set = new Set()))\n set.add(fn)\n return () => {\n set?.delete(fn)\n }\n },\n\n serialize() {\n const snapshot: Snapshot = {\n version: 1,\n time,\n rng: rng.state,\n counters: { ...counters },\n containers: [...containers.values()].map((c) => {\n const { cols: _cols, ...rest } = c\n return clone(rest)\n }),\n surfaces: [...surfaces.values()].map((s) => clone({ id: s.id, point: s.point, normal: s.normal, halfSize: s.half, tangent: s.t1, porosity: s.porosity })),\n streams: [...streams.values()].map((s) => clone(s)),\n taps: [...taps.values()].map((t) => clone(t)),\n stains: [...stains.values()].map((s) => clone(s)),\n }\n return snapshot\n },\n\n load(input) {\n const snap = clone(input) as Snapshot\n if (!snap || snap.version !== 1) throw new Error('game-fluids: unsupported snapshot')\n time = snap.time\n rng = new Rng(0)\n rng.state = snap.rng\n counters.container = snap.counters.container\n counters.stream = snap.counters.stream\n counters.stain = snap.counters.stain\n containers = new Map()\n for (const raw of snap.containers) containers.set(raw.id, { ...raw, cols: makeColumns(raw.spec.shape) })\n surfaces = new Map()\n for (const s of snap.surfaces) world.addSurface(s)\n counters.tap = snap.counters.tap ?? 0\n streams = new Map(snap.streams.map((s) => [s.id, s]))\n taps = new Map((snap.taps ?? []).map((t) => [t.id, t]))\n stains = new Map(snap.stains.map((s) => [s.id, s]))\n queue = []\n },\n }\n\n return world\n}\n","[\n {\n \"id\": \"sip\",\n \"duration\": 1.2,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.35,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.45,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -0.9,\n 0,\n 0\n ],\n \"action\": \"drink\",\n \"rate\": 0.06\n },\n {\n \"t\": 0.95,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -0.9,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 1.2,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"drink\",\n \"duration\": 2.5,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.5,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.8,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -1.22,\n 0,\n 0\n ],\n \"action\": \"drink\",\n \"rate\": 0.1667\n },\n {\n \"t\": 2.0,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -1.22,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 2.5,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"chug\",\n \"duration\": 4,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.5,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.9,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -1.45,\n 0,\n 0\n ],\n \"action\": \"drink\",\n \"rate\": 0.2\n },\n {\n \"t\": 3.4,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -1.45,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 4,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"pour\",\n \"duration\": 3,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.4,\n \"position\": [\n 0.1,\n 0.0,\n -0.35\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.8,\n \"position\": [\n 0.1,\n 0.0,\n -0.35\n ],\n \"rotation\": [\n -1.745,\n 0,\n 0\n ],\n \"action\": \"pour\",\n \"rate\": 1\n },\n {\n \"t\": 2.4,\n \"position\": [\n 0.1,\n 0.0,\n -0.35\n ],\n \"rotation\": [\n -1.745,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 3,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"pour_out\",\n \"duration\": 4,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.5,\n \"position\": [\n 0.1,\n 0.1,\n -0.35\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 1.0,\n \"position\": [\n 0.1,\n 0.1,\n -0.35\n ],\n \"rotation\": [\n -2.2,\n 0,\n 0\n ],\n \"action\": \"pour\",\n \"rate\": 40\n },\n {\n \"t\": 3.2,\n \"position\": [\n 0.1,\n 0.1,\n -0.35\n ],\n \"rotation\": [\n -2.2,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 4,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"open\",\n \"duration\": 1,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.25,\n \"position\": [\n 0.1,\n 0,\n -0.3\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"open\"\n },\n {\n \"t\": 0.7,\n \"position\": [\n 0.1,\n 0,\n -0.3\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 1,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"close\",\n \"duration\": 1,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.25,\n \"position\": [\n 0.1,\n 0,\n -0.3\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"close\"\n },\n {\n \"t\": 0.7,\n \"position\": [\n 0.1,\n 0,\n -0.3\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 1,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n }\n]","import itemUsesData from './data/item-uses.json'\nimport { lerp3, quatFromEuler, quatMultiply, quatRotate, add } from './math'\nimport type { FluidEvent, FluidWorld, ItemUseDef, ItemUsePlayer, Quat, Vec3 } from './types'\n\n/** Built-in scripted uses of a held item (data in `data/item-uses.json`): `sip`, `drink`, `chug`, `pour`, `pour_out`, `open`, `close`. */\nexport const ITEM_USES: ItemUseDef[] = itemUsesData as unknown as ItemUseDef[]\n\n/** World transform of the hand (or any holder) the item pose is relative to. */\nexport type HandTransform = () => { position: Vec3; rotation: Quat }\n\nconst DEFAULT_DRINK_RATE = 0.1\n\n/**\n * Plays an item use on a container: interpolates the keys, applies `drink` (rate × dt litres) and `pour` (`world.pour`, `rate` multiplies the\n * time) while the current key has that action, and fires `open` / `close` once when their key is reached. When `getHandTransform` is given, the\n * container's world transform follows hand ∘ pose every update; otherwise the host animates the viewmodel from `pose()`.\n */\nexport function createItemUse(world: FluidWorld, containerId: string, def: ItemUseDef, getHandTransform?: HandTransform): ItemUsePlayer {\n const keys = [...def.keys].sort((a, b) => a.t - b.t)\n let time = 0\n let done = keys.length === 0 || def.duration <= 0\n let checked = false\n let lastPos: Vec3 | null = null\n const fired = new Set<number>()\n\n const pose = (): { position: Vec3; rotation: Vec3 } => {\n if (keys.length === 0) return { position: [0, 0, 0], rotation: [0, 0, 0] }\n if (time <= keys[0].t) return { position: [...keys[0].position], rotation: [...keys[0].rotation] }\n for (let i = 0; i < keys.length - 1; i++) {\n const a = keys[i]\n const b = keys[i + 1]\n if (time <= b.t) {\n const k = b.t > a.t ? (time - a.t) / (b.t - a.t) : 1\n return { position: lerp3(a.position, b.position, k), rotation: lerp3(a.rotation, b.rotation, k) }\n }\n }\n const last = keys[keys.length - 1]\n return { position: [...last.position], rotation: [...last.rotation] }\n }\n\n const follow = (dt: number): void => {\n if (!getHandTransform) return\n const hand = getHandTransform()\n const p = pose()\n const position = add(hand.position, quatRotate(hand.rotation, p.position))\n const rotation = quatMultiply(hand.rotation, quatFromEuler(p.rotation[0], p.rotation[1], p.rotation[2]))\n const velocity: Vec3 | undefined =\n lastPos && dt > 0 ? [(position[0] - lastPos[0]) / dt, (position[1] - lastPos[1]) / dt, (position[2] - lastPos[2]) / dt] : undefined\n lastPos = position\n world.setTransform(containerId, position, rotation, velocity)\n }\n\n const player: ItemUsePlayer = {\n def,\n get time() {\n return time\n },\n get done() {\n return done\n },\n pose,\n update(dt) {\n if (done) return []\n const events: FluidEvent[] = []\n const off = world.on('*', (e) => events.push(e))\n try {\n if (!checked) {\n checked = true\n const state = world.container(containerId)\n if (!state || (def.liquids && def.liquids.length > 0 && (!state.liquid || !def.liquids.includes(state.liquid)))) {\n done = true\n return events\n }\n }\n const start = time\n const end = Math.min(def.duration, time + Math.max(0, dt))\n for (let i = 0; i < keys.length && !done; i++) {\n const key = keys[i]\n const spanStart = key.t\n const spanEnd = i + 1 < keys.length ? keys[i + 1].t : def.duration\n if ((key.action === 'open' || key.action === 'close') && !fired.has(i) && end >= spanStart) {\n fired.add(i)\n if (key.action === 'open') world.open(containerId)\n else world.close(containerId)\n }\n const overlap = Math.min(end, spanEnd) - Math.max(start, spanStart)\n if (overlap <= 0) continue\n if (key.action === 'drink') {\n const ev = world.drink(containerId, (key.rate ?? DEFAULT_DRINK_RATE) * overlap)\n const left = world.container(containerId)\n if (!ev || !left || left.liters <= 1e-6) {\n time = def.duration\n done = true\n }\n } else if (key.action === 'pour') {\n world.pour(containerId, overlap * (key.rate ?? 1))\n }\n }\n if (!done) {\n time = end\n done = time >= def.duration\n }\n follow(dt)\n } finally {\n off()\n }\n return events\n },\n cancel() {\n done = true\n },\n }\n return player\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA,IACE;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,MACX,YAAc;AAAA,MACd,WAAa;AAAA,MACb,SAAW;AAAA,MACX,SAAW;AAAA,MACX,OAAS;AAAA,MACT,OAAS;AAAA,QACP,QAAU;AAAA,QACV,SAAW,CAAC;AAAA,MACd;AAAA,MACA,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,MACX,YAAc;AAAA,MACd,WAAa;AAAA,MACb,SAAW;AAAA,MACX,SAAW;AAAA,MACX,OAAS;AAAA,MACT,YAAc;AAAA,MACd,QAAU;AAAA,MACV,OAAS;AAAA,QACP,QAAU;AAAA,QACV,SAAW;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,MACX,YAAc;AAAA,MACd,WAAa;AAAA,MACb,SAAW;AAAA,MACX,SAAW;AAAA,MACX,OAAS;AAAA,MACT,YAAc;AAAA,MACd,QAAU;AAAA,MACV,OAAS;AAAA,QACP,QAAU;AAAA,QACV,SAAW,CAAC;AAAA,MACd;AAAA,MACA,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,MACX,YAAc;AAAA,MACd,WAAa;AAAA,MACb,SAAW;AAAA,MACX,SAAW;AAAA,MACX,OAAS;AAAA,MACT,YAAc;AAAA,MACd,OAAS;AAAA,QACP,QAAU;AAAA,QACV,SAAW,CAAC;AAAA,MACd;AAAA,MACA,MAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,MACX,YAAc;AAAA,MACd,WAAa;AAAA,MACb,SAAW;AAAA,MACX,SAAW;AAAA,MACX,OAAS;AAAA,MACT,YAAc;AAAA,MACd,OAAS;AAAA,QACP,QAAU;AAAA,QACV,SAAW,CAAC;AAAA,MACd;AAAA,MACA,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,MACX,YAAc;AAAA,MACd,WAAa;AAAA,MACb,SAAW;AAAA,MACX,SAAW;AAAA,MACX,OAAS;AAAA,MACT,YAAc;AAAA,MACd,OAAS;AAAA,QACP,QAAU;AAAA,QACV,SAAW,CAAC;AAAA,MACd;AAAA,MACA,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,MACX,YAAc;AAAA,MACd,WAAa;AAAA,MACb,SAAW;AAAA,MACX,SAAW;AAAA,MACX,OAAS;AAAA,MACT,OAAS;AAAA,QACP,QAAU;AAAA,QACV,SAAW;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,MACX,YAAc;AAAA,MACd,WAAa;AAAA,MACb,SAAW;AAAA,MACX,SAAW;AAAA,MACX,OAAS;AAAA,MACT,YAAc;AAAA,MACd,OAAS;AAAA,QACP,QAAU;AAAA,QACV,SAAW;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,MACX,YAAc;AAAA,MACd,WAAa;AAAA,MACb,SAAW;AAAA,MACX,SAAW;AAAA,MACX,OAAS;AAAA,MACT,WAAa;AAAA,MACb,OAAS;AAAA,QACP,QAAU;AAAA,QACV,SAAW;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,MACX,YAAc;AAAA,MACd,WAAa;AAAA,MACb,SAAW;AAAA,MACX,SAAW;AAAA,MACX,OAAS;AAAA,MACT,YAAc;AAAA,MACd,WAAa;AAAA,MACb,OAAS;AAAA,QACP,QAAU;AAAA,QACV,SAAW;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,MACX,YAAc;AAAA,MACd,WAAa;AAAA,MACb,SAAW;AAAA,MACX,SAAW;AAAA,MACX,OAAS;AAAA,MACT,YAAc;AAAA,MACd,WAAa;AAAA,MACb,OAAS;AAAA,QACP,QAAU;AAAA,QACV,SAAW;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,MACX,YAAc;AAAA,MACd,WAAa;AAAA,MACb,SAAW;AAAA,MACX,SAAW;AAAA,MACX,OAAS;AAAA,MACT,YAAc;AAAA,MACd,WAAa;AAAA,MACb,OAAS;AAAA,QACP,QAAU;AAAA,QACV,SAAW;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,MACX,YAAc;AAAA,MACd,WAAa;AAAA,MACb,SAAW;AAAA,MACX,SAAW;AAAA,MACX,OAAS;AAAA,MACT,YAAc;AAAA,MACd,WAAa;AAAA,MACb,OAAS;AAAA,QACP,QAAU;AAAA,QACV,SAAW;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,MACX,YAAc;AAAA,MACd,WAAa;AAAA,MACb,SAAW;AAAA,MACX,SAAW;AAAA,MACX,OAAS;AAAA,MACT,YAAc;AAAA,MACd,OAAS;AAAA,QACP,QAAU;AAAA,QACV,SAAW;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,MACX,YAAc;AAAA,MACd,WAAa;AAAA,MACb,SAAW;AAAA,MACX,SAAW;AAAA,MACX,OAAS;AAAA,MACT,YAAc;AAAA,MACd,OAAS;AAAA,QACP,QAAU;AAAA,QACV,SAAW,CAAC;AAAA,MACd;AAAA,MACA,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,MACX,YAAc;AAAA,MACd,WAAa;AAAA,MACb,SAAW;AAAA,MACX,SAAW;AAAA,MACX,OAAS;AAAA,MACT,YAAc;AAAA,MACd,OAAS;AAAA,QACP,QAAU;AAAA,QACV,SAAW;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,MACX,YAAc;AAAA,MACd,WAAa;AAAA,MACb,SAAW;AAAA,MACX,SAAW;AAAA,MACX,OAAS;AAAA,MACT,YAAc;AAAA,MACd,OAAS;AAAA,QACP,QAAU;AAAA,QACV,SAAW;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,MACX,YAAc;AAAA,MACd,WAAa;AAAA,MACb,SAAW;AAAA,MACX,SAAW;AAAA,MACX,OAAS;AAAA,MACT,YAAc;AAAA,MACd,OAAS;AAAA,QACP,QAAU;AAAA,QACV,SAAW;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,MACX,YAAc;AAAA,MACd,WAAa;AAAA,MACb,SAAW;AAAA,MACX,SAAW;AAAA,MACX,OAAS;AAAA,MACT,YAAc;AAAA,MACd,OAAS;AAAA,QACP,QAAU;AAAA,QACV,SAAW,CAAC;AAAA,MACd;AAAA,MACA,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;;;ACxXO,MAAM,UAAuB;;;ACL7B,MAAM,UAAU;AAGhB,MAAM,QAAQ,CAAC,GAAW,IAAY,OAAwB,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK;AAC1F,MAAM,OAAO,CAAC,GAAW,GAAW,MAAsB,KAAK,IAAI,KAAK;AAExE,MAAM,MAAM,CAAC,GAAS,MAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9E,MAAM,MAAM,CAAC,GAAS,MAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9E,MAAM,QAAQ,CAAC,GAAS,MAAoB,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;AACzE,MAAM,MAAM,CAAC,GAAS,MAAoB,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAChF,MAAM,QAAQ,CAAC,GAAS,MAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1H,MAAM,SAAS,CAAC,MAAoB,KAAK,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC/D,MAAM,WAAW,CAAC,GAAS,MAAoB,KAAK,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAC/F,MAAM,YAAY,CAAC,GAAS,WAAiB,CAAC,GAAG,GAAG,CAAC,MAAY;AACtE,UAAM,IAAI,OAAO,CAAC;AAClB,WAAO,IAAI,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;AAAA,EAC3F;AACO,MAAM,QAAQ,CAAC,MAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAClD,MAAM,QAAQ,CAAC,GAAS,GAAS,MAAoB,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;AAGnH,MAAM,aAAa,CAAC,GAAS,MAAkB;AACpD,UAAM,IAAU,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACjC,UAAM,KAAK,MAAM,GAAG,CAAC;AACrB,UAAM,KAAK,MAAM,GAAG,EAAE;AACtB,WAAO,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE;AAAA,EACjH;AACO,MAAM,gBAAgB,CAAC,MAAkB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACnE,MAAM,eAAe,CAAC,GAAS,MAAkB;AAAA,IACtD,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAAA,IACpD,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAAA,IACpD,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAAA,IACpD,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAAA,EACtD;AAMO,MAAM,gBAAgB,CAAC,GAAW,GAAW,MAAoB;AACtE,UAAM,KAAK,KAAK,IAAI,IAAI,CAAC;AACzB,UAAM,KAAK,KAAK,IAAI,IAAI,CAAC;AACzB,UAAM,KAAK,KAAK,IAAI,IAAI,CAAC;AACzB,UAAM,KAAK,KAAK,IAAI,IAAI,CAAC;AACzB,UAAM,KAAK,KAAK,IAAI,IAAI,CAAC;AACzB,UAAM,KAAK,KAAK,IAAI,IAAI,CAAC;AACzB,WAAO,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAAA,EAC5H;AAGO,MAAM,MAAN,MAAU;AAAA,IAEf,YAAY,MAAc;AAD1B;AAEE,WAAK,QAAS,KAAK,MAAM,OAAO,KAAK,YAAY,UAAU,MAAM,KAAM;AAAA,IACzE;AAAA,IACA,OAAe;AACb,WAAK,QAAS,KAAK,QAAQ,eAAgB;AAC3C,UAAI,IAAI,KAAK;AACb,UAAI,KAAK,KAAK,IAAK,MAAM,IAAK,IAAI,CAAC;AACnC,WAAK,IAAI,KAAK,KAAK,IAAK,MAAM,GAAI,IAAI,EAAE;AACxC,eAAS,IAAK,MAAM,QAAS,KAAK;AAAA,IACpC;AAAA,EACF;;;AC5DO,MAAM,YAAY;AAElB,MAAM,aAAa;AAGnB,MAAM,YAAY,CAAC,QAAc,UAAgB,SAAiB,MAAoB;AAAA,IAC3F,OAAO,CAAC,IAAI,SAAS,CAAC,IAAI;AAAA,IAC1B,OAAO,CAAC,IAAI,SAAS,CAAC,IAAI,IAAI,MAAM,UAAU,IAAI;AAAA,IAClD,OAAO,CAAC,IAAI,SAAS,CAAC,IAAI;AAAA,EAC5B;AAGO,MAAM,eAAe,CAAC,QAAkD,SAAiB,MAC9F,UAAU,OAAO,QAAQ,OAAO,UAAU,SAAS,CAAC;AAiBtD,MAAM,aAAa,CAAC,UAAgB,SAAiB,MAAoB,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,IAAI,UAAU,GAAG,SAAS,CAAC,CAAC;AAGtH,MAAM,QAAQ,CACnB,UACA,UACA,QACA,UACA,YACe;AACf,QAAI,OAAmB;AACvB,eAAW,KAAK,UAAU;AACxB,YAAM,IAAI,EAAE;AACZ,YAAM,IAAI,IAAI,GAAG,IAAI,QAAQ,EAAE,KAAK,CAAC;AACrC,UAAI,IAAI,MAAQ;AAChB,YAAM,IAAI,OAAO,UAAU,EAAE,CAAC;AAC9B,YAAM,IAAI,IAAI,GAAG,QAAQ;AACzB,UAAI,IAAI;AACR,UAAI,KAAK,IAAI,CAAC,IAAI,MAAM;AACtB,YAAI,IAAI,MAAO,KAAI,CAAC,IAAI;AAAA,MAC1B,OAAO;AACL,cAAM,OAAO,IAAI,IAAI,IAAI,IAAI;AAC7B,YAAI,QAAQ,GAAG;AACb,gBAAM,KAAK,KAAK,KAAK,IAAI;AACzB,qBAAW,QAAQ,EAAE,CAAC,IAAI,OAAO,IAAI,KAAK,CAAC,IAAI,OAAO,IAAI,EAAE,GAAG;AAC7D,gBAAI,QAAQ,SAAS,IAAI,IAAI,IAAI,OAAO,KAAK,OAAO,EAAG,KAAI;AAAA,UAC7D;AAAA,QACF;AAAA,MACF;AACA,UAAI,CAAC,OAAO,SAAS,CAAC,KAAK,IAAI,WAAY;AAC3C,UAAI,KAAK,IAAI,GAAG,CAAC;AACjB,UAAI,QAAQ,KAAK,KAAK,EAAG;AACzB,YAAM,IAAI,UAAU,QAAQ,UAAU,SAAS,CAAC;AAChD,YAAM,MAAM,IAAI,GAAG,EAAE,KAAK;AAC1B,UAAI,KAAK,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAG;AAClF,aAAO,EAAE,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,EAAE,IAAI,UAAU,WAAW,UAAU,SAAS,CAAC,EAAE;AAAA,IAC7F;AAGA,UAAM,OAAO;AACb,QAAI,QAAQ;AACZ,UAAM,YAAY,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AAC3D,UAAM,QAAQ,OAAO,KAAK,IAAI;AAC9B,QAAI,aAAa,GAAG;AAClB,aAAO,QAAQ,KAAK,KAAK,IAAI,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,GAAG,SAAS,WAAW,SAAS;AAAA,IAC7J;AACA,aAAS,IAAI,MAAM,KAAK,QAAQ,MAAM,KAAK,MAAM;AAC/C,YAAM,KAAK,KAAK,IAAI,GAAG,KAAK;AAC5B,YAAM,IAAI,UAAU,QAAQ,UAAU,SAAS,EAAE;AACjD,YAAM,OAAO,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACvC,UAAI,QAAQ,GAAG;AACb,YAAI,KAAK;AACT,YAAI,KAAK;AACT,iBAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,gBAAM,OAAO,KAAK,MAAM;AACxB,gBAAMA,KAAI,UAAU,QAAQ,UAAU,SAAS,GAAG;AAClD,cAAIA,GAAE,CAAC,IAAI,SAASA,GAAE,CAAC,GAAGA,GAAE,CAAC,CAAC,IAAI,EAAG,MAAK;AAAA,cACrC,MAAK;AAAA,QACZ;AACA,YAAI,QAAQ,MAAM,KAAK,IAAI,KAAM,QAAO;AACxC,cAAM,IAAI,UAAU,QAAQ,UAAU,SAAS,EAAE;AACjD,eAAO,EAAE,GAAG,IAAI,OAAO,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,GAAG,SAAS,WAAW,UAAU,WAAW,UAAU,SAAS,EAAE,EAAE;AAAA,MAChJ;AACA,cAAQ;AACR,UAAI,MAAM,MAAO;AAAA,IACnB;AACA,WAAO;AAAA,EACT;;;ACvFO,MAAM,UAA6C;AAAA,IACxD,IAAI;AAAA,MACF,SAAS;AAAA,QACP,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,aAAa;AAAA,QACb,OAAO;AAAA,QACP,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,MACA,IAAI;AAAA,MACJ,KAAK;AAAA,IACP;AAAA,IACA,SAAS;AAAA,MACP,SAAS;AAAA,QACP,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,aAAa;AAAA,QACb,OAAO;AAAA,QACP,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,MACA,IAAI;AAAA,MACJ,KAAK;AAAA,IACP;AAAA,EACF;AAEO,MAAM,iBAAiB,CAAC,WAA6C,QAAS,UAA0B,IAAI,KAAK,QAAQ;AAEhI,MAAM,MAAM,CAAC,MAAsB,IAAI,KAAK,MAAM,IAAI,GAAI,IAAI,KAAM,SAAS,CAAC;AAC9E,MAAM,KAAK,CAAC,MAAwC,IAAI,EAAE,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC;AAGnG,MAAM,gBAAgB,CAAC,SAAuB,UAA8B;AACjF,UAAM,QAAQ,QAAQ,OAAO,MAAM,IAAI;AACvC,UAAM,OAAO,CAAC,OAAiB,QAAQ,QAAQ,EAAE,KAAK;AACtD,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,eAAO,GAAG,KAAK,KAAK,MAAM,SAAS,IAAI,KAAK,MAAM,MAAM,CAAC,IAAI,IAAI,MAAM,MAAM,CAAC;AAAA,MAChF,KAAK;AAAA,MACL,KAAK;AACH,eAAO,GAAG,KAAK,KAAK,MAAM,SAAS,IAAI,KAAK,MAAM,MAAM,CAAC,IAAI,IAAI,MAAM,IAAI,CAAC;AAAA,MAC9E,KAAK;AACH,eAAO,GAAG,KAAK,KAAK,MAAM,SAAS,IAAI,KAAK,MAAM,MAAM,CAAC,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,GAAG,MAAM,KAAK,CAAC;AAAA,MACnG,KAAK;AACH,eAAO,GAAG,KAAK,KAAK,MAAM,SAAS,IAAI,KAAK,MAAM,MAAM,CAAC,IAAI,IAAI,MAAM,MAAM,CAAC,GAAG,MAAM,QAAQ,SAAS,KAAK,MAAM,QAAQ,KAAK,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,OAAO,OAAO,EAAE;AAAA,MACxK,KAAK;AACH,eAAO,GAAG,KAAK,KAAK,MAAM,SAAS;AAAA,MACrC,KAAK;AACH,eAAO,GAAG,KAAK,KAAK,MAAM,MAAM;AAAA,MAClC,KAAK;AACH,eAAO,GAAG,KAAK,KAAK,KAAK,MAAM,MAAM,CAAC,IAAI,GAAG,MAAM,KAAK,CAAC;AAAA,MAC3D,KAAK;AACH,eAAO,GAAG,KAAK,KAAK,MAAM,KAAK,IAAI,KAAK,MAAM,MAAM,CAAC,IAAI,MAAM,OAAO,IAAI,GAAG,MAAM,KAAK,CAAC;AAAA,MAC3F,KAAK;AACH,eAAO,GAAG,KAAK,KAAK,MAAM,KAAK,GAAG,MAAM,OAAO,YAAY,EAAE;AAAA,MAC/D,KAAK;AACH,eAAO,GAAG,KAAK,KAAK,MAAM,SAAS,IAAI,MAAM,KAAK,QAAQ,KAAK,QAAQ,GAAG;AAAA,MAC5E,KAAK;AACH,eAAO,GAAG,KAAK,KAAK,MAAM,SAAS,IAAI,KAAK,MAAM,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,MAChF,KAAK;AACH,eAAO,GAAG,KAAK,KAAK,MAAM,GAAG,IAAI,MAAM,KAAK,QAAQ,KAAK,QAAQ,GAAG;AAAA,IACxE;AAAA,EACF;;;ACpHA,MAAM,QAAQ;AACd,MAAM,WAAW;AACjB,MAAM,OAAO;AAEN,MAAM,cAAc,CAAC,UAA0B;AACpD,QAAI,MAAM,SAAS,YAAY;AAC7B,YAAMC,KAAI,IAAI,aAAa,QAAQ,QAAQ;AAC3C,YAAMC,KAAI,IAAI,aAAa,QAAQ,QAAQ;AAC3C,UAAIC,KAAI;AACR,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,cAAM,KAAK,MAAM,SAAS,KAAK,MAAM,IAAI,OAAO,KAAK;AACrD,iBAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AAEjC,gBAAM,KAAM,IAAK,IAAI,IAAK,OAAO,WAAY,KAAK,KAAK;AACvD,UAAAF,GAAEE,EAAC,IAAI,KAAK,IAAI,CAAC,IAAI;AACrB,UAAAD,GAAEC,EAAC,IAAI,KAAK,IAAI,CAAC,IAAI;AACrB,UAAAA;AAAA,QACF;AAAA,MACF;AACA,aAAO,EAAE,GAAAF,IAAG,GAAAC,IAAG,GAAG,MAAM,QAAQ,MAAM,YAAY,GAAG,MAAM,QAAQ,IAAI,MAAM,QAAQ,IAAI,MAAM,OAAO;AAAA,IACxG;AACA,UAAM,CAAC,IAAI,IAAI,EAAE,IAAI,MAAM;AAC3B,UAAM,IAAI,IAAI,aAAa,OAAO,IAAI;AACtC,UAAM,IAAI,IAAI,aAAa,OAAO,IAAI;AACtC,QAAI,IAAI;AACR,aAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,eAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,UAAE,CAAC,MAAM,IAAI,OAAO,OAAO,OAAO;AAClC,UAAE,CAAC,MAAM,IAAI,OAAO,OAAO,OAAO;AAClC;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,GAAG,GAAG,GAAG,IAAI,MAAM,OAAO,GAAG,KAAK,MAAM,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,GAAG,IAAI,KAAK,EAAE;AAAA,EACvF;AAGO,MAAM,aAAa,CAAC,GAAY,MAA8B;AACnE,UAAM,aAAa,EAAE,SAAS,aAAa,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;AACrH,UAAM,MAAM,EAAE,CAAC,IAAI,EAAE;AACrB,WAAO,CAAC,CAAC,aAAa,KAAK,IAAI,GAAG,GAAG,GAAG,aAAa,KAAK,IAAI,GAAG,GAAG,CAAC;AAAA,EACvE;AAGO,MAAM,gBAAgB,CAAC,GAAY,GAAS,MAAsB;AACvE,UAAM,KAAK,EAAE,CAAC;AACd,QAAI,QAAQ;AACZ,UAAM,IAAI,EAAE,EAAE;AACd,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;AACvC,UAAI;AACJ,UAAI,KAAK,KAAM,OAAM,OAAO,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;AAAA,eACvC,KAAK,MAAO,OAAM,EAAE,IAAI,OAAO,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;AAAA,UACvD,OAAM,MAAM,IAAI,EAAE,IAAI;AAC3B,eAAS;AAAA,IACX;AACA,WAAO,SAAS,IAAI,EAAE;AAAA,EACxB;AAGO,MAAM,WAAW,CAAC,GAAY,GAAS,MAAsB;AAClE,UAAM,CAAC,KAAK,GAAG,IAAI,WAAW,GAAG,CAAC;AAClC,QAAI,KAAK,EAAG,QAAO;AACnB,QAAI,KAAK,EAAG,QAAO;AACnB,QAAI,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM;AAC1C,aAAO,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;AAAA,IAC/D;AACA,QAAI,KAAK;AACT,QAAI,KAAK;AACT,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,YAAM,OAAO,KAAK,MAAM;AACxB,UAAI,cAAc,GAAG,GAAG,GAAG,IAAI,EAAG,MAAK;AAAA,UAClC,MAAK;AAAA,IACZ;AACA,YAAQ,KAAK,MAAM;AAAA,EACrB;AAGO,MAAM,YAAY,CAAC,OAAc,YAA4B;AAClE,UAAM,QAAQ,MAAM,SAAS,aAAa,MAAM,SAAS,KAAK,IAAI,MAAM,KAAK,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC,IAAI;AAClG,WAAO,UAAU,IAAI,KAAK,IAAI,SAAS,KAAK,IAAI,QAAQ;AAAA,EAC1D;AAEO,MAAM,cAAc,CAAC,UAA0B,MAAM,SAAS,aAAa,MAAM,SAAS,MAAM,KAAK,CAAC;AAatG,MAAM,QAAQ,CAAC,OAAc,SAAiB,MAAiB;AACpE,UAAM,IAAI,YAAY,KAAK;AAC3B,UAAM,KAAK,UAAU,OAAO,OAAO;AACnC,UAAM,SAAe,CAAC,GAAG,GAAG,CAAC;AAC7B,UAAM,KAAK,KAAK,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAChC,QAAI,KAAK,KAAM,QAAO,EAAE,OAAO,QAAQ,QAAQ,SAAS,MAAM,OAAO,EAAE,CAAC,IAAI,EAAE;AAC9E,UAAM,MAAY,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7C,UAAM,QAAc,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AAChD,WAAO,EAAE,OAAO,QAAQ,SAAS,KAAK,OAAO,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,EAAE;AAAA,EACnG;;;ACrHO,MAAM,UAAU;AAEvB,MAAM,MAAgB,CAAC;AACvB,MAAM,MAAgB,CAAC;AACvB,WAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,QAAI,KAAK,KAAK,IAAK,IAAI,UAAW,KAAK,KAAK,CAAC,CAAC;AAC9C,QAAI,KAAK,KAAK,IAAK,IAAI,UAAW,KAAK,KAAK,CAAC,CAAC;AAAA,EAChD;AASO,MAAM,YAAY,CAAC,UAAgB,cAA4B;AACpE,UAAM,SAAS,UAAU,QAAQ;AACjC,UAAM,MAAY,aAAa,OAAO,SAAS,IAAI,OAAO,YAAY,KAAK,IAAI,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;AACtH,UAAM,KAAK,UAAU,IAAI,KAAK,MAAM,QAAQ,IAAI,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AACzE,WAAO,EAAE,QAAQ,IAAI,IAAI,MAAM,QAAQ,EAAE,EAAE;AAAA,EAC7C;AAsBO,MAAM,YAAY,CAAC,GAAU,MAAoB;AAAA,IACtD,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;AAAA,IAClC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;AAAA,IAClC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;AAAA,EACpC;AAEO,MAAM,YAAY,CAAC,UAA4B;AACpD,QAAI,IAAI;AACR,aAAS,IAAI,GAAG,IAAI,SAAS,IAAK,MAAK,MAAM,CAAC,IAAI,OAAO,IAAI,KAAK,OAAO;AACzE,WAAO,MAAM,KAAK,IAAK,KAAK,KAAK,IAAK,OAAO,IAAI;AAAA,EACnD;AAEO,MAAM,aAAa,CAAC,UAA4B,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,MAAM;AAGzF,MAAM,UAAU,CAAC,QAA2B,QAAS,IAAI,MAAM,KAAK,MAAM,KAAK,IAAI,GAAG,IAAI,SAAS,CAAC;AAGpG,MAAM,YAAY,CAAC,QAAuB;AAC/C,UAAM,MAAM,CAAC,OAAO,IAAI,KAAK,IAAI,MAAM,OAAO,IAAI,KAAK,IAAI,MAAM,OAAO,IAAI,KAAK,IAAI,IAAI;AACzF,UAAM,QAAQ,CAAC,IAAI,KAAK,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3F,UAAM,MAAgB,CAAC;AACvB,aAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,YAAM,IAAK,IAAI,UAAW,KAAK,KAAK;AACpC,UAAI,IAAI,KAAK,IAAI,KAAK,IAAI,OAAO;AACjC,eAAS,IAAI,GAAG,IAAI,GAAG,IAAK,MAAK,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,IAAI,MAAM,CAAC,CAAC;AACzE,UAAI,KAAK,CAAC;AAAA,IACZ;AACA,UAAM,MAAM,IAAI,IAAI,CAAC,GAAG,MAAM,OAAO,KAAK,IAAI,UAAU,KAAK,OAAO,IAAI,MAAM,IAAI,OAAO,KAAK,IAAI,KAAK,OAAO,CAAC;AAC/G,WAAO,IAAI,IAAI,CAAC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC;AAAA,EAC3C;AAGO,MAAM,WAAW,CAAC,WAA+C;AACtE,UAAM,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM,QAAQ,OAAO,CAAC,CAAC,CAAC;AAClD,UAAM,QAAQ,OAAO,CAAC;AACtB,WAAO,QAAQ,OAAO,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,KAAK,MAAM,GAAG,IAAI,KAAK,GAAG,MAAM;AAAA,EACzF;AAGO,MAAM,cAAc,CACzB,IACA,WACA,KACA,OACA,QACA,QACA,QACa;AACb,UAAM,KAAK,MAAM,KAAK,KAAK,SAAS,MAAO,QAAQ,GAAG,IAAI,KAAK,EAAE,IAAI,KAAK,OAAO,IAAI;AACrF,WAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,MACT,QAAQ,IAAI;AAAA,MACZ,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AAAA,MACxC,OAAO,IAAI,MAAM,OAAO,EAAE,KAAK,EAAE;AAAA,MACjC;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,WAAW;AAAA,MACX,QAAQ,MAAM;AAAA,MACd,SAAS,MAAM;AAAA,MACf,OAAO,UAAU,GAAG;AAAA,MACpB,aAAa;AAAA,MACb,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,IACP;AAAA,EACF;AAGO,MAAM,YAAY,CAAC,GAAa,QAAgB,aAAgC;AACrF,MAAE,UAAU;AACZ,MAAE,cAAc;AAChB,QAAI,EAAE,MAAM,KAAK,EAAE,MAAM;AACvB,QAAE,MAAM;AACR,QAAE,OAAO;AACT,QAAE,UAAU;AACZ,QAAE,YAAY;AAAA,IAChB;AACA,QAAI,UAAU;AACZ,YAAM,IAAI,EAAE;AACZ,YAAM,aAAa,IAAI,UAAU,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC;AAC3D,UAAI,OAAO,UAAU,IAAI,IAAK,GAAE,OAAO,UAAU,UAAU;AAAA,IAC7D;AAAA,EACF;AAGO,MAAM,cAAc,CAAC,GAAa,OAAa,QAAgB,UAAuB;AAC3F,UAAM,QAAQ,MAAM,IAAI,OAAO,EAAE,MAAM,GAAG,MAAM;AAChD,QAAI,OAAO,KAAK,IAAI,KAAM;AAC1B,MAAE,SAAS,IAAI,EAAE,QAAQ,KAAK;AAC9B,aAAS,IAAI,GAAG,IAAI,SAAS,IAAK,GAAE,MAAM,CAAC,IAAI,KAAK,IAAI,MAAO,EAAE,MAAM,CAAC,IAAI,IAAI,OAAO,UAAU,OAAO,CAAC,CAAC,CAAC;AAAA,EAC7G;AAKA,MAAM,YAAY,CAAC,GAAa,SAAuB,MAAsB;AAC3E,QAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,QAAQ,KAAK,CAAC,CAAC,EAAG,QAAO;AACnF,UAAM,MAAM,IAAI,EAAE,QAAQ,QAAQ,KAAK;AACvC,UAAM,KAAK,IAAI,KAAK,QAAQ,EAAE;AAC9B,UAAM,KAAK,IAAI,KAAK,QAAQ,EAAE;AAC9B,QAAI,QAAQ;AACZ,QAAI,IAAI,CAAC,IAAI,KAAM,SAAQ,KAAK,IAAI,QAAQ,QAAQ,KAAK,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC;AAAA,aACjE,IAAI,CAAC,IAAI,MAAO,SAAQ,KAAK,IAAI,QAAQ,CAAC,QAAQ,KAAK,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC;AACjF,QAAI,IAAI,CAAC,IAAI,KAAM,SAAQ,KAAK,IAAI,QAAQ,QAAQ,KAAK,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC;AAAA,aACjE,IAAI,CAAC,IAAI,MAAO,SAAQ,KAAK,IAAI,QAAQ,CAAC,QAAQ,KAAK,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC;AACjF,WAAO,KAAK,IAAI,MAAM,KAAK;AAAA,EAC7B;AAMO,MAAM,YAAY,CAAC,GAAa,KAAgB,SAAuB,UAAkB,OAA4B;AAC1H,MAAE,OAAO;AACT,MAAE,eAAe;AACjB,UAAM,QAAe;AACrB,UAAM,EAAE,KAAK,MAAM,MAAM,IAAI,SAAS,EAAE,MAAM;AAG9C,QAAI,EAAE,SAAS,KAAK,QAAQ,WAAW,GAAG;AACxC,YAAM,OAAO,KAAK,IAAI,EAAE,QAAQ,QAAQ,WAAW,MAAM,UAAU,EAAE,KAAK,IAAI,EAAE;AAChF,QAAE,UAAU;AACZ,QAAE,UAAU;AAAA,IACd;AAGA,QAAI,EAAE,SAAS,QAAQ,EAAE,UAAU,GAAG;AACpC,YAAM,OAAO,UAAU,EAAE,KAAK;AAC9B,YAAM,QAAQ,EAAE,SAAS,OAAQ,QAAQ,GAAG,KAAK,IAAI,MAAM;AAC3D,UAAI,OAAO,OAAO;AAChB,cAAM,QAAQ,MAAM,IAAI,OAAO,OAAO,GAAG,CAAC;AAC1C,cAAM,MAAM,OAAO,MAAM,KAAK,KAAK,EAAE,MAAM,KAAK,KAAK,KAAK,KAAK,IAAI,GAAG,IAAI,SAAS,CAAC;AACpF,cAAM,QAAkB,CAAC;AACzB,iBAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,cAAI,IAAI,EAAE,MAAM,CAAC;AACjB,cAAI,EAAE,KAAM,MAAK,IAAI,MAAM,KAAK,IAAI,GAAG,IAAI,UAAU,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC;AACvE,cAAI,QAAQ,MAAM;AAChB,kBAAM,IAAI,IAAI,UAAU,OAAO,CAAC,GAAG,IAAI;AACvC,iBAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,QAAQ,CAAC;AAAA,UACrE;AACA,gBAAM,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,IAAI,QAAQ,IAAI,UAAU,GAAG,SAAS,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAAA,QAC3G;AAEA,YAAI,SAAS;AACb,cAAM,QAAQ,CAAC,MAAc,EAAE,MAAM,IAAI,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC;AACnE,YAAI,UAAU,MAAM,CAAC,CAAC,IAAI,OAAO;AAC/B,cAAI,KAAK;AACT,cAAI,KAAK;AACT,mBAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,kBAAM,OAAO,KAAK,MAAM;AACxB,gBAAI,UAAU,MAAM,GAAG,CAAC,IAAI,MAAO,MAAK;AAAA,gBACnC,MAAK;AAAA,UACZ;AACA,mBAAS;AAAA,QACX;AACA,UAAE,QAAQ,MAAM,MAAM;AAAA,MACxB;AAAA,IACF;AAGA,QAAI,EAAE,cAAc,KAAK,IAAI,UAAU,KAAK,EAAE,MAAM,GAAG;AACrD,YAAM,OAAO,KAAK,IAAI,IAAI,WAAW,MAAM,EAAE;AAC7C,YAAM,KAAM,KAAK,QAAQ,IAAI,MAAM,QAAQ,YAAa,IAAI;AAC5D,YAAM,SAAS,EAAE;AACjB,QAAE,MAAM,KAAK,IAAI,GAAG,EAAE,MAAM,EAAE;AAC9B,UAAI,SAAS,EAAG,GAAE,UAAU,KAAK,EAAE,MAAM,WAAW,IAAI;AACxD,QAAE,UAAU,IAAI,EAAE;AAClB,QAAE,YAAY,KAAK,KAAK,KAAK,IAAI,GAAG,IAAI,EAAE,GAAG,CAAC;AAC9C,UAAI,EAAE,OAAO,GAAG;AACd,UAAE,SAAS;AACX,UAAE,UAAU;AACZ,UAAE,YAAY;AACd,YAAI,IAAI,YAAY;AAClB,YAAE,OAAO;AACT,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGO,MAAM,iBAAiB,CAAC,GAA2C,MAAoB,UAAU,UAAU,EAAE,UAAU,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,CAAC;;;AC5ItJ,MAAM,kBAAkB;AACxB,MAAM,WAAW;AACjB,MAAM,eAAe;AACrB,MAAM,YAAY;AAElB,MAAM,QAAQ,CAAI,MAAY,KAAK,MAAM,KAAK,UAAU,CAAC,CAAC;AAEnD,WAAS,aAAa,UAAwB,CAAC,GAAe;AACnE,UAAM,UAAU,eAAe,QAAQ,MAAM;AAC7C,UAAM,UAAU,oBAAI,IAAyB;AAC7C,eAAW,OAAO,QAAS,SAAQ,IAAI,IAAI,IAAI,GAAG;AAClD,eAAW,OAAO,QAAQ,WAAW,CAAC,EAAG,SAAQ,IAAI,IAAI,IAAI,GAAG;AAChE,UAAM,WAAW,QAAQ,YAAY;AACrC,UAAM,UAAU,QAAQ,WAAW;AACnC,UAAM,WAAW,QAAQ,aAAa,MAAM;AAC5C,UAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,UAAM,YAAY,QAAQ,aAAa;AAEvC,QAAI,MAAM,IAAI,IAAI,QAAQ,QAAQ,CAAC;AACnC,QAAI,OAAO;AACX,UAAM,WAAW,EAAE,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,EAAE;AAC7D,QAAI,aAAa,oBAAI,IAA0B;AAC/C,QAAI,WAAW,oBAAI,IAAwB;AAC3C,QAAI,UAAU,oBAAI,IAAuB;AACzC,QAAI,OAAO,oBAAI,IAAoB;AACnC,QAAI,SAAS,oBAAI,IAAsB;AACvC,UAAM,YAAY,oBAAI,IAA0C;AAChE,QAAI,QAAsB,CAAC;AAE3B,QAAI,WAAW;AAEf,UAAM,gBAA8B;AAAA,MAClC,QAAQ,CAAC,GAAG,GAAG,CAAC;AAAA,MAChB,IAAI,CAAC,GAAG,GAAG,CAAC;AAAA,MACZ,IAAI,CAAC,GAAG,GAAG,EAAE;AAAA,MACb,OAAO,CAAC,GAAG,GAAG,CAAC;AAAA,MACf,MAAM,CAAC,UAAU,QAAQ;AAAA,MACzB,UAAU;AAAA,IACZ;AAIA,UAAM,OAAO,CAAC,MAAwB;AACpC,UAAI,SAAU,OAAM,KAAK,CAAC;AAC1B,cAAQ,UAAU,CAAC;AACnB,gBAAU,IAAI,EAAE,IAAI,GAAG,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC;AAC5C,gBAAU,IAAI,GAAG,GAAG,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC;AAAA,IAC3C;AAIA,UAAM,UAAU,CAAC,GAAiB,MAAkB,IAAI,EAAE,UAAU,WAAW,EAAE,UAAU,CAAC,CAAC;AAC7F,UAAM,QAAQ,CAAC,MAAuC,EAAE,SAAU,QAAQ,IAAI,EAAE,MAAM,KAAK,OAAQ;AACnG,UAAM,YAAY,CAAC,QAA2B,IAAI,KAAK,KAAK,KAAK,IAAI,GAAG,IAAI,SAAS,CAAC;AAEtF,UAAM,eAAe,CAAC,MAA0B;AAC9C,QAAE,SAAS,UAAU,CAAC,EAAE,MAAM,CAAC,GAAG,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;AAChD,QAAE,IAAI,UAAU,WAAW,cAAc,EAAE,QAAQ,GAAG,EAAE,MAAM,CAAC;AAC/D,QAAE,IAAI,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,WAAW,IAAI,EAAE,SAAS,EAAE,KAAK,WAAW,CAAC;AAAA,IAClF;AAEA,UAAM,aAAa,CAAC,OAA8B,OAAO,YAAY,gBAAiB,SAAS,IAAI,EAAE,KAAK;AAE1G,UAAM,kBAAkB,MAAwB;AAC9C,YAAM,OAAyB,CAAC;AAChC,iBAAW,CAAC,IAAI,CAAC,KAAK,SAAU,MAAK,KAAK,EAAE,IAAI,QAAQ,EAAE,QAAQ,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,OAAO,EAAE,OAAO,MAAM,EAAE,KAAK,CAAC;AACpH,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,CAAC,OAAqB;AACvC,YAAM,IAAI,QAAQ,IAAI,EAAE;AACxB,UAAI,CAAC,EAAG;AACR,cAAQ,OAAO,EAAE;AACjB,YAAM,IAAI,EAAE,YAAY,WAAW,IAAI,EAAE,SAAS,IAAI;AACtD,UAAI,EAAG,QAAO,EAAE,QAAQ,EAAE,GAAG;AAC7B,YAAM,MAAM,EAAE,MAAM,KAAK,IAAI,EAAE,GAAG,IAAI;AACtC,UAAI,OAAO,IAAI,WAAW,GAAI,KAAI,SAAS;AAC3C,WAAK,EAAE,MAAM,cAAc,QAAQ,GAAG,CAAC;AAAA,IACzC;AAEA,UAAM,eAAe,CAAC,GAAiB,QAAsB;AAC3D,YAAM,KAAK,EAAE,QAAQ,GAAG;AACxB,UAAI,GAAI,YAAW,EAAE;AAAA,IACvB;AAGA,UAAM,aAAa,CACjB,GACA,KACA,OACA,MACA,QACA,UACA,aAAa,UACJ;AACT,UAAI,OAAO,QAAQ,CAAC,EAAE,QAAQ;AAC5B,qBAAa,GAAG,GAAG;AACnB;AAAA,MACF;AACA,YAAM,WAAW,EAAE,QAAQ,GAAG,IAAI,QAAQ,IAAI,EAAE,QAAQ,GAAG,CAAC,IAAI;AAChE,UAAI,UAAU;AACZ,iBAAS,OAAO;AAChB,iBAAS,SAAS;AAClB,iBAAS,WAAW;AACpB,iBAAS,OAAO,OAAO;AACvB,iBAAS,aAAa;AACtB,iBAAS,cAAc,EAAE;AACzB;AAAA,MACF;AACA,YAAM,KAAK,UAAU,EAAE,SAAS,MAAM;AACtC,YAAM,SAAoB;AAAA,QACxB;AAAA,QACA,QAAQ,EAAE;AAAA,QACV;AAAA,QACA,WAAW,EAAE;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,MAAM,OAAO;AAAA,QACb,YAAY;AAAA,QACZ;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,QACA,aAAa,EAAE;AAAA,MACjB;AACA,cAAQ,IAAI,IAAI,MAAM;AACtB,QAAE,QAAQ,GAAG,IAAI;AACjB,UAAI,UAAU,OAAQ,MAAK,EAAE,MAAM,QAAQ,WAAW,EAAE,IAAI,QAAQ,EAAE,QAAQ,MAAM,QAAQ,IAAI,OAAO,MAAM,MAAM,EAAE,CAAC;AAAA,eAC7G,UAAU,QAAS,MAAK,EAAE,MAAM,SAAS,WAAW,EAAE,IAAI,QAAQ,EAAE,QAAQ,MAAM,QAAQ,GAAG,CAAC;AAAA,UAClG,MAAK,EAAE,MAAM,QAAQ,WAAW,EAAE,IAAI,QAAQ,EAAE,QAAQ,MAAM,QAAQ,GAAG,CAAC;AAAA,IACjF;AAGA,UAAM,YAAY;AAGlB,UAAM,UAAU,CAAC,MAAoB;AACnC,UAAI,CAAC,EAAE,MAAM,EAAE,OAAO,QAAQ,CAAC,QAAQ,IAAI,EAAE,MAAM,GAAG;AACpD,YAAI,EAAE,OAAQ,YAAW,EAAE,MAAM;AACjC;AAAA,MACF;AACA,YAAM,WAAiB,CAAC,EAAE,UAAU,CAAC,IAAI,WAAW,EAAE,UAAU,CAAC,IAAI,WAAW,EAAE,UAAU,CAAC,IAAI,SAAS;AAC1G,YAAM,WAAW,EAAE,SAAS,QAAQ,IAAI,EAAE,MAAM,IAAI;AACpD,UAAI,UAAU;AACZ,iBAAS,OAAO,EAAE;AAClB,iBAAS,OAAO,EAAE,OAAO;AACzB,iBAAS,cAAc,EAAE;AACzB,iBAAS,WAAW;AACpB;AAAA,MACF;AACA,YAAM,KAAK,UAAU,EAAE,SAAS,MAAM;AACtC,cAAQ,IAAI,IAAI;AAAA,QACd;AAAA,QACA,QAAQ,EAAE;AAAA,QACV,OAAO;AAAA,QACP,KAAK,EAAE;AAAA,QACP,QAAQ,MAAM,EAAE,QAAQ;AAAA,QACxB;AAAA,QACA,MAAM,EAAE;AAAA,QACR,SAAS;AAAA,QACT,MAAM,EAAE,OAAO;AAAA,QACf,YAAY;AAAA,QACZ,KAAK,OAAO,EAAE,EAAE;AAAA,QAChB,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,aAAa,EAAE;AAAA,MACjB,CAAC;AACD,QAAE,SAAS;AAAA,IACb;AAGA,UAAM,UAAU,CAAC,GAAiB,SAAmD;AACnF,YAAM,MAAM,MAAM,EAAE,KAAK,OAAO,EAAE,KAAK,SAAS,EAAE,CAAC;AACnD,YAAM,SAAS,QAAQ,GAAG,IAAI,KAAK;AACnC,UAAI,MAAY,CAAC,GAAG,GAAG,CAAC;AACxB,YAAM,aAAa,CAAC,MAA0B,KAAK,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,OAAO,UAAU,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI;AAC3G,UAAI,IAAI,QAAS,OAAM,WAAW,WAAW,EAAE,UAAU,IAAI,OAAO,CAAC,KAAK,WAAW,WAAW,EAAE,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK;AAAA,UACtH,OAAM,WAAW,WAAW,EAAE,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK;AAC5D,YAAM,QAAQ,MAAM,MAAM,MAAM,KAAK,KAAK,IAAI,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC,GAAG,KAAK,GAAG;AACpF,aAAO,EAAE,QAAQ,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,MAAM,IAAI,CAAC,IAAI,KAAK,EAAE;AAAA,IACpE;AAEA,UAAM,eAAe,CAAC,GAAiB,WAAyB;AAC9D,QAAE,SAAS,KAAK,IAAI,GAAG,EAAE,SAAS,MAAM;AAAA,IAC1C;AAGA,UAAM,SAAS,CAAC,MAA0B;AACxC,UAAI,EAAE,UAAU,EAAE,UAAU,MAAM;AAChC,UAAE,SAAS;AACX,UAAE,SAAS;AACX,aAAK,EAAE,MAAM,SAAS,WAAW,EAAE,GAAG,CAAC;AAAA,MACzC;AAAA,IACF;AAEA,UAAM,eAAe,CAAC,GAAiB,QAAkB,QAAgB,aAAiC,aAA8B;AACtI,UAAI,EAAE,SAAS,MAAM,CAAC,QAAQ,IAAI,MAAM,EAAG,QAAO;AAClD,YAAM,OAAO,EAAE,KAAK,WAAW,EAAE;AACjC,YAAM,WAAW,KAAK,IAAI,QAAQ,KAAK,IAAI,GAAG,IAAI,CAAC;AACnD,UAAI,YAAY,EAAG,QAAO;AAC1B,YAAM,IAAI,eAAe;AACzB,UAAI,EAAE,UAAU,EAAE,WAAW,UAAU,EAAE,SAAS,MAAM;AACtD,cAAM,eAAe,WAAW,EAAE;AAClC,cAAM,OAAO,eAAe,SAAS,EAAE;AACvC,cAAM,OAAO,eAAe,EAAE,SAAS;AACvC,YAAI,YAAY,OAAO,EAAE,UAAU,KAAK;AACtC,YAAE,UAAU;AACZ,eAAK,EAAE,MAAM,OAAO,WAAW,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,QACnD;AACA,UAAE,SAAS;AAAA,MACb,WAAW,CAAC,EAAE,UAAU,EAAE,UAAU,MAAM;AACxC,UAAE,SAAS;AAAA,MACb;AACA,QAAE,cAAc,EAAE,SAAS,QAAQ,EAAE,cAAc,EAAE,SAAS,IAAI,aAAa,EAAE,SAAS,YAAY;AACtG,QAAE,UAAU;AACZ,UAAI,SAAU,MAAK,EAAE,MAAM,QAAQ,WAAW,EAAE,IAAI,QAAQ,QAAQ,SAAS,CAAC;AAC9E,aAAO;AAAA,IACT;AAIA,UAAM,UAAU,CAAC,WAAmB,QAAkB,UAAiC;AACrF,UAAI,OAAwB;AAC5B,UAAI,QAAQ;AACZ,iBAAW,KAAK,OAAO,OAAO,GAAG;AAC/B,YAAI,EAAE,YAAY,aAAa,EAAE,WAAW,OAAQ;AACpD,cAAM,IAAI,SAAS,OAAO,EAAE,MAAM;AAClC,YAAI,IAAI,gBAAgB,MAAM,WAAW,EAAE,KAAK,KAAK,IAAI,OAAO;AAC9D,iBAAO;AACP,kBAAQ;AAAA,QACV;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,MAAY;AAC7B,UAAI,SAA0B;AAC9B,iBAAW,KAAK,OAAO,OAAO,GAAG;AAC/B,cAAM,OAAO,CAAC,OAAiB,EAAE,WAAW,IAAI,IAAI,KAAK,MAAM,EAAE;AACjE,YAAI,CAAC,UAAU,KAAK,CAAC,IAAI,KAAK,MAAM,EAAG,UAAS;AAAA,MAClD;AACA,UAAI,OAAQ,QAAO,OAAO,OAAO,EAAE;AAAA,IACrC;AAEA,UAAM,UAAU,CAAC,QAAkB,KAAgD,QAAgB,aAAgC;AACjI,YAAM,MAAM,QAAQ,IAAI,MAAM;AAC9B,UAAI,CAAC,OAAO,UAAU,EAAG;AACzB,UAAI,IAAI,QAAQ,IAAI,SAAS,QAAQ,IAAI,KAAK;AAC9C,UAAI,GAAG;AACL,cAAME,SAAe,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,IAAI,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE;AACvF,oBAAY,GAAG,IAAI,OAAO,MAAO,UAAU,EAAE,SAAS,UAAW,KAAK,GAAG,GAAG,GAAGA,MAAK;AACpF,kBAAU,GAAG,QAAQ,QAAQ;AAC7B;AAAA,MACF;AACA,aAAO,OAAO,QAAQ,UAAW,YAAW;AAC5C,YAAM,UAAU,WAAW,IAAI,OAAO;AACtC,YAAM,QAAe,IAAI,YAAY,YAAY,UAAU,IAAI,MAAM,IAAI;AACzE,UAAI,YAAY,SAAS,EAAE,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,OAAO,IAAI,OAAO,QAAQ,GAAG;AAC5F,UAAI,SAAU,WAAU,GAAG,GAAG,QAAQ;AACtC,QAAE,cAAc;AAChB,aAAO,IAAI,EAAE,IAAI,CAAC;AAClB,WAAK,EAAE,MAAM,SAAS,OAAO,EAAE,IAAI,SAAS,IAAI,SAAS,QAAQ,OAAO,MAAM,IAAI,KAAK,EAAE,CAAC;AAAA,IAC5F;AAIA,UAAM,iBAAiB,CAAC,MAA0B,QAAQ,GAAG,CAAC,GAAG,YAAY,EAAE,KAAK,KAAK,GAAG,CAAC,CAAC;AAG9F,UAAM,UAAU,CAAC,GAAc,aAAiF;AAC9G,UAAI,OAAmE;AACvE,iBAAW,MAAM,WAAW,OAAO,GAAG;AACpC,YAAI,GAAG,OAAO,EAAE,aAAa,GAAG,UAAU,GAAG,UAAU,GAAG,KAAK,SAAU;AACzE,cAAM,MAAM,eAAe,EAAE;AAC7B,cAAM,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,WAAW,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;AAC/E,YAAI,OAAO,EAAG;AACd,cAAM,KAAK,EAAE,SAAS,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK;AAC9C,YAAI,KAAK,KAAK,KAAK,YAAa,QAAQ,KAAK,KAAK,EAAI;AACtD,cAAM,IAAI,UAAU,EAAE,QAAQ,EAAE,UAAU,SAAS,CAAC;AACpD,YAAI,KAAK,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,UAAU,GAAG,KAAK,OAAO,GAAG,KAAK,OAAO,IAAI,KAAM,QAAO,EAAE,WAAW,IAAI,GAAG,OAAO,EAAE;AAAA,MACxI;AACA,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,CAAC,GAAc,OAAqB;AACrD,YAAM,MAAM,MAAM,gBAAgB,GAAG,UAAU,EAAE,QAAQ,EAAE,UAAU,OAAO;AAC5E,YAAM,SAAS,QAAQ,GAAG,MAAM,IAAI,IAAI,UAAU;AAClD,UAAI,QAAQ;AACV,UAAE,UAAU,OAAO;AACnB,UAAE,aAAa,OAAO;AACtB,YAAI,CAAC,EAAE,WAAY,cAAa,OAAO,WAAW,EAAE,QAAQ,EAAE,OAAO,IAAI,EAAE,aAAa,KAAK;AAC7F;AAAA,MACF;AACA,QAAE,UAAU,MAAM,MAAM,IAAI,KAAK,IAAI;AACrC,QAAE,aAAa,MAAM,IAAI,IAAI;AAC7B,UAAI,CAAC,OAAO,EAAE,WAAY;AAC1B,YAAM,QAAQ,OAAO,IAAI,QAAQ;AACjC,UAAI,OAAO,EAAE,cAAc,MAAM;AAC/B,UAAE,aAAa;AACf,aAAK,EAAE,MAAM,UAAU,QAAQ,EAAE,QAAQ,OAAO,MAAM,IAAI,KAAK,GAAG,WAAW,MAAM,OAAO,EAAE,OAAO,MAAM,QAAQ,MAAM,GAAG,CAAC,EAAE,CAAC;AAAA,MAChI;AACA,cAAQ,EAAE,QAAQ,KAAK,EAAE,OAAO,IAAI,IAAI,QAAQ;AAAA,IAClD;AAIA,UAAM,YAAY,CAAC,GAAiB,KAAgB,MAAsB;AACxE,YAAM,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,KAAK,OAAO;AACjD,YAAM,OAAO,IAAI,KAAK,KAAK,IAAI,GAAG,EAAE;AACpC,aAAO,KAAK,IAAI,MAAM,OAAO,KAAK,KAAK,IAAI,UAAU,CAAC,IAAI,MAAO,UAAU,GAAG,GAAG,IAAK;AAAA,IACxF;AAEA,UAAM,iBAAiB,CAAC,QAA2B,IAAI,WAAW,IAAI,SAAS,IAAI,MAAM,SAAS,IAAI,KAAK;AAE3G,UAAM,gBAAgB,CAAC,GAAiB,OAAqB;AAE3D,UAAI,EAAE,WAAW,KAAK,GAAG;AACvB,cAAM,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK;AACjD,cAAM,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK;AACjD,cAAM,KAAK,MAAM,KAAK,SAAS,OAAO,IAAI;AAC1C,cAAM,KAAK,MAAM,KAAK,SAAS,OAAO,IAAI;AAC1C,cAAM,IAAI;AACV,cAAM,IAAI;AACV,UAAE,MAAM,CAAC,MAAM,IAAI,KAAK,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI,IAAI,EAAE,MAAM,CAAC,KAAK;AACrE,UAAE,MAAM,CAAC,MAAM,IAAI,KAAK,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI,IAAI,EAAE,MAAM,CAAC,KAAK;AAAA,MACvE,OAAO;AACL,UAAE,MAAM,CAAC,KAAK;AACd,UAAE,MAAM,CAAC,KAAK;AAAA,MAChB;AACA,QAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI;AAC3B,QAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI;AAC3B,UAAI,KAAK,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,KAAM,GAAE,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC;AAC3H,QAAE,eAAe,MAAM,EAAE,QAAQ;AACjC,QAAE,UAAU;AAGZ,UAAI,EAAE,gBAAgB,UAAU;AAC9B,cAAM,OAAO,MAAM,OAAO,EAAE,WAAW,EAAE,KAAK,YAAY,KAAK;AAC/D,UAAE,cAAc,YAAY,EAAE,cAAc,YAAY,KAAK,IAAI,CAAC,KAAK,GAAG;AAC1E,YAAI,KAAK,IAAI,EAAE,cAAc,QAAQ,IAAI,KAAM,GAAE,cAAc;AAAA,MACjE;AAEA,mBAAa,CAAC;AACd,YAAM,MAAM,MAAM,CAAC;AAEnB,YAAM,WAAW,CAAC,CAAC,OAAO,EAAE,SAAS,QAAQ,CAAC,EAAE,UAAU,EAAE,cAAc,eAAe,GAAG;AAC5F,UAAI,aAAa,EAAE,UAAU;AAC3B,UAAE,WAAW;AACb,aAAK,EAAE,MAAM,SAAS,WAAW,EAAE,IAAI,IAAI,SAAS,CAAC;AAAA,MACvD;AAEA,QAAE,UAAU;AACZ,UAAI,CAAC,OAAO,EAAE,UAAU,MAAM;AAC5B,mBAAW,OAAO,OAAO,KAAK,EAAE,OAAO,EAAG,cAAa,GAAG,GAAG;AAC7D,UAAE,UAAU;AACZ,eAAO,CAAC;AACR;AAAA,MACF;AAGA,UAAI,EAAE,UAAU,GAAG;AACjB,UAAE,WAAW;AACb,YAAI,EAAE,UAAU,GAAG;AACjB,gBAAM,OAAO,QAAQ,GAAG,IAAI;AAC5B,qBAAW,GAAG,QAAQ,QAAQ,EAAE,UAAU,KAAK,QAAQ,KAAK,UAAU,EAAE,UAAU;AAClF,YAAE,WAAW,EAAE;AAAA,QACjB,MAAO,cAAa,GAAG,MAAM;AAC7B,qBAAa,GAAG,OAAO;AAAA,MACzB,OAAO;AACL,qBAAa,GAAG,MAAM;AACtB,cAAM,MAAM,MAAM,EAAE,KAAK,OAAO,EAAE,KAAK,SAAS,EAAE,CAAC;AACnD,cAAM,IAAI,EAAE,IAAI,IAAI;AACpB,YAAI,UAAU;AACd,YAAI,CAAC,EAAE,UAAU,IAAI,MAAM;AACzB,gBAAM,SAAS,EAAE,SAAS,EAAE,KAAK,WAAW,cAAc,EAAE,MAAM,EAAE,GAAG,IAAI,KAAK;AAChF,cAAI,SAAS,MAAM;AACjB,kBAAM,OAAO,KAAK,IAAI,UAAU,GAAG,KAAK,CAAC,GAAG,SAAS,KAAK,IAAI,IAAI,IAAI,CAAC;AACvE,yBAAa,GAAG,KAAK,IAAI,OAAO,IAAI,QAAQ,EAAE,MAAM,CAAC;AACrD,kBAAM,OAAO,QAAQ,GAAG,CAAC;AACzB,uBAAW,GAAG,SAAS,SAAS,MAAM,KAAK,QAAQ,KAAK,QAAQ;AAChE,cAAE,WAAW;AACb,sBAAU;AAAA,UACZ;AAAA,QACF;AACA,YAAI,CAAC,QAAS,cAAa,GAAG,OAAO;AAAA,MACvC;AAGA,eAAS,IAAI,GAAG,IAAI,EAAE,MAAM,QAAQ,KAAK;AACvC,cAAM,OAAO,EAAE,MAAM,CAAC;AACtB,cAAM,MAAM,QAAQ,CAAC;AACrB,cAAM,KAAK,IAAI,EAAE,GAAG,KAAK,KAAK;AAC9B,cAAM,OAAO,EAAE,IAAI;AACnB,YAAI,EAAE,SAAS,QAAQ,OAAO,MAAM;AAClC,gBAAM,OAAO,KAAK,MAAM,KAAK,WAAW,MAAM;AAC9C,gBAAM,UAAU,MAAM,OAAO,KAAK,KAAK,IAAI,UAAU,IAAI,IAAI,MAAO,UAAU,GAAG;AACjF,gBAAM,QAAQ,EAAE,SAAS,EAAE,KAAK,WAAW,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE;AACxE,cAAI,QAAQ,MAAM;AAChB,kBAAM,OAAO,KAAK,IAAI,SAAS,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC;AACzD,yBAAa,GAAG,KAAK,IAAI,OAAO,IAAI,KAAK,CAAC;AAC1C,kBAAM,KAAK,UAAU,WAAW,EAAE,UAAU,KAAK,MAAM,CAAC;AACxD,kBAAM,IAAI,KAAK,IAAI,GAAG,MAAM,KAAK,KAAK,IAAI,UAAU,IAAI,CAAC;AACzD,uBAAW,GAAG,KAAK,QAAQ,MAAM,QAAQ,GAAG,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;AACjG,cAAE,WAAW;AACb;AAAA,UACF;AAAA,QACF;AACA,qBAAa,GAAG,GAAG;AAAA,MACrB;AACA,UAAI,EAAE,MAAM,SAAS,KAAK,EAAE,UAAU,EAAG,cAAa,CAAC;AACvD,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,OAAO,CAAC,OAAqB;AACjC,cAAQ;AACR,iBAAW,KAAK,CAAC,GAAG,WAAW,OAAO,CAAC,EAAG,eAAc,GAAG,EAAE;AAC7D,iBAAW,KAAK,CAAC,GAAG,QAAQ,OAAO,CAAC,EAAG,YAAW,GAAG,EAAE;AACvD,iBAAW,MAAM,CAAC,GAAG,OAAO,OAAO,CAAC,GAAG;AACrC,cAAM,MAAM,QAAQ,IAAI,GAAG,MAAM;AACjC,YAAI,CAAC,IAAK;AACV,cAAM,SAAS,UAAU,IAAI,KAAK,WAAW,GAAG,OAAO,GAAG,UAAU,EAAE;AACtE,YAAI,WAAW,aAAc,MAAK,EAAE,MAAM,SAAS,OAAO,GAAG,IAAI,MAAM,KAAK,CAAC;AAAA,iBACpE,WAAW,cAAc;AAChC,iBAAO,OAAO,GAAG,EAAE;AACnB,eAAK,EAAE,MAAM,SAAS,OAAO,GAAG,IAAI,MAAM,MAAM,CAAC;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAIA,UAAM,UAAU,CAAC,OAAqC;AAAA,MACpD,IAAI,EAAE;AAAA,MACN,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE;AAAA,MACV,UAAU,EAAE,KAAK;AAAA,MACjB,aAAa,EAAE;AAAA,MACf,QAAQ,EAAE;AAAA,MACV,eAAe,EAAE,SAAS,IAAI,EAAE,IAAI;AAAA,MACpC,cAAc,IAAI,EAAE,UAAU,MAAM,EAAE,QAAQ,EAAE,SAAS,IAAI,EAAE,IAAI,CAAC,CAAC;AAAA,MACrE,eAAe,MAAM,EAAE,MAAM;AAAA,MAC7B,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,EAAE,OAAO,MAAM,EAAE,KAAK,GAAG,QAAQ,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,SAAS,EAAE;AAAA,MACpG,SAAS,EAAE;AAAA,MACX,UAAU,EAAE;AAAA,MACZ,OAAO,EAAE,KAAK;AAAA,MACd,WAAW,UAAU,EAAE,KAAK,OAAO,EAAE,KAAK,OAAO;AAAA,MACjD,UAAU,MAAM,EAAE,QAAQ;AAAA,MAC1B,UAAU,CAAC,GAAG,EAAE,QAAQ;AAAA,IAC1B;AAEA,UAAM,aAAa,CAAC,OAA+B;AAAA,MACjD,IAAI,EAAE;AAAA,MACN,QAAQ,EAAE;AAAA,MACV,OAAO,EAAE;AAAA,MACT,WAAW,EAAE;AAAA,MACb,KAAK,EAAE;AAAA,MACP,QAAQ,MAAM,EAAE,MAAM;AAAA,MACtB,UAAU,MAAM,EAAE,QAAQ;AAAA,MAC1B,MAAM,EAAE;AAAA,MACR,SAAS,EAAE,UAAU,MAAM,EAAE,OAAO,IAAI;AAAA,MACxC,MAAM,EAAE;AAAA,MACR,YAAY,EAAE;AAAA,IAChB;AAEA,UAAM,YAAY,CAAC,OAA6B;AAAA,MAC9C,IAAI,EAAE;AAAA,MACN,SAAS,EAAE;AAAA,MACX,QAAQ,EAAE;AAAA,MACV,QAAQ,MAAM,EAAE,MAAM;AAAA,MACtB,OAAO,CAAC,GAAG,EAAE,KAAK;AAAA,MAClB,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE;AAAA,MACV,SAAS,EAAE;AAAA,MACX,WAAW,EAAE;AAAA,MACb,QAAQ,MAAM,EAAE,MAAM;AAAA,MACtB,SAAS,MAAM,EAAE,OAAO;AAAA,MACxB,MAAM,EAAE,OAAO,MAAM,EAAE,IAAI,IAAI;AAAA,MAC/B,MAAM,EAAE;AAAA,MACR,KAAK,EAAE;AAAA,IACT;AAIA,UAAM,QAAoB;AAAA,MACxB;AAAA,MACA;AAAA,MACA,UAAU,CAAC,UAAU,cAAc,SAAS,KAAK;AAAA,MAEjD,aAAa,MAAM,OAAO,CAAC,GAAG;AAC5B,cAAM,KAAK,KAAK,MAAM,aAAa,EAAE,SAAS,SAAS;AACvD,YAAI,WAAW,IAAI,EAAE,EAAG,OAAM,gBAAgB,EAAE;AAChD,cAAM,SAAS,KAAK,UAAU,QAAQ,IAAI,KAAK,MAAM,IAAI,KAAK,SAAS;AACvE,cAAM,SAAS,SAAS,MAAM,KAAK,UAAU,GAAG,GAAG,KAAK,QAAQ,IAAI;AACpE,cAAM,IAAkB;AAAA,UACtB;AAAA,UACA,MAAM,MAAM,IAAI;AAAA,UAChB,MAAM,YAAY,KAAK,KAAK;AAAA,UAC5B,QAAQ,SAAS,IAAI,SAAS;AAAA,UAC9B;AAAA,UACA,aAAa,KAAK,eAAe;AAAA,UACjC,QAAQ,KAAK,UAAU,KAAK,WAAW;AAAA,UACvC,UAAU,MAAM,KAAK,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,UAC1C,UAAU,KAAK,WAAY,CAAC,GAAG,KAAK,QAAQ,IAAa,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,UACpE,UAAU,CAAC,GAAG,GAAG,CAAC;AAAA,UAClB,cAAc,CAAC,GAAG,GAAG,CAAC;AAAA,UACtB,SAAS;AAAA,UACT,OAAO,CAAC;AAAA,UACR,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,UAClB,QAAQ,CAAC,GAAG,GAAG,CAAC;AAAA,UAChB,GAAG,CAAC,GAAG,GAAG,CAAC;AAAA,UACX,GAAG;AAAA,UACH,UAAU;AAAA,UACV,SAAS;AAAA,UACT,SAAS,CAAC;AAAA,UACV,UAAU;AAAA,UACV,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,SAAS;AAAA,QACX;AACA,mBAAW,IAAI,IAAI,CAAC;AACpB,qBAAa,CAAC;AACd,eAAO;AAAA,MACT;AAAA,MAEA,OAAO,MAAM;AACX,cAAM,KAAK,KAAK,MAAM,OAAO,EAAE,SAAS,GAAG;AAC3C,YAAI,KAAK,IAAI,EAAE,EAAG,OAAM,UAAU,EAAE;AACpC,cAAM,IAAI,KAAK,aAAa,CAAC,GAAG,IAAI,CAAC;AACrC,cAAM,MAAM,KAAK,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK;AAC5C,cAAM,IAAY;AAAA,UAChB;AAAA,UACA,UAAU,MAAM,KAAK,QAAQ;AAAA,UAC7B,WAAW,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,GAAG;AAAA,UAC9C,QAAQ,KAAK;AAAA,UACb,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI;AAAA,UAC3B,aAAa,KAAK,eAAe;AAAA,UACjC,IAAI;AAAA,QACN;AACA,aAAK,IAAI,IAAI,CAAC;AACd,YAAI,KAAK,MAAM,KAAM,OAAM,OAAO,IAAI,IAAI;AAC1C,eAAO;AAAA,MACT;AAAA,MAEA,OAAO,IAAI,IAAI,MAAM;AACnB,cAAM,IAAI,KAAK,IAAI,EAAE;AACrB,YAAI,CAAC,EAAG;AACR,YAAI,SAAS,OAAW,GAAE,OAAO,KAAK,IAAI,GAAG,IAAI;AACjD,cAAM,UAAU,EAAE,OAAO;AACzB,UAAE,KAAK;AACP,gBAAQ,CAAC;AACT,YAAI,QAAS,MAAK,EAAE,MAAM,OAAO,KAAK,IAAI,GAAG,CAAC;AAAA,MAChD;AAAA,MAEA,UAAU,IAAI;AACZ,cAAM,IAAI,KAAK,IAAI,EAAE;AACrB,YAAI,CAAC,EAAG;AACR,UAAE,KAAK;AACP,gBAAQ,CAAC;AACT,aAAK,OAAO,EAAE;AAAA,MAChB;AAAA,MAEA,MAAM,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,UAAU,MAAM,EAAE,QAAQ,GAAG,WAAW,MAAM,EAAE,SAAS,GAAG,QAAQ,EAAE,QAAQ,MAAM,EAAE,MAAM,aAAa,EAAE,aAAa,IAAI,EAAE,IAAI,QAAQ,EAAE,OAAO,EAAE;AAAA,MAE5M,gBAAgB,IAAI;AAClB,cAAM,IAAI,WAAW,IAAI,EAAE;AAC3B,YAAI,CAAC,EAAG;AACR,mBAAW,OAAO,OAAO,KAAK,EAAE,OAAO,EAAG,cAAa,GAAG,GAAG;AAC7D,mBAAW,OAAO,EAAE;AAAA,MACtB;AAAA,MAEA,aAAa,IAAI,UAAU,UAAU,UAAU;AAC7C,cAAM,IAAI,WAAW,IAAI,EAAE;AAC3B,YAAI,CAAC,EAAG;AACR,UAAE,WAAW,MAAM,QAAQ;AAC3B,UAAE,WAAW,CAAC,GAAG,QAAQ;AACzB,YAAI,SAAU,GAAE,WAAW,MAAM,QAAQ;AACzC,qBAAa,CAAC;AAAA,MAChB;AAAA,MAEA,KAAK,IAAI;AACP,cAAM,IAAI,WAAW,IAAI,EAAE;AAC3B,YAAI,EAAG,GAAE,SAAS;AAAA,MACpB;AAAA,MAEA,MAAM,IAAI;AACR,cAAM,IAAI,WAAW,IAAI,EAAE;AAC3B,YAAI,CAAC,EAAG;AACR,UAAE,SAAS;AACX,mBAAW,OAAO,CAAC,QAAQ,OAAO,EAAG,cAAa,GAAG,GAAG;AACxD,UAAE,UAAU;AAAA,MACd;AAAA,MAEA,KAAK,IAAI,QAAQ,QAAQ,aAAa;AACpC,cAAM,IAAI,WAAW,IAAI,EAAE;AAC3B,YAAI,CAAC,KAAK,EAAE,OAAQ,QAAO;AAC3B,cAAM,WAAW,aAAa,GAAG,QAAQ,QAAQ,aAAa,IAAI;AAClE,qBAAa,CAAC;AACd,eAAO;AAAA,MACT;AAAA,MAEA,KAAK,IAAI,IAAI,MAAM;AACjB,cAAM,IAAI,WAAW,IAAI,EAAE;AAC3B,cAAM,MAAM,IAAI,MAAM,CAAC,IAAI;AAC3B,YAAI,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,QAAQ,EAAE,KAAK,GAAI,QAAO;AACpE,qBAAa,CAAC;AACd,cAAM,MAAM,MAAM,EAAE,KAAK,OAAO,EAAE,KAAK,SAAS,EAAE,CAAC;AACnD,cAAM,QAAQ,KAAK,IAAI,GAAG,EAAE,IAAI,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAC1D,cAAM,OAAO,KAAK,IAAI,EAAE,IAAI,IAAI,OAAO,OAAO,MAAM,KAAK;AACzD,cAAM,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,KAAK,OAAO;AACjD,cAAM,UAAU,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,UAAU,IAAI,IAAI;AAC1E,cAAM,OAAO,KAAK,IAAI,SAAS,OAAO,KAAK,EAAE,IAAI,UAAU,GAAG;AAC9D,cAAM,MAAM,KAAK,IAAI,OAAO,IAAI,EAAE,MAAM;AACxC,cAAM,SAAS,OAAO,WAAW,IAAI,IAAI,IAAI;AAC7C,YAAI,YAAY;AAChB,YAAI,QAAQ;AACV,sBAAY,aAAa,QAAQ,EAAE,QAAoB,KAAK,EAAE,aAAa,KAAK;AAChF,uBAAa,MAAM;AACnB,gBAAM,WAAW,MAAM;AACvB,cAAI,WAAW,MAAM;AACnB,kBAAMC,QAAO,QAAQ,GAAG,IAAI;AAC5B,kBAAM,MAAM,MAAM,gBAAgB,GAAG,UAAUA,MAAK,QAAQA,MAAK,UAAU,OAAO;AAClF,gBAAI,IAAK,SAAQ,EAAE,QAAoB,KAAK,UAAU,IAAI,QAAQ;AAAA,UACpE;AAAA,QACF;AACA,qBAAa,GAAG,GAAG;AACnB,UAAE,WAAW,MAAM;AACnB,UAAE,UAAU,KAAK,IAAI,MAAM,KAAK,GAAG;AACnC,UAAE,aAAa,CAAC,CAAC;AACjB,cAAM,OAAO,QAAQ,GAAG,IAAI;AAC5B,mBAAW,GAAG,QAAQ,QAAQ,EAAE,UAAU,KAAK,QAAQ,KAAK,UAAU,EAAE,UAAU;AAClF,qBAAa,CAAC;AACd,eAAO,CAAC;AACR,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,IAAI,QAAQ;AAChB,cAAM,IAAI,WAAW,IAAI,EAAE;AAC3B,cAAM,MAAM,IAAI,MAAM,CAAC,IAAI;AAC3B,YAAI,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,QAAQ,EAAE,SAAS,GAAI,QAAO;AACxE,cAAM,SAAS,KAAK,IAAI,QAAQ,EAAE,MAAM;AACxC,qBAAa,GAAG,MAAM;AACtB,cAAM,QAAgD;AAAA,UACpD,MAAM;AAAA,UACN,WAAW,EAAE;AAAA,UACb,QAAQ,IAAI;AAAA,UACZ,QAAQ;AAAA,UACR,aAAa,EAAE;AAAA,UACf,SAAS,IAAI,OAAO,UAAU,KAAK;AAAA,UACnC,SAAS,CAAC,GAAI,IAAI,OAAO,WAAW,CAAC,CAAE;AAAA,UACvC,MAAM,EAAE,cAAc;AAAA,QACxB;AACA,aAAK,KAAK;AACV,qBAAa,CAAC;AACd,eAAO,CAAC;AACR,eAAO;AAAA,MACT;AAAA,MAEA,SAAS,IAAI,OAAO,QAAQ,UAAU;AACpC,cAAM,IAAI,WAAW,IAAI,EAAE;AAC3B,YAAI,CAAC,KAAK,EAAE,WAAW,MAAM,EAAE,MAAM,UAAU,UAAW;AAC1D,UAAE,MAAM,KAAK,EAAE,OAAO,MAAM,KAAK,GAAG,QAAQ,UAAU,MAAM,GAAG,SAAS,CAAC;AAAA,MAC3E;AAAA,MAEA,KAAK,IAAI,QAAQ;AACf,cAAM,IAAI,WAAW,IAAI,EAAE;AAC3B,YAAI,EAAG,GAAE,cAAc,MAAM,EAAE,cAAc,QAAQ,KAAK,GAAI;AAAA,MAChE;AAAA,MAEA,WAAW,MAAM;AACf,cAAM,QAAQ,UAAU,KAAK,QAAQ,KAAK,OAAO;AACjD,iBAAS,IAAI,KAAK,IAAI;AAAA,UACpB,GAAG,MAAM,IAAI;AAAA,UACb,GAAG;AAAA,UACH,OAAO,MAAM,KAAK,KAAK;AAAA,UACvB,MAAM,CAAC,KAAK,SAAS,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;AAAA,QAC3C,CAAC;AAAA,MACH;AAAA,MAEA,cAAc,IAAI;AAChB,iBAAS,OAAO,EAAE;AAClB,mBAAW,KAAK,CAAC,GAAG,OAAO,OAAO,CAAC,EAAG,KAAI,EAAE,YAAY,GAAI,QAAO,OAAO,EAAE,EAAE;AAAA,MAChF;AAAA,MAEA,OAAO,QAAQ,OAAO,QAAQ,UAAU;AACtC,YAAI,CAAC,QAAQ,IAAI,MAAM,KAAK,EAAE,SAAS,GAAI;AAC3C,cAAM,IAAU,YAAY,CAAC,GAAG,MAAM,CAAC;AACvC,cAAM,SAAS,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;AACtC,cAAM,MAAM,MAAM,gBAAgB,GAAG,UAAU,QAAQ,GAAG,OAAO;AACjE,YAAI,CAAC,IAAK;AACV,aAAK,EAAE,MAAM,UAAU,QAAQ,OAAO,MAAM,IAAI,KAAK,GAAG,WAAW,MAAM,MAAM,SAAS,GAAG,GAAG,CAAC,EAAE,CAAC;AAClG,gBAAQ,QAAQ,KAAK,QAAQ,OAAO,CAAC,IAAI,MAAM,IAAI,WAAW,IAAI;AAAA,MACpE;AAAA,MAEA,YAAY,OAAO,QAAQ;AACzB,mBAAW,KAAK,CAAC,GAAG,OAAO,OAAO,CAAC,GAAG;AACpC,cAAI,SAAS,OAAO,EAAE,MAAM,KAAK,SAAS,MAAM,WAAW,EAAE,KAAK,GAAG;AACnE,mBAAO,OAAO,EAAE,EAAE;AAClB,iBAAK,EAAE,MAAM,SAAS,OAAO,EAAE,IAAI,MAAM,MAAM,CAAC;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,MAEA,OAAO,IAAI;AACT,YAAI,KAAK,GAAG;AACV,gBAAM,IAAI,MAAM,KAAK,KAAK,KAAK,QAAQ,GAAG,GAAG,YAAY;AACzD,qBAAW;AACX,cAAI;AACF,qBAAS,IAAI,GAAG,IAAI,GAAG,IAAK,MAAK,KAAK,CAAC;AAAA,UACzC,UAAE;AACA,uBAAW;AAAA,UACb;AAAA,QACF;AACA,cAAM,MAAM;AACZ,gBAAQ,CAAC;AACT,eAAO;AAAA,MACT;AAAA,MAEA,WAAW,CAAC,OAAO;AACjB,cAAM,IAAI,WAAW,IAAI,EAAE;AAC3B,eAAO,IAAI,QAAQ,CAAC,IAAI;AAAA,MAC1B;AAAA,MACA,YAAY,MAAM,CAAC,GAAG,WAAW,OAAO,CAAC,EAAE,IAAI,OAAO;AAAA,MACtD,SAAS,MAAM,CAAC,GAAG,QAAQ,OAAO,CAAC,EAAE,IAAI,UAAU;AAAA,MACnD,QAAQ,MAAM,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE,IAAI,SAAS;AAAA,MAEhD,GAAG,MAAM,IAAI;AACX,YAAI,MAAM,UAAU,IAAI,IAAI;AAC5B,YAAI,CAAC,IAAK,WAAU,IAAI,MAAO,MAAM,oBAAI,IAAI,CAAE;AAC/C,YAAI,IAAI,EAAE;AACV,eAAO,MAAM;AACX,eAAK,OAAO,EAAE;AAAA,QAChB;AAAA,MACF;AAAA,MAEA,YAAY;AACV,cAAM,WAAqB;AAAA,UACzB,SAAS;AAAA,UACT;AAAA,UACA,KAAK,IAAI;AAAA,UACT,UAAU,EAAE,GAAG,SAAS;AAAA,UACxB,YAAY,CAAC,GAAG,WAAW,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM;AAC9C,kBAAM,EAAE,MAAM,OAAO,GAAG,KAAK,IAAI;AACjC,mBAAO,MAAM,IAAI;AAAA,UACnB,CAAC;AAAA,UACD,UAAU,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,MAAM,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,OAAO,QAAQ,EAAE,QAAQ,UAAU,EAAE,MAAM,SAAS,EAAE,IAAI,UAAU,EAAE,SAAS,CAAC,CAAC;AAAA,UACxJ,SAAS,CAAC,GAAG,QAAQ,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC;AAAA,UAClD,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC;AAAA,UAC5C,QAAQ,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC;AAAA,QAClD;AACA,eAAO;AAAA,MACT;AAAA,MAEA,KAAK,OAAO;AACV,cAAM,OAAO,MAAM,KAAK;AACxB,YAAI,CAAC,QAAQ,KAAK,YAAY,EAAG,OAAM,IAAI,MAAM,mCAAmC;AACpF,eAAO,KAAK;AACZ,cAAM,IAAI,IAAI,CAAC;AACf,YAAI,QAAQ,KAAK;AACjB,iBAAS,YAAY,KAAK,SAAS;AACnC,iBAAS,SAAS,KAAK,SAAS;AAChC,iBAAS,QAAQ,KAAK,SAAS;AAC/B,qBAAa,oBAAI,IAAI;AACrB,mBAAW,OAAO,KAAK,WAAY,YAAW,IAAI,IAAI,IAAI,EAAE,GAAG,KAAK,MAAM,YAAY,IAAI,KAAK,KAAK,EAAE,CAAC;AACvG,mBAAW,oBAAI,IAAI;AACnB,mBAAW,KAAK,KAAK,SAAU,OAAM,WAAW,CAAC;AACjD,iBAAS,MAAM,KAAK,SAAS,OAAO;AACpC,kBAAU,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACpD,eAAO,IAAI,KAAK,KAAK,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACtD,iBAAS,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAClD,gBAAQ,CAAC;AAAA,MACX;AAAA,IACF;AAEA,WAAO;AAAA,EACT;;;ACp2BA;AAAA,IACE;AAAA,MACE,IAAM;AAAA,MACN,UAAY;AAAA,MACZ,MAAQ;AAAA,QACN;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,UACV,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,UAAY;AAAA,MACZ,MAAQ;AAAA,QACN;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,UACV,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,UAAY;AAAA,MACZ,MAAQ;AAAA,QACN;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,UACV,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,UAAY;AAAA,MACZ,MAAQ;AAAA,QACN;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,UACV,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,UAAY;AAAA,MACZ,MAAQ;AAAA,QACN;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,UACV,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,UAAY;AAAA,MACZ,MAAQ;AAAA,QACN;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,UAAY;AAAA,MACZ,MAAQ;AAAA,QACN;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,GAAK;AAAA,UACL,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,QAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;;;ACzfO,MAAM,YAA0B;AAKvC,MAAM,qBAAqB;AAOpB,WAAS,cAAc,OAAmB,aAAqB,KAAiB,kBAAiD;AACtI,UAAM,OAAO,CAAC,GAAG,IAAI,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;AACnD,QAAI,OAAO;AACX,QAAI,OAAO,KAAK,WAAW,KAAK,IAAI,YAAY;AAChD,QAAI,UAAU;AACd,QAAI,UAAuB;AAC3B,UAAM,QAAQ,oBAAI,IAAY;AAE9B,UAAM,OAAO,MAA0C;AACrD,UAAI,KAAK,WAAW,EAAG,QAAO,EAAE,UAAU,CAAC,GAAG,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,EAAE;AACzE,UAAI,QAAQ,KAAK,CAAC,EAAE,EAAG,QAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC,GAAG,KAAK,CAAC,EAAE,QAAQ,EAAE;AACjG,eAAS,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;AACxC,cAAM,IAAI,KAAK,CAAC;AAChB,cAAM,IAAI,KAAK,IAAI,CAAC;AACpB,YAAI,QAAQ,EAAE,GAAG;AACf,gBAAM,IAAI,EAAE,IAAI,EAAE,KAAK,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK;AACnD,iBAAO,EAAE,UAAU,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,GAAG,UAAU,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE;AAAA,QAClG;AAAA,MACF;AACA,YAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,aAAO,EAAE,UAAU,CAAC,GAAG,KAAK,QAAQ,GAAG,UAAU,CAAC,GAAG,KAAK,QAAQ,EAAE;AAAA,IACtE;AAEA,UAAM,SAAS,CAAC,OAAqB;AACnC,UAAI,CAAC,iBAAkB;AACvB,YAAM,OAAO,iBAAiB;AAC9B,YAAM,IAAI,KAAK;AACf,YAAM,WAAW,IAAI,KAAK,UAAU,WAAW,KAAK,UAAU,EAAE,QAAQ,CAAC;AACzE,YAAM,WAAW,aAAa,KAAK,UAAU,cAAc,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;AACvG,YAAM,WACJ,WAAW,KAAK,IAAI,EAAE,SAAS,CAAC,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,IAAI;AAC5H,gBAAU;AACV,YAAM,aAAa,aAAa,UAAU,UAAU,QAAQ;AAAA,IAC9D;AAEA,UAAM,SAAwB;AAAA,MAC5B;AAAA,MACA,IAAI,OAAO;AACT,eAAO;AAAA,MACT;AAAA,MACA,IAAI,OAAO;AACT,eAAO;AAAA,MACT;AAAA,MACA;AAAA,MACA,OAAO,IAAI;AACT,YAAI,KAAM,QAAO,CAAC;AAClB,cAAM,SAAuB,CAAC;AAC9B,cAAM,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,OAAO,KAAK,CAAC,CAAC;AAC/C,YAAI;AACF,cAAI,CAAC,SAAS;AACZ,sBAAU;AACV,kBAAM,QAAQ,MAAM,UAAU,WAAW;AACzC,gBAAI,CAAC,SAAU,IAAI,WAAW,IAAI,QAAQ,SAAS,MAAM,CAAC,MAAM,UAAU,CAAC,IAAI,QAAQ,SAAS,MAAM,MAAM,IAAK;AAC/G,qBAAO;AACP,qBAAO;AAAA,YACT;AAAA,UACF;AACA,gBAAM,QAAQ;AACd,gBAAM,MAAM,KAAK,IAAI,IAAI,UAAU,OAAO,KAAK,IAAI,GAAG,EAAE,CAAC;AACzD,mBAAS,IAAI,GAAG,IAAI,KAAK,UAAU,CAAC,MAAM,KAAK;AAC7C,kBAAM,MAAM,KAAK,CAAC;AAClB,kBAAM,YAAY,IAAI;AACtB,kBAAM,UAAU,IAAI,IAAI,KAAK,SAAS,KAAK,IAAI,CAAC,EAAE,IAAI,IAAI;AAC1D,iBAAK,IAAI,WAAW,UAAU,IAAI,WAAW,YAAY,CAAC,MAAM,IAAI,CAAC,KAAK,OAAO,WAAW;AAC1F,oBAAM,IAAI,CAAC;AACX,kBAAI,IAAI,WAAW,OAAQ,OAAM,KAAK,WAAW;AAAA,kBAC5C,OAAM,MAAM,WAAW;AAAA,YAC9B;AACA,kBAAM,UAAU,KAAK,IAAI,KAAK,OAAO,IAAI,KAAK,IAAI,OAAO,SAAS;AAClE,gBAAI,WAAW,EAAG;AAClB,gBAAI,IAAI,WAAW,SAAS;AAC1B,oBAAM,KAAK,MAAM,MAAM,cAAc,IAAI,QAAQ,sBAAsB,OAAO;AAC9E,oBAAM,OAAO,MAAM,UAAU,WAAW;AACxC,kBAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,UAAU,MAAM;AACvC,uBAAO,IAAI;AACX,uBAAO;AAAA,cACT;AAAA,YACF,WAAW,IAAI,WAAW,QAAQ;AAChC,oBAAM,KAAK,aAAa,WAAW,IAAI,QAAQ,EAAE;AAAA,YACnD;AAAA,UACF;AACA,cAAI,CAAC,MAAM;AACT,mBAAO;AACP,mBAAO,QAAQ,IAAI;AAAA,UACrB;AACA,iBAAO,EAAE;AAAA,QACX,UAAE;AACA,cAAI;AAAA,QACN;AACA,eAAO;AAAA,MACT;AAAA,MACA,SAAS;AACP,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;","names":["q","x","z","n","basis","flow"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/data/liquids.json","../src/liquids.ts","../src/math.ts","../src/landing.ts","../src/locale.ts","../src/shapes.ts","../src/stains.ts","../src/world.ts","../src/data/item-uses.json","../src/item-use.ts","../src/film/deposit.ts","../src/film/drops.ts","../src/film/simulate.ts","../src/film/sources.ts","../src/film/film.ts","../src/film/random.ts","../src/film/noise.ts","../src/film/layout.ts","../src/film/surface-layout.ts","../src/data/film-profiles.json","../src/film/profiles.ts"],"sourcesContent":["export { createFluids } from './world'\nexport { LIQUIDS } from './liquids'\nexport { ITEM_USES, createItemUse } from './item-use'\nexport type { HandTransform } from './item-use'\nexport { describeEvent, locales, resolveStrings } from './locale'\nexport type { FluidLocale, FluidStrings } from './locale'\nexport { ballistic, sampleStream } from './landing'\nexport { SAMPLES as STAIN_SAMPLES, stainDirection } from './stains'\nexport * from './film/index'\nexport type {\n ContainerSpec,\n ContainerState,\n FluidEvent,\n FluidOptions,\n FluidWorld,\n ItemUseDef,\n ItemUsePlayer,\n LiquidDef,\n LiquidId,\n Quat,\n SplashOptions,\n StainState,\n StainTint,\n StreamCause,\n StreamState,\n SurfaceSpec,\n TapSpec,\n TapState,\n Vec3,\n} from './types'\n","[\n {\n \"id\": \"water\",\n \"color\": 11064558,\n \"opacity\": 0.35,\n \"stainColor\": 7309206,\n \"viscosity\": 1,\n \"density\": 1000,\n \"dryTime\": 180,\n \"gloss\": 0.9,\n \"drink\": {\n \"thirst\": 100,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"clear\"\n ]\n },\n {\n \"id\": \"coffee\",\n \"color\": 3875604,\n \"opacity\": 0.95,\n \"stainColor\": 2824202,\n \"viscosity\": 1.5,\n \"density\": 1005,\n \"dryTime\": 900,\n \"gloss\": 0.8,\n \"leavesMark\": true,\n \"steamC\": 60,\n \"drink\": {\n \"thirst\": 80,\n \"effects\": [\n \"caffeine\"\n ]\n },\n \"tags\": [\n \"drink\",\n \"hot\"\n ]\n },\n {\n \"id\": \"tea\",\n \"color\": 9063188,\n \"opacity\": 0.8,\n \"stainColor\": 6961682,\n \"viscosity\": 1.4,\n \"density\": 1005,\n \"dryTime\": 800,\n \"gloss\": 0.8,\n \"leavesMark\": true,\n \"steamC\": 60,\n \"drink\": {\n \"thirst\": 90,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"hot\"\n ]\n },\n {\n \"id\": \"milk\",\n \"color\": 16052712,\n \"opacity\": 0.98,\n \"stainColor\": 14473160,\n \"viscosity\": 2,\n \"density\": 1030,\n \"dryTime\": 900,\n \"gloss\": 0.5,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 70,\n \"effects\": []\n },\n \"tags\": [\n \"drink\"\n ]\n },\n {\n \"id\": \"soda\",\n \"color\": 3808530,\n \"opacity\": 0.85,\n \"stainColor\": 2757901,\n \"viscosity\": 1.3,\n \"density\": 1040,\n \"dryTime\": 1200,\n \"gloss\": 0.85,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 60,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"sticky\"\n ]\n },\n {\n \"id\": \"juice\",\n \"color\": 15239467,\n \"opacity\": 0.9,\n \"stainColor\": 12741916,\n \"viscosity\": 2,\n \"density\": 1045,\n \"dryTime\": 1100,\n \"gloss\": 0.8,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 75,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"sticky\"\n ]\n },\n {\n \"id\": \"beer\",\n \"color\": 14259740,\n \"opacity\": 0.8,\n \"stainColor\": 11039764,\n \"viscosity\": 1.4,\n \"density\": 1010,\n \"dryTime\": 900,\n \"gloss\": 0.8,\n \"drink\": {\n \"thirst\": 50,\n \"effects\": [\n \"alcohol\"\n ]\n },\n \"tags\": [\n \"drink\",\n \"alcohol\"\n ]\n },\n {\n \"id\": \"wine\",\n \"color\": 7016223,\n \"opacity\": 0.9,\n \"stainColor\": 5048854,\n \"viscosity\": 1.6,\n \"density\": 990,\n \"dryTime\": 800,\n \"gloss\": 0.85,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 40,\n \"effects\": [\n \"alcohol\"\n ]\n },\n \"tags\": [\n \"drink\",\n \"alcohol\"\n ]\n },\n {\n \"id\": \"spirits\",\n \"color\": 13214042,\n \"opacity\": 0.6,\n \"stainColor\": 10320959,\n \"viscosity\": 1.8,\n \"density\": 940,\n \"dryTime\": 200,\n \"gloss\": 0.85,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 5,\n \"effects\": [\n \"alcohol\"\n ]\n },\n \"tags\": [\n \"drink\",\n \"alcohol\"\n ]\n },\n {\n \"id\": \"fuel\",\n \"color\": 14926682,\n \"opacity\": 0.6,\n \"stainColor\": 7232298,\n \"viscosity\": 0.6,\n \"density\": 740,\n \"dryTime\": 60,\n \"gloss\": 0.95,\n \"leavesMark\": false,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"fuel\",\n \"gasoline\"\n ]\n },\n {\n \"id\": \"diesel\",\n \"color\": 12098094,\n \"opacity\": 0.8,\n \"stainColor\": 5917208,\n \"viscosity\": 3,\n \"density\": 830,\n \"dryTime\": 3600,\n \"gloss\": 0.95,\n \"leavesMark\": true,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"fuel\"\n ]\n },\n {\n \"id\": \"motor_oil\",\n \"color\": 3877388,\n \"opacity\": 0.95,\n \"stainColor\": 1840134,\n \"viscosity\": 100,\n \"density\": 880,\n \"dryTime\": 0,\n \"gloss\": 1,\n \"leavesMark\": true,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"oil\"\n ]\n },\n {\n \"id\": \"cooking_oil\",\n \"color\": 14267708,\n \"opacity\": 0.85,\n \"stainColor\": 11110698,\n \"viscosity\": 60,\n \"density\": 920,\n \"dryTime\": 0,\n \"gloss\": 1,\n \"leavesMark\": true,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"oil\",\n \"food\"\n ]\n },\n {\n \"id\": \"blood\",\n \"color\": 7997964,\n \"opacity\": 0.92,\n \"stainColor\": 3874068,\n \"viscosity\": 4,\n \"density\": 1060,\n \"dryTime\": 600,\n \"gloss\": 0.75,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 10,\n \"effects\": [\n \"disgust\"\n ]\n },\n \"tags\": [\n \"organic\"\n ]\n },\n {\n \"id\": \"old_blood\",\n \"color\": 7085078,\n \"opacity\": 0.92,\n \"stainColor\": 2758158,\n \"viscosity\": 4,\n \"density\": 1060,\n \"dryTime\": 360,\n \"gloss\": 0.7,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 10,\n \"effects\": [\n \"disgust\"\n ]\n },\n \"tags\": [\n \"organic\"\n ]\n },\n {\n \"id\": \"bile\",\n \"color\": 9083434,\n \"opacity\": 0.9,\n \"stainColor\": 4080160,\n \"viscosity\": 6,\n \"density\": 1020,\n \"dryTime\": 900,\n \"gloss\": 0.75,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"disgust\"\n ]\n },\n \"tags\": [\n \"organic\"\n ]\n },\n {\n \"id\": \"sap\",\n \"color\": 13146940,\n \"opacity\": 0.8,\n \"stainColor\": 10122282,\n \"viscosity\": 200,\n \"density\": 1100,\n \"dryTime\": 3600,\n \"gloss\": 0.8,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 20,\n \"effects\": []\n },\n \"tags\": [\n \"organic\",\n \"sticky\"\n ]\n },\n {\n \"id\": \"acid\",\n \"color\": 10146378,\n \"opacity\": 0.6,\n \"stainColor\": 7313970,\n \"viscosity\": 1.5,\n \"density\": 1200,\n \"dryTime\": 900,\n \"gloss\": 0.9,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"corrosive\"\n ]\n },\n {\n \"id\": \"paint\",\n \"color\": 11740715,\n \"opacity\": 0.98,\n \"stainColor\": 9050655,\n \"viscosity\": 300,\n \"density\": 1300,\n \"dryTime\": 1800,\n \"gloss\": 0.6,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"paint\"\n ]\n },\n {\n \"id\": \"bleach\",\n \"color\": 15134688,\n \"opacity\": 0.7,\n \"stainColor\": 13621446,\n \"viscosity\": 1.2,\n \"density\": 1100,\n \"dryTime\": 900,\n \"gloss\": 0.85,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"corrosive\"\n ]\n },\n {\n \"id\": \"honey\",\n \"color\": 14193162,\n \"opacity\": 0.9,\n \"stainColor\": 12089350,\n \"viscosity\": 3000,\n \"density\": 1420,\n \"dryTime\": 14400,\n \"gloss\": 0.95,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 10,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"sticky\"\n ]\n }\n]","import liquidsData from './data/liquids.json'\nimport type { LiquidDef } from './types'\n\n/**\n * Built-in liquids (data in `data/liquids.json`; colours are `0xRRGGBB` stored as integers).\n * Viscosity is relative to water, density in kg/m³, `dryTime` in seconds for a thin film at 20 °C (0 = never dries).\n */\nexport const LIQUIDS: LiquidDef[] = liquidsData as unknown as LiquidDef[]\n","import type { Quat, Vec3 } from './types'\n\nexport const GRAVITY = 9.81\nexport const EPS = 1e-7\n\nexport const clamp = (v: number, lo: number, hi: number): number => (v < lo ? lo : v > hi ? hi : v)\nexport const lerp = (a: number, b: number, t: number): number => a + (b - a) * t\n\nexport const add = (a: Vec3, b: Vec3): Vec3 => [a[0] + b[0], a[1] + b[1], a[2] + b[2]]\nexport const sub = (a: Vec3, b: Vec3): Vec3 => [a[0] - b[0], a[1] - b[1], a[2] - b[2]]\nexport const scale = (a: Vec3, s: number): Vec3 => [a[0] * s, a[1] * s, a[2] * s]\nexport const dot = (a: Vec3, b: Vec3): number => a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\nexport const cross = (a: Vec3, b: Vec3): Vec3 => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]\nexport const length = (a: Vec3): number => Math.hypot(a[0], a[1], a[2])\nexport const distance = (a: Vec3, b: Vec3): number => Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2])\nexport const normalize = (a: Vec3, fallback: Vec3 = [0, 1, 0]): Vec3 => {\n const l = length(a)\n return l < 1e-9 ? [fallback[0], fallback[1], fallback[2]] : [a[0] / l, a[1] / l, a[2] / l]\n}\nexport const copy3 = (a: Vec3): Vec3 => [a[0], a[1], a[2]]\nexport const lerp3 = (a: Vec3, b: Vec3, t: number): Vec3 => [lerp(a[0], b[0], t), lerp(a[1], b[1], t), lerp(a[2], b[2], t)]\n\n/** Rotate `v` by the unit quaternion `q` (x, y, z, w). */\nexport const quatRotate = (q: Quat, v: Vec3): Vec3 => {\n const u: Vec3 = [q[0], q[1], q[2]]\n const c1 = cross(u, v)\n const c2 = cross(u, c1)\n return [v[0] + 2 * (q[3] * c1[0] + c2[0]), v[1] + 2 * (q[3] * c1[1] + c2[1]), v[2] + 2 * (q[3] * c1[2] + c2[2])]\n}\nexport const quatConjugate = (q: Quat): Quat => [-q[0], -q[1], -q[2], q[3]]\nexport const quatMultiply = (a: Quat, b: Quat): Quat => [\n a[3] * b[0] + a[0] * b[3] + a[1] * b[2] - a[2] * b[1],\n a[3] * b[1] - a[0] * b[2] + a[1] * b[3] + a[2] * b[0],\n a[3] * b[2] + a[0] * b[1] - a[1] * b[0] + a[2] * b[3],\n a[3] * b[3] - a[0] * b[0] - a[1] * b[1] - a[2] * b[2],\n]\nexport const quatNormalize = (q: Quat): Quat => {\n const l = Math.hypot(q[0], q[1], q[2], q[3])\n return l < 1e-9 ? [0, 0, 0, 1] : [q[0] / l, q[1] / l, q[2] / l, q[3] / l]\n}\n/** Quaternion from Euler angles in XYZ order (the same convention as three.js). */\nexport const quatFromEuler = (x: number, y: number, z: number): Quat => {\n const c1 = Math.cos(x / 2)\n const c2 = Math.cos(y / 2)\n const c3 = Math.cos(z / 2)\n const s1 = Math.sin(x / 2)\n const s2 = Math.sin(y / 2)\n const s3 = Math.sin(z / 2)\n return [s1 * c2 * c3 + c1 * s2 * s3, c1 * s2 * c3 - s1 * c2 * s3, c1 * c2 * s3 + s1 * s2 * c3, c1 * c2 * c3 - s1 * s2 * s3]\n}\n\n/** Small seeded generator (mulberry32). Its whole state is one integer, so it serialises trivially. */\nexport class Rng {\n state: number\n constructor(seed: number) {\n this.state = (Math.imul((seed | 0) ^ 0x9e3779b9, 0x85ebca6b) >>> 0) || 1\n }\n next(): number {\n this.state = (this.state + 0x6d2b79f5) >>> 0\n let t = this.state\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n","import type { StreamState, Vec3 } from './types'\nimport { dot, sub } from './math'\nimport type { Basis } from './stains'\n\nexport const GROUND_ID = 'ground'\n/** Longest flight simulated for a stream before it counts as landing nowhere. */\nexport const MAX_FLIGHT = 3\n\n/** Position of a ballistic jet `t` seconds after leaving its origin. */\nexport const ballistic = (origin: Vec3, velocity: Vec3, gravity: number, t: number): Vec3 => [\n origin[0] + velocity[0] * t,\n origin[1] + velocity[1] * t - 0.5 * gravity * t * t,\n origin[2] + velocity[2] * t,\n]\n\n/** Point of a stream's path `t` seconds after its origin (use with `StreamState.flightTime` and the world's `gravity`). */\nexport const sampleStream = (stream: Pick<StreamState, 'origin' | 'velocity'>, gravity: number, t: number): Vec3 =>\n ballistic(stream.origin, stream.velocity, gravity, t)\n\nexport interface LandingSurface extends Basis {\n id: string\n point: Vec3\n half: [number, number]\n}\n\nexport interface Hit {\n t: number\n point: Vec3\n normal: Vec3\n surface: string\n /** Velocity of the jet at impact. */\n velocity: Vec3\n}\n\nconst velocityAt = (velocity: Vec3, gravity: number, t: number): Vec3 => [velocity[0], velocity[1] - gravity * t, velocity[2]]\n\n/** First thing a jet hits: an authored surface (plane with half extents) or else the ground. */\nexport const trace = (\n surfaces: Iterable<LandingSurface>,\n groundAt: (x: number, z: number) => number,\n origin: Vec3,\n velocity: Vec3,\n gravity: number,\n): Hit | null => {\n let best: Hit | null = null\n for (const s of surfaces) {\n const n = s.normal\n const c = dot(n, sub(origin, s.point))\n if (c < -0.005) continue\n const a = -0.5 * gravity * n[1]\n const b = dot(n, velocity)\n let t = Infinity\n if (Math.abs(a) < 1e-9) {\n if (b < -1e-9) t = -c / b\n } else {\n const disc = b * b - 4 * a * c\n if (disc >= 0) {\n const sq = Math.sqrt(disc)\n for (const root of [(-b - sq) / (2 * a), (-b + sq) / (2 * a)]) {\n if (root >= -1e-6 && b + 2 * a * root < 0 && root < t) t = root\n }\n }\n }\n if (!Number.isFinite(t) || t > MAX_FLIGHT) continue\n t = Math.max(0, t)\n if (best && t >= best.t) continue\n const p = ballistic(origin, velocity, gravity, t)\n const rel = sub(p, s.point)\n if (Math.abs(dot(rel, s.t1)) > s.half[0] || Math.abs(dot(rel, s.t2)) > s.half[1]) continue\n best = { t, point: p, normal: n, surface: s.id, velocity: velocityAt(velocity, gravity, t) }\n }\n\n // Ground: march the path and refine the crossing.\n const step = 0.02\n let prevT = 0\n const startOver = origin[1] - groundAt(origin[0], origin[2])\n const limit = best ? best.t : MAX_FLIGHT\n if (startOver <= 0) {\n return best && best.t <= 0 ? best : { t: 0, point: [origin[0], groundAt(origin[0], origin[2]), origin[2]], normal: [0, 1, 0], surface: GROUND_ID, velocity }\n }\n for (let t = step; t <= limit + step; t += step) {\n const tt = Math.min(t, limit)\n const p = ballistic(origin, velocity, gravity, tt)\n const over = p[1] - groundAt(p[0], p[2])\n if (over <= 0) {\n let lo = prevT\n let hi = tt\n for (let i = 0; i < 18; i++) {\n const mid = (lo + hi) / 2\n const q = ballistic(origin, velocity, gravity, mid)\n if (q[1] - groundAt(q[0], q[2]) > 0) lo = mid\n else hi = mid\n }\n if (best && hi >= best.t - 1e-3) return best\n const q = ballistic(origin, velocity, gravity, hi)\n return { t: hi, point: [q[0], groundAt(q[0], q[2]), q[2]], normal: [0, 1, 0], surface: GROUND_ID, velocity: velocityAt(velocity, gravity, hi) }\n }\n prevT = tt\n if (tt >= limit) break\n }\n return best\n}\n","import type { FluidEvent, LiquidId } from './types'\n\n/** Locales shipped with the package. Unknown locales fall back to `en`. */\nexport type FluidLocale = 'en' | 'pt-BR'\n\nexport interface FluidStrings {\n /** Display name per liquid id (unknown ids fall back to the id itself). */\n liquids: Record<LiquidId, string>\n /** Short label per event type. */\n events: Record<FluidEvent['type'], string>\n on: string\n off: string\n}\n\nexport const locales: Record<FluidLocale, FluidStrings> = {\n en: {\n liquids: {\n water: 'water',\n coffee: 'coffee',\n tea: 'tea',\n milk: 'milk',\n soda: 'soda',\n juice: 'juice',\n beer: 'beer',\n wine: 'wine',\n spirits: 'spirits',\n fuel: 'gasoline',\n diesel: 'diesel',\n motor_oil: 'motor oil',\n cooking_oil: 'cooking oil',\n blood: 'blood',\n old_blood: 'old blood',\n bile: 'bile',\n sap: 'sap',\n acid: 'acid',\n paint: 'paint',\n bleach: 'bleach',\n honey: 'honey',\n },\n events: {\n fill: 'filled',\n pour: 'poured',\n spill: 'spilled',\n leak: 'leaking',\n drink: 'drank',\n empty: 'emptied',\n stream_end: 'stream ended',\n splash: 'splash',\n stain: 'stain',\n dried: 'dried',\n steam: 'steam',\n mix: 'mixed',\n tap: 'tap',\n },\n on: 'on',\n off: 'off',\n },\n 'pt-BR': {\n liquids: {\n water: 'água',\n coffee: 'café',\n tea: 'chá',\n milk: 'leite',\n soda: 'refrigerante',\n juice: 'suco',\n beer: 'cerveja',\n wine: 'vinho',\n spirits: 'destilado',\n fuel: 'gasolina',\n diesel: 'diesel',\n motor_oil: 'óleo de motor',\n cooking_oil: 'óleo de cozinha',\n blood: 'sangue',\n old_blood: 'sangue antigo',\n bile: 'bile',\n sap: 'seiva',\n acid: 'ácido',\n paint: 'tinta',\n bleach: 'água sanitária',\n honey: 'mel',\n },\n events: {\n fill: 'encheu',\n pour: 'despejou',\n spill: 'derramou',\n leak: 'vazando',\n drink: 'bebeu',\n empty: 'esvaziou',\n stream_end: 'parou de escorrer',\n splash: 'respingo',\n stain: 'mancha',\n dried: 'secou',\n steam: 'vapor',\n mix: 'misturou',\n tap: 'torneira',\n },\n on: 'ligado',\n off: 'desligado',\n },\n}\n\nexport const resolveStrings = (locale: string | undefined): FluidStrings => locales[(locale as FluidLocale) ?? 'en'] ?? locales.en\n\nconst fmt = (n: number): string => `${(Math.round(n * 1000) / 1000).toString()} l`\nconst pt = (p: [number, number, number]): string => `(${p.map((v) => Math.round(v * 100) / 100).join(', ')})`\n\n/** One-line description of an event for logs and debug panels, e.g. `drank: coffee 0.03 l`. */\nexport const describeEvent = (strings: FluidStrings, event: FluidEvent): string => {\n const label = strings.events[event.type]\n const name = (id: LiquidId) => strings.liquids[id] ?? id\n switch (event.type) {\n case 'fill':\n return `${label}: ${event.container} ${name(event.liquid)} ${fmt(event.liters)}`\n case 'pour':\n case 'spill':\n return `${label}: ${event.container} ${name(event.liquid)} ${fmt(event.rate)}/s`\n case 'leak':\n return `${label}: ${event.container} ${name(event.liquid)} ${fmt(event.rate)}/s ${pt(event.point)}`\n case 'drink':\n return `${label}: ${event.container} ${name(event.liquid)} ${fmt(event.liters)}${event.effects.length ? ` [${event.effects.join(', ')}]` : ''}${event.burn ? ' !' : ''}`\n case 'empty':\n return `${label}: ${event.container}`\n case 'stream_end':\n return `${label}: ${event.stream}`\n case 'splash':\n return `${label}: ${name(event.liquid)} ${pt(event.point)}`\n case 'stain':\n return `${label}: ${event.stain} ${name(event.liquid)} ${event.surface} ${pt(event.point)}`\n case 'dried':\n return `${label}: ${event.stain}${event.mark ? ' (mark)' : ''}`\n case 'steam':\n return `${label}: ${event.container} ${event.on ? strings.on : strings.off}`\n case 'mix':\n return `${label}: ${event.container} ${name(event.from)} -> ${name(event.into)}`\n case 'tap':\n return `${label}: ${event.tap} ${event.on ? strings.on : strings.off}`\n }\n}\n","import type { ContainerSpec, Vec3 } from './types'\nimport { clamp, normalize } from './math'\n\nexport type Shape = ContainerSpec['shape']\n\n/** Sample columns of a container's inner volume: equal-weight (x, z) positions with the full height `h`. */\nexport interface Columns {\n x: Float64Array\n z: Float64Array\n h: number\n /** Radius (cylinder) or half extents (box) used for the extent of a plane. */\n kind: 'cylinder' | 'box'\n r: number\n hx: number\n hz: number\n}\n\nconst RINGS = 8\nconst SEGMENTS = 16\nconst GRID = 12\n\nexport const makeColumns = (shape: Shape): Columns => {\n if (shape.kind === 'cylinder') {\n const x = new Float64Array(RINGS * SEGMENTS)\n const z = new Float64Array(RINGS * SEGMENTS)\n let n = 0\n for (let k = 0; k < RINGS; k++) {\n const rr = shape.radius * Math.sqrt((k + 0.5) / RINGS)\n for (let m = 0; m < SEGMENTS; m++) {\n // Offset every other ring so the samples do not line up radially.\n const a = ((m + (k % 2) * 0.5) / SEGMENTS) * Math.PI * 2\n x[n] = Math.cos(a) * rr\n z[n] = Math.sin(a) * rr\n n++\n }\n }\n return { x, z, h: shape.height, kind: 'cylinder', r: shape.radius, hx: shape.radius, hz: shape.radius }\n }\n const [sx, sy, sz] = shape.size\n const x = new Float64Array(GRID * GRID)\n const z = new Float64Array(GRID * GRID)\n let n = 0\n for (let i = 0; i < GRID; i++) {\n for (let j = 0; j < GRID; j++) {\n x[n] = ((i + 0.5) / GRID - 0.5) * sx\n z[n] = ((j + 0.5) / GRID - 0.5) * sz\n n++\n }\n }\n return { x, z, h: sy, kind: 'box', r: Math.hypot(sx, sz) / 2, hx: sx / 2, hz: sz / 2 }\n}\n\n/** Range of `u · p` over the container: below `lo` it is empty, above `hi` it is full. */\nexport const planeRange = (c: Columns, u: Vec3): [number, number] => {\n const horizontal = c.kind === 'cylinder' ? c.r * Math.hypot(u[0], u[2]) : Math.abs(u[0]) * c.hx + Math.abs(u[2]) * c.hz\n const top = u[1] * c.h\n return [-horizontal + Math.min(0, top), horizontal + Math.max(0, top)]\n}\n\n/** Fraction (0..1) of the inner volume with `u · p <= d` (the liquid for a surface plane with normal `u` at offset `d`). */\nexport const planeFraction = (c: Columns, u: Vec3, d: number): number => {\n const uy = u[1]\n let total = 0\n const n = c.x.length\n for (let i = 0; i < n; i++) {\n const s0 = u[0] * c.x[i] + u[2] * c.z[i]\n let len: number\n if (uy > 1e-6) len = clamp((d - s0) / uy, 0, c.h)\n else if (uy < -1e-6) len = c.h - clamp((d - s0) / uy, 0, c.h)\n else len = s0 <= d ? c.h : 0\n total += len\n }\n return total / (n * c.h)\n}\n\n/** Plane offset `d` along unit normal `u` for which the liquid takes the volume fraction `f`. */\nexport const levelFor = (c: Columns, u: Vec3, f: number): number => {\n const [lo0, hi0] = planeRange(c, u)\n if (f <= 0) return lo0\n if (f >= 1) return hi0\n if (Math.abs(u[0]) + Math.abs(u[2]) < 1e-9) {\n return u[1] > 0 ? f * c.h * u[1] : u[1] * c.h - f * c.h * u[1]\n }\n let lo = lo0\n let hi = hi0\n for (let i = 0; i < 28; i++) {\n const mid = (lo + hi) / 2\n if (planeFraction(c, u, mid) < f) lo = mid\n else hi = mid\n }\n return (lo + hi) / 2\n}\n\n/** Radius of the lip circle (the opening); a closed spec (`opening` 0) uses half the container width once opened. */\nexport const lipRadius = (shape: Shape, opening: number): number => {\n const limit = shape.kind === 'cylinder' ? shape.radius : Math.min(shape.size[0], shape.size[2]) / 2\n return opening > 0 ? Math.min(opening, limit) : limit * 0.5\n}\n\nexport const shapeHeight = (shape: Shape): number => (shape.kind === 'cylinder' ? shape.height : shape.size[1])\n\nexport interface Lip {\n /** Lowest lip point along the surface normal, container space. */\n point: Vec3\n /** Centre of the lip circle, container space. */\n center: Vec3\n /** Outward direction (container space, horizontal in the container frame) the liquid leaves along, or null when upright. */\n outward: Vec3 | null\n /** `u · point`: the surface offset above which the liquid spills. */\n level: number\n}\n\nexport const lipOf = (shape: Shape, opening: number, u: Vec3): Lip => {\n const h = shapeHeight(shape)\n const ro = lipRadius(shape, opening)\n const center: Vec3 = [0, h, 0]\n const uh = Math.hypot(u[0], u[2])\n if (uh < 1e-6) return { point: center, center, outward: null, level: u[1] * h }\n const out: Vec3 = normalize([-u[0], 0, -u[2]])\n const point: Vec3 = [out[0] * ro, h, out[2] * ro]\n return { point, center, outward: out, level: u[0] * point[0] + u[1] * point[1] + u[2] * point[2] }\n}\n","import type { LiquidDef, StainState, Vec3 } from './types'\nimport { Rng, add, clamp, cross, dot, length, normalize, scale, sub } from './math'\n\n/** Number of radial samples of the flow front. */\nexport const SAMPLES = 16\n\nconst COS: number[] = []\nconst SIN: number[] = []\nfor (let i = 0; i < SAMPLES; i++) {\n COS.push(Math.cos((i / SAMPLES) * Math.PI * 2))\n SIN.push(Math.sin((i / SAMPLES) * Math.PI * 2))\n}\n\n/** Orthonormal frame of a surface: `normal`, `t1` (tangent) and `t2 = normal × t1`. */\nexport interface Basis {\n normal: Vec3\n t1: Vec3\n t2: Vec3\n}\n\nexport const makeBasis = (normalIn: Vec3, tangentIn?: Vec3): Basis => {\n const normal = normalize(normalIn)\n const ref: Vec3 = tangentIn && length(tangentIn) > 1e-6 ? tangentIn : Math.abs(normal[1]) > 0.9 ? [1, 0, 0] : [0, 1, 0]\n const t1 = normalize(sub(ref, scale(normal, dot(ref, normal))), [1, 0, 0])\n return { normal, t1, t2: cross(normal, t1) }\n}\n\n/** What a stain needs to know about the surface it lies on. */\nexport interface StainSurface extends Basis {\n point: Vec3\n half: [number, number]\n porosity: number\n}\n\nexport interface StainInt extends StainState {\n normal: Vec3\n tangent: Vec3\n noise: number[]\n /** Seconds since the last inflow. */\n sinceInflow: number\n /** Drying progress 0..1. */\n dry: number\n mark: boolean\n age: number\n}\n\n/** Direction (world space) of radial sample `i` on a surface frame. */\nexport const sampleDir = (b: Basis, i: number): Vec3 => [\n b.t1[0] * COS[i] + b.t2[0] * SIN[i],\n b.t1[1] * COS[i] + b.t2[1] * SIN[i],\n b.t1[2] * COS[i] + b.t2[2] * SIN[i],\n]\n\nexport const stainArea = (front: number[]): number => {\n let a = 0\n for (let i = 0; i < SAMPLES; i++) a += front[i] * front[(i + 1) % SAMPLES]\n return 0.5 * Math.sin((Math.PI * 2) / SAMPLES) * a\n}\n\nexport const meanRadius = (front: number[]): number => front.reduce((s, v) => s + v, 0) / front.length\n\n/** Thickness (m) a puddle of this liquid cannot get thinner than: 1 mm for water, thicker for viscous liquids. */\nexport const minFilm = (def: LiquidDef): number => 0.001 * (1 + 0.8 * Math.log10(Math.max(1, def.viscosity)))\n\n/** Per-direction growth multipliers: low harmonics plus smoothed seeded noise, so the outline is never a disc. */\nexport const makeNoise = (rng: Rng): number[] => {\n const amp = [0.12 + rng.next() * 0.18, 0.08 + rng.next() * 0.14, 0.05 + rng.next() * 0.08]\n const phase = [rng.next() * Math.PI * 2, rng.next() * Math.PI * 2, rng.next() * Math.PI * 2]\n const raw: number[] = []\n for (let i = 0; i < SAMPLES; i++) {\n const a = (i / SAMPLES) * Math.PI * 2\n let v = 1 + (rng.next() - 0.5) * 0.3\n for (let k = 0; k < 3; k++) v += amp[k] * Math.sin((k + 2) * a + phase[k])\n raw.push(v)\n }\n const out = raw.map((v, i) => 0.25 * raw[(i + SAMPLES - 1) % SAMPLES] + 0.5 * v + 0.25 * raw[(i + 1) % SAMPLES])\n return out.map((v) => clamp(v, 0.45, 1.7))\n}\n\n/** Horizontal run direction on a surface (downhill, unit, in the plane) and the slope strength 0..1 (sin of the angle). */\nexport const downhill = (normal: Vec3): { dir: Vec3; slope: number } => {\n const d = add([0, -1, 0], scale(normal, normal[1]))\n const slope = length(d)\n return slope < 1e-6 ? { dir: [0, 0, 0], slope: 0 } : { dir: scale(d, 1 / slope), slope }\n}\n\n/** Creates a stain at `center` (on the surface) with a small starting front. */\nexport const createStain = (\n id: string,\n surfaceId: string,\n def: LiquidDef,\n basis: Basis,\n center: Vec3,\n liters: number,\n rng: Rng,\n): StainInt => {\n const r0 = clamp(Math.sqrt(liters / 1000 / minFilm(def) / Math.PI) * 0.4, 0.012, 0.12)\n return {\n id,\n surface: surfaceId,\n liquid: def.id,\n center: [center[0], center[1], center[2]],\n front: new Array(SAMPLES).fill(r0),\n liters,\n soaked: 0,\n wetness: 1,\n wetRadius: 1,\n normal: basis.normal,\n tangent: basis.t1,\n noise: makeNoise(rng),\n sinceInflow: 0,\n dry: 0,\n mark: false,\n age: 0,\n }\n}\n\n/** Adds liquid to a stain (rewets a dried mark). `velocity` makes the front stretch the way the liquid came in. */\nexport const addInflow = (s: StainInt, liters: number, velocity: Vec3 | null): void => {\n s.liters += liters\n s.sinceInflow = 0\n if (s.dry > 0 || s.mark) {\n s.dry = 0\n s.mark = false\n s.wetness = 1\n s.wetRadius = 1\n }\n if (velocity) {\n const n = s.normal\n const tangential = sub(velocity, scale(n, dot(velocity, n)))\n if (length(tangential) > 0.2) s.flow = normalize(tangential)\n }\n}\n\n/** Moves the centre towards an inflow point without moving the outline. */\nexport const nudgeCenter = (s: StainInt, point: Vec3, weight: number, basis: Basis): void => {\n const delta = scale(sub(point, s.center), weight)\n if (length(delta) < 1e-6) return\n s.center = add(s.center, delta)\n for (let i = 0; i < SAMPLES; i++) s.front[i] = Math.max(0.008, s.front[i] - dot(delta, sampleDir(basis, i)))\n}\n\nexport type StainStatus = 'alive' | 'dried_mark' | 'dried_gone'\n\n/** Largest radius along each sample direction before the centre's surface rectangle ends. */\nconst edgeLimit = (s: StainInt, surface: StainSurface, i: number): number => {\n if (!Number.isFinite(surface.half[0]) && !Number.isFinite(surface.half[1])) return Infinity\n const rel = sub(s.center, surface.point)\n const cx = dot(rel, surface.t1)\n const cy = dot(rel, surface.t2)\n let limit = Infinity\n if (COS[i] > 1e-6) limit = Math.min(limit, (surface.half[0] - cx) / COS[i])\n else if (COS[i] < -1e-6) limit = Math.min(limit, (-surface.half[0] - cx) / COS[i])\n if (SIN[i] > 1e-6) limit = Math.min(limit, (surface.half[1] - cy) / SIN[i])\n else if (SIN[i] < -1e-6) limit = Math.min(limit, (-surface.half[1] - cy) / SIN[i])\n return Math.max(0.01, limit)\n}\n\n/**\n * Advances a stain: the front grows (faster downhill, with seeded noise, tapering as the area approaches what the liquid can cover at its\n * minimum film thickness), porous surfaces soak the pool, and once the inflow stopped the stain dries from the edge in.\n */\nexport const stepStain = (s: StainInt, def: LiquidDef, surface: StainSurface, ambientC: number, dt: number): StainStatus => {\n s.age += dt\n s.sinceInflow += dt\n const basis: Basis = surface\n const { dir: down, slope } = downhill(s.normal)\n\n // Soak into porous surfaces.\n if (s.liters > 0 && surface.porosity > 0) {\n const soak = Math.min(s.liters, surface.porosity * 0.2 * stainArea(s.front) * dt)\n s.liters -= soak\n s.soaked += soak\n }\n\n // Grow the flow front.\n if (s.liters > 1e-7 && s.wetness > 0) {\n const area = stainArea(s.front)\n const cover = s.liters / 1000 / (minFilm(def) * (1 - 0.7 * slope))\n if (area < cover) {\n const taper = clamp(1 - area / cover, 0, 1)\n const v0 = (0.02 + 0.2 * Math.sqrt(s.liters)) / Math.sqrt(Math.max(1, def.viscosity))\n const delta: number[] = []\n for (let i = 0; i < SAMPLES; i++) {\n let m = s.noise[i]\n if (s.flow) m *= 1 + 0.5 * Math.max(0, dot(sampleDir(basis, i), s.flow))\n if (slope > 0.02) {\n const a = dot(sampleDir(basis, i), down)\n m *= a > 0 ? 1 + 14 * slope * a : Math.max(0.1, 1 + 2.5 * slope * a)\n }\n delta.push(Math.max(0, Math.min(s.front[i] + v0 * m * taper * dt, edgeLimit(s, surface, i)) - s.front[i]))\n }\n // Never overshoot the area the liquid can cover: scale the growth (not the outline) down to fit.\n let lambda = 1\n const apply = (k: number) => s.front.map((r, i) => r + delta[i] * k)\n if (stainArea(apply(1)) > cover) {\n let lo = 0\n let hi = 1\n for (let i = 0; i < 14; i++) {\n const mid = (lo + hi) / 2\n if (stainArea(apply(mid)) > cover) hi = mid\n else lo = mid\n }\n lambda = lo\n }\n s.front = apply(lambda)\n }\n }\n\n // Dry from the edge in once the inflow stopped.\n if (s.sinceInflow > 1 && def.dryTime > 0 && s.dry < 1) {\n const warm = Math.pow(2, (ambientC - 20) / 12)\n const ds = (dt * warm * (1 + 0.5 * surface.porosity)) / def.dryTime\n const before = s.dry\n s.dry = Math.min(1, s.dry + ds)\n if (before < 1) s.liters *= 1 - (s.dry - before) / (1 - before)\n s.wetness = 1 - s.dry\n s.wetRadius = Math.sqrt(Math.max(0, 1 - s.dry))\n if (s.dry >= 1) {\n s.liters = 0\n s.wetness = 0\n s.wetRadius = 0\n if (def.leavesMark) {\n s.mark = true\n return 'dried_mark'\n }\n return 'dried_gone'\n }\n }\n return 'alive'\n}\n\n/** Unit direction (world space) of front sample `i` of a stain, from its `normal` and `tangent`. */\nexport const stainDirection = (s: Pick<StainState, 'normal' | 'tangent'>, i: number): Vec3 => sampleDir(makeBasis(s.normal ?? [0, 1, 0], s.tangent), i)\n","import { LIQUIDS } from './liquids'\nimport { GROUND_ID, MAX_FLIGHT, ballistic, trace } from './landing'\nimport type { Hit, LandingSurface } from './landing'\nimport { describeEvent, resolveStrings } from './locale'\nimport { GRAVITY, Rng, add, clamp, copy3, cross, distance, dot, length, normalize, quatConjugate, quatRotate, scale } from './math'\nimport { levelFor, lipOf, lipRadius, makeColumns, planeFraction, planeRange, shapeHeight } from './shapes'\nimport type { Columns } from './shapes'\nimport { addInflow, createStain, makeBasis, meanRadius, nudgeCenter, stepStain } from './stains'\nimport type { Basis, StainInt, StainSurface } from './stains'\nimport type {\n ContainerSpec,\n ContainerState,\n FluidEvent,\n FluidOptions,\n FluidWorld,\n LiquidDef,\n LiquidId,\n Quat,\n StainState,\n StainTint,\n StreamCause,\n StreamState,\n SurfaceSpec,\n Vec3,\n} from './types'\n\ninterface Hole {\n point: Vec3\n normal: Vec3\n diameter: number\n}\n\ninterface ContainerInt {\n id: string\n spec: ContainerSpec\n cols: Columns\n liquid: LiquidId | null\n liters: number\n temperature: number\n closed: boolean\n position: Vec3\n rotation: Quat\n velocity: Vec3\n prevVelocity: Vec3\n hasPrev: boolean\n holes: Hole[]\n /** Slosh of the liquid surface: tilt offsets and their rates (x, z, vx, vz). */\n slosh: [number, number, number, number]\n /** Surface normal in world space (up plus slosh) and in container space, and the surface offset along it. */\n normal: Vec3\n u: Vec3\n d: number\n steaming: boolean\n outflow: number\n /** Stream key (`spill`, `pour`, `leak:<n>`) to stream id. */\n streams: Record<string, string>\n pourRate: number\n pourTTL: number\n pourVisual: boolean\n lastMix: number\n}\n\ninterface TapInt {\n id: string\n position: Vec3\n direction: Vec3\n liquid: LiquidId\n rate: number\n temperature: number\n on: boolean\n stream?: string\n}\n\ninterface StreamInt extends StreamState {\n key: string\n lastSplash: number\n visualOnly: boolean\n temperature: number\n}\n\ninterface SurfaceInt extends SurfaceSpec, StainSurface {}\n\ninterface Snapshot {\n version: 1\n time: number\n rng: number\n counters: { container: number; stream: number; stain: number; tap?: number }\n taps?: TapInt[]\n containers: Array<Omit<ContainerInt, 'cols'>>\n surfaces: SurfaceSpec[]\n streams: StreamInt[]\n stains: StainInt[]\n}\n\nconst GROUND_POROSITY = 0.2\nconst MAX_STEP = 0.1\nconst MAX_SUBSTEPS = 50\nconst MAX_HOLES = 32\n\nconst clone = <T>(v: T): T => JSON.parse(JSON.stringify(v)) as T\n\nexport function createFluids(options: FluidOptions = {}): FluidWorld {\n const strings = resolveStrings(options.locale)\n const liquids = new Map<LiquidId, LiquidDef>()\n for (const def of LIQUIDS) liquids.set(def.id, def)\n for (const def of options.liquids ?? []) liquids.set(def.id, def)\n const ambientC = options.ambientC ?? 20\n const gravity = options.gravity ?? GRAVITY\n const groundAt = options.groundAt ?? (() => 0)\n const mergeDistance = options.mergeDistance ?? 0.15\n const maxStains = options.maxStains ?? 64\n\n let rng = new Rng(options.seed ?? 1)\n let time = 0\n const counters = { container: 0, stream: 0, stain: 0, tap: 0 }\n let containers = new Map<string, ContainerInt>()\n let surfaces = new Map<string, SurfaceInt>()\n let streams = new Map<string, StreamInt>()\n let taps = new Map<string, TapInt>()\n let stains = new Map<string, StainInt>()\n const listeners = new Map<string, Set<(e: FluidEvent) => void>>()\n let queue: FluidEvent[] = []\n /** Only events produced by `update` are queued and returned by it; direct calls just notify the listeners. */\n let updating = false\n\n const groundSurface: StainSurface = {\n normal: [0, 1, 0],\n t1: [1, 0, 0],\n t2: [0, 0, -1],\n point: [0, 0, 0],\n half: [Infinity, Infinity],\n porosity: GROUND_POROSITY,\n }\n\n // ---- events ----\n\n const emit = (e: FluidEvent): void => {\n if (updating) queue.push(e)\n options.onEvent?.(e)\n listeners.get(e.type)?.forEach((fn) => fn(e))\n listeners.get('*')?.forEach((fn) => fn(e))\n }\n\n // ---- helpers ----\n\n const toWorld = (c: ContainerInt, p: Vec3): Vec3 => add(c.position, quatRotate(c.rotation, p))\n const defOf = (c: ContainerInt): LiquidDef | null => (c.liquid ? (liquids.get(c.liquid) ?? null) : null)\n const viscScale = (def: LiquidDef): number => 1 / Math.sqrt(Math.max(1, def.viscosity))\n\n const refreshLevel = (c: ContainerInt): void => {\n c.normal = normalize([c.slosh[0], 1, c.slosh[1]])\n c.u = normalize(quatRotate(quatConjugate(c.rotation), c.normal))\n c.d = levelFor(c.cols, c.u, c.spec.capacity > 0 ? c.liters / c.spec.capacity : 0)\n }\n\n const surfaceFor = (id: string): StainSurface => (id === GROUND_ID ? groundSurface : (surfaces.get(id) ?? groundSurface))\n\n const landingSurfaces = (): LandingSurface[] => {\n const list: LandingSurface[] = []\n for (const [id, s] of surfaces) list.push({ id, normal: s.normal, t1: s.t1, t2: s.t2, point: s.point, half: s.half })\n return list\n }\n\n const stopStream = (id: string): void => {\n const s = streams.get(id)\n if (!s) return\n streams.delete(id)\n const c = s.container ? containers.get(s.container) : undefined\n if (c) delete c.streams[s.key]\n const tap = s.tap ? taps.get(s.tap) : undefined\n if (tap && tap.stream === id) tap.stream = undefined\n emit({ type: 'stream_end', stream: id })\n }\n\n const endStreamKey = (c: ContainerInt, key: string): void => {\n const id = c.streams[key]\n if (id) stopStream(id)\n }\n\n /** Create or update the stream under `key` of a container; creating one emits the matching cause event. */\n const syncStream = (\n c: ContainerInt,\n key: string,\n cause: StreamCause,\n rate: number,\n origin: Vec3,\n velocity: Vec3,\n visualOnly = false,\n ): void => {\n if (rate < 1e-5 || !c.liquid) {\n endStreamKey(c, key)\n return\n }\n const existing = c.streams[key] ? streams.get(c.streams[key]) : undefined\n if (existing) {\n existing.rate = rate\n existing.origin = origin\n existing.velocity = velocity\n existing.thin = rate < 0.04\n existing.visualOnly = visualOnly\n existing.temperature = c.temperature\n return\n }\n const id = `stream_${++counters.stream}`\n const stream: StreamInt = {\n id,\n liquid: c.liquid,\n cause,\n container: c.id,\n origin,\n velocity,\n rate,\n landing: null,\n thin: rate < 0.04,\n flightTime: MAX_FLIGHT,\n key,\n lastSplash: -1,\n visualOnly,\n temperature: c.temperature,\n }\n streams.set(id, stream)\n c.streams[key] = id\n if (cause === 'leak') emit({ type: 'leak', container: c.id, liquid: c.liquid, rate, stream: id, point: copy3(origin) })\n else if (cause === 'spill') emit({ type: 'spill', container: c.id, liquid: c.liquid, rate, stream: id })\n else emit({ type: 'pour', container: c.id, liquid: c.liquid, rate, stream: id })\n }\n\n /** Speed (m/s) at which a tap's liquid leaves the nozzle. */\n const TAP_SPEED = 1.2\n\n /** Create or update the `tap` stream of a tap that is on; end it when it is off. */\n const syncTap = (t: TapInt): void => {\n if (!t.on || t.rate < 1e-5 || !liquids.has(t.liquid)) {\n if (t.stream) stopStream(t.stream)\n return\n }\n const velocity: Vec3 = [t.direction[0] * TAP_SPEED, t.direction[1] * TAP_SPEED, t.direction[2] * TAP_SPEED]\n const existing = t.stream ? streams.get(t.stream) : undefined\n if (existing) {\n existing.rate = t.rate\n existing.thin = t.rate < 0.04\n existing.temperature = t.temperature\n existing.velocity = velocity\n return\n }\n const id = `stream_${++counters.stream}`\n streams.set(id, {\n id,\n liquid: t.liquid,\n cause: 'tap',\n tap: t.id,\n origin: copy3(t.position),\n velocity,\n rate: t.rate,\n landing: null,\n thin: t.rate < 0.04,\n flightTime: MAX_FLIGHT,\n key: `tap:${t.id}`,\n lastSplash: -1,\n visualOnly: false,\n temperature: t.temperature,\n })\n t.stream = id\n }\n\n /** Where and how fast the liquid leaves over the lowest lip point. */\n const lipFlow = (c: ContainerInt, head: number): { origin: Vec3; velocity: Vec3 } => {\n const lip = lipOf(c.spec.shape, c.spec.opening, c.u)\n const origin = toWorld(c, lip.point)\n let dir: Vec3 = [1, 0, 0]\n const horizontal = (v: Vec3): Vec3 | null => (Math.hypot(v[0], v[2]) > 1e-3 ? normalize([v[0], 0, v[2]]) : null)\n if (lip.outward) dir = horizontal(quatRotate(c.rotation, lip.outward)) ?? horizontal(quatRotate(c.rotation, [1, 0, 0])) ?? dir\n else dir = horizontal(quatRotate(c.rotation, [1, 0, 0])) ?? dir\n const speed = clamp(0.3 + 0.5 * Math.sqrt(2 * gravity * Math.max(0, head)), 0.2, 2.5)\n return { origin, velocity: [dir[0] * speed, -0.1, dir[2] * speed] }\n }\n\n const removeLiters = (c: ContainerInt, amount: number): void => {\n c.liters = Math.max(0, c.liters - amount)\n }\n\n /** Clear a container that ran out and emit `empty` once. */\n const settle = (c: ContainerInt): void => {\n if (c.liquid && c.liters <= 1e-6) {\n c.liters = 0\n c.liquid = null\n emit({ type: 'empty', container: c.id })\n }\n }\n\n const fillInternal = (c: ContainerInt, liquid: LiquidId, liters: number, temperature: number | undefined, announce: boolean): number => {\n if (!(liters > 0) || !liquids.has(liquid)) return 0\n const room = c.spec.capacity - c.liters\n const accepted = Math.min(liters, Math.max(0, room))\n if (accepted <= 0) return 0\n const t = temperature ?? ambientC\n if (c.liquid && c.liquid !== liquid && c.liters > 1e-6) {\n const incomingWins = accepted > c.liters\n const into = incomingWins ? liquid : c.liquid\n const from = incomingWins ? c.liquid : liquid\n if (announce || time - c.lastMix > 0.5) {\n c.lastMix = time\n emit({ type: 'mix', container: c.id, from, into })\n }\n c.liquid = into\n } else if (!c.liquid || c.liters <= 1e-6) {\n c.liquid = liquid\n }\n c.temperature = c.liters > 1e-6 ? (c.temperature * c.liters + t * accepted) / (c.liters + accepted) : t\n c.liters += accepted\n if (announce) emit({ type: 'fill', container: c.id, liquid, liters: accepted })\n return accepted\n }\n\n // ---- stains ----\n\n const stainAt = (surfaceId: string, liquid: LiquidId, point: Vec3): StainInt | null => {\n let best: StainInt | null = null\n let bestD = Infinity\n for (const s of stains.values()) {\n if (s.surface !== surfaceId || s.liquid !== liquid) continue\n const d = distance(point, s.center)\n if (d < mergeDistance + 0.5 * meanRadius(s.front) && d < bestD) {\n best = s\n bestD = d\n }\n }\n return best\n }\n\n const evictStain = (): void => {\n let victim: StainInt | null = null\n for (const s of stains.values()) {\n const rank = (x: StainInt) => (x.wetness <= 0 ? 0 : 1) * 1e9 - x.age\n if (!victim || rank(s) < rank(victim)) victim = s\n }\n if (victim) stains.delete(victim.id)\n }\n\n const deposit = (liquid: LiquidId, hit: Pick<Hit, 'point' | 'surface' | 'normal'>, liters: number, velocity: Vec3 | null, tint?: StainTint): void => {\n const def = liquids.get(liquid)\n if (!def || liters <= 0) return\n let s = stainAt(hit.surface, liquid, hit.point)\n if (s) {\n const basis: Basis = { normal: s.normal, t1: s.tangent, t2: cross(s.normal, s.tangent) }\n nudgeCenter(s, hit.point, clamp((liters / (s.liters + liters)) * 0.5, 0, 0.5), basis)\n addInflow(s, liters, velocity)\n if (tint) s.tint = { ...tint }\n return\n }\n while (stains.size >= maxStains) evictStain()\n const surface = surfaceFor(hit.surface)\n const basis: Basis = hit.surface === GROUND_ID ? makeBasis(hit.normal) : surface\n s = createStain(`stain_${++counters.stain}`, hit.surface, def, basis, hit.point, liters, rng)\n if (velocity) addInflow(s, 0, velocity)\n if (tint) s.tint = { ...tint }\n s.sinceInflow = 0\n stains.set(s.id, s)\n emit({ type: 'stain', stain: s.id, surface: hit.surface, liquid, point: copy3(hit.point) })\n }\n\n // ---- streams ----\n\n const lipCenterWorld = (c: ContainerInt): Vec3 => toWorld(c, [0, shapeHeight(c.spec.shape), 0])\n\n /** A container whose opening the jet passes through before it lands (pouring into a cup). */\n const catcher = (s: StreamInt, landingT: number): { container: ContainerInt; t: number; point: Vec3 } | null => {\n let best: { container: ContainerInt; t: number; point: Vec3 } | null = null\n for (const oc of containers.values()) {\n if (oc.id === s.container || oc.closed || oc.liters >= oc.spec.capacity) continue\n const lip = lipCenterWorld(oc)\n const disc = s.velocity[1] * s.velocity[1] - 2 * gravity * (lip[1] - s.origin[1])\n if (disc < 0) continue\n const t = (s.velocity[1] + Math.sqrt(disc)) / gravity\n if (t <= 0 || t >= landingT || (best && t >= best.t)) continue\n const p = ballistic(s.origin, s.velocity, gravity, t)\n if (Math.hypot(p[0] - lip[0], p[2] - lip[2]) <= lipRadius(oc.spec.shape, oc.spec.opening) + 0.01) best = { container: oc, t, point: p }\n }\n return best\n }\n\n const stepStream = (s: StreamInt, dt: number): void => {\n const hit = trace(landingSurfaces(), groundAt, s.origin, s.velocity, gravity)\n const caught = catcher(s, hit ? hit.t : MAX_FLIGHT)\n if (caught) {\n s.landing = caught.point\n s.flightTime = caught.t\n if (!s.visualOnly) fillInternal(caught.container, s.liquid, s.rate * dt, s.temperature, false)\n return\n }\n s.landing = hit ? copy3(hit.point) : null\n s.flightTime = hit ? hit.t : MAX_FLIGHT\n if (!hit || s.visualOnly) return\n const speed = length(hit.velocity)\n if (time - s.lastSplash >= 0.12) {\n s.lastSplash = time\n emit({ type: 'splash', liquid: s.liquid, point: copy3(hit.point), intensity: clamp(0.15 + s.rate * 1.2 + speed * 0.05, 0, 1) })\n }\n deposit(s.liquid, hit, s.rate * dt, hit.velocity)\n }\n\n // ---- containers ----\n\n const spillRate = (c: ContainerInt, def: LiquidDef, h: number): number => {\n const ro = lipRadius(c.spec.shape, c.spec.opening)\n const area = 2 * ro * Math.min(h, ro)\n return Math.max(0.6 * area * Math.sqrt(2 * gravity * h) * 1000 * viscScale(def), 0.004)\n }\n\n const steamThreshold = (def: LiquidDef): number => def.steamC ?? (def.drink && def.drink.thirst > 0 ? 60 : Infinity)\n\n const stepContainer = (c: ContainerInt, dt: number): void => {\n // Slosh: the surface tilts towards the horizontal acceleration and settles with a damped spring.\n if (c.hasPrev && dt > 0) {\n const ax = (c.velocity[0] - c.prevVelocity[0]) / dt\n const az = (c.velocity[2] - c.prevVelocity[2]) / dt\n const tx = clamp(ax / gravity, -0.35, 0.35)\n const tz = clamp(az / gravity, -0.35, 0.35)\n const w = 9\n const z = 0.12\n c.slosh[2] += (w * w * (tx - c.slosh[0]) - 2 * z * w * c.slosh[2]) * dt\n c.slosh[3] += (w * w * (tz - c.slosh[1]) - 2 * z * w * c.slosh[3]) * dt\n } else {\n c.slosh[2] *= 0.5\n c.slosh[3] *= 0.5\n }\n c.slosh[0] += c.slosh[2] * dt\n c.slosh[1] += c.slosh[3] * dt\n if (Math.abs(c.slosh[0]) + Math.abs(c.slosh[1]) + Math.abs(c.slosh[2]) + Math.abs(c.slosh[3]) < 1e-5) c.slosh = [0, 0, 0, 0]\n c.prevVelocity = copy3(c.velocity)\n c.hasPrev = true\n\n // Cooling towards ambient (insulated containers 10× slower).\n if (c.temperature !== ambientC) {\n const tau = (600 + 2400 * c.liters) * (c.spec.insulated ? 10 : 1)\n c.temperature = ambientC + (c.temperature - ambientC) * Math.exp(-dt / tau)\n if (Math.abs(c.temperature - ambientC) < 0.01) c.temperature = ambientC\n }\n\n refreshLevel(c)\n const def = defOf(c)\n\n const steaming = !!def && c.liters > 1e-6 && !c.closed && c.temperature > steamThreshold(def)\n if (steaming !== c.steaming) {\n c.steaming = steaming\n emit({ type: 'steam', container: c.id, on: steaming })\n }\n\n c.outflow = 0\n if (!def || c.liters <= 1e-6) {\n for (const key of Object.keys(c.streams)) endStreamKey(c, key)\n c.pourTTL = 0\n settle(c)\n return\n }\n\n // Pour (driven by `pour()`), else spill over the lip when the tilted surface rises above it.\n if (c.pourTTL > 0) {\n c.pourTTL -= dt\n if (c.pourTTL > 0) {\n const flow = lipFlow(c, 0.05)\n syncStream(c, 'pour', 'pour', c.pourRate, flow.origin, flow.velocity, c.pourVisual)\n c.outflow += c.pourRate\n } else endStreamKey(c, 'pour')\n endStreamKey(c, 'spill')\n } else {\n endStreamKey(c, 'pour')\n const lip = lipOf(c.spec.shape, c.spec.opening, c.u)\n const h = c.d - lip.level\n let handled = false\n if (!c.closed && h > 1e-5) {\n const excess = c.liters - c.spec.capacity * planeFraction(c.cols, c.u, lip.level)\n if (excess > 1e-6) {\n const rate = Math.min(spillRate(c, def, h), excess / Math.max(dt, 1e-6))\n removeLiters(c, Math.min(rate * dt, excess, c.liters))\n const flow = lipFlow(c, h)\n syncStream(c, 'spill', 'spill', rate, flow.origin, flow.velocity)\n c.outflow += rate\n handled = true\n }\n }\n if (!handled) endStreamKey(c, 'spill')\n }\n\n // Holes leak by Torricelli with the head above each hole.\n for (let i = 0; i < c.holes.length; i++) {\n const hole = c.holes[i]\n const key = `leak:${i}`\n const hh = dot(c.u, hole.point)\n const head = c.d - hh\n if (c.liters > 1e-6 && head > 1e-4) {\n const area = Math.PI * (hole.diameter / 2) ** 2\n const natural = 0.6 * area * Math.sqrt(2 * gravity * head) * 1000 * viscScale(def)\n const avail = c.liters - c.spec.capacity * planeFraction(c.cols, c.u, hh)\n if (avail > 1e-7) {\n const rate = Math.min(natural, avail / Math.max(dt, 1e-6))\n removeLiters(c, Math.min(rate * dt, avail))\n const nW = normalize(quatRotate(c.rotation, hole.normal))\n const v = Math.min(3, 0.6 * Math.sqrt(2 * gravity * head))\n syncStream(c, key, 'leak', rate, toWorld(c, hole.point), [nW[0] * v, nW[1] * v - 0.05, nW[2] * v])\n c.outflow += rate\n continue\n }\n }\n endStreamKey(c, key)\n }\n if (c.holes.length > 0 || c.outflow > 0) refreshLevel(c)\n settle(c)\n }\n\n const step = (dt: number): void => {\n time += dt\n for (const c of [...containers.values()]) stepContainer(c, dt)\n for (const s of [...streams.values()]) stepStream(s, dt)\n for (const st of [...stains.values()]) {\n const def = liquids.get(st.liquid)\n if (!def) continue\n const status = stepStain(st, def, surfaceFor(st.surface), ambientC, dt)\n if (status === 'dried_mark') emit({ type: 'dried', stain: st.id, mark: true })\n else if (status === 'dried_gone') {\n stains.delete(st.id)\n emit({ type: 'dried', stain: st.id, mark: false })\n }\n }\n }\n\n // ---- public state views ----\n\n const stateOf = (c: ContainerInt): ContainerState => ({\n id: c.id,\n liquid: c.liquid,\n liters: c.liters,\n capacity: c.spec.capacity,\n temperature: c.temperature,\n closed: c.closed,\n surfaceHeight: c.liters > 0 ? c.d : 0,\n surfacePoint: add(c.position, scale(c.normal, c.liters > 0 ? c.d : 0)),\n surfaceNormal: copy3(c.normal),\n holes: c.holes.map((h) => ({ point: copy3(h.point), normal: copy3(h.normal), diameter: h.diameter })),\n outflow: c.outflow,\n steaming: c.steaming,\n shape: c.spec.shape,\n lipRadius: lipRadius(c.spec.shape, c.spec.opening),\n position: copy3(c.position),\n rotation: [...c.rotation] as Quat,\n })\n\n const streamView = (s: StreamInt): StreamState => ({\n id: s.id,\n liquid: s.liquid,\n cause: s.cause,\n container: s.container,\n tap: s.tap,\n origin: copy3(s.origin),\n velocity: copy3(s.velocity),\n rate: s.rate,\n landing: s.landing ? copy3(s.landing) : null,\n thin: s.thin,\n flightTime: s.flightTime,\n })\n\n const stainView = (s: StainInt): StainState => ({\n id: s.id,\n surface: s.surface,\n liquid: s.liquid,\n center: copy3(s.center),\n front: [...s.front],\n liters: s.liters,\n soaked: s.soaked,\n wetness: s.wetness,\n wetRadius: s.wetRadius,\n normal: copy3(s.normal),\n tangent: copy3(s.tangent),\n flow: s.flow ? copy3(s.flow) : undefined,\n mark: s.mark,\n age: s.age,\n tint: s.tint ? { ...s.tint } : undefined,\n })\n\n // ---- world API ----\n\n const world: FluidWorld = {\n liquids,\n gravity,\n describe: (event) => describeEvent(strings, event),\n\n addContainer(spec, opts = {}) {\n const id = opts.id ?? `container_${++counters.container}`\n if (containers.has(id)) world.removeContainer(id)\n const liquid = spec.liquid && liquids.has(spec.liquid) ? spec.liquid : null\n const liters = liquid ? clamp(spec.liters ?? 0, 0, spec.capacity) : 0\n const c: ContainerInt = {\n id,\n spec: clone(spec),\n cols: makeColumns(spec.shape),\n liquid: liters > 0 ? liquid : null,\n liters,\n temperature: spec.temperature ?? ambientC,\n closed: spec.closed ?? spec.opening <= 0,\n position: copy3(opts.position ?? [0, 0, 0]),\n rotation: opts.rotation ? ([...opts.rotation] as Quat) : [0, 0, 0, 1],\n velocity: [0, 0, 0],\n prevVelocity: [0, 0, 0],\n hasPrev: false,\n holes: [],\n slosh: [0, 0, 0, 0],\n normal: [0, 1, 0],\n u: [0, 1, 0],\n d: 0,\n steaming: false,\n outflow: 0,\n streams: {},\n pourRate: 0,\n pourTTL: 0,\n pourVisual: false,\n lastMix: -10,\n }\n containers.set(id, c)\n refreshLevel(c)\n return id\n },\n\n addTap(spec) {\n const id = spec.id ?? `tap_${++counters.tap}`\n if (taps.has(id)) world.removeTap(id)\n const d = spec.direction ?? [0, -1, 0]\n const len = Math.hypot(d[0], d[1], d[2]) || 1\n const t: TapInt = {\n id,\n position: copy3(spec.position),\n direction: [d[0] / len, d[1] / len, d[2] / len],\n liquid: spec.liquid,\n rate: Math.max(0, spec.rate),\n temperature: spec.temperature ?? ambientC,\n on: false,\n }\n taps.set(id, t)\n if (spec.on ?? true) world.setTap(id, true)\n return id\n },\n\n setTap(id, on, rate) {\n const t = taps.get(id)\n if (!t) return\n if (rate !== undefined) t.rate = Math.max(0, rate)\n const changed = t.on !== on\n t.on = on\n syncTap(t)\n if (changed) emit({ type: 'tap', tap: id, on })\n },\n\n removeTap(id) {\n const t = taps.get(id)\n if (!t) return\n t.on = false\n syncTap(t)\n taps.delete(id)\n },\n\n taps: () => [...taps.values()].map((t) => ({ id: t.id, position: copy3(t.position), direction: copy3(t.direction), liquid: t.liquid, rate: t.rate, temperature: t.temperature, on: t.on, stream: t.stream })),\n\n removeContainer(id) {\n const c = containers.get(id)\n if (!c) return\n for (const key of Object.keys(c.streams)) endStreamKey(c, key)\n containers.delete(id)\n },\n\n setTransform(id, position, rotation, velocity) {\n const c = containers.get(id)\n if (!c) return\n c.position = copy3(position)\n c.rotation = [...rotation] as Quat\n if (velocity) c.velocity = copy3(velocity)\n refreshLevel(c)\n },\n\n open(id) {\n const c = containers.get(id)\n if (c) c.closed = false\n },\n\n close(id) {\n const c = containers.get(id)\n if (!c) return\n c.closed = true\n for (const key of ['pour', 'spill']) endStreamKey(c, key)\n c.pourTTL = 0\n },\n\n fill(id, liquid, liters, temperature) {\n const c = containers.get(id)\n if (!c || c.closed) return 0\n const accepted = fillInternal(c, liquid, liters, temperature, true)\n refreshLevel(c)\n return accepted\n },\n\n pour(id, dt, into) {\n const c = containers.get(id)\n const def = c ? defOf(c) : null\n if (!c || !def || c.closed || c.liters <= 1e-6 || !(dt > 0)) return 0\n refreshLevel(c)\n const lip = lipOf(c.spec.shape, c.spec.opening, c.u)\n const depth = Math.max(0, c.d - planeRange(c.cols, c.u)[0])\n const head = Math.max(c.d - lip.level, 0.02 + 0.5 * depth)\n const ro = lipRadius(c.spec.shape, c.spec.opening)\n const natural = 0.6 * Math.PI * ro * ro * Math.sqrt(2 * gravity * head) * 1000\n const rate = Math.min(natural, 0.15 + 12 * ro) * viscScale(def)\n const out = Math.min(rate * dt, c.liters)\n const target = into ? containers.get(into) : undefined\n let delivered = out\n if (target) {\n delivered = fillInternal(target, c.liquid as LiquidId, out, c.temperature, false)\n refreshLevel(target)\n const overflow = out - delivered\n if (overflow > 1e-6) {\n const flow = lipFlow(c, head)\n const hit = trace(landingSurfaces(), groundAt, flow.origin, flow.velocity, gravity)\n if (hit) deposit(c.liquid as LiquidId, hit, overflow, hit.velocity)\n }\n }\n removeLiters(c, out)\n c.pourRate = out / dt\n c.pourTTL = Math.max(0.12, dt * 1.5)\n c.pourVisual = !!target\n const flow = lipFlow(c, head)\n syncStream(c, 'pour', 'pour', c.pourRate, flow.origin, flow.velocity, c.pourVisual)\n refreshLevel(c)\n settle(c)\n return out\n },\n\n drink(id, liters) {\n const c = containers.get(id)\n const def = c ? defOf(c) : null\n if (!c || !def || c.closed || c.liters <= 1e-6 || !(liters > 0)) return null\n const amount = Math.min(liters, c.liters)\n removeLiters(c, amount)\n const event: Extract<FluidEvent, { type: 'drink' }> = {\n type: 'drink',\n container: c.id,\n liquid: def.id,\n liters: amount,\n temperature: c.temperature,\n thirst: (def.drink?.thirst ?? 0) * amount,\n effects: [...(def.drink?.effects ?? [])],\n burn: c.temperature > 65,\n }\n emit(event)\n refreshLevel(c)\n settle(c)\n return event\n },\n\n puncture(id, point, normal, diameter) {\n const c = containers.get(id)\n if (!c || !(diameter > 0) || c.holes.length >= MAX_HOLES) return\n c.holes.push({ point: copy3(point), normal: normalize(normal), diameter })\n },\n\n heat(id, deltaC) {\n const c = containers.get(id)\n if (c) c.temperature = clamp(c.temperature + deltaC, -50, 1000)\n },\n\n addSurface(spec) {\n const basis = makeBasis(spec.normal, spec.tangent)\n surfaces.set(spec.id, {\n ...clone(spec),\n ...basis,\n point: copy3(spec.point),\n half: [spec.halfSize[0], spec.halfSize[1]],\n })\n },\n\n removeSurface(id) {\n surfaces.delete(id)\n for (const s of [...stains.values()]) if (s.surface === id) stains.delete(s.id)\n },\n\n splash(liquid, point, liters, velocity, options) {\n if (!liquids.has(liquid) || !(liters > 0)) return\n const v: Vec3 = velocity ?? [0, -0.1, 0]\n const origin = add(point, [0, 0.02, 0])\n const hit = trace(landingSurfaces(), groundAt, origin, v, gravity)\n if (!hit) return\n emit({ type: 'splash', liquid, point: copy3(hit.point), intensity: clamp(0.3 + liters * 2, 0, 1) })\n deposit(liquid, hit, liters, length(v) > 0.3 ? hit.velocity : null, options?.tint)\n },\n\n clearStains(point, radius) {\n for (const s of [...stains.values()]) {\n if (distance(point, s.center) <= radius + 0.5 * meanRadius(s.front)) {\n stains.delete(s.id)\n emit({ type: 'dried', stain: s.id, mark: false })\n }\n }\n },\n\n update(dt) {\n if (dt > 0) {\n const n = clamp(Math.ceil(dt / MAX_STEP), 1, MAX_SUBSTEPS)\n updating = true\n try {\n for (let i = 0; i < n; i++) step(dt / n)\n } finally {\n updating = false\n }\n }\n const out = queue\n queue = []\n return out\n },\n\n container: (id) => {\n const c = containers.get(id)\n return c ? stateOf(c) : null\n },\n containers: () => [...containers.values()].map(stateOf),\n streams: () => [...streams.values()].map(streamView),\n stains: () => [...stains.values()].map(stainView),\n\n on(type, fn) {\n let set = listeners.get(type)\n if (!set) listeners.set(type, (set = new Set()))\n set.add(fn)\n return () => {\n set?.delete(fn)\n }\n },\n\n serialize() {\n const snapshot: Snapshot = {\n version: 1,\n time,\n rng: rng.state,\n counters: { ...counters },\n containers: [...containers.values()].map((c) => {\n const { cols: _cols, ...rest } = c\n return clone(rest)\n }),\n surfaces: [...surfaces.values()].map((s) => clone({ id: s.id, point: s.point, normal: s.normal, halfSize: s.half, tangent: s.t1, porosity: s.porosity })),\n streams: [...streams.values()].map((s) => clone(s)),\n taps: [...taps.values()].map((t) => clone(t)),\n stains: [...stains.values()].map((s) => clone(s)),\n }\n return snapshot\n },\n\n load(input) {\n const snap = clone(input) as Snapshot\n if (!snap || snap.version !== 1) throw new Error('game-fluids: unsupported snapshot')\n time = snap.time\n rng = new Rng(0)\n rng.state = snap.rng\n counters.container = snap.counters.container\n counters.stream = snap.counters.stream\n counters.stain = snap.counters.stain\n containers = new Map()\n for (const raw of snap.containers) containers.set(raw.id, { ...raw, cols: makeColumns(raw.spec.shape) })\n surfaces = new Map()\n for (const s of snap.surfaces) world.addSurface(s)\n counters.tap = snap.counters.tap ?? 0\n streams = new Map(snap.streams.map((s) => [s.id, s]))\n taps = new Map((snap.taps ?? []).map((t) => [t.id, t]))\n stains = new Map(snap.stains.map((s) => [s.id, s]))\n queue = []\n },\n }\n\n return world\n}\n","[\n {\n \"id\": \"sip\",\n \"duration\": 1.2,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.35,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.45,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -0.9,\n 0,\n 0\n ],\n \"action\": \"drink\",\n \"rate\": 0.06\n },\n {\n \"t\": 0.95,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -0.9,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 1.2,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"drink\",\n \"duration\": 2.5,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.5,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.8,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -1.22,\n 0,\n 0\n ],\n \"action\": \"drink\",\n \"rate\": 0.1667\n },\n {\n \"t\": 2.0,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -1.22,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 2.5,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"chug\",\n \"duration\": 4,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.5,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.9,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -1.45,\n 0,\n 0\n ],\n \"action\": \"drink\",\n \"rate\": 0.2\n },\n {\n \"t\": 3.4,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -1.45,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 4,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"pour\",\n \"duration\": 3,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.4,\n \"position\": [\n 0.1,\n 0.0,\n -0.35\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.8,\n \"position\": [\n 0.1,\n 0.0,\n -0.35\n ],\n \"rotation\": [\n -1.745,\n 0,\n 0\n ],\n \"action\": \"pour\",\n \"rate\": 1\n },\n {\n \"t\": 2.4,\n \"position\": [\n 0.1,\n 0.0,\n -0.35\n ],\n \"rotation\": [\n -1.745,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 3,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"pour_out\",\n \"duration\": 4,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.5,\n \"position\": [\n 0.1,\n 0.1,\n -0.35\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 1.0,\n \"position\": [\n 0.1,\n 0.1,\n -0.35\n ],\n \"rotation\": [\n -2.2,\n 0,\n 0\n ],\n \"action\": \"pour\",\n \"rate\": 40\n },\n {\n \"t\": 3.2,\n \"position\": [\n 0.1,\n 0.1,\n -0.35\n ],\n \"rotation\": [\n -2.2,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 4,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"open\",\n \"duration\": 1,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.25,\n \"position\": [\n 0.1,\n 0,\n -0.3\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"open\"\n },\n {\n \"t\": 0.7,\n \"position\": [\n 0.1,\n 0,\n -0.3\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 1,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"close\",\n \"duration\": 1,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.25,\n \"position\": [\n 0.1,\n 0,\n -0.3\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"close\"\n },\n {\n \"t\": 0.7,\n \"position\": [\n 0.1,\n 0,\n -0.3\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 1,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n }\n]","import itemUsesData from './data/item-uses.json'\nimport { lerp3, quatFromEuler, quatMultiply, quatRotate, add } from './math'\nimport type { FluidEvent, FluidWorld, ItemUseDef, ItemUsePlayer, Quat, Vec3 } from './types'\n\n/** Built-in scripted uses of a held item (data in `data/item-uses.json`): `sip`, `drink`, `chug`, `pour`, `pour_out`, `open`, `close`. */\nexport const ITEM_USES: ItemUseDef[] = itemUsesData as unknown as ItemUseDef[]\n\n/** World transform of the hand (or any holder) the item pose is relative to. */\nexport type HandTransform = () => { position: Vec3; rotation: Quat }\n\nconst DEFAULT_DRINK_RATE = 0.1\n\n/**\n * Plays an item use on a container: interpolates the keys, applies `drink` (rate × dt litres) and `pour` (`world.pour`, `rate` multiplies the\n * time) while the current key has that action, and fires `open` / `close` once when their key is reached. When `getHandTransform` is given, the\n * container's world transform follows hand ∘ pose every update; otherwise the host animates the viewmodel from `pose()`.\n */\nexport function createItemUse(world: FluidWorld, containerId: string, def: ItemUseDef, getHandTransform?: HandTransform): ItemUsePlayer {\n const keys = [...def.keys].sort((a, b) => a.t - b.t)\n let time = 0\n let done = keys.length === 0 || def.duration <= 0\n let checked = false\n let lastPos: Vec3 | null = null\n const fired = new Set<number>()\n\n const pose = (): { position: Vec3; rotation: Vec3 } => {\n if (keys.length === 0) return { position: [0, 0, 0], rotation: [0, 0, 0] }\n if (time <= keys[0].t) return { position: [...keys[0].position], rotation: [...keys[0].rotation] }\n for (let i = 0; i < keys.length - 1; i++) {\n const a = keys[i]\n const b = keys[i + 1]\n if (time <= b.t) {\n const k = b.t > a.t ? (time - a.t) / (b.t - a.t) : 1\n return { position: lerp3(a.position, b.position, k), rotation: lerp3(a.rotation, b.rotation, k) }\n }\n }\n const last = keys[keys.length - 1]\n return { position: [...last.position], rotation: [...last.rotation] }\n }\n\n const follow = (dt: number): void => {\n if (!getHandTransform) return\n const hand = getHandTransform()\n const p = pose()\n const position = add(hand.position, quatRotate(hand.rotation, p.position))\n const rotation = quatMultiply(hand.rotation, quatFromEuler(p.rotation[0], p.rotation[1], p.rotation[2]))\n const velocity: Vec3 | undefined =\n lastPos && dt > 0 ? [(position[0] - lastPos[0]) / dt, (position[1] - lastPos[1]) / dt, (position[2] - lastPos[2]) / dt] : undefined\n lastPos = position\n world.setTransform(containerId, position, rotation, velocity)\n }\n\n const player: ItemUsePlayer = {\n def,\n get time() {\n return time\n },\n get done() {\n return done\n },\n pose,\n update(dt) {\n if (done) return []\n const events: FluidEvent[] = []\n const off = world.on('*', (e) => events.push(e))\n try {\n if (!checked) {\n checked = true\n const state = world.container(containerId)\n if (!state || (def.liquids && def.liquids.length > 0 && (!state.liquid || !def.liquids.includes(state.liquid)))) {\n done = true\n return events\n }\n }\n const start = time\n const end = Math.min(def.duration, time + Math.max(0, dt))\n for (let i = 0; i < keys.length && !done; i++) {\n const key = keys[i]\n const spanStart = key.t\n const spanEnd = i + 1 < keys.length ? keys[i + 1].t : def.duration\n if ((key.action === 'open' || key.action === 'close') && !fired.has(i) && end >= spanStart) {\n fired.add(i)\n if (key.action === 'open') world.open(containerId)\n else world.close(containerId)\n }\n const overlap = Math.min(end, spanEnd) - Math.max(start, spanStart)\n if (overlap <= 0) continue\n if (key.action === 'drink') {\n const ev = world.drink(containerId, (key.rate ?? DEFAULT_DRINK_RATE) * overlap)\n const left = world.container(containerId)\n if (!ev || !left || left.liters <= 1e-6) {\n time = def.duration\n done = true\n }\n } else if (key.action === 'pour') {\n world.pour(containerId, overlap * (key.rate ?? 1))\n }\n }\n if (!done) {\n time = end\n done = time >= def.duration\n }\n follow(dt)\n } finally {\n off()\n }\n return events\n },\n cancel() {\n done = true\n },\n }\n return player\n}\n","import type { FilmField, FilmProfile, FilmRandom } from './types'\n\nexport interface DepositContext {\n readonly field: FilmField\n readonly random: FilmRandom\n readonly profile: () => FilmProfile\n}\n\nconst VISIBLE_THICKNESS = 0.035\n\nexport function depositCell(context: DepositContext, rowIn: number, columnIn: number, amount: number): void {\n const { field } = context\n const row = Math.round(rowIn)\n const column = Math.round(columnIn)\n if (row < 0 || column < 0 || row >= field.height || column >= field.width || !(amount > 0)) return\n const index = row * field.width + column\n field.thickness[index]! += amount\n if (amount > 0.02) field.dryness[index]! *= 0.15\n field.dampness[index] = 1\n}\n\nexport function wetCellCount(field: FilmField): number {\n let cells = 0\n for (let index = 0; index < field.thickness.length; index++) if (field.thickness[index]! > VISIBLE_THICKNESS) cells++\n return cells\n}\n\n/** A filled ellipse with a noisy outline; `along` runs along (directionColumn, directionRow) and `across` is the other half axis, `amount` is the thickness at the centre in mm. */\nexport function depositBlob(context: DepositContext, centerRow: number, centerColumn: number, along: number, across: number, directionColumn: number, directionRow: number, amount: number, roughness: number): void {\n const random = context.random\n const phaseA = random() * 6.28\n const phaseB = random() * 6.28\n const phaseC = random() * 6.28\n const phaseD = random() * 6.28\n const reach = Math.ceil(Math.max(along, across) * (1 + roughness) + 1.5)\n for (let row = Math.floor(centerRow - reach); row <= centerRow + reach; row++) {\n for (let column = Math.floor(centerColumn - reach); column <= centerColumn + reach; column++) {\n const dx = column + 0.5 - centerColumn\n const dy = row + 0.5 - centerRow\n const alongDistance = dx * directionColumn + dy * directionRow\n const acrossDistance = -dx * directionRow + dy * directionColumn\n const angle = Math.atan2(acrossDistance / across, alongDistance / along)\n const edge = 1 + roughness * (0.45 * Math.sin(3 * angle + phaseA) + 0.3 * Math.sin(5 * angle + phaseB) + 0.18 * Math.sin(8 * angle + phaseC) + 0.12 * Math.sin(13 * angle + phaseD))\n const squared = ((alongDistance / along) * (alongDistance / along) + (acrossDistance / across) * (acrossDistance / across)) / (edge * edge)\n if (squared < 1) depositCell(context, row, column, amount * Math.sqrt(1 - squared))\n }\n }\n}\n\n/** A tapered stroke from one cell to another. */\nexport function depositStroke(context: DepositContext, fromRow: number, fromColumn: number, toRow: number, toColumn: number, startWidth: number, endWidth: number, amount: number): void {\n const { field } = context\n const length = Math.hypot(toRow - fromRow, toColumn - fromColumn)\n const samples = Math.max(2, Math.ceil(length * 2.5))\n for (let sample = 0; sample <= samples; sample++) {\n const progress = sample / samples\n const row = fromRow + (toRow - fromRow) * progress\n const column = fromColumn + (toColumn - fromColumn) * progress\n const width = startWidth + (endWidth - startWidth) * progress\n const reach = Math.ceil(width + 1)\n for (let cellRow = Math.floor(row - reach); cellRow <= row + reach; cellRow++) {\n for (let cellColumn = Math.floor(column - reach); cellColumn <= column + reach; cellColumn++) {\n if (cellRow < 0 || cellColumn < 0 || cellRow >= field.height || cellColumn >= field.width) continue\n const distance = Math.hypot(cellRow + 0.5 - row, cellColumn + 0.5 - column)\n if (distance >= width) continue\n const index = cellRow * field.width + cellColumn\n const target = amount * (1 - distance / width) * 0.5\n if (field.thickness[index]! < target) depositCell(context, cellRow, cellColumn, target - field.thickness[index]!)\n }\n }\n }\n}\n\n/**\n * The impact: the body is stretched by 1 / sin(angle), with spikes (long only along the travel), satellites and tails.\n * `size` is the radius in cells of the main body; `profile.spikes` below 1 turns the spikes short and the blobs thick.\n */\nexport function depositSplat(context: DepositContext, row: number, column: number, size: number, directionColumn: number, directionRow: number, sinAngleIn: number, amount: number): void {\n const random = context.random\n const spikes = context.profile().spikes\n const sinAngle = Math.max(0.17, Math.min(1, sinAngleIn))\n const stretch = Math.min(5.5, 1 / sinAngle)\n const along = size * Math.pow(stretch, 0.75)\n const across = size / Math.pow(stretch, 0.25)\n const frontRow = row + directionRow * along * 0.25\n const frontColumn = column + directionColumn * along * 0.25\n depositBlob(context, frontRow, frontColumn, along, across, directionColumn, directionRow, amount, 0.1 + 0.12 * (1 - sinAngle) + (size < 1.4 ? 0 : 0.06))\n const sideColumn = -directionRow\n const sideRow = directionColumn\n const spikeCount = Math.round(Math.min(18, (size < 1.2 ? 1 : 4) + size * 1.6 + 5 * (1 - sinAngle)) * spikes)\n for (let spike = 0; spike < spikeCount; spike++) {\n const spread = Math.PI * (0.25 + 0.75 * sinAngle * sinAngle)\n let theta = (random() * 2 - 1) * spread\n if (sinAngle > 0.9) theta = random() * 6.283\n const cosine = Math.cos(theta)\n const sine = Math.sin(theta)\n const dx = cosine * directionColumn + sine * sideColumn\n const dy = cosine * directionRow + sine * sideRow\n const length = size * (0.25 + random() * 0.55) * (1 + 2.6 * (1 - sinAngle) * Math.max(0, cosine)) * (sinAngle > 0.9 ? 0.6 : 1) * (0.5 + 0.5 * spikes)\n const startRow = frontRow + (along * cosine * directionRow + across * sine * sideRow) * 0.75\n const startColumn = frontColumn + (along * cosine * directionColumn + across * sine * sideColumn) * 0.75\n const endRow = startRow + dy * length\n const endColumn = startColumn + dx * length\n depositStroke(context, startRow, startColumn, endRow, endColumn, Math.max(0.55, size * 0.22), 0.42, amount * 0.75)\n if (random() < 0.5) {\n const gap = 1 + random() * 2.2\n depositBlob(context, endRow + dy * gap, endColumn + dx * gap, 0.55 + random() * 0.7, 0.5 + random() * 0.4, dx, dy, amount * 0.55, 0.08)\n }\n }\n const satelliteCount = Math.round((1 + size * 0.9) * (1.4 - sinAngle * 0.6) * (0.5 + 0.5 * spikes))\n for (let satellite = 0; satellite < satelliteCount; satellite++) {\n const cone = sinAngle > 0.9 ? Math.PI : 0.18 + 0.6 * sinAngle\n const theta = (random() * 2 - 1) * cone\n const cosine = Math.cos(theta)\n const sine = Math.sin(theta)\n const dx = cosine * directionColumn + sine * sideColumn\n const dy = cosine * directionRow + sine * sideRow\n const distance = along + size * (0.8 + random() * 3.2)\n const radius = 0.45 + random() * Math.min(1.2, size * 0.22)\n const satelliteRow = frontRow + dy * distance\n const satelliteColumn = frontColumn + dx * distance\n depositBlob(context, satelliteRow, satelliteColumn, radius * Math.sqrt(stretch), radius, dx, dy, amount * 0.6, 0.08)\n if (sinAngle < 0.8) depositStroke(context, satelliteRow + dy * radius * stretch * 0.7, satelliteColumn + dx * radius * stretch * 0.7, satelliteRow + dy * radius * stretch * 1.8, satelliteColumn + dx * radius * stretch * 1.8, 0.5, 0.3, amount * 0.35)\n }\n}\n","import type { Vec3 } from '../types'\nimport { depositBlob, depositSplat } from './deposit'\nimport type { DepositContext } from './deposit'\nimport type { FilmDropState, FilmLayout } from './types'\n\nconst GRAVITY = 9.8\nconst AIR_DRAG = 0.25\nconst MIN_SIZE_CELLS = 0.6\n\nexport interface DropPool {\n readonly state: FilmDropState\n launch(position: Vec3, velocity: Vec3, radius: number): void\n update(dt: number): void\n clear(): void\n}\n\n/** Drops in flight: a ring of slots (the oldest is overwritten), a ballistic flight and a landing that makes an impact shaped by the angle and direction (F250-278). */\nexport function createDropPool(layout: FilmLayout, context: DepositContext): DropPool {\n const capacity = layout.rules.dropCapacity\n let cursor = 0\n const state: FilmDropState = {\n capacity,\n get launched() {\n return cursor\n },\n active: new Uint8Array(capacity),\n position: new Float64Array(capacity * 3),\n velocity: new Float64Array(capacity * 3),\n radius: new Float64Array(capacity),\n }\n const { active, position, velocity, radius } = state\n const cellMillimetres = layout.cellSize * 1000\n const previous: Vec3 = [0, 0, 0]\n const point: Vec3 = [0, 0, 0]\n const speed: Vec3 = [0, 0, 0]\n\n function land(region: number, dropRadius: number): void {\n const profile = context.profile()\n const impact = layout.impact(region, point, speed)\n const [alongColumn, alongRow] = impact.along\n const travel = Math.hypot(alongColumn, alongRow) || 1e-6\n const sinAngle = Math.abs(impact.normalSpeed) / Math.hypot(travel, impact.normalSpeed)\n const volume = ((4 / 3) * Math.PI * dropRadius * dropRadius * dropRadius) / (cellMillimetres * cellMillimetres) * (dropRadius > 3 ? 7 : 4) * profile.volume\n const totalSpeed = Math.sqrt(speed[0] * speed[0] + speed[1] * speed[1] + speed[2] * speed[2])\n const size = Math.max(MIN_SIZE_CELLS, (dropRadius * 2) / cellMillimetres * (1 + 0.2 * totalSpeed))\n const amount = Math.min(profile.maxAmount, Math.max(0.25, volume / ((Math.PI * size * size * 1.6) / (sinAngle < 0.3 ? 0.6 : 1))))\n if (profile.landsAsBlob) {\n depositBlob(context, impact.row, impact.column, size * 1.3, size * 1.1, alongColumn / travel, alongRow / travel, amount, 0.2)\n return\n }\n depositSplat(context, impact.row, impact.column, size, alongColumn / travel, alongRow / travel, sinAngle, amount)\n }\n\n return {\n state,\n launch(origin, direction, dropRadius) {\n const slot = cursor++ % capacity\n const offset = slot * 3\n active[slot] = 1\n position[offset] = origin[0]\n position[offset + 1] = origin[1]\n position[offset + 2] = origin[2]\n velocity[offset] = direction[0]\n velocity[offset + 1] = direction[1]\n velocity[offset + 2] = direction[2]\n radius[slot] = dropRadius\n },\n update(dt) {\n for (let slot = 0; slot < capacity; slot++) {\n if (!active[slot]) continue\n const offset = slot * 3\n previous[0] = position[offset]!\n previous[1] = position[offset + 1]!\n previous[2] = position[offset + 2]!\n velocity[offset + 1]! -= GRAVITY * dt\n const drag = 1 - dt * AIR_DRAG\n velocity[offset]! *= drag\n velocity[offset + 1]! *= drag\n velocity[offset + 2]! *= drag\n point[0] = position[offset]! + velocity[offset]! * dt\n point[1] = position[offset + 1]! + velocity[offset + 1]! * dt\n point[2] = position[offset + 2]! + velocity[offset + 2]! * dt\n const region = layout.collide(previous, point)\n position[offset] = point[0]\n position[offset + 1] = point[1]\n position[offset + 2] = point[2]\n if (region >= 0) {\n if (layout.contains(point)) {\n speed[0] = velocity[offset]!\n speed[1] = velocity[offset + 1]!\n speed[2] = velocity[offset + 2]!\n land(region, radius[slot]!)\n }\n active[slot] = 0\n continue\n }\n if (layout.escaped(point)) active[slot] = 0\n }\n },\n clear() {\n active.fill(0)\n },\n }\n}\n","import type { FilmAdvanceInput, FilmBounds, FilmField, FilmLayout, FilmProfile, FilmSimulator, FilmWeather } from './types'\n\nexport interface CpuSimulatorOptions {\n /** Flow steps per second of real time (the pages use 180). */\n stepRate: number\n /** Most flow steps in one advance (6 in the Fluid Standard, 9 in the Workshop). */\n maxSteps: number\n weather: () => FilmWeather\n}\n\nconst RAIN_SPREAD = 0.5\nconst BOUNDS_MARGIN = 8\n\n/**\n * The thin-film step of the Fluid Standard (F94-114), literal: only film above the pin moves, a dry cell needs the front thickness,\n * walls run sideways at 0.22 and the flow is limited to the wet bounding box. Drying starts from the thin edge.\n */\nexport function createCpuSimulator(field: FilmField, layout: FilmLayout, profileOf: () => FilmProfile, options: CpuSimulatorOptions): FilmSimulator {\n const { width, height, thickness, dryness, dampness } = field\n const { bed, pin: pinning, vertical } = layout\n const delta = new Float32Array(width * height)\n const bounds: FilmBounds = { firstRow: 0, lastRow: -1, firstColumn: 0, lastColumn: -1 }\n let accumulated = 0\n\n function refreshBounds(): void {\n let firstRow = height\n let lastRow = -1\n let firstColumn = width\n let lastColumn = -1\n for (let row = 0; row < height; row++) {\n const offset = row * width\n let isWet = false\n for (let column = 0; column < width; column++) {\n if (thickness[offset + column]! > 0) {\n isWet = true\n if (column < firstColumn) firstColumn = column\n if (column > lastColumn) lastColumn = column\n }\n }\n if (isWet) {\n if (row < firstRow) firstRow = row\n lastRow = row\n }\n }\n if (lastRow < 0) {\n bounds.firstRow = 0\n bounds.lastRow = -1\n bounds.firstColumn = 0\n bounds.lastColumn = -1\n return\n }\n bounds.firstRow = Math.max(0, firstRow - BOUNDS_MARGIN)\n bounds.lastRow = Math.min(height - 1, lastRow + BOUNDS_MARGIN)\n bounds.firstColumn = Math.max(0, firstColumn - BOUNDS_MARGIN)\n bounds.lastColumn = Math.min(width - 1, lastColumn + BOUNDS_MARGIN)\n }\n\n const mobility = (index: number): number => {\n const dry = dryness[index]!\n return dry < 0.25 ? 1 : dry > 0.6 ? 0 : 1 - (dry - 0.25) / 0.35\n }\n\n function flowStep(): void {\n const { firstRow, lastRow, firstColumn, lastColumn } = bounds\n if (lastRow < 0) return\n const profile = profileOf()\n const flow = profile.flow * (1 + RAIN_SPREAD * options.weather().rain)\n const referenceSquared = profile.referenceThickness * profile.referenceThickness\n const slopeCap = profile.slopeCap\n const pinLevel = profile.pin\n const front = profile.front\n for (let row = firstRow; row <= lastRow; row++) {\n const offset = row * width\n for (let column = firstColumn; column <= lastColumn; column++) delta[offset + column] = 0\n }\n for (let row = firstRow; row <= lastRow; row++) {\n const offset = row * width\n for (let column = firstColumn; column <= lastColumn; column++) {\n const index = offset + column\n const own = thickness[index]!\n for (let edge = 0; edge < 2; edge++) {\n let neighbour: number\n if (edge === 0) {\n if (column >= lastColumn) continue\n neighbour = index + 1\n } else {\n if (row >= lastRow) continue\n neighbour = index + width\n }\n const other = thickness[neighbour]!\n if (own < 0.005 && other < 0.005) continue\n let bedDrop = bed[index]! - bed[neighbour]!\n if (bedDrop > slopeCap) bedDrop = slopeCap\n else if (bedDrop < -slopeCap) bedDrop = -slopeCap\n let head = bedDrop + own - other\n let source = index\n let destination = neighbour\n if (head < 0) {\n head = -head\n source = neighbour\n destination = index\n }\n const sourceThickness = thickness[source]!\n const verticalFactor = vertical[source]!\n const pinThreshold = pinLevel * pinning[source]! * (verticalFactor < 1 ? 0.5 : 1)\n if (sourceThickness <= pinThreshold) continue\n if (thickness[destination]! < 0.03 && sourceThickness < front * pinning[source]! * verticalFactor) continue\n const mobile = mobility(source)\n if (mobile <= 0) continue\n let moved = flow * mobile * ((sourceThickness * sourceThickness) / (sourceThickness * sourceThickness + referenceSquared)) * head * (verticalFactor < 1 ? (edge === 0 ? 0.22 : 1) : 4)\n const limit = (sourceThickness - pinThreshold) * 0.24\n if (moved > limit) moved = limit\n delta[source]! -= moved\n delta[destination]! += moved\n }\n }\n }\n for (let row = firstRow; row <= lastRow; row++) {\n const offset = row * width\n for (let column = firstColumn; column <= lastColumn; column++) {\n const index = offset + column\n let next = thickness[index]! + delta[index]!\n if (next < 1e-4) next = 0\n else dampness[index] = 1\n thickness[index] = next\n }\n }\n }\n\n function age(dryingSeconds: number): void {\n const { firstRow, lastRow, firstColumn, lastColumn } = bounds\n if (lastRow < 0) return\n const profile = profileOf()\n const rainScale = 1 - options.weather().rain\n const seconds = dryingSeconds * rainScale\n for (let row = firstRow; row <= lastRow; row++) {\n const offset = row * width\n for (let column = firstColumn; column <= lastColumn; column++) {\n const index = offset + column\n const own = thickness[index]!\n if (own > 0) {\n const thin = 1 - Math.min(1, own / 1.6)\n if (profile.dryTime > 0 && dryness[index]! < 1) dryness[index] = Math.min(1, dryness[index]! + (seconds / profile.dryTime) * (0.45 + 1.7 * thin))\n if (profile.evaporation > 0) {\n const next = own - profile.evaporation * seconds * (0.5 + 1.5 * thin)\n thickness[index] = next > 0.004 ? next : 0\n }\n } else if (dampness[index]! > 0) {\n dampness[index] = Math.max(0, dampness[index]! - seconds / (profile.evaporation > 0 ? 25 : 1e9))\n }\n }\n }\n }\n\n return {\n bounds,\n refreshBounds,\n advance({ dt, dryingSeconds }: FilmAdvanceInput): number {\n accumulated += dt\n let steps = 0\n refreshBounds()\n while (accumulated >= 1 / options.stepRate && steps < options.maxSteps) {\n flowStep()\n accumulated -= 1 / options.stepRate\n steps++\n }\n if (steps === options.maxSteps) accumulated = 0\n age(dryingSeconds)\n return steps\n },\n resetClock() {\n accumulated = 0\n },\n }\n}\n","import type { Vec3 } from '../types'\nimport { depositCell } from './deposit'\nimport type { DepositContext } from './deposit'\nimport type { FilmBead, FilmDrag, FilmDrip, FilmLayout, FilmRandom, FilmSource } from './types'\n\ntype Launch = (position: Vec3, velocity: Vec3, radius: number) => void\n\nconst range = (random: FilmRandom, from: number, to: number): number => from + random() * (to - from)\n\n/** The drip (F282, W-style): a bead swells at the fingertip, detaches and falls. Updates `bead` for the renderer and returns nothing. */\nexport function updateDrip(drip: FilmDrip | undefined, bead: FilmBead, layout: FilmLayout, random: FilmRandom, launch: Launch, dt: number): void {\n if (!drip) {\n bead.visible = false\n return\n }\n drip.elapsed += dt\n const swell = Math.min(1, drip.elapsed / drip.every)\n const radius = drip.radius * (0.35 + 0.65 * swell)\n const isWorkshop = layout.rules.dripStyle === 'workshop'\n bead.visible = true\n bead.swell = swell\n bead.radius = radius\n bead.position[0] = drip.position[0]\n bead.position[1] = drip.position[1] + (isWorkshop ? -radius * 0.0012 * (1 + swell * 0.7) : -radius * 0.0012)\n bead.position[2] = drip.position[2]\n if (drip.elapsed < drip.every) return\n const origin: Vec3 = [bead.position[0], bead.position[1] + -radius * 0.001, bead.position[2]]\n if (isWorkshop) {\n const sideX = range(random, -0.025, 0.025)\n const sideZ = range(random, -0.025, 0.025)\n launch(origin, [sideX, -0.2, sideZ], drip.radius * range(random, 0.85, 1.15))\n drip.elapsed = 0\n drip.every = drip.base * range(random, 0.75, 1.25)\n return\n }\n const sideX = (random() - 0.5) * 0.05\n const sideZ = (random() - 0.5) * 0.05\n launch(origin, [sideX, -0.2, sideZ], drip.radius * (0.85 + random() * 0.3))\n drip.elapsed = 0\n drip.every = drip.base * (0.75 + random() * 0.5)\n}\n\n/** Continuous sources (a wound at the feet, a tipped can): a pulsing thickness added over a small disc (F288). */\nexport function updateSources(sources: readonly FilmSource[], context: DepositContext, dt: number): void {\n const random = context.random\n for (const source of sources) {\n source.elapsed += dt\n if (source.elapsed < 0 || source.elapsed > source.duration) continue\n const pulse = 0.6 + 0.4 * Math.max(0, Math.sin(source.elapsed * 5.2))\n const amount = source.rate * dt * pulse\n for (let part = 0; part < 3; part++) {\n const angle = random() * 6.28\n const distance = random() * source.radius\n depositCell(context, source.row + Math.sin(angle) * distance, source.column + Math.cos(angle) * distance, amount / 3)\n }\n }\n}\n\n/** Drag smears (F291): a striped band that loses load and crumbles at the end, with side drops stretched along the travel. */\nexport function updateDrags(drags: readonly FilmDrag[], context: DepositContext, layout: FilmLayout, launch: Launch, dt: number): void {\n const random = context.random\n for (const drag of drags) {\n if (drag.done) continue\n drag.elapsed += dt\n const progress = Math.min(1, drag.elapsed / drag.duration)\n const here = drag.path(progress)\n const ahead = drag.path(Math.min(1, progress + 0.01))\n let directionColumn = ahead.column - here.column\n let directionRow = ahead.row - here.row\n const length = Math.hypot(directionColumn, directionRow) || 1\n directionColumn /= length\n directionRow /= length\n const sideColumn = -directionRow\n const sideRow = directionColumn\n const load = Math.pow(1 - progress, 1.3)\n for (let offset = -drag.width; offset <= drag.width; offset += 0.5) {\n const across = offset / drag.width\n const stripe = drag.stripes[Math.round((offset + drag.width) * 2)]!\n const edge = 1 - across * across\n const amount = drag.amount * load * (0.25 + 0.75 * stripe) * edge\n if (load < 0.45 && random() > load * 2.2) continue\n depositCell(context, Math.round(here.row + sideRow * offset), Math.round(here.column + sideColumn * offset), amount * dt * 30)\n }\n if (drag.hand && random() < dt * 14 * load + 0.02) {\n const world = layout.cellToWorld(here.row, here.column)\n const origin: Vec3 = [world[0] + (random() - 0.5) * 0.06, drag.hand.height + random() * 0.3, world[2] + (random() - 0.5) * 0.06]\n const velocity: Vec3 = [directionColumn * drag.hand.speed, 0 * drag.hand.speed, directionRow * drag.hand.speed]\n velocity[0] += (random() - 0.5) * 0.3\n velocity[1] += 0.2\n velocity[2] += (random() - 0.5) * 0.3\n launch(origin, velocity, 2 + random() * 2.2)\n }\n if (progress >= 1) drag.done = true\n }\n}\n","import { depositBlob, depositCell, depositSplat, depositStroke, wetCellCount } from './deposit'\nimport type { DepositContext } from './deposit'\nimport { createDropPool } from './drops'\nimport { createCpuSimulator } from './simulate'\nimport { updateDrags, updateDrip, updateSources } from './sources'\nimport type { Film, FilmField, FilmOptions, FilmProfile, FilmWeather } from './types'\n\nconst DEFAULT_STEP_RATE = 180\nconst DEFAULT_MAX_STEPS = 6\n\n/**\n * A running film of one liquid over one layout: drops land as impacts, a drip, sources and drag smears add to it, and a 180 Hz\n * thin-film step spreads it limited to the wet box, at most `maxSteps` per frame. It never calls `Math.random`: the host gives the random stream.\n */\nexport function createFilm(options: FilmOptions): Film {\n const { layout, random } = options\n const cellCount = layout.width * layout.height\n const field: FilmField = {\n width: layout.width,\n height: layout.height,\n thickness: new Float32Array(cellCount),\n dryness: new Float32Array(cellCount),\n dampness: new Float32Array(cellCount),\n }\n let weatherState: FilmWeather = { rain: 0 }\n let currentProfile: FilmProfile = options.profile\n const context: DepositContext = { field, random, profile: () => currentProfile }\n const drops = createDropPool(layout, context)\n const createSimulator = options.simulator ?? createCpuSimulator\n const simulator = createSimulator(field, layout, () => currentProfile, {\n stepRate: options.stepRate ?? DEFAULT_STEP_RATE,\n maxSteps: options.maxSteps ?? DEFAULT_MAX_STEPS,\n weather: () => weatherState,\n })\n\n const film: Film = {\n layout,\n field,\n drops: drops.state,\n bead: { visible: false, position: [0, 0, 0], radius: 0, swell: 0 },\n simulator,\n get profile() {\n return currentProfile\n },\n set profile(profile: FilmProfile) {\n currentProfile = profile\n },\n drip: undefined,\n sources: [],\n drags: [],\n launch: (position, velocity, radius) => drops.launch(position, velocity, radius),\n splat: (row, column, size, directionColumn, directionRow, sinAngle, amount) => depositSplat(context, row, column, size, directionColumn, directionRow, sinAngle, amount),\n blob: (row, column, along, across, directionColumn, directionRow, amount, roughness) => depositBlob(context, row, column, along, across, directionColumn, directionRow, amount, roughness),\n stroke: (fromRow, fromColumn, toRow, toColumn, startWidth, endWidth, amount) => depositStroke(context, fromRow, fromColumn, toRow, toColumn, startWidth, endWidth, amount),\n deposit: (row, column, amount) => depositCell(context, row, column, amount),\n update({ dt, dryingSeconds }) {\n drops.update(dt)\n updateDrip(film.drip, film.bead, layout, random, drops.launch, dt)\n updateSources(film.sources, context, dt)\n updateDrags(film.drags, context, layout, drops.launch, dt)\n simulator.advance({ dt, dryingSeconds })\n },\n setWeather(weather) {\n weatherState = { rain: Math.min(1, Math.max(0, weather.rain ?? weatherState.rain)) }\n },\n weather: () => ({ ...weatherState }),\n clear() {\n field.thickness.fill(0)\n field.dryness.fill(0)\n field.dampness.fill(0)\n drops.clear()\n film.drip = undefined\n film.bead.visible = false\n film.sources.length = 0\n film.drags.length = 0\n simulator.refreshBounds()\n },\n wetCells: () => wetCellCount(field),\n }\n return film\n}\n","import type { FilmRandom } from './types'\n\nexport type FilmLcg = FilmRandom & { seed: number }\n\n/** The Fluid Standard's generator (LCG 1664525 / 1013904223). `seed` can be read and set, so a scene can be restarted from a number. */\nexport function createFilmLcg(seed: number): FilmLcg {\n const lcg = (() => {\n lcg.seed = (lcg.seed * 1664525 + 1013904223) >>> 0\n return lcg.seed / 4294967296\n }) as FilmLcg\n lcg.seed = seed >>> 0\n return lcg\n}\n","// The product is taken in doubles on purpose (not `Math.imul`): the recorded pages round it the same way, and the grids depend on it.\nexport function hashCell(x: number, y: number): number {\n let value = (x * 374761393 + y * 668265263) | 0\n value = ((value ^ (value >>> 13)) * 1274126177) | 0\n return ((value ^ (value >>> 16)) >>> 0) / 4294967296\n}\n\nexport function valueNoise(x: number, y: number): number {\n const xi = Math.floor(x)\n const yi = Math.floor(y)\n const xf = x - xi\n const yf = y - yi\n const u = xf * xf * (3 - 2 * xf)\n const v = yf * yf * (3 - 2 * yf)\n const a = hashCell(xi, yi)\n const b = hashCell(xi + 1, yi)\n const c = hashCell(xi, yi + 1)\n const d = hashCell(xi + 1, yi + 1)\n return a + (b - a) * u + (c - a) * v + (a - b - c + d) * u * v\n}\n","import type { Vec3 } from '../types'\nimport { hashCell, valueNoise } from './noise'\nimport type { FilmImpact, FilmLayout, FilmRegion, FilmRules } from './types'\n\nexport interface FoldedLayoutParams {\n id: string\n columns: number\n /** Metres per cell. */\n cellSize: number\n /** World x of the left edge. */\n originX: number\n wallRows: number\n sidewalkRows: number\n curbRows: number\n roadRows: number\n /** World y of the top of the wall strip and of the sidewalk and road planes. */\n wallTopY: number\n sidewalkY: number\n roadY: number\n /** World z of the wall plane (the sidewalk starts here and runs towards +z). */\n wallZ: number\n /** Metres the curb face drops per row. Default `(sidewalkY - roadY) / curbRows`. */\n curbStep?: number\n /** x that the road's cross slope is measured from (the road falls `5 mm / m` towards +x from here). */\n roadSlopeAnchorX: number\n rules: FilmRules\n}\n\nconst REGION_NAMES = ['wall', 'sidewalk', 'curb', 'road'] as const\n\nconst dot3 = (a: Vec3, b: Vec3): number => a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\n\nfunction impactOf(region: FilmRegion, position: Vec3, velocity: Vec3, cellSize: number): FilmImpact {\n const local: Vec3 = [position[0] - region.origin[0], position[1] - region.origin[1], position[2] - region.origin[2]]\n return {\n row: region.firstRow + dot3(local, region.rowAxis) / cellSize,\n column: dot3(local, region.columnAxis) / cellSize,\n along: [dot3(velocity, region.columnAxis), dot3(velocity, region.rowAxis)],\n normalSpeed: -dot3(velocity, region.normal),\n }\n}\n\nfunction cellToWorldOf(regions: readonly FilmRegion[], cellSize: number, row: number, column: number): Vec3 {\n let region = regions[regions.length - 1]!\n for (const candidate of regions) {\n if (row < candidate.firstRow + candidate.rowCount) {\n region = candidate\n break\n }\n }\n const across = column * cellSize\n const down = (row - region.firstRow) * cellSize\n return [\n region.origin[0] + region.columnAxis[0] * across + region.rowAxis[0] * down,\n region.origin[1] + region.columnAxis[1] * across + region.rowAxis[1] * down,\n region.origin[2] + region.columnAxis[2] * across + region.rowAxis[2] * down,\n ]\n}\n\n/**\n * One strip folded over a wall, the sidewalk in front of it, the curb face and the road: the Fluid Standard's grid (F12-42) and the\n * Workshop's (W562-582) are two settings of it. Bed height (mm), pinning noise and the vertical flag are filled per cell.\n */\nexport function createFoldedLayout(params: FoldedLayoutParams): FilmLayout {\n const { columns, cellSize, originX, wallRows, sidewalkRows, curbRows, roadRows, wallTopY, sidewalkY, roadY, wallZ, rules } = params\n const curbStep = params.curbStep ?? (sidewalkY - roadY) / curbRows\n const height = wallRows + sidewalkRows + curbRows + roadRows\n const cellCount = columns * height\n const bed = new Float32Array(cellCount)\n const pin = new Float32Array(cellCount)\n const vertical = new Float32Array(cellCount)\n const sidewalkEnd = wallRows + sidewalkRows\n const curbEnd = sidewalkEnd + curbRows\n const regionOfRow = (row: number): number => (row < wallRows ? 0 : row < sidewalkEnd ? 1 : row < curbEnd ? 2 : 3)\n\n for (let row = 0; row < height; row++) {\n for (let column = 0; column < columns; column++) {\n const index = row * columns + column\n const region = regionOfRow(row)\n const x = originX + (column + 0.5) * cellSize\n let bedHeight: number\n let roughness = 0.2\n if (region === 0) {\n bedHeight = (wallTopY - (row + 0.5) * cellSize) * 1000\n roughness = 0.3\n } else if (region === 1) {\n const z = (row - wallRows + 0.5) * cellSize\n bedHeight = sidewalkY * 1000 - z * 6\n const jointX = Math.abs((((x - originX) % 0.5) + 0.5) % 0.5 - 0.25)\n const jointZ = Math.abs(((z % 0.5) + 0.5) % 0.5 - 0.25)\n if (jointX > 0.25 - cellSize * 0.6 || jointZ > 0.25 - cellSize * 0.6) bedHeight -= 0.9\n roughness = 0.18\n } else if (region === 2) {\n bedHeight = sidewalkY * 1000 - (row - sidewalkEnd + 0.5) * curbStep * 1000\n } else {\n const z = (row - curbEnd + 0.5) * cellSize\n bedHeight = roadY * 1000 + z * 14 - (x - params.roadSlopeAnchorX) * 5\n roughness = 0.55\n }\n const noise = valueNoise(column * 0.35, row * 0.35) * 0.6 + valueNoise(column * 1.3, row * 1.3) * 0.4\n bed[index] = bedHeight + (noise - 0.5) * roughness * 2\n vertical[index] = region === 0 || region === 2 ? 0.95 : 1\n pin[index] = 0.62 + 0.76 * (valueNoise(column * 0.21 + 40, row * 0.21) * 0.5 + hashCell(column, row) * 0.5) * (region === 3 ? 1.25 : 1)\n }\n }\n\n const curbZ = wallZ + sidewalkRows * cellSize\n const roadEndZ = curbZ + roadRows * cellSize\n const right = [1, 0, 0] as Vec3\n const regions: FilmRegion[] = [\n { id: REGION_NAMES[0], firstRow: 0, rowCount: wallRows, origin: [originX, wallTopY, wallZ], columnAxis: right, rowAxis: [0, -1, 0], normal: [0, 0, 1], isVertical: true },\n { id: REGION_NAMES[1], firstRow: wallRows, rowCount: sidewalkRows, origin: [originX, sidewalkY, wallZ], columnAxis: right, rowAxis: [0, 0, 1], normal: [0, 1, 0], isVertical: false },\n { id: REGION_NAMES[2], firstRow: sidewalkEnd, rowCount: curbRows, origin: [originX, sidewalkY, curbZ], columnAxis: right, rowAxis: [0, -1, 0], normal: [0, 0, 1], isVertical: true },\n { id: REGION_NAMES[3], firstRow: curbEnd, rowCount: roadRows, origin: [originX, roadY, curbZ], columnAxis: right, rowAxis: [0, 0, 1], normal: [0, 1, 0], isVertical: false },\n ]\n const maxX = originX + columns * cellSize\n\n return {\n id: params.id,\n width: columns,\n height,\n cellSize,\n bed,\n pin,\n vertical,\n regions,\n rules,\n cellToWorld: (row, column) => cellToWorldOf(regions, cellSize, row, column),\n collide(previous, position) {\n if (position[2] <= wallZ && position[1] > sidewalkY) {\n position[2] = wallZ\n return 0\n }\n if (position[2] < curbZ && (!rules.guardBehindWall || position[2] >= wallZ) && position[1] <= sidewalkY) {\n position[1] = sidewalkY\n return 1\n }\n if (rules.curbCatch && position[2] >= curbZ && previous[2] < curbZ && position[1] < sidewalkY) {\n position[2] = curbZ\n return 2\n }\n if (position[2] >= curbZ && position[1] <= roadY) {\n position[1] = roadY\n return 3\n }\n return -1\n },\n impact: (region, position, velocity) => impactOf(regions[region]!, position, velocity, cellSize),\n contains: (position) => position[0] > originX && position[0] < maxX && (!rules.clipRoadEnd || position[2] < roadEndZ),\n escaped(position) {\n if (position[1] < -1) return true\n const box = rules.escapeBox\n return box !== undefined && (position[0] < box.minX || position[0] > box.maxX || position[2] > box.maxZ)\n },\n }\n}\n\nconst PADRAO_CELL = 0.0125\nconst PADRAO_WALL_Z = 0\n\n/** The Fluid Standard's grid: 256 x 396 cells of 1.25 cm over a 1.95 m wall, a 1.6 m sidewalk, a 15 cm curb and a 1.4 m road. */\nexport const PADRAO_LAYOUT: FilmLayout = createFoldedLayout({\n id: 'padrao',\n columns: 256,\n cellSize: PADRAO_CELL,\n originX: -1.6,\n wallRows: 144,\n sidewalkRows: 128,\n curbRows: 12,\n roadRows: 112,\n wallTopY: 1.95,\n sidewalkY: 0.15,\n roadY: 0,\n wallZ: PADRAO_WALL_Z,\n curbStep: PADRAO_CELL,\n roadSlopeAnchorX: 0,\n rules: {\n dropCapacity: 600,\n curbCatch: true,\n guardBehindWall: true,\n clipRoadEnd: true,\n escapeBox: { minX: -3, maxX: 3, maxZ: PADRAO_WALL_Z + 128 * PADRAO_CELL + 112 * PADRAO_CELL + 1 },\n dripStyle: 'padrao',\n },\n})\n\nconst WORKSHOP_CELL = 0.0125\n\n/** The Workshop's grid: 160 x 448 cells (wall 160, sidewalk 128, curb 9, road 151) at the foot of the workshop's wall. */\nexport const WORKSHOP_LAYOUT: FilmLayout = createFoldedLayout({\n id: 'workshop',\n columns: 160,\n cellSize: WORKSHOP_CELL,\n originX: -2.2,\n wallRows: 160,\n sidewalkRows: 128,\n curbRows: 9,\n roadRows: 151,\n wallTopY: 2.12,\n sidewalkY: 0.1235,\n roadY: 0.009,\n wallZ: -4.497,\n roadSlopeAnchorX: -1.2,\n rules: { dropCapacity: 400, curbCatch: false, guardBehindWall: false, clipRoadEnd: false, dripStyle: 'workshop' },\n})\n","import { add, cross, dot, normalize, scale, sub } from '../math'\nimport { makeBasis } from '../stains'\nimport type { SurfaceSpec, Vec3 } from '../types'\nimport { valueNoise } from './noise'\nimport type { FilmLayout, FilmRegion, FilmRules } from './types'\n\nexport interface SurfaceLayoutOptions {\n /** The surface the film lies on (a floor, a table, a ramp). */\n floor: SurfaceSpec\n /** A wall that meets the floor: the film folds up it, so a splash on the wall runs down onto the floor. */\n wall?: SurfaceSpec\n /** The lower surface beyond the floor's far edge: the film folds down a curb face to it. Needs the wall or the floor's tangent to say where the edge is. */\n curb?: SurfaceSpec\n /** World point the grid is centred on (sideways; and along the floor when there is no wall). */\n center: Vec3\n /** Cells across (default 160: 2 m of 1.25 cm cells, the grid of the near-player manager). */\n columns?: number\n /** Cells along all strips together (default 160). */\n rows?: number\n /** Metres per cell (default 0.0125). */\n cellSize?: number\n /** Rows of the wall strip (default 48 with a wall, else 0) and cap of the curb face rows (default 12). */\n wallRows?: number\n curbRows?: number\n}\n\nconst DEFAULT_COLUMNS = 160\nconst DEFAULT_ROWS = 160\nconst DEFAULT_CELL = 0.0125\nconst DEFAULT_WALL_ROWS = 48\nconst DEFAULT_CURB_ROWS = 12\nconst RULES: FilmRules = { dropCapacity: 160, curbCatch: false, guardBehindWall: false, clipRoadEnd: false, dripStyle: 'padrao' }\n\nconst along3 = (origin: Vec3, axis: Vec3, distance: number): Vec3 => add(origin, scale(axis, distance))\n\n/** Removes the part of `vector` along the unit `axis`. */\nconst reject = (vector: Vec3, axis: Vec3): Vec3 => sub(vector, scale(axis, dot(vector, axis)))\n\ninterface Strip {\n id: string\n rows: number\n origin: Vec3\n rowAxis: Vec3\n normal: Vec3\n isVertical: boolean\n roughness: number\n}\n\n/**\n * Builds the folded grid from the host's surfaces: `wall` (optional) hangs above the fold line, `floor` runs away from the wall, and\n * `curb` (optional) is the lower surface the floor drops to over a curb face. Without a wall the grid is a flat patch of the floor around `center`.\n * Bed heights come from world y, so a tilted floor makes the film run downhill.\n */\nexport function layoutFromSurfaces(options: SurfaceLayoutOptions): FilmLayout {\n const columns = options.columns ?? DEFAULT_COLUMNS\n const totalRows = options.rows ?? DEFAULT_ROWS\n const cell = options.cellSize ?? DEFAULT_CELL\n const floorBasis = makeBasis(options.floor.normal, options.floor.tangent)\n const floorNormal = floorBasis.normal\n const projected = sub(options.center, scale(floorNormal, dot(sub(options.center, options.floor.point), floorNormal)))\n const wallNormal = options.wall ? normalize(reject(options.wall.normal, floorNormal), floorBasis.t2) : undefined\n const awayAxis = wallNormal ?? floorBasis.t2\n const columnAxis = wallNormal ? normalize(cross(floorNormal, wallNormal), floorBasis.t1) : floorBasis.t1\n const wallRows = options.wall ? Math.min(totalRows - 1, options.wallRows ?? DEFAULT_WALL_ROWS) : 0\n\n let fold = projected\n if (options.wall && wallNormal) {\n const toWall = dot(sub(projected, options.wall.point), wallNormal) / (dot(awayAxis, wallNormal) || 1)\n fold = sub(projected, scale(awayAxis, toWall))\n } else {\n fold = along3(projected, awayAxis, -(totalRows * cell) / 2)\n }\n const lateral = dot(sub(projected, fold), columnAxis) - (columns * cell) / 2\n const base = along3(fold, columnAxis, lateral)\n\n const strips: Strip[] = []\n const roughness = 0.18 + 0.4 * options.floor.porosity\n if (options.wall && wallNormal) {\n strips.push({ id: 'wall', rows: wallRows, origin: along3(base, floorNormal, wallRows * cell), rowAxis: scale(floorNormal, -1), normal: wallNormal, isVertical: true, roughness: 0.3 })\n }\n const lowerRows = totalRows - wallRows\n const dropMetres = options.curb ? Math.max(0, dot(sub(options.floor.point, options.curb.point), floorNormal)) : 0\n const curbRows = options.curb ? Math.min(options.curbRows ?? DEFAULT_CURB_ROWS, Math.max(1, Math.ceil(dropMetres / cell)), lowerRows - 2) : 0\n const floorRows = options.curb ? Math.max(1, Math.floor((lowerRows - curbRows) / 2)) : lowerRows\n strips.push({ id: 'floor', rows: floorRows, origin: base, rowAxis: awayAxis, normal: floorNormal, isVertical: false, roughness })\n if (options.curb) {\n const edge = along3(base, awayAxis, floorRows * cell)\n strips.push({ id: 'curb', rows: curbRows, origin: edge, rowAxis: scale(floorNormal, -1), normal: awayAxis, isVertical: true, roughness: 0.2 })\n const lowerOrigin = along3(edge, floorNormal, -curbRows * cell)\n strips.push({ id: 'low', rows: lowerRows - floorRows - curbRows, origin: lowerOrigin, rowAxis: awayAxis, normal: floorNormal, isVertical: false, roughness: 0.55 })\n }\n\n const regions: FilmRegion[] = []\n let firstRow = 0\n for (const strip of strips) {\n regions.push({ id: strip.id, firstRow, rowCount: strip.rows, origin: strip.origin, columnAxis, rowAxis: strip.rowAxis, normal: strip.normal, isVertical: strip.isVertical })\n firstRow += strip.rows\n }\n\n const height = firstRow\n const bed = new Float32Array(columns * height)\n const pin = new Float32Array(columns * height)\n const vertical = new Float32Array(columns * height)\n regions.forEach((region, regionIndex) => {\n const strip = strips[regionIndex]!\n for (let row = 0; row < region.rowCount; row++) {\n for (let column = 0; column < columns; column++) {\n const index = (region.firstRow + row) * columns + column\n const centre = add(add(region.origin, scale(columnAxis, (column + 0.5) * cell)), scale(region.rowAxis, (row + 0.5) * cell))\n const noise = valueNoise(column * 0.35, (region.firstRow + row) * 0.35) * 0.6 + valueNoise(column * 1.3, (region.firstRow + row) * 1.3) * 0.4\n bed[index] = centre[1] * 1000 + (noise - 0.5) * strip.roughness * 2\n vertical[index] = region.isVertical ? 0.95 : 1\n pin[index] = 0.62 + 0.76 * (valueNoise(column * 0.21 + 40, (region.firstRow + row) * 0.21) * 0.5 + valueNoise(column * 0.9, row * 0.9) * 0.5)\n }\n }\n })\n\n const lowestY = Math.min(...regions.map((region) => region.origin[1] - (region.rowAxis[1] > 0 ? 0 : region.rowCount * cell * Math.abs(region.rowAxis[1])))) - 1\n const width = columns * cell\n const cellToWorld = (row: number, column: number): Vec3 => {\n const region = regions.find((candidate) => row < candidate.firstRow + candidate.rowCount) ?? regions[regions.length - 1]!\n return add(add(region.origin, scale(region.columnAxis, column * cell)), scale(region.rowAxis, (row - region.firstRow) * cell))\n }\n\n return {\n id: 'surfaces',\n width: columns,\n height,\n cellSize: cell,\n bed,\n pin,\n vertical,\n regions,\n rules: RULES,\n cellToWorld,\n collide(previous, position) {\n for (let index = 0; index < regions.length; index++) {\n const region = regions[index]!\n const before = dot(sub(previous, region.origin), region.normal)\n const after = dot(sub(position, region.origin), region.normal)\n if (before < 0 || after > 0) continue\n const local = sub(position, region.origin)\n const sideways = dot(local, region.columnAxis)\n const downward = dot(local, region.rowAxis)\n if (sideways < 0 || sideways >= width || downward < 0 || downward >= region.rowCount * cell) continue\n position[0] -= region.normal[0] * after\n position[1] -= region.normal[1] * after\n position[2] -= region.normal[2] * after\n return index\n }\n return -1\n },\n impact(regionIndex, position, velocity) {\n const region = regions[regionIndex]!\n const local = sub(position, region.origin)\n return {\n row: region.firstRow + dot(local, region.rowAxis) / cell,\n column: dot(local, region.columnAxis) / cell,\n along: [dot(velocity, region.columnAxis), dot(velocity, region.rowAxis)],\n normalSpeed: -dot(velocity, region.normal),\n }\n },\n contains: () => true,\n escaped: (position) => position[1] < lowestY,\n }\n}\n","[\n {\n \"id\": \"blood\",\n \"look\": \"blood\",\n \"flow\": 0.05,\n \"pin\": 0.33,\n \"front\": 0.58,\n \"referenceThickness\": 0.6,\n \"slopeCap\": 1.1,\n \"dryTime\": 600,\n \"evaporation\": 0,\n \"opacityRate\": 3.2,\n \"reflectance\": 0.045,\n \"normalScale\": 16,\n \"thin\": 7997966,\n \"thick\": 2753028,\n \"dry\": 3874068,\n \"dryThin\": 6960678,\n \"dropColor\": 7997965,\n \"dropOpacity\": 1,\n \"volume\": 1,\n \"spikes\": 1,\n \"landsAsBlob\": false,\n \"maxAmount\": 2.6,\n \"sources\": {\n \"padrao\": \"F46\",\n \"oficina\": \"W583\"\n }\n },\n {\n \"id\": \"old_blood\",\n \"look\": \"blood\",\n \"flow\": 0.032,\n \"pin\": 0.42,\n \"front\": 0.7,\n \"referenceThickness\": 0.7,\n \"slopeCap\": 1,\n \"dryTime\": 360,\n \"evaporation\": 0,\n \"opacityRate\": 3.8,\n \"reflectance\": 0.03,\n \"normalScale\": 14,\n \"thin\": 7085078,\n \"thick\": 2888717,\n \"dry\": 2758158,\n \"dryThin\": 4860444,\n \"dropColor\": 4854286,\n \"dropOpacity\": 1,\n \"volume\": 0.6,\n \"spikes\": 1,\n \"landsAsBlob\": false,\n \"maxAmount\": 2.6,\n \"sources\": {\n \"padrao\": \"F48\"\n }\n },\n {\n \"id\": \"bile\",\n \"look\": \"bile\",\n \"flow\": 0.02,\n \"pin\": 0.8,\n \"front\": 1.2,\n \"referenceThickness\": 1.2,\n \"slopeCap\": 0.9,\n \"dryTime\": 900,\n \"evaporation\": 0,\n \"opacityRate\": 7,\n \"reflectance\": 0.04,\n \"normalScale\": 12,\n \"thin\": 11121724,\n \"thick\": 7174171,\n \"dry\": 4080160,\n \"dryThin\": 5659180,\n \"dropColor\": 9083434,\n \"dropOpacity\": 1,\n \"volume\": 1.3,\n \"spikes\": 0.3,\n \"landsAsBlob\": false,\n \"maxAmount\": 4,\n \"sources\": {\n \"padrao\": \"F50\",\n \"oficina\": \"W584 (spikes 0.3 W578, cap 4 W691)\"\n }\n },\n {\n \"id\": \"motor_oil\",\n \"look\": \"oil\",\n \"flow\": 0.03,\n \"pin\": 0.12,\n \"front\": 0.22,\n \"referenceThickness\": 0.5,\n \"slopeCap\": 1,\n \"dryTime\": 0,\n \"evaporation\": 0,\n \"opacityRate\": 4.5,\n \"reflectance\": 0.06,\n \"normalScale\": 18,\n \"thin\": 1381135,\n \"thick\": 263173,\n \"dry\": 263173,\n \"dryThin\": 1381135,\n \"dropColor\": 657932,\n \"dropOpacity\": 1,\n \"volume\": 1,\n \"spikes\": 1,\n \"landsAsBlob\": true,\n \"maxAmount\": 2.6,\n \"sources\": {\n \"padrao\": \"F52\",\n \"oficina\": \"W585 (blob W691)\"\n }\n },\n {\n \"id\": \"fuel\",\n \"look\": \"fuel\",\n \"flow\": 0.2,\n \"pin\": 0.035,\n \"front\": 0.07,\n \"referenceThickness\": 0.2,\n \"slopeCap\": 1.2,\n \"dryTime\": 0,\n \"evaporation\": 0.02,\n \"opacityRate\": 0.25,\n \"reflectance\": 0.04,\n \"normalScale\": 0,\n \"thin\": 10129520,\n \"thick\": 7234630,\n \"dry\": 0,\n \"dryThin\": 0,\n \"dropColor\": 12103824,\n \"dropOpacity\": 0.45,\n \"volume\": 1.4,\n \"spikes\": 1,\n \"landsAsBlob\": true,\n \"maxAmount\": 2.6,\n \"sources\": {\n \"padrao\": \"F54\",\n \"oficina\": \"W586 (blob W691)\"\n }\n }\n]\n","import profilesData from '../data/film-profiles.json'\nimport type { LiquidId } from '../types'\nimport type { FilmProfile } from './types'\n\n/** Film profiles of the liquids that run as a film (F46-55, plus the Workshop's `spikes` and `landsAsBlob`). Data in `data/film-profiles.json`. */\nexport const FILM_PROFILES: FilmProfile[] = profilesData as unknown as FilmProfile[]\n\n/** The profile of a liquid with the given overrides, or undefined when the liquid has no film. */\nexport function filmProfileOf(id: LiquidId, overrides: Partial<FilmProfile> = {}): FilmProfile | undefined {\n const profile = FILM_PROFILES.find((entry) => entry.id === id)\n return profile ? { ...profile, ...overrides } : undefined\n}\n"],"mappings":"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","names":["q","x","z","n","basis","flow","options","length","distance","GRAVITY","sideX","sideZ","distance","length","distance"]}
|