@invinite-org/chartlang-host-worker 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +228 -0
- package/LICENSE +21 -0
- package/README.md +70 -0
- package/dist/createWorkerBoot.d.ts +45 -0
- package/dist/createWorkerBoot.d.ts.map +1 -0
- package/dist/createWorkerBoot.js +122 -0
- package/dist/createWorkerBoot.js.map +1 -0
- package/dist/createWorkerHost.d.ts +55 -0
- package/dist/createWorkerHost.d.ts.map +1 -0
- package/dist/createWorkerHost.js +167 -0
- package/dist/createWorkerHost.js.map +1 -0
- package/dist/defaultWorkerFactory.d.ts +19 -0
- package/dist/defaultWorkerFactory.d.ts.map +1 -0
- package/dist/defaultWorkerFactory.js +23 -0
- package/dist/defaultWorkerFactory.js.map +1 -0
- package/dist/filterEmissions.d.ts +21 -0
- package/dist/filterEmissions.d.ts.map +1 -0
- package/dist/filterEmissions.js +107 -0
- package/dist/filterEmissions.js.map +1 -0
- package/dist/idb.d.ts +2 -0
- package/dist/idb.d.ts.map +1 -0
- package/dist/idb.js +4 -0
- package/dist/idb.js.map +1 -0
- package/dist/idbStateStore.d.ts +22 -0
- package/dist/idbStateStore.d.ts.map +1 -0
- package/dist/idbStateStore.js +255 -0
- package/dist/idbStateStore.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/limits.d.ts +40 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +48 -0
- package/dist/limits.js.map +1 -0
- package/dist/protocol.d.ts +70 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +4 -0
- package/dist/protocol.js.map +1 -0
- package/dist/types.d.ts +164 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/worker-boot.d.ts +6 -0
- package/dist/worker-boot.js +14999 -0
- package/dist/worker-boot.js.map +7 -0
- package/dist/workerBoot.d.ts +2 -0
- package/dist/workerBoot.d.ts.map +1 -0
- package/dist/workerBoot.js +18 -0
- package/dist/workerBoot.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../runtime/src/ringBuffer.ts", "../../runtime/src/seriesView.ts", "../../runtime/src/streamState.ts", "../../runtime/src/stateStore.ts", "../../runtime/src/state/lifecycle.ts", "../../runtime/src/runtimeContext.ts", "../../runtime/src/state/stateSlot.ts", "../../runtime/src/state/stateNamespace.ts", "../../runtime/src/inputs/resolveInputs.ts", "../../runtime/src/request/bucketLtfBarsByMainContainment.ts", "../../runtime/src/request/bucketLtfBarsCache.ts", "../../runtime/src/request/pushOnce.ts", "../../runtime/src/request/streamBars.ts", "../../runtime/src/request/lowerTf.ts", "../../runtime/src/request/alignHtfSeriesToLtf.ts", "../../runtime/src/request/alignHtfSeriesCache.ts", "../../runtime/src/request/security.ts", "../../runtime/src/request/requestNamespace.ts", "../../runtime/src/views/barstateView.ts", "../../runtime/src/views/timeframeView.ts", "../../runtime/src/views/refreshRuntimeViews.ts", "../../runtime/src/views/symInfoView.ts", "../../runtime/src/views/index.ts", "../../core/src/interval/intervalToSeconds.ts", "../../core/src/input/input.ts", "../../core/src/state/state.ts", "../../core/src/views/barstate.ts", "../../core/src/views/syminfo.ts", "../../core/src/views/timeframe.ts", "../../core/src/request/request.ts", "../../core/src/runtime/runtime.ts", "../../core/src/color/parseColor.ts", "../../core/src/color/colorHelpers.ts", "../../core/src/color/index.ts", "../../core/src/statefulPrimitives.ts", "../../core/src/draw/drawingKind.ts", "../../core/src/draw/buckets.ts", "../../core/src/draw/draw.ts", "../../adapter-kit/src/capabilities/capabilities.ts", "../../adapter-kit/src/validation/validateEmission.ts", "../../runtime/src/emit/emissionsQueue.ts", "../../runtime/src/emit/hash.ts", "../../runtime/src/emit/alert.ts", "../../runtime/src/emit/alertConditionEmission.ts", "../../runtime/src/emit/draw/pushDrawing.ts", "../../runtime/src/emit/draw/handle.ts", "../../runtime/src/emit/draw/subIdAllocator.ts", "../../runtime/src/emit/draw/annotations/arrow.ts", "../../runtime/src/emit/draw/annotations/arrowMarkDown.ts", "../../runtime/src/emit/draw/annotations/arrowMarkUp.ts", "../../runtime/src/emit/draw/annotations/arrowMarker.ts", "../../runtime/src/emit/draw/annotations/text.ts", "../../runtime/src/emit/draw/boxes/circle.ts", "../../runtime/src/emit/draw/boxes/ellipse.ts", "../../runtime/src/emit/draw/boxes/marker.ts", "../../runtime/src/emit/draw/boxes/path.ts", "../../runtime/src/emit/draw/boxes/polyline.ts", "../../runtime/src/emit/draw/boxes/rectangle.ts", "../../runtime/src/emit/draw/boxes/rotatedRectangle.ts", "../../runtime/src/emit/draw/boxes/triangle.ts", "../../runtime/src/emit/draw/channels/disjointChannel.ts", "../../runtime/src/emit/draw/channels/flatTopBottom.ts", "../../runtime/src/emit/draw/channels/regressionTrend.ts", "../../runtime/src/emit/draw/channels/trendChannel.ts", "../../runtime/src/emit/draw/containers/frame.ts", "../../runtime/src/emit/draw/containers/group.ts", "../../runtime/src/emit/draw/curves/arc.ts", "../../runtime/src/emit/draw/curves/brush.ts", "../../runtime/src/emit/draw/curves/curve.ts", "../../runtime/src/emit/draw/curves/doubleCurve.ts", "../../runtime/src/emit/draw/curves/highlighter.ts", "../../runtime/src/emit/draw/curves/pen.ts", "../../runtime/src/emit/draw/cycles/cyclicLines.ts", "../../runtime/src/emit/draw/cycles/sineLine.ts", "../../runtime/src/emit/draw/cycles/timeCycles.ts", "../../runtime/src/emit/draw/elliott/elliottCorrectionWave.ts", "../../runtime/src/emit/draw/elliott/elliottDoubleCombo.ts", "../../runtime/src/emit/draw/elliott/elliottImpulseWave.ts", "../../runtime/src/emit/draw/elliott/elliottTriangleWave.ts", "../../runtime/src/emit/draw/elliott/elliottTripleCombo.ts", "../../runtime/src/emit/draw/fibA/fibChannel.ts", "../../runtime/src/emit/draw/fibA/fibRetracement.ts", "../../runtime/src/emit/draw/fibA/fibTimeZone.ts", "../../runtime/src/emit/draw/fibA/fibTrendExtension.ts", "../../runtime/src/emit/draw/fibA/fibWedge.ts", "../../runtime/src/emit/draw/fibB/fibCircles.ts", "../../runtime/src/emit/draw/fibB/fibSpeedArcs.ts", "../../runtime/src/emit/draw/fibB/fibSpeedFan.ts", "../../runtime/src/emit/draw/fibB/fibSpiral.ts", "../../runtime/src/emit/draw/fibB/fibTrendTime.ts", "../../runtime/src/emit/draw/gann/gannBox.ts", "../../runtime/src/emit/draw/gann/gannFan.ts", "../../runtime/src/emit/draw/gann/gannSquare.ts", "../../runtime/src/emit/draw/gann/gannSquareFixed.ts", "../../runtime/src/emit/draw/lines/crossLine.ts", "../../runtime/src/emit/draw/lines/horizontalLine.ts", "../../runtime/src/emit/draw/lines/horizontalRay.ts", "../../runtime/src/emit/draw/lines/line.ts", "../../runtime/src/emit/draw/lines/trendAngle.ts", "../../runtime/src/emit/draw/lines/verticalLine.ts", "../../runtime/src/emit/draw/patterns/abcdPattern.ts", "../../runtime/src/emit/draw/patterns/cypherPattern.ts", "../../runtime/src/emit/draw/patterns/headAndShoulders.ts", "../../runtime/src/emit/draw/patterns/threeDrivesPattern.ts", "../../runtime/src/emit/draw/patterns/trianglePattern.ts", "../../runtime/src/emit/draw/patterns/xabcdPattern.ts", "../../runtime/src/emit/draw/pitchforks/pitchfan.ts", "../../runtime/src/emit/draw/pitchforks/pitchfork.ts", "../../runtime/src/emit/draw/table/table.ts", "../../runtime/src/emit/draw/namespace.ts", "../../runtime/src/emit/hline.ts", "../../runtime/src/emit/runtimeError.ts", "../../runtime/src/emit/logEmission.ts", "../../runtime/src/emit/paneResolver.ts", "../../runtime/src/emit/plot.ts", "../../runtime/src/execution/drain.ts", "../../runtime/src/execution/dispose.ts", "../../runtime/src/ta/adl.ts", "../../runtime/src/ta/adr.ts", "../../runtime/src/ta/lib/wilderSmoothing.ts", "../../runtime/src/ta/lib/directionalState.ts", "../../runtime/src/ta/adx.ts", "../../runtime/src/ta/lib/sourceValue.ts", "../../runtime/src/ta/alma.ts", "../../runtime/src/ta/lib/volume-profile/bucketEdges.ts", "../../runtime/src/ta/lib/volume-profile/bucketizeVolume.ts", "../../runtime/src/ta/lib/volume-profile/types.ts", "../../runtime/src/ta/lib/volume-profile/valueArea.ts", "../../runtime/src/ta/lib/volume-profile/developingSeries.ts", "../../runtime/src/ta/lib/volume-profile/tooHeavy.ts", "../../runtime/src/ta/lib/volume-profile/volumeProfileShared.ts", "../../runtime/src/ta/lib/volume-profile/scaffold.ts", "../../runtime/src/ta/anchoredVolumeProfile.ts", "../../runtime/src/ta/anchoredVwap.ts", "../../runtime/src/ta/sma.ts", "../../runtime/src/ta/ao.ts", "../../runtime/src/ta/aroon.ts", "../../runtime/src/ta/aroonOsc.ts", "../../runtime/src/ta/atr.ts", "../../runtime/src/ta/barssince.ts", "../../runtime/src/ta/stdev.ts", "../../runtime/src/ta/bb.ts", "../../runtime/src/ta/bbPercentB.ts", "../../runtime/src/ta/bbw.ts", "../../runtime/src/ta/bop.ts", "../../runtime/src/ta/cci.ts", "../../runtime/src/ta/ema.ts", "../../runtime/src/ta/chaikinOsc.ts", "../../runtime/src/ta/highest.ts", "../../runtime/src/ta/lowest.ts", "../../runtime/src/ta/chandeKrollStop.ts", "../../runtime/src/ta/chandelier.ts", "../../runtime/src/ta/change.ts", "../../runtime/src/ta/chop.ts", "../../runtime/src/ta/cmf.ts", "../../runtime/src/ta/cmo.ts", "../../runtime/src/ta/rsi.ts", "../../runtime/src/ta/connorsRsi.ts", "../../runtime/src/ta/coppock.ts", "../../runtime/src/ta/crossover.ts", "../../runtime/src/ta/crossunder.ts", "../../runtime/src/ta/dema.ts", "../../runtime/src/ta/dmi.ts", "../../runtime/src/ta/donchian.ts", "../../runtime/src/ta/dpo.ts", "../../runtime/src/ta/smma.ts", "../../runtime/src/ta/wma.ts", "../../runtime/src/ta/envelope.ts", "../../runtime/src/ta/eom.ts", "../../runtime/src/ta/fisher.ts", "../../runtime/src/ta/fixedRangeVolumeProfile.ts", "../../runtime/src/ta/historicalVolatility.ts", "../../runtime/src/ta/hma.ts", "../../runtime/src/ta/ichimoku.ts", "../../runtime/src/ta/kama.ts", "../../runtime/src/ta/keltner.ts", "../../runtime/src/ta/klinger.ts", "../../runtime/src/ta/kst.ts", "../../runtime/src/ta/lsma.ts", "../../runtime/src/ta/maRibbon.ts", "../../runtime/src/ta/macd.ts", "../../runtime/src/ta/massIndex.ts", "../../runtime/src/ta/mcginley.ts", "../../runtime/src/ta/median.ts", "../../runtime/src/ta/mfi.ts", "../../runtime/src/ta/momentum.ts", "../../runtime/src/ta/netVolume.ts", "../../runtime/src/ta/nvi.ts", "../../runtime/src/ta/nz.ts", "../../runtime/src/ta/obv.ts", "../../runtime/src/ta/pivotsHighLow.ts", "../../runtime/src/ta/pivotsStandard.ts", "../../runtime/src/ta/pmo.ts", "../../runtime/src/ta/ppo.ts", "../../runtime/src/ta/psar.ts", "../../runtime/src/ta/pvi.ts", "../../runtime/src/ta/pvo.ts", "../../runtime/src/ta/pvt.ts", "../../runtime/src/ta/roc.ts", "../../runtime/src/ta/rvgi.ts", "../../runtime/src/ta/rvi.ts", "../../runtime/src/ta/sessionVolumeProfile.ts", "../../runtime/src/ta/smi.ts", "../../runtime/src/ta/stoch.ts", "../../runtime/src/ta/stochRsi.ts", "../../runtime/src/ta/supertrend.ts", "../../runtime/src/ta/tema.ts", "../../runtime/src/ta/trendStrengthIndex.ts", "../../runtime/src/ta/trix.ts", "../../runtime/src/ta/tsi.ts", "../../runtime/src/ta/ulcerIndex.ts", "../../runtime/src/ta/ultimateOsc.ts", "../../runtime/src/ta/valuewhen.ts", "../../runtime/src/ta/visibleRangeVolumeProfile.ts", "../../runtime/src/ta/vol.ts", "../../runtime/src/ta/volatilityStop.ts", "../../runtime/src/ta/vortex.ts", "../../runtime/src/ta/vwap.ts", "../../runtime/src/ta/vwma.ts", "../../runtime/src/ta/williamsFractal.ts", "../../runtime/src/ta/williamsR.ts", "../../runtime/src/ta/zigZag.ts", "../../runtime/src/ta/registry.ts", "../../runtime/src/primitives.ts", "../../runtime/src/buildComputeContext.ts", "../../runtime/src/execution/onBarClose.ts", "../../runtime/src/execution/onBarTick.ts", "../../runtime/src/execution/onHistory.ts", "../../runtime/src/execution/secondaryStream.ts", "../../runtime/src/persistentStateStore.validate.ts", "../../runtime/src/ta/persistence.ts", "../../runtime/src/persistentStateStore.runtime.ts", "../../runtime/src/createScriptRunner.ts", "../src/filterEmissions.ts", "../src/limits.ts", "../src/createWorkerBoot.ts", "../src/workerBoot.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\n/**\n * Shared contract for the two ring-buffer flavours the runtime ships\n * (`RingBuffer<T>` for object payloads, `Float64RingBuffer` for numeric\n * payloads). Mirrors PLAN.md \u00A76.6 \u2014 `at(n)` returns `undefined` on\n * out-of-range reads in the generic shape; `Float64RingBuffer` narrows\n * the return to `number` with `NaN` as the OOR sentinel.\n *\n * @since 0.1\n * @example\n * const buf: RingBufferLike<number> = new Float64RingBuffer(8);\n * buf.append(42);\n * buf.at(0); // 42\n */\nexport interface RingBufferLike<T> {\n readonly capacity: number;\n readonly length: number;\n append(v: T): void;\n replaceHead(v: T): void;\n at(n: number): T | undefined;\n reset(): void;\n}\n\n/**\n * Generic ring buffer over an `Array<T>`. Backs object-valued\n * `Series<T>` (e.g. Phase-3 drawing handles). For numeric series use\n * `Float64RingBuffer` \u2014 it avoids the array-pointer indirection on\n * every read.\n *\n * Out-of-range `at(n)` returns `undefined`. `replaceHead` on an empty\n * buffer behaves like `append` so the first call after construction\n * does not need a special-case branch in callers.\n *\n * @since 0.1\n * @example\n * const buf = new RingBuffer<string>(3);\n * buf.append(\"a\");\n * buf.append(\"b\");\n * buf.append(\"c\");\n * buf.append(\"d\"); // overwrites \"a\"\n * buf.at(0); // \"d\"\n * buf.at(2); // \"b\"\n */\nexport class RingBuffer<T> implements RingBufferLike<T> {\n private buf: Array<T | undefined>;\n private head = -1;\n private filled = 0;\n\n constructor(public readonly capacity: number) {\n this.buf = new Array<T | undefined>(capacity);\n }\n\n append(v: T): void {\n this.head = (this.head + 1) % this.capacity;\n this.buf[this.head] = v;\n if (this.filled < this.capacity) this.filled += 1;\n }\n\n replaceHead(v: T): void {\n if (this.head === -1) {\n this.append(v);\n return;\n }\n this.buf[this.head] = v;\n }\n\n at(n: number): T | undefined {\n if (n < 0 || n >= this.filled) return undefined;\n return this.buf[(this.head - n + this.capacity) % this.capacity];\n }\n\n get length(): number {\n return this.filled;\n }\n\n reset(): void {\n this.buf = new Array<T | undefined>(this.capacity);\n this.head = -1;\n this.filled = 0;\n }\n}\n\n/**\n * Numeric ring buffer backed by a `Float64Array`. Reads are direct\n * memory hits \u2014 no boxing, no map lookup. Out-of-range reads return\n * `NaN` (the language-wide warmup sentinel per PLAN.md \u00A76.3), which\n * is the correct value for unwarmed indicator slots.\n *\n * `at(n)` narrows the shared `RingBufferLike<T>`'s `T | undefined`\n * return to plain `number` in a covariant return position; callers\n * that hold this concrete class see `number`, callers that hold\n * the wider interface see `number | undefined`.\n *\n * @since 0.1\n * @example\n * const buf = new Float64RingBuffer(4);\n * buf.append(1.0);\n * buf.append(2.0);\n * buf.at(0); // 2\n * buf.at(5); // NaN\n */\nexport class Float64RingBuffer implements RingBufferLike<number> {\n private buf: Float64Array;\n private head = -1;\n private filled = 0;\n\n constructor(public readonly capacity: number) {\n this.buf = new Float64Array(capacity);\n }\n\n append(v: number): void {\n this.head = (this.head + 1) % this.capacity;\n this.buf[this.head] = v;\n if (this.filled < this.capacity) this.filled += 1;\n }\n\n replaceHead(v: number): void {\n if (this.head === -1) {\n this.append(v);\n return;\n }\n this.buf[this.head] = v;\n }\n\n at(n: number): number {\n if (n < 0 || n >= this.filled) return Number.NaN;\n return this.buf[(this.head - n + this.capacity) % this.capacity];\n }\n\n get length(): number {\n return this.filled;\n }\n\n serialiseSnapshotBuffer(): Readonly<{\n headIndex: number;\n filled: number;\n values: ReadonlyArray<number | null>;\n }> {\n const values: Array<number | null> = [];\n for (const value of this.buf) {\n values.push(Number.isNaN(value) ? null : value);\n }\n return Object.freeze({\n headIndex: this.head,\n filled: this.filled,\n values: Object.freeze(values),\n });\n }\n\n restoreFromSnapshotBuffer(\n args: Readonly<{\n headIndex: number;\n filled: number;\n values: ReadonlyArray<number | null>;\n }>,\n ): void {\n if (\n args.values.length !== this.capacity ||\n !Number.isInteger(args.headIndex) ||\n args.headIndex < -1 ||\n args.headIndex >= this.capacity ||\n !Number.isInteger(args.filled) ||\n args.filled < 0 ||\n args.filled > this.capacity ||\n (args.filled === 0 && args.headIndex !== -1) ||\n (args.filled > 0 && args.headIndex < 0)\n ) {\n throw new Error(\"invalid ring buffer snapshot\");\n }\n const next = new Float64Array(this.capacity);\n for (let i = 0; i < args.values.length; i += 1) {\n const value = args.values[i];\n next[i] = value === null ? Number.NaN : value;\n }\n this.buf = next;\n this.head = args.headIndex;\n this.filled = args.filled;\n }\n\n reset(): void {\n this.buf = new Float64Array(this.capacity);\n this.head = -1;\n this.filled = 0;\n }\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { Series } from \"@invinite-org/chartlang-core\";\n\nimport type { RingBufferLike } from \"./ringBuffer.js\";\n\n/**\n * Wrap a `RingBufferLike<T>` in the user-facing `Series<T>` Proxy shape\n * from PLAN.md \u00A76.6. The Proxy is created **once per backing buffer**\n * at stream/slot construction time and re-used across every bar \u2014 its\n * identity is stable so script authors can keep `const ema = ta.ema(...)`\n * at the top of `compute` and reference `ema` the same way every bar.\n *\n * Property reads dispatch as follows:\n * - `series.current` \u2192 `buf.at(0)`\n * - `series.length` \u2192 `buf.length`\n * - `series[n]` (string coerces to a non-negative integer) \u2192 `buf.at(n)`\n * - any other key \u2192 `undefined`\n *\n * For numeric buffers (`Float64RingBuffer`) out-of-range reads return\n * `NaN`; for object buffers they return `undefined`. The Proxy passes\n * the underlying sentinel through verbatim.\n *\n * @since 0.1\n * @example\n * // import { Float64RingBuffer, makeSeriesView }\n * // from \"@invinite-org/chartlang-runtime\";\n * // const buf = new Float64RingBuffer(8);\n * // const view = makeSeriesView<number>(buf);\n * // buf.append(42);\n * // view.current; // 42\n * // view[0]; // 42\n * // view.length; // 1\n */\nexport function makeSeriesView<T>(buf: RingBufferLike<T>): Series<T> {\n return new Proxy({} as Series<T>, {\n get(_target, prop) {\n if (prop === \"current\") return buf.at(0);\n if (prop === \"length\") return buf.length;\n if (typeof prop === \"string\") {\n const n = Number(prop);\n if (Number.isInteger(n) && n >= 0) return buf.at(n);\n }\n return undefined;\n },\n has(_target, prop) {\n if (prop === \"current\" || prop === \"length\") return true;\n if (typeof prop === \"string\") {\n const n = Number(prop);\n return Number.isInteger(n) && n >= 0;\n }\n return false;\n },\n });\n}\n\n/**\n * Offset-shifted variant of {@link makeSeriesView}. `offset === 0`\n * returns the same Proxy shape (and is the identity-preserving fast\n * path callers should special-case at the call site). For\n * `offset === k > 0`, `view.current === buf.at(k)` \u2014 i.e. the value\n * `k` bars ago, matching `lib/applyOffset`'s\n * `out[i] = values[i \u2212 offset]` semantics. For `offset === -k`,\n * `view.current === buf.at(-k)` \u2014 an OOR read returning the underlying\n * sentinel (NaN for `Float64RingBuffer`, `undefined` for object\n * `RingBuffer`).\n *\n * The shift is applied on every read \u2014 no allocation, no per-bar\n * work. Callers cache the returned Proxy per `(slot, offset)` pair so\n * the view's identity stays stable across bars.\n *\n * @since 0.2\n * @example\n * // import { Float64RingBuffer, makeShiftedSeriesView }\n * // from \"@invinite-org/chartlang-runtime\";\n * // const buf = new Float64RingBuffer(8);\n * // buf.append(10); buf.append(20); buf.append(30);\n * // const view = makeShiftedSeriesView<number>(buf, 1);\n * // view.current; // 20 (one bar ago)\n * // view[0]; // 20\n * // view[1]; // 10\n */\nexport function makeShiftedSeriesView<T>(buf: RingBufferLike<T>, offset: number): Series<T> {\n if (offset === 0) return makeSeriesView<T>(buf);\n return new Proxy({} as Series<T>, {\n get(_target, prop) {\n if (prop === \"current\") return buf.at(offset);\n if (prop === \"length\") return buf.length;\n if (typeof prop === \"string\") {\n const n = Number(prop);\n if (Number.isInteger(n) && n >= 0) return buf.at(n + offset);\n }\n return undefined;\n },\n has(_target, prop) {\n if (prop === \"current\" || prop === \"length\") return true;\n if (typeof prop === \"string\") {\n const n = Number(prop);\n return Number.isInteger(n) && n >= 0;\n }\n return false;\n },\n });\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { Bar, BarViewport, Series, StreamSnapshot } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"./ringBuffer.js\";\nimport { makeSeriesView } from \"./seriesView.js\";\n\ntype DerivedBarValues = Readonly<{\n hl2: number;\n hlc3: number;\n ohlc4: number;\n hlcc4: number;\n}>;\n\nfunction deriveBarSources(rawBar: Bar): DerivedBarValues {\n return {\n hl2: (rawBar.high + rawBar.low) / 2,\n hlc3: (rawBar.high + rawBar.low + rawBar.close) / 3,\n ohlc4: (rawBar.open + rawBar.high + rawBar.low + rawBar.close) / 4,\n hlcc4: (rawBar.high + rawBar.low + rawBar.close + rawBar.close) / 4,\n };\n}\n\n/**\n * The per-stream OHLCV ring-buffer set. Each field is a\n * `Float64RingBuffer` of identical capacity. Derived sources\n * (`hl2`, `hlc3`, `ohlc4`, `hlcc4`) are pre-computed by Task 6's\n * execution loop alongside the raw OHLCV fields so primitives can\n * read them as plain `Series<number>` without re-computing per\n * lookup.\n *\n * @since 0.1\n * @example\n * // import { createStreamState } from \"@invinite-org/chartlang-runtime\";\n * // const { ohlcv } = createStreamState({\n * // interval: \"1D\",\n * // capacity: 5,\n * // symbol: \"AAPL\",\n * // });\n * // ohlcv.close.capacity; // 5\n */\nexport type OhlcvBuffers = {\n readonly time: Float64RingBuffer;\n readonly open: Float64RingBuffer;\n readonly high: Float64RingBuffer;\n readonly low: Float64RingBuffer;\n readonly close: Float64RingBuffer;\n readonly volume: Float64RingBuffer;\n readonly hl2: Float64RingBuffer;\n readonly hlc3: Float64RingBuffer;\n readonly ohlc4: Float64RingBuffer;\n readonly hlcc4: Float64RingBuffer;\n};\n\n/**\n * Mutable scalar view of the current bar. Identity stays stable across\n * the run \u2014 Task 6's execution loop mutates the fields in place per\n * bar so scripts that destructure `bar` in `compute` keep seeing fresh\n * values without rebinding.\n *\n * `symbol` and `interval` are constant for a given `StreamState`\n * instance; the rest are NaN / 0 before the first bar lands.\n *\n * @since 0.1\n * @example\n * // import { createStreamState } from \"@invinite-org/chartlang-runtime\";\n * // const { bar } = createStreamState({\n * // interval: \"1D\",\n * // capacity: 5,\n * // symbol: \"AAPL\",\n * // });\n * // bar.symbol; // \"AAPL\"\n * // bar.interval; // \"1D\"\n * // bar.close; // NaN until the first bar\n */\nexport type BarView = {\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n hl2: number;\n hlc3: number;\n ohlc4: number;\n hlcc4: number;\n symbol: string;\n interval: string;\n viewport: BarViewport;\n};\n\n/**\n * Everything the runtime owns for a single interval stream \u2014 the OHLCV\n * ring buffers, the mutable `BarView`, cached `Series<number>` Proxies\n * for each source field (one identity per buffer for the lifetime of\n * the stream), and a `taSlots` map keyed by compiler-assigned slot id\n * that stateful primitives in Task 7 use as their hidden-state\n * scratchpad.\n *\n * Phase 1 ships single-stream scripts; secondary streams via\n * `request.security` arrive in Phase 5 and reuse this exact shape per\n * interval.\n *\n * @since 0.1\n * @example\n * // import { createStreamState } from \"@invinite-org/chartlang-runtime\";\n * // const stream = createStreamState({\n * // interval: \"1D\",\n * // capacity: 21,\n * // symbol: \"AAPL\",\n * // });\n * // stream.taSlots.size; // 0\n */\nexport type StreamState = {\n readonly interval: string;\n readonly ohlcv: OhlcvBuffers;\n readonly bar: BarView;\n readonly seriesViews: {\n readonly time: Series<number>;\n readonly open: Series<number>;\n readonly high: Series<number>;\n readonly low: Series<number>;\n readonly close: Series<number>;\n readonly volume: Series<number>;\n readonly hl2: Series<number>;\n readonly hlc3: Series<number>;\n readonly ohlc4: Series<number>;\n readonly hlcc4: Series<number>;\n };\n readonly taSlots: Map<string, unknown>;\n serialiseSnapshot(): StreamSnapshot;\n restoreFromSnapshot(snapshot: StreamSnapshot): void;\n};\n\nconst rawBufferKeys = [\"time\", \"open\", \"high\", \"low\", \"close\", \"volume\"] as const;\n\ntype RawBufferKey = (typeof rawBufferKeys)[number];\n\nfunction rawBuffers(ohlcv: OhlcvBuffers): Readonly<Record<RawBufferKey, Float64RingBuffer>> {\n return {\n time: ohlcv.time,\n open: ohlcv.open,\n high: ohlcv.high,\n low: ohlcv.low,\n close: ohlcv.close,\n volume: ohlcv.volume,\n };\n}\n\nfunction valueAt(values: ReadonlyArray<number | null>, index: number): number {\n const value = values[index];\n return value === null || value === undefined ? Number.NaN : value;\n}\n\nfunction recomputeDerivedBuffers(ohlcv: OhlcvBuffers, snapshot: StreamSnapshot): void {\n const { headIndex, filled, buffers } = snapshot;\n const capacity = ohlcv.hl2.capacity;\n const derived = {\n hl2: new Array<number | null>(capacity),\n hlc3: new Array<number | null>(capacity),\n ohlc4: new Array<number | null>(capacity),\n hlcc4: new Array<number | null>(capacity),\n };\n for (let i = 0; i < capacity; i += 1) {\n const high = valueAt(buffers.high, i);\n const low = valueAt(buffers.low, i);\n const open = valueAt(buffers.open, i);\n const close = valueAt(buffers.close, i);\n derived.hl2[i] = Number.isNaN(high) || Number.isNaN(low) ? null : (high + low) / 2;\n derived.hlc3[i] =\n Number.isNaN(high) || Number.isNaN(low) || Number.isNaN(close)\n ? null\n : (high + low + close) / 3;\n derived.ohlc4[i] =\n Number.isNaN(open) || Number.isNaN(high) || Number.isNaN(low) || Number.isNaN(close)\n ? null\n : (open + high + low + close) / 4;\n derived.hlcc4[i] =\n Number.isNaN(high) || Number.isNaN(low) || Number.isNaN(close)\n ? null\n : (high + low + close + close) / 4;\n }\n ohlcv.hl2.restoreFromSnapshotBuffer({ headIndex, filled, values: derived.hl2 });\n ohlcv.hlc3.restoreFromSnapshotBuffer({ headIndex, filled, values: derived.hlc3 });\n ohlcv.ohlc4.restoreFromSnapshotBuffer({ headIndex, filled, values: derived.ohlc4 });\n ohlcv.hlcc4.restoreFromSnapshotBuffer({ headIndex, filled, values: derived.hlcc4 });\n}\n\n/**\n * Construct a fresh `StreamState`. The ring-buffer capacity is the\n * compiler-emitted `manifest.maxLookback + 1` per PLAN.md \u00A76.6\n * (caller must enforce `capacity >= 1`). All buffers start empty;\n * the `BarView` starts with `NaN` prices, `0` time and volume, and the\n * supplied `symbol` / `interval` constants. `taSlots` is an empty map.\n *\n * @since 0.1\n * @example\n * // import { createStreamState } from \"@invinite-org/chartlang-runtime\";\n * // const stream = createStreamState({\n * // interval: \"5m\",\n * // capacity: 12,\n * // symbol: \"BTCUSD\",\n * // });\n * // stream.bar.close; // NaN\n * // stream.ohlcv.close.length; // 0\n */\nexport function createStreamState(args: {\n interval: string;\n capacity: number;\n symbol: string;\n}): StreamState {\n const { interval, capacity, symbol } = args;\n const ohlcv: OhlcvBuffers = {\n time: new Float64RingBuffer(capacity),\n open: new Float64RingBuffer(capacity),\n high: new Float64RingBuffer(capacity),\n low: new Float64RingBuffer(capacity),\n close: new Float64RingBuffer(capacity),\n volume: new Float64RingBuffer(capacity),\n hl2: new Float64RingBuffer(capacity),\n hlc3: new Float64RingBuffer(capacity),\n ohlc4: new Float64RingBuffer(capacity),\n hlcc4: new Float64RingBuffer(capacity),\n };\n const bar: BarView = {\n time: 0,\n open: Number.NaN,\n high: Number.NaN,\n low: Number.NaN,\n close: Number.NaN,\n volume: 0,\n hl2: Number.NaN,\n hlc3: Number.NaN,\n ohlc4: Number.NaN,\n hlcc4: Number.NaN,\n symbol,\n interval,\n viewport: Object.freeze({ fromTime: 0, toTime: 0 }),\n };\n const seriesViews: StreamState[\"seriesViews\"] = {\n time: makeSeriesView<number>(ohlcv.time),\n open: makeSeriesView<number>(ohlcv.open),\n high: makeSeriesView<number>(ohlcv.high),\n low: makeSeriesView<number>(ohlcv.low),\n close: makeSeriesView<number>(ohlcv.close),\n volume: makeSeriesView<number>(ohlcv.volume),\n hl2: makeSeriesView<number>(ohlcv.hl2),\n hlc3: makeSeriesView<number>(ohlcv.hlc3),\n ohlc4: makeSeriesView<number>(ohlcv.ohlc4),\n hlcc4: makeSeriesView<number>(ohlcv.hlcc4),\n };\n const stream: StreamState = {\n interval,\n ohlcv,\n bar,\n seriesViews,\n taSlots: new Map<string, unknown>(),\n serialiseSnapshot(): StreamSnapshot {\n const close = ohlcv.close.serialiseSnapshotBuffer();\n const buffers = rawBuffers(ohlcv);\n return Object.freeze({\n interval: bar.interval,\n headIndex: close.headIndex,\n filled: close.filled,\n buffers: Object.freeze({\n time: buffers.time.serialiseSnapshotBuffer().values,\n open: buffers.open.serialiseSnapshotBuffer().values,\n high: buffers.high.serialiseSnapshotBuffer().values,\n low: buffers.low.serialiseSnapshotBuffer().values,\n close: close.values,\n volume: buffers.volume.serialiseSnapshotBuffer().values,\n }),\n });\n },\n restoreFromSnapshot(snapshot: StreamSnapshot): void {\n const buffers = rawBuffers(ohlcv);\n for (const key of rawBufferKeys) {\n buffers[key].restoreFromSnapshotBuffer({\n headIndex: snapshot.headIndex,\n filled: snapshot.filled,\n values: snapshot.buffers[key],\n });\n }\n recomputeDerivedBuffers(ohlcv, snapshot);\n const current = snapshot.headIndex;\n if (snapshot.filled === 0 || current < 0) {\n bar.time = 0;\n bar.open = Number.NaN;\n bar.high = Number.NaN;\n bar.low = Number.NaN;\n bar.close = Number.NaN;\n bar.volume = 0;\n bar.hl2 = Number.NaN;\n bar.hlc3 = Number.NaN;\n bar.ohlc4 = Number.NaN;\n bar.hlcc4 = Number.NaN;\n } else {\n bar.time = valueAt(snapshot.buffers.time, current);\n bar.open = valueAt(snapshot.buffers.open, current);\n bar.high = valueAt(snapshot.buffers.high, current);\n bar.low = valueAt(snapshot.buffers.low, current);\n bar.close = valueAt(snapshot.buffers.close, current);\n bar.volume = valueAt(snapshot.buffers.volume, current);\n bar.hl2 = (bar.high + bar.low) / 2;\n bar.hlc3 = (bar.high + bar.low + bar.close) / 3;\n bar.ohlc4 = (bar.open + bar.high + bar.low + bar.close) / 4;\n bar.hlcc4 = (bar.high + bar.low + bar.close + bar.close) / 4;\n }\n bar.interval = snapshot.interval;\n },\n };\n return stream;\n}\n\n/**\n * Append a finalised candle to a stream \u2014 extends the OHLCV ring buffers\n * by one bar and writes every field of the mutable `BarView` (including\n * `time` / `open`). Used by both the main close path and secondary\n * stream history.\n *\n * @since 0.5\n * @example\n * // appendBarToStream(stream, rawBar);\n */\nexport function appendBarToStream(stream: StreamState, rawBar: Bar): void {\n const values = deriveBarSources(rawBar);\n const { ohlcv, bar } = stream;\n ohlcv.time.append(rawBar.time);\n ohlcv.open.append(rawBar.open);\n ohlcv.high.append(rawBar.high);\n ohlcv.low.append(rawBar.low);\n ohlcv.close.append(rawBar.close);\n ohlcv.volume.append(rawBar.volume);\n ohlcv.hl2.append(values.hl2);\n ohlcv.hlc3.append(values.hlc3);\n ohlcv.ohlc4.append(values.ohlc4);\n ohlcv.hlcc4.append(values.hlcc4);\n bar.time = rawBar.time;\n bar.open = rawBar.open;\n bar.high = rawBar.high;\n bar.low = rawBar.low;\n bar.close = rawBar.close;\n bar.volume = rawBar.volume;\n bar.hl2 = values.hl2;\n bar.hlc3 = values.hlc3;\n bar.ohlc4 = values.ohlc4;\n bar.hlcc4 = values.hlcc4;\n bar.symbol = rawBar.symbol;\n bar.interval = rawBar.interval;\n}\n\n/**\n * Replace the head of every OHLCV ring buffer in a stream and write\n * every field of the `BarView`. Used by the secondary-stream replace\n * path \u2014 falls back to {@link appendBarToStream} for the empty-buffer\n * case so the first secondary bar arrives correctly even when delivered\n * as a replace.\n *\n * @since 0.5\n * @example\n * // replaceStreamHead(stream, rawBar);\n */\nexport function replaceStreamHead(stream: StreamState, rawBar: Bar): void {\n if (stream.ohlcv.close.length === 0) {\n appendBarToStream(stream, rawBar);\n return;\n }\n const values = deriveBarSources(rawBar);\n const { ohlcv, bar } = stream;\n ohlcv.time.replaceHead(rawBar.time);\n ohlcv.open.replaceHead(rawBar.open);\n ohlcv.high.replaceHead(rawBar.high);\n ohlcv.low.replaceHead(rawBar.low);\n ohlcv.close.replaceHead(rawBar.close);\n ohlcv.volume.replaceHead(rawBar.volume);\n ohlcv.hl2.replaceHead(values.hl2);\n ohlcv.hlc3.replaceHead(values.hlc3);\n ohlcv.ohlc4.replaceHead(values.ohlc4);\n ohlcv.hlcc4.replaceHead(values.hlcc4);\n bar.time = rawBar.time;\n bar.open = rawBar.open;\n bar.high = rawBar.high;\n bar.low = rawBar.low;\n bar.close = rawBar.close;\n bar.volume = rawBar.volume;\n bar.hl2 = values.hl2;\n bar.hlc3 = values.hlc3;\n bar.ohlc4 = values.ohlc4;\n bar.hlcc4 = values.hlcc4;\n bar.symbol = rawBar.symbol;\n bar.interval = rawBar.interval;\n}\n\n/**\n * Replace the head of the close-side OHLCV ring buffers (close, high,\n * low, volume, derived sources) for a tick within the in-progress bar.\n * `time` and `open` are intentionally untouched \u2014 see\n * `packages/runtime/CLAUDE.md` \"onBarTick does NOT touch time / open\"\n * invariant. Mirrors the partial `BarView` update.\n *\n * @since 0.5\n * @example\n * // replaceTickHead(stream, tickBar);\n */\nexport function replaceTickHead(stream: StreamState, rawBar: Bar): void {\n const values = deriveBarSources(rawBar);\n const { ohlcv, bar } = stream;\n ohlcv.close.replaceHead(rawBar.close);\n ohlcv.high.replaceHead(rawBar.high);\n ohlcv.low.replaceHead(rawBar.low);\n ohlcv.volume.replaceHead(rawBar.volume);\n ohlcv.hl2.replaceHead(values.hl2);\n ohlcv.hlc3.replaceHead(values.hlc3);\n ohlcv.ohlc4.replaceHead(values.ohlc4);\n ohlcv.hlcc4.replaceHead(values.hlcc4);\n bar.close = rawBar.close;\n bar.high = rawBar.high;\n bar.low = rawBar.low;\n bar.volume = rawBar.volume;\n bar.hl2 = values.hl2;\n bar.hlc3 = values.hlc3;\n bar.ohlc4 = values.ohlc4;\n bar.hlcc4 = values.hlcc4;\n}\n\n/**\n * Refresh the stream's fallback visible range to the latest `limit`\n * bars ending at the current head.\n *\n * @since 0.5\n * @example\n * // updateFallbackViewport(stream);\n */\nexport function updateFallbackViewport(stream: StreamState, limit = 100): void {\n const length = stream.ohlcv.time.length;\n if (length === 0) {\n stream.bar.viewport = Object.freeze({ fromTime: 0, toTime: 0 });\n return;\n }\n const lookback = Math.min(length - 1, Math.max(0, limit - 1));\n const fromTime = stream.ohlcv.time.at(lookback);\n const toTime = stream.ohlcv.time.at(0);\n stream.bar.viewport = Object.freeze({\n fromTime: Number.isFinite(fromTime) ? fromTime : toTime,\n toTime,\n });\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\n/**\n * Per-script slot store the runtime hands stateful primitives. Phase 1\n * ships only the in-memory default \u2014 `inMemoryStateStore()` \u2014 keyed\n * by the compiler-assigned slot id from PLAN.md \u00A75.5. Phase 5 layers a\n * `PersistentStateStore` sub-interface on top with snapshot\n * `load` / `save` / `clear` methods (see PLAN.md \u00A76.9). Implementations\n * (IDB-backed for browsers, caller-supplied for servers) satisfy the\n * Phase-5 sub-interface; the Phase-1 surface stays stable and\n * additive.\n *\n * @since 0.1\n * @example\n * // import { inMemoryStateStore } from \"@invinite-org/chartlang-runtime\";\n * // const store = inMemoryStateStore();\n * // store.set<{ count: number }>(\"ta:ema:slot#0\", { count: 1 });\n * // store.has(\"ta:ema:slot#0\"); // true\n * // store.get<{ count: number }>(\"ta:ema:slot#0\"); // { count: 1 }\n */\nexport type StateStore = {\n get<T>(slotId: string): T | undefined;\n set<T>(slotId: string, value: T): void;\n has(slotId: string): boolean;\n clear(): void;\n};\n\n/**\n * Default Phase-1 `StateStore` \u2014 a process-local `Map<string, unknown>`\n * with last-write-wins semantics. Used by the CLI, the conformance\n * suite, and the host-worker until Phase 5 wires the IDB backing.\n *\n * @since 0.1\n * @example\n * // import { inMemoryStateStore } from \"@invinite-org/chartlang-runtime\";\n * // const store = inMemoryStateStore();\n * // store.set(\"slot#0\", 42);\n * // store.get<number>(\"slot#0\"); // 42\n * // store.clear();\n * // store.has(\"slot#0\"); // false\n */\nexport function inMemoryStateStore(): StateStore {\n const store = new Map<string, unknown>();\n return {\n get<T>(id: string): T | undefined {\n return store.get(id) as T | undefined;\n },\n set<T>(id: string, value: T): void {\n store.set(id, value);\n },\n has(id: string): boolean {\n return store.has(id);\n },\n clear(): void {\n store.clear();\n },\n };\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { RuntimeContext } from \"../runtimeContext.js\";\n\n/**\n * Persisted representation for a runtime state slot. Keys use\n * `${slotId}:state`, matching the compiler-injected slot id plus the\n * state namespace suffix.\n *\n * @since 0.4\n * @stable\n * @example\n * const snapshot: StateSlotSnapshot<number> = {\n * committed: 1,\n * tentative: 2,\n * };\n * void snapshot;\n */\nexport type StateSlotSnapshot<T> = {\n readonly committed: T;\n readonly tentative: T;\n};\n\n/**\n * Reset all non-`state.tick.*` tentative values before tick compute.\n *\n * @since 0.4\n * @stable\n * @example\n * // resetTentativeStateSlots(ctx);\n * const called = true;\n * void called;\n */\nexport function resetTentativeStateSlots(ctx: RuntimeContext): void {\n for (const slot of ctx.stateSlots.values()) {\n slot.onBarTick();\n }\n}\n\n/**\n * Commit all non-`state.tick.*` tentative values after close compute.\n *\n * @since 0.4\n * @stable\n * @example\n * // commitStateSlots(ctx);\n * const called = true;\n * void called;\n */\nexport function commitStateSlots(ctx: RuntimeContext): void {\n for (const slot of ctx.stateSlots.values()) {\n slot.onBarClose();\n }\n}\n\n/**\n * Flush runtime state slots into the backing {@link StateStore}.\n *\n * @since 0.4\n * @stable\n * @example\n * // flushStateSlots(ctx);\n * const called = true;\n * void called;\n */\nexport function flushStateSlots(ctx: RuntimeContext): void {\n for (const [key, slot] of ctx.stateSlots.entries()) {\n ctx.stateStore.set<StateSlotSnapshot<unknown>>(key, {\n committed: slot.committed,\n tentative: slot.tentative,\n });\n }\n}\n\n/**\n * Serialise runtime state slots into a snapshot payload.\n *\n * @since 0.5\n * @stable\n * @example\n * // const slots = serialiseStateSlots(ctx);\n * const slots = {};\n * void slots;\n */\nexport function serialiseStateSlots(ctx: RuntimeContext): Readonly<Record<string, unknown>> {\n const out: Record<string, unknown> = {};\n for (const [key, slot] of ctx.stateSlots.entries()) {\n out[key] = {\n committed: slot.serialise(slot.committed),\n tentative: slot.serialise(slot.tentative),\n };\n }\n return Object.freeze(out);\n}\n\n/**\n * Seed restored state-slot payloads into the backing slot store.\n *\n * @since 0.5\n * @stable\n * @example\n * // restoreStateSlots(ctx, snapshot.slots);\n * const restored = true;\n * void restored;\n */\nexport function restoreStateSlots(\n ctx: RuntimeContext,\n slots: Readonly<Record<string, unknown>>,\n): void {\n ctx.stateSlots.clear();\n for (const [key, value] of Object.entries(slots)) {\n ctx.stateStore.set(key, value);\n }\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type {\n AlertConditionEmission,\n AlertEmission,\n Capabilities,\n DrawingEmission,\n LogEmission,\n PlotEmission,\n RuntimeDiagnostic,\n} from \"@invinite-org/chartlang-adapter-kit\";\nimport type {\n AlertConditionDefinition,\n Bar,\n DrawingBucket,\n DrawingCounts,\n DrawingKind,\n DrawingState,\n SecurityBar,\n Series,\n} from \"@invinite-org/chartlang-core\";\n\nimport type { PersistentStateStore } from \"./persistentStateStore.js\";\nimport type { StateSlot } from \"./state/stateSlot.js\";\nimport type { StateStore } from \"./stateStore.js\";\nimport type { StreamState } from \"./streamState.js\";\nimport type { RuntimeViews } from \"./views/index.js\";\n\n/**\n * Per-handle drawing slot the runtime persists across bars. The key is\n * `slotId#subId` (compiler-injected callsite id + per-bar sub-id from\n * {@link nextSubId}). `state` holds the last full {@link DrawingState}\n * emitted for the handle; subsequent `update(patch)` calls merge into\n * it and re-emit the full payload per PLAN.md \u00A710.3. `removed: true`\n * is sticky \u2014 further `update` / `remove` on the handle no-op.\n *\n * @since 0.3\n * @stable\n * @example\n * // const slot: DrawingSlot = {\n * // handleId: \"x.chart.ts:1:1#0\",\n * // kind: \"line\",\n * // state: { kind: \"line\", anchors: [...], style: {} },\n * // removed: false,\n * // };\n */\nexport type DrawingSlot = {\n readonly handleId: string;\n readonly kind: DrawingKind;\n state: DrawingState;\n removed: boolean;\n};\n\n/**\n * Mutable counterpart of `RunnerEmissions` (from adapter-kit) that the\n * runtime accumulates into per bar. Task 6's execution loop pushes\n * here during `compute`; `drain()` snapshots into the readonly\n * `RunnerEmissions` shape the adapter receives.\n *\n * @since 0.1\n * @example\n * // const emissions: MutableRunnerEmissions = {\n * // plots: [],\n * // drawings: [],\n * // alerts: [],\n * // diagnostics: [],\n * // fromBar: 0,\n * // toBar: 0,\n * // };\n */\nexport type MutableRunnerEmissions = {\n plots: PlotEmission[];\n drawings: DrawingEmission[];\n alerts: AlertEmission[];\n alertConditions?: AlertConditionEmission[];\n logs: LogEmission[];\n diagnostics: RuntimeDiagnostic[];\n fromBar: number;\n toBar: number;\n};\n\n/**\n * The contract Task 6's execution loop hands to stateful primitives\n * (Tasks 7-8) inside a single `compute` step. Tasks 7-8 read this\n * through {@link ACTIVE_RUNTIME_CONTEXT} \u2014 the runtime sets `.current`\n * around `compute` in a `try/finally`, so primitives can find their\n * series, slot store, capability bag, emission destination, and bar\n * index without an explicit argument.\n *\n * `isTick` discriminates `onBarTick` calls (head-replace mode) from\n * `onBarClose` / `onHistory` (append mode). Stateful primitives in\n * Task 7 use it to swap append vs replace-head behaviour.\n *\n * `stateSlots` stores Phase-4 `state.*` / `state.tick.*` slots keyed by\n * `${slotId}:state`; values flush into `stateStore` at close/dispose.\n *\n * `views` is a mutable container whose fields are replaced with fresh frozen\n * `barstate.*`, `syminfo.*`, and `timeframe.*` snapshots as the runner\n * advances.\n *\n * `resolvedInputs` is the frozen bag handed to `compute({ inputs })`,\n * resolved once at mount from manifest defaults plus adapter overrides.\n *\n * @since 0.1\n * @example\n * // const ctx: RuntimeContext = {\n * // stream, stateStore, capabilities, emissions,\n * // barIndex: () => 0,\n * // isTick: false,\n * // };\n */\nexport type RuntimeContext = {\n readonly stream: StreamState;\n readonly stateStore: StateStore;\n readonly persistentStateStore?: PersistentStateStore;\n lastPersistTime: number;\n readonly capabilities: Capabilities;\n readonly emissions: MutableRunnerEmissions;\n readonly barIndex: () => number;\n isTick: boolean;\n /**\n * Per-handle drawing slot store keyed by `slotId#subId`. Allocated\n * on first `op: \"create\"`; mutated by `update(patch)` to merge the\n * patch into the slot's `state`; flagged `removed: true` on\n * `remove()`. Cleared on `dispose`. Persists across bars per\n * PLAN.md \u00A710.3. @since 0.3\n */\n readonly drawingSlots: Map<string, DrawingSlot>;\n /**\n * Per-callsite per-bar sub-id counter. Each `draw.<kind>(...)` call\n * inside a bar reads `nextSubId(ctx, slotId)`; the counter resets\n * at the top of each `onBarClose` / `onBarTick` so iteration `i` at\n * the same callsite yields the same `slotId#i` across bars.\n * Cleared on `dispose`. @since 0.3\n */\n readonly drawingSubIdCounters: Map<string, number>;\n /**\n * Live per-bucket allocation tally for the current script. Each\n * `op: \"create\"` increments the relevant bucket; each\n * `op: \"remove\"` decrements (clamped at 0). `op: \"update\"` is\n * free. `pushDrawing` drops the emission with\n * `drawing-budget-exceeded` once a bucket hits its effective\n * budget (min of adapter cap + `scriptMaxDrawings`). Reset to\n * zero on `dispose`. @since 0.3\n */\n readonly drawingBucketCounters: Record<DrawingBucket, number>;\n /**\n * The script's per-bucket cap from `defineIndicator({ maxDrawings:\n * ... })` / `defineDrawing({ maxDrawings: ... })`. `null` when\n * omitted \u2014 `pushDrawing` then enforces the adapter cap alone.\n * Effective budget is `min(scriptMaxDrawings[b],\n * capabilities.maxDrawingsPerScript[b])`. @since 0.3\n */\n readonly scriptMaxDrawings: DrawingCounts | null;\n /**\n * Runtime `state.*` / `state.tick.*` slot store keyed by\n * `${slotId}:state`. Non-tick slots keep committed/tentative values;\n * tick slots commit writes immediately. Cleared on `dispose` after\n * flushing snapshots to `stateStore`. @since 0.4\n */\n readonly stateSlots: Map<string, StateSlot<unknown>>;\n /**\n * Secondary candle streams keyed by `IntervalDescriptor.value`.\n * Mutated only by `createScriptRunner` mount/restore/routing. @since 0.5\n */\n readonly secondaryStreams: Map<string, StreamState>;\n /**\n * Per-`request.security` slot cache keyed by `slotId|interval`. Phase 4\n * stores NaN fallback bars here; Phase 5 replaces the value producer with\n * aligned secondary stream series while preserving stable identity.\n * @since 0.4\n */\n readonly requestSecurityBars: Map<string, SecurityBar>;\n /**\n * Per-compute aligned numeric arrays keyed by\n * `slotId|interval|sourceKey`. Cleared on main-stream close/tick before\n * `compute` so `request.security` re-aligns against the latest\n * secondary buffers. @since 0.5\n */\n readonly requestSecurityAlignments: Map<string, ReadonlyArray<number>>;\n /**\n * Per-compute cache of ascending `Bar[]` materialisations keyed by the\n * source `StreamState`. Shared by `request.security` and `request.lowerTf`\n * (via `request/streamBars.ts:ascendingBarsFor`) so a stable bar-array\n * identity is reused across every consumer in a bar \u2014 the `getOrAlign` /\n * `getOrBucket` WeakMap caches actually hit and the same ring buffer is\n * walked once per bar instead of 10\u00D7. Cleared alongside\n * {@link requestSecurityAlignments}. @since 0.5\n */\n readonly requestSecurityAscendingBars: Map<StreamState, ReadonlyArray<Bar>>;\n /**\n * Per-`request.lowerTf` slot cache keyed by `slotId|interval`. Values are\n * stable `Series<ReadonlyArray<Bar>>` proxies over the latest LTF bucket\n * materialisation. @since 0.6\n */\n readonly requestLowerTfViews: Map<string, Series<ReadonlyArray<Bar>>>;\n /**\n * Runtime diagnostic dedupe for `request.*` capability gates, keyed by\n * `code|slotId|interval|kind`. Cleared on `dispose`. @since 0.4\n */\n readonly diagnosedRequestKeys: Set<string>;\n /**\n * Manifest-declared alert conditions keyed by condition id. Used by\n * `signal(conditionId, fired)` to reject unknown ids without\n * re-reading the manifest each bar. @since 0.5\n */\n readonly alertConditions?: ReadonlyMap<string, AlertConditionDefinition>;\n /**\n * Dedupe for alert-condition capability/unknown-id diagnostics, keyed\n * by `code|conditionId`. Cleared on dispose. @since 0.5\n */\n readonly diagnosedAlertConditionKeys?: Set<string>;\n /**\n * Number of `runtime.log.*` emissions accepted in the active compute\n * step. Reset at the start of each close/tick. @since 0.5\n */\n logBudget: number;\n /**\n * Per-step dedupe flag for `runtime-log-budget-exceeded`. Reset with\n * `logBudget` at the start of each close/tick. @since 0.5\n */\n logBudgetExceededDiagnosed: boolean;\n /**\n * Frozen effective input values keyed by script input name. Resolved once\n * at mount and reused by every compute step. @since 0.4\n */\n resolvedInputs: Readonly<Record<string, unknown>>;\n /**\n * Runtime diagnostic dedupe for mount-time input override failures,\n * keyed by manifest input key. Cleared on `dispose`. @since 0.4\n */\n readonly diagnosedInputKeys: Set<string>;\n /**\n * Runtime `barstate.*`, `syminfo.*`, and `timeframe.*` views. The\n * container is mutable; each assigned view snapshot is frozen.\n * @since 0.4\n */\n readonly views: RuntimeViews;\n};\n\n/**\n * Process-wide context slot. Task 6's `createScriptRunner` mutates\n * `.current` inside `try { ... } finally { current = null }` around\n * every `compute` invocation; Tasks 7-8 read it inside primitive\n * implementations. JavaScript's single-threaded execution model\n * guarantees only one `compute` runs at a time, so this ambient\n * slot is safe.\n *\n * The export is intentionally just a holder \u2014 no class, no methods,\n * no validation. Responsibility for setting and clearing lives in\n * Task 6.\n *\n * @since 0.1\n * @example\n * // import { ACTIVE_RUNTIME_CONTEXT }\n * // from \"@invinite-org/chartlang-runtime\";\n * // ACTIVE_RUNTIME_CONTEXT.current; // null at module load\n */\nexport const ACTIVE_RUNTIME_CONTEXT: { current: RuntimeContext | null } = {\n current: null,\n};\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { MutableSlot } from \"@invinite-org/chartlang-core\";\n\n/**\n * Optional PLAN \u00A76.9 state-slot marshal hooks. Phase-4 `state.*`\n * primitives use the identity default because their values are already\n * JSON-clean; future primitives with typed-array internals can provide\n * explicit hooks.\n *\n * @since 0.5\n * @stable\n * @example\n * const hooks: StateSlotSerialisers<number> = {\n * serialiseState: (value) => value,\n * deserialiseState: (value) => Number(value),\n * };\n * void hooks;\n */\nexport type StateSlotSerialisers<T> = {\n readonly serialiseState?: (value: T) => unknown;\n readonly deserialiseState?: (value: unknown) => T;\n};\n\n/**\n * Internal runtime slot behind script-facing {@link MutableSlot}\n * proxies. `tickPersistent: true` models `state.tick.*`, whose writes\n * commit immediately; `false` models `state.*`, whose writes remain\n * tentative until bar close.\n *\n * @since 0.4\n * @stable\n * @example\n * const slot = new StateSlot(0, false);\n * slot.set(5);\n * slot.onBarClose();\n * const pair = { committed: slot.committed, tentative: slot.tentative };\n * void pair;\n */\nexport class StateSlot<T> {\n committed: T;\n tentative: T;\n\n constructor(\n init: T,\n public readonly tickPersistent: boolean,\n private readonly serialisers: StateSlotSerialisers<T> = {},\n ) {\n this.committed = init;\n this.tentative = init;\n }\n\n get(): T {\n return this.tickPersistent ? this.committed : this.tentative;\n }\n\n set(value: T): void {\n if (this.tickPersistent) {\n this.committed = value;\n } else {\n this.tentative = value;\n }\n }\n\n onBarClose(): void {\n if (!this.tickPersistent) {\n this.committed = this.tentative;\n }\n }\n\n onBarTick(): void {\n if (!this.tickPersistent) {\n this.tentative = this.committed;\n }\n }\n\n serialise(value: T): unknown {\n return this.serialisers.serialiseState?.(value) ?? value;\n }\n}\n\n/**\n * Build the script-facing mutable proxy for a runtime state slot.\n *\n * @since 0.4\n * @stable\n * @example\n * const slot = asMutableSlot(new StateSlot(1, false));\n * slot.value = 2;\n * void slot.value;\n */\nexport function asMutableSlot<T>(slot: StateSlot<T>): MutableSlot<T> {\n return {\n get value(): T {\n return slot.get();\n },\n set value(value: T) {\n slot.set(value);\n },\n };\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { MutableSlot, StateNamespace } from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { asMutableSlot, StateSlot } from \"./stateSlot.js\";\n\ntype StoredStateSlot<T> = {\n readonly committed: T;\n readonly tentative: T;\n};\n\nconst stateKey = (slotId: string): string => `${slotId}:state`;\n\nfunction getCtx(name: string): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(`${name} called outside an active script step`);\n }\n return ctx;\n}\n\nfunction getOrAllocate<T>(\n name: string,\n slotId: string,\n init: T,\n tickPersistent: boolean,\n): MutableSlot<T> {\n const ctx = getCtx(name);\n const key = stateKey(slotId);\n const existing = ctx.stateSlots.get(key);\n if (existing !== undefined) {\n return asMutableSlot(existing as StateSlot<T>);\n }\n\n const stored = ctx.stateStore.get<StoredStateSlot<T>>(key);\n const slot = new StateSlot<T>(stored?.committed ?? init, tickPersistent);\n if (stored !== undefined) {\n slot.tentative = stored.tentative;\n }\n ctx.stateSlots.set(key, slot as StateSlot<unknown>);\n return asMutableSlot(slot);\n}\n\n/**\n * Build the runtime `state` namespace installed on `ComputeContext`.\n * Each function accepts the compiler-injected `slotId` as its first\n * parameter, then the script-facing init value.\n *\n * @since 0.4\n * @stable\n * @example\n * const ns = buildStateNamespace();\n * void ns.float;\n */\nexport function buildStateNamespace(): StateNamespace {\n const ns = {\n float: (slotId: string, init: number): MutableSlot<number> =>\n getOrAllocate(\"state.float\", slotId, init, false),\n int: (slotId: string, init: number): MutableSlot<number> =>\n getOrAllocate(\"state.int\", slotId, init, false),\n bool: (slotId: string, init: boolean): MutableSlot<boolean> =>\n getOrAllocate(\"state.bool\", slotId, init, false),\n string: (slotId: string, init: string): MutableSlot<string> =>\n getOrAllocate(\"state.string\", slotId, init, false),\n tick: {\n float: (slotId: string, init: number): MutableSlot<number> =>\n getOrAllocate(\"state.tick.float\", slotId, init, true),\n int: (slotId: string, init: number): MutableSlot<number> =>\n getOrAllocate(\"state.tick.int\", slotId, init, true),\n bool: (slotId: string, init: boolean): MutableSlot<boolean> =>\n getOrAllocate(\"state.tick.bool\", slotId, init, true),\n string: (slotId: string, init: string): MutableSlot<string> =>\n getOrAllocate(\"state.tick.string\", slotId, init, true),\n },\n };\n Object.freeze(ns.tick);\n Object.freeze(ns);\n return ns as unknown as StateNamespace;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { InputDescriptor, ScriptManifest } from \"@invinite-org/chartlang-core\";\n\nimport type { RuntimeContext } from \"../runtimeContext.js\";\n\nconst SOURCE_FIELDS = new Set<string>([\n \"open\",\n \"high\",\n \"low\",\n \"close\",\n \"hl2\",\n \"hlc3\",\n \"ohlc4\",\n \"hlcc4\",\n]);\n\n/**\n * Resolve the script's effective `inputs` bag from manifest defaults plus\n * optional adapter-supplied overrides. Type-incompatible overrides fall back\n * to the descriptor default and emit `input-coercion-failed` once per\n * mount/key.\n *\n * @since 0.4\n * @stable\n * @example\n * // import { resolveInputs } from \"@invinite-org/chartlang-runtime\";\n * // const inputs = resolveInputs(manifest, { length: 20 }, ctx);\n * const fn: typeof resolveInputs = resolveInputs;\n * void fn;\n */\nexport function resolveInputs(\n manifest: ScriptManifest,\n overrides: Readonly<Record<string, unknown>>,\n ctx: RuntimeContext,\n): Readonly<Record<string, unknown>> {\n const out: Record<string, unknown> = {};\n for (const [key, descriptor] of Object.entries(manifest.inputs)) {\n const fallback = defaultValueFor(descriptor);\n if (!Object.hasOwn(overrides, key) || overrides[key] === undefined) {\n out[key] = fallback;\n continue;\n }\n const override = overrides[key];\n if (matchesDescriptor(descriptor, override)) {\n out[key] = override;\n continue;\n }\n pushInputDiagnostic(ctx, key, descriptor.kind, override);\n out[key] = fallback;\n }\n return Object.freeze(out);\n}\n\nfunction defaultValueFor(descriptor: InputDescriptor<unknown>): unknown {\n if (\"defaultValue\" in descriptor) return descriptor.defaultValue;\n return undefined;\n}\n\nfunction matchesDescriptor(descriptor: InputDescriptor<unknown>, value: unknown): boolean {\n switch (descriptor.kind) {\n case \"int\":\n return typeof value === \"number\" && Number.isInteger(value);\n case \"float\":\n case \"time\":\n case \"price\":\n return typeof value === \"number\" && Number.isFinite(value);\n case \"bool\":\n return typeof value === \"boolean\";\n case \"string\":\n case \"color\":\n case \"symbol\":\n case \"interval\":\n return typeof value === \"string\";\n case \"enum\":\n return typeof value === \"string\" && descriptor.options.includes(value);\n case \"source\":\n return typeof value === \"string\" && SOURCE_FIELDS.has(value);\n case \"external-series\":\n return value !== null && typeof value === \"object\";\n }\n}\n\nfunction pushInputDiagnostic(\n ctx: RuntimeContext,\n key: string,\n expected: string,\n value: unknown,\n): void {\n if (ctx.diagnosedInputKeys.has(key)) return;\n ctx.diagnosedInputKeys.add(key);\n ctx.emissions.diagnostics.push({\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"input-coercion-failed\",\n message: `input \"${key}\" expected ${expected}, got ${describeValue(value)}`,\n slotId: key,\n bar: null,\n });\n}\n\nfunction describeValue(value: unknown): string {\n if (value === null) return \"null\";\n if (typeof value === \"number\" && Number.isNaN(value)) return \"NaN\";\n return typeof value;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { Bar } from \"@invinite-org/chartlang-core\";\n\n/**\n * Bucket lower-timeframe bars by main-bar containment.\n *\n * For each main bar `m[i]`, collects every LTF bar whose open time falls in\n * `[m[i].time, m[i + 1].time)`. The final main bar has no successor and\n * absorbs every LTF bar with `time >= m[i].time`, exposing the in-progress\n * half-bucket. Inputs must be sorted ascending by `time`.\n *\n * @formula Two-pointer walk over ascending main and LTF bars.\n * @warmup Empty main input returns `[]`; empty LTF input returns one empty\n * bucket per main bar.\n * @since 0.6\n * @stable\n * @example\n * bucketLtfBarsByMainContainment(\n * [{ time: 0 } as Bar, { time: 60_000 } as Bar],\n * [{ time: 0 } as Bar, { time: 30_000 } as Bar],\n * );\n */\nexport function bucketLtfBarsByMainContainment(\n mainBars: ReadonlyArray<Bar>,\n ltfBars: ReadonlyArray<Bar>,\n): ReadonlyArray<ReadonlyArray<Bar>> {\n if (mainBars.length === 0) return [];\n const buckets: Bar[][] = Array.from({ length: mainBars.length }, () => []);\n\n let mainIndex = 0;\n let ltfIndex = 0;\n while (ltfIndex < ltfBars.length && ltfBars[ltfIndex].time < mainBars[0].time) {\n ltfIndex += 1;\n }\n\n while (ltfIndex < ltfBars.length) {\n const ltf = ltfBars[ltfIndex];\n while (mainIndex + 1 < mainBars.length && mainBars[mainIndex + 1].time <= ltf.time) {\n mainIndex += 1;\n }\n buckets[mainIndex].push(ltf);\n ltfIndex += 1;\n }\n\n return buckets;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { Bar } from \"@invinite-org/chartlang-core\";\n\nimport { bucketLtfBarsByMainContainment } from \"./bucketLtfBarsByMainContainment.js\";\n\ntype Bucketed = ReadonlyArray<ReadonlyArray<Bar>>;\ntype CacheEntry = {\n readonly mainLength: number;\n readonly ltfLength: number;\n readonly buckets: Bucketed;\n};\n\nconst CACHE = new WeakMap<ReadonlyArray<Bar>, WeakMap<ReadonlyArray<Bar>, CacheEntry>>();\n\n/**\n * Return cached LTF buckets, computing them on cache miss.\n *\n * @since 0.6\n * @stable\n * @example\n * const buckets = getOrBucket([], []);\n * void buckets;\n */\nexport function getOrBucket(mainBars: ReadonlyArray<Bar>, ltfBars: ReadonlyArray<Bar>): Bucketed {\n let byLtf = CACHE.get(mainBars);\n if (byLtf === undefined) {\n byLtf = new WeakMap();\n CACHE.set(mainBars, byLtf);\n }\n\n const cached = byLtf.get(ltfBars);\n if (\n cached !== undefined &&\n cached.mainLength === mainBars.length &&\n cached.ltfLength === ltfBars.length\n ) {\n return cached.buckets;\n }\n\n const buckets = bucketLtfBarsByMainContainment(mainBars, ltfBars);\n byLtf.set(ltfBars, { mainLength: mainBars.length, ltfLength: ltfBars.length, buckets });\n return buckets;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { DiagnosticCode } from \"@invinite-org/chartlang-adapter-kit\";\n\nimport type { RuntimeContext } from \"../runtimeContext.js\";\n\n/**\n * Emit a request diagnostic at most once per code, slot, interval, and kind.\n *\n * @since 0.6\n * @stable\n * @example\n * const key = \"request diagnostics are deduped by callsite\";\n * void key;\n */\nexport function pushOnce(\n ctx: RuntimeContext,\n code: DiagnosticCode,\n slotId: string,\n interval: string,\n kind: \"security\" | \"lowerTf\",\n message: string,\n): void {\n const key = `${code}|${slotId}|${interval}|${kind}`;\n if (ctx.diagnosedRequestKeys.has(key)) return;\n ctx.diagnosedRequestKeys.add(key);\n ctx.emissions.diagnostics.push({\n kind: \"diagnostic\",\n severity: \"warning\",\n code,\n message,\n slotId,\n bar: ctx.barIndex(),\n });\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { Bar } from \"@invinite-org/chartlang-core\";\n\nimport type { RuntimeContext } from \"../runtimeContext.js\";\nimport type { StreamState } from \"../streamState.js\";\n\n/**\n * Materialise the bar at ring-buffer `age` from a stream state.\n *\n * @since 0.6\n * @stable\n * @example\n * // const bar = barFromStream(stream, 0);\n * const age = 0;\n * void age;\n */\nexport function barFromStream(stream: StreamState, age: number): Bar {\n const open = stream.ohlcv.open.at(age);\n const high = stream.ohlcv.high.at(age);\n const low = stream.ohlcv.low.at(age);\n const close = stream.ohlcv.close.at(age);\n return {\n time: stream.ohlcv.time.at(age),\n open,\n high,\n low,\n close,\n volume: stream.ohlcv.volume.at(age),\n symbol: stream.bar.symbol,\n interval: stream.bar.interval,\n hl2: (high + low) / 2,\n hlc3: (high + low + close) / 3,\n ohlc4: (open + high + low + close) / 4,\n hlcc4: (high + low + close + close) / 4,\n };\n}\n\n/**\n * Return a stream's bars in ascending time order, memoised per step on\n * `ctx.requestSecurityAscendingBars` (cleared each bar close).\n *\n * @since 0.6\n * @stable\n * @example\n * // const bars = ascendingBarsFor(ctx, ctx.stream);\n * const memo = \"requestSecurityAscendingBars\";\n * void memo;\n */\nexport function ascendingBarsFor(ctx: RuntimeContext, stream: StreamState): ReadonlyArray<Bar> {\n const cached = ctx.requestSecurityAscendingBars.get(stream);\n if (cached !== undefined) return cached;\n const bars: Bar[] = [];\n for (let age = stream.ohlcv.close.length - 1; age >= 0; age -= 1) {\n bars.push(barFromStream(stream, age));\n }\n ctx.requestSecurityAscendingBars.set(stream, bars);\n return bars;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { Bar, Series } from \"@invinite-org/chartlang-core\";\n\nimport type { RuntimeContext } from \"../runtimeContext.js\";\nimport { getOrBucket } from \"./bucketLtfBarsCache.js\";\nimport { pushOnce } from \"./pushOnce.js\";\nimport { ascendingBarsFor } from \"./streamBars.js\";\n\nconst EMPTY_BUCKET: ReadonlyArray<Bar> = Object.freeze([]);\n\nfunction fallback(\n ctx: RuntimeContext,\n slotId: string,\n interval: string,\n code: \"unsupported-interval\" | \"multi-timeframe-not-supported\" | \"unknown-secondary-stream\",\n message: string,\n): ReadonlyArray<Bar> {\n pushOnce(ctx, code, slotId, interval, \"lowerTf\", message);\n return EMPTY_BUCKET;\n}\n\nfunction bucketAt(\n ctx: RuntimeContext,\n slotId: string,\n interval: string,\n age: number,\n): ReadonlyArray<Bar> {\n if (!ctx.capabilities.multiTimeframe) {\n return fallback(\n ctx,\n slotId,\n interval,\n \"multi-timeframe-not-supported\",\n \"Adapter declares multiTimeframe: false; request.lowerTf returns empty buckets\",\n );\n }\n\n const known = ctx.capabilities.intervals.some((descriptor) => descriptor.value === interval);\n if (!known) {\n return fallback(\n ctx,\n slotId,\n interval,\n \"unsupported-interval\",\n `Requested interval \"${interval}\" is not in Capabilities.intervals`,\n );\n }\n\n const secondary = ctx.secondaryStreams.get(interval);\n if (secondary === undefined) {\n return fallback(\n ctx,\n slotId,\n interval,\n \"unknown-secondary-stream\",\n `Requested interval \"${interval}\" has no registered secondary stream`,\n );\n }\n\n const mainBars = ascendingBarsFor(ctx, ctx.stream);\n const ltfBars = ascendingBarsFor(ctx, secondary);\n const buckets = getOrBucket(mainBars, ltfBars);\n const index = buckets.length - 1 - age;\n return buckets[index] ?? EMPTY_BUCKET;\n}\n\n/**\n * Return a stable series view of lower-timeframe buckets for a callsite.\n *\n * @since 0.6\n * @stable\n * @example\n * // const series = makeLowerTfSeries(ctx, \"slot#0\", \"30s\");\n * const requested = \"30s\";\n * void requested;\n */\nexport function makeLowerTfSeries(\n ctx: RuntimeContext,\n slotId: string,\n interval: string,\n): Series<ReadonlyArray<Bar>> {\n const cacheKey = `${slotId}|${interval}`;\n const existing = ctx.requestLowerTfViews.get(cacheKey);\n if (existing !== undefined) return existing;\n\n const target = {\n get current() {\n return bucketAt(ctx, slotId, interval, 0);\n },\n get length() {\n return ctx.stream.ohlcv.close.length;\n },\n };\n const view = new Proxy(Object.freeze(target), {\n get(obj, prop, receiver) {\n if (typeof prop === \"string\") {\n const n = Number(prop);\n if (Number.isInteger(n) && n >= 0) return bucketAt(ctx, slotId, interval, n);\n }\n return Reflect.get(obj, prop, receiver);\n },\n }) as Series<ReadonlyArray<Bar>>;\n ctx.requestLowerTfViews.set(cacheKey, view);\n return view;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// Ported from ../invinite/src/components/trading-chart/indicators/lib/align-htf-series-to-ltf.ts\n// @ 3234c8c0c3f9880d9d1e3a3ee63ebd55ddd535f4.\n// Translated, not transcribed -- Series<T> shape, JSDoc, runtime context.\n// See packages/runtime/src/ta/CLAUDE.md for the port convention.\n\nimport type { Bar } from \"@invinite-org/chartlang-core\";\n\n/**\n * Align an HTF series to the LTF time grid (PLAN.md \u00A76.8).\n *\n * `htf` and `ltf` must be sorted ascending by `time`; callers own that\n * precondition. The output has one entry per LTF bar where each value is the\n * most recent HTF series value whose `[open, next-open)` window contains the\n * LTF bar's open time \u2014 i.e. the running, in-progress HTF value at LTF time\n * `t`. `bar.time` is treated as the bar's open, so an HTF bar becomes the\n * active value as soon as the LTF cursor reaches its open time and stays\n * active until the next HTF open. This deliberately exposes the in-progress\n * secondary bar to script land per PLAN.md \u00A76.8; do not \"fix\" it to bar-close\n * lookahead-off semantics.\n *\n * @formula Two-pointer walk over ascending HTF and LTF bar times; no\n * look-ahead because the HTF cursor advances only while `htf.time <= ltf.time`.\n * @warmup None; LTF bars before the first HTF bar receive `NaN`.\n * @since 0.5\n * @stable\n * @internal\n * @example\n * const aligned = alignHtfSeriesToLtf(htfBars, htfCloses, ltfBars);\n * void aligned;\n */\nexport function alignHtfSeriesToLtf(\n htf: ReadonlyArray<Bar>,\n htfSeries: ReadonlyArray<number>,\n ltf: ReadonlyArray<Bar>,\n): ReadonlyArray<number> {\n const out = new Array<number>(ltf.length);\n\n if (htf.length === 0 || ltf.length === 0) {\n out.fill(Number.NaN);\n return out;\n }\n\n let htfCursor = 0;\n let lastIdx = -1;\n\n for (let i = 0; i < ltf.length; i += 1) {\n const t = ltf[i].time;\n\n while (htfCursor < htf.length && htf[htfCursor].time <= t) {\n lastIdx = htfCursor;\n htfCursor += 1;\n }\n\n out[i] = lastIdx >= 0 ? htfSeries[lastIdx] : Number.NaN;\n }\n\n return out;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// Ported from ../invinite/src/components/trading-chart/indicators/lib/align-htf-series-cache.ts\n// @ 3234c8c0c3f9880d9d1e3a3ee63ebd55ddd535f4.\n// Translated, not transcribed -- Series<T> shape, JSDoc, runtime context.\n// See packages/runtime/src/ta/CLAUDE.md for the port convention.\n\nimport type { Bar } from \"@invinite-org/chartlang-core\";\n\nimport * as kernel from \"./alignHtfSeriesToLtf.js\";\n\ntype CacheEntry = {\n readonly htfLength: number;\n readonly ltfLength: number;\n readonly aligned: ReadonlyArray<number>;\n};\n\nconst CACHE = new WeakMap<\n ReadonlyArray<Bar>,\n WeakMap<ReadonlyArray<Bar>, WeakMap<ReadonlyArray<number>, CacheEntry>>\n>();\n\n/**\n * Return a cached HTF-to-LTF aligned series, computing it on cache miss.\n *\n * The cache keys on HTF bar-array, LTF bar-array, and HTF source-series\n * identity, validating the stored entry against both live bar lengths. Keying\n * on the source series too lets the same `(htfBars, ltfBars)` pair carry\n * distinct alignments for `close` / `high` / `low` / ... within one bar (the\n * caller reuses one bar-array identity across every source key). Appending to\n * either bar array invalidates the hit; WeakMap reachability evicts naturally.\n *\n * @since 0.5\n * @stable\n * @internal\n * @example\n * const aligned = getOrAlign(htfBars, htfCloses, ltfBars);\n * void aligned;\n */\nexport function getOrAlign(\n htfBars: ReadonlyArray<Bar>,\n htfSeries: ReadonlyArray<number>,\n ltfBars: ReadonlyArray<Bar>,\n): ReadonlyArray<number> {\n let byLtf = CACHE.get(htfBars);\n if (byLtf === undefined) {\n byLtf = new WeakMap();\n CACHE.set(htfBars, byLtf);\n }\n let bySeries = byLtf.get(ltfBars);\n if (bySeries === undefined) {\n bySeries = new WeakMap();\n byLtf.set(ltfBars, bySeries);\n }\n\n const cached = bySeries.get(htfSeries);\n if (\n cached !== undefined &&\n cached.htfLength === htfBars.length &&\n cached.ltfLength === ltfBars.length\n ) {\n return cached.aligned;\n }\n\n const aligned = kernel.alignHtfSeriesToLtf(htfBars, htfSeries, ltfBars);\n bySeries.set(htfSeries, {\n htfLength: htfBars.length,\n ltfLength: ltfBars.length,\n aligned,\n });\n return aligned;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { SecurityBar, Series } from \"@invinite-org/chartlang-core\";\n\nimport type { RuntimeContext } from \"../runtimeContext.js\";\nimport type { StreamState } from \"../streamState.js\";\nimport { getOrAlign } from \"./alignHtfSeriesCache.js\";\nimport { pushOnce } from \"./pushOnce.js\";\nimport { ascendingBarsFor } from \"./streamBars.js\";\n\ntype NumericSourceKey =\n | \"time\"\n | \"open\"\n | \"high\"\n | \"low\"\n | \"close\"\n | \"volume\"\n | \"hl2\"\n | \"hlc3\"\n | \"ohlc4\"\n | \"hlcc4\";\n\nconst NUMERIC_SOURCE_KEYS: ReadonlyArray<NumericSourceKey> = Object.freeze([\n \"time\",\n \"open\",\n \"high\",\n \"low\",\n \"close\",\n \"volume\",\n \"hl2\",\n \"hlc3\",\n \"ohlc4\",\n \"hlcc4\",\n]);\n\nfunction makeSeries<T>(current: T): Series<T> {\n return Object.freeze({ current, length: 0 }) as Series<T>;\n}\n\n/**\n * Build the all-NaN `SecurityBar` fallback for unsupported MTF paths.\n *\n * @since 0.4\n * @stable\n * @example\n * const bar = makeNanSecurityBar();\n * const close = bar.close.current;\n * void close;\n */\nexport function makeNanSecurityBar(): SecurityBar {\n const nanNumberSeries = makeSeries(Number.NaN);\n const nanStringSeries = makeSeries(\"\");\n return Object.freeze({\n time: nanNumberSeries,\n open: nanNumberSeries,\n high: nanNumberSeries,\n low: nanNumberSeries,\n close: nanNumberSeries,\n volume: nanNumberSeries,\n hl2: nanNumberSeries,\n hlc3: nanNumberSeries,\n ohlc4: nanNumberSeries,\n hlcc4: nanNumberSeries,\n symbol: nanStringSeries,\n interval: nanStringSeries,\n });\n}\n\nfunction seriesAscending(stream: StreamState, sourceKey: NumericSourceKey): ReadonlyArray<number> {\n const values: number[] = [];\n const source = stream.ohlcv[sourceKey];\n for (let age = source.length - 1; age >= 0; age -= 1) {\n values.push(source.at(age));\n }\n return values;\n}\n\nfunction alignmentKey(slotId: string, interval: string, sourceKey: NumericSourceKey): string {\n return `${slotId}|${interval}|${sourceKey}`;\n}\n\nfunction alignedSeries(\n ctx: RuntimeContext,\n slotId: string,\n interval: string,\n sourceKey: NumericSourceKey,\n secondary: StreamState,\n): ReadonlyArray<number> {\n const key = alignmentKey(slotId, interval, sourceKey);\n const existing = ctx.requestSecurityAlignments.get(key);\n if (existing !== undefined) return existing;\n const htfBars = ascendingBarsFor(ctx, secondary);\n const ltfBars = ascendingBarsFor(ctx, ctx.stream);\n const aligned = getOrAlign(htfBars, seriesAscending(secondary, sourceKey), ltfBars);\n ctx.requestSecurityAlignments.set(key, aligned);\n return aligned;\n}\n\nfunction makeAlignedNumberSeries(\n ctx: RuntimeContext,\n slotId: string,\n interval: string,\n sourceKey: NumericSourceKey,\n secondary: StreamState,\n): Series<number> {\n const target = {\n get current() {\n const aligned = alignedSeries(ctx, slotId, interval, sourceKey, secondary);\n const value = aligned[aligned.length - 1];\n return value === undefined ? Number.NaN : value;\n },\n get length() {\n return ctx.stream.ohlcv.close.length;\n },\n };\n return new Proxy(Object.freeze(target), {\n get(obj, prop, receiver) {\n if (typeof prop === \"string\") {\n const n = Number(prop);\n if (Number.isInteger(n) && n >= 0) {\n const aligned = alignedSeries(ctx, slotId, interval, sourceKey, secondary);\n const value = aligned[aligned.length - 1 - n];\n return value === undefined ? Number.NaN : value;\n }\n }\n return Reflect.get(obj, prop, receiver);\n },\n }) as Series<number>;\n}\n\nfunction makeConstantStringSeries(value: string): Series<string> {\n const target = {\n get current() {\n return value;\n },\n get length() {\n return 0;\n },\n };\n return new Proxy(Object.freeze(target), {\n get(obj, prop, receiver) {\n if (typeof prop === \"string\") {\n const n = Number(prop);\n if (Number.isInteger(n) && n >= 0) return value;\n }\n return Reflect.get(obj, prop, receiver);\n },\n }) as Series<string>;\n}\n\nfunction makeLiveSecurityBar(\n ctx: RuntimeContext,\n slotId: string,\n interval: string,\n secondary: StreamState,\n): SecurityBar {\n const numeric = new Map<NumericSourceKey, Series<number>>();\n for (const key of NUMERIC_SOURCE_KEYS) {\n numeric.set(key, makeAlignedNumberSeries(ctx, slotId, interval, key, secondary));\n }\n return Object.freeze({\n time: numeric.get(\"time\") ?? makeSeries(Number.NaN),\n open: numeric.get(\"open\") ?? makeSeries(Number.NaN),\n high: numeric.get(\"high\") ?? makeSeries(Number.NaN),\n low: numeric.get(\"low\") ?? makeSeries(Number.NaN),\n close: numeric.get(\"close\") ?? makeSeries(Number.NaN),\n volume: numeric.get(\"volume\") ?? makeSeries(Number.NaN),\n hl2: numeric.get(\"hl2\") ?? makeSeries(Number.NaN),\n hlc3: numeric.get(\"hlc3\") ?? makeSeries(Number.NaN),\n ohlc4: numeric.get(\"ohlc4\") ?? makeSeries(Number.NaN),\n hlcc4: numeric.get(\"hlcc4\") ?? makeSeries(Number.NaN),\n symbol: makeConstantStringSeries(secondary.bar.symbol),\n interval: makeConstantStringSeries(interval),\n });\n}\n\nfunction fallbackNaN(\n ctx: RuntimeContext,\n cacheKey: string,\n slotId: string,\n interval: string,\n code: \"unsupported-interval\" | \"multi-timeframe-not-supported\" | \"unknown-secondary-stream\",\n message: string,\n): SecurityBar {\n pushOnce(ctx, code, slotId, interval, \"security\", message);\n const bar = makeNanSecurityBar();\n ctx.requestSecurityBars.set(cacheKey, bar);\n return bar;\n}\n\n/**\n * Return the runtime `request.security` bar for a callsite and interval.\n *\n * @since 0.5\n * @stable\n * @example\n * // const bar = makeSecurityBar(ctx, \"slot#0\", \"1D\");\n * const requested = \"1D\";\n * void requested;\n */\nexport function makeSecurityBar(\n ctx: RuntimeContext,\n slotId: string,\n interval: string,\n): SecurityBar {\n const cacheKey = `${slotId}|${interval}`;\n const existing = ctx.requestSecurityBars.get(cacheKey);\n if (existing !== undefined) return existing;\n\n if (!ctx.capabilities.multiTimeframe) {\n return fallbackNaN(\n ctx,\n cacheKey,\n slotId,\n interval,\n \"multi-timeframe-not-supported\",\n \"Adapter declares multiTimeframe: false; request.security returns NaN\",\n );\n }\n\n const known = ctx.capabilities.intervals.some((descriptor) => descriptor.value === interval);\n if (!known) {\n return fallbackNaN(\n ctx,\n cacheKey,\n slotId,\n interval,\n \"unsupported-interval\",\n `Requested interval \"${interval}\" is not in Capabilities.intervals`,\n );\n }\n\n const secondary = ctx.secondaryStreams.get(interval);\n if (secondary === undefined) {\n return fallbackNaN(\n ctx,\n cacheKey,\n slotId,\n interval,\n \"unknown-secondary-stream\",\n `Requested interval \"${interval}\" has no registered secondary stream`,\n );\n }\n\n const bar = makeLiveSecurityBar(ctx, slotId, interval, secondary);\n ctx.requestSecurityBars.set(cacheKey, bar);\n return bar;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type {\n Bar,\n RequestLowerTfOpts,\n RequestNamespace,\n RequestSecurityOpts,\n SecurityBar,\n Series,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeLowerTfSeries } from \"./lowerTf.js\";\nimport { makeSecurityBar } from \"./security.js\";\n\nfunction getCtx(name: string): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(`${name} called outside an active script step`);\n }\n return ctx;\n}\n\nfunction security(slotId: string, opts: RequestSecurityOpts): SecurityBar {\n const ctx = getCtx(\"request.security\");\n return makeSecurityBar(ctx, slotId, opts.interval);\n}\n\nfunction lowerTf(slotId: string, opts: RequestLowerTfOpts): Series<ReadonlyArray<Bar>> {\n const ctx = getCtx(\"request.lowerTf\");\n return makeLowerTfSeries(ctx, slotId, opts.interval);\n}\n\n/**\n * Build the runtime `request` namespace installed on `ComputeContext`.\n *\n * The implementation accepts the compiler-injected `slotId` as its first\n * parameter even though the public core type is script-facing\n * `request.security(opts)`. This mirrors the existing slot-aware `state.*`\n * runtime namespace.\n *\n * @since 0.4\n * @stable\n * @example\n * const ns = buildRequestNamespace();\n * void ns.security;\n */\nexport function buildRequestNamespace(): RequestNamespace {\n const ns = Object.freeze({ security, lowerTf });\n return ns as unknown as RequestNamespace;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { BarStateView } from \"@invinite-org/chartlang-core\";\n\n/**\n * Candle-event kind used to derive the per-step `barstate.*` snapshot.\n *\n * @since 0.4\n * @stable\n * @example\n * const kind: EventKind = \"close\";\n * void kind;\n */\nexport type EventKind = \"history\" | \"close\" | \"tick\";\n\n/**\n * Inputs needed to build a `barstate.*` runtime view.\n *\n * @since 0.4\n * @stable\n * @example\n * const inputs: BarStateInputs = {\n * eventKind: \"history\",\n * barIndex: 0,\n * isLastBar: false,\n * };\n * void inputs;\n */\nexport type BarStateInputs = Readonly<{\n eventKind: EventKind;\n barIndex: number;\n isLastBar: boolean;\n}>;\n\n/**\n * Build a frozen `barstate.*` view for the current script step.\n *\n * @since 0.4\n * @stable\n * @example\n * const view = makeBarStateView({\n * eventKind: \"tick\",\n * barIndex: 5,\n * isLastBar: true,\n * });\n * void view.isrealtime;\n */\nexport function makeBarStateView(inputs: BarStateInputs): BarStateView {\n const { eventKind, barIndex, isLastBar } = inputs;\n return Object.freeze({\n isfirst: barIndex === 0,\n islast: isLastBar,\n isnew: eventKind === \"history\" || eventKind === \"close\",\n ishistory: eventKind === \"history\",\n isrealtime: eventKind === \"tick\",\n isconfirmed: eventKind === \"close\",\n });\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { IntervalDescriptor, TimeframeView } from \"@invinite-org/chartlang-core\";\n\nfunction parsePrefix(value: string): number | null {\n const match = /^(\\d+)/.exec(value);\n return match === null ? null : Number(match[1]);\n}\n\nconst GROUP_SECONDS: Readonly<Record<string, number>> = Object.freeze({\n second: 1,\n minute: 60,\n hour: 3_600,\n daily: 86_400,\n weekly: 604_800,\n monthly: 2_629_800,\n quarterly: 7_889_400,\n yearly: 31_557_600,\n});\n\nconst INTRADAY_GROUPS = new Set([\"second\", \"minute\", \"hour\"]);\nconst MONTHLY_LONGER = new Set([\"monthly\", \"quarterly\", \"yearly\"]);\n\n/**\n * Build a frozen `timeframe.*` view from the current bar interval and\n * adapter interval descriptor.\n *\n * @since 0.4\n * @stable\n * @example\n * const view = makeTimeframeView(\"5m\", {\n * value: \"5m\",\n * label: \"5 minutes\",\n * group: \"minute\",\n * });\n * void view.inSeconds;\n */\nexport function makeTimeframeView(\n interval: string,\n descriptor: IntervalDescriptor | undefined,\n): TimeframeView {\n const group = descriptor?.group ?? \"\";\n const prefix = parsePrefix(interval) ?? Number.NaN;\n const unitSeconds = GROUP_SECONDS[group] ?? Number.NaN;\n const inSeconds =\n Number.isFinite(prefix) && Number.isFinite(unitSeconds) ? prefix * unitSeconds : Number.NaN;\n\n return Object.freeze({\n period: interval,\n isintraday: INTRADAY_GROUPS.has(group),\n isdaily: group === \"daily\",\n isweekly: group === \"weekly\",\n ismonthly: MONTHLY_LONGER.has(group),\n inSeconds,\n });\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { IntervalDescriptor } from \"@invinite-org/chartlang-core\";\n\nimport type { RunnerState } from \"../createScriptRunner.js\";\nimport { makeBarStateView, type EventKind } from \"./barstateView.js\";\nimport { makeTimeframeView } from \"./timeframeView.js\";\n\nfunction findDescriptor(\n intervals: ReadonlyArray<IntervalDescriptor>,\n interval: string,\n): IntervalDescriptor | undefined {\n return intervals.find((candidate) => candidate.value === interval);\n}\n\n/**\n * Refresh per-step runtime views after the mutable bar view has been updated\n * and before `compute` runs.\n *\n * @since 0.4\n * @stable\n * @example\n * // refreshRuntimeViews(state, \"close\");\n * const fn: typeof refreshRuntimeViews = refreshRuntimeViews;\n * void fn;\n */\nexport function refreshRuntimeViews(state: RunnerState, eventKind: EventKind): void {\n const { runtimeContext } = state;\n const interval = runtimeContext.stream.bar.interval;\n runtimeContext.views.barstate = makeBarStateView({\n eventKind,\n barIndex: runtimeContext.barIndex(),\n isLastBar: eventKind !== \"history\",\n });\n runtimeContext.views.timeframe = makeTimeframeView(\n interval,\n findDescriptor(runtimeContext.capabilities.intervals, interval),\n );\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { JsonValue, SymInfoView, SymbolType } from \"@invinite-org/chartlang-core\";\n\n/**\n * Adapter-supplied per-mount symbol metadata payload.\n *\n * @since 0.4\n * @stable\n * @example\n * const info: AdapterSymInfo = {\n * ticker: \"DEMO\",\n * type: \"equity\",\n * mintick: 0.01,\n * };\n * void info;\n */\nexport type AdapterSymInfo = Readonly<{\n ticker?: string;\n type?: SymbolType;\n mintick?: number;\n currency?: string;\n basecurrency?: string;\n exchange?: string;\n timezone?: string;\n session?: string;\n meta?: Readonly<Record<string, JsonValue>>;\n}>;\n\nconst EMPTY_META: Readonly<Record<string, JsonValue>> = Object.freeze({});\n\n/**\n * Build a frozen `syminfo.*` view from adapter metadata and enabled fields.\n *\n * Fields not present in `enabled` evaluate to their empty sentinel:\n * `\"\"`, `Number.NaN`, `\"custom\"`, or `{}`.\n *\n * @since 0.4\n * @stable\n * @example\n * const view = makeSymInfoView(\n * { ticker: \"DEMO\", mintick: 0.01 },\n * new Set([\"ticker\", \"mintick\"]),\n * );\n * void view.ticker;\n */\nexport function makeSymInfoView(\n payload: AdapterSymInfo,\n enabled: ReadonlySet<string>,\n): SymInfoView {\n return Object.freeze({\n ticker: enabled.has(\"ticker\") ? (payload.ticker ?? \"\") : \"\",\n type: enabled.has(\"type\") ? (payload.type ?? \"custom\") : \"custom\",\n mintick: enabled.has(\"mintick\") ? (payload.mintick ?? Number.NaN) : Number.NaN,\n currency: enabled.has(\"currency\") ? (payload.currency ?? \"\") : \"\",\n basecurrency: enabled.has(\"basecurrency\") ? (payload.basecurrency ?? \"\") : \"\",\n exchange: enabled.has(\"exchange\") ? (payload.exchange ?? \"\") : \"\",\n timezone: enabled.has(\"timezone\") ? (payload.timezone ?? \"\") : \"\",\n session: enabled.has(\"session\") ? (payload.session ?? \"\") : \"\",\n meta: enabled.has(\"meta\") ? Object.freeze({ ...(payload.meta ?? {}) }) : EMPTY_META,\n });\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { BarStateView, SymInfoView, TimeframeView } from \"@invinite-org/chartlang-core\";\n\nimport { makeBarStateView } from \"./barstateView.js\";\nexport { refreshRuntimeViews } from \"./refreshRuntimeViews.js\";\nimport { makeSymInfoView } from \"./symInfoView.js\";\nimport { makeTimeframeView } from \"./timeframeView.js\";\n\n/**\n * Mutable runtime view container. Each field is replaced with a fresh\n * frozen snapshot as the runner advances.\n *\n * @since 0.4\n * @stable\n * @example\n * const views: RuntimeViews = createRuntimeViews();\n * views.barstate = views.barstate;\n */\nexport type RuntimeViews = {\n barstate: BarStateView;\n syminfo: SymInfoView;\n timeframe: TimeframeView;\n};\n\n/**\n * Build the default runtime view container for a script mount.\n *\n * @since 0.4\n * @stable\n * @example\n * const views = createRuntimeViews({\n * syminfo: makeSymInfoView({ ticker: \"DEMO\" }, new Set([\"ticker\"])),\n * });\n * void views.syminfo.ticker;\n */\nexport function createRuntimeViews(opts: { readonly syminfo?: SymInfoView } = {}): RuntimeViews {\n return {\n barstate: makeBarStateView({ eventKind: \"history\", barIndex: 0, isLastBar: false }),\n syminfo: opts.syminfo ?? makeSymInfoView({}, new Set()),\n timeframe: makeTimeframeView(\"\", undefined),\n };\n}\n\nexport { makeBarStateView } from \"./barstateView.js\";\nexport { makeSymInfoView } from \"./symInfoView.js\";\nexport { makeTimeframeView } from \"./timeframeView.js\";\nexport type { BarStateInputs, EventKind } from \"./barstateView.js\";\nexport type { AdapterSymInfo } from \"./symInfoView.js\";\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { IntervalDescriptor } from \"../types.js\";\n\nconst MULTIPLIERS = Object.freeze({\n s: 1,\n \"\": 60,\n m: 60,\n H: 3_600,\n h: 3_600,\n D: 86_400,\n W: 604_800,\n M: 2_592_000,\n Y: 31_536_000,\n});\n\n/**\n * Convert an {@link IntervalDescriptor} to its effective second count.\n *\n * The helper prefers `intervalSeconds` when present. Otherwise it parses\n * `value` as `<positive-integer><suffix>`, where no suffix means Pine-style\n * minutes. Month and year suffixes use fixed 30-day and 365-day\n * approximations; adapters that need calendar-exact durations should provide\n * `intervalSeconds`.\n *\n * @throws Error when the override is non-positive / non-finite, or `value`\n * cannot be parsed.\n * @since 0.6\n * @stable\n * @example\n * intervalToSeconds({ value: \"1D\", label: \"1 day\", group: \"day\" });\n * intervalToSeconds({ value: \"custom\", label: \"custom\", group: \"x\", intervalSeconds: 7 });\n */\nexport function intervalToSeconds(d: IntervalDescriptor): number {\n if (d.intervalSeconds !== undefined) {\n if (!Number.isFinite(d.intervalSeconds) || d.intervalSeconds <= 0) {\n throw new Error(\n `intervalToSeconds: intervalSeconds must be a positive finite number; received ${d.intervalSeconds}`,\n );\n }\n return Math.round(d.intervalSeconds);\n }\n\n const match = /^(\\d+)([smHhDWMY]?)$/.exec(d.value);\n if (match === null) {\n throw new Error(\n `intervalToSeconds: cannot parse interval value ${JSON.stringify(d.value)}`,\n );\n }\n\n const n = Number.parseInt(match[1], 10);\n if (!Number.isFinite(n) || n <= 0) {\n throw new Error(\n `intervalToSeconds: numeric prefix must be a positive integer; received ${JSON.stringify(d.value)}`,\n );\n }\n\n const suffix = match[2] as keyof typeof MULTIPLIERS;\n const multiplier = MULTIPLIERS[suffix];\n return n * multiplier;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { Color, Price, Time } from \"../types.js\";\nimport type {\n BoolDescriptor,\n ColorDescriptor,\n EnumDescriptor,\n ExternalSeriesDescriptor,\n FloatDescriptor,\n IntDescriptor,\n IntervalDescriptorInput,\n PriceDescriptor,\n Schema,\n SourceDescriptor,\n SourceField,\n StringDescriptor,\n SymbolDescriptor,\n TimeDescriptor,\n} from \"./inputDescriptor.js\";\n\n/**\n * The `input.*` namespace. Every builder is a compile-time literal: the\n * compiler reads the call expression and serialises the descriptor into\n * `manifest.inputs`.\n *\n * @since 0.4\n * @stable\n * @example\n * import { input } from \"@invinite-org/chartlang-core\";\n * const length = input.int(20, { min: 1, max: 200, title: \"Length\" });\n * void length;\n */\nexport const input = Object.freeze({\n /**\n * Build an integer input descriptor.\n *\n * @since 0.4\n * @stable\n * @example\n * const length = input.int(20, { min: 1, max: 200 });\n * void length;\n */\n int(\n defaultValue: number,\n opts?: {\n readonly min?: number;\n readonly max?: number;\n readonly step?: number;\n readonly title?: string;\n },\n ): IntDescriptor {\n return Object.freeze({ kind: \"int\" as const, defaultValue, ...opts });\n },\n\n /**\n * Build a floating-point input descriptor.\n *\n * @since 0.4\n * @stable\n * @example\n * const multiplier = input.float(2.5, { step: 0.5 });\n * void multiplier;\n */\n float(\n defaultValue: number,\n opts?: {\n readonly min?: number;\n readonly max?: number;\n readonly step?: number;\n readonly title?: string;\n },\n ): FloatDescriptor {\n return Object.freeze({ kind: \"float\" as const, defaultValue, ...opts });\n },\n\n /**\n * Build a boolean input descriptor.\n *\n * @since 0.4\n * @stable\n * @example\n * const enabled = input.bool(true);\n * void enabled;\n */\n bool(defaultValue: boolean, opts?: { readonly title?: string }): BoolDescriptor {\n return Object.freeze({ kind: \"bool\" as const, defaultValue, ...opts });\n },\n\n /**\n * Build a string input descriptor.\n *\n * @since 0.4\n * @stable\n * @example\n * const symbol = input.string(\"AAPL\");\n * void symbol;\n */\n string(\n defaultValue: string,\n opts?: { readonly title?: string; readonly multiline?: boolean },\n ): StringDescriptor {\n return Object.freeze({ kind: \"string\" as const, defaultValue, ...opts });\n },\n\n /**\n * Build a string enum input descriptor.\n *\n * @since 0.4\n * @stable\n * @example\n * const mode = input.enum(\"fast\", [\"fast\", \"slow\"]);\n * void mode;\n */\n enum<T extends string>(\n defaultValue: T,\n options: ReadonlyArray<T>,\n opts?: { readonly title?: string },\n ): EnumDescriptor<T> {\n return Object.freeze({\n kind: \"enum\" as const,\n defaultValue,\n options: Object.freeze(options.slice()),\n ...opts,\n });\n },\n\n /**\n * Build a color input descriptor.\n *\n * @since 0.4\n * @stable\n * @example\n * const c = input.color(\"#26a69a\");\n * void c;\n */\n color(defaultValue: Color, opts?: { readonly title?: string }): ColorDescriptor {\n return Object.freeze({ kind: \"color\" as const, defaultValue, ...opts });\n },\n\n /**\n * Build a source-field input descriptor.\n *\n * @since 0.4\n * @stable\n * @example\n * const source = input.source(\"close\");\n * void source;\n */\n source(defaultValue: SourceField, opts?: { readonly title?: string }): SourceDescriptor {\n return Object.freeze({ kind: \"source\" as const, defaultValue, ...opts });\n },\n\n /**\n * Build a time input descriptor.\n *\n * @since 0.4\n * @stable\n * @example\n * const anchor = input.time(1_700_000_000_000, { pickFromChart: true });\n * void anchor;\n */\n time(\n defaultValue: Time,\n opts?: { readonly title?: string; readonly pickFromChart?: boolean },\n ): TimeDescriptor {\n return Object.freeze({ kind: \"time\" as const, defaultValue, ...opts });\n },\n\n /**\n * Build a price input descriptor.\n *\n * @since 0.4\n * @stable\n * @example\n * const level = input.price(101.25);\n * void level;\n */\n price(defaultValue: Price, opts?: { readonly title?: string }): PriceDescriptor {\n return Object.freeze({ kind: \"price\" as const, defaultValue, ...opts });\n },\n\n /**\n * Build a symbol input descriptor.\n *\n * @since 0.4\n * @stable\n * @example\n * const ticker = input.symbol(\"AAPL\");\n * void ticker;\n */\n symbol(defaultValue: string, opts?: { readonly title?: string }): SymbolDescriptor {\n return Object.freeze({ kind: \"symbol\" as const, defaultValue, ...opts });\n },\n\n /**\n * Build a main-interval input descriptor.\n *\n * @since 0.4\n * @stable\n * @example\n * const interval = input.interval(\"1D\");\n * void interval;\n */\n interval(defaultValue: string, opts?: { readonly title?: string }): IntervalDescriptorInput {\n return Object.freeze({ kind: \"interval\" as const, defaultValue, ...opts });\n },\n\n /**\n * Build an adapter-supplied external series input descriptor.\n *\n * @since 0.4\n * @stable\n * @example\n * const earnings = input.externalSeries({\n * name: \"earnings\",\n * schema: { kind: \"external-series-schema\" },\n * });\n * void earnings;\n */\n externalSeries<T>(args: {\n readonly name: string;\n readonly schema: Schema<T>;\n readonly title?: string;\n }): ExternalSeriesDescriptor<T> {\n return Object.freeze({\n kind: \"external-series\" as const,\n name: args.name,\n schema: args.schema,\n ...(args.title === undefined ? {} : { title: args.title }),\n });\n },\n});\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { MutableSlot } from \"./mutableSlot.js\";\n\nconst sentinel = (name: string): never => {\n throw new Error(`${name} called outside an active script step`);\n};\n\n/**\n * Persistent state slots, Pine `var` semantics. Writes during a tick are\n * tentative and discarded if a later tick replaces the head bar; on bar\n * close the tentative value commits. Reads return the active tentative\n * value for the current step.\n *\n * The runtime replaces this compile-time callable hole with a slot-aware\n * namespace through `ComputeContext.state`.\n *\n * @since 0.4\n * @stable\n * @example\n * const ns: typeof state = state;\n * void ns;\n */\nexport const state = Object.freeze({\n /**\n * Allocate or read a persistent number slot.\n *\n * @since 0.4\n * @stable\n * @example\n * const fn: typeof state.float = state.float;\n * void fn;\n */\n float(_init: number): MutableSlot<number> {\n return sentinel(\"state.float\");\n },\n\n /**\n * Allocate or read a persistent integer slot.\n *\n * @since 0.4\n * @stable\n * @example\n * const fn: typeof state.int = state.int;\n * void fn;\n */\n int(_init: number): MutableSlot<number> {\n return sentinel(\"state.int\");\n },\n\n /**\n * Allocate or read a persistent boolean slot.\n *\n * @since 0.4\n * @stable\n * @example\n * const fn: typeof state.bool = state.bool;\n * void fn;\n */\n bool(_init: boolean): MutableSlot<boolean> {\n return sentinel(\"state.bool\");\n },\n\n /**\n * Allocate or read a persistent string slot.\n *\n * @since 0.4\n * @stable\n * @example\n * const fn: typeof state.string = state.string;\n * void fn;\n */\n string(_init: string): MutableSlot<string> {\n return sentinel(\"state.string\");\n },\n\n /**\n * Tick-persistent state slots, Pine `varip` semantics. Writes commit\n * immediately, even during a tick.\n *\n * @since 0.4\n * @stable\n * @example\n * const fn: typeof state.tick.float = state.tick.float;\n * void fn;\n */\n tick: Object.freeze({\n float(_init: number): MutableSlot<number> {\n return sentinel(\"state.tick.float\");\n },\n int(_init: number): MutableSlot<number> {\n return sentinel(\"state.tick.int\");\n },\n bool(_init: boolean): MutableSlot<boolean> {\n return sentinel(\"state.tick.bool\");\n },\n string(_init: string): MutableSlot<string> {\n return sentinel(\"state.tick.string\");\n },\n }),\n});\n\n/**\n * Static type of the `state` namespace. Runtime implementations satisfy\n * this shape structurally when they are installed on `ComputeContext.state`.\n *\n * @since 0.4\n * @stable\n * @example\n * const ns: StateNamespace = state;\n * void ns;\n */\nexport type StateNamespace = typeof state;\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\n/**\n * Bar-state view. Mirrors Pine's `barstate.*`; all fields are derived per\n * step from runtime event type and bar-index bookkeeping.\n *\n * The exported module-scope value is only the default fallback. Runtime\n * implementations supply per-step snapshots through `ComputeContext`.\n *\n * @since 0.4\n * @stable\n * @example\n * const view: BarStateView = barstate;\n * void view;\n */\nexport type BarStateView = {\n /** True on the first historical bar of this script mount. */\n readonly isfirst: boolean;\n /** True on the most recent bar, live or replay. */\n readonly islast: boolean;\n /** True if a new bar opened on this step; false on ticks within a bar. */\n readonly isnew: boolean;\n /** True if the runtime is in the historical-replay phase. */\n readonly ishistory: boolean;\n /** True if the runtime is processing a realtime feed. */\n readonly isrealtime: boolean;\n /** True if this step is a `kind: \"close\"` event; false on ticks. */\n readonly isconfirmed: boolean;\n};\n\n/**\n * Module-scope `barstate` fallback. Outside a script step, every field is\n * `false`; the runtime supplies the active per-step snapshot on\n * `ComputeContext.barstate`.\n *\n * @since 0.4\n * @stable\n * @example\n * import { barstate } from \"@invinite-org/chartlang-core\";\n * void barstate;\n */\nexport const barstate: BarStateView = Object.freeze({\n isfirst: false,\n islast: false,\n isnew: false,\n ishistory: false,\n isrealtime: false,\n isconfirmed: false,\n});\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { JsonValue } from \"../types.js\";\n\n/**\n * Symbol-type union. Adapters that cannot map a symbol to a canonical type\n * return `\"custom\"`.\n *\n * @since 0.4\n * @stable\n * @example\n * const t: SymbolType = \"equity\";\n * void t;\n */\nexport type SymbolType =\n | \"equity\"\n | \"futures\"\n | \"forex\"\n | \"crypto\"\n | \"index\"\n | \"fund\"\n | \"bond\"\n | \"commodity\"\n | \"custom\";\n\n/**\n * Symbol-metadata view. Fields not populated by the adapter evaluate to\n * their empty sentinel: `\"\"`, `NaN`, or `{}`.\n *\n * @since 0.4\n * @stable\n * @example\n * const view: SymInfoView = syminfo;\n * void view;\n */\nexport type SymInfoView = {\n readonly ticker: string;\n readonly type: SymbolType;\n readonly mintick: number;\n readonly currency: string;\n readonly basecurrency: string;\n readonly exchange: string;\n readonly timezone: string;\n readonly session: string;\n readonly meta: Readonly<Record<string, JsonValue>>;\n};\n\n/**\n * Module-scope `syminfo` fallback. Outside a script step, every field\n * evaluates to its empty sentinel; the runtime supplies the active per-mount\n * snapshot on `ComputeContext.syminfo`.\n *\n * @since 0.4\n * @stable\n * @example\n * import { syminfo } from \"@invinite-org/chartlang-core\";\n * void syminfo;\n */\nexport const syminfo: SymInfoView = Object.freeze({\n ticker: \"\",\n type: \"custom\",\n mintick: Number.NaN,\n currency: \"\",\n basecurrency: \"\",\n exchange: \"\",\n timezone: \"\",\n session: \"\",\n meta: Object.freeze({}),\n});\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\n/**\n * Timeframe-derived helpers. Runtime implementations derive the booleans from\n * `bar.interval` and the active adapter's `IntervalDescriptor.group`.\n *\n * Canonical groups are `\"second\"`, `\"minute\"`, `\"hour\"`, `\"daily\"`,\n * `\"weekly\"`, `\"monthly\"`, `\"quarterly\"`, and `\"yearly\"`. Custom groups do\n * not trigger helper booleans.\n *\n * @since 0.4\n * @stable\n * @example\n * const view: TimeframeView = timeframe;\n * void view;\n */\nexport type TimeframeView = {\n /** Same as `bar.interval`. */\n readonly period: string;\n /** True iff `IntervalDescriptor.group` is `\"second\"`, `\"minute\"`, or `\"hour\"`. */\n readonly isintraday: boolean;\n /** True iff `IntervalDescriptor.group` is `\"daily\"`. */\n readonly isdaily: boolean;\n /** True iff `IntervalDescriptor.group` is `\"weekly\"`. */\n readonly isweekly: boolean;\n /** True iff `IntervalDescriptor.group` is `\"monthly\"` or longer. */\n readonly ismonthly: boolean;\n /** Approximate seconds per bar at this interval; `NaN` if unknown. */\n readonly inSeconds: number;\n};\n\n/**\n * Module-scope `timeframe` fallback. Outside a script step, the period is\n * empty, every helper boolean is `false`, and `inSeconds` is `NaN`.\n *\n * @since 0.4\n * @stable\n * @example\n * import { timeframe } from \"@invinite-org/chartlang-core\";\n * void timeframe;\n */\nexport const timeframe: TimeframeView = Object.freeze({\n period: \"\",\n isintraday: false,\n isdaily: false,\n isweekly: false,\n ismonthly: false,\n inSeconds: Number.NaN,\n});\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { Bar, Price, Series, Time, Volume } from \"../types.js\";\n\n/**\n * Argument to {@link request.security}. The `interval` must be a string\n * literal or an `input.enum` value; the compiler's literal-only pass rejects\n * dynamic expressions with `request-security-interval-not-literal`.\n *\n * @since 0.4\n * @stable\n * @example\n * const opts: RequestSecurityOpts = { interval: \"1D\" };\n * void opts;\n */\nexport type RequestSecurityOpts = Readonly<{\n readonly interval: string;\n}>;\n\n/**\n * Argument to {@link request.lowerTf}. The `interval` must be strictly lower\n * than the script's main interval; invalid orderings are rejected by the\n * compiler's `lower-tf-not-lower` diagnostic when statically known.\n *\n * @since 0.6\n * @stable\n * @example\n * const opts: RequestLowerTfOpts = { interval: \"30s\" };\n * void opts;\n */\nexport type RequestLowerTfOpts = Readonly<{\n readonly interval: string;\n}>;\n\n/**\n * Secondary-stream bar returned by {@link request.security}. Each field is a\n * `Series<...>` aligned from the runtime's secondary-stream ring buffer to\n * the current main stream, or by the all-NaN fallback when\n * `Capabilities.multiTimeframe` is `false`, the interval is unsupported, or\n * the host fails to register the secondary stream.\n *\n * This is intentionally a series-shaped view rather than the scalar\n * {@link Bar} shape so scripts can read historical secondary values aligned\n * to main bars, such as `daily.close[5]`.\n *\n * @since 0.4\n * @stable\n * @example\n * const close: SecurityBar[\"close\"] = { current: 1, length: 1 };\n * void close;\n */\nexport type SecurityBar = Readonly<{\n readonly time: Series<Time>;\n readonly open: Series<Price>;\n readonly high: Series<Price>;\n readonly low: Series<Price>;\n readonly close: Series<Price>;\n readonly volume: Series<Volume>;\n readonly hl2: Series<Price>;\n readonly hlc3: Series<Price>;\n readonly ohlc4: Series<Price>;\n readonly hlcc4: Series<Price>;\n readonly symbol: Series<string>;\n readonly interval: Series<string>;\n}>;\n\nconst sentinel = (name: string): never => {\n throw new Error(`${name} called outside an active script step`);\n};\n\n/**\n * `request.*` namespace for secondary timeframe reads. The compiler walks\n * `request.security(...)` calls to populate `manifest.requestedIntervals`;\n * the runtime replaces this callable hole with a slot-aware implementation\n * through `ComputeContext.request`.\n *\n * @since 0.4\n * @stable\n * @example\n * const ns: typeof request = request;\n * void ns;\n */\nexport const request = Object.freeze({\n /**\n * Read a secondary candle stream at a script-author-fixed interval.\n *\n * @since 0.4\n * @stable\n * @example\n * const fn: typeof request.security = request.security;\n * void fn;\n */\n security(_opts: RequestSecurityOpts): SecurityBar {\n return sentinel(\"request.security\");\n },\n /**\n * Read lower-timeframe bars contained by each main-stream bar.\n *\n * @since 0.6\n * @stable\n * @example\n * const fn: typeof request.lowerTf = request.lowerTf;\n * void fn;\n */\n lowerTf(_opts: RequestLowerTfOpts): Series<ReadonlyArray<Bar>> {\n return sentinel(\"request.lowerTf\");\n },\n});\n\n/**\n * Static type of the `request` namespace. Runtime implementations satisfy\n * this shape structurally when installed on `ComputeContext.request`.\n *\n * @since 0.4\n * @stable\n * @example\n * const ns: RequestNamespace = request;\n * void ns;\n */\nexport type RequestNamespace = typeof request;\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { JsonValue } from \"../types.js\";\n\n/**\n * Runtime log severity emitted by `runtime.log.*`.\n *\n * @since 0.5\n * @stable\n * @example\n * const level: LogLevel = \"info\";\n * void level;\n */\nexport type LogLevel = \"info\" | \"warn\" | \"error\";\n\n/**\n * Per-step log message. Pine's `runtime.log.*` analogue. Capability-\n * gated by `Capabilities.logs`; silent no-op when false.\n *\n * @since 0.5\n * @stable\n * @example\n * // Inside compute:\n * // runtime.log.info(`ema=${ema.current}`, { ema: ema.current });\n */\nfunction _logInfo(_message: string, _meta?: Readonly<Record<string, JsonValue>>): void {\n throw new Error(\"runtime.log.info called outside compiled runtime\");\n}\n\n/**\n * Per-step warning log message. Capability-gated by `Capabilities.logs`.\n *\n * @since 0.5\n * @stable\n * @example\n * // Inside compute:\n * // runtime.log.warn(\"warmup incomplete\");\n */\nfunction _logWarn(_message: string, _meta?: Readonly<Record<string, JsonValue>>): void {\n throw new Error(\"runtime.log.warn called outside compiled runtime\");\n}\n\n/**\n * Per-step error log message. Capability-gated by `Capabilities.logs`.\n *\n * @since 0.5\n * @stable\n * @example\n * // Inside compute:\n * // runtime.log.error(\"unexpected branch\", { branch: \"fallback\" });\n */\nfunction _logError(_message: string, _meta?: Readonly<Record<string, JsonValue>>): void {\n throw new Error(\"runtime.log.error called outside compiled runtime\");\n}\n\n/**\n * Halt the current bar's compute. Emits a fatal `RuntimeDiagnostic`\n * with code `runtime-error-thrown`. The script stays mounted; the\n * next bar runs normally. Use for invariant violations the script\n * cannot continue past.\n *\n * @since 0.5\n * @stable\n * @example\n * // Inside compute:\n * // if (inputs.length < 1) runtime.error(\"length must be >= 1\");\n */\nfunction _error(_message: string): never {\n throw new Error(\"runtime.error called outside compiled runtime\");\n}\n\n/**\n * Pine-style runtime utilities exposed to script `compute` callbacks.\n *\n * @since 0.5\n * @stable\n * @example\n * // Inside compute:\n * // runtime.log.info(\"close\", { value: bar.close });\n */\nexport const runtime = Object.freeze({\n log: Object.freeze({\n info: _logInfo,\n warn: _logWarn,\n error: _logError,\n }),\n error: _error,\n});\n\n/**\n * Script-facing runtime namespace type.\n *\n * @since 0.5\n * @stable\n * @example\n * const ns: RuntimeNamespace = runtime;\n * void ns;\n */\nexport type RuntimeNamespace = typeof runtime;\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { Color } from \"../types.js\";\n\n/**\n * Pine-style named palette values accepted by the color parser and exposed\n * through the `color` namespace.\n *\n * @internal\n * @since 0.5\n * @example\n * const red = COLOR_PALETTE.red;\n * void red;\n */\nexport const COLOR_PALETTE = Object.freeze({\n aqua: \"#00ffff\",\n black: \"#000000\",\n blue: \"#0000ff\",\n fuchsia: \"#ff00ff\",\n gray: \"#808080\",\n green: \"#008000\",\n lime: \"#00ff00\",\n maroon: \"#800000\",\n navy: \"#000080\",\n olive: \"#808000\",\n orange: \"#ffa500\",\n purple: \"#800080\",\n red: \"#ff0000\",\n silver: \"#c0c0c0\",\n teal: \"#008080\",\n white: \"#ffffff\",\n yellow: \"#ffff00\",\n});\n\ntype PaletteName = keyof typeof COLOR_PALETTE;\n\nconst HEX_SHORT = /^#([0-9a-f]{3})$/i;\nconst HEX_LONG = /^#([0-9a-f]{6})$/i;\nconst RGB = /^rgba?\\(\\s*([^,\\s]+)\\s*,\\s*([^,\\s]+)\\s*,\\s*([^,\\s]+)(?:\\s*,\\s*([^,\\s]+))?\\s*\\)$/i;\nconst HSL = /^hsla?\\(\\s*([^,\\s]+)\\s*,\\s*([^,\\s%]+)%\\s*,\\s*([^,\\s%]+)%(?:\\s*,\\s*([^,\\s]+))?\\s*\\)$/i;\n\nfunction isPaletteName(value: string): value is PaletteName {\n return Object.prototype.hasOwnProperty.call(COLOR_PALETTE, value);\n}\n\nfunction clampByte(value: number): number {\n return Math.min(255, Math.max(0, Math.floor(value)));\n}\n\nfunction clampRoundedByte(value: number): number {\n return Math.min(255, Math.max(0, Math.round(value)));\n}\n\nfunction clampUnit(value: number): number {\n return Math.min(1, Math.max(0, value));\n}\n\nfunction parseNumber(value: string): number | null {\n const parsed = Number(value);\n if (Number.isNaN(parsed)) return null;\n return parsed;\n}\n\nfunction hslToRgb(h: number, s: number, l: number): Readonly<{ r: number; g: number; b: number }> {\n const hue = Math.min(359.999, Math.max(0, h)) / 360;\n const sat = Math.min(100, Math.max(0, s)) / 100;\n const light = Math.min(100, Math.max(0, l)) / 100;\n\n if (sat === 0) {\n const gray = clampRoundedByte(light * 255);\n return { r: gray, g: gray, b: gray };\n }\n\n const q = light < 0.5 ? light * (1 + sat) : light + sat - light * sat;\n const p = 2 * light - q;\n const channel = (t: number): number => {\n let adjusted = t;\n if (adjusted < 0) adjusted += 1;\n if (adjusted > 1) adjusted -= 1;\n if (adjusted < 1 / 6) return p + (q - p) * 6 * adjusted;\n if (adjusted < 1 / 2) return q;\n if (adjusted < 2 / 3) return p + (q - p) * (2 / 3 - adjusted) * 6;\n return p;\n };\n\n return {\n r: clampRoundedByte(channel(hue + 1 / 3) * 255),\n g: clampRoundedByte(channel(hue) * 255),\n b: clampRoundedByte(channel(hue - 1 / 3) * 255),\n };\n}\n\n/**\n * Parse the CSS color forms chartlang emits: `#rgb`, `#rrggbb`,\n * `rgb(...)`, `rgba(...)`, `hsl(...)`, `hsla(...)`, and the named palette.\n * Returns `null` for unparseable input.\n *\n * @internal\n * @since 0.5\n * @example\n * const parsed = parseColor(\"#ff0000\");\n * void parsed;\n */\nexport function parseColor(\n c: Color,\n): Readonly<{ r: number; g: number; b: number; a: number }> | null {\n const value = c.trim().toLowerCase();\n if (isPaletteName(value)) return parseColor(COLOR_PALETTE[value]);\n\n const shortHex = HEX_SHORT.exec(value);\n if (shortHex) {\n const hex = shortHex[1];\n return {\n r: Number.parseInt(`${hex[0]}${hex[0]}`, 16),\n g: Number.parseInt(`${hex[1]}${hex[1]}`, 16),\n b: Number.parseInt(`${hex[2]}${hex[2]}`, 16),\n a: 1,\n };\n }\n\n const longHex = HEX_LONG.exec(value);\n if (longHex) {\n const hex = longHex[1];\n return {\n r: Number.parseInt(hex.slice(0, 2), 16),\n g: Number.parseInt(hex.slice(2, 4), 16),\n b: Number.parseInt(hex.slice(4, 6), 16),\n a: 1,\n };\n }\n\n const rgbMatch = RGB.exec(value);\n if (rgbMatch) {\n const r = parseNumber(rgbMatch[1]);\n const g = parseNumber(rgbMatch[2]);\n const b = parseNumber(rgbMatch[3]);\n const a = rgbMatch[4] === undefined ? 1 : parseNumber(rgbMatch[4]);\n if (r === null || g === null || b === null || a === null) return null;\n return { r: clampByte(r), g: clampByte(g), b: clampByte(b), a: clampUnit(a) };\n }\n\n const hslMatch = HSL.exec(value);\n if (hslMatch) {\n const h = parseNumber(hslMatch[1]);\n const s = parseNumber(hslMatch[2]);\n const l = parseNumber(hslMatch[3]);\n const a = hslMatch[4] === undefined ? 1 : parseNumber(hslMatch[4]);\n if (h === null || s === null || l === null || a === null) return null;\n return { ...hslToRgb(h, s, l), a: clampUnit(a) };\n }\n\n return null;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { Color } from \"../types.js\";\nimport { parseColor } from \"./parseColor.js\";\n\n/**\n * Gradient color stop for `color.fromGradient`.\n *\n * @since 0.5\n * @stable\n * @example\n * const stop: GradientStop = { at: 0, color: \"#0000ff\" };\n * void stop;\n */\nexport type GradientStop = Readonly<{ at: number; color: Color }>;\n\nconst TRANSPARENT_BLACK = \"rgba(0, 0, 0, 0)\";\n\nfunction clampUnit(value: number): number {\n if (Number.isNaN(value)) return 0;\n return Math.min(1, Math.max(0, value));\n}\n\nfunction clampByte(value: number): number {\n if (Number.isNaN(value)) return 0;\n return Math.min(255, Math.max(0, Math.floor(value)));\n}\n\nfunction clampHue(value: number): number {\n if (Number.isNaN(value)) return 0;\n return Math.min(359.999, Math.max(0, value));\n}\n\nfunction clampPercent(value: number): number {\n if (Number.isNaN(value)) return 0;\n return Math.min(100, Math.max(0, value));\n}\n\nfunction formatNumber(value: number): string {\n const rounded = Math.round(value * 1000) / 1000;\n return String(rounded);\n}\n\nfunction emitRgb(r: number, g: number, b: number, alpha: number): Color {\n if (alpha >= 1) return `rgb(${r}, ${g}, ${b})`;\n return `rgba(${r}, ${g}, ${b}, ${formatNumber(alpha)})`;\n}\n\nfunction emitRgba(r: number, g: number, b: number, alpha: number): Color {\n return `rgba(${r}, ${g}, ${b}, ${formatNumber(alpha)})`;\n}\n\n/**\n * Dynamic color from a normalised position. `t` is clamped to `[0, 1]`;\n * out-of-range maps to the boundary stop. Stops must be pre-sorted by `at`\n * ascending. Empty stops return transparent black.\n *\n * Pine's `color.from_gradient`.\n *\n * @since 0.5\n * @stable\n * @example\n * // const blue = \"#0000ff\";\n * // const red = \"#ff0000\";\n * // color.fromGradient(0.5, [{ at: 0, color: blue }, { at: 1, color: red }]);\n */\nexport function fromGradient(t: number, stops: ReadonlyArray<GradientStop>): Color {\n const first = stops[0];\n if (first === undefined) return TRANSPARENT_BLACK;\n if (stops.length === 1 || Number.isNaN(t)) return first.color;\n\n const position = clampUnit(t);\n if (position <= first.at) return first.color;\n const last = stops[stops.length - 1];\n if (position >= last.at) return last.color;\n\n let previous = first;\n let next = last;\n for (let i = 1; i < stops.length; i += 1) {\n const candidate = stops[i];\n if (position <= candidate.at) {\n next = candidate;\n break;\n }\n previous = candidate;\n }\n\n const left = parseColor(previous.color);\n const right = parseColor(next.color);\n if (left === null || right === null) return previous.color;\n const ratio = (position - previous.at) / (next.at - previous.at);\n const alpha = left.a + (right.a - left.a) * ratio;\n return emitRgb(\n clampByte(left.r + (right.r - left.r) * ratio),\n clampByte(left.g + (right.g - left.g) * ratio),\n clampByte(left.b + (right.b - left.b) * ratio),\n clampUnit(alpha),\n );\n}\n\n/**\n * Override an existing color's alpha channel. `alpha` is clamped to\n * `[0, 1]`. NaN returns the input color unchanged. Pine's `color.new(c,\n * transp)` analogue using direct alpha.\n *\n * @since 0.5\n * @stable\n * @example\n * const c = withAlpha(\"#ff0000\", 0.5);\n * void c;\n */\nexport function withAlpha(c: Color, alpha: number): Color {\n if (Number.isNaN(alpha)) return c;\n const parsed = parseColor(c);\n if (parsed === null) return c;\n return emitRgba(parsed.r, parsed.g, parsed.b, clampUnit(alpha));\n}\n\n/**\n * Construct a color from RGB(A) components. Each component is clamped to\n * `[0, 255]`; alpha defaults to `1`. NaN components clamp to `0`.\n *\n * @since 0.5\n * @stable\n * @example\n * const red = rgb(255, 0, 0);\n * void red;\n */\nexport function rgb(r: number, g: number, b: number, alpha?: number): Color {\n const red = clampByte(r);\n const green = clampByte(g);\n const blue = clampByte(b);\n if (alpha === undefined) return `rgb(${red}, ${green}, ${blue})`;\n return emitRgba(red, green, blue, clampUnit(alpha));\n}\n\n/**\n * Construct a color from HSL(A) components. `h` is clamped to `[0, 360)`;\n * `s` and `l` are clamped to `[0, 100]`. Alpha defaults to `1`. NaN\n * components clamp to `0`.\n *\n * @since 0.5\n * @stable\n * @example\n * const red = hsl(0, 100, 50);\n * void red;\n */\nexport function hsl(h: number, s: number, l: number, alpha?: number): Color {\n const hue = formatNumber(clampHue(h));\n const sat = formatNumber(clampPercent(s));\n const light = formatNumber(clampPercent(l));\n if (alpha === undefined) return `hsl(${hue}, ${sat}%, ${light}%)`;\n return `hsla(${hue}, ${sat}%, ${light}%, ${formatNumber(clampUnit(alpha))})`;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport { fromGradient, hsl, rgb, withAlpha } from \"./colorHelpers.js\";\nimport { COLOR_PALETTE } from \"./parseColor.js\";\n\nexport { fromGradient, hsl, rgb, withAlpha } from \"./colorHelpers.js\";\nexport type { GradientStop } from \"./colorHelpers.js\";\n\n/**\n * Pine-style color namespace. Includes the named palette plus dynamic\n * helpers for compute-time colors.\n *\n * @since 0.5\n * @stable\n * @example\n * const c = color.withAlpha(color.red, 0.5);\n * void c;\n */\nexport const color = Object.freeze({\n ...COLOR_PALETTE,\n fromGradient,\n withAlpha,\n rgb,\n hsl,\n});\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\n/**\n * Per-entry shape of {@link STATEFUL_PRIMITIVES}. `name` is the\n * fully-qualified call (`ta.ema`, `plot`, `hline`, `alert`); `slot`\n * is `true` for every primitive whose call site needs a compiler-\n * injected slot id, `false` for the stateless helpers that ride along\n * in the set for in-loop diagnostics (currently only `ta.nz`).\n *\n * @since 0.1\n * @stable\n * @example\n * const entry: StatefulPrimitiveEntry = { name: \"ta.nz\", slot: false };\n */\nexport type StatefulPrimitiveEntry = Readonly<{ name: string; slot: boolean }>;\n\nconst STATEFUL_PRIMITIVE_ENTRIES: ReadonlyArray<StatefulPrimitiveEntry> = [\n { name: \"ta.sma\", slot: true },\n { name: \"ta.ema\", slot: true },\n { name: \"ta.stdev\", slot: true },\n { name: \"ta.bb\", slot: true },\n { name: \"ta.rsi\", slot: true },\n { name: \"ta.macd\", slot: true },\n { name: \"ta.atr\", slot: true },\n { name: \"ta.crossover\", slot: true },\n { name: \"ta.crossunder\", slot: true },\n { name: \"ta.highest\", slot: true },\n { name: \"ta.lowest\", slot: true },\n { name: \"ta.change\", slot: true },\n { name: \"ta.valuewhen\", slot: true },\n { name: \"ta.barssince\", slot: true },\n { name: \"ta.wma\", slot: true },\n { name: \"ta.vwma\", slot: true },\n { name: \"ta.hma\", slot: true },\n { name: \"ta.smma\", slot: true },\n { name: \"ta.dema\", slot: true },\n { name: \"ta.tema\", slot: true },\n { name: \"ta.kama\", slot: true },\n { name: \"ta.alma\", slot: true },\n { name: \"ta.lsma\", slot: true },\n { name: \"ta.mcginley\", slot: true },\n { name: \"ta.maRibbon\", slot: true },\n { name: \"ta.cci\", slot: true },\n { name: \"ta.stoch\", slot: true },\n { name: \"ta.williamsR\", slot: true },\n { name: \"ta.stochRsi\", slot: true },\n { name: \"ta.ultimateOsc\", slot: true },\n { name: \"ta.coppock\", slot: true },\n { name: \"ta.ppo\", slot: true },\n { name: \"ta.dpo\", slot: true },\n { name: \"ta.connorsRsi\", slot: true },\n { name: \"ta.kst\", slot: true },\n { name: \"ta.fisher\", slot: true },\n { name: \"ta.klinger\", slot: true },\n { name: \"ta.rvgi\", slot: true },\n { name: \"ta.ao\", slot: true },\n { name: \"ta.cmo\", slot: true },\n { name: \"ta.momentum\", slot: true },\n { name: \"ta.roc\", slot: true },\n { name: \"ta.pmo\", slot: true },\n { name: \"ta.smi\", slot: true },\n { name: \"ta.tsi\", slot: true },\n { name: \"ta.aroon\", slot: true },\n { name: \"ta.aroonOsc\", slot: true },\n { name: \"ta.adx\", slot: true },\n { name: \"ta.dmi\", slot: true },\n { name: \"ta.trix\", slot: true },\n { name: \"ta.vortex\", slot: true },\n { name: \"ta.trendStrengthIndex\", slot: true },\n { name: \"ta.ichimoku\", slot: true },\n { name: \"ta.vol\", slot: true },\n { name: \"ta.vwap\", slot: true },\n { name: \"ta.anchoredVwap\", slot: true },\n { name: \"ta.obv\", slot: true },\n { name: \"ta.adl\", slot: true },\n { name: \"ta.bop\", slot: true },\n { name: \"ta.cmf\", slot: true },\n { name: \"ta.chaikinOsc\", slot: true },\n { name: \"ta.mfi\", slot: true },\n { name: \"ta.netVolume\", slot: true },\n { name: \"ta.pvo\", slot: true },\n { name: \"ta.pvt\", slot: true },\n { name: \"ta.eom\", slot: true },\n { name: \"ta.nvi\", slot: true },\n { name: \"ta.pvi\", slot: true },\n { name: \"ta.visibleRangeVolumeProfile\", slot: true },\n { name: \"ta.anchoredVolumeProfile\", slot: true },\n { name: \"ta.sessionVolumeProfile\", slot: true },\n { name: \"ta.fixedRangeVolumeProfile\", slot: true },\n { name: \"ta.median\", slot: true },\n { name: \"ta.adr\", slot: true },\n { name: \"ta.ulcerIndex\", slot: true },\n { name: \"ta.bbPercentB\", slot: true },\n { name: \"ta.bbw\", slot: true },\n { name: \"ta.donchian\", slot: true },\n { name: \"ta.keltner\", slot: true },\n { name: \"ta.envelope\", slot: true },\n { name: \"ta.chop\", slot: true },\n { name: \"ta.historicalVolatility\", slot: true },\n { name: \"ta.rvi\", slot: true },\n { name: \"ta.massIndex\", slot: true },\n { name: \"ta.psar\", slot: true },\n { name: \"ta.supertrend\", slot: true },\n { name: \"ta.chandelier\", slot: true },\n { name: \"ta.chandeKrollStop\", slot: true },\n { name: \"ta.williamsFractal\", slot: true },\n { name: \"ta.zigZag\", slot: true },\n { name: \"ta.pivotsHighLow\", slot: true },\n { name: \"ta.pivotsStandard\", slot: true },\n { name: \"ta.volatilityStop\", slot: true },\n { name: \"ta.nz\", slot: false },\n { name: \"plot\", slot: true },\n { name: \"hline\", slot: true },\n { name: \"alert\", slot: true },\n // Phase 3 \u2014 draw.* namespace. One entry per kind in DRAWING_KINDS\n // order. Names are camelCase (`draw.<kindCamelCase>`); the wire\n // format keeps the kebab-case `DrawingKind`.\n { name: \"draw.line\", slot: true },\n { name: \"draw.horizontalLine\", slot: true },\n { name: \"draw.horizontalRay\", slot: true },\n { name: \"draw.verticalLine\", slot: true },\n { name: \"draw.crossLine\", slot: true },\n { name: \"draw.trendAngle\", slot: true },\n { name: \"draw.rectangle\", slot: true },\n { name: \"draw.rotatedRectangle\", slot: true },\n { name: \"draw.triangle\", slot: true },\n { name: \"draw.polyline\", slot: true },\n { name: \"draw.circle\", slot: true },\n { name: \"draw.ellipse\", slot: true },\n { name: \"draw.path\", slot: true },\n { name: \"draw.marker\", slot: true },\n { name: \"draw.arc\", slot: true },\n { name: \"draw.curve\", slot: true },\n { name: \"draw.doubleCurve\", slot: true },\n { name: \"draw.pen\", slot: true },\n { name: \"draw.highlighter\", slot: true },\n { name: \"draw.brush\", slot: true },\n { name: \"draw.text\", slot: true },\n { name: \"draw.arrow\", slot: true },\n { name: \"draw.arrowMarker\", slot: true },\n { name: \"draw.arrowMarkUp\", slot: true },\n { name: \"draw.arrowMarkDown\", slot: true },\n { name: \"draw.trendChannel\", slot: true },\n { name: \"draw.flatTopBottom\", slot: true },\n { name: \"draw.disjointChannel\", slot: true },\n { name: \"draw.regressionTrend\", slot: true },\n { name: \"draw.fibRetracement\", slot: true },\n { name: \"draw.fibTrendExtension\", slot: true },\n { name: \"draw.fibChannel\", slot: true },\n { name: \"draw.fibTimeZone\", slot: true },\n { name: \"draw.fibWedge\", slot: true },\n { name: \"draw.fibSpeedFan\", slot: true },\n { name: \"draw.fibSpeedArcs\", slot: true },\n { name: \"draw.fibSpiral\", slot: true },\n { name: \"draw.fibCircles\", slot: true },\n { name: \"draw.fibTrendTime\", slot: true },\n { name: \"draw.gannBox\", slot: true },\n { name: \"draw.gannSquareFixed\", slot: true },\n { name: \"draw.gannSquare\", slot: true },\n { name: \"draw.gannFan\", slot: true },\n { name: \"draw.pitchfork\", slot: true },\n { name: \"draw.pitchfan\", slot: true },\n { name: \"draw.xabcdPattern\", slot: true },\n { name: \"draw.cypherPattern\", slot: true },\n { name: \"draw.headAndShoulders\", slot: true },\n { name: \"draw.abcdPattern\", slot: true },\n { name: \"draw.trianglePattern\", slot: true },\n { name: \"draw.threeDrivesPattern\", slot: true },\n { name: \"draw.elliottImpulseWave\", slot: true },\n { name: \"draw.elliottCorrectionWave\", slot: true },\n { name: \"draw.elliottTriangleWave\", slot: true },\n { name: \"draw.elliottDoubleCombo\", slot: true },\n { name: \"draw.elliottTripleCombo\", slot: true },\n { name: \"draw.cyclicLines\", slot: true },\n { name: \"draw.timeCycles\", slot: true },\n { name: \"draw.sineLine\", slot: true },\n { name: \"draw.group\", slot: true },\n { name: \"draw.frame\", slot: true },\n { name: \"draw.table\", slot: true },\n { name: \"state.float\", slot: true },\n { name: \"state.int\", slot: true },\n { name: \"state.bool\", slot: true },\n { name: \"state.string\", slot: true },\n { name: \"state.tick.float\", slot: true },\n { name: \"state.tick.int\", slot: true },\n { name: \"state.tick.bool\", slot: true },\n { name: \"state.tick.string\", slot: true },\n { name: \"request.security\", slot: true },\n { name: \"request.lowerTf\", slot: true },\n { name: \"defineAlertCondition.signal\", slot: false },\n { name: \"runtime.log\", slot: false },\n { name: \"runtime.error\", slot: false },\n];\n\n/**\n * Frozen set of every fully-qualified call name the compiler tracks for\n * static-analysis (`stateful-call-inside-loop`) and slot-id injection\n * (PLAN.md \u00A75.5). Each entry carries a `slot` flag: `slot: true`\n * primitives allocate per-callsite hidden state and get a string-literal\n * slot id injected as their first argument; `slot: false` primitives are\n * pure helpers that ride along in the set because Pine still forbids\n * them inside loops (e.g. `ta.nz`).\n *\n * Phase 1 shipped 12 `slot: true` entries. Phase 2 widens the shape to\n * `{ name, slot }` so `ta.nz` (the only stateless Phase-2 cross-functional\n * primitive) can opt out of slot-id injection without losing the\n * in-loop diagnostic. Subsequent Phase-2 batch tasks (Tasks 6\u201328) each\n * append `slot: true` entries; Phase 3 appends 61 `draw.<camelKind>`\n * entries (all `slot: true`), and Phase 4 appends 8 `state.*` /\n * `state.tick.*` entries plus request primitives. Phase 5 appends alert-condition signalling plus runtime\n * logging/error as stateless loop-diagnostic entries plus `draw.table`\n * as a slot-backed viewport drawing.\n *\n * Locked at `apiVersion: 1` (172 entries). Adding, removing, or renaming\n * an entry is a language change and requires `apiVersion: 2` \u2014 see\n * `docs/spec/versioning.md`.\n *\n * @since 0.1\n * @stable\n * @example\n * import { STATEFUL_PRIMITIVES } from \"@invinite-org/chartlang-core\";\n * for (const entry of STATEFUL_PRIMITIVES) {\n * if (entry.name === \"ta.ema\" && entry.slot) {\n * // compiler injects an id here\n * }\n * }\n */\nexport const STATEFUL_PRIMITIVES: ReadonlySet<StatefulPrimitiveEntry> = Object.freeze(\n new Set<StatefulPrimitiveEntry>(STATEFUL_PRIMITIVE_ENTRIES),\n);\n\n/**\n * Name \u2192 entry index of {@link STATEFUL_PRIMITIVES}. The compiler's\n * `callsiteIdInjection` and `statefulCallInLoop` passes consult this map\n * by callee name once per call site \u2014 O(1) lookup instead of an O(n) scan\n * over the 172-entry set on every visited call. The map is derived from\n * the same canonical entry list as {@link STATEFUL_PRIMITIVES} so adding\n * a primitive to the set adds it here automatically.\n *\n * Locked at `apiVersion: 1` (172 entries). Adding, removing, or renaming\n * an entry is a language change and requires `apiVersion: 2` \u2014 see\n * `docs/spec/versioning.md`.\n *\n * @since 0.2\n * @stable\n * @example\n * import { STATEFUL_PRIMITIVES_BY_NAME } from \"@invinite-org/chartlang-core\";\n * const entry = STATEFUL_PRIMITIVES_BY_NAME.get(\"ta.ema\");\n * // entry is { name: \"ta.ema\", slot: true } | undefined\n */\nexport const STATEFUL_PRIMITIVES_BY_NAME: ReadonlyMap<string, StatefulPrimitiveEntry> = new Map<\n string,\n StatefulPrimitiveEntry\n>(STATEFUL_PRIMITIVE_ENTRIES.map((entry) => [entry.name, entry]));\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\n/**\n * The full set of 62 drawing kinds chartlang supports through `draw.*`.\n * The wire format is kebab-case; the TypeScript script surface is\n * camelCase (`draw.horizontalLine(...)`). See {@link KIND_CAMELCASE} for\n * the canonical bijection.\n *\n * Variant collapses pinned in PLAN.md \u00A73.1:\n *\n * - `ray` / `extended-line` collapse into `line` with `extendLeft` /\n * `extendRight` flags on the state.\n * - The 4 invinite pitchfork tools (`standard` / `schiff` /\n * `modifiedSchiff` / `inside`) collapse into `pitchfork` with a\n * `variant` discriminator on the state.\n * - `cypher-pattern` has no standalone tool \u2014 emittable only through\n * `defineDrawing` (Task 20).\n *\n * Order pinned: lines (6) \u2192 boxes (8) \u2192 curves (3) \u2192 freehand (3) \u2192\n * annotations (5) \u2192 channels (4) \u2192 fib (10) \u2192 gann (4) \u2192 pitchforks (2)\n * \u2192 patterns (6) \u2192 elliott (5) \u2192 cycles (3) \u2192 containers (2) \u2192 viewport\n * overlays (1) = 62. The order is wire-stable \u2014 downstream consumers iterate\n * {@link DRAWING_KINDS} in this order for diagnostic readability.\n *\n * @formula N/A \u2014 discriminator constant set\n * @anchors 62 kebab-case kind names; see {@link DRAWING_KINDS}\n * @since 0.3\n * @stable\n * @example\n * const k: DrawingKind = \"fib-retracement\";\n * void k;\n */\nexport type DrawingKind =\n // Lines / Rays (6)\n | \"line\"\n | \"horizontal-line\"\n | \"horizontal-ray\"\n | \"vertical-line\"\n | \"cross-line\"\n | \"trend-angle\"\n // Boxes / Shapes (8)\n | \"rectangle\"\n | \"rotated-rectangle\"\n | \"triangle\"\n | \"polyline\"\n | \"circle\"\n | \"ellipse\"\n | \"path\"\n | \"marker\"\n // Curves (3)\n | \"arc\"\n | \"curve\"\n | \"double-curve\"\n // Freehand (3)\n | \"pen\"\n | \"highlighter\"\n | \"brush\"\n // Annotations (5)\n | \"text\"\n | \"arrow\"\n | \"arrow-marker\"\n | \"arrow-mark-up\"\n | \"arrow-mark-down\"\n // Channels (4)\n | \"trend-channel\"\n | \"flat-top-bottom\"\n | \"disjoint-channel\"\n | \"regression-trend\"\n // Fibonacci (10)\n | \"fib-retracement\"\n | \"fib-trend-extension\"\n | \"fib-channel\"\n | \"fib-time-zone\"\n | \"fib-wedge\"\n | \"fib-speed-fan\"\n | \"fib-speed-arcs\"\n | \"fib-spiral\"\n | \"fib-circles\"\n | \"fib-trend-time\"\n // Gann (4)\n | \"gann-box\"\n | \"gann-square-fixed\"\n | \"gann-square\"\n | \"gann-fan\"\n // Pitchforks (2)\n | \"pitchfork\"\n | \"pitchfan\"\n // Harmonic Patterns (6)\n | \"xabcd-pattern\"\n | \"cypher-pattern\"\n | \"head-and-shoulders\"\n | \"abcd-pattern\"\n | \"triangle-pattern\"\n | \"three-drives-pattern\"\n // Elliott Waves (5)\n | \"elliott-impulse-wave\"\n | \"elliott-correction-wave\"\n | \"elliott-triangle-wave\"\n | \"elliott-double-combo\"\n | \"elliott-triple-combo\"\n // Cycles (3)\n | \"cyclic-lines\"\n | \"time-cycles\"\n | \"sine-line\"\n // Containers (2)\n | \"group\"\n | \"frame\"\n // Viewport overlays (1)\n | \"table\";\n\n/**\n * Iterable form of {@link DrawingKind}. Order matches the type\n * declaration so docs / validators / dispatchers can walk the set in a\n * single canonical order. Frozen.\n *\n * @formula N/A \u2014 discriminator constant set\n * @anchors 62 kebab-case kind names; see {@link DRAWING_KINDS}\n * @since 0.3\n * @stable\n * @example\n * import { DRAWING_KINDS } from \"@invinite-org/chartlang-core\";\n * for (const k of DRAWING_KINDS) {\n * void k;\n * }\n */\nexport const DRAWING_KINDS: ReadonlyArray<DrawingKind> = Object.freeze([\n \"line\",\n \"horizontal-line\",\n \"horizontal-ray\",\n \"vertical-line\",\n \"cross-line\",\n \"trend-angle\",\n \"rectangle\",\n \"rotated-rectangle\",\n \"triangle\",\n \"polyline\",\n \"circle\",\n \"ellipse\",\n \"path\",\n \"marker\",\n \"arc\",\n \"curve\",\n \"double-curve\",\n \"pen\",\n \"highlighter\",\n \"brush\",\n \"text\",\n \"arrow\",\n \"arrow-marker\",\n \"arrow-mark-up\",\n \"arrow-mark-down\",\n \"trend-channel\",\n \"flat-top-bottom\",\n \"disjoint-channel\",\n \"regression-trend\",\n \"fib-retracement\",\n \"fib-trend-extension\",\n \"fib-channel\",\n \"fib-time-zone\",\n \"fib-wedge\",\n \"fib-speed-fan\",\n \"fib-speed-arcs\",\n \"fib-spiral\",\n \"fib-circles\",\n \"fib-trend-time\",\n \"gann-box\",\n \"gann-square-fixed\",\n \"gann-square\",\n \"gann-fan\",\n \"pitchfork\",\n \"pitchfan\",\n \"xabcd-pattern\",\n \"cypher-pattern\",\n \"head-and-shoulders\",\n \"abcd-pattern\",\n \"triangle-pattern\",\n \"three-drives-pattern\",\n \"elliott-impulse-wave\",\n \"elliott-correction-wave\",\n \"elliott-triangle-wave\",\n \"elliott-double-combo\",\n \"elliott-triple-combo\",\n \"cyclic-lines\",\n \"time-cycles\",\n \"sine-line\",\n \"group\",\n \"frame\",\n \"table\",\n] as const satisfies ReadonlyArray<DrawingKind>);\n\n/**\n * camelCase TypeScript-surface name for every kind. Used by the editor\n * + gen-docs + the compiler's `STATEFUL_PRIMITIVES` lookup so a script\n * author writes `draw.horizontalLine(...)` while the wire format stays\n * kebab-case (`horizontal-line`). The bijection round-trips through\n * {@link KIND_KEBABCASE}.\n *\n * @formula N/A \u2014 discriminator constant set\n * @anchors 62 kebab-case kind names; see {@link DRAWING_KINDS}\n * @since 0.3\n * @stable\n * @example\n * import { KIND_CAMELCASE } from \"@invinite-org/chartlang-core\";\n * const camel = KIND_CAMELCASE.get(\"horizontal-line\"); // \"horizontalLine\"\n * void camel;\n */\nexport const KIND_CAMELCASE: ReadonlyMap<DrawingKind, string> = new Map<DrawingKind, string>([\n [\"line\", \"line\"],\n [\"horizontal-line\", \"horizontalLine\"],\n [\"horizontal-ray\", \"horizontalRay\"],\n [\"vertical-line\", \"verticalLine\"],\n [\"cross-line\", \"crossLine\"],\n [\"trend-angle\", \"trendAngle\"],\n [\"rectangle\", \"rectangle\"],\n [\"rotated-rectangle\", \"rotatedRectangle\"],\n [\"triangle\", \"triangle\"],\n [\"polyline\", \"polyline\"],\n [\"circle\", \"circle\"],\n [\"ellipse\", \"ellipse\"],\n [\"path\", \"path\"],\n [\"marker\", \"marker\"],\n [\"arc\", \"arc\"],\n [\"curve\", \"curve\"],\n [\"double-curve\", \"doubleCurve\"],\n [\"pen\", \"pen\"],\n [\"highlighter\", \"highlighter\"],\n [\"brush\", \"brush\"],\n [\"text\", \"text\"],\n [\"arrow\", \"arrow\"],\n [\"arrow-marker\", \"arrowMarker\"],\n [\"arrow-mark-up\", \"arrowMarkUp\"],\n [\"arrow-mark-down\", \"arrowMarkDown\"],\n [\"trend-channel\", \"trendChannel\"],\n [\"flat-top-bottom\", \"flatTopBottom\"],\n [\"disjoint-channel\", \"disjointChannel\"],\n [\"regression-trend\", \"regressionTrend\"],\n [\"fib-retracement\", \"fibRetracement\"],\n [\"fib-trend-extension\", \"fibTrendExtension\"],\n [\"fib-channel\", \"fibChannel\"],\n [\"fib-time-zone\", \"fibTimeZone\"],\n [\"fib-wedge\", \"fibWedge\"],\n [\"fib-speed-fan\", \"fibSpeedFan\"],\n [\"fib-speed-arcs\", \"fibSpeedArcs\"],\n [\"fib-spiral\", \"fibSpiral\"],\n [\"fib-circles\", \"fibCircles\"],\n [\"fib-trend-time\", \"fibTrendTime\"],\n [\"gann-box\", \"gannBox\"],\n [\"gann-square-fixed\", \"gannSquareFixed\"],\n [\"gann-square\", \"gannSquare\"],\n [\"gann-fan\", \"gannFan\"],\n [\"pitchfork\", \"pitchfork\"],\n [\"pitchfan\", \"pitchfan\"],\n [\"xabcd-pattern\", \"xabcdPattern\"],\n [\"cypher-pattern\", \"cypherPattern\"],\n [\"head-and-shoulders\", \"headAndShoulders\"],\n [\"abcd-pattern\", \"abcdPattern\"],\n [\"triangle-pattern\", \"trianglePattern\"],\n [\"three-drives-pattern\", \"threeDrivesPattern\"],\n [\"elliott-impulse-wave\", \"elliottImpulseWave\"],\n [\"elliott-correction-wave\", \"elliottCorrectionWave\"],\n [\"elliott-triangle-wave\", \"elliottTriangleWave\"],\n [\"elliott-double-combo\", \"elliottDoubleCombo\"],\n [\"elliott-triple-combo\", \"elliottTripleCombo\"],\n [\"cyclic-lines\", \"cyclicLines\"],\n [\"time-cycles\", \"timeCycles\"],\n [\"sine-line\", \"sineLine\"],\n [\"group\", \"group\"],\n [\"frame\", \"frame\"],\n [\"table\", \"table\"],\n]);\n\n/**\n * Inverse of {@link KIND_CAMELCASE} \u2014 camelCase TypeScript surface\n * name \u2192 kebab-case wire kind. Derived from `KIND_CAMELCASE` so the\n * two maps cannot drift.\n *\n * @formula N/A \u2014 discriminator constant set\n * @anchors 62 kebab-case kind names; see {@link DRAWING_KINDS}\n * @since 0.3\n * @stable\n * @example\n * import { KIND_KEBABCASE } from \"@invinite-org/chartlang-core\";\n * const kebab = KIND_KEBABCASE.get(\"horizontalLine\"); // \"horizontal-line\"\n * void kebab;\n */\nexport const KIND_KEBABCASE: ReadonlyMap<string, DrawingKind> = new Map<string, DrawingKind>(\n Array.from(KIND_CAMELCASE, ([kebab, camel]) => [camel, kebab]),\n);\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { DrawingKind } from \"./drawingKind.js\";\n\n/**\n * Canonical bucket name a {@link DrawingKind} maps to under the\n * `DrawingCounts` 5-bag budget (`{ lines, labels, boxes, polylines,\n * other }`). The adapter-kit `Capabilities.maxDrawingsPerScript` and\n * the script-side `ScriptManifest.maxDrawings?` both pin the same five\n * bucket names. The runtime budget enforcer counts emissions per\n * bucket and drops the overflow with `drawing-budget-exceeded`.\n *\n * @formula bucket = KIND_BUCKET.get(kind)\n * @anchors kind: DrawingKind \u2192 bucket: \"lines\"|\"labels\"|\"boxes\"|\"polylines\"|\"other\"\n * @since 0.3\n * @stable\n * @example\n * const b: DrawingBucket = \"lines\";\n * void b;\n */\nexport type DrawingBucket = \"lines\" | \"labels\" | \"boxes\" | \"polylines\" | \"other\";\n\n/**\n * Per-kind bucket assignment. Pinned table; every entry of\n * {@link DrawingKind} appears exactly once (asserted by\n * `buckets.test.ts`).\n *\n * Mapping rationale (Phase-3 task README \u00A7\"Architecture Decisions\"):\n * lines/rays/horizontalLine/verticalLine/crossLine/trendAngle \u2192 `lines`;\n * rectangle/rotatedRectangle/triangle/circle/ellipse \u2192 `boxes`;\n * path/polyline/curves/freehand/channels/pitchforks/patterns/elliott \u2192\n * `polylines`; text/arrow/arrowMarker/arrowMarkUp/arrowMarkDown +\n * marker \u2192 `labels`; fib / gann / cycles / containers / table \u2192 `other`.\n *\n * @formula bucket = KIND_BUCKET.get(kind)\n * @anchors kind: DrawingKind \u2192 bucket: \"lines\"|\"labels\"|\"boxes\"|\"polylines\"|\"other\"\n * @since 0.3\n * @stable\n * @example\n * import { KIND_BUCKET } from \"@invinite-org/chartlang-core\";\n * const b = KIND_BUCKET.get(\"fib-retracement\"); // \"other\"\n * void b;\n */\nexport const KIND_BUCKET: ReadonlyMap<DrawingKind, DrawingBucket> = new Map<\n DrawingKind,\n DrawingBucket\n>([\n [\"line\", \"lines\"],\n [\"horizontal-line\", \"lines\"],\n [\"horizontal-ray\", \"lines\"],\n [\"vertical-line\", \"lines\"],\n [\"cross-line\", \"lines\"],\n [\"trend-angle\", \"lines\"],\n [\"rectangle\", \"boxes\"],\n [\"rotated-rectangle\", \"boxes\"],\n [\"triangle\", \"boxes\"],\n [\"polyline\", \"polylines\"],\n [\"circle\", \"boxes\"],\n [\"ellipse\", \"boxes\"],\n [\"path\", \"polylines\"],\n [\"marker\", \"labels\"],\n [\"arc\", \"polylines\"],\n [\"curve\", \"polylines\"],\n [\"double-curve\", \"polylines\"],\n [\"pen\", \"polylines\"],\n [\"highlighter\", \"polylines\"],\n [\"brush\", \"polylines\"],\n [\"text\", \"labels\"],\n [\"arrow\", \"labels\"],\n [\"arrow-marker\", \"labels\"],\n [\"arrow-mark-up\", \"labels\"],\n [\"arrow-mark-down\", \"labels\"],\n [\"trend-channel\", \"polylines\"],\n [\"flat-top-bottom\", \"polylines\"],\n [\"disjoint-channel\", \"polylines\"],\n [\"regression-trend\", \"polylines\"],\n [\"fib-retracement\", \"other\"],\n [\"fib-trend-extension\", \"other\"],\n [\"fib-channel\", \"other\"],\n [\"fib-time-zone\", \"other\"],\n [\"fib-wedge\", \"other\"],\n [\"fib-speed-fan\", \"other\"],\n [\"fib-speed-arcs\", \"other\"],\n [\"fib-spiral\", \"other\"],\n [\"fib-circles\", \"other\"],\n [\"fib-trend-time\", \"other\"],\n [\"gann-box\", \"other\"],\n [\"gann-square-fixed\", \"other\"],\n [\"gann-square\", \"other\"],\n [\"gann-fan\", \"other\"],\n [\"pitchfork\", \"polylines\"],\n [\"pitchfan\", \"polylines\"],\n [\"xabcd-pattern\", \"polylines\"],\n [\"cypher-pattern\", \"polylines\"],\n [\"head-and-shoulders\", \"polylines\"],\n [\"abcd-pattern\", \"polylines\"],\n [\"triangle-pattern\", \"polylines\"],\n [\"three-drives-pattern\", \"polylines\"],\n [\"elliott-impulse-wave\", \"polylines\"],\n [\"elliott-correction-wave\", \"polylines\"],\n [\"elliott-triangle-wave\", \"polylines\"],\n [\"elliott-double-combo\", \"polylines\"],\n [\"elliott-triple-combo\", \"polylines\"],\n [\"cyclic-lines\", \"other\"],\n [\"time-cycles\", \"other\"],\n [\"sine-line\", \"other\"],\n [\"group\", \"other\"],\n [\"frame\", \"other\"],\n [\"table\", \"other\"],\n]);\n\n/**\n * Return the {@link DrawingBucket} for a given {@link DrawingKind}.\n * Throws if the kind is not in the map \u2014 covers the defensive branch\n * for callers that pass an unverified string (e.g. a future kind\n * round-tripped from the wire before its bucket entry lands).\n *\n * @formula bucket = KIND_BUCKET.get(kind)\n * @anchors kind: DrawingKind \u2192 bucket: \"lines\"|\"labels\"|\"boxes\"|\"polylines\"|\"other\"\n * @since 0.3\n * @stable\n * @example\n * import { bucketFor } from \"@invinite-org/chartlang-core\";\n * const bucket = bucketFor(\"rectangle\"); // \"boxes\"\n * void bucket;\n */\nexport function bucketFor(kind: DrawingKind): DrawingBucket {\n const bucket = KIND_BUCKET.get(kind);\n if (bucket === undefined) {\n throw new Error(`No bucket assigned for drawing kind '${kind}'`);\n }\n return bucket;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { Price, Time } from \"../types.js\";\nimport type {\n ArrowMarkerOpts,\n ArrowOpts,\n BrushStyle,\n FibOpts,\n FrameOpts,\n HighlighterStyle,\n LineDrawStyle,\n PathOpts,\n RegressionTrendOpts,\n ShapeStyle,\n TextOpts,\n} from \"./drawingStyle.js\";\nimport type { DrawingHandle } from \"./handle.js\";\nimport type { TableOpts } from \"./table.js\";\nimport type {\n AnchorHept,\n AnchorQuad,\n AnchorQuint,\n AnchorTriple,\n WorldPoint,\n} from \"./worldPoint.js\";\n\n/**\n * The script-facing `draw.*` namespace. Each method is stateful across\n * calls \u2014 the compiler injects a callsite slot id so the runtime can\n * track the per-handle `DrawingState` across bars \u2014 and returns a\n * {@link DrawingHandle}. Adapters that omit a kind degrade silently\n * with `unsupported-drawing-kind` (PLAN.md \u00A77.4); excess emissions\n * drop with `drawing-budget-exceeded` once the per-script bucket is\n * full.\n *\n * Every kind lives as a FLAT method directly on `DrawNamespace` \u2014\n * script authors call `draw.fibRetracement(a, b)` /\n * `draw.gannBox(a, b)` / `draw.elliottImpulseWave(anchors)` /\n * `draw.xabcdPattern(anchors)`, matching the flat camelCase names in\n * `STATEFUL_PRIMITIVES` and Pine + invinite parity. The wire format\n * keeps the kebab-case `DrawingKind`.\n *\n * Phase-3 implementations live in `@invinite-org/chartlang-runtime`;\n * this file ships the script-author type plus a throwing-stub `draw`\n * value (mirrors `plot/plot.ts:plot`). Tasks 5\u201318 land the runtime\n * impl per category.\n *\n * @formula N/A \u2014 namespace surface; per-method runtime impl in Tasks 5\u201318\n * @anchors per-method \u2014 see the per-kind state shapes in `drawingState.ts`\n * @since 0.3\n * @stable\n * @example\n * import type { DrawNamespace } from \"@invinite-org/chartlang-core\";\n * const _ns: DrawNamespace | null = null;\n * void _ns;\n */\nexport type DrawNamespace = {\n // Lines / Rays (Task 5)\n line(a: WorldPoint, b: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n horizontalLine(price: Price, opts?: LineDrawStyle): DrawingHandle;\n horizontalRay(anchor: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n verticalLine(time: Time, opts?: LineDrawStyle): DrawingHandle;\n crossLine(anchor: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n trendAngle(a: WorldPoint, b: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n // Boxes A (Task 6)\n rectangle(a: WorldPoint, b: WorldPoint, opts?: ShapeStyle): DrawingHandle;\n rotatedRectangle(anchors: AnchorQuad, opts?: ShapeStyle): DrawingHandle;\n triangle(anchors: AnchorTriple, opts?: ShapeStyle): DrawingHandle;\n polyline(anchors: ReadonlyArray<WorldPoint>, opts?: LineDrawStyle): DrawingHandle;\n // Boxes B (Task 7)\n circle(centre: WorldPoint, radiusAnchor: WorldPoint, opts?: ShapeStyle): DrawingHandle;\n ellipse(a: WorldPoint, b: WorldPoint, opts?: ShapeStyle): DrawingHandle;\n path(anchors: ReadonlyArray<WorldPoint>, opts?: PathOpts): DrawingHandle;\n marker(\n anchor: WorldPoint,\n opts?: TextOpts & { readonly text?: string; readonly value?: number },\n ): DrawingHandle;\n // Curves (Task 8)\n arc(anchors: AnchorTriple, opts?: LineDrawStyle): DrawingHandle;\n curve(anchors: AnchorTriple, opts?: LineDrawStyle): DrawingHandle;\n doubleCurve(anchors: AnchorQuint, opts?: LineDrawStyle): DrawingHandle;\n // Freehand (Task 8)\n pen(anchors: ReadonlyArray<WorldPoint>, opts?: LineDrawStyle): DrawingHandle;\n highlighter(anchors: ReadonlyArray<WorldPoint>, opts: HighlighterStyle): DrawingHandle;\n brush(anchors: ReadonlyArray<WorldPoint>, opts: BrushStyle): DrawingHandle;\n // Annotations (Task 9)\n text(anchor: WorldPoint, body: string, opts?: TextOpts): DrawingHandle;\n arrow(a: WorldPoint, b: WorldPoint, opts?: ArrowOpts): DrawingHandle;\n arrowMarker(anchor: WorldPoint, opts?: ArrowMarkerOpts): DrawingHandle;\n arrowMarkUp(anchor: WorldPoint, opts?: ArrowMarkerOpts): DrawingHandle;\n arrowMarkDown(anchor: WorldPoint, opts?: ArrowMarkerOpts): DrawingHandle;\n // Channels (Task 10)\n trendChannel(anchors: AnchorTriple, opts?: LineDrawStyle): DrawingHandle;\n flatTopBottom(anchors: AnchorTriple, opts?: LineDrawStyle): DrawingHandle;\n disjointChannel(anchors: AnchorQuad, opts?: LineDrawStyle): DrawingHandle;\n regressionTrend(a: WorldPoint, b: WorldPoint, opts?: RegressionTrendOpts): DrawingHandle;\n // Fibonacci A (Task 11)\n fibRetracement(a: WorldPoint, b: WorldPoint, opts?: FibOpts): DrawingHandle;\n fibTrendExtension(anchors: AnchorTriple, opts?: FibOpts): DrawingHandle;\n fibChannel(anchors: AnchorTriple, opts?: FibOpts): DrawingHandle;\n fibTimeZone(a: WorldPoint, b: WorldPoint, opts?: FibOpts): DrawingHandle;\n fibWedge(anchors: AnchorTriple, opts?: FibOpts): DrawingHandle;\n // Fibonacci B (Task 12)\n fibSpeedFan(a: WorldPoint, b: WorldPoint, opts?: FibOpts): DrawingHandle;\n fibSpeedArcs(a: WorldPoint, b: WorldPoint, opts?: FibOpts): DrawingHandle;\n fibSpiral(a: WorldPoint, b: WorldPoint, opts?: FibOpts): DrawingHandle;\n fibCircles(a: WorldPoint, b: WorldPoint, opts?: FibOpts): DrawingHandle;\n fibTrendTime(anchors: AnchorTriple, opts?: FibOpts): DrawingHandle;\n // Gann (Task 13)\n gannBox(a: WorldPoint, b: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n gannSquareFixed(anchor: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n gannSquare(a: WorldPoint, b: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n gannFan(a: WorldPoint, b: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n // Pitchforks (Task 14)\n pitchfork(\n anchors: AnchorTriple,\n opts?: LineDrawStyle & {\n readonly variant?: \"standard\" | \"schiff\" | \"modifiedSchiff\" | \"inside\";\n },\n ): DrawingHandle;\n pitchfan(anchors: AnchorTriple, opts?: LineDrawStyle): DrawingHandle;\n // Harmonic Patterns (Task 15)\n xabcdPattern(anchors: AnchorQuint, opts?: LineDrawStyle): DrawingHandle;\n cypherPattern(anchors: AnchorQuint, opts?: LineDrawStyle): DrawingHandle;\n headAndShoulders(anchors: AnchorQuint, opts?: LineDrawStyle): DrawingHandle;\n abcdPattern(anchors: AnchorQuad, opts?: LineDrawStyle): DrawingHandle;\n trianglePattern(anchors: AnchorTriple, opts?: LineDrawStyle): DrawingHandle;\n threeDrivesPattern(anchors: AnchorHept, opts?: LineDrawStyle): DrawingHandle;\n // Elliott Waves (Task 16)\n elliottImpulseWave(anchors: AnchorQuint, opts?: LineDrawStyle): DrawingHandle;\n elliottCorrectionWave(anchors: AnchorTriple, opts?: LineDrawStyle): DrawingHandle;\n elliottTriangleWave(anchors: AnchorQuint, opts?: LineDrawStyle): DrawingHandle;\n elliottDoubleCombo(anchors: AnchorHept, opts?: LineDrawStyle): DrawingHandle;\n elliottTripleCombo(anchors: AnchorHept, opts?: LineDrawStyle): DrawingHandle;\n // Cycles (Task 17)\n cyclicLines(a: WorldPoint, b: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n timeCycles(a: WorldPoint, b: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n sineLine(a: WorldPoint, b: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n // Containers (Task 18)\n group(childHandleIds: ReadonlyArray<string>): DrawingHandle;\n frame(a: WorldPoint, b: WorldPoint, opts?: FrameOpts): DrawingHandle;\n // Viewport overlays (Phase 5)\n table(opts: TableOpts): DrawingHandle;\n};\n\n/**\n * Compile-time callable hole for the `draw.*` namespace. Every `get`\n * on the proxy returns a function that throws the\n * `\"draw.<method> called outside compiled runtime\"` sentinel \u2014 same\n * convention as the `plot` / `hline` / `alert` stubs in\n * `plot/plot.ts:plot` / `alert/alert.ts:alert`. The runtime swaps this\n * stub for the real namespace at boot per the\n * `@invinite-org/chartlang-runtime` `primitives.ts` seam (PLAN.md\n * \u00A75.5).\n *\n * @formula N/A \u2014 namespace surface; per-method runtime impl in Tasks 5\u201318\n * @anchors per-method \u2014 see the per-kind state shapes in `drawingState.ts`\n * @since 0.3\n * @stable\n * @example\n * import { draw } from \"@invinite-org/chartlang-core\";\n * try {\n * draw.horizontalLine(0);\n * } catch {\n * // expected: \"draw.horizontalLine called outside compiled runtime\"\n * }\n */\nexport const draw: DrawNamespace = createDrawStub();\n\nfunction createDrawStub(): DrawNamespace {\n const handler: ProxyHandler<DrawNamespace> = {\n get(_target, property): unknown {\n const name = String(property);\n return throwingMethod(`draw.${name}`);\n },\n };\n return new Proxy({} as DrawNamespace, handler);\n}\n\nfunction throwingMethod(qualified: string): () => never {\n return (): never => {\n throw new Error(`${qualified} called outside compiled runtime`);\n };\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport { DRAWING_KINDS } from \"@invinite-org/chartlang-core\";\n\nimport type { DrawingCounts, IntervalDescriptor } from \"@invinite-org/chartlang-core\";\n\nimport type { AlertChannel, DrawingKind, PlotKind, SymInfoField } from \"../types.js\";\n\n/**\n * Canonical Phase-5 plot-kind set. Adapters that can render the full\n * script-facing plot inventory can pass this directly to\n * `Capabilities.plots`.\n *\n * @since 0.5\n * @stable\n * @example\n * import { PHASE_5_PLOT_KINDS } from \"@invinite-org/chartlang-adapter-kit\";\n * const plots = new Set(PHASE_5_PLOT_KINDS);\n * void plots;\n */\nexport const PHASE_5_PLOT_KINDS: ReadonlyArray<PlotKind> = Object.freeze([\n \"line\",\n \"step-line\",\n \"horizontal-line\",\n \"histogram\",\n \"bars\",\n \"area\",\n \"filled-band\",\n \"label\",\n \"marker\",\n \"shape\",\n \"character\",\n \"arrow\",\n \"candle-override\",\n \"bar-override\",\n \"bg-color\",\n \"bar-color\",\n \"horizontal-histogram\",\n]);\n\n/**\n * Helpers that assemble the `ReadonlySet` pieces of a `Capabilities`\n * bag. Phase 1 shipped the three line variants + an alert-channel\n * builder + a generic `union` combinator. Phase 2 adds one builder per\n * new `PlotKind` (`histogram`, `bars`, `area`, `filledBand`, `label`,\n * `marker`) plus `allPhase2Plots()` \u2014 the union of every Phase-1 +\n * Phase-2 kind.\n *\n * @since 0.1\n * @stable\n * @example\n * import { capabilities } from \"@invinite-org/chartlang-adapter-kit\";\n *\n * const plots = capabilities.allPhase2Plots();\n * const alerts = capabilities.alerts(\"toast\", \"log\");\n * const merged = capabilities.union(plots, capabilities.label());\n * void merged;\n */\nexport const capabilities = {\n line(): ReadonlySet<PlotKind> {\n return new Set<PlotKind>([\"line\"]);\n },\n stepLine(): ReadonlySet<PlotKind> {\n return new Set<PlotKind>([\"step-line\"]);\n },\n horizontalLine(): ReadonlySet<PlotKind> {\n return new Set<PlotKind>([\"horizontal-line\"]);\n },\n allLines(): ReadonlySet<PlotKind> {\n return new Set<PlotKind>([\"line\", \"step-line\", \"horizontal-line\"]);\n },\n /** Phase-2 histogram plot kind. @since 0.2 @stable */\n histogram(): ReadonlySet<PlotKind> {\n return new Set<PlotKind>([\"histogram\"]);\n },\n /** Phase-2 narrow-bars plot kind. @since 0.2 @stable */\n bars(): ReadonlySet<PlotKind> {\n return new Set<PlotKind>([\"bars\"]);\n },\n /** Phase-2 filled-area plot kind. @since 0.2 @stable */\n area(): ReadonlySet<PlotKind> {\n return new Set<PlotKind>([\"area\"]);\n },\n /** Phase-2 filled-band (between two polylines) plot kind.\n * @since 0.2 @stable */\n filledBand(): ReadonlySet<PlotKind> {\n return new Set<PlotKind>([\"filled-band\"]);\n },\n /** Phase-2 text-label plot kind. @since 0.2 @stable */\n label(): ReadonlySet<PlotKind> {\n return new Set<PlotKind>([\"label\"]);\n },\n /** Phase-2 discrete-marker plot kind. @since 0.2 @stable */\n marker(): ReadonlySet<PlotKind> {\n return new Set<PlotKind>([\"marker\"]);\n },\n /** Union of every plot kind that ships through Phase 2 \u2014 `line`,\n * `step-line`, `horizontal-line`, `histogram`, `bars`, `area`,\n * `filled-band`, `label`, `marker`. Phase-5 kinds are deliberately\n * excluded; the bundled `capabilities.union(...)` combinator\n * composes additional sets when needed.\n * @since 0.2 @stable */\n allPhase2Plots(): ReadonlySet<PlotKind> {\n return new Set<PlotKind>([\n \"line\",\n \"step-line\",\n \"horizontal-line\",\n \"histogram\",\n \"bars\",\n \"area\",\n \"filled-band\",\n \"label\",\n \"marker\",\n ]);\n },\n /** Union of every plot kind that ships through Phase 5.\n * @since 0.5 @stable */\n allPhase5Plots(): ReadonlySet<PlotKind> {\n return new Set<PlotKind>(PHASE_5_PLOT_KINDS);\n },\n alerts(...channels: ReadonlyArray<AlertChannel>): ReadonlySet<AlertChannel> {\n return new Set<AlertChannel>(channels);\n },\n union<T>(...sets: ReadonlyArray<ReadonlySet<T>>): ReadonlySet<T> {\n const out = new Set<T>();\n for (const s of sets) {\n for (const v of s) {\n out.add(v);\n }\n }\n return out;\n },\n /**\n * Timeframe descriptors this adapter can deliver, preserving picker order.\n *\n * @since 0.4\n * @stable\n * @example\n * import { capabilities } from \"@invinite-org/chartlang-adapter-kit\";\n *\n * const partial = capabilities.intervals([\n * { value: \"1D\", label: \"1 day\", group: \"daily\" },\n * ]);\n * void partial;\n */\n intervals(list: ReadonlyArray<IntervalDescriptor>): {\n intervals: ReadonlyArray<IntervalDescriptor>;\n } {\n return { intervals: Object.freeze(list.slice()) };\n },\n /**\n * Declares whether the adapter can deliver secondary candle streams.\n *\n * @since 0.4\n * @stable\n * @example\n * import { capabilities } from \"@invinite-org/chartlang-adapter-kit\";\n *\n * const partial = capabilities.multiTimeframe(false);\n * void partial;\n */\n multiTimeframe(enabled: boolean): { multiTimeframe: boolean } {\n return { multiTimeframe: enabled };\n },\n /**\n * Declares the maximum supported sub-pane count for one script.\n *\n * @since 0.4\n * @stable\n * @example\n * import { capabilities } from \"@invinite-org/chartlang-adapter-kit\";\n *\n * const partial = capabilities.subPanes(Number.MAX_SAFE_INTEGER);\n * void partial;\n */\n subPanes(max: number): { subPanes: number } {\n return { subPanes: max };\n },\n /**\n * Declares which `syminfo.*` fields this adapter populates.\n *\n * @since 0.4\n * @stable\n * @example\n * import { capabilities } from \"@invinite-org/chartlang-adapter-kit\";\n *\n * const partial = capabilities.symInfoFields([\"ticker\", \"mintick\"]);\n * void partial;\n */\n symInfoFields(fields: ReadonlyArray<SymInfoField>): {\n symInfoFields: ReadonlySet<SymInfoField>;\n } {\n return { symInfoFields: new Set(fields) };\n },\n /**\n * Declares the adapter's per-script drawing-emission budget.\n *\n * @since 0.4\n * @stable\n * @example\n * import { capabilities } from \"@invinite-org/chartlang-adapter-kit\";\n *\n * const partial = capabilities.maxDrawingsPerScript({\n * lines: 50, labels: 50, boxes: 50, polylines: 50, other: 50,\n * });\n * void partial;\n */\n maxDrawingsPerScript(counts: DrawingCounts): { maxDrawingsPerScript: DrawingCounts } {\n return { maxDrawingsPerScript: Object.freeze({ ...counts }) };\n },\n /**\n * Declares whether user-wired alert conditions are supported.\n *\n * @since 0.4\n * @stable\n * @example\n * import { capabilities } from \"@invinite-org/chartlang-adapter-kit\";\n *\n * const partial = capabilities.alertConditions(false);\n * void partial;\n */\n alertConditions(enabled: boolean): { alertConditions: boolean } {\n return { alertConditions: enabled };\n },\n /**\n * Declares whether runtime log messages are rendered by the adapter.\n *\n * @since 0.4\n * @stable\n * @example\n * import { capabilities } from \"@invinite-org/chartlang-adapter-kit\";\n *\n * const partial = capabilities.logs(false);\n * void partial;\n */\n logs(enabled: boolean): { logs: boolean } {\n return { logs: enabled };\n },\n\n // ------------------------------------------------------------\n // Phase 3 \u2014 per-kind drawing builders (61). Each returns a\n // single-element `Set<DrawingKind>` so adapters can compose via\n // `capabilities.union(...)`. The 13 category-group builders +\n // `allPhase3Drawings()` below are the canonical user-facing\n // surface; per-kind builders exist for precision opt-in.\n // @since 0.3 @stable\n // ------------------------------------------------------------\n\n /** Phase-3 `line` drawing kind. @since 0.3 @stable */\n drawLine(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"line\"]);\n },\n /** Phase-3 `horizontal-line` drawing kind. @since 0.3 @stable */\n drawHorizontalLine(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"horizontal-line\"]);\n },\n /** Phase-3 `horizontal-ray` drawing kind. @since 0.3 @stable */\n drawHorizontalRay(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"horizontal-ray\"]);\n },\n /** Phase-3 `vertical-line` drawing kind. @since 0.3 @stable */\n drawVerticalLine(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"vertical-line\"]);\n },\n /** Phase-3 `cross-line` drawing kind. @since 0.3 @stable */\n drawCrossLine(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"cross-line\"]);\n },\n /** Phase-3 `trend-angle` drawing kind. @since 0.3 @stable */\n drawTrendAngle(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"trend-angle\"]);\n },\n /** Phase-3 `rectangle` drawing kind. @since 0.3 @stable */\n drawRectangle(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"rectangle\"]);\n },\n /** Phase-3 `rotated-rectangle` drawing kind. @since 0.3 @stable */\n drawRotatedRectangle(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"rotated-rectangle\"]);\n },\n /** Phase-3 `triangle` drawing kind. @since 0.3 @stable */\n drawTriangle(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"triangle\"]);\n },\n /** Phase-3 `polyline` drawing kind. @since 0.3 @stable */\n drawPolyline(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"polyline\"]);\n },\n /** Phase-3 `circle` drawing kind. @since 0.3 @stable */\n drawCircle(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"circle\"]);\n },\n /** Phase-3 `ellipse` drawing kind. @since 0.3 @stable */\n drawEllipse(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"ellipse\"]);\n },\n /** Phase-3 `path` drawing kind. @since 0.3 @stable */\n drawPath(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"path\"]);\n },\n /** Phase-3 `marker` drawing kind. @since 0.3 @stable */\n drawMarker(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"marker\"]);\n },\n /** Phase-3 `arc` drawing kind. @since 0.3 @stable */\n drawArc(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"arc\"]);\n },\n /** Phase-3 `curve` drawing kind. @since 0.3 @stable */\n drawCurve(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"curve\"]);\n },\n /** Phase-3 `double-curve` drawing kind. @since 0.3 @stable */\n drawDoubleCurve(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"double-curve\"]);\n },\n /** Phase-3 `pen` drawing kind. @since 0.3 @stable */\n drawPen(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"pen\"]);\n },\n /** Phase-3 `highlighter` drawing kind. @since 0.3 @stable */\n drawHighlighter(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"highlighter\"]);\n },\n /** Phase-3 `brush` drawing kind. @since 0.3 @stable */\n drawBrush(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"brush\"]);\n },\n /** Phase-3 `text` drawing kind. @since 0.3 @stable */\n drawText(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"text\"]);\n },\n /** Phase-3 `arrow` drawing kind. @since 0.3 @stable */\n drawArrow(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"arrow\"]);\n },\n /** Phase-3 `arrow-marker` drawing kind. @since 0.3 @stable */\n drawArrowMarker(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"arrow-marker\"]);\n },\n /** Phase-3 `arrow-mark-up` drawing kind. @since 0.3 @stable */\n drawArrowMarkUp(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"arrow-mark-up\"]);\n },\n /** Phase-3 `arrow-mark-down` drawing kind. @since 0.3 @stable */\n drawArrowMarkDown(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"arrow-mark-down\"]);\n },\n /** Phase-3 `trend-channel` drawing kind. @since 0.3 @stable */\n drawTrendChannel(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"trend-channel\"]);\n },\n /** Phase-3 `flat-top-bottom` drawing kind. @since 0.3 @stable */\n drawFlatTopBottom(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"flat-top-bottom\"]);\n },\n /** Phase-3 `disjoint-channel` drawing kind. @since 0.3 @stable */\n drawDisjointChannel(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"disjoint-channel\"]);\n },\n /** Phase-3 `regression-trend` drawing kind. @since 0.3 @stable */\n drawRegressionTrend(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"regression-trend\"]);\n },\n /** Phase-3 `fib-retracement` drawing kind. @since 0.3 @stable */\n drawFibRetracement(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"fib-retracement\"]);\n },\n /** Phase-3 `fib-trend-extension` drawing kind. @since 0.3 @stable */\n drawFibTrendExtension(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"fib-trend-extension\"]);\n },\n /** Phase-3 `fib-channel` drawing kind. @since 0.3 @stable */\n drawFibChannel(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"fib-channel\"]);\n },\n /** Phase-3 `fib-time-zone` drawing kind. @since 0.3 @stable */\n drawFibTimeZone(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"fib-time-zone\"]);\n },\n /** Phase-3 `fib-wedge` drawing kind. @since 0.3 @stable */\n drawFibWedge(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"fib-wedge\"]);\n },\n /** Phase-3 `fib-speed-fan` drawing kind. @since 0.3 @stable */\n drawFibSpeedFan(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"fib-speed-fan\"]);\n },\n /** Phase-3 `fib-speed-arcs` drawing kind. @since 0.3 @stable */\n drawFibSpeedArcs(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"fib-speed-arcs\"]);\n },\n /** Phase-3 `fib-spiral` drawing kind. @since 0.3 @stable */\n drawFibSpiral(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"fib-spiral\"]);\n },\n /** Phase-3 `fib-circles` drawing kind. @since 0.3 @stable */\n drawFibCircles(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"fib-circles\"]);\n },\n /** Phase-3 `fib-trend-time` drawing kind. @since 0.3 @stable */\n drawFibTrendTime(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"fib-trend-time\"]);\n },\n /** Phase-3 `gann-box` drawing kind. @since 0.3 @stable */\n drawGannBox(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"gann-box\"]);\n },\n /** Phase-3 `gann-square-fixed` drawing kind. @since 0.3 @stable */\n drawGannSquareFixed(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"gann-square-fixed\"]);\n },\n /** Phase-3 `gann-square` drawing kind. @since 0.3 @stable */\n drawGannSquare(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"gann-square\"]);\n },\n /** Phase-3 `gann-fan` drawing kind. @since 0.3 @stable */\n drawGannFan(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"gann-fan\"]);\n },\n /** Phase-3 `pitchfork` drawing kind. @since 0.3 @stable */\n drawPitchfork(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"pitchfork\"]);\n },\n /** Phase-3 `pitchfan` drawing kind. @since 0.3 @stable */\n drawPitchfan(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"pitchfan\"]);\n },\n /** Phase-3 `xabcd-pattern` drawing kind. @since 0.3 @stable */\n drawXabcdPattern(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"xabcd-pattern\"]);\n },\n /** Phase-3 `cypher-pattern` drawing kind. @since 0.3 @stable */\n drawCypherPattern(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"cypher-pattern\"]);\n },\n /** Phase-3 `head-and-shoulders` drawing kind. @since 0.3 @stable */\n drawHeadAndShoulders(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"head-and-shoulders\"]);\n },\n /** Phase-3 `abcd-pattern` drawing kind. @since 0.3 @stable */\n drawAbcdPattern(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"abcd-pattern\"]);\n },\n /** Phase-3 `triangle-pattern` drawing kind. @since 0.3 @stable */\n drawTrianglePattern(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"triangle-pattern\"]);\n },\n /** Phase-3 `three-drives-pattern` drawing kind. @since 0.3 @stable */\n drawThreeDrivesPattern(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"three-drives-pattern\"]);\n },\n /** Phase-3 `elliott-impulse-wave` drawing kind. @since 0.3 @stable */\n drawElliottImpulseWave(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"elliott-impulse-wave\"]);\n },\n /** Phase-3 `elliott-correction-wave` drawing kind. @since 0.3 @stable */\n drawElliottCorrectionWave(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"elliott-correction-wave\"]);\n },\n /** Phase-3 `elliott-triangle-wave` drawing kind. @since 0.3 @stable */\n drawElliottTriangleWave(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"elliott-triangle-wave\"]);\n },\n /** Phase-3 `elliott-double-combo` drawing kind. @since 0.3 @stable */\n drawElliottDoubleCombo(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"elliott-double-combo\"]);\n },\n /** Phase-3 `elliott-triple-combo` drawing kind. @since 0.3 @stable */\n drawElliottTripleCombo(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"elliott-triple-combo\"]);\n },\n /** Phase-3 `cyclic-lines` drawing kind. @since 0.3 @stable */\n drawCyclicLines(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"cyclic-lines\"]);\n },\n /** Phase-3 `time-cycles` drawing kind. @since 0.3 @stable */\n drawTimeCycles(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"time-cycles\"]);\n },\n /** Phase-3 `sine-line` drawing kind. @since 0.3 @stable */\n drawSineLine(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"sine-line\"]);\n },\n /** Phase-3 `group` drawing kind. @since 0.3 @stable */\n drawGroup(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"group\"]);\n },\n /** Phase-3 `frame` drawing kind. @since 0.3 @stable */\n drawFrame(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"frame\"]);\n },\n /** Phase-5 `table` drawing kind. @since 0.5 @stable */\n drawTable(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"table\"]);\n },\n\n // ------------------------------------------------------------\n // Phase 3 \u2014 category-group builders (13). Each covers the kinds\n // of one \u00A710.2 category. Combine via `union(...)` for adapters\n // that support multiple categories.\n // @since 0.3 @stable\n // ------------------------------------------------------------\n\n /** All 6 line / ray drawing kinds. @since 0.3 @stable */\n allLineDrawings(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\n \"line\",\n \"horizontal-line\",\n \"horizontal-ray\",\n \"vertical-line\",\n \"cross-line\",\n \"trend-angle\",\n ]);\n },\n /**\n * All 8 box / shape drawing kinds. @since 0.3 @stable\n *\n * @remarks Capability categories are orthogonal to budget buckets:\n * `polyline` and `path` are budgeted under the `polylines` bucket\n * and `marker` under `labels` \u2014 not the `boxes` bucket (see\n * `bucketFor` in `@invinite-org/chartlang-core`). An adapter that\n * declares this set must size those buckets accordingly or those\n * three kinds drop with `drawing-budget-exceeded`.\n */\n allBoxDrawings(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\n \"rectangle\",\n \"rotated-rectangle\",\n \"triangle\",\n \"polyline\",\n \"circle\",\n \"ellipse\",\n \"path\",\n \"marker\",\n ]);\n },\n /** All 3 curve drawing kinds. @since 0.3 @stable */\n allCurveDrawings(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"arc\", \"curve\", \"double-curve\"]);\n },\n /** All 3 freehand drawing kinds. @since 0.3 @stable */\n allFreehandDrawings(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"pen\", \"highlighter\", \"brush\"]);\n },\n /** All 5 annotation drawing kinds. @since 0.3 @stable */\n allAnnotationDrawings(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\n \"text\",\n \"arrow\",\n \"arrow-marker\",\n \"arrow-mark-up\",\n \"arrow-mark-down\",\n ]);\n },\n /** All 4 channel drawing kinds. @since 0.3 @stable */\n allChannelDrawings(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\n \"trend-channel\",\n \"flat-top-bottom\",\n \"disjoint-channel\",\n \"regression-trend\",\n ]);\n },\n /** All 10 fibonacci drawing kinds. @since 0.3 @stable */\n allFibDrawings(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\n \"fib-retracement\",\n \"fib-trend-extension\",\n \"fib-channel\",\n \"fib-time-zone\",\n \"fib-wedge\",\n \"fib-speed-fan\",\n \"fib-speed-arcs\",\n \"fib-spiral\",\n \"fib-circles\",\n \"fib-trend-time\",\n ]);\n },\n /** All 4 gann drawing kinds. @since 0.3 @stable */\n allGannDrawings(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"gann-box\", \"gann-square-fixed\", \"gann-square\", \"gann-fan\"]);\n },\n /** All 2 pitchfork drawing kinds. @since 0.3 @stable */\n allPitchforkDrawings(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"pitchfork\", \"pitchfan\"]);\n },\n /** All 6 harmonic-pattern drawing kinds. @since 0.3 @stable */\n allPatternDrawings(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\n \"xabcd-pattern\",\n \"cypher-pattern\",\n \"head-and-shoulders\",\n \"abcd-pattern\",\n \"triangle-pattern\",\n \"three-drives-pattern\",\n ]);\n },\n /** All 5 elliott-wave drawing kinds. @since 0.3 @stable */\n allElliottDrawings(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\n \"elliott-impulse-wave\",\n \"elliott-correction-wave\",\n \"elliott-triangle-wave\",\n \"elliott-double-combo\",\n \"elliott-triple-combo\",\n ]);\n },\n /** All 3 cycle drawing kinds. @since 0.3 @stable */\n allCycleDrawings(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"cyclic-lines\", \"time-cycles\", \"sine-line\"]);\n },\n /** All 2 container drawing kinds. @since 0.3 @stable */\n allContainerDrawings(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>([\"group\", \"frame\"]);\n },\n\n /**\n * Every drawing kind that ships in Phase 3 \u2014 the union of every\n * category group above. Canvas2d declares this set as its\n * `Capabilities.drawings` (Task 4) so the conformance suite\n * covers all 61 kinds end-to-end.\n *\n * @since 0.3\n * @stable\n */\n allPhase3Drawings(): ReadonlySet<DrawingKind> {\n return new Set<DrawingKind>(DRAWING_KINDS.filter((kind) => kind !== \"table\"));\n },\n};\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport { DRAWING_KINDS, type DrawingKind } from \"@invinite-org/chartlang-core\";\n\nimport type { DiagnosticCode } from \"../types.js\";\n\n/**\n * Successful validation. `e` was a well-formed Phase-1 emission and is\n * safe to forward across the structured-clone boundary.\n *\n * @since 0.1\n * @stable\n * @example\n * const r: ValidationOk = { ok: true };\n */\nexport type ValidationOk = { readonly ok: true };\n\n/**\n * Failed validation. `code` is `\"malformed-emission\"` for shape errors\n * and `\"unsupported-drawing-kind\"` for the Phase-1 drawing stub.\n *\n * @since 0.1\n * @stable\n * @example\n * const r: ValidationFail = {\n * ok: false,\n * code: \"malformed-emission\",\n * message: \"not an object\",\n * };\n */\nexport type ValidationFail = {\n readonly ok: false;\n readonly code: DiagnosticCode;\n readonly message: string;\n};\n\n/**\n * Discriminated union returned by {@link validateEmission}.\n *\n * @since 0.1\n * @stable\n * @example\n * declare const r: ValidationResult;\n * if (r.ok) {\n * // pass through\n * } else {\n * console.error(r.code, r.message);\n * }\n */\nexport type ValidationResult = ValidationOk | ValidationFail;\n\nconst VALID_PLOT_STYLE_KINDS: ReadonlySet<string> = new Set([\n \"line\",\n \"step-line\",\n \"horizontal-line\",\n \"histogram\",\n \"bars\",\n \"area\",\n \"filled-band\",\n \"label\",\n \"marker\",\n \"shape\",\n \"character\",\n \"arrow\",\n \"candle-override\",\n \"bar-override\",\n \"bg-color\",\n \"bar-color\",\n \"horizontal-histogram\",\n]);\n\nconst VALID_LINE_STYLES: ReadonlySet<string> = new Set([\"solid\", \"dashed\", \"dotted\"]);\n\nconst VALID_MARKER_SHAPES: ReadonlySet<string> = new Set([\n \"circle\",\n \"triangle-up\",\n \"triangle-down\",\n \"square\",\n \"diamond\",\n]);\n\nconst VALID_SHAPE_GLYPHS: ReadonlySet<string> = new Set([\n \"circle\",\n \"triangle-up\",\n \"triangle-down\",\n \"square\",\n \"diamond\",\n \"cross\",\n \"xcross\",\n \"flag\",\n]);\n\nconst VALID_PLOT_LOCATIONS: ReadonlySet<string> = new Set([\"above\", \"below\", \"absolute\"]);\n\nconst VALID_ARROW_DIRECTIONS: ReadonlySet<string> = new Set([\"up\", \"down\"]);\n\nconst VALID_LABEL_POSITIONS: ReadonlySet<string> = new Set([\"above\", \"below\", \"anchor\"]);\n\nconst MAX_LABEL_LENGTH = 128;\n\nconst VALID_ALERT_SEVERITIES: ReadonlySet<string> = new Set([\"info\", \"warning\", \"critical\"]);\n\nconst VALID_LOG_LEVELS: ReadonlySet<string> = new Set([\"info\", \"warn\", \"error\"]);\n\nconst VALID_ALERT_CHANNELS: ReadonlySet<string> = new Set([\n \"log\",\n \"toast\",\n \"webhook\",\n \"email\",\n \"sms\",\n \"push\",\n]);\n\nconst VALID_DIAGNOSTIC_SEVERITIES: ReadonlySet<string> = new Set([\"info\", \"warning\", \"error\"]);\n\nconst VALID_DRAWING_KINDS: ReadonlySet<string> = new Set<string>(DRAWING_KINDS);\n\nconst VALID_DRAWING_OPS: ReadonlySet<string> = new Set([\"create\", \"update\", \"remove\"]);\n\nconst VALID_DIAGNOSTIC_CODES: ReadonlySet<string> = new Set<DiagnosticCode>([\n \"unsupported-plot-kind\",\n \"unsupported-drawing-kind\",\n \"unsupported-alert-channel\",\n \"unsupported-pane\",\n \"unsupported-interval\",\n \"multi-timeframe-not-supported\",\n \"unknown-secondary-stream\",\n \"lookback-exceeded\",\n \"drawing-budget-exceeded\",\n \"dropped-by-policy\",\n \"input-coercion-failed\",\n \"alert-conditions-not-supported\",\n \"unknown-alert-condition\",\n \"alert-rate-limited\",\n \"runtime-cpu-budget-exceeded\",\n \"runtime-memory-budget-exceeded\",\n \"runtime-log-budget-exceeded\",\n \"malformed-log-meta\",\n \"runtime-error-thrown\",\n \"session-info-missing\",\n \"fixed-range-inverted\",\n \"state-snapshot-restored\",\n \"state-snapshot-future-dated\",\n \"state-snapshot-malformed\",\n \"state-snapshot-save-failed\",\n \"malformed-emission\",\n]);\n\nfunction bad(message: string, code: DiagnosticCode = \"malformed-emission\"): ValidationFail {\n return { ok: false, code, message };\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n if (typeof v !== \"object\" || v === null) return false;\n const proto = Object.getPrototypeOf(v);\n return proto === Object.prototype || proto === null;\n}\n\nfunction isFiniteNumber(v: unknown): v is number {\n return typeof v === \"number\" && Number.isFinite(v);\n}\n\nfunction isNonNegativeInteger(v: unknown): v is number {\n return typeof v === \"number\" && Number.isInteger(v) && v >= 0;\n}\n\nfunction isNonEmptyString(v: unknown): v is string {\n return typeof v === \"string\" && v.length > 0;\n}\n\n/**\n * Walk a `meta` payload and reject any non-JSON-friendly element. Per\n * PLAN \u00A77.3 universal payload rules: forbid `Map`, `Set`, `Date`,\n * `RegExp`, `bigint`, `Function`, `Symbol`, `undefined`, class\n * instances, and non-finite numbers anywhere in the tree.\n */\nfunction walkMeta(v: unknown, path: string): ValidationResult {\n if (v === null) return { ok: true };\n const t = typeof v;\n if (t === \"boolean\" || t === \"string\") return { ok: true };\n if (t === \"number\") {\n if (!Number.isFinite(v as number)) {\n return bad(`${path}: non-finite number`);\n }\n return { ok: true };\n }\n if (t === \"undefined\") return bad(`${path}: undefined values are forbidden`);\n if (t === \"bigint\") return bad(`${path}: bigint is forbidden`);\n if (t === \"function\") return bad(`${path}: function is forbidden`);\n if (t === \"symbol\") return bad(`${path}: symbol is forbidden`);\n // typeof === \"object\" from here.\n if (Array.isArray(v)) {\n for (let i = 0; i < v.length; i++) {\n const r = walkMeta(v[i], `${path}[${i}]`);\n if (!r.ok) return r;\n }\n return { ok: true };\n }\n if (!isPlainObject(v)) {\n return bad(`${path}: only plain objects are allowed`);\n }\n for (const key of Object.keys(v)) {\n // Use `Reflect.get` and a try/catch so a throwing-getter on the\n // meta payload (constructed via `Object.defineProperty(..., {\n // get() { throw \u2026 }})` either deliberately or by accident at a\n // serialisation boundary) converts to a `malformed-emission`\n // diagnostic instead of crashing the host.\n let child: unknown;\n try {\n child = Reflect.get(v, key);\n } catch {\n return bad(`${path}.${key}: getter threw during traversal`);\n }\n const r = walkMeta(child, `${path}.${key}`);\n if (!r.ok) return r;\n }\n return { ok: true };\n}\n\nfunction validateLineLikeStyle(style: Record<string, unknown>): ValidationResult {\n const lineWidth = style.lineWidth;\n if (!isFiniteNumber(lineWidth) || lineWidth <= 0) {\n return bad(\"style.lineWidth: must be a finite positive number\");\n }\n const lineStyle = style.lineStyle;\n if (typeof lineStyle !== \"string\" || !VALID_LINE_STYLES.has(lineStyle)) {\n return bad(`style.lineStyle: '${String(lineStyle)}' is not a valid line style`);\n }\n return { ok: true };\n}\n\nfunction validateAreaStyle(style: Record<string, unknown>): ValidationResult {\n const lineCheck = validateLineLikeStyle(style);\n if (!lineCheck.ok) return lineCheck;\n const fillAlpha = style.fillAlpha;\n if (!isFiniteNumber(fillAlpha) || fillAlpha < 0 || fillAlpha > 1) {\n return bad(\"style.fillAlpha: must be a finite number in [0, 1]\");\n }\n return { ok: true };\n}\n\nfunction validateHistogramOrBarsStyle(style: Record<string, unknown>): ValidationResult {\n const baseline = style.baseline;\n if (!isFiniteNumber(baseline)) {\n return bad(\"style.baseline: must be a finite number\");\n }\n return { ok: true };\n}\n\nfunction validateFilledBandStyle(style: Record<string, unknown>): ValidationResult {\n const upper = style.upper;\n if (upper !== null && !isFiniteNumber(upper)) {\n return bad(\"style.upper: must be a finite number or null\");\n }\n const lower = style.lower;\n if (lower !== null && !isFiniteNumber(lower)) {\n return bad(\"style.lower: must be a finite number or null\");\n }\n if (upper === null && lower === null) {\n return bad(\"style.upper / style.lower: at least one bound must be non-null\");\n }\n const alpha = style.alpha;\n if (!isFiniteNumber(alpha) || alpha < 0 || alpha > 1) {\n return bad(\"style.alpha: must be a finite number in [0, 1]\");\n }\n return { ok: true };\n}\n\nfunction validateLabelStyle(style: Record<string, unknown>): ValidationResult {\n const text = style.text;\n if (typeof text !== \"string\" || text.length === 0) {\n return bad(\"style.text: must be a non-empty string\");\n }\n if (text.length > MAX_LABEL_LENGTH) {\n return bad(`style.text: must be at most ${MAX_LABEL_LENGTH} characters`);\n }\n const position = style.position;\n if (typeof position !== \"string\" || !VALID_LABEL_POSITIONS.has(position)) {\n return bad(`style.position: '${String(position)}' is not a valid label position`);\n }\n return { ok: true };\n}\n\nfunction validateMarkerStyle(style: Record<string, unknown>): ValidationResult {\n const shape = style.shape;\n if (typeof shape !== \"string\" || !VALID_MARKER_SHAPES.has(shape)) {\n return bad(`style.shape: '${String(shape)}' is not a valid marker shape`);\n }\n const size = style.size;\n if (!isFiniteNumber(size) || size <= 0) {\n return bad(\"style.size: must be a finite positive number\");\n }\n return { ok: true };\n}\n\nfunction validateOptionalLocation(style: Record<string, unknown>): ValidationResult {\n const location = style.location;\n if (\n location !== undefined &&\n (typeof location !== \"string\" || !VALID_PLOT_LOCATIONS.has(location))\n ) {\n return bad(`style.location: '${String(location)}' is not a valid plot location`);\n }\n return { ok: true };\n}\n\nfunction validatePlotShapeStyle(style: Record<string, unknown>): ValidationResult {\n const shape = style.shape;\n if (typeof shape !== \"string\" || !VALID_SHAPE_GLYPHS.has(shape)) {\n return bad(`style.shape: '${String(shape)}' is not a valid shape glyph`);\n }\n const size = style.size;\n if (!isFiniteNumber(size) || size <= 0) {\n return bad(\"style.size: must be a finite positive number\");\n }\n return validateOptionalLocation(style);\n}\n\nfunction validateCharacterStyle(style: Record<string, unknown>): ValidationResult {\n const char = style.char;\n if (typeof char !== \"string\" || char.length === 0) {\n return bad(\"style.char: must be a non-empty string\");\n }\n const size = style.size;\n if (!isFiniteNumber(size) || size <= 0) {\n return bad(\"style.size: must be a finite positive number\");\n }\n return validateOptionalLocation(style);\n}\n\nfunction validateArrowStyle(style: Record<string, unknown>): ValidationResult {\n const direction = style.direction;\n if (typeof direction !== \"string\" || !VALID_ARROW_DIRECTIONS.has(direction)) {\n return bad(`style.direction: '${String(direction)}' is not a valid arrow direction`);\n }\n const size = style.size;\n if (!isFiniteNumber(size) || size <= 0) {\n return bad(\"style.size: must be a finite positive number\");\n }\n return { ok: true };\n}\n\nfunction validateColor(value: unknown, path: string): ValidationResult {\n if (typeof value !== \"string\" || value.length === 0) {\n return bad(`${path}: must be a non-empty string`);\n }\n return { ok: true };\n}\n\nfunction validateCandleOverrideStyle(style: Record<string, unknown>): ValidationResult {\n const bull = validateColor(style.bull, \"style.bull\");\n if (!bull.ok) return bull;\n const bear = validateColor(style.bear, \"style.bear\");\n if (!bear.ok) return bear;\n if (style.doji !== undefined) {\n return validateColor(style.doji, \"style.doji\");\n }\n return { ok: true };\n}\n\nfunction validateSingleColorStyle(style: Record<string, unknown>, path: string): ValidationResult {\n return validateColor(style.color, path);\n}\n\nfunction validateBgColorStyle(style: Record<string, unknown>): ValidationResult {\n const color = validateSingleColorStyle(style, \"style.color\");\n if (!color.ok) return color;\n const transp = style.transp;\n if (transp !== undefined && (!isFiniteNumber(transp) || transp < 0 || transp > 100)) {\n return bad(\"style.transp: must be a finite number in [0, 100]\");\n }\n return { ok: true };\n}\n\nfunction validateHorizontalHistogramStyle(style: Record<string, unknown>): ValidationResult {\n const buckets = style.buckets;\n if (!Array.isArray(buckets)) {\n return bad(\"style.buckets: must be an array\");\n }\n for (let i = 0; i < buckets.length; i++) {\n const bucket = buckets[i];\n if (!isPlainObject(bucket)) {\n return bad(`style.buckets[${i}]: must be an object`);\n }\n if (!isFiniteNumber(bucket.price)) {\n return bad(`style.buckets[${i}].price: must be a finite number`);\n }\n if (!isFiniteNumber(bucket.volume) || bucket.volume < 0) {\n return bad(`style.buckets[${i}].volume: must be a finite non-negative number`);\n }\n if (bucket.color !== undefined) {\n const color = validateColor(bucket.color, `style.buckets[${i}].color`);\n if (!color.ok) return color;\n }\n }\n return { ok: true };\n}\n\nfunction validatePlotStyle(style: unknown): ValidationResult {\n if (!isPlainObject(style)) return bad(\"style: not an object\");\n const kind = style.kind;\n if (typeof kind !== \"string\" || !VALID_PLOT_STYLE_KINDS.has(kind)) {\n return bad(`style.kind: '${String(kind)}' is not a known plot kind`);\n }\n switch (kind) {\n case \"line\":\n case \"step-line\":\n case \"horizontal-line\":\n return validateLineLikeStyle(style);\n case \"histogram\":\n case \"bars\":\n return validateHistogramOrBarsStyle(style);\n case \"area\":\n return validateAreaStyle(style);\n case \"filled-band\":\n return validateFilledBandStyle(style);\n case \"label\":\n return validateLabelStyle(style);\n case \"marker\":\n return validateMarkerStyle(style);\n case \"shape\":\n return validatePlotShapeStyle(style);\n case \"character\":\n return validateCharacterStyle(style);\n case \"arrow\":\n return validateArrowStyle(style);\n case \"candle-override\":\n return validateCandleOverrideStyle(style);\n case \"bar-override\":\n case \"bar-color\":\n return validateSingleColorStyle(style, \"style.color\");\n case \"bg-color\":\n return validateBgColorStyle(style);\n case \"horizontal-histogram\":\n return validateHorizontalHistogramStyle(style);\n /* v8 ignore next 2 -- kind is already gated by VALID_PLOT_STYLE_KINDS */\n default:\n return bad(`style.kind: '${kind}' has no validator`);\n }\n}\n\nfunction validatePlotEmission(e: Record<string, unknown>): ValidationResult {\n if (!isNonEmptyString(e.slotId)) return bad(\"plot.slotId: must be a non-empty string\");\n if (typeof e.title !== \"string\") return bad(\"plot.title: must be a string\");\n const styleResult = validatePlotStyle(e.style);\n if (!styleResult.ok) return styleResult;\n if (!isNonNegativeInteger(e.bar)) {\n return bad(\"plot.bar: must be a non-negative integer\");\n }\n if (!isFiniteNumber(e.time)) return bad(\"plot.time: must be a finite number\");\n const value = e.value;\n if (value !== null && !isFiniteNumber(value)) {\n return bad(\"plot.value: must be a finite number or null\");\n }\n const color = e.color;\n if (color !== null && typeof color !== \"string\") {\n return bad(\"plot.color: must be a string or null\");\n }\n if (!isPlainObject(e.meta)) return bad(\"plot.meta: must be a plain object\");\n const metaResult = walkMeta(e.meta, \"plot.meta\");\n if (!metaResult.ok) return metaResult;\n if (typeof e.pane !== \"string\") return bad(\"plot.pane: must be a string\");\n return { ok: true };\n}\n\nfunction validateAlertEmission(e: Record<string, unknown>): ValidationResult {\n if (!isNonEmptyString(e.slotId)) return bad(\"alert.slotId: must be a non-empty string\");\n const severity = e.severity;\n if (typeof severity !== \"string\" || !VALID_ALERT_SEVERITIES.has(severity)) {\n return bad(`alert.severity: '${String(severity)}' is not a valid severity`);\n }\n if (!isNonEmptyString(e.message)) {\n return bad(\"alert.message: must be a non-empty string\");\n }\n if (!isNonNegativeInteger(e.bar)) {\n return bad(\"alert.bar: must be a non-negative integer\");\n }\n if (!isFiniteNumber(e.time)) return bad(\"alert.time: must be a finite number\");\n if (!isPlainObject(e.meta)) return bad(\"alert.meta: must be a plain object\");\n const metaResult = walkMeta(e.meta, \"alert.meta\");\n if (!metaResult.ok) return metaResult;\n const channels = e.channels;\n if (!Array.isArray(channels)) return bad(\"alert.channels: must be an array\");\n for (let i = 0; i < channels.length; i++) {\n const c = channels[i];\n if (typeof c !== \"string\" || !VALID_ALERT_CHANNELS.has(c)) {\n return bad(`alert.channels[${i}]: '${String(c)}' is not a valid alert channel`);\n }\n }\n if (!isNonEmptyString(e.dedupeKey)) {\n return bad(\"alert.dedupeKey: must be a non-empty string\");\n }\n return { ok: true };\n}\n\nfunction validateAlertConditionEmission(e: Record<string, unknown>): ValidationResult {\n if (!isNonEmptyString(e.conditionId)) {\n return bad(\"alert-condition.conditionId: must be a non-empty string\");\n }\n if (typeof e.title !== \"string\") {\n return bad(\"alert-condition.title: must be a string\");\n }\n if (typeof e.description !== \"string\") {\n return bad(\"alert-condition.description: must be a string\");\n }\n if (typeof e.defaultMessage !== \"string\") {\n return bad(\"alert-condition.defaultMessage: must be a string\");\n }\n if (typeof e.fired !== \"boolean\") {\n return bad(\"alert-condition.fired: must be a boolean\");\n }\n if (!isNonNegativeInteger(e.bar)) {\n return bad(\"alert-condition.bar: must be a non-negative integer\");\n }\n if (!isFiniteNumber(e.time)) {\n return bad(\"alert-condition.time: must be a finite number\");\n }\n return { ok: true };\n}\n\nfunction validateLogEmission(e: Record<string, unknown>): ValidationResult {\n const level = e.level;\n if (typeof level !== \"string\" || !VALID_LOG_LEVELS.has(level)) {\n return bad(`log.level: '${String(level)}' is not a valid log level`);\n }\n if (!isNonEmptyString(e.message)) {\n return bad(\"log.message: must be a non-empty string\");\n }\n const meta = e.meta;\n if (meta !== undefined) {\n if (!isPlainObject(meta)) return bad(\"log.meta: must be a plain object\");\n const metaResult = walkMeta(meta, \"log.meta\");\n if (!metaResult.ok) return metaResult;\n }\n if (!isNonNegativeInteger(e.bar)) {\n return bad(\"log.bar: must be a non-negative integer\");\n }\n if (!isFiniteNumber(e.time)) {\n return bad(\"log.time: must be a finite number\");\n }\n return { ok: true };\n}\n\nfunction isWorldPoint(v: unknown): v is { time: number; price: number } {\n if (!isPlainObject(v)) return false;\n return isFiniteNumber(v.time) && isFiniteNumber(v.price);\n}\n\nfunction validateAnchorFixed(v: unknown, path: string, count: number): ValidationResult {\n if (!Array.isArray(v) || v.length !== count) {\n return bad(`${path}: must be a ${count}-element WorldPoint tuple`);\n }\n for (let i = 0; i < count; i++) {\n if (!isWorldPoint(v[i])) {\n return bad(`${path}[${i}]: not a WorldPoint (need finite time + price)`);\n }\n }\n return { ok: true };\n}\n\nfunction validateAnchorPair(v: unknown, path: string): ValidationResult {\n return validateAnchorFixed(v, path, 2);\n}\n\nfunction validateAnchorTriple(v: unknown, path: string): ValidationResult {\n return validateAnchorFixed(v, path, 3);\n}\n\nfunction validateAnchorQuad(v: unknown, path: string): ValidationResult {\n return validateAnchorFixed(v, path, 4);\n}\n\nfunction validateAnchorQuint(v: unknown, path: string): ValidationResult {\n return validateAnchorFixed(v, path, 5);\n}\n\nfunction validateAnchorHept(v: unknown, path: string): ValidationResult {\n return validateAnchorFixed(v, path, 7);\n}\n\nfunction validateOptionalLabels(v: unknown, path: string, expectedCount: number): ValidationResult {\n if (v === undefined) return { ok: true };\n if (!Array.isArray(v) || v.length !== expectedCount) {\n return bad(`${path}: must be an array of ${expectedCount} strings`);\n }\n for (let i = 0; i < expectedCount; i++) {\n if (typeof v[i] !== \"string\") {\n return bad(`${path}[${i}]: must be a string`);\n }\n }\n return { ok: true };\n}\n\nfunction validateAnchorVariable(\n v: unknown,\n path: string,\n min: number,\n max: number,\n): ValidationResult {\n if (!Array.isArray(v) || v.length < min || v.length > max) {\n return bad(`${path}: must be an array of ${min}..${max} WorldPoints`);\n }\n for (let i = 0; i < v.length; i++) {\n if (!isWorldPoint(v[i])) {\n return bad(`${path}[${i}]: not a WorldPoint (need finite time + price)`);\n }\n }\n return { ok: true };\n}\n\nfunction validateLineDrawStyle(s: unknown, path: string): ValidationResult {\n if (!isPlainObject(s)) return bad(`${path}: must be a plain object`);\n if (s.color !== undefined && typeof s.color !== \"string\") {\n return bad(`${path}.color: must be a string`);\n }\n if (s.lineWidth !== undefined && (!isFiniteNumber(s.lineWidth) || s.lineWidth <= 0)) {\n return bad(`${path}.lineWidth: must be a finite positive number`);\n }\n if (s.lineStyle !== undefined && !VALID_LINE_STYLES.has(String(s.lineStyle))) {\n return bad(`${path}.lineStyle: '${String(s.lineStyle)}' is not a valid line style`);\n }\n if (s.extendLeft !== undefined && typeof s.extendLeft !== \"boolean\") {\n return bad(`${path}.extendLeft: must be a boolean`);\n }\n if (s.extendRight !== undefined && typeof s.extendRight !== \"boolean\") {\n return bad(`${path}.extendRight: must be a boolean`);\n }\n return { ok: true };\n}\n\nfunction validateShapeStyle(s: unknown, path: string): ValidationResult {\n if (!isPlainObject(s)) return bad(`${path}: must be a plain object`);\n if (s.stroke !== undefined && typeof s.stroke !== \"string\") {\n return bad(`${path}.stroke: must be a string`);\n }\n if (s.fill !== undefined && typeof s.fill !== \"string\") {\n return bad(`${path}.fill: must be a string`);\n }\n if (s.lineWidth !== undefined && (!isFiniteNumber(s.lineWidth) || s.lineWidth <= 0)) {\n return bad(`${path}.lineWidth: must be a finite positive number`);\n }\n if (s.lineStyle !== undefined && !VALID_LINE_STYLES.has(String(s.lineStyle))) {\n return bad(`${path}.lineStyle: '${String(s.lineStyle)}' is not a valid line style`);\n }\n if (\n s.fillAlpha !== undefined &&\n (!isFiniteNumber(s.fillAlpha) || s.fillAlpha < 0 || s.fillAlpha > 1)\n ) {\n return bad(`${path}.fillAlpha: must be a finite number in [0, 1]`);\n }\n return { ok: true };\n}\n\nfunction validateDrawingMeta(state: Record<string, unknown>): ValidationResult {\n if (state.name !== undefined && typeof state.name !== \"string\") {\n return bad(\"drawing.state.name: must be a string\");\n }\n if (state.visible !== undefined && typeof state.visible !== \"boolean\") {\n return bad(\"drawing.state.visible: must be a boolean\");\n }\n return { ok: true };\n}\n\nfunction validateLineState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateHorizontalLineState(state: Record<string, unknown>): ValidationResult {\n if (!isFiniteNumber(state.price)) return bad(\"drawing.state.price: must be a finite number\");\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateHorizontalRayState(state: Record<string, unknown>): ValidationResult {\n if (!isWorldPoint(state.anchor)) return bad(\"drawing.state.anchor: not a WorldPoint\");\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateVerticalLineState(state: Record<string, unknown>): ValidationResult {\n if (!isFiniteNumber(state.time)) return bad(\"drawing.state.time: must be a finite number\");\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateCrossLineState(state: Record<string, unknown>): ValidationResult {\n if (!isWorldPoint(state.anchor)) return bad(\"drawing.state.anchor: not a WorldPoint\");\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateTrendAngleState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateRectangleState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateShapeStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateRotatedRectangleState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorQuad(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateShapeStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateTriangleState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorTriple(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateShapeStyle(state.style, \"drawing.state.style\");\n}\n\nconst POLYLINE_MIN_ANCHORS = 3;\nconst POLYLINE_MAX_ANCHORS = 20;\n\nfunction validatePolylineState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorVariable(\n state.anchors,\n \"drawing.state.anchors\",\n POLYLINE_MIN_ANCHORS,\n POLYLINE_MAX_ANCHORS,\n );\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateCircleState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateShapeStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateEllipseState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateShapeStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validatePathOpts(s: unknown, path: string): ValidationResult {\n const lineCheck = validateLineDrawStyle(s, path);\n if (!lineCheck.ok) return lineCheck;\n // validateLineDrawStyle proved `s` is a plain object.\n const obj = s as Record<string, unknown>;\n if (obj.closed !== undefined && typeof obj.closed !== \"boolean\") {\n return bad(`${path}.closed: must be a boolean`);\n }\n return { ok: true };\n}\n\nconst PATH_MIN_ANCHORS = 2;\nconst PATH_MAX_ANCHORS = 20;\n\nfunction validatePathState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorVariable(\n state.anchors,\n \"drawing.state.anchors\",\n PATH_MIN_ANCHORS,\n PATH_MAX_ANCHORS,\n );\n if (!anchorsCheck.ok) return anchorsCheck;\n return validatePathOpts(state.style, \"drawing.state.style\");\n}\n\nconst VALID_TEXT_SIZES: ReadonlySet<string> = new Set([\"tiny\", \"small\", \"normal\", \"large\", \"huge\"]);\n\nconst VALID_TEXT_HALIGN: ReadonlySet<string> = new Set([\"left\", \"center\", \"right\"]);\n\nconst VALID_TEXT_VALIGN: ReadonlySet<string> = new Set([\"top\", \"middle\", \"bottom\"]);\n\nconst VALID_TABLE_POSITIONS: ReadonlySet<string> = new Set([\n \"top-left\",\n \"top-center\",\n \"top-right\",\n \"middle-left\",\n \"middle-center\",\n \"middle-right\",\n \"bottom-left\",\n \"bottom-center\",\n \"bottom-right\",\n]);\n\nfunction validateTextOpts(s: unknown, path: string): ValidationResult {\n if (!isPlainObject(s)) return bad(`${path}: must be a plain object`);\n if (s.color !== undefined && typeof s.color !== \"string\") {\n return bad(`${path}.color: must be a string`);\n }\n if (s.size !== undefined && !VALID_TEXT_SIZES.has(String(s.size))) {\n return bad(`${path}.size: '${String(s.size)}' is not a valid text size`);\n }\n if (s.halign !== undefined && !VALID_TEXT_HALIGN.has(String(s.halign))) {\n return bad(`${path}.halign: '${String(s.halign)}' is not a valid halign`);\n }\n if (s.valign !== undefined && !VALID_TEXT_VALIGN.has(String(s.valign))) {\n return bad(`${path}.valign: '${String(s.valign)}' is not a valid valign`);\n }\n if (s.bgColor !== undefined && typeof s.bgColor !== \"string\") {\n return bad(`${path}.bgColor: must be a string`);\n }\n return { ok: true };\n}\n\nfunction validateMarkerState(state: Record<string, unknown>): ValidationResult {\n if (!isWorldPoint(state.anchor)) return bad(\"drawing.state.anchor: not a WorldPoint\");\n if (state.text !== undefined && typeof state.text !== \"string\") {\n return bad(\"drawing.state.text: must be a string\");\n }\n if (state.value !== undefined && !isFiniteNumber(state.value)) {\n return bad(\"drawing.state.value: must be a finite number\");\n }\n return validateTextOpts(state.style, \"drawing.state.style\");\n}\n\nconst FREEHAND_MIN_ANCHORS = 2;\nconst FREEHAND_MAX_ANCHORS = 500;\n\nfunction validateHighlighterStyle(s: unknown, path: string): ValidationResult {\n if (!isPlainObject(s)) return bad(`${path}: must be a plain object`);\n if (typeof s.color !== \"string\") return bad(`${path}.color: must be a string`);\n if (!isFiniteNumber(s.alpha) || s.alpha < 0 || s.alpha > 1) {\n return bad(`${path}.alpha: must be a finite number in [0, 1]`);\n }\n return { ok: true };\n}\n\nfunction validateBrushStyle(s: unknown, path: string): ValidationResult {\n if (!isPlainObject(s)) return bad(`${path}: must be a plain object`);\n if (typeof s.stroke !== \"string\") return bad(`${path}.stroke: must be a string`);\n if (typeof s.fill !== \"string\") return bad(`${path}.fill: must be a string`);\n return { ok: true };\n}\n\nfunction validateArcState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorTriple(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateCurveState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorTriple(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateDoubleCurveState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorQuint(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validatePenState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorVariable(\n state.anchors,\n \"drawing.state.anchors\",\n FREEHAND_MIN_ANCHORS,\n FREEHAND_MAX_ANCHORS,\n );\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateHighlighterState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorVariable(\n state.anchors,\n \"drawing.state.anchors\",\n FREEHAND_MIN_ANCHORS,\n FREEHAND_MAX_ANCHORS,\n );\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateHighlighterStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateBrushState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorVariable(\n state.anchors,\n \"drawing.state.anchors\",\n FREEHAND_MIN_ANCHORS,\n FREEHAND_MAX_ANCHORS,\n );\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateBrushStyle(state.style, \"drawing.state.style\");\n}\n\nconst TEXT_BODY_MAX_LENGTH = 256;\n\nfunction validateArrowOpts(s: unknown, path: string): ValidationResult {\n const lineCheck = validateLineDrawStyle(s, path);\n if (!lineCheck.ok) return lineCheck;\n // validateLineDrawStyle proved `s` is a plain object.\n const obj = s as Record<string, unknown>;\n if (obj.label !== undefined && typeof obj.label !== \"string\") {\n return bad(`${path}.label: must be a string`);\n }\n return { ok: true };\n}\n\nfunction validateArrowMarkerOpts(s: unknown, path: string): ValidationResult {\n if (!isPlainObject(s)) return bad(`${path}: must be a plain object`);\n if (s.color !== undefined && typeof s.color !== \"string\") {\n return bad(`${path}.color: must be a string`);\n }\n if (s.text !== undefined && typeof s.text !== \"string\") {\n return bad(`${path}.text: must be a string`);\n }\n return { ok: true };\n}\n\nfunction validateTextState(state: Record<string, unknown>): ValidationResult {\n if (!isWorldPoint(state.anchor)) return bad(\"drawing.state.anchor: not a WorldPoint\");\n // walkMeta catches non-JsonValue payloads (bigint / function / symbol /\n // undefined / non-finite number) anywhere on `body`; a bare string is\n // a valid JsonValue and passes through. The kind-specific\n // non-empty / length cap follows so the wire-shape error message stays\n // specific.\n const bodyMetaCheck = walkMeta(state.body, \"drawing.state.body\");\n if (!bodyMetaCheck.ok) return bodyMetaCheck;\n if (typeof state.body !== \"string\") {\n return bad(\"drawing.state.body: must be a string\");\n }\n if (state.body.length === 0) {\n return bad(\"drawing.state.body: must be a non-empty string\");\n }\n if (state.body.length > TEXT_BODY_MAX_LENGTH) {\n return bad(`drawing.state.body: must be at most ${TEXT_BODY_MAX_LENGTH} characters`);\n }\n return validateTextOpts(state.style, \"drawing.state.style\");\n}\n\nfunction validateArrowState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateArrowOpts(state.style, \"drawing.state.style\");\n}\n\nfunction validateArrowMarkerState(state: Record<string, unknown>): ValidationResult {\n if (!isWorldPoint(state.anchor)) return bad(\"drawing.state.anchor: not a WorldPoint\");\n return validateArrowMarkerOpts(state.style, \"drawing.state.style\");\n}\n\nfunction validateArrowMarkUpState(state: Record<string, unknown>): ValidationResult {\n if (!isWorldPoint(state.anchor)) return bad(\"drawing.state.anchor: not a WorldPoint\");\n return validateArrowMarkerOpts(state.style, \"drawing.state.style\");\n}\n\nfunction validateArrowMarkDownState(state: Record<string, unknown>): ValidationResult {\n if (!isWorldPoint(state.anchor)) return bad(\"drawing.state.anchor: not a WorldPoint\");\n return validateArrowMarkerOpts(state.style, \"drawing.state.style\");\n}\n\nconst VALID_REGRESSION_SOURCES: ReadonlySet<string> = new Set([\n \"close\",\n \"open\",\n \"high\",\n \"low\",\n \"hl2\",\n \"hlc3\",\n \"ohlc4\",\n \"hlcc4\",\n]);\n\nfunction validateRegressionTrendOpts(s: unknown, path: string): ValidationResult {\n if (!isPlainObject(s)) return bad(`${path}: must be a plain object`);\n if (s.source !== undefined && !VALID_REGRESSION_SOURCES.has(String(s.source))) {\n return bad(`${path}.source: '${String(s.source)}' is not a valid source`);\n }\n if (s.stdevMultiplier !== undefined) {\n if (!isFiniteNumber(s.stdevMultiplier) || s.stdevMultiplier < 0) {\n return bad(`${path}.stdevMultiplier: must be a non-negative finite number`);\n }\n }\n if (s.showUpperBand !== undefined && typeof s.showUpperBand !== \"boolean\") {\n return bad(`${path}.showUpperBand: must be a boolean`);\n }\n if (s.showLowerBand !== undefined && typeof s.showLowerBand !== \"boolean\") {\n return bad(`${path}.showLowerBand: must be a boolean`);\n }\n if (s.color !== undefined && typeof s.color !== \"string\") {\n return bad(`${path}.color: must be a string`);\n }\n return { ok: true };\n}\n\nfunction validateTrendChannelState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorTriple(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateFlatTopBottomState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorTriple(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateDisjointChannelState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorQuad(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateRegressionTrendState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n const anchors = state.anchors as ReadonlyArray<{ time: number; price: number }>;\n if (!(anchors[0].time < anchors[1].time)) {\n return bad(\"drawing.state.anchors: anchors[0].time must be < anchors[1].time\");\n }\n return validateRegressionTrendOpts(state.style, \"drawing.state.style\");\n}\n\nfunction validateFibOpts(s: unknown, path: string): ValidationResult {\n if (!isPlainObject(s)) return bad(`${path}: must be a plain object`);\n if (s.levels !== undefined) {\n if (!Array.isArray(s.levels)) {\n return bad(`${path}.levels: must be an array of finite numbers`);\n }\n if (s.levels.length === 0) {\n return bad(`${path}.levels: must contain at least one level`);\n }\n for (let i = 0; i < s.levels.length; i++) {\n if (!isFiniteNumber(s.levels[i])) {\n return bad(`${path}.levels[${i}]: must be a finite number`);\n }\n }\n }\n if (s.showLabels !== undefined && typeof s.showLabels !== \"boolean\") {\n return bad(`${path}.showLabels: must be a boolean`);\n }\n if (s.color !== undefined && typeof s.color !== \"string\") {\n return bad(`${path}.color: must be a string`);\n }\n if (s.extendLeft !== undefined && typeof s.extendLeft !== \"boolean\") {\n return bad(`${path}.extendLeft: must be a boolean`);\n }\n if (s.extendRight !== undefined && typeof s.extendRight !== \"boolean\") {\n return bad(`${path}.extendRight: must be a boolean`);\n }\n return { ok: true };\n}\n\nfunction validateFibRetracementState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateFibOpts(state.style, \"drawing.state.style\");\n}\n\nfunction validateFibTrendExtensionState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorTriple(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateFibOpts(state.style, \"drawing.state.style\");\n}\n\nfunction validateFibChannelState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorTriple(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateFibOpts(state.style, \"drawing.state.style\");\n}\n\nfunction validateFibTimeZoneState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateFibOpts(state.style, \"drawing.state.style\");\n}\n\nfunction validateFibWedgeState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorTriple(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateFibOpts(state.style, \"drawing.state.style\");\n}\n\nfunction validateFibSpeedFanState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateFibOpts(state.style, \"drawing.state.style\");\n}\n\nfunction validateFibSpeedArcsState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateFibOpts(state.style, \"drawing.state.style\");\n}\n\nfunction validateFibSpiralState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateFibOpts(state.style, \"drawing.state.style\");\n}\n\nfunction validateFibCirclesState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateFibOpts(state.style, \"drawing.state.style\");\n}\n\nfunction validateFibTrendTimeState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorTriple(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateFibOpts(state.style, \"drawing.state.style\");\n}\n\nfunction validateGannBoxState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateGannSquareFixedState(state: Record<string, unknown>): ValidationResult {\n if (!isWorldPoint(state.anchor)) return bad(\"drawing.state.anchor: not a WorldPoint\");\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateGannSquareState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateGannFanState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nconst PITCHFORK_VARIANTS: ReadonlySet<string> = new Set([\n \"standard\",\n \"schiff\",\n \"modifiedSchiff\",\n \"inside\",\n]);\n\nfunction validatePitchforkState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorTriple(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n if (typeof state.variant !== \"string\" || !PITCHFORK_VARIANTS.has(state.variant)) {\n return bad(\n `drawing.state.variant: '${String(state.variant)}' must be 'standard' | 'schiff' | 'modifiedSchiff' | 'inside'`,\n );\n }\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validatePitchfanState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorTriple(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateXabcdPatternState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorQuint(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateCypherPatternState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorQuint(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateHeadAndShouldersState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorQuint(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateAbcdPatternState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorQuad(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateTrianglePatternState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorTriple(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateThreeDrivesPatternState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorHept(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateElliottImpulseWaveState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorQuint(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n const labelsCheck = validateOptionalLabels(state.labels, \"drawing.state.labels\", 5);\n if (!labelsCheck.ok) return labelsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateElliottCorrectionWaveState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorTriple(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n const labelsCheck = validateOptionalLabels(state.labels, \"drawing.state.labels\", 3);\n if (!labelsCheck.ok) return labelsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateElliottTriangleWaveState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorQuint(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n const labelsCheck = validateOptionalLabels(state.labels, \"drawing.state.labels\", 5);\n if (!labelsCheck.ok) return labelsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateElliottDoubleComboState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorHept(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n const labelsCheck = validateOptionalLabels(state.labels, \"drawing.state.labels\", 7);\n if (!labelsCheck.ok) return labelsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateElliottTripleComboState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorHept(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n const labelsCheck = validateOptionalLabels(state.labels, \"drawing.state.labels\", 7);\n if (!labelsCheck.ok) return labelsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateCyclicLinesState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateTimeCyclesState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nfunction validateSineLineState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n return validateLineDrawStyle(state.style, \"drawing.state.style\");\n}\n\nconst MAX_CHILD_HANDLE_IDS = 100;\n\nfunction validateChildHandleIds(v: unknown, path: string): ValidationResult {\n if (!Array.isArray(v)) {\n return bad(`${path}: must be an array of handle id strings`);\n }\n if (v.length > MAX_CHILD_HANDLE_IDS) {\n return bad(`${path}: must be at most ${MAX_CHILD_HANDLE_IDS} entries`);\n }\n for (let i = 0; i < v.length; i++) {\n if (typeof v[i] !== \"string\") {\n return bad(`${path}[${i}]: must be a string`);\n }\n }\n return { ok: true };\n}\n\nfunction validateFrameOpts(s: unknown, path: string): ValidationResult {\n if (!isPlainObject(s)) return bad(`${path}: must be a plain object`);\n if (s.label !== undefined && typeof s.label !== \"string\") {\n return bad(`${path}.label: must be a string`);\n }\n if (s.bgColor !== undefined && typeof s.bgColor !== \"string\") {\n return bad(`${path}.bgColor: must be a string`);\n }\n return { ok: true };\n}\n\nfunction validateGroupState(state: Record<string, unknown>): ValidationResult {\n return validateChildHandleIds(state.childHandleIds, \"drawing.state.childHandleIds\");\n}\n\nfunction validateFrameState(state: Record<string, unknown>): ValidationResult {\n const anchorsCheck = validateAnchorPair(state.anchors, \"drawing.state.anchors\");\n if (!anchorsCheck.ok) return anchorsCheck;\n const childCheck = validateChildHandleIds(state.childHandleIds, \"drawing.state.childHandleIds\");\n if (!childCheck.ok) return childCheck;\n return validateFrameOpts(state.style, \"drawing.state.style\");\n}\n\nfunction validateTableCell(cell: unknown, path: string): ValidationResult {\n if (!isPlainObject(cell)) return bad(`${path}: must be a plain object`);\n if (typeof cell.text !== \"string\") return bad(`${path}.text: must be a string`);\n if (cell.bgColor !== undefined && typeof cell.bgColor !== \"string\") {\n return bad(`${path}.bgColor: must be a string`);\n }\n if (cell.textColor !== undefined && typeof cell.textColor !== \"string\") {\n return bad(`${path}.textColor: must be a string`);\n }\n if (cell.textHalign !== undefined && !VALID_TEXT_HALIGN.has(String(cell.textHalign))) {\n return bad(`${path}.textHalign: '${String(cell.textHalign)}' is not a valid halign`);\n }\n if (cell.textValign !== undefined && !VALID_TEXT_VALIGN.has(String(cell.textValign))) {\n return bad(`${path}.textValign: '${String(cell.textValign)}' is not a valid valign`);\n }\n if (cell.textSize !== undefined && !VALID_TEXT_SIZES.has(String(cell.textSize))) {\n return bad(`${path}.textSize: '${String(cell.textSize)}' is not a valid text size`);\n }\n return { ok: true };\n}\n\nfunction validateTableState(state: Record<string, unknown>): ValidationResult {\n const position = state.position;\n if (typeof position !== \"string\" || !VALID_TABLE_POSITIONS.has(position)) {\n return bad(`drawing.state.position: '${String(position)}' is not a valid table position`);\n }\n const cells = state.cells;\n if (!Array.isArray(cells) || cells.length === 0) {\n return bad(\"drawing.state.cells: must be a non-empty 2D array\");\n }\n for (let rowIndex = 0; rowIndex < cells.length; rowIndex++) {\n const row = cells[rowIndex];\n if (!Array.isArray(row) || row.length === 0) {\n return bad(`drawing.state.cells[${rowIndex}]: must be a non-empty array`);\n }\n for (let columnIndex = 0; columnIndex < row.length; columnIndex++) {\n const cellCheck = validateTableCell(\n row[columnIndex],\n `drawing.state.cells[${rowIndex}][${columnIndex}]`,\n );\n if (!cellCheck.ok) return cellCheck;\n }\n }\n const hasBorderColor = state.borderColor !== undefined;\n const hasBorderWidth = state.borderWidth !== undefined;\n if (hasBorderColor !== hasBorderWidth) {\n return bad(\"drawing.state.borderColor/borderWidth: must be provided together\");\n }\n if (hasBorderColor) {\n const colorCheck = validateColor(state.borderColor, \"drawing.state.borderColor\");\n if (!colorCheck.ok) return colorCheck;\n if (!isFiniteNumber(state.borderWidth) || state.borderWidth <= 0) {\n return bad(\"drawing.state.borderWidth: must be a finite positive number\");\n }\n }\n if (state.frame !== undefined) {\n if (!isPlainObject(state.frame)) return bad(\"drawing.state.frame: must be a plain object\");\n const colorCheck = validateColor(state.frame.color, \"drawing.state.frame.color\");\n if (!colorCheck.ok) return colorCheck;\n if (!isFiniteNumber(state.frame.width) || state.frame.width <= 0) {\n return bad(\"drawing.state.frame.width: must be a finite positive number\");\n }\n }\n return { ok: true };\n}\n\n/**\n * Per-kind state dispatch. Exhaustive over the `DrawingKind` union: the\n * switch has no `default` arm, so adding a kind to `DrawingKind`\n * produces a compile error here and forces a matching validator arm.\n * Wire-shape checks (`handleId` / `op` / `bar` / `time` /\n * `state.kind === drawingKind`) run for every kind via\n * {@link validateDrawingEmission} before this dispatch is reached.\n */\nfunction validateStateByKind(kind: DrawingKind, state: Record<string, unknown>): ValidationResult {\n switch (kind) {\n case \"line\":\n return validateLineState(state);\n case \"horizontal-line\":\n return validateHorizontalLineState(state);\n case \"horizontal-ray\":\n return validateHorizontalRayState(state);\n case \"vertical-line\":\n return validateVerticalLineState(state);\n case \"cross-line\":\n return validateCrossLineState(state);\n case \"trend-angle\":\n return validateTrendAngleState(state);\n case \"rectangle\":\n return validateRectangleState(state);\n case \"rotated-rectangle\":\n return validateRotatedRectangleState(state);\n case \"triangle\":\n return validateTriangleState(state);\n case \"polyline\":\n return validatePolylineState(state);\n case \"circle\":\n return validateCircleState(state);\n case \"ellipse\":\n return validateEllipseState(state);\n case \"path\":\n return validatePathState(state);\n case \"marker\":\n return validateMarkerState(state);\n case \"arc\":\n return validateArcState(state);\n case \"curve\":\n return validateCurveState(state);\n case \"double-curve\":\n return validateDoubleCurveState(state);\n case \"pen\":\n return validatePenState(state);\n case \"highlighter\":\n return validateHighlighterState(state);\n case \"brush\":\n return validateBrushState(state);\n case \"text\":\n return validateTextState(state);\n case \"arrow\":\n return validateArrowState(state);\n case \"arrow-marker\":\n return validateArrowMarkerState(state);\n case \"arrow-mark-up\":\n return validateArrowMarkUpState(state);\n case \"arrow-mark-down\":\n return validateArrowMarkDownState(state);\n case \"trend-channel\":\n return validateTrendChannelState(state);\n case \"flat-top-bottom\":\n return validateFlatTopBottomState(state);\n case \"disjoint-channel\":\n return validateDisjointChannelState(state);\n case \"regression-trend\":\n return validateRegressionTrendState(state);\n case \"fib-retracement\":\n return validateFibRetracementState(state);\n case \"fib-trend-extension\":\n return validateFibTrendExtensionState(state);\n case \"fib-channel\":\n return validateFibChannelState(state);\n case \"fib-time-zone\":\n return validateFibTimeZoneState(state);\n case \"fib-wedge\":\n return validateFibWedgeState(state);\n case \"fib-speed-fan\":\n return validateFibSpeedFanState(state);\n case \"fib-speed-arcs\":\n return validateFibSpeedArcsState(state);\n case \"fib-spiral\":\n return validateFibSpiralState(state);\n case \"fib-circles\":\n return validateFibCirclesState(state);\n case \"fib-trend-time\":\n return validateFibTrendTimeState(state);\n case \"gann-box\":\n return validateGannBoxState(state);\n case \"gann-square-fixed\":\n return validateGannSquareFixedState(state);\n case \"gann-square\":\n return validateGannSquareState(state);\n case \"gann-fan\":\n return validateGannFanState(state);\n case \"pitchfork\":\n return validatePitchforkState(state);\n case \"pitchfan\":\n return validatePitchfanState(state);\n case \"xabcd-pattern\":\n return validateXabcdPatternState(state);\n case \"cypher-pattern\":\n return validateCypherPatternState(state);\n case \"head-and-shoulders\":\n return validateHeadAndShouldersState(state);\n case \"abcd-pattern\":\n return validateAbcdPatternState(state);\n case \"triangle-pattern\":\n return validateTrianglePatternState(state);\n case \"three-drives-pattern\":\n return validateThreeDrivesPatternState(state);\n case \"elliott-impulse-wave\":\n return validateElliottImpulseWaveState(state);\n case \"elliott-correction-wave\":\n return validateElliottCorrectionWaveState(state);\n case \"elliott-triangle-wave\":\n return validateElliottTriangleWaveState(state);\n case \"elliott-double-combo\":\n return validateElliottDoubleComboState(state);\n case \"elliott-triple-combo\":\n return validateElliottTripleComboState(state);\n case \"cyclic-lines\":\n return validateCyclicLinesState(state);\n case \"time-cycles\":\n return validateTimeCyclesState(state);\n case \"sine-line\":\n return validateSineLineState(state);\n case \"group\":\n return validateGroupState(state);\n case \"frame\":\n return validateFrameState(state);\n case \"table\":\n return validateTableState(state);\n }\n}\n\nfunction validateDrawingEmission(e: Record<string, unknown>): ValidationResult {\n if (!isNonEmptyString(e.handleId)) {\n return bad(\"drawing.handleId: must be a non-empty string\");\n }\n const drawingKind = e.drawingKind;\n if (typeof drawingKind !== \"string\" || !VALID_DRAWING_KINDS.has(drawingKind)) {\n return {\n ok: false,\n code: \"unsupported-drawing-kind\",\n message: `drawing.drawingKind: '${String(drawingKind)}' is not a known DrawingKind`,\n };\n }\n if (typeof e.op !== \"string\" || !VALID_DRAWING_OPS.has(e.op)) {\n return bad(`drawing.op: '${String(e.op)}' must be 'create' | 'update' | 'remove'`);\n }\n if (!isNonNegativeInteger(e.bar)) {\n return bad(\"drawing.bar: must be a non-negative integer\");\n }\n if (!isFiniteNumber(e.time)) {\n return bad(\"drawing.time: must be a finite number\");\n }\n const state = e.state;\n if (!isPlainObject(state)) {\n return bad(\"drawing.state: must be a plain object\");\n }\n if (state.kind !== drawingKind) {\n return bad(\n `drawing.state.kind: '${String(state.kind)}' must equal drawing.drawingKind '${drawingKind}'`,\n );\n }\n const metaCheck = validateDrawingMeta(state);\n if (!metaCheck.ok) return metaCheck;\n return validateStateByKind(drawingKind as DrawingKind, state);\n}\n\nfunction validateDiagnostic(e: Record<string, unknown>): ValidationResult {\n const severity = e.severity;\n if (typeof severity !== \"string\" || !VALID_DIAGNOSTIC_SEVERITIES.has(severity)) {\n return bad(`diagnostic.severity: '${String(severity)}' is not a valid severity`);\n }\n const code = e.code;\n if (typeof code !== \"string\" || !VALID_DIAGNOSTIC_CODES.has(code)) {\n return bad(`diagnostic.code: '${String(code)}' is not a known DiagnosticCode`);\n }\n if (typeof e.message !== \"string\") return bad(\"diagnostic.message: must be a string\");\n const slotId = e.slotId;\n if (slotId !== null && typeof slotId !== \"string\") {\n return bad(\"diagnostic.slotId: must be a string or null\");\n }\n const bar = e.bar;\n if (bar !== null && !isNonNegativeInteger(bar)) {\n return bad(\"diagnostic.bar: must be a non-negative integer or null\");\n }\n return { ok: true };\n}\n\n/**\n * Hand-rolled validator covering every Phase-1 / Phase-2 / Phase-3\n * emission shape. Returns `{ ok: true }` for well-formed payloads and\n * `{ ok: false, code, message }` otherwise. Hosts and adapters call\n * this at every structured-clone boundary (Worker `postMessage`,\n * QuickJS membrane) per PLAN \u00A77.3.\n *\n * Phase 3 widens the drawing dispatch from an unconditional Phase-1\n * stub to a per-kind validator: unknown `drawingKind` returns\n * `unsupported-drawing-kind`; malformed payloads of a known kind\n * return `malformed-emission`. Tasks 6\u201318 each ADD their kind\n * validators to the dispatch as ports land.\n *\n * @since 0.1\n * @stable\n * @example\n * import { validateEmission } from \"@invinite-org/chartlang-adapter-kit\";\n *\n * const r = validateEmission({ kind: \"plot\" });\n * if (!r.ok) {\n * console.error(r.code, r.message);\n * }\n */\nexport function validateEmission(e: unknown): ValidationResult {\n if (!isPlainObject(e)) {\n return bad(\"emission: not a plain object\");\n }\n if (!(\"kind\" in e)) {\n return bad(\"emission: missing 'kind' discriminant\");\n }\n const kind = e.kind;\n switch (kind) {\n case \"plot\":\n return validatePlotEmission(e);\n case \"alert\":\n return validateAlertEmission(e);\n case \"alert-condition\":\n return validateAlertConditionEmission(e);\n case \"log\":\n return validateLogEmission(e);\n case \"drawing\":\n return validateDrawingEmission(e);\n case \"diagnostic\":\n return validateDiagnostic(e);\n default:\n return bad(`emission.kind: '${String(kind)}' is not a known emission kind`);\n }\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport {\n type AlertEmission,\n type AlertConditionEmission,\n type LogEmission,\n type PlotEmission,\n type RuntimeDiagnostic,\n validateEmission,\n} from \"@invinite-org/chartlang-adapter-kit\";\n\nimport type { MutableRunnerEmissions } from \"../runtimeContext.js\";\n\n/**\n * Push a `PlotEmission` onto the runner's mutable plot queue. The\n * payload is first validated through Task 4's `validateEmission`; on\n * failure a `malformed-emission` diagnostic is pushed and the plot is\n * dropped. On success, the queue is searched backwards for a\n * `(slotId, bar)` match \u2014 if found, the existing entry is replaced\n * in place (last-write-wins per PLAN \u00A77.4). Otherwise the new emission\n * is appended.\n *\n * @since 0.1\n * @example\n * // import { pushPlot } from \"@invinite-org/chartlang-runtime/emit\";\n * // pushPlot(queue, plotEmission);\n */\nexport function pushPlot(queue: MutableRunnerEmissions, e: PlotEmission): void {\n const result = validateEmission(e);\n if (!result.ok) {\n pushDiagnostic(queue, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"malformed-emission\",\n message: result.message,\n slotId: e.slotId,\n bar: e.bar,\n });\n return;\n }\n for (let i = queue.plots.length - 1; i >= 0; i -= 1) {\n const existing = queue.plots[i];\n if (existing.slotId === e.slotId && existing.bar === e.bar) {\n queue.plots[i] = e;\n return;\n }\n }\n queue.plots.push(e);\n}\n\n/**\n * Push an `AlertEmission` onto the runner's mutable alert queue. Same\n * validate-then-dedup contract as {@link pushPlot}: a `(slotId, bar)`\n * collision replaces the existing entry; a validation failure pushes\n * a `malformed-emission` diagnostic and drops the alert.\n *\n * @since 0.1\n * @example\n * // import { pushAlert } from \"@invinite-org/chartlang-runtime/emit\";\n * // pushAlert(queue, alertEmission);\n */\nexport function pushAlert(queue: MutableRunnerEmissions, e: AlertEmission): void {\n const result = validateEmission(e);\n if (!result.ok) {\n pushDiagnostic(queue, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"malformed-emission\",\n message: result.message,\n slotId: e.slotId,\n bar: e.bar,\n });\n return;\n }\n for (let i = queue.alerts.length - 1; i >= 0; i -= 1) {\n const existing = queue.alerts[i];\n if (existing.slotId === e.slotId && existing.bar === e.bar) {\n queue.alerts[i] = e;\n return;\n }\n }\n queue.alerts.push(e);\n}\n\n/**\n * Push an `AlertConditionEmission` onto the runner's mutable queue after\n * adapter-kit validation. Unlike `alert`, alert conditions intentionally\n * preserve both `fired: true` and `fired: false` transitions for UI state.\n *\n * @since 0.5\n * @example\n * // import { pushAlertCondition } from \"@invinite-org/chartlang-runtime/emit\";\n * // pushAlertCondition(queue, emission);\n */\nexport function pushAlertCondition(queue: MutableRunnerEmissions, e: AlertConditionEmission): void {\n const result = validateEmission(e);\n if (!result.ok) {\n pushDiagnostic(queue, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"malformed-emission\",\n message: result.message,\n slotId: null,\n bar: e.bar,\n });\n return;\n }\n const target = queue.alertConditions ?? [];\n queue.alertConditions = target;\n target.push(e);\n}\n\n/**\n * Push a `LogEmission` onto the runner's mutable queue after adapter-kit\n * validation. Logs preserve order and are not deduped.\n *\n * @since 0.5\n * @example\n * // import { pushLog } from \"@invinite-org/chartlang-runtime/emit\";\n * // pushLog(queue, emission);\n */\nexport function pushLog(queue: MutableRunnerEmissions, e: LogEmission): void {\n const result = validateEmission(e);\n if (!result.ok) {\n pushDiagnostic(queue, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"malformed-emission\",\n message: result.message,\n slotId: null,\n bar: e.bar,\n });\n return;\n }\n queue.logs.push(e);\n}\n\n/**\n * Append a `RuntimeDiagnostic` to the runner's diagnostic queue. No\n * validation \u2014 diagnostics are the failure sink, so recursively\n * validating them would loop. Every other emission path routes\n * through here when something goes wrong.\n *\n * @since 0.1\n * @example\n * // import { pushDiagnostic } from \"@invinite-org/chartlang-runtime/emit\";\n * // pushDiagnostic(queue, { kind: \"diagnostic\", severity: \"warning\",\n * // code: \"unsupported-plot-kind\", message: \"drop\",\n * // slotId: \"x.ts:1:1#0\", bar: 0 });\n */\nexport function pushDiagnostic(queue: MutableRunnerEmissions, d: RuntimeDiagnostic): void {\n queue.diagnostics.push(d);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nconst FNV_OFFSET_BASIS_32 = 0x811c9dc5;\nconst FNV_PRIME_32 = 0x01000193;\n\n/**\n * Stable, deterministic FNV-1a 32-bit hash of a UTF-16 code-unit string.\n * Returns the hash as a lowercase 8-character hex string. Same input\n * yields the same output across machines, runs, and Node versions \u2014 the\n * property `alert.dedupeKey` relies on for cross-host idempotency.\n *\n * @since 0.1\n * @example\n * // import { hashStringStable } from \"@invinite-org/chartlang-runtime/emit\";\n * // hashStringStable(\"hello\"); // \"4f9f2cab\"\n */\nexport function hashStringStable(s: string): string {\n let h = FNV_OFFSET_BASIS_32;\n for (let i = 0; i < s.length; i += 1) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, FNV_PRIME_32);\n }\n return (h >>> 0).toString(16).padStart(8, \"0\");\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { AlertOpts, JsonValue } from \"@invinite-org/chartlang-core\";\nimport type { AlertChannel, AlertEmission } from \"@invinite-org/chartlang-adapter-kit\";\n\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { pushAlert, pushDiagnostic } from \"./emissionsQueue.js\";\nimport { hashStringStable } from \"./hash.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"alert called outside an active script step\";\n\nfunction computeDedupeKey(\n slotId: string,\n bar: number,\n message: string,\n meta: Readonly<Record<string, JsonValue>>,\n): string {\n return `${slotId}::${bar}::${hashStringStable(message + JSON.stringify(meta))}`;\n}\n\nfunction snapshotUnknown(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => snapshotUnknown(item));\n }\n if (typeof value === \"object\" && value !== null) {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, snapshotUnknown(item)]),\n );\n }\n return value;\n}\n\nfunction snapshotMeta(\n meta: Readonly<Record<string, JsonValue>>,\n): Readonly<Record<string, JsonValue>> {\n return snapshotUnknown(meta) as Readonly<Record<string, JsonValue>>;\n}\n\nfunction alertImpl(ctx: RuntimeContext, slotId: string, message: string, opts: AlertOpts): void {\n if (ctx.capabilities.alerts.size === 0) {\n pushDiagnostic(ctx.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"unsupported-alert-channel\",\n message: \"Adapter declares no alert channels; alert dropped.\",\n slotId,\n bar: ctx.barIndex(),\n });\n return;\n }\n\n const channels: AlertChannel[] = Array.from(ctx.capabilities.alerts);\n const bar = ctx.barIndex();\n const meta = snapshotMeta(opts.meta ?? {});\n\n const emission: AlertEmission = {\n kind: \"alert\",\n slotId,\n severity: opts.severity ?? \"info\",\n message,\n bar,\n time: ctx.stream.bar.time,\n meta,\n channels: Object.freeze(channels.slice()),\n dedupeKey: computeDedupeKey(slotId, bar, message, meta),\n };\n\n pushAlert(ctx.emissions, emission);\n}\n\n/**\n * Emit an `AlertEmission` for the current bar (script-facing overload).\n *\n * Same dual-signature contract as {@link plot}: scripts call\n * `alert(message, opts?)`; the compiler injects the slot id as the\n * leading argument (see the sibling `alert(slotId, message, opts?)`\n * overload). Direct invocation without a slot id throws the sentinel\n * error.\n *\n * `dedupeKey` is computed as\n * `${slotId}::${bar}::FNV1a(message + JSON.stringify(meta))` and is\n * stable across machines \u2014 adapters that dispatch via async channels\n * use it for idempotency. `channels` is a snapshot of\n * `capabilities.alerts` at emission time; adapters that gate on\n * specific channels filter downstream.\n *\n * @since 0.1\n * @example\n * import { defineIndicator, alert, ta } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"EMA cross\",\n * apiVersion: 1,\n * compute({ bar }) {\n * const fast = ta.ema(bar.close, 12);\n * const slow = ta.ema(bar.close, 26);\n * if (ta.crossover(fast, slow).current) {\n * alert(\"Fast EMA crossed above slow EMA\", { severity: \"info\" });\n * }\n * },\n * });\n */\nexport function alert(message: string, opts?: AlertOpts): void;\n/**\n * Emit an `AlertEmission` (compiler-injected overload). Task 2's\n * transformer rewrites script-side `alert(msg)` into\n * `alert(slotId, msg)`.\n *\n * @since 0.1\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof alert = alert;\n * // void fn;\n */\nexport function alert(slotId: string, message: string, opts?: AlertOpts): void;\n/**\n * Implementation signature for {@link alert}. Branches on\n * `typeof arg2 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.1\n * @example\n * // const fn: typeof alert = alert;\n * // void fn;\n */\nexport function alert(arg1: string, arg2?: string | AlertOpts, arg3?: AlertOpts): void {\n if (typeof arg2 !== \"string\") {\n // No slot id present \u2014 direct script-author invocation or\n // missing compiler injection. Surface the sentinel.\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (!ctx) throw new Error(OUTSIDE_CTX_MESSAGE);\n alertImpl(ctx, arg1, arg2, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { AlertConditionEmission } from \"@invinite-org/chartlang-adapter-kit\";\n\nimport type { RuntimeContext } from \"../runtimeContext.js\";\nimport { pushAlertCondition, pushDiagnostic } from \"./emissionsQueue.js\";\n\nfunction diagnoseOnce(\n ctx: RuntimeContext,\n code: \"alert-conditions-not-supported\" | \"unknown-alert-condition\",\n conditionId: string,\n message: string,\n): void {\n const key = `${code}|${conditionId}`;\n const diagnosed = ctx.diagnosedAlertConditionKeys;\n if (diagnosed?.has(key)) return;\n diagnosed?.add(key);\n pushDiagnostic(ctx.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code,\n message,\n slotId: null,\n bar: ctx.barIndex(),\n });\n}\n\n/**\n * Emit one alert-condition state transition for the current bar.\n * `fired: false` is emitted deliberately so adapters can render falling\n * edges and \"currently inactive\" state without remembering prior bars.\n *\n * @since 0.5\n * @stable\n * @example\n * // emitAlertCondition(ctx, \"up\", true);\n * const fn: typeof emitAlertCondition = emitAlertCondition;\n * void fn;\n */\nexport function emitAlertCondition(ctx: RuntimeContext, conditionId: string, fired: boolean): void {\n if (!ctx.capabilities.alertConditions) {\n diagnoseOnce(\n ctx,\n \"alert-conditions-not-supported\",\n conditionId,\n \"Adapter does not support alert conditions; signal dropped.\",\n );\n return;\n }\n const condition = ctx.alertConditions?.get(conditionId);\n if (condition === undefined) {\n diagnoseOnce(\n ctx,\n \"unknown-alert-condition\",\n conditionId,\n `Alert condition \"${conditionId}\" is not declared in the script manifest.`,\n );\n return;\n }\n const emission: AlertConditionEmission = {\n kind: \"alert-condition\",\n conditionId,\n title: condition.title,\n description: condition.description,\n defaultMessage: condition.defaultMessage,\n fired,\n bar: ctx.barIndex(),\n time: ctx.stream.bar.time,\n };\n pushAlertCondition(ctx.emissions, emission);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { DrawingEmission } from \"@invinite-org/chartlang-adapter-kit\";\nimport { validateEmission } from \"@invinite-org/chartlang-adapter-kit\";\nimport { bucketFor, type DrawingBucket } from \"@invinite-org/chartlang-core\";\n\nimport type { RuntimeContext } from \"../../runtimeContext.js\";\nimport { pushDiagnostic } from \"../emissionsQueue.js\";\n\nfunction effectiveBudget(ctx: RuntimeContext, bucket: DrawingBucket): number {\n const adapterCap = ctx.capabilities.maxDrawingsPerScript[bucket];\n const scriptCap = ctx.scriptMaxDrawings?.[bucket] ?? Number.POSITIVE_INFINITY;\n return Math.min(adapterCap, scriptCap);\n}\n\n/**\n * Push a {@link DrawingEmission} through the \u00A710/\u00A77.4 enforcement\n * pipeline:\n *\n * 1. **Capability gate** \u2014 drop with `unsupported-drawing-kind` if\n * `ctx.capabilities.drawings` does not include `e.drawingKind`.\n * 2. **Wire-shape validation** \u2014 drop with `malformed-emission`\n * (or `unsupported-drawing-kind` for unknown kinds) if\n * `validateEmission` rejects the payload. Adapter-kit ships\n * per-kind validators (Task 2 + per-port tasks 5\u201318); unknown\n * kinds fail at step 1 before reaching here.\n * 3. **Bucket budget** \u2014 on `op: \"create\"`, drop with\n * `drawing-budget-exceeded` if the bucket counter has reached\n * its effective cap (`min(scriptMaxDrawings, adapter cap)`).\n * On success, increment the counter. On `op: \"remove\"`,\n * decrement (clamped at zero). `op: \"update\"` is free.\n * 4. **Per-bar `(handleId, bar)` dedup** \u2014 replace any prior\n * in-bar emission for the same handle (last-write-wins).\n *\n * On any drop path, the original emission does not reach\n * `ctx.emissions.drawings`; a diagnostic with the appropriate code\n * lands on `ctx.emissions.diagnostics` instead.\n *\n * @since 0.3\n * @stable\n * @example\n * // import { pushDrawing } from \"@invinite-org/chartlang-runtime\";\n * // pushDrawing(ctx, {\n * // kind: \"drawing\",\n * // handleId: \"x.chart.ts:1:1#0\",\n * // drawingKind: \"line\",\n * // op: \"create\",\n * // state: {\n * // kind: \"line\",\n * // anchors: [{ time: 0, price: 0 }, { time: 1, price: 1 }],\n * // style: {},\n * // },\n * // bar: 0,\n * // time: 0,\n * // });\n */\nexport function pushDrawing(ctx: RuntimeContext, e: DrawingEmission): void {\n if (!ctx.capabilities.drawings.has(e.drawingKind)) {\n pushDiagnostic(ctx.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"unsupported-drawing-kind\",\n message: `Adapter cannot render drawing kind \"${e.drawingKind}\".`,\n slotId: e.handleId,\n bar: e.bar,\n });\n return;\n }\n\n const validation = validateEmission(e);\n if (!validation.ok) {\n pushDiagnostic(ctx.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: validation.code,\n message: validation.message,\n slotId: e.handleId,\n bar: e.bar,\n });\n return;\n }\n\n const bucket = bucketFor(e.drawingKind);\n if (e.op === \"create\") {\n const used = ctx.drawingBucketCounters[bucket];\n const cap = effectiveBudget(ctx, bucket);\n if (used >= cap) {\n pushDiagnostic(ctx.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"drawing-budget-exceeded\",\n message: `Bucket '${bucket}' budget (${cap}) exhausted; drawing dropped.`,\n slotId: e.handleId,\n bar: e.bar,\n });\n return;\n }\n ctx.drawingBucketCounters[bucket] = used + 1;\n } else if (e.op === \"remove\") {\n const used = ctx.drawingBucketCounters[bucket];\n ctx.drawingBucketCounters[bucket] = Math.max(0, used - 1);\n }\n\n const drawings = ctx.emissions.drawings;\n for (let i = drawings.length - 1; i >= 0; i -= 1) {\n const existing = drawings[i];\n if (existing.handleId === e.handleId && existing.bar === e.bar) {\n drawings[i] = e;\n return;\n }\n }\n drawings.push(e);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { DrawingHandle, DrawingKind, DrawingState } from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../../runtimeContext.js\";\nimport { pushDrawing } from \"./pushDrawing.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw called outside an active script step\";\n\nfunction mergeState(prev: DrawingState, patch: Partial<DrawingState>): DrawingState {\n // Spread the patch over `prev` and force `kind` back to the\n // previous variant. A cross-variant patch from a script is a type\n // error at the script's callsite \u2014 the runtime defends against it\n // here so the runtime cannot accidentally emit a drift between\n // `drawingKind` and `state.kind`. The cast is safe because every\n // variant of `DrawingState` shares the shape `{ kind, ... }` and\n // discriminants stay pinned to `prev.kind`.\n return { ...prev, ...patch, kind: prev.kind } as DrawingState;\n}\n\nfunction emit(\n ctx: RuntimeContext,\n handleId: string,\n kind: DrawingKind,\n op: \"create\" | \"update\" | \"remove\",\n state: DrawingState,\n): void {\n pushDrawing(ctx, {\n kind: \"drawing\",\n handleId,\n drawingKind: kind,\n op,\n state,\n bar: ctx.barIndex(),\n time: ctx.stream.bar.time,\n });\n}\n\n/**\n * Construct a {@link DrawingHandle} for `slotId#subId` in the active\n * runtime context. Allocates the slot in `ctx.drawingSlots` on the\n * first call (`op: \"create\"`); subsequent calls at the same callsite\n * across bars find the existing slot and emit `op: \"update\"` with the\n * full merged state.\n *\n * `update(patch)` merges the patch with the current slot state and\n * re-emits the FULL merged state under `op: \"update\"` per PLAN.md\n * \u00A710.3. `remove()` emits one final `op: \"remove\"` with the\n * last-known state and flags the slot `removed: true`; subsequent\n * `update` / `remove` calls on the returned handle are no-ops.\n *\n * The handle's `id` is `slotId#subId` \u2014 stable across bars.\n *\n * @since 0.3\n * @stable\n * @example\n * // import {\n * // createDrawingHandle,\n * // } from \"@invinite-org/chartlang-runtime\";\n * // const h = createDrawingHandle(\n * // \"demo.chart.ts:5:13#0\",\n * // 0,\n * // \"line\",\n * // {\n * // kind: \"line\",\n * // anchors: [{ time: 0, price: 0 }, { time: 1, price: 1 }],\n * // style: {},\n * // },\n * // );\n * // h.update({ style: { color: \"#3b82f6\" } });\n * // h.remove();\n */\nexport function createDrawingHandle(\n slotId: string,\n subId: number,\n kind: DrawingKind,\n initialState: DrawingState,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n\n const handleId = `${slotId}#${subId}`;\n const existing = ctx.drawingSlots.get(handleId);\n\n let slot: { handleId: string; kind: DrawingKind; state: DrawingState; removed: boolean };\n let op: \"create\" | \"update\";\n if (existing === undefined) {\n slot = { handleId, kind, state: initialState, removed: false };\n ctx.drawingSlots.set(handleId, slot);\n op = \"create\";\n } else {\n // Cross-bar re-entry. Merge initialState into the existing slot\n // (script-author may pass new anchors / style); resurrect if it\n // was previously removed.\n existing.state = mergeState(existing.state, initialState);\n existing.removed = false;\n slot = existing;\n op = \"update\";\n }\n\n emit(ctx, handleId, kind, op, slot.state);\n\n return {\n id: handleId,\n update(patch: Partial<DrawingState>): void {\n // `ACTIVE_RUNTIME_CONTEXT.current` can be null when the\n // host calls `handle.update(...)` outside a compute step\n // (e.g. from an async callback). Drop silently in that\n // case \u2014 the handle's slot still persists and the next\n // in-step `update` will fire.\n const liveCtx = ACTIVE_RUNTIME_CONTEXT.current;\n if (liveCtx === null) return;\n const s = liveCtx.drawingSlots.get(handleId);\n if (s === undefined || s.removed) return;\n s.state = mergeState(s.state, patch);\n emit(liveCtx, handleId, kind, \"update\", s.state);\n },\n remove(): void {\n const liveCtx = ACTIVE_RUNTIME_CONTEXT.current;\n if (liveCtx === null) return;\n const s = liveCtx.drawingSlots.get(handleId);\n if (s === undefined || s.removed) return;\n // Flag-before-emit is safe: capabilities are invariant\n // mid-run, so a previously-created handle's \"remove\" always\n // reaches `pushDrawing`. The slot stays flagged even if a\n // future drop path swallows the emission \u2014 a removed handle\n // must never re-emit.\n s.removed = true;\n emit(liveCtx, handleId, kind, \"remove\", s.state);\n },\n };\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { RuntimeContext } from \"../../runtimeContext.js\";\n\n/**\n * Return the next sub-id for a given compiler-injected `slotId` within\n * the current bar, then increment the counter. The first call inside a\n * bar yields `0`; the N-th call at the same callsite yields `N-1`.\n *\n * A script's `for (let i = 0; i < N; i++) draw.text(...)` loop produces\n * N stable handles keyed `<slotId>#0` ... `<slotId>#N-1`.\n * {@link resetSubIdCounters} clears every counter at the top of every\n * `onBarClose` / `onBarTick`, so iteration `i` across bars at the same\n * callsite yields the same sub-id \u2014 that's the cross-bar handle\n * stability contract from PLAN.md \u00A710.3.\n *\n * @since 0.3\n * @stable\n * @example\n * // import { nextSubId } from \"@invinite-org/chartlang-runtime\";\n * // const subId = nextSubId(ctx, \"demo.chart.ts:5:13#0\");\n */\nexport function nextSubId(ctx: RuntimeContext, slotId: string): number {\n const counters = ctx.drawingSubIdCounters;\n const current = counters.get(slotId) ?? 0;\n counters.set(slotId, current + 1);\n return current;\n}\n\n/**\n * Clear every sub-id counter on the context. Called by the execution\n * loop at the top of `onBarClose` and `onBarTick` so callsite iteration\n * order is identical across bars \u2014 handles allocated by iteration `i`\n * in bar `N` and bar `N+1` share the same `slotId#i`.\n *\n * @since 0.3\n * @stable\n * @example\n * // import { resetSubIdCounters } from \"@invinite-org/chartlang-runtime\";\n * // resetSubIdCounters(ctx);\n */\nexport function resetSubIdCounters(ctx: RuntimeContext): void {\n ctx.drawingSubIdCounters.clear();\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (ArrowDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/arrow-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n ArrowOpts,\n ArrowState,\n DrawingHandle,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.arrow called outside an active script step\";\n\nfunction arrowImpl(slotId: string, a: WorldPoint, b: WorldPoint, opts: ArrowOpts): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: ArrowState = { kind: \"arrow\", anchors: [a, b], style: opts };\n return createDrawingHandle(slotId, subId, \"arrow\", state);\n}\n\n/**\n * Draw a directional arrow from `a` (tail) to `b` (head) with an\n * optional axis-aligned label centred near the shaft midpoint. The\n * arrowhead at `b` points along the shaft direction. Inherits every\n * {@link import(\"@invinite-org/chartlang-core\").LineDrawStyle} field\n * (color, lineWidth, lineStyle, extendLeft, extendRight) plus the\n * arrow-specific `label?: string`. Mirrors invinite's `arrow-tool.ts`\n * shape.\n *\n * @anchors `a`, `b` \u2014 tail and head `WorldPoint`s\n * @anchorCount 2\n * @bucket labels\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.arrow demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.arrow(\n * { time: bar.time, price: bar.low },\n * { time: bar.time, price: bar.high },\n * { color: \"#dc2626\", lineWidth: 2, label: \"Sell\" },\n * );\n * },\n * });\n */\nexport function arrow(a: WorldPoint, b: WorldPoint, opts?: ArrowOpts): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof arrow = arrow;\n * // void fn;\n */\nexport function arrow(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts?: ArrowOpts,\n): DrawingHandle;\n/**\n * Implementation signature for {@link arrow}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof arrow = arrow;\n * // void fn;\n */\nexport function arrow(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | ArrowOpts,\n arg4?: ArrowOpts,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return arrowImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (ArrowMarkDownDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/arrow-mark-down-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n ArrowMarkDownState,\n ArrowMarkerOpts,\n DrawingHandle,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.arrowMarkDown called outside an active script step\";\n\nfunction arrowMarkDownImpl(\n slotId: string,\n anchor: WorldPoint,\n opts: ArrowMarkerOpts,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: ArrowMarkDownState = { kind: \"arrow-mark-down\", anchor, style: opts };\n return createDrawingHandle(slotId, subId, \"arrow-mark-down\", state);\n}\n\n/**\n * Draw a bearish down-chevron glyph at a single world anchor. The\n * canvas2d renderer paints a filled triangle pointing down; the default\n * fill colour is `\"#ef4444\"` (red) when `style.color` is omitted. Pine\n * equivalent: `plotshape(condition, style=shape.triangledown)`. Mirrors\n * invinite's `arrow-mark-down-tool.ts` shape.\n *\n * @anchors `anchor` \u2014 single `WorldPoint`\n * @anchorCount 1\n * @bucket labels\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.arrowMarkDown demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.arrowMarkDown({ time: bar.time, price: bar.high });\n * },\n * });\n */\nexport function arrowMarkDown(anchor: WorldPoint, opts?: ArrowMarkerOpts): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof arrowMarkDown = arrowMarkDown;\n * // void fn;\n */\nexport function arrowMarkDown(\n slotId: string,\n anchor: WorldPoint,\n opts?: ArrowMarkerOpts,\n): DrawingHandle;\n/**\n * Implementation signature for {@link arrowMarkDown}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof arrowMarkDown = arrowMarkDown;\n * // void fn;\n */\nexport function arrowMarkDown(\n arg1: string | WorldPoint,\n arg2?: WorldPoint | ArrowMarkerOpts,\n arg3?: ArrowMarkerOpts,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return arrowMarkDownImpl(arg1, arg2 as WorldPoint, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (ArrowMarkUpDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/arrow-mark-up-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n ArrowMarkUpState,\n ArrowMarkerOpts,\n DrawingHandle,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.arrowMarkUp called outside an active script step\";\n\nfunction arrowMarkUpImpl(slotId: string, anchor: WorldPoint, opts: ArrowMarkerOpts): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: ArrowMarkUpState = { kind: \"arrow-mark-up\", anchor, style: opts };\n return createDrawingHandle(slotId, subId, \"arrow-mark-up\", state);\n}\n\n/**\n * Draw a bullish up-chevron glyph at a single world anchor. The\n * canvas2d renderer paints a filled triangle pointing up; the default\n * fill colour is `\"#22c55e\"` (green) when `style.color` is omitted.\n * Pine equivalent: `plotshape(condition, style=shape.triangleup)`.\n * Mirrors invinite's `arrow-mark-up-tool.ts` shape.\n *\n * @anchors `anchor` \u2014 single `WorldPoint`\n * @anchorCount 1\n * @bucket labels\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.arrowMarkUp demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.arrowMarkUp({ time: bar.time, price: bar.low });\n * },\n * });\n */\nexport function arrowMarkUp(anchor: WorldPoint, opts?: ArrowMarkerOpts): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof arrowMarkUp = arrowMarkUp;\n * // void fn;\n */\nexport function arrowMarkUp(\n slotId: string,\n anchor: WorldPoint,\n opts?: ArrowMarkerOpts,\n): DrawingHandle;\n/**\n * Implementation signature for {@link arrowMarkUp}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof arrowMarkUp = arrowMarkUp;\n * // void fn;\n */\nexport function arrowMarkUp(\n arg1: string | WorldPoint,\n arg2?: WorldPoint | ArrowMarkerOpts,\n arg3?: ArrowMarkerOpts,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return arrowMarkUpImpl(arg1, arg2 as WorldPoint, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (ArrowMarkerDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/arrow-marker-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n ArrowMarkerOpts,\n ArrowMarkerState,\n DrawingHandle,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.arrowMarker called outside an active script step\";\n\nfunction arrowMarkerImpl(slotId: string, anchor: WorldPoint, opts: ArrowMarkerOpts): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: ArrowMarkerState = { kind: \"arrow-marker\", anchor, style: opts };\n return createDrawingHandle(slotId, subId, \"arrow-marker\", state);\n}\n\n/**\n * Draw a compact arrow-marker glyph at a single world anchor. The\n * canvas2d renderer paints a small filled dot at the anchor, a short\n * stub line, and an arrowhead \u2014 a self-contained \"annotation lives\n * here\" marker. Optional `style.text` paints next to the dot. Default\n * color is `\"#3b82f6\"` (invinite toolbar blue). Mirrors invinite's\n * `arrow-marker-tool.ts` shape.\n *\n * @anchors `anchor` \u2014 single `WorldPoint`\n * @anchorCount 1\n * @bucket labels\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.arrowMarker demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.arrowMarker(\n * { time: bar.time, price: bar.close },\n * { color: \"#10b981\", text: \"Long\" },\n * );\n * },\n * });\n */\nexport function arrowMarker(anchor: WorldPoint, opts?: ArrowMarkerOpts): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof arrowMarker = arrowMarker;\n * // void fn;\n */\nexport function arrowMarker(\n slotId: string,\n anchor: WorldPoint,\n opts?: ArrowMarkerOpts,\n): DrawingHandle;\n/**\n * Implementation signature for {@link arrowMarker}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof arrowMarker = arrowMarker;\n * // void fn;\n */\nexport function arrowMarker(\n arg1: string | WorldPoint,\n arg2?: WorldPoint | ArrowMarkerOpts,\n arg3?: ArrowMarkerOpts,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return arrowMarkerImpl(arg1, arg2 as WorldPoint, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (TextDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/text-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type { DrawingHandle, TextOpts, TextState, WorldPoint } from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.text called outside an active script step\";\n\nfunction textImpl(slotId: string, anchor: WorldPoint, body: string, opts: TextOpts): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: TextState = { kind: \"text\", anchor, body, style: opts };\n return createDrawingHandle(slotId, subId, \"text\", state);\n}\n\n/**\n * Draw a freeform text annotation anchored at a single world point.\n * The `body` string surfaces in the rendered glyph; the validator pins\n * it as a non-empty string of length \u2264 256 (longer than the 128 cap on\n * plot labels \u2014 annotation strings carry short rationales like\n * \"Inverse Head and Shoulders Confirmed\"). Mirrors invinite's\n * `text-tool.ts` shape.\n *\n * @anchors `anchor` \u2014 single `WorldPoint`\n * @anchorCount 1\n * @bucket labels\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.text demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.text(\n * { time: bar.time, price: bar.high },\n * \"Peak\",\n * { color: \"#1e293b\", size: \"normal\" },\n * );\n * },\n * });\n */\nexport function text(anchor: WorldPoint, body: string, opts?: TextOpts): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof text = text;\n * // void fn;\n */\nexport function text(\n slotId: string,\n anchor: WorldPoint,\n body: string,\n opts?: TextOpts,\n): DrawingHandle;\n/**\n * Implementation signature for {@link text}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload. Unique among Task-9 emit fns in that it\n * carries four arguments (slot id + anchor + body + opts).\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof text = text;\n * // void fn;\n */\nexport function text(\n arg1: string | WorldPoint,\n arg2?: WorldPoint | string,\n arg3?: string | TextOpts,\n arg4?: TextOpts,\n): DrawingHandle {\n if (\n typeof arg1 !== \"string\" ||\n arg2 === undefined ||\n typeof arg2 === \"string\" ||\n typeof arg3 !== \"string\"\n ) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return textImpl(arg1, arg2, arg3, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (CircleDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/circle-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n CircleState,\n DrawingHandle,\n ShapeStyle,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.circle called outside an active script step\";\n\nfunction circleImpl(\n slotId: string,\n centre: WorldPoint,\n radiusAnchor: WorldPoint,\n opts: ShapeStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: CircleState = {\n kind: \"circle\",\n anchors: [centre, radiusAnchor],\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"circle\", state);\n}\n\n/**\n * Draw a circle defined by a centre + an edge anchor. The radius is\n * derived in canvas-pixel space at render time from the projected\n * distance between the two anchors (`|edge - centre|`) \u2014 persisting\n * two world points keeps round-trip fidelity across zoom changes\n * (matches invinite's `circle-tool.ts`).\n *\n * @anchors `centre`, `radiusAnchor` \u2014 two `WorldPoint`s\n * @anchorCount 2\n * @bucket boxes\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.circle demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.circle(\n * { time: bar.time, price: bar.close },\n * { time: bar.time, price: bar.high },\n * { stroke: \"#3b82f6\", fill: \"#dbeafe\", fillAlpha: 0.3 },\n * );\n * },\n * });\n */\nexport function circle(\n centre: WorldPoint,\n radiusAnchor: WorldPoint,\n opts?: ShapeStyle,\n): DrawingHandle;\n/**\n * Compiler-injected overload \u2014 the callsite-id transformer rewrites\n * every script-side `draw.circle(centre, radiusAnchor, opts)` into\n * `draw.circle(slotId, centre, radiusAnchor, opts)`.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof circle = circle;\n * // void fn;\n */\nexport function circle(\n slotId: string,\n centre: WorldPoint,\n radiusAnchor: WorldPoint,\n opts?: ShapeStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link circle}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof circle = circle;\n * // void fn;\n */\nexport function circle(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | ShapeStyle,\n arg4?: ShapeStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return circleImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (EllipseDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/ellipse-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n EllipseState,\n ShapeStyle,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.ellipse called outside an active script step\";\n\nfunction ellipseImpl(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts: ShapeStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: EllipseState = { kind: \"ellipse\", anchors: [a, b], style: opts };\n return createDrawingHandle(slotId, subId, \"ellipse\", state);\n}\n\n/**\n * Draw an axis-aligned ellipse inscribed in the bounding box of two\n * world anchors. The renderer derives `(centerX, centerY, radiusX,\n * radiusY)` from the projected bbox and paints a polyline\n * approximation. Rotated ellipses (invinite's `widthOffset` form)\n * are out of scope for Phase 3.\n *\n * @anchors `a`, `b` \u2014 two `WorldPoint`s (opposite bbox corners)\n * @anchorCount 2\n * @bucket boxes\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.ellipse demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.ellipse(\n * { time: bar.time, price: bar.low },\n * { time: bar.time, price: bar.high },\n * { stroke: \"#22c55e\", fill: \"#dcfce7\", fillAlpha: 0.3 },\n * );\n * },\n * });\n */\nexport function ellipse(a: WorldPoint, b: WorldPoint, opts?: ShapeStyle): DrawingHandle;\n/**\n * Compiler-injected overload \u2014 the callsite-id transformer rewrites\n * every script-side `draw.ellipse(a, b, opts)` into\n * `draw.ellipse(slotId, a, b, opts)`.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof ellipse = ellipse;\n * // void fn;\n */\nexport function ellipse(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts?: ShapeStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link ellipse}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof ellipse = ellipse;\n * // void fn;\n */\nexport function ellipse(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | ShapeStyle,\n arg4?: ShapeStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return ellipseImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (MarkerDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/marker-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n MarkerState,\n TextOpts,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.marker called outside an active script step\";\n\ntype MarkerOpts = TextOpts & {\n readonly text?: string;\n readonly value?: number;\n};\n\nfunction markerImpl(slotId: string, anchor: WorldPoint, opts: MarkerOpts): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n // Split the merged opts bag: top-level `text` / `value` live on the\n // state; the remaining TextOpts fields nest under `style`.\n const { text, value, ...style } = opts;\n const state: MarkerState = {\n kind: \"marker\",\n anchor,\n ...(text !== undefined ? { text } : {}),\n ...(value !== undefined ? { value } : {}),\n style,\n };\n return createDrawingHandle(slotId, subId, \"marker\", state);\n}\n\n/**\n * Draw a single-anchor marker glyph with an optional text label and\n * numeric value. The renderer projects `anchor` to canvas pixel space\n * and paints the `text` (if any) at that position using the\n * {@link TextOpts}-derived font + alignment.\n *\n * @anchors `anchor` \u2014 one `WorldPoint`\n * @anchorCount 1\n * @bucket labels\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.marker demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.marker(\n * { time: bar.time, price: bar.close },\n * { text: \"B\", size: \"large\", color: \"#10b981\" },\n * );\n * },\n * });\n */\nexport function marker(anchor: WorldPoint, opts?: MarkerOpts): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof marker = marker;\n * // void fn;\n */\nexport function marker(slotId: string, anchor: WorldPoint, opts?: MarkerOpts): DrawingHandle;\n/**\n * Implementation signature for {@link marker}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof marker = marker;\n * // void fn;\n */\nexport function marker(\n arg1: string | WorldPoint,\n arg2?: WorldPoint | MarkerOpts,\n arg3?: MarkerOpts,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return markerImpl(arg1, arg2 as WorldPoint, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (PathDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/path-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type { DrawingHandle, PathOpts, PathState, WorldPoint } from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.path called outside an active script step\";\n\nfunction pathImpl(\n slotId: string,\n anchors: ReadonlyArray<WorldPoint>,\n opts: PathOpts,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: PathState = { kind: \"path\", anchors, style: opts };\n return createDrawingHandle(slotId, subId, \"path\", state);\n}\n\n/**\n * Draw an OPEN polyline through N world anchors. Distinct from\n * `draw.polyline` (Task 6) which is CLOSED \u2014 `path` does NOT\n * auto-connect the last anchor back to the first. Use\n * `opts.closed === true` to override and close the path explicitly.\n * Supply 2..20 anchors (validator pins this range, mirroring\n * invinite's 20-point cap).\n *\n * @anchors `anchors` \u2014 `ReadonlyArray<WorldPoint>` of length 2..20\n * @anchorCount 2..20\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.path demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.path(\n * [\n * { time: bar.time, price: bar.open },\n * { time: bar.time, price: bar.close },\n * ],\n * { color: \"#3b82f6\", lineWidth: 2 },\n * );\n * },\n * });\n */\nexport function path(anchors: ReadonlyArray<WorldPoint>, opts?: PathOpts): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof path = path;\n * // void fn;\n */\nexport function path(\n slotId: string,\n anchors: ReadonlyArray<WorldPoint>,\n opts?: PathOpts,\n): DrawingHandle;\n/**\n * Implementation signature for {@link path}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof path = path;\n * // void fn;\n */\nexport function path(\n arg1: string | ReadonlyArray<WorldPoint>,\n arg2?: ReadonlyArray<WorldPoint> | PathOpts,\n arg3?: PathOpts,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return pathImpl(arg1, arg2 as ReadonlyArray<WorldPoint>, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (PolylineDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/polyline-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n LineDrawStyle,\n PolylineState,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.polyline called outside an active script step\";\n\nfunction polylineImpl(\n slotId: string,\n anchors: ReadonlyArray<WorldPoint>,\n opts: LineDrawStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: PolylineState = { kind: \"polyline\", anchors, style: opts };\n return createDrawingHandle(slotId, subId, \"polyline\", state);\n}\n\n/**\n * Draw a closed polyline through N world anchors. The renderer\n * auto-connects the last anchor back to the first to close the\n * polygon; supply between 3 and 20 anchors (validator pins this\n * range, mirroring the invinite tool's 20-point cap). The open\n * polyline equivalent will ship as `draw.path` (Task 7).\n *\n * @anchors `anchors` \u2014 `ReadonlyArray<WorldPoint>` of length 3..20\n * @anchorCount 3..20\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.polyline demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.polyline(\n * [\n * { time: bar.time, price: bar.low },\n * { time: bar.time, price: bar.open },\n * { time: bar.time, price: bar.high },\n * ],\n * { color: \"#a855f7\", lineWidth: 2 },\n * );\n * },\n * });\n */\nexport function polyline(anchors: ReadonlyArray<WorldPoint>, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof polyline = polyline;\n * // void fn;\n */\nexport function polyline(\n slotId: string,\n anchors: ReadonlyArray<WorldPoint>,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link polyline}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof polyline = polyline;\n * // void fn;\n */\nexport function polyline(\n arg1: string | ReadonlyArray<WorldPoint>,\n arg2?: ReadonlyArray<WorldPoint> | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return polylineImpl(arg1, arg2 as ReadonlyArray<WorldPoint>, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (RectangleDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/rectangle-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n RectangleState,\n ShapeStyle,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.rectangle called outside an active script step\";\n\nfunction rectangleImpl(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts: ShapeStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: RectangleState = { kind: \"rectangle\", anchors: [a, b], style: opts };\n return createDrawingHandle(slotId, subId, \"rectangle\", state);\n}\n\n/**\n * Draw an axis-aligned rectangle defined by two opposite world corners.\n * The renderer projects each anchor with the adapter's viewport\n * transform; degenerate (zero-area) inputs render as a single line.\n *\n * @anchors `a`, `b` \u2014 two `WorldPoint`s (opposite corners)\n * @anchorCount 2\n * @bucket boxes\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.rectangle demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.rectangle(\n * { time: bar.time, price: bar.low },\n * { time: bar.time, price: bar.high },\n * { stroke: \"#3b82f6\", fill: \"#dbeafe\", fillAlpha: 0.4 },\n * );\n * },\n * });\n */\nexport function rectangle(a: WorldPoint, b: WorldPoint, opts?: ShapeStyle): DrawingHandle;\n/**\n * Compiler-injected overload \u2014 the callsite-id transformer rewrites\n * every script-side `draw.rectangle(a, b, opts)` into\n * `draw.rectangle(slotId, a, b, opts)`.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof rectangle = rectangle;\n * // void fn;\n */\nexport function rectangle(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts?: ShapeStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link rectangle}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof rectangle = rectangle;\n * // void fn;\n */\nexport function rectangle(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | ShapeStyle,\n arg4?: ShapeStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return rectangleImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (RotatedRectangleDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/rotated-rectangle-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorQuad,\n DrawingHandle,\n RotatedRectangleState,\n ShapeStyle,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.rotatedRectangle called outside an active script step\";\n\nfunction rotatedRectangleImpl(\n slotId: string,\n anchors: AnchorQuad,\n opts: ShapeStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: RotatedRectangleState = { kind: \"rotated-rectangle\", anchors, style: opts };\n return createDrawingHandle(slotId, subId, \"rotated-rectangle\", state);\n}\n\n/**\n * Draw a rotated rectangle by its four world-space corners. The four\n * anchors should be supplied in stroke order (CW or CCW); the renderer\n * walks them as a closed polygon so any non-self-intersecting quad\n * paints correctly. Pure square / axis-aligned input is supported \u2014\n * use {@link rectangle} for that case if you prefer the 2-anchor\n * ergonomics.\n *\n * @anchors `anchors` \u2014 4 `WorldPoint`s in stroke order\n * @anchorCount 4\n * @bucket boxes\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.rotatedRectangle demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.rotatedRectangle(\n * [\n * { time: bar.time, price: bar.low },\n * { time: bar.time, price: bar.high },\n * { time: bar.time, price: bar.high + 1 },\n * { time: bar.time, price: bar.low + 1 },\n * ],\n * { stroke: \"#22c55e\" },\n * );\n * },\n * });\n */\nexport function rotatedRectangle(anchors: AnchorQuad, opts?: ShapeStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof rotatedRectangle = rotatedRectangle;\n * // void fn;\n */\nexport function rotatedRectangle(\n slotId: string,\n anchors: AnchorQuad,\n opts?: ShapeStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link rotatedRectangle}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof rotatedRectangle = rotatedRectangle;\n * // void fn;\n */\nexport function rotatedRectangle(\n arg1: string | AnchorQuad,\n arg2?: AnchorQuad | ShapeStyle,\n arg3?: ShapeStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return rotatedRectangleImpl(arg1, arg2 as AnchorQuad, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (TriangleDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/triangle-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorTriple,\n DrawingHandle,\n ShapeStyle,\n TriangleState,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.triangle called outside an active script step\";\n\nfunction triangleImpl(slotId: string, anchors: AnchorTriple, opts: ShapeStyle): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: TriangleState = { kind: \"triangle\", anchors, style: opts };\n return createDrawingHandle(slotId, subId, \"triangle\", state);\n}\n\n/**\n * Draw a triangle as a closed three-vertex polygon. Vertices may be\n * supplied CW or CCW; the renderer walks them as a closed path. Not to\n * be confused with `draw.trianglePattern` (Task 15) \u2014 that variant is\n * the harmonic five-anchor triangle pattern.\n *\n * @anchors `anchors` \u2014 3 `WorldPoint`s\n * @anchorCount 3\n * @bucket boxes\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.triangle demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.triangle(\n * [\n * { time: bar.time, price: bar.low },\n * { time: bar.time, price: bar.high },\n * { time: bar.time, price: bar.close },\n * ],\n * { stroke: \"#ef4444\", fill: \"#fee2e2\", fillAlpha: 0.5 },\n * );\n * },\n * });\n */\nexport function triangle(anchors: AnchorTriple, opts?: ShapeStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof triangle = triangle;\n * // void fn;\n */\nexport function triangle(slotId: string, anchors: AnchorTriple, opts?: ShapeStyle): DrawingHandle;\n/**\n * Implementation signature for {@link triangle}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof triangle = triangle;\n * // void fn;\n */\nexport function triangle(\n arg1: string | AnchorTriple,\n arg2?: AnchorTriple | ShapeStyle,\n arg3?: ShapeStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return triangleImpl(arg1, arg2 as AnchorTriple, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (DisjointChannelDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/disjoint-channel-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorQuad,\n DisjointChannelState,\n DrawingHandle,\n LineDrawStyle,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.disjointChannel called outside an active script step\";\n\nfunction disjointChannelImpl(\n slotId: string,\n anchors: AnchorQuad,\n opts: LineDrawStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: DisjointChannelState = { kind: \"disjoint-channel\", anchors, style: opts };\n return createDrawingHandle(slotId, subId, \"disjoint-channel\", state);\n}\n\n/**\n * Draw a disjoint channel \u2014 two independent line segments. Anchors\n * `[A, B, C, D]`: segment 1 from A to B, segment 2 from C to D, with\n * no shared geometry constraint. Mirrors invinite's\n * `disjoint-channel-tool.ts` shape.\n *\n * @anchors `anchors` \u2014 `[A, B, C, D]` quad\n * @anchorCount 4\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.disjointChannel demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.disjointChannel(\n * [\n * { time: bar.time, price: bar.low },\n * { time: bar.time, price: bar.high },\n * { time: bar.time, price: bar.open },\n * { time: bar.time, price: bar.close },\n * ],\n * { color: \"#3b82f6\", lineWidth: 2 },\n * );\n * },\n * });\n */\nexport function disjointChannel(anchors: AnchorQuad, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof disjointChannel = disjointChannel;\n * // void fn;\n */\nexport function disjointChannel(\n slotId: string,\n anchors: AnchorQuad,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link disjointChannel}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof disjointChannel = disjointChannel;\n * // void fn;\n */\nexport function disjointChannel(\n arg1: string | AnchorQuad,\n arg2?: AnchorQuad | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return disjointChannelImpl(arg1, arg2 as AnchorQuad, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (FlatTopBottomDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/flat-top-bottom-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorTriple,\n DrawingHandle,\n FlatTopBottomState,\n LineDrawStyle,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.flatTopBottom called outside an active script step\";\n\nfunction flatTopBottomImpl(\n slotId: string,\n anchors: AnchorTriple,\n opts: LineDrawStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: FlatTopBottomState = { kind: \"flat-top-bottom\", anchors, style: opts };\n return createDrawingHandle(slotId, subId, \"flat-top-bottom\", state);\n}\n\n/**\n * Draw a flat-top / flat-bottom channel \u2014 two parallel horizontal\n * rails. Anchors `[leftEdge, rightEdge, oppositeHook]`: leftEdge and\n * rightEdge fix the time range; the opposite-edge price comes from\n * `oppositeHook.price`. Mirrors invinite's `flat-top-bottom-tool.ts`\n * shape \u2014 note the landed core shape persists 3 anchors (see\n * `tasks/phase-3-drawing-parity/10-channels.plan.md` \u00A71).\n *\n * @anchors `anchors` \u2014 `[leftEdge, rightEdge, oppositeHook]` triple\n * @anchorCount 3\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.flatTopBottom demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.flatTopBottom(\n * [\n * { time: bar.time, price: bar.high },\n * { time: bar.time, price: bar.high },\n * { time: bar.time, price: bar.low },\n * ],\n * { color: \"#3b82f6\", lineStyle: \"dashed\" },\n * );\n * },\n * });\n */\nexport function flatTopBottom(anchors: AnchorTriple, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof flatTopBottom = flatTopBottom;\n * // void fn;\n */\nexport function flatTopBottom(\n slotId: string,\n anchors: AnchorTriple,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link flatTopBottom}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof flatTopBottom = flatTopBottom;\n * // void fn;\n */\nexport function flatTopBottom(\n arg1: string | AnchorTriple,\n arg2?: AnchorTriple | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return flatTopBottomImpl(arg1, arg2 as AnchorTriple, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (RegressionTrendDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/regression-trend-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n RegressionTrendOpts,\n RegressionTrendState,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.regressionTrend called outside an active script step\";\n\nfunction regressionTrendImpl(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts: RegressionTrendOpts,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: RegressionTrendState = {\n kind: \"regression-trend\",\n anchors: [a, b],\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"regression-trend\", state);\n}\n\n/**\n * Draw an OLS regression-trend line between two world anchors with\n * optional \u00B1\u03C3 bands. The Phase-3 runtime emits the anchor pair + opts;\n * the actual OLS fit is computed by the adapter \u2014 consumer adapters\n * can use {@link import(\"@invinite-org/chartlang-runtime\").linearRegression}\n * (re-exported by Task 10) without duplicating math. The reference\n * canvas2d adapter renders a placeholder anchor-to-anchor line because\n * `Viewport` does not expose a bar accessor \u2014 see\n * `tasks/phase-3-drawing-parity/10-channels.plan.md` \u00A73. Mirrors\n * invinite's `regression-trend-tool.ts` shape.\n *\n * @anchors `a`, `b` \u2014 start and end `WorldPoint`s (a.time < b.time)\n * @anchorCount 2\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.regressionTrend demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.regressionTrend(\n * { time: bar.time, price: bar.close },\n * { time: bar.time + 30_000, price: bar.close },\n * {\n * source: \"close\",\n * stdevMultiplier: 2,\n * showUpperBand: true,\n * showLowerBand: true,\n * },\n * );\n * },\n * });\n */\nexport function regressionTrend(\n a: WorldPoint,\n b: WorldPoint,\n opts?: RegressionTrendOpts,\n): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof regressionTrend = regressionTrend;\n * // void fn;\n */\nexport function regressionTrend(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts?: RegressionTrendOpts,\n): DrawingHandle;\n/**\n * Implementation signature for {@link regressionTrend}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof regressionTrend = regressionTrend;\n * // void fn;\n */\nexport function regressionTrend(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | RegressionTrendOpts,\n arg4?: RegressionTrendOpts,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return regressionTrendImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (TrendChannelDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/trend-channel-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorTriple,\n DrawingHandle,\n LineDrawStyle,\n TrendChannelState,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.trendChannel called outside an active script step\";\n\nfunction trendChannelImpl(\n slotId: string,\n anchors: AnchorTriple,\n opts: LineDrawStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: TrendChannelState = { kind: \"trend-channel\", anchors, style: opts };\n return createDrawingHandle(slotId, subId, \"trend-channel\", state);\n}\n\n/**\n * Draw a parallel-line trend channel from three world anchors\n * `[primaryA, primaryB, parallelHook]`. The first two define the\n * primary trend line; the third is offset perpendicular to that line\n * to determine the parallel rail. Mirrors invinite's\n * `trend-channel-tool.ts` shape.\n *\n * @anchors `anchors` \u2014 `[primaryA, primaryB, parallelHook]` triple\n * @anchorCount 3\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.trendChannel demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.trendChannel(\n * [\n * { time: bar.time, price: bar.low },\n * { time: bar.time, price: bar.high },\n * { time: bar.time, price: bar.close },\n * ],\n * { color: \"#3b82f6\", lineWidth: 2 },\n * );\n * },\n * });\n */\nexport function trendChannel(anchors: AnchorTriple, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof trendChannel = trendChannel;\n * // void fn;\n */\nexport function trendChannel(\n slotId: string,\n anchors: AnchorTriple,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link trendChannel}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof trendChannel = trendChannel;\n * // void fn;\n */\nexport function trendChannel(\n arg1: string | AnchorTriple,\n arg2?: AnchorTriple | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return trendChannelImpl(arg1, arg2 as AnchorTriple, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// State shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (FrameDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// No standalone tool source exists in invinite \u2014 frames are\n// metadata-only collab containers; the chartlang port adds the\n// `anchors: AnchorPair` payload so frames render as a visible\n// rectangle at the wire level per PLAN.md \u00A710.4.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n FrameOpts,\n FrameState,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.frame called outside an active script step\";\n\nfunction frameImpl(slotId: string, a: WorldPoint, b: WorldPoint, opts: FrameOpts): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: FrameState = {\n kind: \"frame\",\n anchors: [a, b],\n childHandleIds: [],\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"frame\", state);\n}\n\n/**\n * Draw a labelled rectangular frame between two world anchors\n * `[topLeft, bottomRight]`. The frame renders an outlined rectangle\n * plus an optional background fill (`opts.bgColor`) and label\n * (`opts.label`) per PLAN.md \u00A710.4. Children of the frame render\n * themselves \u2014 the frame is a visual envelope, not a re-render layer.\n *\n * @anchors `a`, `b` \u2014 two `WorldPoint`s `(topLeft, bottomRight)`\n * @anchorCount 2\n * @bucket other\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.frame demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.frame(\n * { time: bar.time, price: bar.low },\n * { time: bar.time + 60_000, price: bar.high },\n * { label: \"Trade idea\", bgColor: \"#f1f5f9\" },\n * );\n * },\n * });\n */\nexport function frame(a: WorldPoint, b: WorldPoint, opts?: FrameOpts): DrawingHandle;\n/**\n * Compiler-injected overload \u2014 the callsite-id transformer rewrites\n * every script-side `draw.frame(a, b, opts)` into\n * `draw.frame(slotId, a, b, opts)`.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof frame = frame;\n * // void fn;\n */\nexport function frame(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts?: FrameOpts,\n): DrawingHandle;\n/**\n * Implementation signature for {@link frame}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof frame = frame;\n * // void fn;\n */\nexport function frame(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | FrameOpts,\n arg4?: FrameOpts,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return frameImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// State shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (GroupDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// No standalone tool source exists in invinite \u2014 groups are\n// metadata-only containers; their parent / child linkage is collab\n// state stripped per PLAN.md \u00A710.4.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type { DrawingHandle, GroupState } from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.group called outside an active script step\";\n\nfunction groupImpl(slotId: string, childHandleIds: ReadonlyArray<string>): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: GroupState = {\n kind: \"group\",\n childHandleIds,\n };\n return createDrawingHandle(slotId, subId, \"group\", state);\n}\n\n/**\n * Group a set of previously emitted drawing handles under a single\n * logical container. The script-author passes the handle ids\n * collected from earlier `draw.<kind>(...).id` calls; the runtime\n * carries the list on the wire as a `GroupState`, and the adapter\n * renders nothing of its own \u2014 children render themselves per\n * PLAN.md \u00A710.4.\n *\n * @anchors `childHandleIds` \u2014 a `ReadonlyArray<string>` of handle ids\n * @anchorCount 0 (metadata-only container)\n * @bucket other\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.group demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * const a = draw.line(\n * { time: bar.time, price: bar.low },\n * { time: bar.time + 60_000, price: bar.high },\n * );\n * const b = draw.line(\n * { time: bar.time, price: bar.high },\n * { time: bar.time + 60_000, price: bar.low },\n * );\n * draw.group([a.id, b.id]);\n * },\n * });\n */\nexport function group(childHandleIds: ReadonlyArray<string>): DrawingHandle;\n/**\n * Compiler-injected overload \u2014 the callsite-id transformer rewrites\n * every script-side `draw.group(childHandleIds)` into\n * `draw.group(slotId, childHandleIds)`.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof group = group;\n * // void fn;\n */\nexport function group(slotId: string, childHandleIds: ReadonlyArray<string>): DrawingHandle;\n/**\n * Implementation signature for {@link group}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof group = group;\n * // void fn;\n */\nexport function group(\n arg1: string | ReadonlyArray<string>,\n arg2?: ReadonlyArray<string>,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return groupImpl(arg1, arg2);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (ArcDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/arc-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorTriple,\n ArcState,\n DrawingHandle,\n LineDrawStyle,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.arc called outside an active script step\";\n\nfunction arcImpl(slotId: string, anchors: AnchorTriple, opts: LineDrawStyle): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: ArcState = { kind: \"arc\", anchors, style: opts };\n return createDrawingHandle(slotId, subId, \"arc\", state);\n}\n\n/**\n * Draw an arc through three world anchors `[from, apex, to]`. The\n * renderer derives a quadratic Bezier control point from the apex via\n * inverse-quadratic interpolation so the curve passes through `apex`\n * at parameter `t = 0.5` \u2014 distinct from {@link curve} whose middle\n * anchor IS the control point (and the curve does NOT pass through\n * it). Mirrors invinite's `arc-tool.ts` shape.\n *\n * @anchors `anchors` \u2014 `[from, apex, to]` triple\n * @anchorCount 3\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.arc demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.arc(\n * [\n * { time: bar.time, price: bar.low },\n * { time: bar.time, price: bar.high },\n * { time: bar.time, price: bar.close },\n * ],\n * { color: \"#3b82f6\", lineWidth: 2 },\n * );\n * },\n * });\n */\nexport function arc(anchors: AnchorTriple, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof arc = arc;\n * // void fn;\n */\nexport function arc(slotId: string, anchors: AnchorTriple, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Implementation signature for {@link arc}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof arc = arc;\n * // void fn;\n */\nexport function arc(\n arg1: string | AnchorTriple,\n arg2?: AnchorTriple | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return arcImpl(arg1, arg2 as AnchorTriple, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (BrushDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/brush-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n BrushState,\n BrushStyle,\n DrawingHandle,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.brush called outside an active script step\";\n\nfunction brushImpl(\n slotId: string,\n anchors: ReadonlyArray<WorldPoint>,\n opts: BrushStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: BrushState = { kind: \"brush\", anchors, style: opts };\n return createDrawingHandle(slotId, subId, \"brush\", state);\n}\n\n/**\n * Draw a freehand brush stroke \u2014 a stroked + filled polyline through\n * N world anchors. The renderer treats the polyline as a closed\n * region (`moveTo + N-1 lineTo + closePath`) and paints fill before\n * stroke. Supply 2..500 anchors (validator pins this range, matching\n * invinite's stroke cap). Both `style.stroke` and `style.fill` are\n * required. Mirrors invinite's `brush-tool.ts` shape.\n *\n * @anchors `anchors` \u2014 `ReadonlyArray<WorldPoint>` of length 2..500\n * @anchorCount 2..500\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.brush demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.brush(\n * [\n * { time: bar.time, price: bar.open },\n * { time: bar.time, price: bar.high },\n * { time: bar.time, price: bar.close },\n * ],\n * { stroke: \"#000000\", fill: \"#dbeafe\" },\n * );\n * },\n * });\n */\nexport function brush(anchors: ReadonlyArray<WorldPoint>, opts: BrushStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof brush = brush;\n * // void fn;\n */\nexport function brush(\n slotId: string,\n anchors: ReadonlyArray<WorldPoint>,\n opts: BrushStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link brush}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof brush = brush;\n * // void fn;\n */\nexport function brush(\n arg1: string | ReadonlyArray<WorldPoint>,\n arg2?: ReadonlyArray<WorldPoint> | BrushStyle,\n arg3?: BrushStyle,\n): DrawingHandle {\n if (\n typeof arg1 !== \"string\" ||\n arg2 === undefined ||\n !Array.isArray(arg2) ||\n arg3 === undefined\n ) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return brushImpl(arg1, arg2 as ReadonlyArray<WorldPoint>, arg3);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (CurveDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/curve-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorTriple,\n CurveState,\n DrawingHandle,\n LineDrawStyle,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.curve called outside an active script step\";\n\nfunction curveImpl(slotId: string, anchors: AnchorTriple, opts: LineDrawStyle): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: CurveState = { kind: \"curve\", anchors, style: opts };\n return createDrawingHandle(slotId, subId, \"curve\", state);\n}\n\n/**\n * Draw a quadratic Bezier curve through three world anchors\n * `[from, control, to]`. The middle anchor IS the off-curve Bezier\n * control point \u2014 the rendered curve does NOT pass through it\n * (distinct from {@link arc} whose middle anchor is the apex the\n * curve passes through). Mirrors invinite's `curve-tool.ts` shape.\n *\n * @anchors `anchors` \u2014 `[from, control, to]` triple\n * @anchorCount 3\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.curve demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.curve(\n * [\n * { time: bar.time, price: bar.open },\n * { time: bar.time, price: bar.high },\n * { time: bar.time, price: bar.close },\n * ],\n * { color: \"#22c55e\", lineWidth: 1 },\n * );\n * },\n * });\n */\nexport function curve(anchors: AnchorTriple, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof curve = curve;\n * // void fn;\n */\nexport function curve(slotId: string, anchors: AnchorTriple, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Implementation signature for {@link curve}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof curve = curve;\n * // void fn;\n */\nexport function curve(\n arg1: string | AnchorTriple,\n arg2?: AnchorTriple | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return curveImpl(arg1, arg2 as AnchorTriple, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (DoubleCurveDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/double-curve-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorQuint,\n DoubleCurveState,\n DrawingHandle,\n LineDrawStyle,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.doubleCurve called outside an active script step\";\n\nfunction doubleCurveImpl(slotId: string, anchors: AnchorQuint, opts: LineDrawStyle): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: DoubleCurveState = { kind: \"double-curve\", anchors, style: opts };\n return createDrawingHandle(slotId, subId, \"double-curve\", state);\n}\n\n/**\n * Draw a cubic Bezier curve through five world anchors `[P0, P1, mid,\n * P3, P4]`. The renderer paints a single cubic from `P0` to `P4` with\n * off-curve controls `P1` and `P3`; the middle anchor `mid` is the\n * stitch point for future split-rendering and is currently preserved\n * but unused at paint time. Mirrors invinite's `double-curve-tool.ts`\n * persisted shape.\n *\n * @anchors `anchors` \u2014 `[P0, P1, mid, P3, P4]` quint\n * @anchorCount 5\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.doubleCurve demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.doubleCurve(\n * [\n * { time: bar.time, price: bar.open },\n * { time: bar.time, price: bar.high },\n * { time: bar.time, price: (bar.high + bar.low) / 2 },\n * { time: bar.time, price: bar.low },\n * { time: bar.time, price: bar.close },\n * ],\n * { color: \"#a855f7\", lineWidth: 2 },\n * );\n * },\n * });\n */\nexport function doubleCurve(anchors: AnchorQuint, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof doubleCurve = doubleCurve;\n * // void fn;\n */\nexport function doubleCurve(\n slotId: string,\n anchors: AnchorQuint,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link doubleCurve}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof doubleCurve = doubleCurve;\n * // void fn;\n */\nexport function doubleCurve(\n arg1: string | AnchorQuint,\n arg2?: AnchorQuint | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return doubleCurveImpl(arg1, arg2 as AnchorQuint, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (HighlighterDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/highlighter-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n HighlighterState,\n HighlighterStyle,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.highlighter called outside an active script step\";\n\nfunction highlighterImpl(\n slotId: string,\n anchors: ReadonlyArray<WorldPoint>,\n opts: HighlighterStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: HighlighterState = { kind: \"highlighter\", anchors, style: opts };\n return createDrawingHandle(slotId, subId, \"highlighter\", state);\n}\n\n/**\n * Draw a freehand highlighter stroke \u2014 a thick translucent polyline\n * through N world anchors. Renders with `ctx.globalAlpha = style.alpha`\n * wrapped around the stroke so the rest of the frame is unaffected.\n * Supply 2..500 anchors (validator pins this range, matching\n * invinite's stroke cap). Both `style.color` and `style.alpha` are\n * required. Mirrors invinite's `highlighter-tool.ts` shape.\n *\n * @anchors `anchors` \u2014 `ReadonlyArray<WorldPoint>` of length 2..500\n * @anchorCount 2..500\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.highlighter demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.highlighter(\n * [\n * { time: bar.time, price: bar.high },\n * { time: bar.time, price: bar.low },\n * ],\n * { color: \"#facc15\", alpha: 0.3 },\n * );\n * },\n * });\n */\nexport function highlighter(\n anchors: ReadonlyArray<WorldPoint>,\n opts: HighlighterStyle,\n): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof highlighter = highlighter;\n * // void fn;\n */\nexport function highlighter(\n slotId: string,\n anchors: ReadonlyArray<WorldPoint>,\n opts: HighlighterStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link highlighter}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof highlighter = highlighter;\n * // void fn;\n */\nexport function highlighter(\n arg1: string | ReadonlyArray<WorldPoint>,\n arg2?: ReadonlyArray<WorldPoint> | HighlighterStyle,\n arg3?: HighlighterStyle,\n): DrawingHandle {\n if (\n typeof arg1 !== \"string\" ||\n arg2 === undefined ||\n !Array.isArray(arg2) ||\n arg3 === undefined\n ) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return highlighterImpl(arg1, arg2 as ReadonlyArray<WorldPoint>, arg3);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (PenDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/pen-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n LineDrawStyle,\n PenState,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.pen called outside an active script step\";\n\nfunction penImpl(\n slotId: string,\n anchors: ReadonlyArray<WorldPoint>,\n opts: LineDrawStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: PenState = { kind: \"pen\", anchors, style: opts };\n return createDrawingHandle(slotId, subId, \"pen\", state);\n}\n\n/**\n * Draw a freehand pen stroke through N world anchors. Renders as an\n * OPEN polyline (mirrors `polyline` but without the auto-close).\n * Supply 2..500 anchors (validator pins this range, matching\n * invinite's stroke cap). Mirrors invinite's `pen-tool.ts` shape.\n *\n * @anchors `anchors` \u2014 `ReadonlyArray<WorldPoint>` of length 2..500\n * @anchorCount 2..500\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.pen demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.pen(\n * [\n * { time: bar.time, price: bar.open },\n * { time: bar.time, price: bar.close },\n * ],\n * { color: \"#1e293b\", lineWidth: 2 },\n * );\n * },\n * });\n */\nexport function pen(anchors: ReadonlyArray<WorldPoint>, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof pen = pen;\n * // void fn;\n */\nexport function pen(\n slotId: string,\n anchors: ReadonlyArray<WorldPoint>,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link pen}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof pen = pen;\n * // void fn;\n */\nexport function pen(\n arg1: string | ReadonlyArray<WorldPoint>,\n arg2?: ReadonlyArray<WorldPoint> | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return penImpl(arg1, arg2 as ReadonlyArray<WorldPoint>, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (CyclicLinesDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/cyclic-lines-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n CyclicLinesState,\n DrawingHandle,\n LineDrawStyle,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.cyclicLines called outside an active script step\";\n\nfunction cyclicLinesImpl(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts: LineDrawStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: CyclicLinesState = {\n kind: \"cyclic-lines\",\n anchors: [a, b],\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"cyclic-lines\", state);\n}\n\n/**\n * Draw equally spaced vertical lines marking cycle periods between two\n * world anchors `[from, to]`. The cycle period equals `|to.time -\n * from.time|`; the renderer projects repeated vertical strokes at every\n * `from.time + n*period` to the right until the viewport edge.\n *\n * @anchors `a`, `b` \u2014 two `WorldPoint`s `(from, to)`\n * @anchorCount 2\n * @bucket other\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.cyclicLines demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.cyclicLines(\n * { time: bar.time, price: bar.close },\n * { time: bar.time + 60_000, price: bar.close },\n * { color: \"#0ea5e9\" },\n * );\n * },\n * });\n */\nexport function cyclicLines(a: WorldPoint, b: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload \u2014 the callsite-id transformer rewrites\n * every script-side `draw.cyclicLines(a, b, opts)` into\n * `draw.cyclicLines(slotId, a, b, opts)`.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof cyclicLines = cyclicLines;\n * // void fn;\n */\nexport function cyclicLines(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link cyclicLines}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof cyclicLines = cyclicLines;\n * // void fn;\n */\nexport function cyclicLines(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | LineDrawStyle,\n arg4?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return cyclicLinesImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (SineLineDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/sine-line-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n LineDrawStyle,\n SineLineState,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.sineLine called outside an active script step\";\n\nfunction sineLineImpl(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts: LineDrawStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: SineLineState = {\n kind: \"sine-line\",\n anchors: [a, b],\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"sine-line\", state);\n}\n\n/**\n * Draw a sinusoidal projection fitted between two world anchors. The\n * baseline is the midpoint price of the two anchors; the amplitude is\n * half the price span; the half-period spans `|to.time - from.time|`\n * (so the full period is twice that). The renderer samples 32 points\n * per full period and extends the wave across the visible viewport.\n *\n * @anchors `a`, `b` \u2014 two `WorldPoint`s `(from, to)`\n * @anchorCount 2\n * @bucket other\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.sineLine demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.sineLine(\n * { time: bar.time, price: bar.low },\n * { time: bar.time + 60_000, price: bar.high },\n * { color: \"#0ea5e9\" },\n * );\n * },\n * });\n */\nexport function sineLine(a: WorldPoint, b: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof sineLine = sineLine;\n * // void fn;\n */\nexport function sineLine(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link sineLine}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof sineLine = sineLine;\n * // void fn;\n */\nexport function sineLine(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | LineDrawStyle,\n arg4?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return sineLineImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (TimeCyclesDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/time-cycles-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n LineDrawStyle,\n TimeCyclesState,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.timeCycles called outside an active script step\";\n\nfunction timeCyclesImpl(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts: LineDrawStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: TimeCyclesState = {\n kind: \"time-cycles\",\n anchors: [a, b],\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"time-cycles\", state);\n}\n\n/**\n * Draw concentric semicircles measuring time cycles between two world\n * anchors `[centre, edge]`. The renderer projects upper-half arcs\n * centred at the midpoint of the two anchors at the `from.price`\n * baseline; arcs tile across the viewport at multiples of the arc\n * diameter.\n *\n * @anchors `a`, `b` \u2014 two `WorldPoint`s `(from, to)`\n * @anchorCount 2\n * @bucket other\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.timeCycles demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.timeCycles(\n * { time: bar.time, price: bar.close },\n * { time: bar.time + 60_000, price: bar.close },\n * { color: \"#0ea5e9\" },\n * );\n * },\n * });\n */\nexport function timeCycles(a: WorldPoint, b: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof timeCycles = timeCycles;\n * // void fn;\n */\nexport function timeCycles(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link timeCycles}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof timeCycles = timeCycles;\n * // void fn;\n */\nexport function timeCycles(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | LineDrawStyle,\n arg4?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return timeCyclesImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (ElliottCorrectionWaveDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/elliott-correction-wave-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorTriple,\n DrawingHandle,\n ElliottCorrectionWaveState,\n LineDrawStyle,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.elliottCorrectionWave called outside an active script step\";\n\ntype CorrectionOpts = LineDrawStyle & { labels?: ReadonlyArray<string> };\n\nfunction elliottCorrectionWaveImpl(\n slotId: string,\n anchors: AnchorTriple,\n opts: CorrectionOpts,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const { labels, ...style } = opts;\n const state: ElliottCorrectionWaveState =\n labels === undefined\n ? { kind: \"elliott-correction-wave\", anchors, style }\n : { kind: \"elliott-correction-wave\", anchors, labels, style };\n return createDrawingHandle(slotId, subId, \"elliott-correction-wave\", state);\n}\n\n/**\n * Draw an Elliott three-wave A-B-C correction through 3 world anchors\n * `[A, B, C]`. The renderer strokes the connecting legs (A-B, B-C) and\n * labels each pivot. Pass `opts.labels` to override the default\n * `[\"A\", \"B\", \"C\"]` labels.\n *\n * @anchors `anchors` \u2014 `[A, B, C]`\n * @anchorCount 3\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.elliottCorrectionWave demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.elliottCorrectionWave([\n * { time: bar.time, price: bar.high },\n * { time: bar.time + 30_000, price: bar.low },\n * { time: bar.time + 60_000, price: bar.close },\n * ]);\n * },\n * });\n */\nexport function elliottCorrectionWave(anchors: AnchorTriple, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof elliottCorrectionWave = elliottCorrectionWave;\n * // void fn;\n */\nexport function elliottCorrectionWave(\n slotId: string,\n anchors: AnchorTriple,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link elliottCorrectionWave}. Branches\n * on `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof elliottCorrectionWave = elliottCorrectionWave;\n * // void fn;\n */\nexport function elliottCorrectionWave(\n arg1: string | AnchorTriple,\n arg2?: AnchorTriple | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return elliottCorrectionWaveImpl(arg1, arg2 as AnchorTriple, (arg3 ?? {}) as CorrectionOpts);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (ElliottDoubleComboDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/elliott-double-combo-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorHept,\n DrawingHandle,\n ElliottDoubleComboState,\n LineDrawStyle,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.elliottDoubleCombo called outside an active script step\";\n\ntype DoubleComboOpts = LineDrawStyle & { labels?: ReadonlyArray<string> };\n\nfunction elliottDoubleComboImpl(\n slotId: string,\n anchors: AnchorHept,\n opts: DoubleComboOpts,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const { labels, ...style } = opts;\n const state: ElliottDoubleComboState =\n labels === undefined\n ? { kind: \"elliott-double-combo\", anchors, style }\n : { kind: \"elliott-double-combo\", anchors, labels, style };\n return createDrawingHandle(slotId, subId, \"elliott-double-combo\", state);\n}\n\n/**\n * Draw an Elliott seven-anchor W-X-Y double-three corrective pattern\n * through 7 world anchors `[start, W-end, x1, X-end, x2, Y-mid,\n * Y-end]`. The renderer strokes the 6-leg connecting polyline and\n * labels each pivot. Pass `opts.labels` to override the default\n * `[\"S\", \"W\", \"x1\", \"X\", \"x2\", \"Yi\", \"Y\"]` labels.\n *\n * @anchors `anchors` \u2014 `[start, W-end, x1, X-end, x2, Y-mid, Y-end]`\n * @anchorCount 7\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.elliottDoubleCombo demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.elliottDoubleCombo([\n * { time: bar.time, price: bar.low },\n * { time: bar.time + 10_000, price: bar.high },\n * { time: bar.time + 20_000, price: bar.close },\n * { time: bar.time + 30_000, price: bar.high + 1 },\n * { time: bar.time + 40_000, price: bar.close - 0.5 },\n * { time: bar.time + 50_000, price: bar.high + 2 },\n * { time: bar.time + 60_000, price: bar.close + 1 },\n * ]);\n * },\n * });\n */\nexport function elliottDoubleCombo(anchors: AnchorHept, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof elliottDoubleCombo = elliottDoubleCombo;\n * // void fn;\n */\nexport function elliottDoubleCombo(\n slotId: string,\n anchors: AnchorHept,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link elliottDoubleCombo}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof elliottDoubleCombo = elliottDoubleCombo;\n * // void fn;\n */\nexport function elliottDoubleCombo(\n arg1: string | AnchorHept,\n arg2?: AnchorHept | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return elliottDoubleComboImpl(arg1, arg2 as AnchorHept, (arg3 ?? {}) as DoubleComboOpts);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (ElliottImpulseWaveDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/elliott-impulse-wave-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorQuint,\n DrawingHandle,\n ElliottImpulseWaveState,\n LineDrawStyle,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.elliottImpulseWave called outside an active script step\";\n\ntype ImpulseOpts = LineDrawStyle & { labels?: ReadonlyArray<string> };\n\nfunction elliottImpulseWaveImpl(\n slotId: string,\n anchors: AnchorQuint,\n opts: ImpulseOpts,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const { labels, ...style } = opts;\n const state: ElliottImpulseWaveState =\n labels === undefined\n ? { kind: \"elliott-impulse-wave\", anchors, style }\n : { kind: \"elliott-impulse-wave\", anchors, labels, style };\n return createDrawingHandle(slotId, subId, \"elliott-impulse-wave\", state);\n}\n\n/**\n * Draw an Elliott five-wave impulse pattern through 5 world anchors\n * `[wave1End, wave2End, wave3End, wave4End, wave5End]`. The renderer\n * strokes the connecting legs (1-2, 2-3, 3-4, 4-5) and labels each\n * pivot. Pass `opts.labels` to override the default `[\"1\", \"2\", \"3\",\n * \"4\", \"5\"]` labels.\n *\n * @anchors `anchors` \u2014 `[wave1End, wave2End, wave3End, wave4End, wave5End]`\n * @anchorCount 5\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.elliottImpulseWave demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.elliottImpulseWave([\n * { time: bar.time, price: bar.low },\n * { time: bar.time + 15_000, price: bar.high },\n * { time: bar.time + 30_000, price: bar.close },\n * { time: bar.time + 45_000, price: bar.high + 1 },\n * { time: bar.time + 60_000, price: bar.close + 0.5 },\n * ]);\n * },\n * });\n */\nexport function elliottImpulseWave(anchors: AnchorQuint, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof elliottImpulseWave = elliottImpulseWave;\n * // void fn;\n */\nexport function elliottImpulseWave(\n slotId: string,\n anchors: AnchorQuint,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link elliottImpulseWave}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof elliottImpulseWave = elliottImpulseWave;\n * // void fn;\n */\nexport function elliottImpulseWave(\n arg1: string | AnchorQuint,\n arg2?: AnchorQuint | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return elliottImpulseWaveImpl(arg1, arg2 as AnchorQuint, (arg3 ?? {}) as ImpulseOpts);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (ElliottTriangleWaveDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/elliott-triangle-wave-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorQuint,\n DrawingHandle,\n ElliottTriangleWaveState,\n LineDrawStyle,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.elliottTriangleWave called outside an active script step\";\n\ntype TriangleOpts = LineDrawStyle & { labels?: ReadonlyArray<string> };\n\nfunction elliottTriangleWaveImpl(\n slotId: string,\n anchors: AnchorQuint,\n opts: TriangleOpts,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const { labels, ...style } = opts;\n const state: ElliottTriangleWaveState =\n labels === undefined\n ? { kind: \"elliott-triangle-wave\", anchors, style }\n : { kind: \"elliott-triangle-wave\", anchors, labels, style };\n return createDrawingHandle(slotId, subId, \"elliott-triangle-wave\", state);\n}\n\n/**\n * Draw an Elliott five-wave triangle correction through 5 world anchors\n * `[a, b, c, d, e]`. The renderer strokes the connecting legs (a-b,\n * b-c, c-d, d-e) and labels each pivot. Pass `opts.labels` to override\n * the default `[\"a\", \"b\", \"c\", \"d\", \"e\"]` labels.\n *\n * @anchors `anchors` \u2014 `[a, b, c, d, e]`\n * @anchorCount 5\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.elliottTriangleWave demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.elliottTriangleWave([\n * { time: bar.time, price: bar.high },\n * { time: bar.time + 15_000, price: bar.low },\n * { time: bar.time + 30_000, price: bar.high - 1 },\n * { time: bar.time + 45_000, price: bar.low + 1 },\n * { time: bar.time + 60_000, price: bar.close },\n * ]);\n * },\n * });\n */\nexport function elliottTriangleWave(anchors: AnchorQuint, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof elliottTriangleWave = elliottTriangleWave;\n * // void fn;\n */\nexport function elliottTriangleWave(\n slotId: string,\n anchors: AnchorQuint,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link elliottTriangleWave}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof elliottTriangleWave = elliottTriangleWave;\n * // void fn;\n */\nexport function elliottTriangleWave(\n arg1: string | AnchorQuint,\n arg2?: AnchorQuint | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return elliottTriangleWaveImpl(arg1, arg2 as AnchorQuint, (arg3 ?? {}) as TriangleOpts);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (ElliottTripleComboDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/elliott-triple-combo-tool.ts.\n// Note: invinite's full schema carries 10 anchors; the landed Task-1\n// `ElliottTripleComboState.anchors: AnchorHept` is a 7-anchor shell\n// \u2014 the additional 3 invinite pivots are flagged as a Task-1 reshape\n// follow-up.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorHept,\n DrawingHandle,\n ElliottTripleComboState,\n LineDrawStyle,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.elliottTripleCombo called outside an active script step\";\n\ntype TripleComboOpts = LineDrawStyle & { labels?: ReadonlyArray<string> };\n\nfunction elliottTripleComboImpl(\n slotId: string,\n anchors: AnchorHept,\n opts: TripleComboOpts,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const { labels, ...style } = opts;\n const state: ElliottTripleComboState =\n labels === undefined\n ? { kind: \"elliott-triple-combo\", anchors, style }\n : { kind: \"elliott-triple-combo\", anchors, labels, style };\n return createDrawingHandle(slotId, subId, \"elliott-triple-combo\", state);\n}\n\n/**\n * Draw an Elliott seven-anchor W-X-Y-X-Z triple-three corrective\n * pattern through 7 world anchors `[start, W-end, X1-end, Y-end,\n * X2-end, Z-mid, Z-end]`. The renderer strokes the 6-leg connecting\n * polyline and labels each pivot. Pass `opts.labels` to override the\n * default `[\"S\", \"W\", \"X1\", \"Y\", \"X2\", \"Zi\", \"Z\"]` labels.\n *\n * @anchors `anchors` \u2014 `[start, W-end, X1-end, Y-end, X2-end, Z-mid, Z-end]`\n * @anchorCount 7\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.elliottTripleCombo demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.elliottTripleCombo([\n * { time: bar.time, price: bar.low },\n * { time: bar.time + 10_000, price: bar.high },\n * { time: bar.time + 20_000, price: bar.close },\n * { time: bar.time + 30_000, price: bar.high + 1 },\n * { time: bar.time + 40_000, price: bar.close - 0.5 },\n * { time: bar.time + 50_000, price: bar.high + 2 },\n * { time: bar.time + 60_000, price: bar.close + 1 },\n * ]);\n * },\n * });\n */\nexport function elliottTripleCombo(anchors: AnchorHept, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof elliottTripleCombo = elliottTripleCombo;\n * // void fn;\n */\nexport function elliottTripleCombo(\n slotId: string,\n anchors: AnchorHept,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link elliottTripleCombo}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof elliottTripleCombo = elliottTripleCombo;\n * // void fn;\n */\nexport function elliottTripleCombo(\n arg1: string | AnchorHept,\n arg2?: AnchorHept | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return elliottTripleComboImpl(arg1, arg2 as AnchorHept, (arg3 ?? {}) as TripleComboOpts);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (FibChannelDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/fib-channel-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorTriple,\n DrawingHandle,\n FibChannelState,\n FibOpts,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.fibChannel called outside an active script step\";\n\nfunction fibChannelImpl(slotId: string, anchors: AnchorTriple, opts: FibOpts): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: FibChannelState = { kind: \"fib-channel\", anchors, style: opts };\n return createDrawingHandle(slotId, subId, \"fib-channel\", state);\n}\n\n/**\n * Draw a Fibonacci channel \u2014 parallel translates of `line(anchors[0],\n * anchors[1])` at fib-ratio offsets through `anchors[2]`. Mirrors\n * invinite's `fib-channel-tool.ts` shape.\n *\n * @anchors `anchors` \u2014 `[A, B, C]` triple\n * @anchorCount 3\n * @bucket other\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.fibChannel demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.fibChannel(\n * [\n * { time: bar.time, price: bar.low },\n * { time: bar.time, price: bar.high },\n * { time: bar.time, price: bar.close },\n * ],\n * { showLabels: true },\n * );\n * },\n * });\n */\nexport function fibChannel(anchors: AnchorTriple, opts?: FibOpts): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof fibChannel = fibChannel;\n * // void fn;\n */\nexport function fibChannel(slotId: string, anchors: AnchorTriple, opts?: FibOpts): DrawingHandle;\n/**\n * Implementation signature for {@link fibChannel}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof fibChannel = fibChannel;\n * // void fn;\n */\nexport function fibChannel(\n arg1: string | AnchorTriple,\n arg2?: AnchorTriple | FibOpts,\n arg3?: FibOpts,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return fibChannelImpl(arg1, arg2 as AnchorTriple, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (FibRetracementDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/fib-retracement-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n FibOpts,\n FibRetracementState,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.fibRetracement called outside an active script step\";\n\nfunction fibRetracementImpl(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts: FibOpts,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: FibRetracementState = {\n kind: \"fib-retracement\",\n anchors: [a, b],\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"fib-retracement\", state);\n}\n\n/**\n * Draw a Fibonacci retracement between two swing-pivot world anchors.\n * Levels default to the canonical `FIB_LEVELS` array when\n * `opts.levels` is omitted; the renderer paints one horizontal line\n * per level between `a.price` and `b.price`. Mirrors invinite's\n * `fib-retracement-tool.ts` shape.\n *\n * @anchors `a`, `b` \u2014 two swing `WorldPoint`s\n * @anchorCount 2\n * @bucket other\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.fibRetracement demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.fibRetracement(\n * { time: bar.time, price: bar.low },\n * { time: bar.time, price: bar.high },\n * { showLabels: true, extendRight: true },\n * );\n * },\n * });\n */\nexport function fibRetracement(a: WorldPoint, b: WorldPoint, opts?: FibOpts): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof fibRetracement = fibRetracement;\n * // void fn;\n */\nexport function fibRetracement(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts?: FibOpts,\n): DrawingHandle;\n/**\n * Implementation signature for {@link fibRetracement}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof fibRetracement = fibRetracement;\n * // void fn;\n */\nexport function fibRetracement(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | FibOpts,\n arg4?: FibOpts,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return fibRetracementImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (FibTimeZoneDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/fib-time-zone-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n FibOpts,\n FibTimeZoneState,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.fibTimeZone called outside an active script step\";\n\nfunction fibTimeZoneImpl(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts: FibOpts,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: FibTimeZoneState = {\n kind: \"fib-time-zone\",\n anchors: [a, b],\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"fib-time-zone\", state);\n}\n\n/**\n * Draw fib-spaced vertical time zones between two world anchors. Each\n * level in `opts.levels ?? FIB_LEVELS` paints a vertical line at\n * `t = a.time + level * (b.time - a.time)`. Mirrors invinite's\n * `fib-time-zone-tool.ts` shape (using the ratio array per the landed\n * core state \u2014 see `tasks/phase-3-drawing-parity/11-fibonacci-a.plan.md`\n * \u00A71 for the spec \u2194 core delta on integer-sequence semantics).\n *\n * @anchors `a`, `b` \u2014 two `WorldPoint`s defining the time span\n * @anchorCount 2\n * @bucket other\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.fibTimeZone demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.fibTimeZone(\n * { time: bar.time, price: bar.close },\n * { time: bar.time + 100_000, price: bar.close },\n * { showLabels: true },\n * );\n * },\n * });\n */\nexport function fibTimeZone(a: WorldPoint, b: WorldPoint, opts?: FibOpts): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof fibTimeZone = fibTimeZone;\n * // void fn;\n */\nexport function fibTimeZone(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts?: FibOpts,\n): DrawingHandle;\n/**\n * Implementation signature for {@link fibTimeZone}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof fibTimeZone = fibTimeZone;\n * // void fn;\n */\nexport function fibTimeZone(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | FibOpts,\n arg4?: FibOpts,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return fibTimeZoneImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (FibTrendExtensionDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/fib-trend-extension-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorTriple,\n DrawingHandle,\n FibOpts,\n FibTrendExtensionState,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.fibTrendExtension called outside an active script step\";\n\nfunction fibTrendExtensionImpl(\n slotId: string,\n anchors: AnchorTriple,\n opts: FibOpts,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: FibTrendExtensionState = {\n kind: \"fib-trend-extension\",\n anchors,\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"fib-trend-extension\", state);\n}\n\n/**\n * Draw a Fibonacci trend extension from three world anchors `[A, B,\n * C]`. The (A\u2192B) leg defines the price delta; each level projects an\n * extension from `C.price` at `level * (B.price - A.price)`. Mirrors\n * invinite's `fib-trend-extension-tool.ts` shape.\n *\n * @anchors `anchors` \u2014 `[A, B, C]` triple (swing pivot, swing target, projection origin)\n * @anchorCount 3\n * @bucket other\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.fibTrendExtension demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.fibTrendExtension(\n * [\n * { time: bar.time, price: bar.low },\n * { time: bar.time, price: bar.high },\n * { time: bar.time, price: bar.close },\n * ],\n * { showLabels: true },\n * );\n * },\n * });\n */\nexport function fibTrendExtension(anchors: AnchorTriple, opts?: FibOpts): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof fibTrendExtension = fibTrendExtension;\n * // void fn;\n */\nexport function fibTrendExtension(\n slotId: string,\n anchors: AnchorTriple,\n opts?: FibOpts,\n): DrawingHandle;\n/**\n * Implementation signature for {@link fibTrendExtension}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof fibTrendExtension = fibTrendExtension;\n * // void fn;\n */\nexport function fibTrendExtension(\n arg1: string | AnchorTriple,\n arg2?: AnchorTriple | FibOpts,\n arg3?: FibOpts,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return fibTrendExtensionImpl(arg1, arg2 as AnchorTriple, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (FibWedgeDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/fib-wedge-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorTriple,\n DrawingHandle,\n FibOpts,\n FibWedgeState,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.fibWedge called outside an active script step\";\n\nfunction fibWedgeImpl(slotId: string, anchors: AnchorTriple, opts: FibOpts): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: FibWedgeState = { kind: \"fib-wedge\", anchors, style: opts };\n return createDrawingHandle(slotId, subId, \"fib-wedge\", state);\n}\n\n/**\n * Draw a Fibonacci wedge \u2014 rays fanning from `anchors[0]` (the pivot)\n * at fib-ratio interpolated angles between the (pivot\u2192`anchors[1]`)\n * and (pivot\u2192`anchors[2]`) directions. Mirrors invinite's\n * `fib-wedge-tool.ts` shape.\n *\n * @anchors `anchors` \u2014 `[pivot, range1, range2]` triple\n * @anchorCount 3\n * @bucket other\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.fibWedge demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.fibWedge(\n * [\n * { time: bar.time, price: bar.close },\n * { time: bar.time + 30_000, price: bar.high },\n * { time: bar.time + 30_000, price: bar.low },\n * ],\n * { showLabels: true },\n * );\n * },\n * });\n */\nexport function fibWedge(anchors: AnchorTriple, opts?: FibOpts): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof fibWedge = fibWedge;\n * // void fn;\n */\nexport function fibWedge(slotId: string, anchors: AnchorTriple, opts?: FibOpts): DrawingHandle;\n/**\n * Implementation signature for {@link fibWedge}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof fibWedge = fibWedge;\n * // void fn;\n */\nexport function fibWedge(\n arg1: string | AnchorTriple,\n arg2?: AnchorTriple | FibOpts,\n arg3?: FibOpts,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return fibWedgeImpl(arg1, arg2 as AnchorTriple, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (FibCirclesDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/fib-circles-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n FibCirclesState,\n FibOpts,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.fibCircles called outside an active script step\";\n\nfunction fibCirclesImpl(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts: FibOpts,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: FibCirclesState = {\n kind: \"fib-circles\",\n anchors: [a, b],\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"fib-circles\", state);\n}\n\n/**\n * Draw concentric Fibonacci circles centred at `a` (the centre) passing\n * through fib-ratio multiples of `|b - a|` (the radius-point distance).\n * Mirrors invinite's `fib-circles-tool.ts` shape. Renderer uses\n * `style.levels ?? FIB_LEVELS` (the ratio array, NOT the integer\n * Fibonacci sequence \u2014 see Task-1 reshape follow-up in\n * `tasks/phase-3-drawing-parity/12-fibonacci-b.plan.md` \u00A74).\n *\n * @anchors `a`, `b` \u2014 two `WorldPoint`s (centre, radius-point)\n * @anchorCount 2\n * @bucket other\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.fibCircles demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.fibCircles(\n * { time: bar.time, price: bar.close },\n * { time: bar.time + 30_000, price: bar.high },\n * { showLabels: true },\n * );\n * },\n * });\n */\nexport function fibCircles(a: WorldPoint, b: WorldPoint, opts?: FibOpts): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof fibCircles = fibCircles;\n * // void fn;\n */\nexport function fibCircles(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts?: FibOpts,\n): DrawingHandle;\n/**\n * Implementation signature for {@link fibCircles}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof fibCircles = fibCircles;\n * // void fn;\n */\nexport function fibCircles(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | FibOpts,\n arg4?: FibOpts,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return fibCirclesImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (FibSpeedArcsDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/fib-speed-arcs-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n FibOpts,\n FibSpeedArcsState,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.fibSpeedArcs called outside an active script step\";\n\nfunction fibSpeedArcsImpl(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts: FibOpts,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: FibSpeedArcsState = {\n kind: \"fib-speed-arcs\",\n anchors: [a, b],\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"fib-speed-arcs\", state);\n}\n\n/**\n * Draw a set of Fibonacci speed-arcs \u2014 concentric circular arcs centred\n * at `a` with radii `level * |b - a|` for each `level` in\n * `opts.levels ?? FIB_LEVELS`. Mirrors invinite's\n * `fib-speed-arcs-tool.ts` shape.\n *\n * @anchors `a`, `b` \u2014 two `WorldPoint`s (centre, edge)\n * @anchorCount 2\n * @bucket other\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.fibSpeedArcs demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.fibSpeedArcs(\n * { time: bar.time, price: bar.close },\n * { time: bar.time + 30_000, price: bar.high },\n * { showLabels: true },\n * );\n * },\n * });\n */\nexport function fibSpeedArcs(a: WorldPoint, b: WorldPoint, opts?: FibOpts): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof fibSpeedArcs = fibSpeedArcs;\n * // void fn;\n */\nexport function fibSpeedArcs(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts?: FibOpts,\n): DrawingHandle;\n/**\n * Implementation signature for {@link fibSpeedArcs}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof fibSpeedArcs = fibSpeedArcs;\n * // void fn;\n */\nexport function fibSpeedArcs(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | FibOpts,\n arg4?: FibOpts,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return fibSpeedArcsImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (FibSpeedFanDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/fib-speed-fan-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n FibOpts,\n FibSpeedFanState,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.fibSpeedFan called outside an active script step\";\n\nfunction fibSpeedFanImpl(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts: FibOpts,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: FibSpeedFanState = {\n kind: \"fib-speed-fan\",\n anchors: [a, b],\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"fib-speed-fan\", state);\n}\n\n/**\n * Draw a Fibonacci speed-fan \u2014 a fan of rays from `a` whose slopes are\n * fib-ratio scalings of the (a\u2192b) slope. Levels default to the\n * canonical `FIB_LEVELS` array when `opts.levels` is omitted. Mirrors\n * invinite's `fib-speed-fan-tool.ts` shape.\n *\n * @anchors `a`, `b` \u2014 two `WorldPoint`s (pivot, reference)\n * @anchorCount 2\n * @bucket other\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.fibSpeedFan demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.fibSpeedFan(\n * { time: bar.time, price: bar.low },\n * { time: bar.time + 30_000, price: bar.high },\n * { showLabels: true },\n * );\n * },\n * });\n */\nexport function fibSpeedFan(a: WorldPoint, b: WorldPoint, opts?: FibOpts): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof fibSpeedFan = fibSpeedFan;\n * // void fn;\n */\nexport function fibSpeedFan(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts?: FibOpts,\n): DrawingHandle;\n/**\n * Implementation signature for {@link fibSpeedFan}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof fibSpeedFan = fibSpeedFan;\n * // void fn;\n */\nexport function fibSpeedFan(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | FibOpts,\n arg4?: FibOpts,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return fibSpeedFanImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (FibSpiralDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/fib-spiral-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n FibOpts,\n FibSpiralState,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.fibSpiral called outside an active script step\";\n\nfunction fibSpiralImpl(slotId: string, a: WorldPoint, b: WorldPoint, opts: FibOpts): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: FibSpiralState = {\n kind: \"fib-spiral\",\n anchors: [a, b],\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"fib-spiral\", state);\n}\n\n/**\n * Draw a Fibonacci (golden) spiral approximated by chained cubic\n * Beziers, one per quarter-turn. The spiral starts at `a` (centre) with\n * initial radius `|b - a|` and scales by \u03C6 \u2248 1.618 per quarter-turn.\n * Mirrors invinite's `fib-spiral-tool.ts` shape. The `counterClockwise`\n * flag from the invinite tool is deferred to a Task-1 reshape (see\n * `tasks/phase-3-drawing-parity/12-fibonacci-b.plan.md` \u00A72); the\n * landed renderer is clockwise-only.\n *\n * @anchors `a`, `b` \u2014 two `WorldPoint`s (centre, initial-radius edge)\n * @anchorCount 2\n * @bucket other\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.fibSpiral demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.fibSpiral(\n * { time: bar.time, price: bar.close },\n * { time: bar.time + 30_000, price: bar.high },\n * );\n * },\n * });\n */\nexport function fibSpiral(a: WorldPoint, b: WorldPoint, opts?: FibOpts): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof fibSpiral = fibSpiral;\n * // void fn;\n */\nexport function fibSpiral(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts?: FibOpts,\n): DrawingHandle;\n/**\n * Implementation signature for {@link fibSpiral}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof fibSpiral = fibSpiral;\n * // void fn;\n */\nexport function fibSpiral(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | FibOpts,\n arg4?: FibOpts,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return fibSpiralImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (FibTrendTimeDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/fib-trend-time-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorTriple,\n DrawingHandle,\n FibOpts,\n FibTrendTimeState,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.fibTrendTime called outside an active script step\";\n\nfunction fibTrendTimeImpl(slotId: string, anchors: AnchorTriple, opts: FibOpts): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: FibTrendTimeState = {\n kind: \"fib-trend-time\",\n anchors,\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"fib-trend-time\", state);\n}\n\n/**\n * Draw fib-spaced vertical time projections from a swing leg. For each\n * `level` in `opts.levels ?? FIB_LEVELS`, paints a vertical line at\n * `t = anchors[2].time + level * (anchors[1].time - anchors[0].time)`.\n * Mirrors invinite's `fib-trend-time-tool.ts` shape using the ratio\n * array (see Task-1 reshape follow-up in\n * `tasks/phase-3-drawing-parity/12-fibonacci-b.plan.md` \u00A78).\n *\n * @anchors `anchors` \u2014 `[A, B, C]` triple (A\u2192B leg defines the time\n * delta; C is the projection origin)\n * @anchorCount 3\n * @bucket other\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.fibTrendTime demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.fibTrendTime(\n * [\n * { time: bar.time, price: bar.low },\n * { time: bar.time + 30_000, price: bar.high },\n * { time: bar.time + 60_000, price: bar.close },\n * ],\n * { showLabels: true },\n * );\n * },\n * });\n */\nexport function fibTrendTime(anchors: AnchorTriple, opts?: FibOpts): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof fibTrendTime = fibTrendTime;\n * // void fn;\n */\nexport function fibTrendTime(slotId: string, anchors: AnchorTriple, opts?: FibOpts): DrawingHandle;\n/**\n * Implementation signature for {@link fibTrendTime}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof fibTrendTime = fibTrendTime;\n * // void fn;\n */\nexport function fibTrendTime(\n arg1: string | AnchorTriple,\n arg2?: AnchorTriple | FibOpts,\n arg3?: FibOpts,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return fibTrendTimeImpl(arg1, arg2 as AnchorTriple, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (GannBoxDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/gann-box-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n GannBoxState,\n LineDrawStyle,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.gannBox called outside an active script step\";\n\nfunction gannBoxImpl(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts: LineDrawStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: GannBoxState = {\n kind: \"gann-box\",\n anchors: [a, b],\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"gann-box\", state);\n}\n\n/**\n * Draw a Gann box \u2014 a ratio grid spanning the bounding rectangle of\n * two world anchors. The renderer paints internal horizontal +\n * vertical subdivisions at the shared `GANN_LEVELS` ratios\n * (`[0, 0.25, 0.5, 0.75, 1.0]`). Mirrors invinite's `gann-box-tool.ts`\n * shape.\n *\n * @anchors `a`, `b` \u2014 two `WorldPoint`s defining the box corners\n * @anchorCount 2\n * @bucket other\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.gannBox demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.gannBox(\n * { time: bar.time, price: bar.low },\n * { time: bar.time + 30_000, price: bar.high },\n * );\n * },\n * });\n */\nexport function gannBox(a: WorldPoint, b: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof gannBox = gannBox;\n * // void fn;\n */\nexport function gannBox(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link gannBox}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof gannBox = gannBox;\n * // void fn;\n */\nexport function gannBox(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | LineDrawStyle,\n arg4?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return gannBoxImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (GannFanDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/gann-fan-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n GannFanState,\n LineDrawStyle,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.gannFan called outside an active script step\";\n\nfunction gannFanImpl(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts: LineDrawStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: GannFanState = {\n kind: \"gann-fan\",\n anchors: [a, b],\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"gann-fan\", state);\n}\n\n/**\n * Draw a Gann fan \u2014 9 rays emanating from `a` at the canonical Gann\n * angles (`1x1`, `1x2`, `1x3`, `2x1`, `3x1`, `1x4`, `4x1`, `1x8`,\n * `8x1`). The 1\u00D71 ray points directly at `b`; the other 8 are slope\n * scalings of the (a\u2192b) direction vector. Mirrors invinite's\n * `gann-fan-tool.ts` shape.\n *\n * @anchors `a`, `b` \u2014 two `WorldPoint`s (pivot, reference)\n * @anchorCount 2\n * @bucket other\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.gannFan demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.gannFan(\n * { time: bar.time, price: bar.low },\n * { time: bar.time + 30_000, price: bar.high },\n * );\n * },\n * });\n */\nexport function gannFan(a: WorldPoint, b: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof gannFan = gannFan;\n * // void fn;\n */\nexport function gannFan(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link gannFan}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof gannFan = gannFan;\n * // void fn;\n */\nexport function gannFan(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | LineDrawStyle,\n arg4?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return gannFanImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (GannSquareDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/gann-square-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n GannSquareState,\n LineDrawStyle,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.gannSquare called outside an active script step\";\n\nfunction gannSquareImpl(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts: LineDrawStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: GannSquareState = {\n kind: \"gann-square\",\n anchors: [a, b],\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"gann-square\", state);\n}\n\n/**\n * Draw a Gann square-of-nine sized by two world anchors. The renderer\n * paints a canvas-space square whose side is `max(|dx|, |dy|)` between\n * the anchors, subdivided by `GANN_LEVELS`. Mirrors invinite's\n * `gann-square-tool.ts` shape.\n *\n * @anchors `a`, `b` \u2014 two `WorldPoint`s\n * @anchorCount 2\n * @bucket other\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.gannSquare demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.gannSquare(\n * { time: bar.time, price: bar.low },\n * { time: bar.time + 30_000, price: bar.high },\n * );\n * },\n * });\n */\nexport function gannSquare(a: WorldPoint, b: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof gannSquare = gannSquare;\n * // void fn;\n */\nexport function gannSquare(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link gannSquare}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof gannSquare = gannSquare;\n * // void fn;\n */\nexport function gannSquare(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | LineDrawStyle,\n arg4?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return gannSquareImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (GannSquareFixedDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/gann-square-fixed-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n GannSquareFixedState,\n LineDrawStyle,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.gannSquareFixed called outside an active script step\";\n\nfunction gannSquareFixedImpl(\n slotId: string,\n anchor: WorldPoint,\n opts: LineDrawStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: GannSquareFixedState = {\n kind: \"gann-square-fixed\",\n anchor,\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"gann-square-fixed\", state);\n}\n\n/**\n * Draw a Gann square-of-nine with a fixed pixel side anchored at a\n * single world point. The renderer paints a `80\u00D780` pixel square\n * subdivided by `GANN_LEVELS`. Mirrors invinite's\n * `gann-square-fixed-tool.ts` shape.\n *\n * @anchors `anchor` \u2014 a single `WorldPoint`\n * @anchorCount 1\n * @bucket other\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.gannSquareFixed demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.gannSquareFixed({ time: bar.time, price: bar.close });\n * },\n * });\n */\nexport function gannSquareFixed(anchor: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof gannSquareFixed = gannSquareFixed;\n * // void fn;\n */\nexport function gannSquareFixed(\n slotId: string,\n anchor: WorldPoint,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link gannSquareFixed}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof gannSquareFixed = gannSquareFixed;\n * // void fn;\n */\nexport function gannSquareFixed(\n arg1: string | WorldPoint,\n arg2?: WorldPoint | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return gannSquareFixedImpl(arg1, arg2 as WorldPoint, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (CrossLineDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/cross-line-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n CrossLineState,\n DrawingHandle,\n LineDrawStyle,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.crossLine called outside an active script step\";\n\nfunction crossLineImpl(slotId: string, anchor: WorldPoint, opts: LineDrawStyle): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: CrossLineState = { kind: \"cross-line\", anchor, style: opts };\n return createDrawingHandle(slotId, subId, \"cross-line\", state);\n}\n\n/**\n * Draw an orthogonal cross \u2014 horizontal + vertical line \u2014 through\n * `anchor`. Both strokes span the full viewport in their respective\n * axes.\n *\n * @anchors `anchor` \u2014 one `WorldPoint`\n * @anchorCount 1\n * @bucket lines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.crossLine demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.crossLine(\n * { time: bar.time, price: bar.close },\n * { color: \"#a855f7\", lineStyle: \"dotted\" },\n * );\n * },\n * });\n */\nexport function crossLine(anchor: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof crossLine = crossLine;\n * // void fn;\n */\nexport function crossLine(slotId: string, anchor: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Implementation signature for {@link crossLine}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof crossLine = crossLine;\n * // void fn;\n */\nexport function crossLine(\n arg1: string | WorldPoint,\n arg2?: WorldPoint | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || typeof arg2 !== \"object\") {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return crossLineImpl(arg1, arg2 as WorldPoint, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (HorizontalLineDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/horizontal-line-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n HorizontalLineState,\n LineDrawStyle,\n Price,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.horizontalLine called outside an active script step\";\n\nfunction horizontalLineImpl(slotId: string, price: Price, opts: LineDrawStyle): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: HorizontalLineState = { kind: \"horizontal-line\", price, style: opts };\n return createDrawingHandle(slotId, subId, \"horizontal-line\", state);\n}\n\n/**\n * Draw a horizontal line at the supplied `price` that spans the full\n * viewport width. The handle is stable across bars per PLAN.md \u00A710.3.\n *\n * @anchors `price` \u2014 a single `Price`\n * @anchorCount 1\n * @bucket lines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.horizontalLine demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.horizontalLine(bar.close, { color: \"#ef4444\", lineStyle: \"dashed\" });\n * },\n * });\n */\nexport function horizontalLine(price: Price, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof horizontalLine = horizontalLine;\n * // void fn;\n */\nexport function horizontalLine(slotId: string, price: Price, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Implementation signature for {@link horizontalLine}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof horizontalLine = horizontalLine;\n * // void fn;\n */\nexport function horizontalLine(\n arg1: string | Price,\n arg2?: Price | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || typeof arg2 !== \"number\") {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return horizontalLineImpl(arg1, arg2, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (HorizontalRayDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/horizontal-ray-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n HorizontalRayState,\n LineDrawStyle,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.horizontalRay called outside an active script step\";\n\nfunction horizontalRayImpl(slotId: string, anchor: WorldPoint, opts: LineDrawStyle): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: HorizontalRayState = { kind: \"horizontal-ray\", anchor, style: opts };\n return createDrawingHandle(slotId, subId, \"horizontal-ray\", state);\n}\n\n/**\n * Draw a horizontal ray starting at `anchor` and extending to the\n * right edge of the viewport at constant price.\n *\n * @anchors `anchor` \u2014 one `WorldPoint`\n * @anchorCount 1\n * @bucket lines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.horizontalRay demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.horizontalRay(\n * { time: bar.time, price: bar.close },\n * { color: \"#10b981\" },\n * );\n * },\n * });\n */\nexport function horizontalRay(anchor: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof horizontalRay = horizontalRay;\n * // void fn;\n */\nexport function horizontalRay(\n slotId: string,\n anchor: WorldPoint,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link horizontalRay}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof horizontalRay = horizontalRay;\n * // void fn;\n */\nexport function horizontalRay(\n arg1: string | WorldPoint,\n arg2?: WorldPoint | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || typeof arg2 !== \"object\") {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return horizontalRayImpl(arg1, arg2 as WorldPoint, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts (LineDrawing),\n// commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/line-tool.ts (base),\n// invinite/src/components/trading-chart/tools/ray-tool.ts (extendRight),\n// invinite/src/components/trading-chart/tools/extended-line-tool.ts\n// (extendLeft + extendRight). Re-licensed MIT for chartlang. See\n// PLAN.md \u00A73.1 + \u00A722.10. Per PLAN.md \u00A73.1 the three invinite tools\n// collapse into one `line` kind on the wire.\n\nimport type {\n DrawingHandle,\n LineDrawStyle,\n LineState,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.line called outside an active script step\";\n\nfunction lineImpl(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts: LineDrawStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: LineState = { kind: \"line\", anchors: [a, b], style: opts };\n return createDrawingHandle(slotId, subId, \"line\", state);\n}\n\n/**\n * Draw a straight line between two world anchors. The invinite `ray`\n * tool collapses into this kind via `style.extendRight: true`; the\n * `extended-line` tool collapses via `extendLeft: true` + `extendRight:\n * true` per PLAN.md \u00A73.1. The handle is stable across bars per \u00A710.3 \u2014\n * subsequent in-bar `update(patch)` calls merge into the slot's state\n * and re-emit the full payload under `op: \"update\"`.\n *\n * @anchors `a`, `b` \u2014 two `WorldPoint`s\n * @anchorCount 2\n * @bucket lines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.line demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.line(\n * { time: bar.time, price: bar.high },\n * { time: bar.time, price: bar.low },\n * { color: \"#3b82f6\" },\n * );\n * },\n * });\n */\nexport function line(a: WorldPoint, b: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload \u2014 Task 2's callsite-id transformer\n * rewrites every script-side `draw.line(a, b, opts)` into\n * `draw.line(slotId, a, b, opts)`.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof line = line;\n * // void fn;\n */\nexport function line(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link line}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof line = line;\n * // void fn;\n */\nexport function line(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | LineDrawStyle,\n arg4?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return lineImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (TrendAngleDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/trend-angle-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n LineDrawStyle,\n TrendAngleState,\n WorldPoint,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.trendAngle called outside an active script step\";\n\nfunction trendAngleImpl(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts: LineDrawStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: TrendAngleState = { kind: \"trend-angle\", anchors: [a, b], style: opts };\n return createDrawingHandle(slotId, subId, \"trend-angle\", state);\n}\n\n/**\n * Draw a line between two anchors plus a small arc + angle label at\n * the `a` anchor. The angle is the screen-space slope between `a`\n * and `b`, formatted as `${value.toFixed(1)}\u00B0`.\n *\n * @anchors `a`, `b` \u2014 two `WorldPoint`s\n * @anchorCount 2\n * @bucket lines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.trendAngle demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.trendAngle(\n * { time: bar.time, price: bar.low },\n * { time: bar.time, price: bar.high },\n * { color: \"#22c55e\" },\n * );\n * },\n * });\n */\nexport function trendAngle(a: WorldPoint, b: WorldPoint, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof trendAngle = trendAngle;\n * // void fn;\n */\nexport function trendAngle(\n slotId: string,\n a: WorldPoint,\n b: WorldPoint,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link trendAngle}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof trendAngle = trendAngle;\n * // void fn;\n */\nexport function trendAngle(\n arg1: string | WorldPoint,\n arg2?: WorldPoint,\n arg3?: WorldPoint | LineDrawStyle,\n arg4?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || arg3 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return trendAngleImpl(arg1, arg2, arg3 as WorldPoint, arg4 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (VerticalLineDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/vertical-line-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n DrawingHandle,\n LineDrawStyle,\n Time,\n VerticalLineState,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.verticalLine called outside an active script step\";\n\nfunction verticalLineImpl(slotId: string, time: Time, opts: LineDrawStyle): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: VerticalLineState = { kind: \"vertical-line\", time, style: opts };\n return createDrawingHandle(slotId, subId, \"vertical-line\", state);\n}\n\n/**\n * Draw a vertical line at the supplied `time` that spans the full\n * viewport height.\n *\n * @anchors `time` \u2014 a single `Time`\n * @anchorCount 1\n * @bucket lines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.verticalLine demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.verticalLine(bar.time, { color: \"#f97316\" });\n * },\n * });\n */\nexport function verticalLine(time: Time, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof verticalLine = verticalLine;\n * // void fn;\n */\nexport function verticalLine(slotId: string, time: Time, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Implementation signature for {@link verticalLine}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof verticalLine = verticalLine;\n * // void fn;\n */\nexport function verticalLine(\n arg1: string | Time,\n arg2?: Time | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || typeof arg2 !== \"number\") {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return verticalLineImpl(arg1, arg2, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (AbcdPatternDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/abcd-pattern-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AbcdPatternState,\n AnchorQuad,\n DrawingHandle,\n LineDrawStyle,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.abcdPattern called outside an active script step\";\n\nfunction abcdPatternImpl(slotId: string, anchors: AnchorQuad, opts: LineDrawStyle): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: AbcdPatternState = { kind: \"abcd-pattern\", anchors, style: opts };\n return createDrawingHandle(slotId, subId, \"abcd-pattern\", state);\n}\n\n/**\n * Draw an ABCD measured-move pattern through 4 world anchors `[A, B,\n * C, D]`. The renderer strokes the connecting legs (A-B, B-C, C-D)\n * and labels each pivot. Mirrors invinite's `abcd-pattern-tool.ts`\n * shape.\n *\n * @anchors `anchors` \u2014 `[A, B, C, D]` quad of world points\n * @anchorCount 4\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.abcdPattern demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.abcdPattern([\n * { time: bar.time, price: bar.low },\n * { time: bar.time + 20_000, price: bar.high },\n * { time: bar.time + 40_000, price: bar.close },\n * { time: bar.time + 60_000, price: bar.high + 1 },\n * ]);\n * },\n * });\n */\nexport function abcdPattern(anchors: AnchorQuad, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof abcdPattern = abcdPattern;\n * // void fn;\n */\nexport function abcdPattern(\n slotId: string,\n anchors: AnchorQuad,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link abcdPattern}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof abcdPattern = abcdPattern;\n * // void fn;\n */\nexport function abcdPattern(\n arg1: string | AnchorQuad,\n arg2?: AnchorQuad | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return abcdPatternImpl(arg1, arg2 as AnchorQuad, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (CypherPatternDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// `cypher-pattern` has no standalone invinite tool \u2014 the UI surface\n// lives in `defineDrawing` (Task 20) only. Hence the provenance\n// header cites only y-doc-bridge.ts (see PLAN.md \u00A73.1).\n// Re-licensed MIT for chartlang.\n\nimport type {\n AnchorQuint,\n CypherPatternState,\n DrawingHandle,\n LineDrawStyle,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.cypherPattern called outside an active script step\";\n\nfunction cypherPatternImpl(\n slotId: string,\n anchors: AnchorQuint,\n opts: LineDrawStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: CypherPatternState = { kind: \"cypher-pattern\", anchors, style: opts };\n return createDrawingHandle(slotId, subId, \"cypher-pattern\", state);\n}\n\n/**\n * Draw a Cypher harmonic pattern through 5 world anchors `[X, A, B, C,\n * D]`. The renderer strokes the connecting legs (X-A, A-B, B-C, C-D)\n * and labels each pivot. Mirrors invinite's `CypherPatternDrawing`\n * schema \u2014 `cypher-pattern` has no standalone tool in invinite, only\n * the y-doc-bridge type; the UI surface lives in `defineDrawing`\n * (Task 20).\n *\n * @anchors `anchors` \u2014 `[X, A, B, C, D]` quint of world points\n * @anchorCount 5\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.cypherPattern demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.cypherPattern([\n * { time: bar.time, price: bar.low },\n * { time: bar.time + 15_000, price: bar.high },\n * { time: bar.time + 30_000, price: bar.close },\n * { time: bar.time + 45_000, price: bar.high - 1 },\n * { time: bar.time + 60_000, price: bar.low + 1 },\n * ]);\n * },\n * });\n */\nexport function cypherPattern(anchors: AnchorQuint, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof cypherPattern = cypherPattern;\n * // void fn;\n */\nexport function cypherPattern(\n slotId: string,\n anchors: AnchorQuint,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link cypherPattern}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof cypherPattern = cypherPattern;\n * // void fn;\n */\nexport function cypherPattern(\n arg1: string | AnchorQuint,\n arg2?: AnchorQuint | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return cypherPatternImpl(arg1, arg2 as AnchorQuint, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (HeadAndShouldersDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/head-and-shoulders-tool.ts.\n// Note: invinite's full schema carries 7 anchors (start, leftShoulder,\n// leftTrough, head, rightTrough, rightShoulder, end). The landed Task-1\n// `HeadAndShouldersState.anchors: AnchorQuint` is a 5-anchor shell\n// (leftShoulder, leftLow, head, rightLow, rightShoulder) \u2014 start/end\n// projection is flagged as a Task-1 reshape follow-up.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorQuint,\n DrawingHandle,\n HeadAndShouldersState,\n LineDrawStyle,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.headAndShoulders called outside an active script step\";\n\nfunction headAndShouldersImpl(\n slotId: string,\n anchors: AnchorQuint,\n opts: LineDrawStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: HeadAndShouldersState = {\n kind: \"head-and-shoulders\",\n anchors,\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"head-and-shoulders\", state);\n}\n\n/**\n * Draw a head-and-shoulders reversal pattern through 5 world anchors\n * `[leftShoulder, leftLow, head, rightLow, rightShoulder]`. The\n * renderer strokes the connecting polyline plus the neckline between\n * the two trough anchors. Mirrors invinite's\n * `head-and-shoulders-tool.ts` shape.\n *\n * @anchors `anchors` \u2014 `[leftShoulder, leftLow, head, rightLow, rightShoulder]`\n * @anchorCount 5\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.headAndShoulders demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.headAndShoulders([\n * { time: bar.time, price: bar.high },\n * { time: bar.time + 15_000, price: bar.low },\n * { time: bar.time + 30_000, price: bar.high + 1 },\n * { time: bar.time + 45_000, price: bar.low },\n * { time: bar.time + 60_000, price: bar.high },\n * ]);\n * },\n * });\n */\nexport function headAndShoulders(anchors: AnchorQuint, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof headAndShoulders = headAndShoulders;\n * // void fn;\n */\nexport function headAndShoulders(\n slotId: string,\n anchors: AnchorQuint,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link headAndShoulders}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof headAndShoulders = headAndShoulders;\n * // void fn;\n */\nexport function headAndShoulders(\n arg1: string | AnchorQuint,\n arg2?: AnchorQuint | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return headAndShouldersImpl(arg1, arg2 as AnchorQuint, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (ThreeDrivesPatternDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/three-drives-pattern-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorHept,\n DrawingHandle,\n LineDrawStyle,\n ThreeDrivesPatternState,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.threeDrivesPattern called outside an active script step\";\n\nfunction threeDrivesPatternImpl(\n slotId: string,\n anchors: AnchorHept,\n opts: LineDrawStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: ThreeDrivesPatternState = {\n kind: \"three-drives-pattern\",\n anchors,\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"three-drives-pattern\", state);\n}\n\n/**\n * Draw a three-drives reversal pattern through 7 world anchors\n * `[start, drive1, retr1, drive2, retr2, drive3, end]`. The renderer\n * strokes the 6-leg open polyline and labels each pivot. Mirrors\n * invinite's `three-drives-pattern-tool.ts` shape.\n *\n * @anchors `anchors` \u2014 `[start, drive1, retr1, drive2, retr2, drive3, end]`\n * @anchorCount 7\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.threeDrivesPattern demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.threeDrivesPattern([\n * { time: bar.time, price: bar.low },\n * { time: bar.time + 10_000, price: bar.high },\n * { time: bar.time + 20_000, price: bar.close },\n * { time: bar.time + 30_000, price: bar.high + 1 },\n * { time: bar.time + 40_000, price: bar.close + 0.5 },\n * { time: bar.time + 50_000, price: bar.high + 2 },\n * { time: bar.time + 60_000, price: bar.close + 1 },\n * ]);\n * },\n * });\n */\nexport function threeDrivesPattern(anchors: AnchorHept, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof threeDrivesPattern = threeDrivesPattern;\n * // void fn;\n */\nexport function threeDrivesPattern(\n slotId: string,\n anchors: AnchorHept,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link threeDrivesPattern}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof threeDrivesPattern = threeDrivesPattern;\n * // void fn;\n */\nexport function threeDrivesPattern(\n arg1: string | AnchorHept,\n arg2?: AnchorHept | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return threeDrivesPatternImpl(arg1, arg2 as AnchorHept, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (TrianglePatternDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/triangle-pattern-tool.ts.\n// Note: invinite's full schema carries 4 anchors (a, b, c, d). The\n// landed Task-1 `TrianglePatternState.anchors: AnchorTriple` is a\n// 3-anchor shell `[apex, baseHigh, baseLow]` \u2014 the 4th anchor is\n// flagged as a Task-1 reshape follow-up. The kind is distinct from\n// `draw.triangle` (Task 6), a 3-anchor solid-shape primitive \u2014 this\n// is the 3-anchor harmonic-pattern outline.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorTriple,\n DrawingHandle,\n LineDrawStyle,\n TrianglePatternState,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.trianglePattern called outside an active script step\";\n\nfunction trianglePatternImpl(\n slotId: string,\n anchors: AnchorTriple,\n opts: LineDrawStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: TrianglePatternState = {\n kind: \"triangle-pattern\",\n anchors,\n style: opts,\n };\n return createDrawingHandle(slotId, subId, \"triangle-pattern\", state);\n}\n\n/**\n * Draw a triangle pattern (ascending / descending / symmetrical)\n * through 3 world anchors `[apex, baseHigh, baseLow]`. The renderer\n * strokes the 3-vertex closed polygon and labels each pivot.\n * **Distinct from `draw.triangle`** (Task 6, a solid-shape primitive\n * with ShapeStyle); this is the harmonic-pattern outline with\n * LineDrawStyle. Mirrors invinite's `triangle-pattern-tool.ts` shape.\n *\n * @anchors `anchors` \u2014 `[apex, baseHigh, baseLow]` triple\n * @anchorCount 3\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.trianglePattern demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.trianglePattern([\n * { time: bar.time + 60_000, price: bar.close },\n * { time: bar.time, price: bar.high },\n * { time: bar.time, price: bar.low },\n * ]);\n * },\n * });\n */\nexport function trianglePattern(anchors: AnchorTriple, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof trianglePattern = trianglePattern;\n * // void fn;\n */\nexport function trianglePattern(\n slotId: string,\n anchors: AnchorTriple,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link trianglePattern}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof trianglePattern = trianglePattern;\n * // void fn;\n */\nexport function trianglePattern(\n arg1: string | AnchorTriple,\n arg2?: AnchorTriple | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return trianglePatternImpl(arg1, arg2 as AnchorTriple, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (XabcdPatternDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/xabcd-pattern-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorQuint,\n DrawingHandle,\n LineDrawStyle,\n XabcdPatternState,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.xabcdPattern called outside an active script step\";\n\nfunction xabcdPatternImpl(\n slotId: string,\n anchors: AnchorQuint,\n opts: LineDrawStyle,\n): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: XabcdPatternState = { kind: \"xabcd-pattern\", anchors, style: opts };\n return createDrawingHandle(slotId, subId, \"xabcd-pattern\", state);\n}\n\n/**\n * Draw an XABCD harmonic pattern through 5 world anchors `[X, A, B, C,\n * D]`. The renderer strokes the connecting legs (X-A, A-B, B-C, C-D)\n * and labels each pivot. Mirrors invinite's `xabcd-pattern-tool.ts`\n * shape.\n *\n * @anchors `anchors` \u2014 `[X, A, B, C, D]` quint of world points\n * @anchorCount 5\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.xabcdPattern demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.xabcdPattern([\n * { time: bar.time, price: bar.low },\n * { time: bar.time + 15_000, price: bar.high },\n * { time: bar.time + 30_000, price: bar.close },\n * { time: bar.time + 45_000, price: bar.high - 1 },\n * { time: bar.time + 60_000, price: bar.low + 1 },\n * ]);\n * },\n * });\n */\nexport function xabcdPattern(anchors: AnchorQuint, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof xabcdPattern = xabcdPattern;\n * // void fn;\n */\nexport function xabcdPattern(\n slotId: string,\n anchors: AnchorQuint,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link xabcdPattern}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof xabcdPattern = xabcdPattern;\n * // void fn;\n */\nexport function xabcdPattern(\n arg1: string | AnchorQuint,\n arg2?: AnchorQuint | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return xabcdPatternImpl(arg1, arg2 as AnchorQuint, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (PitchfanDrawing), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/pitchfan-tool.ts.\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorTriple,\n DrawingHandle,\n LineDrawStyle,\n PitchfanState,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.pitchfan called outside an active script step\";\n\nfunction pitchfanImpl(slotId: string, anchors: AnchorTriple, opts: LineDrawStyle): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: PitchfanState = { kind: \"pitchfan\", anchors, style: opts };\n return createDrawingHandle(slotId, subId, \"pitchfan\", state);\n}\n\n/**\n * Draw a pitchfan \u2014 three rays from `anchors[0]` through `anchors[1]`,\n * `midpoint(anchors[1], anchors[2])`, and `anchors[2]`. Unlike a\n * pitchfork the rays diverge from a single pivot rather than forming\n * parallel rails. Mirrors invinite's `pitchfan-tool.ts` shape.\n *\n * @anchors `anchors` \u2014 `[pivot, high, low]` triple\n * @anchorCount 3\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.pitchfan demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.pitchfan([\n * { time: bar.time, price: bar.low },\n * { time: bar.time + 30_000, price: bar.high },\n * { time: bar.time + 60_000, price: bar.close },\n * ]);\n * },\n * });\n */\nexport function pitchfan(anchors: AnchorTriple, opts?: LineDrawStyle): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof pitchfan = pitchfan;\n * // void fn;\n */\nexport function pitchfan(\n slotId: string,\n anchors: AnchorTriple,\n opts?: LineDrawStyle,\n): DrawingHandle;\n/**\n * Implementation signature for {@link pitchfan}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof pitchfan = pitchfan;\n * // void fn;\n */\nexport function pitchfan(\n arg1: string | AnchorTriple,\n arg2?: AnchorTriple | LineDrawStyle,\n arg3?: LineDrawStyle,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return pitchfanImpl(arg1, arg2 as AnchorTriple, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Anchors + state shape ported from\n// invinite/shared/trading-chart-collab-yjs/y-doc-bridge.ts\n// (PitchforkDrawing + PitchforkVariant), commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite.\n// Behaviour from\n// invinite/src/components/trading-chart/tools/pitchfork-tool.ts +\n// invinite/src/components/trading-chart/tools/schiff-pitchfork-tool.ts +\n// invinite/src/components/trading-chart/tools/modified-schiff-pitchfork-tool.ts +\n// invinite/src/components/trading-chart/tools/inside-pitchfork-tool.ts\n// (4 tools collapsed into one kind per PLAN.md \u00A73.1).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 + \u00A722.10.\n\nimport type {\n AnchorTriple,\n DrawingHandle,\n LineDrawStyle,\n PitchforkState,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.pitchfork called outside an active script step\";\n\ntype PitchforkVariant = PitchforkState[\"variant\"];\n\ntype PitchforkOpts = LineDrawStyle & { readonly variant?: PitchforkVariant };\n\nfunction pitchforkImpl(slotId: string, anchors: AnchorTriple, opts: PitchforkOpts): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const { variant: variantOpt, ...style } = opts;\n const state: PitchforkState = {\n kind: \"pitchfork\",\n anchors,\n variant: variantOpt ?? \"standard\",\n style,\n };\n return createDrawingHandle(slotId, subId, \"pitchfork\", state);\n}\n\n/**\n * Draw an Andrews pitchfork from three world anchors `[a, b, c]`. The\n * `variant` opt selects one of four median-origin formulas:\n * `\"standard\"` (median from `a` to `mid(b, c)`); `\"schiff\"` (median\n * origin at `(a.time, mid(a.price, mid(b, c).price))`);\n * `\"modifiedSchiff\"` (median origin at `mid(a, b)`); `\"inside\"`\n * (median origin at `mid(b, c)` with the `(a \u2192 mid(a, b))` direction).\n * Default variant: `\"standard\"`. Mirrors invinite's four pitchfork\n * tools collapsed into one kind per PLAN.md \u00A73.1.\n *\n * @anchors `anchors` \u2014 `[pivot, high, low]` triple\n * @anchorCount 3\n * @bucket polylines\n * @since 0.3\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.pitchfork demo\",\n * apiVersion: 1,\n * compute({ bar, draw }) {\n * draw.pitchfork(\n * [\n * { time: bar.time, price: bar.low },\n * { time: bar.time + 30_000, price: bar.high },\n * { time: bar.time + 60_000, price: bar.close },\n * ],\n * { variant: \"modifiedSchiff\" },\n * );\n * },\n * });\n */\nexport function pitchfork(anchors: AnchorTriple, opts?: PitchforkOpts): DrawingHandle;\n/**\n * Compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof pitchfork = pitchfork;\n * // void fn;\n */\nexport function pitchfork(\n slotId: string,\n anchors: AnchorTriple,\n opts?: PitchforkOpts,\n): DrawingHandle;\n/**\n * Implementation signature for {@link pitchfork}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.3\n * @stable\n * @example\n * // const fn: typeof pitchfork = pitchfork;\n * // void fn;\n */\nexport function pitchfork(\n arg1: string | AnchorTriple,\n arg2?: AnchorTriple | PitchforkOpts,\n arg3?: PitchforkOpts,\n): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined || !Array.isArray(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return pitchforkImpl(arg1, arg2 as AnchorTriple, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { DrawingHandle, TableOpts, TableState } from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../../../runtimeContext.js\";\nimport { createDrawingHandle } from \"../handle.js\";\nimport { nextSubId } from \"../subIdAllocator.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"draw.table called outside an active script step\";\n\nfunction tableImpl(slotId: string, opts: TableOpts): DrawingHandle {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) throw new Error(OUTSIDE_CTX_MESSAGE);\n const subId = nextSubId(ctx, slotId);\n const state: TableState = {\n kind: \"table\",\n position: opts.position,\n cells: opts.cells,\n ...(opts.borderColor === undefined ? {} : { borderColor: opts.borderColor }),\n ...(opts.borderWidth === undefined ? {} : { borderWidth: opts.borderWidth }),\n ...(opts.frame === undefined ? {} : { frame: opts.frame }),\n };\n return createDrawingHandle(slotId, subId, \"table\", state);\n}\n\n/**\n * Draw a CSS-pixel viewport-anchored table. Unlike world-space\n * drawings, `draw.table` carries no `WorldPoint` anchor; adapters\n * resolve `position` against the visible viewport per PLAN.md \u00A710.2.\n *\n * @anchors `position` \u2014 CSS viewport anchor; `cells` \u2014 2D grid payload\n * @anchorCount 0 (viewport anchored)\n * @bucket other\n * @since 0.5\n * @stable\n * @example\n * import { defineIndicator } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"draw.table demo\",\n * apiVersion: 1,\n * compute({ draw }) {\n * draw.table({\n * position: \"top-right\",\n * cells: [[{ text: \"P&L\" }, { text: \"+12.5%\", textColor: \"#16a34a\" }]],\n * });\n * },\n * });\n */\nexport function table(opts: TableOpts): DrawingHandle;\n/**\n * Compiler-injected overload \u2014 the callsite-id transformer rewrites\n * every script-side `draw.table(opts)` into\n * `draw.table(slotId, opts)`.\n *\n * @since 0.5\n * @stable\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof table = table;\n * // void fn;\n */\nexport function table(slotId: string, opts: TableOpts): DrawingHandle;\n/**\n * Implementation signature for {@link table}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.5\n * @stable\n * @example\n * // const fn: typeof table = table;\n * // void fn;\n */\nexport function table(arg1: string | TableOpts, arg2?: TableOpts): DrawingHandle {\n if (typeof arg1 !== \"string\" || arg2 === undefined) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n return tableImpl(arg1, arg2);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { DrawNamespace } from \"@invinite-org/chartlang-core\";\nimport { draw as CORE_DRAW_STUB } from \"@invinite-org/chartlang-core\";\n\nimport { arrow } from \"./annotations/arrow.js\";\nimport { arrowMarkDown } from \"./annotations/arrowMarkDown.js\";\nimport { arrowMarkUp } from \"./annotations/arrowMarkUp.js\";\nimport { arrowMarker } from \"./annotations/arrowMarker.js\";\nimport { text } from \"./annotations/text.js\";\nimport { circle } from \"./boxes/circle.js\";\nimport { ellipse } from \"./boxes/ellipse.js\";\nimport { marker } from \"./boxes/marker.js\";\nimport { path } from \"./boxes/path.js\";\nimport { polyline } from \"./boxes/polyline.js\";\nimport { rectangle } from \"./boxes/rectangle.js\";\nimport { rotatedRectangle } from \"./boxes/rotatedRectangle.js\";\nimport { triangle } from \"./boxes/triangle.js\";\nimport { disjointChannel } from \"./channels/disjointChannel.js\";\nimport { flatTopBottom } from \"./channels/flatTopBottom.js\";\nimport { regressionTrend } from \"./channels/regressionTrend.js\";\nimport { trendChannel } from \"./channels/trendChannel.js\";\nimport { frame } from \"./containers/frame.js\";\nimport { group } from \"./containers/group.js\";\nimport { arc } from \"./curves/arc.js\";\nimport { brush } from \"./curves/brush.js\";\nimport { curve } from \"./curves/curve.js\";\nimport { doubleCurve } from \"./curves/doubleCurve.js\";\nimport { highlighter } from \"./curves/highlighter.js\";\nimport { pen } from \"./curves/pen.js\";\nimport { cyclicLines } from \"./cycles/cyclicLines.js\";\nimport { sineLine } from \"./cycles/sineLine.js\";\nimport { timeCycles } from \"./cycles/timeCycles.js\";\nimport { elliottCorrectionWave } from \"./elliott/elliottCorrectionWave.js\";\nimport { elliottDoubleCombo } from \"./elliott/elliottDoubleCombo.js\";\nimport { elliottImpulseWave } from \"./elliott/elliottImpulseWave.js\";\nimport { elliottTriangleWave } from \"./elliott/elliottTriangleWave.js\";\nimport { elliottTripleCombo } from \"./elliott/elliottTripleCombo.js\";\nimport { fibChannel } from \"./fibA/fibChannel.js\";\nimport { fibRetracement } from \"./fibA/fibRetracement.js\";\nimport { fibTimeZone } from \"./fibA/fibTimeZone.js\";\nimport { fibTrendExtension } from \"./fibA/fibTrendExtension.js\";\nimport { fibWedge } from \"./fibA/fibWedge.js\";\nimport { fibCircles } from \"./fibB/fibCircles.js\";\nimport { fibSpeedArcs } from \"./fibB/fibSpeedArcs.js\";\nimport { fibSpeedFan } from \"./fibB/fibSpeedFan.js\";\nimport { fibSpiral } from \"./fibB/fibSpiral.js\";\nimport { fibTrendTime } from \"./fibB/fibTrendTime.js\";\nimport { gannBox } from \"./gann/gannBox.js\";\nimport { gannFan } from \"./gann/gannFan.js\";\nimport { gannSquare } from \"./gann/gannSquare.js\";\nimport { gannSquareFixed } from \"./gann/gannSquareFixed.js\";\nimport { crossLine } from \"./lines/crossLine.js\";\nimport { horizontalLine } from \"./lines/horizontalLine.js\";\nimport { horizontalRay } from \"./lines/horizontalRay.js\";\nimport { line } from \"./lines/line.js\";\nimport { trendAngle } from \"./lines/trendAngle.js\";\nimport { verticalLine } from \"./lines/verticalLine.js\";\nimport { abcdPattern } from \"./patterns/abcdPattern.js\";\nimport { cypherPattern } from \"./patterns/cypherPattern.js\";\nimport { headAndShoulders } from \"./patterns/headAndShoulders.js\";\nimport { threeDrivesPattern } from \"./patterns/threeDrivesPattern.js\";\nimport { trianglePattern } from \"./patterns/trianglePattern.js\";\nimport { xabcdPattern } from \"./patterns/xabcdPattern.js\";\nimport { pitchfan } from \"./pitchforks/pitchfan.js\";\nimport { pitchfork } from \"./pitchforks/pitchfork.js\";\nimport { table } from \"./table/table.js\";\n\nconst KIND_IMPLS = {\n // Task 5 \u2014 Lines/Rays\n line,\n horizontalLine,\n horizontalRay,\n verticalLine,\n crossLine,\n trendAngle,\n // Task 6 \u2014 Boxes A\n rectangle,\n rotatedRectangle,\n triangle,\n polyline,\n // Task 7 \u2014 Boxes B\n circle,\n ellipse,\n path,\n marker,\n // Task 8 \u2014 Curves\n arc,\n curve,\n doubleCurve,\n // Task 8 \u2014 Freehand\n pen,\n highlighter,\n brush,\n // Task 9 \u2014 Annotations\n text,\n arrow,\n arrowMarker,\n arrowMarkUp,\n arrowMarkDown,\n // Task 10 \u2014 Channels\n trendChannel,\n flatTopBottom,\n disjointChannel,\n regressionTrend,\n // Task 11 \u2014 Fibonacci A\n fibRetracement,\n fibTrendExtension,\n fibChannel,\n fibTimeZone,\n fibWedge,\n // Task 12 \u2014 Fibonacci B\n fibSpeedFan,\n fibSpeedArcs,\n fibSpiral,\n fibCircles,\n fibTrendTime,\n // Task 13 \u2014 Gann\n gannBox,\n gannSquareFixed,\n gannSquare,\n gannFan,\n // Task 14 \u2014 Pitchforks\n pitchfork,\n pitchfan,\n // Task 15 \u2014 Harmonic Patterns\n xabcdPattern,\n cypherPattern,\n headAndShoulders,\n abcdPattern,\n trianglePattern,\n threeDrivesPattern,\n // Task 16 \u2014 Elliott Waves\n elliottImpulseWave,\n elliottCorrectionWave,\n elliottTriangleWave,\n elliottDoubleCombo,\n elliottTripleCombo,\n // Task 17 \u2014 Cycles\n cyclicLines,\n timeCycles,\n sineLine,\n // Task 18 \u2014 Containers\n group,\n frame,\n // Phase 5 \u2014 Viewport overlays\n table,\n} as const;\n\nconst IMPL_KIND_NAMES: ReadonlySet<string> = new Set(Object.keys(KIND_IMPLS));\n\n/**\n * Runtime `draw` namespace. After Task 18 every one of the 61\n * `DrawingKind`s has a real per-kind impl wired into `KIND_IMPLS`;\n * Phase 5 adds the viewport-anchored `table` kind.\n * the Proxy's `else` branch (fall-through to the core throwing-stub\n * Proxy) is dead code at runtime \u2014 kept as defence-in-depth for\n * unknown property access (e.g. JS code accessing a property name\n * outside the `DrawNamespace` type surface).\n *\n * Each per-kind impl is the compiler-injected overload \u2014 the\n * dispatch branches on `typeof arg1 === \"string\"` to discriminate the\n * slot-id-prefixed compiler form from the bare script-facing form\n * which always throws. This is the Phase-3 swap seam for the\n * `primitives.ts:draw` re-export, mirroring how `TA_REGISTRY` swaps\n * in Phase 2 (PLAN.md \u00A75.5).\n *\n * @since 0.3\n * @stable\n * @example\n * import { draw } from \"@invinite-org/chartlang-runtime\";\n * // type S = typeof draw;\n * void draw;\n */\nexport const DRAW_NAMESPACE: DrawNamespace = new Proxy(KIND_IMPLS as unknown as DrawNamespace, {\n get(target, property): unknown {\n const name = String(property);\n if (IMPL_KIND_NAMES.has(name)) {\n return Reflect.get(target, property);\n }\n // After Task 18 every `DrawingKind` has a real impl in\n // `KIND_IMPLS` so this branch is unreachable through the\n // `DrawNamespace` type surface \u2014 it stays as defence-in-depth\n // for non-kind property access (e.g. JS code that reads\n // `draw[\"foo\"]` through a typed-erased view). Falling through\n // to core's throwing-stub keeps the failure mode consistent\n // with the pre-Task-18 behaviour.\n return Reflect.get(CORE_DRAW_STUB, property);\n },\n});\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { HLineOpts } from \"@invinite-org/chartlang-core\";\nimport type { PlotEmission, PlotStyle } from \"@invinite-org/chartlang-adapter-kit\";\n\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { pushDiagnostic, pushPlot } from \"./emissionsQueue.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"hline called outside an active script step\";\n\nfunction hlineImpl(ctx: RuntimeContext, slotId: string, price: number, opts: HLineOpts): void {\n const style: PlotStyle = {\n kind: \"horizontal-line\",\n lineWidth: opts.lineWidth ?? 1,\n lineStyle: opts.lineStyle ?? \"solid\",\n };\n\n if (!ctx.capabilities.plots.has(\"horizontal-line\")) {\n pushDiagnostic(ctx.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"unsupported-plot-kind\",\n message: 'Adapter cannot render plot kind \"horizontal-line\".',\n slotId,\n bar: ctx.barIndex(),\n });\n return;\n }\n\n const emission: PlotEmission = {\n kind: \"plot\",\n slotId,\n title: opts.title ?? \"\",\n style,\n bar: ctx.barIndex(),\n time: ctx.stream.bar.time,\n value: Number.isFinite(price) ? price : null,\n color: opts.color ?? null,\n meta: {},\n pane: \"overlay\",\n };\n\n pushPlot(ctx.emissions, emission);\n}\n\n/**\n * Emit a horizontal-line plot pinned at the supplied `price`\n * (script-facing overload).\n *\n * Same dual-signature contract as {@link plot}: scripts call\n * `hline(price, opts?)`; the compiler's callsite-id transformer (Task 2)\n * rewrites every call to `hline(slotId, price, opts?)` (the sibling\n * overload). Direct invocation without a slot id throws the sentinel\n * error.\n *\n * `hline` is fixed to `pane: \"overlay\"` \u2014 horizontal lines never\n * route to a sub-pane in any phase. The `kind` discriminator is\n * always `\"horizontal-line\"`; adapters that don't declare the\n * capability drop with `unsupported-plot-kind`.\n *\n * @since 0.1\n * @example\n * import { defineIndicator, hline } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"RSI bounds\",\n * apiVersion: 1,\n * compute() {\n * hline(70, { color: \"#ef4444\", title: \"Overbought\" });\n * hline(30, { color: \"#10b981\", title: \"Oversold\" });\n * },\n * });\n */\nexport function hline(price: number, opts?: HLineOpts): void;\n/**\n * Emit a horizontal-line plot for the current bar (compiler-injected\n * overload). Task 2's transformer rewrites script-side `hline(price)`\n * into `hline(slotId, price)`.\n *\n * @since 0.1\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite.\n * // const fn: typeof hline = hline;\n * // void fn;\n */\nexport function hline(slotId: string, price: number, opts?: HLineOpts): void;\n/**\n * Implementation signature for {@link hline}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.1\n * @example\n * // const fn: typeof hline = hline;\n * // void fn;\n */\nexport function hline(arg1: string | number, arg2?: number | HLineOpts, arg3?: HLineOpts): void {\n if (typeof arg1 !== \"string\") {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (!ctx) throw new Error(OUTSIDE_CTX_MESSAGE);\n if (typeof arg2 !== \"number\") {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n hlineImpl(ctx, arg1, arg2, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nconst RUNTIME_ERROR_SENTINEL = Symbol(\"runtime-error-halt\");\n\ntype RuntimeErrorHalt = Readonly<{\n sentinel: typeof RUNTIME_ERROR_SENTINEL;\n message: string;\n}>;\n\n/**\n * Create the private sentinel thrown by `runtime.error(...)`.\n *\n * @since 0.5\n * @stable\n * @example\n * const halt = makeRuntimeErrorHalt(\"invariant\");\n * void halt;\n */\nexport function makeRuntimeErrorHalt(message: string): RuntimeErrorHalt {\n return Object.freeze({ sentinel: RUNTIME_ERROR_SENTINEL, message });\n}\n\n/**\n * Identify the private `runtime.error(...)` halt sentinel.\n *\n * @since 0.5\n * @stable\n * @example\n * const hit = isRuntimeErrorHalt(makeRuntimeErrorHalt(\"x\"));\n * void hit;\n */\nexport function isRuntimeErrorHalt(err: unknown): err is RuntimeErrorHalt {\n return (\n typeof err === \"object\" &&\n err !== null &&\n \"sentinel\" in err &&\n (err as { readonly sentinel?: unknown }).sentinel === RUNTIME_ERROR_SENTINEL &&\n \"message\" in err &&\n typeof (err as { readonly message?: unknown }).message === \"string\"\n );\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { JsonValue, LogLevel, RuntimeNamespace } from \"@invinite-org/chartlang-core\";\nimport type { LogEmission } from \"@invinite-org/chartlang-adapter-kit\";\n\nimport type { RuntimeContext } from \"../runtimeContext.js\";\nimport { pushDiagnostic, pushLog } from \"./emissionsQueue.js\";\nimport { makeRuntimeErrorHalt } from \"./runtimeError.js\";\n\nconst MAX_LOGS_PER_STEP = 1000;\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n if (typeof v !== \"object\" || v === null) return false;\n const proto = Object.getPrototypeOf(v);\n return proto === Object.prototype || proto === null;\n}\n\nfunction isJsonValue(v: unknown): v is JsonValue {\n if (v === null) return true;\n const t = typeof v;\n if (t === \"boolean\" || t === \"string\") return true;\n if (t === \"number\") return Number.isFinite(v);\n if (Array.isArray(v)) return v.every(isJsonValue);\n if (!isPlainObject(v)) return false;\n for (const key of Object.keys(v)) {\n let child: unknown;\n try {\n child = Reflect.get(v, key);\n } catch {\n return false;\n }\n if (!isJsonValue(child)) return false;\n }\n return true;\n}\n\nfunction snapshotJsonValue(value: JsonValue): JsonValue {\n if (Array.isArray(value)) {\n return Object.freeze(value.map((item) => snapshotJsonValue(item)));\n }\n if (isPlainObject(value)) {\n const entries = Object.entries(value).map(([key, item]) => [\n key,\n snapshotJsonValue(item as JsonValue),\n ]);\n return Object.freeze(Object.fromEntries(entries)) as JsonValue;\n }\n return value;\n}\n\nfunction snapshotMeta(\n meta: Readonly<Record<string, JsonValue>>,\n): Readonly<Record<string, JsonValue>> {\n return snapshotJsonValue(meta) as Readonly<Record<string, JsonValue>>;\n}\n\nfunction diagnoseLogBudget(ctx: RuntimeContext): void {\n if (ctx.logBudgetExceededDiagnosed) return;\n ctx.logBudgetExceededDiagnosed = true;\n pushDiagnostic(ctx.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"runtime-log-budget-exceeded\",\n message:\n \"runtime.log.* emitted more than 1000 messages in one compute step; later logs were dropped.\",\n slotId: null,\n bar: ctx.barIndex(),\n });\n}\n\n/**\n * Emit one `runtime.log.*` message for the active compute step.\n *\n * @since 0.5\n * @stable\n * @example\n * // emitLog(ctx, \"info\", \"ready\");\n * const fn: typeof emitLog = emitLog;\n * void fn;\n */\nexport function emitLog(\n ctx: RuntimeContext,\n level: LogLevel,\n message: string,\n meta?: Readonly<Record<string, JsonValue>>,\n): void {\n if (!ctx.capabilities.logs) return;\n if (ctx.logBudget >= MAX_LOGS_PER_STEP) {\n diagnoseLogBudget(ctx);\n return;\n }\n if (meta !== undefined && !isJsonValue(meta)) {\n pushDiagnostic(ctx.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"malformed-log-meta\",\n message: \"runtime.log.* meta must be JSON-serialisable.\",\n slotId: null,\n bar: ctx.barIndex(),\n });\n return;\n }\n const emission: LogEmission = {\n kind: \"log\",\n level,\n message,\n ...(meta === undefined ? {} : { meta: snapshotMeta(meta) }),\n bar: ctx.barIndex(),\n time: ctx.stream.bar.time,\n };\n ctx.logBudget += 1;\n pushLog(ctx.emissions, emission);\n}\n\n/**\n * Build the script-facing runtime namespace bound to a runtime context.\n *\n * @since 0.5\n * @stable\n * @example\n * // const ns = buildRuntimeNamespace(ctx);\n * const fn: typeof buildRuntimeNamespace = buildRuntimeNamespace;\n * void fn;\n */\nexport function buildRuntimeNamespace(ctx: RuntimeContext): RuntimeNamespace {\n return Object.freeze({\n log: Object.freeze({\n info: (message: string, meta?: Readonly<Record<string, JsonValue>>) =>\n emitLog(ctx, \"info\", message, meta),\n warn: (message: string, meta?: Readonly<Record<string, JsonValue>>) =>\n emitLog(ctx, \"warn\", message, meta),\n error: (message: string, meta?: Readonly<Record<string, JsonValue>>) =>\n emitLog(ctx, \"error\", message, meta),\n }),\n error: (message) => {\n throw makeRuntimeErrorHalt(message);\n },\n });\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { RuntimeContext } from \"../runtimeContext.js\";\nimport { pushDiagnostic } from \"./emissionsQueue.js\";\n\n/**\n * Resolve the pane requested by a `plot()` call against the Phase-1\n * runtime contract: every non-`\"overlay\"` pane folds back to\n * `\"overlay\"` and a `unsupported-pane` diagnostic is pushed.\n *\n * Phase 1's canvas2d adapter declares `subPanes: 0`; even adapters\n * that grow `subPanes >= 1` later get the runtime fold until Phase 2\n * lights up sub-pane routing. The two branches differ only in the\n * diagnostic `message` \u2014 both still return `\"overlay\"`.\n *\n * @since 0.1\n * @example\n * // import { resolvePane } from \"@invinite-org/chartlang-runtime/emit\";\n * // const pane = resolvePane(undefined, ctx, \"demo.ts:1:1#0\");\n * // pane === \"overlay\"\n */\nexport function resolvePane(\n requested: string | undefined,\n ctx: RuntimeContext,\n slotId: string,\n): \"overlay\" {\n const pane = requested ?? \"overlay\";\n if (pane === \"overlay\") return \"overlay\";\n if (ctx.capabilities.subPanes >= 1) {\n pushDiagnostic(ctx.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"unsupported-pane\",\n message: `Pane \"${pane}\" requested but Phase-1 runtime flattens to overlay.`,\n slotId,\n bar: ctx.barIndex(),\n });\n return \"overlay\";\n }\n pushDiagnostic(ctx.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"unsupported-pane\",\n message: `Adapter declares subPanes: 0; pane \"${pane}\" folded to overlay.`,\n slotId,\n bar: ctx.barIndex(),\n });\n return \"overlay\";\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { PlotOpts, Series } from \"@invinite-org/chartlang-core\";\nimport type { PlotEmission, PlotStyle } from \"@invinite-org/chartlang-adapter-kit\";\n\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { pushDiagnostic, pushPlot } from \"./emissionsQueue.js\";\nimport { resolvePane } from \"./paneResolver.js\";\n\nconst OUTSIDE_CTX_MESSAGE = \"plot called outside an active script step\";\n\nfunction isSeriesNumber(v: unknown): v is Series<number> {\n return typeof v === \"object\" && v !== null && \"current\" in v;\n}\n\nfunction isNumberOrSeries(v: unknown): v is number | Series<number> {\n return typeof v === \"number\" || isSeriesNumber(v);\n}\n\nfunction resolveValue(value: number | Series<number>): number | null {\n const resolved = typeof value === \"number\" ? value : value.current;\n return Number.isFinite(resolved) ? resolved : null;\n}\n\nfunction buildStyle(opts: PlotOpts): PlotStyle {\n const style = opts.style;\n if (style === undefined) {\n return {\n kind: \"line\",\n lineWidth: opts.lineWidth ?? 1,\n lineStyle: opts.lineStyle ?? \"solid\",\n };\n }\n switch (style.kind) {\n case \"histogram\":\n return { kind: \"histogram\", baseline: style.baseline ?? 0 };\n case \"marker\":\n return { kind: \"marker\", shape: style.shape, size: style.size };\n case \"shape\":\n return {\n kind: \"shape\",\n shape: style.shape,\n size: style.size,\n ...(style.location === undefined ? {} : { location: style.location }),\n };\n case \"character\":\n return {\n kind: \"character\",\n char: style.char,\n size: style.size,\n ...(style.location === undefined ? {} : { location: style.location }),\n };\n case \"arrow\":\n return { kind: \"arrow\", direction: style.direction, size: style.size };\n case \"candle-override\":\n return {\n kind: \"candle-override\",\n bull: style.bull,\n bear: style.bear,\n ...(style.doji === undefined ? {} : { doji: style.doji }),\n };\n case \"bar-override\":\n return { kind: \"bar-override\", color: style.color };\n case \"bg-color\":\n return {\n kind: \"bg-color\",\n color: style.color,\n ...(style.transp === undefined ? {} : { transp: style.transp }),\n };\n case \"bar-color\":\n return { kind: \"bar-color\", color: style.color };\n case \"horizontal-histogram\":\n return { kind: \"horizontal-histogram\", buckets: style.buckets };\n case \"line\":\n case \"step-line\":\n case \"horizontal-line\":\n return {\n kind: style.kind,\n lineWidth: opts.lineWidth ?? 1,\n lineStyle: opts.lineStyle ?? \"solid\",\n };\n }\n}\n\nfunction plotImpl(\n ctx: RuntimeContext,\n slotId: string,\n value: number | Series<number>,\n opts: PlotOpts,\n): void {\n const style: PlotStyle = buildStyle(opts);\n\n if (!ctx.capabilities.plots.has(style.kind)) {\n pushDiagnostic(ctx.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"unsupported-plot-kind\",\n message: `Adapter cannot render plot kind \"${style.kind}\".`,\n slotId,\n bar: ctx.barIndex(),\n });\n return;\n }\n\n const pane = resolvePane(opts.pane, ctx, slotId);\n\n const emission: PlotEmission = {\n kind: \"plot\",\n slotId,\n title: opts.title ?? \"\",\n style,\n bar: ctx.barIndex(),\n time: ctx.stream.bar.time,\n value: resolveValue(value),\n color: opts.color ?? null,\n meta: {},\n pane,\n };\n\n pushPlot(ctx.emissions, emission);\n}\n\n/**\n * Emit a plot line for the current bar (script-facing overload).\n *\n * The runtime export is dual-signature: scripts call `plot(value, opts?)`\n * (the surface declared on `@invinite-org/chartlang-core`'s\n * `ComputeContext`), and Task 2's compiler transformer rewrites every\n * callsite to inject the compiler-issued slot id as the leading\n * argument \u2014 see the sibling `plot(slotId, value, opts?)` overload.\n * A direct invocation without a slot id (i.e. outside a compiled\n * bundle) throws the sentinel error.\n *\n * Plot kind is always `\"line\"` in Phase 1; `\"horizontal-line\"` ships\n * via the sibling {@link hline} primitive. Phase 2+ extends the `kind`\n * variants additively.\n *\n * @since 0.1\n * @example\n * import { defineIndicator, ta, plot } from \"@invinite-org/chartlang-core\";\n * export default defineIndicator({\n * name: \"EMA(20)\",\n * apiVersion: 1,\n * compute({ bar, ta, plot }) {\n * plot(ta.ema(bar.close, 20), { color: \"#26a69a\", title: \"EMA\" });\n * },\n * });\n */\nexport function plot(value: number | Series<number>, opts?: PlotOpts): void;\n/**\n * Emit a plot line for the current bar (compiler-injected overload).\n *\n * Task 2's callsite-id transformer rewrites every script-side\n * `plot(value, opts?)` into `plot(slotId, value, opts?)`. The runtime\n * branches on `typeof arg1 === \"string\"` so the compiler-emitted\n * bundle dispatches here directly.\n *\n * @since 0.1\n * @example\n * // Internal \u2014 the compiler rewrites every script callsite, e.g.\n * // `plot(close)` becomes `plot(\"demo.chart.ts:5:13#0\", close)`.\n * // const fn: typeof plot = plot;\n * // void fn;\n */\nexport function plot(slotId: string, value: number | Series<number>, opts?: PlotOpts): void;\n/**\n * Implementation signature for {@link plot}. Branches on\n * `typeof arg1 === \"string\"` to dispatch the script-facing vs\n * compiler-injected overload.\n *\n * @since 0.1\n * @example\n * // const fn: typeof plot = plot;\n * // void fn;\n */\nexport function plot(\n arg1: string | number | Series<number>,\n arg2?: number | Series<number> | PlotOpts,\n arg3?: PlotOpts,\n): void {\n if (typeof arg1 !== \"string\") {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (!ctx) throw new Error(OUTSIDE_CTX_MESSAGE);\n if (!isNumberOrSeries(arg2)) {\n throw new Error(OUTSIDE_CTX_MESSAGE);\n }\n plotImpl(ctx, arg1, arg2, arg3 ?? {});\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { RunnerEmissions } from \"@invinite-org/chartlang-adapter-kit\";\n\nimport type { RunnerState } from \"../createScriptRunner.js\";\n\n/**\n * Snapshot and reset. Returns the runner's currently-accumulated\n * emissions as a frozen `RunnerEmissions` object, then clears the\n * runner's queues by reassigning each array to a fresh empty array \u2014\n * the adapter holds the snapshot's arrays, the runner gets fresh\n * containers for the next step.\n *\n * A second `drain` immediately after the first returns empty arrays\n * but the same `fromBar` / `toBar` (those are not reset until the next\n * step). The \u00A76.7 invariant 4 (\"queues cleared at start of every step\")\n * is enforced by `onBarClose` / `onBarTick`, not by `drain`.\n *\n * @since 0.1\n * @example\n * // import { drain } from \"@invinite-org/chartlang-runtime\";\n * // const emissions = drain(state);\n * // void emissions.plots;\n */\nexport function drain(state: RunnerState): RunnerEmissions {\n const out: RunnerEmissions = Object.freeze({\n plots: state.emissions.plots,\n drawings: state.emissions.drawings,\n alerts: state.emissions.alerts,\n alertConditions: state.emissions.alertConditions ?? [],\n logs: state.emissions.logs,\n diagnostics: state.emissions.diagnostics,\n fromBar: state.emissions.fromBar,\n toBar: state.emissions.toBar,\n });\n state.emissions.plots = [];\n state.emissions.drawings = [];\n state.emissions.alerts = [];\n state.emissions.alertConditions = [];\n state.emissions.logs = [];\n state.emissions.diagnostics = [];\n return out;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { RunnerState } from \"../createScriptRunner.js\";\nimport { flushStateSlots } from \"../state/index.js\";\n\n/**\n * Tear down the runner's buffers and state. After `dispose`:\n *\n * - Every OHLCV ring buffer's `length` is 0 (via `RingBufferLike.reset`).\n * - The `taSlots` map is empty (Task 7 primitives lose their hidden\n * state).\n * - Runtime `state.*` slots are flushed into `StateStore`, then the\n * runner-local slot map is cleared. The backing `StateStore` remains\n * host-owned so warm restart can restore the snapshot.\n * - The four emission arrays are reset to empty (`drain()` after\n * `dispose` returns empty arrays).\n *\n * `state.barIndex` is NOT reset \u2014 `dispose` is one-shot. Re-use after\n * `dispose` is not supported and not tested.\n *\n * @since 0.1\n * @example\n * // import { dispose } from \"@invinite-org/chartlang-runtime\";\n * // dispose(state);\n */\nexport function dispose(state: RunnerState): void {\n flushStateSlots(state.runtimeContext);\n for (const buf of Object.values(state.mainStream.ohlcv)) {\n buf.reset();\n }\n for (const stream of state.runtimeContext.secondaryStreams.values()) {\n for (const buf of Object.values(stream.ohlcv)) {\n buf.reset();\n }\n stream.taSlots.clear();\n }\n state.mainStream.taSlots.clear();\n state.emissions.plots = [];\n state.emissions.drawings = [];\n state.emissions.alerts = [];\n state.emissions.diagnostics = [];\n state.runtimeContext.drawingSlots.clear();\n state.runtimeContext.drawingSubIdCounters.clear();\n state.runtimeContext.stateSlots.clear();\n state.runtimeContext.secondaryStreams.clear();\n state.runtimeContext.requestSecurityBars.clear();\n state.runtimeContext.requestSecurityAlignments.clear();\n state.runtimeContext.requestSecurityAscendingBars.clear();\n state.runtimeContext.requestLowerTfViews.clear();\n state.runtimeContext.diagnosedRequestKeys.clear();\n state.runtimeContext.diagnosedInputKeys.clear();\n const counters = state.runtimeContext.drawingBucketCounters;\n counters.lines = 0;\n counters.labels = 0;\n counters.boxes = 0;\n counters.polylines = 0;\n counters.other = 0;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/adl.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape.\n\nimport type { AdlOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\n\ntype AdlSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n /** Active cumulative ADL across the closed bars so far. */\n cumAdl: number;\n /** Snapshot of `cumAdl` BEFORE the most recent close-side update. */\n prevClosedCumAdl: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.adl called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): AdlSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n cumAdl: 0,\n prevClosedCumAdl: 0,\n };\n}\n\n/**\n * Per-bar Money-Flow Volume: CLV (close location value) `((close \u2212 low)\n * \u2212 (high \u2212 close)) / (high \u2212 low)` multiplied by volume. Returns 0\n * on a zero-range bar (matches invinite's defensive guard) and 0 on\n * any NaN OHLC / volume (matches `safeVolume(NaN) === 0`). The\n * cumulative accumulator stays well-defined across data gaps.\n */\nfunction mfvAt(close: number, high: number, low: number, volume: number): number {\n if (\n !Number.isFinite(close) ||\n !Number.isFinite(high) ||\n !Number.isFinite(low) ||\n !Number.isFinite(volume)\n ) {\n return 0;\n }\n const range = high - low;\n if (range === 0) return 0;\n const clv = (close - low - (high - close)) / range;\n return clv * volume;\n}\n\n/**\n * Accumulation Distribution Line \u2014 cumulative money-flow volume\n * `\u03A3 CLV \u00B7 volume`, where CLV is the close location value\n * `((C \u2212 L) \u2212 (H \u2212 C)) / (H \u2212 L)`. Zero-range bars (`high === low`)\n * contribute 0 (matches invinite's guard); NaN OHLC / volume bars\n * contribute 0 (carry the accumulator forward without polluting it).\n *\n * Renders in its own pane (volume category). No warmup \u2014 every slot\n * finite from bar 0.\n *\n * **Tick mode.** Replays the head bar's contribution against a\n * snapshot of the prior-close `cumAdl` so a partial-bar tick doesn't\n * pollute the next close's accumulator.\n *\n * @formula adl[t] = adl[t \u2212 1] + ((C[t] \u2212 L[t]) \u2212 (H[t] \u2212 C[t])) / (H[t] \u2212 L[t]) \u00B7 V[t]\n * @warmup 0\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta, plot } from \"@invinite-org/chartlang-core\";\n * // const a = ta.adl();\n * // plot(a);\n */\nexport function adl(slotId: string, _opts?: AdlOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as AdlSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const { close, high, low, volume } = ctx.stream.bar;\n const mfv = mfvAt(close, high, low, volume);\n\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(slot.prevClosedCumAdl + mfv);\n return slot.series;\n }\n\n slot.prevClosedCumAdl = slot.cumAdl;\n slot.cumAdl += mfv;\n slot.outBuffer.append(slot.cumAdl);\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/adr.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. ADR derives from `bar.high`/`bar.low`/\n// `bar.time` directly \u2014 no `source` argument per the absolute-range\n// formula. The Phase-2 calendar-day boundary keys on UTC midnight\n// (`floor(time / 86_400_000)`); Phase 4 lifts this onto\n// `syminfo.session`.\n\nimport type { AdrOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\n\nconst DEFAULT_LENGTH = 14;\nconst MS_PER_DAY = 86_400_000;\n\ntype AdrSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /**\n * Ring of the last `length` COMPLETED daily ranges\n * (`dailyHigh - dailyLow` per UTC calendar day). Capacity = `length`.\n */\n readonly completedRanges: Float64RingBuffer;\n /** Sum of the completed-range ring; refreshed on each commit. */\n sumRanges: number;\n /** Running daily high \u2014 folded across all bars sharing `currentDayKey`. */\n dailyHigh: number;\n /** Running daily low. */\n dailyLow: number;\n /**\n * UTC calendar-day key for the in-progress day, or `Number.NaN`\n * before the first bar with a finite time has been folded in.\n */\n currentDayKey: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.adr called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): AdrSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n completedRanges: new Float64RingBuffer(length),\n sumRanges: 0,\n dailyHigh: Number.NaN,\n dailyLow: Number.NaN,\n currentDayKey: Number.NaN,\n };\n}\n\nfunction commitDay(slot: AdrSlot): void {\n // Defensive: callers gate on `Number.isFinite(currentDayKey)` so by the\n // time we get here `dailyHigh` / `dailyLow` were set by a prior bar\n // with finite OHLC. Keep the early return as a safety net.\n /* c8 ignore next */\n if (!Number.isFinite(slot.dailyHigh) || !Number.isFinite(slot.dailyLow)) return;\n const range = slot.dailyHigh - slot.dailyLow;\n if (slot.completedRanges.length === slot.length) {\n // Evict the oldest range before append.\n slot.sumRanges -= slot.completedRanges.at(slot.length - 1);\n }\n slot.completedRanges.append(range);\n slot.sumRanges += range;\n}\n\nfunction emit(slot: AdrSlot): number {\n if (slot.completedRanges.length < slot.length) return Number.NaN;\n return slot.sumRanges / slot.length;\n}\n\nfunction closeStep(slot: AdrSlot, high: number, low: number, time: number): number {\n // NaN bars skipped from the daily aggregation per task spec \u00A76.\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(time)) {\n return emit(slot);\n }\n const dayKey = Math.floor(time / MS_PER_DAY);\n if (Number.isNaN(slot.currentDayKey)) {\n slot.currentDayKey = dayKey;\n slot.dailyHigh = high;\n slot.dailyLow = low;\n return emit(slot);\n }\n if (dayKey !== slot.currentDayKey) {\n // Rollover: commit the prior in-progress day, then seed the new\n // day with the current bar's high/low.\n commitDay(slot);\n slot.currentDayKey = dayKey;\n slot.dailyHigh = high;\n slot.dailyLow = low;\n return emit(slot);\n }\n // Same day: extend the in-progress aggregate.\n if (high > slot.dailyHigh) slot.dailyHigh = high;\n if (low < slot.dailyLow) slot.dailyLow = low;\n return emit(slot);\n}\n\n/**\n * Average Daily Range \u2014 SMA of `high \u2212 low` across the trailing\n * `length` completed UTC calendar days. Default `length = 14` per\n * TradingView. Reads `bar.high` / `bar.low` / `bar.time` directly\n * (no `source` argument per the absolute-range formula).\n *\n * **Calendar-day boundary.** Phase 2 keys \"daily\" on the UTC midnight\n * boundary (`Math.floor(time / 86_400_000)`). Bars sharing a day key\n * are aggregated into a single `(dailyHigh, dailyLow)` pair; the day\n * range commits to the rolling SMA when the next bar's day key differs.\n * The in-progress (currently-aggregating) day is NEVER included in the\n * average. Phase 4 lifts this onto `syminfo.session` so symbols with\n * non-UTC sessions can override the convention.\n *\n * **Tick mode.** Ticks within the in-progress bar do NOT shift the day\n * boundary (per the runtime invariant that ticks happen inside the\n * current bar); the emitted value is the cached SMA of the already-\n * committed days. The next close re-folds the bar into the in-progress\n * day aggregate.\n *\n * **NaN.** Bars with non-finite `high` / `low` / `time` are skipped\n * (no aggregation, no commit); the output reflects only the previously\n * committed days.\n *\n * @formula out[t] = mean( (dailyHigh \u2212 dailyLow) over the last `length`\n * completed UTC days, in price units )\n * @warmup length daily bars\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const r = ta.adr({ length: 14 });\n * // plot(r);\n */\nexport function adr(slotId: string, opts?: AdrOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as AdrSlot | undefined;\n if (slot === undefined) {\n const length = opts?.length ?? DEFAULT_LENGTH;\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const { high, low, time } = ctx.stream.bar;\n if (ctx.isTick) {\n // Tick replay does NOT touch the day aggregate or the rolling\n // sum \u2014 those are snapshots of the last close. The output is the\n // committed SMA (NaN until warm).\n slot.outBuffer.replaceHead(emit(slot));\n } else {\n slot.outBuffer.append(closeStep(slot, high, low, time));\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// New helper extracted from invinite/src/components/trading-chart/indicators/\n// rsi.ts and atr.ts Wilder smoothing loops\n// (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n\n/**\n * One step of Wilder's \u03B1 = 1/length smoothing. Returns the updated\n * running average given the prior average and a new sample:\n * `prev * (length \u2212 1) / length + sample / length`. RSI's avgGain /\n * avgLoss recurrence and ATR's Wilder ATR recurrence both fold onto\n * this helper so a single line carries the math.\n *\n * @formula out = prev * (length \u2212 1) / length + sample / length\n * @since 0.1\n * @stable\n * @example\n * // import { wilderStep } from \"./wilderSmoothing\";\n * // const nextAvg = wilderStep(prevAvg, gain, 14);\n */\nexport function wilderStep(prev: number, sample: number, length: number): number {\n return (prev * (length - 1) + sample) / length;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/lib/directionalState.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n\nimport { wilderStep } from \"./wilderSmoothing.js\";\n\n/**\n * Incremental Wilder-directional state shared by `ta.dmi` and\n * `ta.adx`. Tracks the seed-window accumulators + the smoothed\n * running values, plus the \"previous-previous\" snapshots the tick\n * replay needs to recompute the head against the prior closed bar.\n *\n * @formula N/A \u2014 record type for {@link initDirectionalState}\n * @since 0.2\n * @stable\n * @example\n * // const s: DirectionalState = initDirectionalState(14);\n */\nexport type DirectionalState = {\n readonly length: number;\n /** Number of CLOSED bars seen so far (counts every close-side step). */\n barCount: number;\n prevHigh: number;\n prevLow: number;\n prevClose: number;\n /** `prevHigh` / `prevLow` / `prevClose` as of the bar before the\n * current bar \u2014 frozen by the prior close-side advance so tick\n * replay can recompute against the previous closed state. */\n prevPrevHigh: number;\n prevPrevLow: number;\n prevPrevClose: number;\n seedPlusDm: number;\n seedMinusDm: number;\n seedTr: number;\n smoothedPlusDm: number;\n smoothedMinusDm: number;\n smoothedTr: number;\n /** Smoothed state captured at the prior close \u2014 used by tick replay. */\n prevClosedSmoothedPlusDm: number;\n prevClosedSmoothedMinusDm: number;\n prevClosedSmoothedTr: number;\n plusDi: number;\n minusDi: number;\n};\n\n/**\n * Allocate a fresh directional-state record. Shared by `ta.dmi` and\n * `ta.adx`. Exported so the ADX primitive can fold onto the same\n * recurrence without duplicating the field set.\n *\n * @formula N/A \u2014 state constructor (zero / NaN initializers)\n * @since 0.2\n * @stable\n * @example\n * // const s = initDirectionalState(14);\n */\nexport function initDirectionalState(length: number): DirectionalState {\n return {\n length,\n barCount: 0,\n prevHigh: Number.NaN,\n prevLow: Number.NaN,\n prevClose: Number.NaN,\n prevPrevHigh: Number.NaN,\n prevPrevLow: Number.NaN,\n prevPrevClose: Number.NaN,\n seedPlusDm: 0,\n seedMinusDm: 0,\n seedTr: 0,\n smoothedPlusDm: Number.NaN,\n smoothedMinusDm: Number.NaN,\n smoothedTr: Number.NaN,\n prevClosedSmoothedPlusDm: Number.NaN,\n prevClosedSmoothedMinusDm: Number.NaN,\n prevClosedSmoothedTr: Number.NaN,\n plusDi: Number.NaN,\n minusDi: Number.NaN,\n };\n}\n\nfunction trueRange(high: number, low: number, prevClose: number): number {\n // Defensive: `trueRange` is only called from bar 1 onwards (bar 0\n // accumulates `high - low` inline via `seedTr += high - low`), and\n // by then `prevClose` has been set to a finite value by the prior\n // close-side advance. NaN-prevClose fallback kept for symmetry.\n /* c8 ignore next */\n if (!Number.isFinite(prevClose)) return high - low;\n return Math.max(high - low, Math.abs(high - prevClose), Math.abs(low - prevClose));\n}\n\nfunction rawDirectionalMovement(\n high: number,\n low: number,\n prevHigh: number,\n prevLow: number,\n): { pDm: number; mDm: number } {\n const upMove = high - prevHigh;\n const downMove = prevLow - low;\n const pDm = upMove > downMove && upMove > 0 ? upMove : 0;\n const mDm = downMove > upMove && downMove > 0 ? downMove : 0;\n return { pDm, mDm };\n}\n\n/**\n * Fold the new closed bar into the directional state. Mutates\n * `dirState` in place and returns the freshly computed `+DI` /\n * `-DI` pair (NaN until the seed window completes). Shared by\n * `ta.dmi` and `ta.adx`. The returned pair is also written back\n * to `dirState.plusDi` / `dirState.minusDi` for the consumer's\n * downstream DX computation.\n *\n * @formula See {@link wilderDirectional} (lib/) for the per-step\n * +DM / -DM / TR formulas; this routine inlines the same\n * recurrence in a single-pass mutable form.\n * @warmup length + 1 (first defined DI at barCount === length + 1)\n * @since 0.2\n * @stable\n * @example\n * // const { plusDi, minusDi } = advanceDirectionalClose(s, h, l, c);\n */\nexport function advanceDirectionalClose(\n dirState: DirectionalState,\n high: number,\n low: number,\n close: number,\n): { plusDi: number; minusDi: number } {\n const { length } = dirState;\n\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n // Hold prior values forward, do not advance the seed / smoothed\n // state. Matches `atr.ts`'s NaN-input semantics \u2014 the recurrence\n // cannot resume past a NaN, so we keep the last known values.\n return { plusDi: dirState.plusDi, minusDi: dirState.minusDi };\n }\n\n dirState.barCount += 1;\n\n if (dirState.barCount === 1) {\n // First bar: seed prev-* snapshots and accumulate the bar-0\n // range as the initial TR contribution. Matches the reference\n // `lib/wilderDirectional` whose `seedTr` starts at\n // `high[0] - low[0]`. No DM yet (no prevHigh).\n dirState.prevPrevHigh = dirState.prevHigh;\n dirState.prevPrevLow = dirState.prevLow;\n dirState.prevPrevClose = dirState.prevClose;\n dirState.prevHigh = high;\n dirState.prevLow = low;\n dirState.prevClose = close;\n dirState.seedTr += high - low;\n return { plusDi: Number.NaN, minusDi: Number.NaN };\n }\n\n const tr = trueRange(high, low, dirState.prevClose);\n const { pDm, mDm } = rawDirectionalMovement(high, low, dirState.prevHigh, dirState.prevLow);\n\n // Capture prev-prev BEFORE overwriting prev (tick replay needs the\n // bar-before-current snapshot).\n dirState.prevPrevHigh = dirState.prevHigh;\n dirState.prevPrevLow = dirState.prevLow;\n dirState.prevPrevClose = dirState.prevClose;\n dirState.prevHigh = high;\n dirState.prevLow = low;\n dirState.prevClose = close;\n\n if (dirState.barCount <= length) {\n // Seed window: barCount in [2, length] inclusive accumulate\n // pDm + mDm + tr; barCount === length + 1 completes the seed\n // and emits the first defined DI pair.\n dirState.seedPlusDm += pDm;\n dirState.seedMinusDm += mDm;\n dirState.seedTr += tr;\n return { plusDi: Number.NaN, minusDi: Number.NaN };\n }\n\n if (dirState.barCount === length + 1) {\n // Seed completes at the (length + 1)-th close \u2014 first defined\n // slot is bar index `length` (zero-based; matches the\n // full-recompute reference). Capture the pre-completion seed\n // sums on `prevClosedSmoothed*` so tick replay can substitute\n // the head bar's contribution.\n dirState.prevClosedSmoothedPlusDm = dirState.seedPlusDm;\n dirState.prevClosedSmoothedMinusDm = dirState.seedMinusDm;\n dirState.prevClosedSmoothedTr = dirState.seedTr;\n dirState.seedPlusDm += pDm;\n dirState.seedMinusDm += mDm;\n dirState.seedTr += tr;\n dirState.smoothedPlusDm = dirState.seedPlusDm;\n dirState.smoothedMinusDm = dirState.seedMinusDm;\n dirState.smoothedTr = dirState.seedTr;\n const tr0 = dirState.smoothedTr;\n const plusDi = tr0 === 0 ? 0 : (100 * dirState.smoothedPlusDm) / tr0;\n const minusDi = tr0 === 0 ? 0 : (100 * dirState.smoothedMinusDm) / tr0;\n dirState.plusDi = plusDi;\n dirState.minusDi = minusDi;\n return { plusDi, minusDi };\n }\n\n // Post-seed: Wilder-smooth +DM / -DM / TR.\n dirState.prevClosedSmoothedPlusDm = dirState.smoothedPlusDm;\n dirState.prevClosedSmoothedMinusDm = dirState.smoothedMinusDm;\n dirState.prevClosedSmoothedTr = dirState.smoothedTr;\n dirState.smoothedPlusDm = wilderStep(dirState.smoothedPlusDm, pDm, length);\n dirState.smoothedMinusDm = wilderStep(dirState.smoothedMinusDm, mDm, length);\n dirState.smoothedTr = wilderStep(dirState.smoothedTr, tr, length);\n const tr1 = dirState.smoothedTr;\n const plusDi = tr1 === 0 ? 0 : (100 * dirState.smoothedPlusDm) / tr1;\n const minusDi = tr1 === 0 ? 0 : (100 * dirState.smoothedMinusDm) / tr1;\n dirState.plusDi = plusDi;\n dirState.minusDi = minusDi;\n return { plusDi, minusDi };\n}\n\n/**\n * Replay the latest TR / DM / DI against the FROZEN prior-closed\n * smoothed state. Does NOT mutate `dirState` (the consumer's\n * close-side advance owns mutation). Returns the head DI pair the\n * primitive should write to its output buffer.\n *\n * @formula Same recurrence as {@link advanceDirectionalClose}, but\n * applied against `prevClosedSmoothed*` snapshots so the\n * current bar can be replaced rather than appended.\n * @since 0.2\n * @stable\n * @example\n * // const di = tickDirectional(s, h, l, c);\n */\nexport function tickDirectional(\n dirState: DirectionalState,\n high: number,\n low: number,\n close: number,\n): { plusDi: number; minusDi: number } {\n if (dirState.barCount < dirState.length + 1) {\n return { plusDi: Number.NaN, minusDi: Number.NaN };\n }\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n return { plusDi: dirState.plusDi, minusDi: dirState.minusDi };\n }\n // Tick replay reads against the bar-before-current (prevPrevHigh /\n // prevPrevLow / prevPrevClose) \u2014 the values captured at the prior\n // close. The current closed bar's contribution to the smoothed\n // state has already been folded; we reverse-undo it by reading off\n // `prevClosedSmoothed*` and applying one fresh Wilder step.\n const tr = trueRange(high, low, dirState.prevPrevClose);\n const { pDm, mDm } = rawDirectionalMovement(\n high,\n low,\n dirState.prevPrevHigh,\n dirState.prevPrevLow,\n );\n\n if (dirState.barCount === dirState.length + 1) {\n // We just seeded on the current close; the\n // `prevClosedSmoothed*` snapshots are the seed sums BEFORE\n // this close's contribution. Re-seed with the tick's\n // contribution substituted.\n const seedPlusDm = dirState.prevClosedSmoothedPlusDm + pDm;\n const seedMinusDm = dirState.prevClosedSmoothedMinusDm + mDm;\n const seedTr = dirState.prevClosedSmoothedTr + tr;\n // Defensive: seedTr === 0 only on a perfectly-flat seed window\n // (every bar high === low === prev close). Real data never hits it.\n const plusDi = /* c8 ignore next */ seedTr === 0 ? 0 : (100 * seedPlusDm) / seedTr;\n const minusDi = /* c8 ignore next */ seedTr === 0 ? 0 : (100 * seedMinusDm) / seedTr;\n return { plusDi, minusDi };\n }\n const plusDmSm = wilderStep(dirState.prevClosedSmoothedPlusDm, pDm, dirState.length);\n const minusDmSm = wilderStep(dirState.prevClosedSmoothedMinusDm, mDm, dirState.length);\n const trSm = wilderStep(dirState.prevClosedSmoothedTr, tr, dirState.length);\n const plusDi = /* c8 ignore next */ trSm === 0 ? 0 : (100 * plusDmSm) / trSm;\n const minusDi = /* c8 ignore next */ trSm === 0 ? 0 : (100 * minusDmSm) / trSm;\n return { plusDi, minusDi };\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/adx.ts\n// plus lib/wilder-directional.ts + lib/adx-from-di.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. ADX reads `bar.high` / `bar.low` /\n// `bar.close` directly (mirrors Pine's `ta.adx(length)` \u2014 no source\n// param) and runs the Wilder DI smoothing AND the DX \u2192 Wilder-\n// smoothed ADX recurrence incrementally via `wilderStep` (the same\n// per-step recurrence the reference helpers\n// `lib/wilderDirectional.ts` + `lib/adxFromDi.ts` use internally).\n\nimport type { AdxOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport {\n advanceDirectionalClose,\n initDirectionalState,\n tickDirectional,\n} from \"./lib/directionalState.js\";\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { wilderStep } from \"./lib/wilderSmoothing.js\";\n\nconst DEFAULT_SMOOTHING = 14;\n\ntype AdxSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly smoothingLength: number;\n readonly dirState: ReturnType<typeof initDirectionalState>;\n /** Running sum of DX samples while the ADX seed window fills. */\n dxSeed: number;\n /** Number of DX samples folded into the seed (0..smoothingLength). */\n dxSeedCount: number;\n /** Wilder-smoothed ADX. NaN until the DX seed completes. */\n adx: number;\n /** ADX as of the prior closed bar \u2014 used by tick-mode replay. */\n prevClosedAdx: number;\n /** DX seed accumulator + count as of the prior closed bar \u2014 used by\n * tick replay when the seed window is still filling. */\n prevClosedDxSeed: number;\n prevClosedDxSeedCount: number;\n /** Per-offset Series-view cache; see `sma.ts` for the convention. */\n readonly shiftedViews: Map<number, Series<number>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.adx called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, smoothingLength: number, capacity: number): AdxSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n smoothingLength,\n dirState: initDirectionalState(length),\n dxSeed: 0,\n dxSeedCount: 0,\n adx: Number.NaN,\n prevClosedAdx: Number.NaN,\n prevClosedDxSeed: 0,\n prevClosedDxSeedCount: 0,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: AdxSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction dxFromDi(plusDi: number, minusDi: number): number {\n const sum = plusDi + minusDi;\n if (sum === 0) return 0;\n return (100 * Math.abs(plusDi - minusDi)) / sum;\n}\n\nfunction closeValue(slot: AdxSlot, high: number, low: number, close: number): number {\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n // NaN inputs: do not advance the DI / DX recurrence. Hold the\n // prior ADX forward (matches `atr.ts` / `rsi.ts` NaN-input\n // semantics). The DI helper's own NaN handling already returns\n // the held-forward DI, but folding the held-DI into a fresh DX\n // would falsely advance the ADX recurrence.\n return Number.isFinite(slot.adx) ? slot.adx : Number.NaN;\n }\n const { plusDi, minusDi } = advanceDirectionalClose(slot.dirState, high, low, close);\n if (!Number.isFinite(plusDi) || !Number.isFinite(minusDi)) {\n // DI still in warmup \u2014 capture prior state for tick replay.\n slot.prevClosedAdx = slot.adx;\n slot.prevClosedDxSeed = slot.dxSeed;\n slot.prevClosedDxSeedCount = slot.dxSeedCount;\n return Number.NaN;\n }\n const dx = dxFromDi(plusDi, minusDi);\n // Capture prior state BEFORE folding this close into the DX seed.\n slot.prevClosedAdx = slot.adx;\n slot.prevClosedDxSeed = slot.dxSeed;\n slot.prevClosedDxSeedCount = slot.dxSeedCount;\n\n if (slot.dxSeedCount < slot.smoothingLength) {\n slot.dxSeed += dx;\n slot.dxSeedCount += 1;\n if (slot.dxSeedCount === slot.smoothingLength) {\n slot.adx = slot.dxSeed / slot.smoothingLength;\n return slot.adx;\n }\n return Number.NaN;\n }\n slot.adx = wilderStep(slot.adx, dx, slot.smoothingLength);\n return slot.adx;\n}\n\nfunction tickValue(slot: AdxSlot, high: number, low: number, close: number): number {\n const { plusDi, minusDi } = tickDirectional(slot.dirState, high, low, close);\n if (!Number.isFinite(plusDi) || !Number.isFinite(minusDi)) {\n // Defensive: `tickDirectional` returns NaN only when the\n // directional-state warmup has not completed (barCount <\n // length + 1) \u2014 and at that point `slot.adx` is still NaN\n // (adx warms strictly later than DI). So `Number.isFinite(slot.adx)`\n // is always false on this branch; kept for safety.\n return /* c8 ignore next */ Number.isFinite(slot.adx) ? slot.adx : Number.NaN;\n }\n const dx = dxFromDi(plusDi, minusDi);\n // Defensive: the close-side advance runs first on every bar and\n // raises `prevClosedDxSeedCount` to `smoothingLength` once the\n // seed window completes. The tick-side never observes a partial\n // DX-seed window because the bar that completes it has already\n // committed its close-side increment by the time `tickValue` runs.\n /* c8 ignore start */\n if (slot.prevClosedDxSeedCount < slot.smoothingLength) {\n const provisionalCount = slot.prevClosedDxSeedCount + 1;\n if (provisionalCount < slot.smoothingLength) return Number.NaN;\n return (slot.prevClosedDxSeed + dx) / slot.smoothingLength;\n }\n /* c8 ignore stop */\n return wilderStep(slot.prevClosedAdx, dx, slot.smoothingLength);\n}\n\n/**\n * Wilder's Average Directional Index \u2014 single-line trend-strength\n * oscillator bounded in `[0, 100]`. Reads `bar.high` / `bar.low` /\n * `bar.close` directly (mirrors Pine's `ta.adx(length)` \u2014 no source\n * param). Composes onto the same Wilder directional-movement\n * recurrence `ta.dmi` runs (`+DI` / `\u2212DI` from Wilder-smoothed `+DM`\n * / `\u2212DM` / TR), then folds DX = `100 \u00B7 |+DI \u2212 \u2212DI| / (+DI + \u2212DI)`\n * into a second Wilder-smoothing window of length\n * `opts.smoothing` (default `14`).\n *\n * @formula +DI, \u2212DI per `ta.dmi(length)` ;\n * DX[t] = (+DI + \u2212DI) === 0 ? 0 : 100 \u00B7 |+DI \u2212 \u2212DI| / (+DI + \u2212DI) ;\n * seed at first defined ADX bar = mean(DX over `smoothing` samples) ;\n * ADX[t] = wilderStep(ADX[t\u22121], DX[t], smoothing)\n * @warmup length + smoothing \u2212 1\n * @anchors length, smoothing\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts the returned series (PLAN.md \u00A79.1) \u2014\n * `series.current` returns the value `offset` bars ago.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const a = ta.adx(\"slot\", 14);\n * // plot(a);\n * // const lagged = ta.adx(\"slot2\", 14, { offset: 5 });\n */\nexport function adx(slotId: string, length: number, opts?: AdxOpts): Series<number> {\n const ctx = getCtx();\n const smoothingLength = opts?.smoothing ?? DEFAULT_SMOOTHING;\n let slot = ctx.stream.taSlots.get(slotId) as AdxSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, smoothingLength, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, bar.high, bar.low, bar.close));\n } else {\n slot.outBuffer.append(closeValue(slot, bar.high, bar.low, bar.close));\n }\n return viewForOffset(slot, opts?.offset ?? 0);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { Series } from \"@invinite-org/chartlang-core\";\n\n/**\n * What every `ta.*` primitive accepts as its `source` argument. Phase-1\n * scripts pass `bar.close` (a `number`) as the source per the seed-\n * example convention; future surfaces (`source: Series<number>`) are\n * structurally compatible because the primitive only ever reads\n * `source.current`. The union is the runtime's accommodation of both\n * shapes without forcing the script author to wrap a scalar.\n *\n * @formula N/A \u2014 type alias\n * @since 0.1\n * @stable\n * @example\n * // type S = ScalarOrSeries; // number | Series<number>\n */\nexport type ScalarOrSeries = number | Series<number>;\n\n/**\n * Read the current value off a `ScalarOrSeries`. Returns the scalar\n * directly; reads `.current` off a Series. `Series` is duck-typed \u2014\n * any object with a `current: number` field passes.\n *\n * @formula source is number \u2192 source ; source is Series \u2192 source.current\n * @since 0.1\n * @stable\n * @example\n * // import { readSourceValue } from \"./sourceValue\";\n * // readSourceValue(12.5); // 12.5\n * // readSourceValue(series); // series.current\n */\nexport function readSourceValue(source: ScalarOrSeries): number {\n if (typeof source === \"number\") return source;\n return source.current;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/alma.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. The ALMA `offset` opt is the Gaussian centre\n// in `[0, 1]` (default 0.85), distinct from the universal bar-shift\n// which lives on `opts.barShift`.\n\nimport type { AlmaOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_OFFSET = 0.85;\nconst DEFAULT_SIGMA = 6;\n\ntype AlmaSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /**\n * Trailing `length` source values; `at(0)` is the head (most\n * recent), `at(length - 1)` is the oldest still in the window.\n */\n readonly sourceWindow: Float64RingBuffer;\n /**\n * Pre-computed Gaussian weights. `weights[j]` aligns with the\n * j-th OLDEST window entry (i.e. `window.at(length - 1 - j)`) so\n * `j = length - 1` weights the head and `j = 0` weights the\n * oldest \u2014 matches the invinite reference's `computeAlma` loop.\n */\n readonly weights: Float64Array;\n readonly normaliser: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.alma called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, offsetCentre: number, sigma: number, capacity: number): AlmaSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n const m = offsetCentre * (length - 1);\n const s = length / sigma;\n const weights = new Float64Array(length);\n let normaliser = 0;\n for (let j = 0; j < length; j += 1) {\n const d = j - m;\n const w = Math.exp(-(d * d) / (2 * s * s));\n weights[j] = w;\n normaliser += w;\n }\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n sourceWindow: new Float64RingBuffer(length),\n weights,\n normaliser,\n };\n}\n\nfunction weightedFromWindow(slot: AlmaSlot, headOverride?: number): number {\n let sum = 0;\n for (let j = 0; j < slot.length; j += 1) {\n // j = 0 \u2192 oldest (window.at(length - 1)); j = length - 1 \u2192 head.\n const ageFromHead = slot.length - 1 - j;\n const v =\n ageFromHead === 0 && headOverride !== undefined\n ? headOverride\n : slot.sourceWindow.at(ageFromHead);\n if (!Number.isFinite(v)) return Number.NaN;\n sum += v * slot.weights[j];\n }\n return sum / slot.normaliser;\n}\n\nfunction closeValue(slot: AlmaSlot, src: number): number {\n slot.sourceWindow.append(src);\n if (slot.sourceWindow.length < slot.length) return Number.NaN;\n return weightedFromWindow(slot);\n}\n\nfunction tickValue(slot: AlmaSlot, src: number): number {\n if (slot.sourceWindow.length < slot.length) return Number.NaN;\n if (!Number.isFinite(src)) return Number.NaN;\n return weightedFromWindow(slot, src);\n}\n\n/**\n * Arnaud Legoux Moving Average \u2014 a Gaussian-weighted MA. Weights peak\n * at `offset \u00B7 (length \u2212 1)` (default `0.85 \u00B7 (length \u2212 1)`, near the\n * recent end of the window) and decay with standard deviation\n * `length / sigma` (default `length / 6`). Weights are pre-computed\n * once at slot init from `opts.offset` + `opts.sigma`; per-bar cost is\n * an O(length) window walk. A NaN anywhere in the window\n * short-circuits the output to NaN (matches the WMA full-recompute\n * weighted-window convention).\n *\n * **`opts.offset` is the Gaussian-centre position in `[0, 1]`**, NOT\n * the universal bar-shift. The universal shift on ALMA uses the\n * distinct `opts.barShift` field \u2014 accepted on the surface (Task 29\n * wires the runtime side along with every other Phase-2 primitive's\n * `offset`).\n *\n * @formula m = offset \u00B7 (length \u2212 1) ;\n * s = length / sigma ;\n * w[j] = exp(\u2212((j \u2212 m)\u00B2 / (2 \u00B7 s\u00B2))) for j = 0..length \u2212 1 ;\n * norm = \u03A3 w[j] ;\n * out[t] = (\u03A3_{j=0..length-1} w[j] \u00B7 src[t \u2212 length + 1 + j]) / norm\n * @warmup length \u2212 1\n * @anchors offset, sigma\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const a = ta.alma(bar.close, 9, { offset: 0.85, sigma: 6 });\n * // plot(a);\n */\nexport function alma(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: AlmaOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as AlmaSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(\n length,\n opts?.offset ?? DEFAULT_OFFSET,\n opts?.sigma ?? DEFAULT_SIGMA,\n ctx.stream.ohlcv.close.capacity,\n );\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src));\n } else {\n slot.outBuffer.append(closeValue(slot, src));\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// Ported from ../invinite/src/components/trading-chart/indicators/lib/volume-profile/bucket-edges.ts\n// @ 3234c8c0c3f9880d9d1e3a3ee63ebd55ddd535f4.\n// Translated, not transcribed \u2014 ReadonlyArray<number> inputs, JSDoc, runtime.\n// See packages/runtime/src/ta/CLAUDE.md for the port convention.\n\nimport type { RowsLayout } from \"./types.js\";\n\n/**\n * Build `bucketCount + 1` price edges for a volume profile.\n *\n * @formula PLAN \u00A79.2 \u2014 `ticksPerRow`: width = rowSize * tickSize;\n * `numberOfRows`: width = (priceMax - priceMin) / rowSize.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const edges = buildBucketEdges(100, 105, \"ticksPerRow\", 10, 0.01);\n */\nexport function buildBucketEdges(\n priceMin: number,\n priceMax: number,\n rowsLayout: RowsLayout,\n rowSize: number,\n tickSize: number,\n): Float64Array {\n if (!Number.isFinite(priceMin) || !Number.isFinite(priceMax) || rowSize <= 0) {\n return new Float64Array([priceMin, priceMin]);\n }\n if (priceMax <= priceMin) return new Float64Array([priceMin, priceMin]);\n\n if (rowsLayout === \"ticksPerRow\") {\n const bucketWidth = rowSize * tickSize;\n if (bucketWidth <= 0) return new Float64Array([priceMin, priceMin]);\n\n const startEdge = Math.floor(priceMin / bucketWidth) * bucketWidth;\n const endEdge = Math.ceil(priceMax / bucketWidth) * bucketWidth;\n const count = Math.max(1, Math.round((endEdge - startEdge) / bucketWidth));\n const edges = new Float64Array(count + 1);\n for (let i = 0; i <= count; i += 1) edges[i] = startEdge + i * bucketWidth;\n return edges;\n }\n\n const count = Math.max(1, Math.floor(rowSize));\n const width = (priceMax - priceMin) / count;\n const edges = new Float64Array(count + 1);\n for (let i = 0; i <= count; i += 1) edges[i] = priceMin + i * width;\n return edges;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// Ported from ../invinite/src/components/trading-chart/indicators/lib/volume-profile/bucketize-volume.ts\n// @ 3234c8c0c3f9880d9d1e3a3ee63ebd55ddd535f4.\n// Translated, not transcribed \u2014 ReadonlyArray<number> inputs, JSDoc, runtime.\n// See packages/runtime/src/ta/CLAUDE.md for the port convention.\n\nimport type {\n BucketizedVolume,\n VolumeProfileBar,\n VolumeProfileBucket,\n VolumeProfileRow,\n VolumeSplit,\n} from \"./types.js\";\n\n/**\n * Distribute each bar's volume across overlapping price buckets and\n * return the Phase 5 `horizontal-histogram` bucket shape.\n *\n * @formula PLAN \u00A79.2 \u2014 share = volume * overlap([bar.low, bar.high], bucket) / max(high - low, eps).\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const buckets = bucketizeVolume(bars, new Float64Array([100, 101]), \"total\");\n */\nexport function bucketizeVolume(\n bars: ReadonlyArray<VolumeProfileBar>,\n bucketEdges: ArrayLike<number>,\n volumeSplit: VolumeSplit,\n): ReadonlyArray<VolumeProfileBucket> {\n return bucketizeVolumeDetailed(bars, bucketEdges, volumeSplit).buckets;\n}\n\n/**\n * Detailed bucketization retaining row bounds, directional volume,\n * total volume, and POC index for value-area/profile computation.\n *\n * @formula PLAN \u00A79.2 \u2014 same overlap weighting as {@link bucketizeVolume}.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const detailed = bucketizeVolumeDetailed(bars, edges, \"upDown\");\n */\nexport function bucketizeVolumeDetailed(\n bars: ReadonlyArray<VolumeProfileBar>,\n bucketEdges: ArrayLike<number>,\n volumeSplit: VolumeSplit,\n): BucketizedVolume {\n const bucketCount = bucketEdges.length - 1;\n if (bucketCount <= 0) return { buckets: [], pocIdx: -1, rows: [], totalVolume: 0 };\n\n const upPerBucket = new Float64Array(bucketCount);\n const downPerBucket = new Float64Array(bucketCount);\n\n for (const bar of bars) {\n const vol = Number.isFinite(bar.volume) ? bar.volume : 0;\n if (vol <= 0) continue;\n\n const low = bar.low;\n const high = bar.high;\n // Skip bars whose price fields aren't finite or whose range is\n // inverted / zero. NaN inputs would otherwise propagate `share = NaN`\n // into every overlapping bucket and silently corrupt the profile.\n if (!Number.isFinite(low) || !Number.isFinite(high)) continue;\n if (!Number.isFinite(bar.open) || !Number.isFinite(bar.close)) continue;\n if (high <= low) continue;\n\n const span = high - low;\n const isUp = bar.close >= bar.open;\n\n for (let b = 0; b < bucketCount; b += 1) {\n const edgeLow = bucketEdges[b];\n const edgeHigh = bucketEdges[b + 1];\n if (edgeHigh <= low) continue;\n if (edgeLow >= high) break;\n\n const overlap = Math.min(edgeHigh, high) - Math.max(edgeLow, low);\n if (overlap <= 0) continue;\n\n const share = (vol * overlap) / span;\n if (isUp) upPerBucket[b] += share;\n else downPerBucket[b] += share;\n }\n }\n\n const rows = new Array<VolumeProfileRow>(bucketCount);\n const buckets = new Array<VolumeProfileBucket>(bucketCount);\n let totalVolume = 0;\n let pocIdx = -1;\n let pocVolume = -1;\n\n for (let b = 0; b < bucketCount; b += 1) {\n const rawUp = upPerBucket[b];\n const rawDown = downPerBucket[b];\n const split = splitVolume(rawUp, rawDown, volumeSplit);\n const low = bucketEdges[b];\n const high = bucketEdges[b + 1];\n const mid = (low + high) / 2;\n\n rows[b] = {\n downVolume: split.downVolume,\n high,\n low,\n mid,\n upVolume: split.upVolume,\n volume: split.volume,\n };\n buckets[b] = { price: mid, volume: split.volume };\n totalVolume += split.volume;\n if (split.volume > pocVolume) {\n pocVolume = split.volume;\n pocIdx = b;\n }\n }\n\n return { buckets, pocIdx, rows, totalVolume };\n}\n\nfunction splitVolume(\n rawUp: number,\n rawDown: number,\n volumeSplit: VolumeSplit,\n): { upVolume: number; downVolume: number; volume: number } {\n switch (volumeSplit) {\n case \"total\": {\n const volume = rawUp + rawDown;\n return { downVolume: 0, upVolume: volume, volume };\n }\n case \"delta\": {\n const upVolume = Math.max(0, rawUp - rawDown);\n const downVolume = Math.max(0, rawDown - rawUp);\n return { downVolume, upVolume, volume: upVolume + downVolume };\n }\n case \"upDown\":\n return { downVolume: rawDown, upVolume: rawUp, volume: rawUp + rawDown };\n }\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// Ported from ../invinite/src/components/trading-chart/indicators/lib/volume-profile/types.ts\n// @ 3234c8c0c3f9880d9d1e3a3ee63ebd55ddd535f4.\n// Translated, not transcribed \u2014 ReadonlyArray<number> inputs, JSDoc, runtime.\n// See packages/runtime/src/ta/CLAUDE.md for the port convention.\n\n/**\n * Bucket-width strategy. `ticksPerRow` derives from `tickSize`;\n * `numberOfRows` divides the range evenly.\n *\n * @formula PLAN \u00A79.2 \u2014 controls bucket width derivation for profile rows.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const layout: RowsLayout = \"numberOfRows\";\n */\nexport type RowsLayout = \"numberOfRows\" | \"ticksPerRow\";\n\n/**\n * Bar coloring strategy inside each bucket.\n *\n * @formula PLAN \u00A79.2 \u2014 selects total, delta, or up/down volume partitioning.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const split: VolumeSplit = \"upDown\";\n */\nexport type VolumeSplit = \"delta\" | \"total\" | \"upDown\";\n\n/**\n * Minimal OHLCV shape consumed by the pure volume-profile helpers.\n *\n * @formula PLAN \u00A79.2 \u2014 normalized OHLCV input for profile bucketing.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const bar: VolumeProfileBar = { time: 0, open: 1, high: 2, low: 1, close: 2, volume: 100 };\n */\nexport type VolumeProfileBar = Readonly<{\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n}>;\n\n/**\n * Horizontal-histogram bucket shape used by Phase 5 plot emissions.\n *\n * @formula PLAN \u00A79.2 \u2014 price row plus accumulated volume.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const bucket: VolumeProfileBucket = { price: 100, volume: 25 };\n */\nexport type VolumeProfileBucket = Readonly<{\n price: number;\n volume: number;\n}>;\n\n/**\n * Internal row shape retaining bucket bounds and directional volume.\n *\n * @formula PLAN \u00A79.2 \u2014 bucket bounds plus directional volume totals.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const row: VolumeProfileRow = { low: 99, high: 101, mid: 100, volume: 10, upVolume: 10, downVolume: 0 };\n */\nexport type VolumeProfileRow = Readonly<{\n low: number;\n high: number;\n mid: number;\n volume: number;\n upVolume: number;\n downVolume: number;\n}>;\n\n/**\n * Shared math config consumed by bucket/value-area/developing helpers.\n *\n * @formula PLAN \u00A79.2 \u2014 shared profile row count and value-area settings.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const config: VolumeProfileConfig = { rowSize: 24, valueAreaPct: 70 };\n */\nexport type VolumeProfileConfig = Readonly<{\n rowSize: number;\n valueAreaPct: number;\n rowsLayout?: RowsLayout;\n volumeSplit?: VolumeSplit;\n tickSize?: number;\n}>;\n\n/**\n * Cost guard result for profile windows that would allocate too many\n * buckets or scan too many finer bars.\n *\n * @formula PLAN \u00A79.2 \u2014 cost guard state for profile windows.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const status: VolumeProfileCostStatus = { heavy: false, reason: null, recommendedRowSize: null };\n */\nexport type VolumeProfileCostStatus = Readonly<{\n heavy: boolean;\n reason: \"too-many-buckets\" | \"too-many-finer-bars\" | null;\n recommendedRowSize: number | null;\n}>;\n\n/**\n * Value-area result: high/low price bounds plus point-of-control.\n *\n * @formula PLAN \u00A79.2 \u2014 point-of-control and value-area bounds.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const va: ValueAreaResult = { valHigh: 101, valLow: 99, poc: 100, vahIdx: 1, valIdx: 0, pocIdx: 0, cumulativeVolume: 10 };\n */\nexport type ValueAreaResult = Readonly<{\n valHigh: number;\n valLow: number;\n poc: number;\n vahIdx: number;\n valIdx: number;\n pocIdx: number;\n cumulativeVolume: number;\n}>;\n\n/**\n * Detailed bucketization output.\n *\n * @formula PLAN \u00A79.2 \u2014 raw histogram buckets and total volume.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const out: BucketizedVolume = { buckets: [], rows: [], totalVolume: 0, pocIdx: -1 };\n */\nexport type BucketizedVolume = Readonly<{\n buckets: ReadonlyArray<VolumeProfileBucket>;\n rows: ReadonlyArray<VolumeProfileRow>;\n totalVolume: number;\n pocIdx: number;\n}>;\n\n/**\n * Developing POC/value-area time-series arrays.\n *\n * @formula PLAN \u00A79.2 \u2014 developing profile time-series outputs.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const dev: DevelopingProfileSeries = { developingPoc: new Float64Array(0), developingVahHigh: new Float64Array(0), developingVahLow: new Float64Array(0) };\n */\nexport type DevelopingProfileSeries = Readonly<{\n developingPoc: Float64Array;\n developingVahHigh: Float64Array;\n developingVahLow: Float64Array;\n}>;\n\n/**\n * Full pure profile result consumed by later volume-profile primitives.\n *\n * @formula PLAN \u00A79.2 \u2014 complete profile histogram, value area, and cost state.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const result: VolumeProfileResult = { buckets: [], rows: [], valueAreaMask: new Float64Array(0), poc: Number.NaN, valHigh: Number.NaN, valLow: Number.NaN, costStatus: { heavy: false, reason: null, recommendedRowSize: null } };\n */\nexport type VolumeProfileResult = Readonly<{\n buckets: ReadonlyArray<VolumeProfileBucket>;\n rows: ReadonlyArray<VolumeProfileRow>;\n valueAreaMask: Float64Array;\n poc: number;\n valHigh: number;\n valLow: number;\n costStatus: VolumeProfileCostStatus;\n developing?: DevelopingProfileSeries;\n}>;\n\n/**\n * Sentinel tick size used when no symbol-specific minimum tick is supplied.\n *\n * @formula PLAN \u00A79.2 \u2014 fallback row quantum for symbols without min tick.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const tick = DEFAULT_TICK_SIZE;\n */\nexport const DEFAULT_TICK_SIZE = 0.01;\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// Ported from ../invinite/src/components/trading-chart/indicators/lib/volume-profile/value-area.ts\n// @ 3234c8c0c3f9880d9d1e3a3ee63ebd55ddd535f4.\n// Translated, not transcribed \u2014 ReadonlyArray<number> inputs, JSDoc, runtime.\n// See packages/runtime/src/ta/CLAUDE.md for the port convention.\n\nimport type { ValueAreaResult, VolumeProfileRow } from \"./types.js\";\n\n/**\n * Compute greedy expand-from-POC value-area bounds.\n *\n * @formula PLAN \u00A79.2 \u2014 start at POC, then absorb the larger of the\n * next two above-buckets vs below-buckets until target volume.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const va = computeValueArea(rows, 70);\n */\nexport function computeValueArea(\n rows: ReadonlyArray<VolumeProfileRow>,\n valueAreaPct = 70,\n pocIdx: number = findPocIndex(rows),\n): ValueAreaResult {\n if (rows.length === 0 || pocIdx < 0 || pocIdx >= rows.length) {\n return {\n cumulativeVolume: 0,\n poc: Number.NaN,\n pocIdx,\n vahIdx: pocIdx,\n valHigh: Number.NaN,\n valIdx: pocIdx,\n valLow: Number.NaN,\n };\n }\n\n const totalVolume = rows.reduce((sum, row) => sum + row.volume, 0);\n const targetPct = Math.max(0, Math.min(100, valueAreaPct));\n const target = totalVolume * (targetPct / 100);\n let lowIdx = pocIdx;\n let highIdx = pocIdx;\n let cumulative = rows[pocIdx].volume;\n\n while (cumulative < target && (lowIdx > 0 || highIdx + 1 < rows.length)) {\n const aboveAvailable = highIdx + 1 < rows.length;\n const belowAvailable = lowIdx - 1 >= 0;\n\n let aboveSum = 0;\n if (aboveAvailable) {\n aboveSum = rows[highIdx + 1].volume;\n if (highIdx + 2 < rows.length) aboveSum += rows[highIdx + 2].volume;\n }\n\n let belowSum = 0;\n if (belowAvailable) {\n belowSum = rows[lowIdx - 1].volume;\n if (lowIdx - 2 >= 0) belowSum += rows[lowIdx - 2].volume;\n }\n\n if (aboveAvailable && (!belowAvailable || aboveSum >= belowSum)) {\n const takeTwo = highIdx + 2 < rows.length;\n cumulative += rows[highIdx + 1].volume;\n highIdx += 1;\n if (takeTwo && cumulative < target) {\n cumulative += rows[highIdx + 1].volume;\n highIdx += 1;\n }\n } else {\n const takeTwo = lowIdx - 2 >= 0;\n cumulative += rows[lowIdx - 1].volume;\n lowIdx -= 1;\n if (takeTwo && cumulative < target) {\n cumulative += rows[lowIdx - 1].volume;\n lowIdx -= 1;\n }\n }\n }\n\n return {\n cumulativeVolume: cumulative,\n poc: rows[pocIdx].mid,\n pocIdx,\n vahIdx: highIdx,\n valHigh: rows[highIdx].high,\n valIdx: lowIdx,\n valLow: rows[lowIdx].low,\n };\n}\n\nfunction findPocIndex(rows: ReadonlyArray<VolumeProfileRow>): number {\n let pocIdx = -1;\n let pocVolume = -1;\n for (let i = 0; i < rows.length; i += 1) {\n if (rows[i].volume > pocVolume) {\n pocIdx = i;\n pocVolume = rows[i].volume;\n }\n }\n return pocIdx;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// Ported from ../invinite/src/components/trading-chart/indicators/lib/volume-profile/developing-series.ts\n// @ 3234c8c0c3f9880d9d1e3a3ee63ebd55ddd535f4.\n// Translated, not transcribed \u2014 ReadonlyArray<number> inputs, JSDoc, runtime.\n// See packages/runtime/src/ta/CLAUDE.md for the port convention.\n\nimport { buildBucketEdges } from \"./bucketEdges.js\";\nimport { bucketizeVolumeDetailed } from \"./bucketizeVolume.js\";\nimport type { DevelopingProfileSeries, VolumeProfileBar, VolumeProfileConfig } from \"./types.js\";\nimport { DEFAULT_TICK_SIZE } from \"./types.js\";\nimport { computeValueArea } from \"./valueArea.js\";\n\nconst WARMUP_BARS = 30;\n\n/**\n * Compute lane-indexed developing POC / VAH / VAL series.\n *\n * @formula PLAN \u00A79.2 / \u00A710.1.1 \u2014 for each lane bar, bucket all source\n * bars in the active profile window up to that bar's time.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const developing = computeDevelopingSeries({ laneBars: bars, finerBars: [], windowFromIdx: 0, windowToIdx: bars.length - 1, config: { rowSize: 20, valueAreaPct: 70 } });\n */\nexport function computeDevelopingSeries(args: {\n laneBars: ReadonlyArray<VolumeProfileBar>;\n finerBars: ReadonlyArray<VolumeProfileBar>;\n windowFromIdx: number;\n windowToIdx: number;\n config: VolumeProfileConfig;\n}): DevelopingProfileSeries {\n const { laneBars, finerBars, windowFromIdx, windowToIdx, config } = args;\n const laneCount = laneBars.length;\n const developingPoc = new Float64Array(laneCount);\n const developingVahHigh = new Float64Array(laneCount);\n const developingVahLow = new Float64Array(laneCount);\n developingPoc.fill(Number.NaN);\n developingVahHigh.fill(Number.NaN);\n developingVahLow.fill(Number.NaN);\n if (laneCount === 0) return { developingPoc, developingVahHigh, developingVahLow };\n\n const fromIdx = Math.max(0, Math.min(laneCount - 1, windowFromIdx));\n const toIdx = Math.max(fromIdx, Math.min(laneCount - 1, windowToIdx));\n const source = finerBars.length > 0 ? finerBars : laneBars;\n const sourceStart = lowerBoundTime(source, laneBars[fromIdx].time);\n let sourceEnd = sourceStart;\n\n for (let i = fromIdx; i <= toIdx; i += 1) {\n while (sourceEnd < source.length && source[sourceEnd].time <= laneBars[i].time)\n sourceEnd += 1;\n const slice = source.slice(sourceStart, sourceEnd);\n if (slice.length <= WARMUP_BARS) continue;\n\n const { priceMax, priceMin } = derivePriceRange(slice);\n const edges = buildBucketEdges(\n priceMin,\n priceMax,\n config.rowsLayout ?? \"numberOfRows\",\n config.rowSize,\n config.tickSize ?? DEFAULT_TICK_SIZE,\n );\n const bucketized = bucketizeVolumeDetailed(slice, edges, config.volumeSplit ?? \"upDown\");\n if (bucketized.totalVolume <= 0) continue;\n\n const valueArea = computeValueArea(bucketized.rows, config.valueAreaPct, bucketized.pocIdx);\n developingPoc[i] = valueArea.poc;\n developingVahHigh[i] = valueArea.valHigh;\n developingVahLow[i] = valueArea.valLow;\n }\n\n return { developingPoc, developingVahHigh, developingVahLow };\n}\n\nfunction lowerBoundTime(bars: ReadonlyArray<VolumeProfileBar>, target: number): number {\n let lo = 0;\n let hi = bars.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (bars[mid].time < target) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\n/**\n * Derive min/max price bounds for a bar slice.\n *\n * @formula PLAN \u00A79.2 \u2014 bucket range spans the min low to max high\n * of the selected profile source.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const range = derivePriceRange(bars);\n */\nexport function derivePriceRange(bars: ReadonlyArray<Pick<VolumeProfileBar, \"high\" | \"low\">>): {\n priceMin: number;\n priceMax: number;\n} {\n let priceMin = Number.POSITIVE_INFINITY;\n let priceMax = Number.NEGATIVE_INFINITY;\n for (const bar of bars) {\n // Skip bars with non-finite OHLC. Per the Bar contract NaN is allowed\n // and would otherwise poison the running min/max (NaN comparisons\n // return false), letting NaN edges flow into bucketization.\n if (!Number.isFinite(bar.low) || !Number.isFinite(bar.high)) continue;\n if (bar.low < priceMin) priceMin = bar.low;\n if (bar.high > priceMax) priceMax = bar.high;\n }\n if (priceMin === Number.POSITIVE_INFINITY) return { priceMax: 0, priceMin: 0 };\n return { priceMax, priceMin };\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// Ported from ../invinite/src/components/trading-chart/indicators/lib/volume-profile/too-heavy.ts\n// @ 3234c8c0c3f9880d9d1e3a3ee63ebd55ddd535f4.\n// Translated, not transcribed \u2014 ReadonlyArray<number> inputs, JSDoc, runtime.\n// See packages/runtime/src/ta/CLAUDE.md for the port convention.\n\nimport type { RowsLayout, VolumeProfileCostStatus } from \"./types.js\";\n\n/**\n * Finer-bar count threshold from the invinite profile renderer.\n *\n * @formula PLAN \u00A79.2 \u2014 cap finer-bar scans for one profile compute.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const max = VOLUME_PROFILE_HEAVY_THRESHOLD;\n */\nexport const VOLUME_PROFILE_HEAVY_THRESHOLD = 50_000;\n\n/**\n * Default maximum bucket count for a single pure profile compute.\n *\n * @formula PLAN \u00A79.2 \u2014 cap bucket allocations for one profile compute.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const max = VOLUME_PROFILE_MAX_BUCKETS;\n */\nexport const VOLUME_PROFILE_MAX_BUCKETS = 2_000;\n\n/**\n * Assess whether a volume-profile input window is too expensive and\n * optionally recommend a coarser `rowSize` fallback.\n *\n * @formula PLAN \u00A79.2 \u2014 guard range / rowSize combinations that would\n * allocate pathological bucket counts before bucketing.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const status = assessVolumeProfileCost({ finerCandleCount: 1000, priceMin: 1, priceMax: 100, rowSize: 1, rowsLayout: \"numberOfRows\" });\n */\nexport function assessVolumeProfileCost(args: {\n finerCandleCount: number;\n rowSize?: number;\n rowsLayout?: RowsLayout;\n tickSize?: number;\n priceMin?: number;\n priceMax?: number;\n maxBuckets?: number;\n}): VolumeProfileCostStatus {\n if (args.finerCandleCount > VOLUME_PROFILE_HEAVY_THRESHOLD) {\n return { heavy: true, reason: \"too-many-finer-bars\", recommendedRowSize: null };\n }\n\n const maxBuckets = args.maxBuckets ?? VOLUME_PROFILE_MAX_BUCKETS;\n const estimate = estimateBucketCount(args);\n if (estimate.kind === \"estimated\" && estimate.bucketCount > maxBuckets) {\n return {\n heavy: true,\n reason: \"too-many-buckets\",\n recommendedRowSize:\n args.rowsLayout === \"ticksPerRow\"\n ? Math.ceil(\n (estimate.priceMax - estimate.priceMin) /\n (maxBuckets * estimate.tickSize),\n )\n : Math.max(1, maxBuckets),\n };\n }\n\n return { heavy: false, reason: null, recommendedRowSize: null };\n}\n\nfunction estimateBucketCount(args: {\n rowSize?: number;\n rowsLayout?: RowsLayout;\n tickSize?: number;\n priceMin?: number;\n priceMax?: number;\n}):\n | { bucketCount: 0; kind: \"invalid\" }\n | {\n bucketCount: number;\n kind: \"estimated\";\n priceMin: number;\n priceMax: number;\n rowSize: number;\n tickSize: number;\n } {\n const { priceMax, priceMin, rowSize } = args;\n if (\n rowSize === undefined ||\n priceMin === undefined ||\n priceMax === undefined ||\n !Number.isFinite(priceMin) ||\n !Number.isFinite(priceMax) ||\n rowSize <= 0 ||\n priceMax <= priceMin\n ) {\n return { bucketCount: 0, kind: \"invalid\" };\n }\n const tickSize = args.tickSize ?? 0.01;\n if (args.rowsLayout === \"ticksPerRow\") {\n const width = rowSize * tickSize;\n return width > 0\n ? {\n bucketCount: Math.ceil((priceMax - priceMin) / width),\n kind: \"estimated\",\n priceMax,\n priceMin,\n rowSize,\n tickSize,\n }\n : { bucketCount: 0, kind: \"invalid\" };\n }\n return {\n bucketCount: Math.floor(rowSize),\n kind: \"estimated\",\n priceMax,\n priceMin,\n rowSize,\n tickSize,\n };\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// Ported from ../invinite/src/components/trading-chart/indicators/lib/volume-profile/volume-profile-shared.ts\n// @ 3234c8c0c3f9880d9d1e3a3ee63ebd55ddd535f4.\n// Translated, not transcribed \u2014 ReadonlyArray<number> inputs, JSDoc, runtime.\n// See packages/runtime/src/ta/CLAUDE.md for the port convention.\n\nimport { buildBucketEdges } from \"./bucketEdges.js\";\nimport { bucketizeVolumeDetailed } from \"./bucketizeVolume.js\";\nimport { computeDevelopingSeries, derivePriceRange } from \"./developingSeries.js\";\nimport { assessVolumeProfileCost } from \"./tooHeavy.js\";\nimport type { VolumeProfileBar, VolumeProfileConfig, VolumeProfileResult } from \"./types.js\";\nimport { DEFAULT_TICK_SIZE } from \"./types.js\";\nimport { computeValueArea } from \"./valueArea.js\";\n\n/**\n * Compute the pure shared volume-profile payload used by all four\n * Phase 5 profile primitives.\n *\n * @formula PLAN \u00A79.2 / \u00A710.1.1 \u2014 slice the lane/finer window, bucket\n * volume by price, compute POC/value-area, optionally compute\n * developing POC/VA series in lane-bar space.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const profile = computeProfile({ laneBars: bars, finerBars: [], windowFromIdx: 0, windowToIdx: bars.length - 1, config: { rowSize: 20, valueAreaPct: 70 } });\n */\nexport function computeProfile(args: {\n laneBars: ReadonlyArray<VolumeProfileBar>;\n finerBars?: ReadonlyArray<VolumeProfileBar>;\n windowFromIdx: number;\n windowToIdx: number;\n config: VolumeProfileConfig;\n computeDeveloping?: boolean;\n}): VolumeProfileResult {\n const { laneBars, config } = args;\n const finerBars = args.finerBars ?? [];\n if (laneBars.length === 0) return emptyProfile(false, null, null);\n\n const fromIdx = Math.max(0, Math.min(laneBars.length - 1, args.windowFromIdx));\n const toIdx = Math.max(fromIdx, Math.min(laneBars.length - 1, args.windowToIdx));\n const laneSlice = laneBars.slice(fromIdx, toIdx + 1);\n\n const finerSlice = sliceBarsByTime(\n finerBars,\n laneSlice[0].time,\n laneSlice[laneSlice.length - 1].time,\n );\n const bucketSource = finerSlice.length > 0 ? finerSlice : laneSlice;\n const range = derivePriceRange(bucketSource);\n const costStatus = assessVolumeProfileCost({\n finerCandleCount: finerSlice.length,\n priceMax: range.priceMax,\n priceMin: range.priceMin,\n rowSize: config.rowSize,\n rowsLayout: config.rowsLayout ?? \"numberOfRows\",\n tickSize: config.tickSize ?? DEFAULT_TICK_SIZE,\n });\n if (costStatus.heavy)\n return emptyProfile(costStatus.heavy, costStatus.reason, costStatus.recommendedRowSize);\n if (range.priceMax <= range.priceMin) return emptyProfile(false, null, null);\n\n const edges = buildBucketEdges(\n range.priceMin,\n range.priceMax,\n config.rowsLayout ?? \"numberOfRows\",\n config.rowSize,\n config.tickSize ?? DEFAULT_TICK_SIZE,\n );\n const bucketized = bucketizeVolumeDetailed(bucketSource, edges, config.volumeSplit ?? \"upDown\");\n if (bucketized.totalVolume <= 0) return emptyProfile(false, null, null);\n\n const valueArea = computeValueArea(bucketized.rows, config.valueAreaPct, bucketized.pocIdx);\n const valueAreaMask = new Float64Array(bucketized.rows.length);\n const lo = Math.min(valueArea.vahIdx, valueArea.valIdx);\n const hi = Math.max(valueArea.vahIdx, valueArea.valIdx);\n for (let i = 0; i < valueAreaMask.length; i += 1) valueAreaMask[i] = i >= lo && i <= hi ? 1 : 0;\n\n const base = {\n buckets: bucketized.buckets,\n costStatus,\n poc: valueArea.poc,\n rows: bucketized.rows,\n valHigh: valueArea.valHigh,\n valLow: valueArea.valLow,\n valueAreaMask,\n };\n\n if (args.computeDeveloping === true) {\n return {\n ...base,\n developing: computeDevelopingSeries({\n config,\n finerBars,\n laneBars,\n windowFromIdx: fromIdx,\n windowToIdx: toIdx,\n }),\n };\n }\n\n return base;\n}\n\nfunction emptyProfile(\n heavy: boolean,\n reason: VolumeProfileResult[\"costStatus\"][\"reason\"],\n recommendedRowSize: number | null,\n): VolumeProfileResult {\n return {\n buckets: [],\n costStatus: { heavy, reason, recommendedRowSize },\n poc: Number.NaN,\n rows: [],\n valHigh: Number.NaN,\n valLow: Number.NaN,\n valueAreaMask: new Float64Array(0),\n };\n}\n\n/**\n * Slice sorted bars to the inclusive `[timeFromMs, timeToMs]` window.\n *\n * @formula PLAN \u00A710.1.1 \u2014 finer lower-timeframe bars are clipped to\n * the same wall-clock window as the lane profile.\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const slice = sliceBarsByTime(bars, 0, 60_000);\n */\nexport function sliceBarsByTime(\n bars: ReadonlyArray<VolumeProfileBar>,\n timeFromMs: number,\n timeToMs: number,\n): ReadonlyArray<VolumeProfileBar> {\n if (bars.length === 0) return bars;\n const start = lowerBoundTime(bars, timeFromMs);\n const end = upperBoundTime(bars, timeToMs);\n if (start >= end) return [];\n return bars.slice(start, end);\n}\n\nfunction lowerBoundTime(bars: ReadonlyArray<VolumeProfileBar>, target: number): number {\n let lo = 0;\n let hi = bars.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (bars[mid].time < target) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\nfunction upperBoundTime(bars: ReadonlyArray<VolumeProfileBar>, target: number): number {\n let lo = 0;\n let hi = bars.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (bars[mid].time <= target) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { PlotEmission } from \"@invinite-org/chartlang-adapter-kit\";\n\nimport { pushDiagnostic, pushPlot } from \"../../../emit/index.js\";\nimport { Float64RingBuffer } from \"../../../ringBuffer.js\";\nimport type { RuntimeContext } from \"../../../runtimeContext.js\";\n\nimport { type VolumeProfileBar, type VolumeProfileResult, computeProfile } from \"./index.js\";\nimport type { ProfileConfig } from \"./index.js\";\n\n/**\n * Histogram bucket shape shared by all four volume-profile primitives.\n *\n * @formula N/A \u2014 internal volume-profile slot scaffolding (see the four\n * `ta.*VolumeProfile` primitives for the math contract).\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const bucket: HistogramBucket = { price: 100, volume: 10 };\n */\nexport type HistogramBucket = Readonly<{\n price: number;\n volume: number;\n color?: string;\n}>;\n\n/**\n * The \"what we computed for this bar\" snapshot used to commit to the\n * slot's ring buffers and emit the histogram. NaN values short-circuit\n * the buffer writes to NaN-warmup.\n *\n * @formula N/A \u2014 internal volume-profile slot scaffolding (see the four\n * `ta.*VolumeProfile` primitives for the math contract).\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const snap: VolumeProfileSnapshot = { buckets: [], poc: NaN, valHigh: NaN, valLow: NaN };\n */\nexport type VolumeProfileSnapshot = Readonly<{\n buckets: ReadonlyArray<HistogramBucket>;\n poc: number;\n valHigh: number;\n valLow: number;\n}>;\n\n/**\n * Per-VP slot state: three Float64 ring buffers (POC / VAH / VAL) plus\n * the latest computed buckets. Callers wrap this with a primitive-\n * specific `result` object that exposes `Series<number>` views over the\n * buffers and (optionally) the `buckets` getter.\n *\n * @formula N/A \u2014 internal volume-profile slot scaffolding (see the four\n * `ta.*VolumeProfile` primitives for the math contract).\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const core = createVolumeProfileCore(capacity);\n */\nexport type VolumeProfileCore = {\n readonly pocBuffer: Float64RingBuffer;\n readonly valHighBuffer: Float64RingBuffer;\n readonly valLowBuffer: Float64RingBuffer;\n buckets: ReadonlyArray<HistogramBucket>;\n};\n\nconst DEFAULT_ROW_SIZE = 24;\nconst DEFAULT_VALUE_AREA_PCT = 0.7;\nconst HISTOGRAM_SLOT_SUFFIX = \"/histogram\";\n\n/**\n * Allocate the three Float64 ring buffers + an empty `buckets` array\n * shared by every volume-profile slot.\n *\n * @formula N/A \u2014 internal volume-profile slot scaffolding (see the four\n * `ta.*VolumeProfile` primitives for the math contract).\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const core = createVolumeProfileCore(capacity);\n */\nexport function createVolumeProfileCore(capacity: number): VolumeProfileCore {\n return {\n buckets: [],\n pocBuffer: new Float64RingBuffer(capacity),\n valHighBuffer: new Float64RingBuffer(capacity),\n valLowBuffer: new Float64RingBuffer(capacity),\n };\n}\n\n/**\n * Normalise a primitive's options into the shared `ProfileConfig`.\n * `rowSize` defaults to 24 and `valueAreaPct` defaults to 0.7 \u2014 both\n * values match the upstream invinite reference. `valueAreaPct <= 1` is\n * interpreted as a fraction and scaled to percent.\n *\n * @formula N/A \u2014 internal volume-profile slot scaffolding (see the four\n * `ta.*VolumeProfile` primitives for the math contract).\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const cfg = volumeProfileConfigFromOpts({ rowSize: 20, valueAreaPct: 0.7 });\n */\nexport function volumeProfileConfigFromOpts(opts: {\n rowSize?: number;\n valueAreaPct?: number;\n}): ProfileConfig {\n const rowSize = opts.rowSize;\n const valueAreaPct = opts.valueAreaPct ?? DEFAULT_VALUE_AREA_PCT;\n return {\n rowSize: rowSize === undefined || rowSize <= 0 ? DEFAULT_ROW_SIZE : rowSize,\n valueAreaPct: valueAreaPct <= 1 ? valueAreaPct * 100 : valueAreaPct,\n };\n}\n\n/**\n * Apply a single-bucket fallback for windows where the full bucketizer\n * cannot produce a profile (constant-price input, single-bar window,\n * etc.). Returns `null` when no finite-close / positive-volume bar\n * exists in the window.\n *\n * @formula N/A \u2014 internal volume-profile slot scaffolding (see the four\n * `ta.*VolumeProfile` primitives for the math contract).\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const fallback = degenerateVolumeProfile(bars, \"#fff\");\n */\nexport function degenerateVolumeProfile(\n bars: ReadonlyArray<VolumeProfileBar>,\n bucketColor: string | undefined,\n): VolumeProfileSnapshot | null {\n let totalVolume = 0;\n let price = Number.NaN;\n for (const bar of bars) {\n if (!Number.isFinite(bar.close)) continue;\n price = bar.close;\n if (Number.isFinite(bar.volume) && bar.volume > 0) totalVolume += bar.volume;\n }\n if (!Number.isFinite(price) || totalVolume <= 0) return null;\n const bucket =\n bucketColor === undefined\n ? { price, volume: totalVolume }\n : { price, volume: totalVolume, color: bucketColor };\n return {\n buckets: [bucket],\n poc: price,\n valHigh: price,\n valLow: price,\n };\n}\n\n/**\n * Empty / NaN snapshot returned when no bars are in the window and\n * the degenerate fallback also fails to produce one.\n *\n * @formula N/A \u2014 internal volume-profile slot scaffolding (see the four\n * `ta.*VolumeProfile` primitives for the math contract).\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const snap = emptyVolumeProfileSnapshot();\n */\nexport function emptyVolumeProfileSnapshot(): VolumeProfileSnapshot {\n return {\n buckets: [],\n poc: Number.NaN,\n valHigh: Number.NaN,\n valLow: Number.NaN,\n };\n}\n\n/**\n * Common \"compute \u2192 apply bucketColor \u2192 fall back to degenerate\"\n * pipeline used by every VP primitive.\n *\n * @formula N/A \u2014 internal volume-profile slot scaffolding (see the four\n * `ta.*VolumeProfile` primitives for the math contract).\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // const snap = resolveVolumeProfileSnapshot({ bars, config, bucketColor: \"#fff\" });\n */\nexport function resolveVolumeProfileSnapshot(args: {\n bars: ReadonlyArray<VolumeProfileBar>;\n config: ProfileConfig;\n bucketColor: string | undefined;\n}): VolumeProfileSnapshot {\n const { bars, config, bucketColor } = args;\n const profile: VolumeProfileResult | null =\n bars.length === 0\n ? null\n : computeProfile({\n config,\n laneBars: bars,\n windowFromIdx: 0,\n windowToIdx: bars.length - 1,\n });\n if (profile !== null && profile.buckets.length > 0) {\n return {\n buckets: profile.buckets.map((bucket) =>\n bucketColor === undefined ? bucket : { ...bucket, color: bucketColor },\n ),\n poc: profile.poc,\n valHigh: profile.valHigh,\n valLow: profile.valLow,\n };\n }\n return degenerateVolumeProfile(bars, bucketColor) ?? emptyVolumeProfileSnapshot();\n}\n\n/**\n * Commit a snapshot to a slot's POC / VAH / VAL ring buffers. Append\n * on close, replace-head on tick. Updates the `buckets` cache.\n *\n * @formula N/A \u2014 internal volume-profile slot scaffolding (see the four\n * `ta.*VolumeProfile` primitives for the math contract).\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // commitVolumeProfileSnapshot(core, false, snap);\n */\nexport function commitVolumeProfileSnapshot(\n core: VolumeProfileCore,\n isTick: boolean,\n snapshot: VolumeProfileSnapshot,\n): void {\n core.buckets = snapshot.buckets;\n if (isTick) {\n core.pocBuffer.replaceHead(snapshot.poc);\n core.valHighBuffer.replaceHead(snapshot.valHigh);\n core.valLowBuffer.replaceHead(snapshot.valLow);\n } else {\n core.pocBuffer.append(snapshot.poc);\n core.valHighBuffer.append(snapshot.valHigh);\n core.valLowBuffer.append(snapshot.valLow);\n }\n}\n\n/**\n * Emit the auto-generated `horizontal-histogram` PlotEmission for a\n * VP primitive, or a deduped `unsupported-plot-kind` diagnostic when\n * the adapter cannot render the kind. The dedup key includes the slot\n * id so an indicator that reuses VP across multiple call sites still\n * receives one diagnostic per call site, not per bar.\n *\n * @formula N/A \u2014 internal volume-profile slot scaffolding (see the four\n * `ta.*VolumeProfile` primitives for the math contract).\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // emitVolumeProfileHistogram(ctx, slotId, \"Anchored Volume Profile\", snap.poc, snap.buckets);\n */\nexport function emitVolumeProfileHistogram(\n ctx: RuntimeContext,\n slotId: string,\n title: string,\n value: number,\n buckets: ReadonlyArray<HistogramBucket>,\n): void {\n if (!ctx.capabilities.plots.has(\"horizontal-histogram\")) {\n const key = `unsupported-plot-kind|${slotId}`;\n if (ctx.diagnosedRequestKeys.has(key)) return;\n ctx.diagnosedRequestKeys.add(key);\n pushDiagnostic(ctx.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"unsupported-plot-kind\",\n message: 'Adapter cannot render plot kind \"horizontal-histogram\".',\n slotId,\n bar: ctx.barIndex(),\n });\n return;\n }\n const emission: PlotEmission = {\n bar: ctx.barIndex(),\n color: null,\n kind: \"plot\",\n meta: {},\n pane: \"overlay\",\n slotId: `${slotId}${HISTOGRAM_SLOT_SUFFIX}`,\n style: { kind: \"horizontal-histogram\", buckets },\n time: ctx.stream.bar.time,\n title,\n value: Number.isFinite(value) ? value : null,\n };\n pushPlot(ctx.emissions, emission);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// Ported from ../invinite/src/components/trading-chart/indicators/anchored-volume-profile.ts\n// @ 3234c8c0c3f9880d9d1e3a3ee63ebd55ddd535f4.\n// Translated, not transcribed \u2014 Series<T> shape, input.time anchor, opts.offset, JSDoc.\n// See packages/runtime/src/ta/CLAUDE.md for the port convention.\n\nimport type {\n AnchoredVolumeProfileOpts,\n AnchoredVolumeProfileResult,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport {\n type VolumeProfileBar,\n type VolumeProfileCore,\n commitVolumeProfileSnapshot,\n createVolumeProfileCore,\n emitVolumeProfileHistogram,\n resolveVolumeProfileSnapshot,\n volumeProfileConfigFromOpts,\n} from \"./lib/volume-profile/index.js\";\n\ntype AnchoredVolumeProfileSlot = VolumeProfileCore & {\n readonly result: AnchoredVolumeProfileResult;\n readonly shiftedResults: Map<number, AnchoredVolumeProfileResult>;\n};\n\ntype MutableAnchoredVolumeProfileSlot = Omit<AnchoredVolumeProfileSlot, \"result\"> & {\n result: AnchoredVolumeProfileResult;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.anchoredVolumeProfile called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): AnchoredVolumeProfileSlot {\n const core = createVolumeProfileCore(capacity);\n const slot: MutableAnchoredVolumeProfileSlot = {\n ...core,\n result: Object.freeze({\n get buckets() {\n return slot.buckets;\n },\n poc: makeSeriesView<number>(core.pocBuffer),\n valHigh: makeSeriesView<number>(core.valHighBuffer),\n valLow: makeSeriesView<number>(core.valLowBuffer),\n }),\n shiftedResults: new Map(),\n };\n return slot;\n}\n\nfunction resultForOffset(\n slot: AnchoredVolumeProfileSlot,\n offset: number,\n): AnchoredVolumeProfileResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n get buckets() {\n return slot.buckets;\n },\n poc: makeShiftedSeriesView<number>(slot.pocBuffer, offset),\n valHigh: makeShiftedSeriesView<number>(slot.valHighBuffer, offset),\n valLow: makeShiftedSeriesView<number>(slot.valLowBuffer, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\nfunction collectBars(ctx: RuntimeContext, anchor: number): ReadonlyArray<VolumeProfileBar> {\n if (ctx.stream.bar.time <= anchor) return [];\n\n const { ohlcv } = ctx.stream;\n const bars: VolumeProfileBar[] = [];\n for (let lookback = ohlcv.close.length - 1; lookback >= 0; lookback -= 1) {\n const time = ohlcv.time.at(lookback);\n if (time < anchor) continue;\n bars.push({\n close: ohlcv.close.at(lookback),\n high: ohlcv.high.at(lookback),\n low: ohlcv.low.at(lookback),\n open: ohlcv.open.at(lookback),\n time,\n volume: ohlcv.volume.at(lookback),\n });\n }\n return bars;\n}\n\n/**\n * Anchored Volume Profile \u2014 reads a user-picked time anchor and\n * bucketizes volume from that anchor forward.\n *\n * @formula Port of invinite anchored-volume-profile: find the first\n * candle with `time >= anchor`, bucket anchor\u2192right-edge\n * volume by price, then derive POC / value-area high /\n * value-area low through the shared volume-profile pipeline.\n * @anchors `opts.anchor: Time` \u2014 supplied by `input.time(..., { pickFromChart: true })`.\n * @warmup NaN through the bar at `anchor`; first bar after `anchor`\n * can emit once the anchor\u2192current window has positive volume.\n * @since 0.5\n * @stable\n * @example\n * // import { input, plot, ta } from \"@invinite-org/chartlang-core\";\n * // const anchor = input.time(0, { pickFromChart: true });\n * // const vp = ta.anchoredVolumeProfile({ anchor: anchor.value, rowSize: 24 });\n * // plot(vp.poc, { style: { kind: \"horizontal-histogram\", buckets: vp.buckets } });\n */\nexport function anchoredVolumeProfile(\n slotId: string,\n opts: AnchoredVolumeProfileOpts,\n): AnchoredVolumeProfileResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as AnchoredVolumeProfileSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n\n const snapshot = resolveVolumeProfileSnapshot({\n bars: collectBars(ctx, opts.anchor),\n bucketColor: opts.bucketColor,\n config: volumeProfileConfigFromOpts(opts),\n });\n commitVolumeProfileSnapshot(slot, ctx.isTick, snapshot);\n emitVolumeProfileHistogram(\n ctx,\n slotId,\n \"Anchored Volume Profile\",\n snapshot.poc,\n snapshot.buckets,\n );\n return resultForOffset(slot, opts.offset ?? 0);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/anchored-vwap.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape.\n\nimport type { AnchoredVwapOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\n\ntype AnchoredVwapSource = NonNullable<AnchoredVwapOpts[\"source\"]>;\n\nconst DEFAULT_SOURCE: AnchoredVwapSource = \"hlc3\";\n\ntype AnchoredVwapSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n /** Sticky anchor \u2014 captured on slot init, ignored on subsequent calls. */\n readonly anchorTime: number;\n /** Active cumulative price\u00B7volume since the first bar \u2265 anchorTime. */\n cumPV: number;\n /** Active cumulative volume since the first bar \u2265 anchorTime. */\n cumV: number;\n /** True once a bar with `time \u2265 anchorTime` has closed. */\n started: boolean;\n /** Snapshot of `cumPV` BEFORE the most recent close-side update. */\n prevClosedCumPV: number;\n /** Snapshot of `cumV` BEFORE the most recent close-side update. */\n prevClosedCumV: number;\n /** Snapshot of `started` BEFORE the most recent close-side update. */\n prevClosedStarted: boolean;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.anchoredVwap called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number, anchorTime: number): AnchoredVwapSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n anchorTime,\n cumPV: 0,\n cumV: 0,\n started: false,\n prevClosedCumPV: 0,\n prevClosedCumV: 0,\n prevClosedStarted: false,\n };\n}\n\nfunction readSource(ctx: RuntimeContext, source: AnchoredVwapSource): number {\n switch (source) {\n case \"close\":\n return ctx.stream.bar.close;\n case \"hl2\":\n return ctx.stream.bar.hl2;\n case \"hlc3\":\n return ctx.stream.bar.hlc3;\n case \"ohlc4\":\n return ctx.stream.bar.ohlc4;\n case \"hlcc4\":\n return ctx.stream.bar.hlcc4;\n }\n}\n\n/**\n * Fold one bar against an accumulator. Returns the post-fold tuple.\n * Bars with `time < anchor` are skipped (the accumulator is unchanged,\n * `started` stays false). NaN source or non-positive / NaN volume\n * contributes zero \u2014 the accumulator stays well-defined across data\n * gaps.\n */\nfunction fold(\n inCumPV: number,\n inCumV: number,\n inStarted: boolean,\n anchorTime: number,\n time: number,\n src: number,\n volume: number,\n): { cumPV: number; cumV: number; started: boolean } {\n if (time < anchorTime) {\n return { cumPV: inCumPV, cumV: inCumV, started: inStarted };\n }\n let cumPV = inCumPV;\n let cumV = inCumV;\n if (Number.isFinite(src) && Number.isFinite(volume) && volume > 0) {\n cumPV += src * volume;\n cumV += volume;\n }\n return { cumPV, cumV, started: true };\n}\n\nfunction valueFromCum(started: boolean, cumPV: number, cumV: number): number {\n if (!started || cumV === 0) return Number.NaN;\n return cumPV / cumV;\n}\n\n/**\n * Anchored Volume-Weighted Average Price \u2014 accumulates\n * `\u03A3(source \u00B7 volume) / \u03A3(volume)` over every bar at or after\n * `anchorTime` (a UTC millisecond epoch the script author hard-codes\n * or computes from a literal). Bars with `bar.time < anchorTime` emit\n * `NaN`; the first bar with `bar.time \u2265 anchorTime` starts the\n * accumulation, which never resets.\n *\n * **Sticky anchor.** The anchor is captured on the first call (slot\n * init) and ignored on subsequent calls \u2014 the slot's anchor is\n * sticky. Re-anchoring requires a new compiler-generated callsite id\n * (i.e. editing the script). Phase 4's `input.time()` will lift the\n * anchor to a user input that can change at runtime.\n *\n * **NaN handling.** NaN source or non-positive / NaN volume\n * contributes zero (the average stays well-defined across data gaps).\n * Bars before `anchorTime` or before any volume has accumulated emit\n * NaN.\n *\n * **Tick mode.** Replays the head bar's contribution against a\n * snapshot of the prior-close `(cumPV, cumV, started)` tuple so a\n * partial-bar tick doesn't pollute the next close's accumulator.\n *\n * @formula anchoredVwap[t] = \u03A3_{u \u2265 anchor}(source[u] \u00B7 volume[u]) / \u03A3_{u \u2265 anchor}(volume[u])\n * @warmup 0 (NaN until first bar with `bar.time \u2265 anchorTime`)\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const av = ta.anchoredVwap(\"slot\", 1_700_000_000_000);\n * // const head = av.current;\n */\nexport function anchoredVwap(\n slotId: string,\n anchorTime: number,\n opts?: AnchoredVwapOpts,\n): Series<number> {\n const ctx = getCtx();\n const source = opts?.source ?? DEFAULT_SOURCE;\n let slot = ctx.stream.taSlots.get(slotId) as AnchoredVwapSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity, anchorTime);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSource(ctx, source);\n const volume = ctx.stream.bar.volume;\n const time = ctx.stream.bar.time;\n\n if (ctx.isTick) {\n const next = fold(\n slot.prevClosedCumPV,\n slot.prevClosedCumV,\n slot.prevClosedStarted,\n slot.anchorTime,\n time,\n src,\n volume,\n );\n slot.outBuffer.replaceHead(valueFromCum(next.started, next.cumPV, next.cumV));\n return slot.series;\n }\n\n // Close-side: snapshot the prior-close state, then fold in the new bar.\n slot.prevClosedCumPV = slot.cumPV;\n slot.prevClosedCumV = slot.cumV;\n slot.prevClosedStarted = slot.started;\n const next = fold(slot.cumPV, slot.cumV, slot.started, slot.anchorTime, time, src, volume);\n slot.cumPV = next.cumPV;\n slot.cumV = next.cumV;\n slot.started = next.started;\n slot.outBuffer.append(valueFromCum(slot.started, slot.cumPV, slot.cumV));\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/sma.ts\n// plus lib/sma-of-float64.ts\n// (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape.\n\nimport type { Series, SmaOpts } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype SmaSlot = {\n readonly kind: \"ta.sma\";\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /**\n * Window of the **closed** source values across the last `length` bars.\n * Holds bars `[t-length+1 .. t]` for the latest closed bar t. Ticks\n * compute a hypothetical \"head replaced\" mean from `windowSum -\n * window.at(0) + tickValue`; closes pop the oldest and push the new.\n */\n readonly window: Float64RingBuffer;\n sum: number;\n /**\n * Lazy cache of offset-shifted Series views keyed by `opts.offset`.\n * `offset === 0` callers bypass this map and return `series`\n * directly \u2014 identity-preserving. Populated on first call per\n * non-zero offset; identity is stable per offset thereafter.\n */\n readonly shiftedViews: Map<number, Series<number>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.sma called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): SmaSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n kind: \"ta.sma\",\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n window: new Float64RingBuffer(length),\n sum: 0,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: SmaSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction tickValue(slot: SmaSlot, src: number): number {\n // `window` currently holds the close-side values `[t-length+1 .. t]` for\n // the most-recent closed bar. The tick replaces bar `t`'s value with\n // `src`, so the hypothetical mean is `(sum - window.at(0)) + src`.\n if (!Number.isFinite(src)) return Number.NaN;\n if (slot.window.length < slot.length) return Number.NaN;\n const oldestInHead = slot.window.at(0);\n return (slot.sum - oldestInHead + src) / slot.length;\n}\n\nfunction closeValue(slot: SmaSlot, src: number): number {\n if (!Number.isFinite(src)) {\n // Skip the window update; emit the prior closed mean (or NaN when\n // unwarmed). The window's contents are unchanged so future closes\n // continue against the last valid set.\n if (slot.window.length < slot.length) return Number.NaN;\n return slot.sum / slot.length;\n }\n if (slot.window.length < slot.length) {\n slot.window.append(src);\n slot.sum += src;\n if (slot.window.length < slot.length) return Number.NaN;\n return slot.sum / slot.length;\n }\n const outgoing = slot.window.at(slot.length - 1);\n slot.window.append(src);\n slot.sum = slot.sum + src - outgoing;\n return slot.sum / slot.length;\n}\n\n/**\n * Simple moving average \u2014 rolling mean of the last `length` source\n * values. Warmup of `length \u2212 1` bars returns `NaN`. Tick-mode replays\n * the head as `(window_sum \u2212 window_head + tick_value) / length` so a\n * partial-bar tick doesn't pollute the next close's running sum.\n * `opts.offset` shifts the returned series so `series.current` reads\n * the value `offset` bars ago (PLAN.md \u00A79.1).\n *\n * @formula out[t] = (source[t] + source[t \u2212 1] + \u2026 + source[t \u2212 length + 1]) / length\n * @warmup length \u2212 1\n * @since 0.1\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const s = ta.sma(\"slot\", bar.close, 20);\n * // const head = s.current; // NaN until bar length-1\n * // const lagged = ta.sma(\"slot2\", bar.close, 20, { offset: 5 });\n */\nexport function sma(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: SmaOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as SmaSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src));\n } else {\n slot.outBuffer.append(closeValue(slot, src));\n }\n return viewForOffset(slot, opts?.offset ?? 0);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/ao.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n\nimport type { AoOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { sma } from \"./sma.js\";\n\nconst DEFAULT_FAST_LENGTH = 5;\nconst DEFAULT_SLOW_LENGTH = 34;\n\ntype AoSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly fastSmaSub: string;\n readonly slowSmaSub: string;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.ao called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number, slotId: string): AoSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n fastSmaSub: `${slotId}/fastSma`,\n slowSmaSub: `${slotId}/slowSma`,\n };\n}\n\nfunction combine(fast: number, slow: number): number {\n if (!Number.isFinite(fast) || !Number.isFinite(slow)) return Number.NaN;\n return fast - slow;\n}\n\n/**\n * Awesome Oscillator \u2014 `SMA(hl2, fastLength) \u2212 SMA(hl2, slowLength)`.\n * Sources from `bar.hl2` directly (no `source` arg \u2014 matches Pine\n * `ta.ao()`). Defaults to `fastLength = 5`, `slowLength = 34`.\n * Composes two `ta.sma` sub-slots (`${slotId}/fastSma`,\n * `${slotId}/slowSma`); a fix to `sma` flows in for free. Warmup is\n * `slowLength \u2212 1` bars (the longer SMA dominates).\n *\n * @formula AO[t] = SMA(hl2, fastLength)[t] \u2212 SMA(hl2, slowLength)[t]\n * @warmup slowLength \u2212 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const a = ta.ao(\"slot\");\n * // const head = a.current;\n */\nexport function ao(slotId: string, opts?: AoOpts): Series<number> {\n const ctx = getCtx();\n const fastLength = opts?.fastLength ?? DEFAULT_FAST_LENGTH;\n const slowLength = opts?.slowLength ?? DEFAULT_SLOW_LENGTH;\n let slot = ctx.stream.taSlots.get(slotId) as AoSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity, slotId);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const hl2 = ctx.stream.bar.hl2;\n const fastSeries = sma(slot.fastSmaSub, hl2, fastLength);\n const slowSeries = sma(slot.slowSmaSub, hl2, slowLength);\n const value = combine(fastSeries.current, slowSeries.current);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(value);\n } else {\n slot.outBuffer.append(value);\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/aroon.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Aroon reads `bar.high` / `bar.low` directly\n// (mirrors Pine's `ta.aroon(length)` which has no source param) and\n// scans the trailing `length + 1` window per close for the argmax /\n// argmin (matches the invinite reference's `computeAroonSeries` loop).\n\nimport type { AroonOpts, AroonResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\n\ntype AroonSlot = {\n readonly outputs: AroonResult;\n readonly upBuffer: Float64RingBuffer;\n readonly downBuffer: Float64RingBuffer;\n readonly length: number;\n /**\n * Closed-bar `high`s across the trailing `length + 1` window.\n * `at(0)` is the most recent close; `at(length)` is the oldest.\n */\n readonly highWindow: Float64RingBuffer;\n /** Closed-bar `low`s across the trailing `length + 1` window. */\n readonly lowWindow: Float64RingBuffer;\n /** Number of CLOSED bars folded into the slot so far. */\n barCount: number;\n /**\n * Bars-since-high computed at the most recent close (0-based,\n * `0 \u2264 value \u2264 length`). Updated only on close-side advances.\n */\n lastHighIndex: number;\n /** Bars-since-low computed at the most recent close. */\n lastLowIndex: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.aroon called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): AroonSlot {\n const upBuffer = new Float64RingBuffer(capacity);\n const downBuffer = new Float64RingBuffer(capacity);\n return {\n outputs: Object.freeze({\n up: makeSeriesView<number>(upBuffer),\n down: makeSeriesView<number>(downBuffer),\n }),\n upBuffer,\n downBuffer,\n length,\n highWindow: new Float64RingBuffer(length + 1),\n lowWindow: new Float64RingBuffer(length + 1),\n barCount: 0,\n lastHighIndex: 0,\n lastLowIndex: 0,\n };\n}\n\n/**\n * Scan the `length + 1` window for the bars-since-high index. NaN\n * entries are skipped (cannot win argmax). Tie-break: smallest age\n * wins (the most-recent extreme \u2014 matches invinite's `>` comparison\n * and TradingView's convention). Returns `-1` if every entry in the\n * window is NaN.\n *\n * `headHigh` is the candidate value for age 0 \u2014 passed separately so\n * tick replay can substitute the tick's head value without mutating\n * the closed `highWindow`.\n */\nfunction scanHighArgmax(window: Float64RingBuffer, headHigh: number, length: number): number {\n let bestIdx = -1;\n let bestVal = Number.NEGATIVE_INFINITY;\n if (Number.isFinite(headHigh)) {\n bestIdx = 0;\n bestVal = headHigh;\n }\n for (let k = 1; k <= length; k += 1) {\n const v = window.at(k);\n if (Number.isFinite(v) && v > bestVal) {\n bestVal = v;\n bestIdx = k;\n }\n }\n return bestIdx;\n}\n\nfunction scanLowArgmin(window: Float64RingBuffer, headLow: number, length: number): number {\n let bestIdx = -1;\n let bestVal = Number.POSITIVE_INFINITY;\n if (Number.isFinite(headLow)) {\n bestIdx = 0;\n bestVal = headLow;\n }\n for (let k = 1; k <= length; k += 1) {\n const v = window.at(k);\n if (Number.isFinite(v) && v < bestVal) {\n bestVal = v;\n bestIdx = k;\n }\n }\n return bestIdx;\n}\n\nfunction closeStep(slot: AroonSlot, high: number, low: number): { up: number; down: number } {\n slot.barCount += 1;\n slot.highWindow.append(high);\n slot.lowWindow.append(low);\n\n // Per the invinite reference: warmup is `length` bars; the first\n // finite output lands at `barCount === length + 1` (the bar at\n // 0-based index `length`).\n if (slot.barCount <= slot.length) {\n return { up: Number.NaN, down: Number.NaN };\n }\n\n const barsSinceHigh = scanHighArgmax(slot.highWindow, slot.highWindow.at(0), slot.length);\n const barsSinceLow = scanLowArgmin(slot.lowWindow, slot.lowWindow.at(0), slot.length);\n if (barsSinceHigh === -1 || barsSinceLow === -1) {\n return { up: Number.NaN, down: Number.NaN };\n }\n slot.lastHighIndex = barsSinceHigh;\n slot.lastLowIndex = barsSinceLow;\n const up = (100 * (slot.length - barsSinceHigh)) / slot.length;\n const down = (100 * (slot.length - barsSinceLow)) / slot.length;\n return { up, down };\n}\n\nfunction tickStep(slot: AroonSlot, high: number, low: number): { up: number; down: number } {\n if (slot.barCount <= slot.length) return { up: Number.NaN, down: Number.NaN };\n // Substitute the tick's head values into the scan without mutating\n // the closed window. The age-0 slot in `highWindow` / `lowWindow`\n // still holds the most recent CLOSE; we pass `high` / `low` as the\n // override.\n const barsSinceHigh = scanHighArgmax(slot.highWindow, high, slot.length);\n const barsSinceLow = scanLowArgmin(slot.lowWindow, low, slot.length);\n if (barsSinceHigh === -1 || barsSinceLow === -1) {\n return { up: Number.NaN, down: Number.NaN };\n }\n const up = (100 * (slot.length - barsSinceHigh)) / slot.length;\n const down = (100 * (slot.length - barsSinceLow)) / slot.length;\n return { up, down };\n}\n\n/**\n * Aroon \u2014 recency-of-extreme oscillator over the trailing `length + 1`\n * bars. `aroon.up` tracks how recently a new N-bar high was made;\n * `aroon.down` mirrors with N-bar lows. Both Series \u2208 [0, 100] when\n * defined; NaN until `length` closed bars have been folded in. Reads\n * `bar.high` / `bar.low` directly from the runtime stream (mirrors\n * Pine's `ta.aroon(length)` \u2014 no source param). Returns a cached\n * `{ up, down }` record (same identity every bar).\n *\n * @formula barsSinceHigh = age (0..length) of the max high in window ;\n * barsSinceLow = age (0..length) of the min low in window ;\n * up = 100 \u00B7 (length \u2212 barsSinceHigh) / length ;\n * down = 100 \u00B7 (length \u2212 barsSinceLow) / length\n * @warmup length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const a = ta.aroon(14);\n * // plot(a.up);\n * // plot(a.down);\n */\nexport function aroon(slotId: string, length: number, _opts?: AroonOpts): AroonResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as AroonSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const high = ctx.stream.bar.high;\n const low = ctx.stream.bar.low;\n if (ctx.isTick) {\n const { up, down } = tickStep(slot, high, low);\n slot.upBuffer.replaceHead(up);\n slot.downBuffer.replaceHead(down);\n } else {\n const { up, down } = closeStep(slot, high, low);\n slot.upBuffer.append(up);\n slot.downBuffer.append(down);\n }\n return slot.outputs;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/aroon-osc.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. AroonOsc composes `ta.aroon` via a sub-slot\n// id `${slotId}/aroon`, so a fix to Aroon flows in for free.\n\nimport type { AroonOscOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { aroon } from \"./aroon.js\";\n\ntype AroonOscSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.aroonOsc called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): AroonOscSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n };\n}\n\n/**\n * Aroon Oscillator \u2014 `aroon.up \u2212 aroon.down`. Bounded in `[-100, 100]`\n * when defined; NaN through the `length` warmup window. Composes\n * `ta.aroon` at sub-slot `${slotId}/aroon`, so the math is fed by\n * the same per-bar window scan and a fix to Aroon flows in for free.\n *\n * @formula osc = aroon.up \u2212 aroon.down\n * @warmup length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const osc = ta.aroonOsc(14);\n * // plot(osc);\n */\nexport function aroonOsc(slotId: string, length: number, _opts?: AroonOscOpts): Series<number> {\n const ctx = getCtx();\n // Compose: aroon(subSlotId, length) \u2014 no opts pass-through; aroon's\n // opts surface differs (it carries `outputs`) and the AroonOsc\n // surface concerns (`lineStyle`) don't pipe into the math.\n const r = aroon(`${slotId}/aroon`, length);\n\n let slot = ctx.stream.taSlots.get(slotId) as AroonOscSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const up = r.up.current;\n const down = r.down.current;\n const value = Number.isFinite(up) && Number.isFinite(down) ? up - down : Number.NaN;\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(value);\n } else {\n slot.outBuffer.append(value);\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/atr.ts\n// plus lib/tr-series.ts\n// (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. ATR derives from `bar.high`/`bar.low`/\n// `bar.close` directly \u2014 no `source` argument per Pine.\n\nimport type { AtrOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { wilderStep } from \"./lib/wilderSmoothing.js\";\n\ntype AtrSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n seedTrSum: number;\n /** Number of TR values folded into the seed so far. */\n trCount: number;\n atr: number;\n /** Close of the prior closed bar \u2014 used to compute TR on the next close. */\n prevClose: number;\n /** Close of the bar before the current bar (i.e. the close 2 bars ago). */\n prevPrevClose: number;\n /** ATR as of the prior closed bar \u2014 used by tick-mode replay. */\n prevClosedAtr: number;\n /** Per-offset Series-view cache; see `sma.ts` for the convention. */\n readonly shiftedViews: Map<number, Series<number>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.atr called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): AtrSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n seedTrSum: 0,\n trCount: 0,\n atr: Number.NaN,\n prevClose: Number.NaN,\n prevPrevClose: Number.NaN,\n prevClosedAtr: Number.NaN,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: AtrSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction trueRange(high: number, low: number, prevClose: number): number {\n if (!Number.isFinite(prevClose)) return high - low;\n return Math.max(high - low, Math.abs(high - prevClose), Math.abs(low - prevClose));\n}\n\nfunction closeValue(slot: AtrSlot, high: number, low: number, close: number): number {\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n if (Number.isFinite(slot.atr)) return slot.atr;\n return Number.NaN;\n }\n const tr = trueRange(high, low, slot.prevClose);\n slot.prevPrevClose = slot.prevClose;\n slot.prevClose = close;\n slot.trCount += 1;\n\n if (slot.trCount < slot.length) {\n slot.seedTrSum += tr;\n return Number.NaN;\n }\n if (slot.trCount === slot.length) {\n slot.seedTrSum += tr;\n slot.atr = slot.seedTrSum / slot.length;\n slot.prevClosedAtr = slot.atr;\n return slot.atr;\n }\n slot.prevClosedAtr = slot.atr;\n slot.atr = wilderStep(slot.atr, tr, slot.length);\n return slot.atr;\n}\n\nfunction tickValue(slot: AtrSlot, high: number, low: number, close: number): number {\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n return Number.isFinite(slot.atr) ? slot.atr : Number.NaN;\n }\n if (slot.trCount < slot.length) return Number.NaN;\n // Tick TR uses the **bar before the current bar**'s close \u2014 frozen\n // by the prior close-side advance as `prevPrevClose`.\n const tr = trueRange(high, low, slot.prevPrevClose);\n if (slot.trCount === slot.length) {\n // We just seeded on the current close; tick replays the same seed\n // (the seed window is fixed once the bar closes).\n return slot.atr;\n }\n return wilderStep(slot.prevClosedAtr, tr, slot.length);\n}\n\n/**\n * Wilder's Average True Range. Sources from `bar.high` / `bar.low` /\n * `bar.close` directly (no `source` arg \u2014 matches Pine). Seeds at bar\n * `length \u2212 1` as the simple mean of the first `length` TR values;\n * subsequent slots use the Wilder recurrence with \u03B1 = 1/length.\n *\n * @formula TR[t] = max(high \u2212 low, |high \u2212 prevClose|, |low \u2212 prevClose|) ;\n * seed at bar length \u2212 1 = mean(TR[0 .. length \u2212 1]) ;\n * ATR[t] = (ATR[t \u2212 1] \u00B7 (length \u2212 1) + TR[t]) / length\n * @warmup length \u2212 1\n * @since 0.1\n * @stable\n *\n * `opts.offset` shifts the returned series so `series.current` reads\n * the value `offset` bars ago (PLAN.md \u00A79.1).\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const a = ta.atr(\"slot\", 14);\n * // const head = a.current;\n * // const lagged = ta.atr(\"slot2\", 14, { offset: 5 });\n */\nexport function atr(slotId: string, length: number, opts?: AtrOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as AtrSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, bar.high, bar.low, bar.close));\n } else {\n slot.outBuffer.append(closeValue(slot, bar.high, bar.low, bar.close));\n }\n return viewForOffset(slot, opts?.offset ?? 0);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// No invinite source \u2014 semantics per Pine `ta.barssince`. See PLAN.md \u00A73.1.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape.\n\nimport type { BarssinceOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\n\ntype BarssinceSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly shiftedSeries: Map<number, Series<number>>;\n /** Bars elapsed since the most recent `condition === true`. */\n sinceTrue: number;\n /** Whether any `true` has ever been seen. */\n seenTrue: boolean;\n /** Snapshot BEFORE the most recent close (for tick replay). */\n prevSinceTrue: number;\n prevSeenTrue: boolean;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.barssince called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): BarssinceSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n shiftedSeries: new Map(),\n sinceTrue: 0,\n seenTrue: false,\n prevSinceTrue: 0,\n prevSeenTrue: false,\n };\n}\n\nfunction closeValue(slot: BarssinceSlot, fired: boolean): number {\n slot.prevSinceTrue = slot.sinceTrue;\n slot.prevSeenTrue = slot.seenTrue;\n if (fired) {\n slot.sinceTrue = 0;\n slot.seenTrue = true;\n } else if (slot.seenTrue) {\n slot.sinceTrue += 1;\n }\n return slot.seenTrue ? slot.sinceTrue : Number.NaN;\n}\n\nfunction tickValue(slot: BarssinceSlot, fired: boolean): number {\n // Replay against pre-close snapshot.\n let sinceTrue = slot.prevSinceTrue;\n let seenTrue = slot.prevSeenTrue;\n if (fired) {\n sinceTrue = 0;\n seenTrue = true;\n } else if (seenTrue) {\n sinceTrue += 1;\n }\n return seenTrue ? sinceTrue : Number.NaN;\n}\n\n/**\n * Number of bars since `condition === true` last fired. `0` at the\n * matching bar, `1` the next bar, etc. NaN until the first ever match.\n * NaN-condition values are treated as `false` \u2014 they do NOT reset the\n * counter.\n *\n * @formula out[t] = 0 if condition[t]; out[t \u2212 1] + 1 if seenTrue; NaN otherwise\n * @warmup data-dependent \u2014 NaN until the first `condition === true`\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const fast = ta.ema(bar.close, 12);\n * // const slow = ta.ema(bar.close, 26);\n * // const sinceCross = ta.barssince(ta.crossover(fast, slow));\n * // plot(sinceCross);\n */\nexport function barssince(\n slotId: string,\n condition: Series<boolean>,\n opts: BarssinceOpts = {},\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as BarssinceSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const fired = condition.current === true;\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, fired));\n } else {\n slot.outBuffer.append(closeValue(slot, fired));\n }\n const offset = opts.offset ?? 0;\n if (offset === 0) return slot.series;\n const shifted = slot.shiftedSeries.get(offset);\n if (shifted !== undefined) return shifted;\n const next = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedSeries.set(offset, next);\n return next;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/lib/rolling-stddev.ts\n// (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape.\n\nimport type { Series, StdevOpts } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype StdevSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n readonly biased: boolean;\n readonly window: Float64RingBuffer;\n sumX: number;\n sumX2: number;\n /** Per-offset Series-view cache; see `sma.ts` for the convention. */\n readonly shiftedViews: Map<number, Series<number>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.stdev called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number, biased: boolean): StdevSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n biased,\n window: new Float64RingBuffer(length),\n sumX: 0,\n sumX2: 0,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: StdevSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction denominator(slot: StdevSlot): number {\n return slot.biased ? slot.length : slot.length - 1;\n}\n\nfunction stddevFromSums(sumX: number, sumX2: number, slot: StdevSlot): number {\n const denom = denominator(slot);\n if (denom <= 0) return Number.NaN;\n const mean = sumX / slot.length;\n const variance = (sumX2 - slot.length * mean * mean) / denom;\n // Numerical: clamp tiny negatives from accumulated rounding error.\n return Math.sqrt(Math.max(0, variance));\n}\n\nfunction closeValue(slot: StdevSlot, src: number): number {\n if (!Number.isFinite(src)) {\n if (slot.window.length < slot.length) return Number.NaN;\n return stddevFromSums(slot.sumX, slot.sumX2, slot);\n }\n if (slot.window.length < slot.length) {\n slot.window.append(src);\n slot.sumX += src;\n slot.sumX2 += src * src;\n if (slot.window.length < slot.length) return Number.NaN;\n return stddevFromSums(slot.sumX, slot.sumX2, slot);\n }\n const outgoing = slot.window.at(slot.length - 1);\n slot.window.append(src);\n slot.sumX = slot.sumX + src - outgoing;\n slot.sumX2 = slot.sumX2 + src * src - outgoing * outgoing;\n return stddevFromSums(slot.sumX, slot.sumX2, slot);\n}\n\nfunction tickValue(slot: StdevSlot, src: number): number {\n if (!Number.isFinite(src)) return Number.NaN;\n if (slot.window.length < slot.length) return Number.NaN;\n const oldestInHead = slot.window.at(0);\n const sumX = slot.sumX - oldestInHead + src;\n const sumX2 = slot.sumX2 - oldestInHead * oldestInHead + src * src;\n return stddevFromSums(sumX, sumX2, slot);\n}\n\n/**\n * Rolling sample / population standard deviation over the last\n * `length` source values. Defaults to **biased = false** (sample\n * stddev, denominator `length \u2212 1`) to match core's `StdevOpts`.\n * `biased = true` switches to population (denominator `length`).\n *\n * @formula \u03BC = mean(window) ;\n * \u03C3 = sqrt(\u03A3(x \u2212 \u03BC)\u00B2 / N), N = length (biased) or length \u2212 1 (sample)\n * @warmup length \u2212 1\n * @since 0.1\n * @stable\n *\n * `opts.offset` shifts the returned series so `series.current` reads\n * the value `offset` bars ago (PLAN.md \u00A79.1).\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const s = ta.stdev(\"slot\", bar.close, 20, { biased: false });\n * // const head = s.current;\n * // const lagged = ta.stdev(\"slot2\", bar.close, 20, { offset: 5 });\n */\nexport function stdev(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: StdevOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as StdevSlot | undefined;\n if (slot === undefined) {\n const biased = opts?.biased === true;\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity, biased);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src));\n } else {\n slot.outBuffer.append(closeValue(slot, src));\n }\n return viewForOffset(slot, opts?.offset ?? 0);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/bb.ts\n// (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. BB is composed from `sma` + `stdev` via\n// sub-slot ids so a fix to either primitive flows in for free.\n\nimport type { BbOpts, BbResult, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { sma } from \"./sma.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\nimport { stdev } from \"./stdev.js\";\n\nconst DEFAULT_MULTIPLIER = 2;\n\ntype BbSlot = {\n readonly result: BbResult;\n readonly upper: Float64RingBuffer;\n readonly middle: Series<number>;\n readonly lower: Float64RingBuffer;\n /**\n * Reference to the SMA sub-slot's output ring buffer. Captured at\n * first call so per-offset shifted middle views can be constructed\n * without re-entering `sma()` (which would double-advance the\n * sub-slot's compute on every bar).\n */\n readonly middleBuf: Float64RingBuffer;\n /**\n * Per-offset frozen `BbResult` cache. `offset === 0` returns\n * `result` directly (identity-preserving). Each cached result\n * proxies the same three underlying buffers via shifted views.\n */\n readonly shiftedResults: Map<number, BbResult>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.bb called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number, middle: Series<number>, middleBuf: Float64RingBuffer): BbSlot {\n const upper = new Float64RingBuffer(capacity);\n const lower = new Float64RingBuffer(capacity);\n const upperView = makeSeriesView<number>(upper);\n const lowerView = makeSeriesView<number>(lower);\n return {\n result: Object.freeze({ upper: upperView, middle, lower: lowerView }),\n upper,\n middle,\n lower,\n middleBuf,\n shiftedResults: new Map(),\n };\n}\n\nfunction resultForOffset(slot: BbSlot, offset: number): BbResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n upper: makeShiftedSeriesView<number>(slot.upper, offset),\n middle: makeShiftedSeriesView<number>(slot.middleBuf, offset),\n lower: makeShiftedSeriesView<number>(slot.lower, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\n/**\n * Bollinger Bands \u2014 `multiplier \u00D7 \u03C3` envelope around an SMA(length)\n * middle band. Default `multiplier = 2` per Pine. Returns a cached\n * `{ upper, middle, lower }` record (same identity every bar) backed\n * by three `Series<number>` Proxies. The middle band is the\n * underlying SMA primitive's output (identity-shared).\n *\n * @formula middle = sma(source, length) ;\n * \u03C3 = stdev(source, length, { biased: true }) ;\n * upper = middle + multiplier \u00B7 \u03C3 ;\n * lower = middle \u2212 multiplier \u00B7 \u03C3\n * @warmup length \u2212 1\n * @since 0.1\n * @stable\n *\n * `opts.offset` shifts all three bands in lockstep (PLAN.md \u00A79.1) \u2014\n * `series.current` on each band returns the value `offset` bars ago.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const bands = ta.bb(\"slot\", bar.close, 20, { multiplier: 2 });\n * // const u = bands.upper.current;\n * // const lagged = ta.bb(\"slot2\", bar.close, 20, { offset: 5 });\n */\nexport function bb(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: BbOpts,\n): BbResult {\n const ctx = getCtx();\n const multiplier = opts?.multiplier ?? DEFAULT_MULTIPLIER;\n const src = readSourceValue(source);\n const middleSlotId = `${slotId}/sma`;\n const stdevSlotId = `${slotId}/stdev`;\n // Compose: sma updates the middle band; stdev updates a separate\n // rolling-sigma series. Both primitives respect ctx.isTick. The\n // un-shifted middle (no offset) drives the per-bar math; the\n // shifted middle for non-zero offset is composed lazily in\n // `resultForOffset` to keep the close-path tight.\n const middleSeries = sma(middleSlotId, src, length);\n // BB's invinite math uses population sigma (denominator length); we\n // pass `biased: true` so the helper matches.\n const sigmaSeries = stdev(stdevSlotId, src, length, { biased: true });\n\n let slot = ctx.stream.taSlots.get(slotId) as BbSlot | undefined;\n if (slot === undefined) {\n // Capture the SMA sub-slot's output ring buffer so future\n // shifted-view lookups don't need to re-enter `sma()`.\n const smaSlot = ctx.stream.taSlots.get(middleSlotId) as { outBuffer: Float64RingBuffer };\n slot = initSlot(ctx.stream.ohlcv.close.capacity, middleSeries, smaSlot.outBuffer);\n ctx.stream.taSlots.set(slotId, slot);\n }\n\n const mid = middleSeries.current;\n const sigma = sigmaSeries.current;\n let upperValue: number;\n let lowerValue: number;\n if (Number.isFinite(mid) && Number.isFinite(sigma)) {\n upperValue = mid + multiplier * sigma;\n lowerValue = mid - multiplier * sigma;\n } else {\n upperValue = Number.NaN;\n lowerValue = Number.NaN;\n }\n if (ctx.isTick) {\n slot.upper.replaceHead(upperValue);\n slot.lower.replaceHead(lowerValue);\n } else {\n slot.upper.append(upperValue);\n slot.lower.append(lowerValue);\n }\n return resultForOffset(slot, opts?.offset ?? 0);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/bb-percent-b.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. %B is composed from `ta.bb` via a sub-slot\n// (`${slotId}/bb`) so a fix to the BB envelope math flows in for free.\n\nimport type { BbPercentBOpts, BbResult, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { bb } from \"./bb.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_MULTIPLIER = 2;\n\ntype BbPercentBSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n readonly multiplier: number;\n bbSub: BbResult | null;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.bbPercentB called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, multiplier: number, capacity: number): BbPercentBSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n multiplier,\n bbSub: null,\n };\n}\n\nfunction percentBValue(src: number, upper: number, lower: number): number {\n if (!Number.isFinite(src) || !Number.isFinite(upper) || !Number.isFinite(lower)) {\n return Number.NaN;\n }\n const denom = upper - lower;\n if (denom === 0) return Number.NaN;\n return (src - lower) / denom;\n}\n\n/**\n * Bollinger %B \u2014 sub-pane oscillator measuring price position\n * relative to the Bollinger Band envelope. `0` sits on the lower\n * band, `1` on the upper; excursions past either signal a volatility\n * breakout. Composes `ta.bb` via sub-slot `${slotId}/bb` \u2014 a fix to\n * the BB envelope math flows in for free. NaN when the band collapses\n * (`upper === lower`) or during warmup.\n *\n * @formula bands = bb(source, length, { multiplier }) ;\n * pct = (source \u2212 bands.lower) / (bands.upper \u2212 bands.lower)\n * @warmup length \u2212 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const pct = ta.bbPercentB(bar.close, 20, { multiplier: 2 });\n * // plot(pct);\n */\nexport function bbPercentB(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: BbPercentBOpts,\n): Series<number> {\n const ctx = getCtx();\n const multiplier = opts?.multiplier ?? DEFAULT_MULTIPLIER;\n let slot = ctx.stream.taSlots.get(slotId) as BbPercentBSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, multiplier, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n const bands = bb(`${slotId}/bb`, source, length, { multiplier });\n if (slot.bbSub === null) slot.bbSub = bands;\n const value = percentBValue(src, bands.upper.current, bands.lower.current);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(value);\n } else {\n slot.outBuffer.append(value);\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/bbw.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Math scale follows the task spec\n// `(upper \u2212 lower) / middle` (raw ratio); invinite multiplies by 100\n// render-side for TV-parity display. BBW composes `ta.bb` via\n// sub-slot `${slotId}/bb` so a fix to the BB envelope flows in for free.\n\nimport type { BbResult, BbwOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { bb } from \"./bb.js\";\nimport type { ScalarOrSeries } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_MULTIPLIER = 2;\n\ntype BbwSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n readonly multiplier: number;\n bbSub: BbResult | null;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.bbw called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, multiplier: number, capacity: number): BbwSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n multiplier,\n bbSub: null,\n };\n}\n\nfunction bbwValue(upper: number, middle: number, lower: number): number {\n if (\n !Number.isFinite(upper) ||\n !Number.isFinite(middle) ||\n !Number.isFinite(lower) ||\n middle === 0\n ) {\n return Number.NaN;\n }\n return (upper - lower) / middle;\n}\n\n/**\n * Bollinger BandWidth \u2014 sub-pane volatility line. Compresses\n * (\"squeezes\") before breakouts. Composes `ta.bb` via sub-slot\n * `${slotId}/bb` \u2014 a fix to the BB envelope flows in for free.\n * Emits the raw ratio `(upper \u2212 lower) / middle`; multiply by 100\n * in the script for TradingView-parity display. NaN when the SMA\n * middle is zero or during warmup.\n *\n * @formula bands = bb(source, length, { multiplier }) ;\n * bbw = (bands.upper \u2212 bands.lower) / bands.middle\n * @warmup length \u2212 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const width = ta.bbw(bar.close, 20, { multiplier: 2 });\n * // plot(width);\n */\nexport function bbw(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: BbwOpts,\n): Series<number> {\n const ctx = getCtx();\n const multiplier = opts?.multiplier ?? DEFAULT_MULTIPLIER;\n let slot = ctx.stream.taSlots.get(slotId) as BbwSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, multiplier, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bands = bb(`${slotId}/bb`, source, length, { multiplier });\n if (slot.bbSub === null) slot.bbSub = bands;\n const value = bbwValue(bands.upper.current, bands.middle.current, bands.lower.current);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(value);\n } else {\n slot.outBuffer.append(value);\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/bop.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. The runtime emits the RAW per-bar BOP\n// `(close - open) / (high - low)` only; invinite's optional SMA\n// smoothing knob is left to the script author (`ta.sma(ta.bop(), n)`).\n\nimport type { BopOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\n\ntype BopSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.bop called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): BopSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return { outBuffer, series: makeSeriesView<number>(outBuffer) };\n}\n\nfunction bopAt(open: number, high: number, low: number, close: number): number {\n if (\n !Number.isFinite(open) ||\n !Number.isFinite(high) ||\n !Number.isFinite(low) ||\n !Number.isFinite(close)\n ) {\n return Number.NaN;\n }\n const range = high - low;\n if (range === 0) return 0;\n return (close - open) / range;\n}\n\n/**\n * Balance of Power \u2014 `(close \u2212 open) / (high \u2212 low)` per bar. Raw,\n * unsmoothed output; flat-range bars contribute 0 (matches invinite's\n * defensive guard). NaN OHLC inputs emit NaN. No warmup \u2014 every bar\n * is independent.\n *\n * The script author can wrap this in `ta.sma(ta.bop(), n)` to recover\n * TradingView's optional smoothing pairing.\n *\n * @formula out[t] = (close[t] \u2212 open[t]) / (high[t] \u2212 low[t])\n * @warmup 0\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta, plot } from \"@invinite-org/chartlang-core\";\n * // const b = ta.bop();\n * // plot(b);\n */\nexport function bop(slotId: string, _opts?: BopOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as BopSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const { open, high, low, close } = ctx.stream.bar;\n const value = bopAt(open, high, low, close);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(value);\n } else {\n slot.outBuffer.append(value);\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/cci.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. `scaling = 0.015` is hard-coded per the\n// task spec; CciOpts intentionally narrows away invinite's `scaling`\n// knob.\n\nimport type { CciOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst SCALING = 0.015;\n\ntype CciSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /** Closed source (typical price) values across the trailing `length` bars. */\n readonly typicalPriceWindow: Float64RingBuffer;\n sumTp: number;\n /** Number of closed bars folded into the slot. */\n count: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.cci called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): CciSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n typicalPriceWindow: new Float64RingBuffer(length),\n sumTp: 0,\n count: 0,\n };\n}\n\nfunction cciFromCenter(center: number, currentTp: number, meanDev: number): number {\n if (meanDev === 0) return Number.NaN;\n return (currentTp - center) / (SCALING * meanDev);\n}\n\nfunction meanAbsDev(window: Float64RingBuffer, center: number, length: number): number {\n let sumAbs = 0;\n for (let i = 0; i < length; i += 1) {\n const v = window.at(i);\n const dev = v - center;\n sumAbs += dev < 0 ? -dev : dev;\n }\n return sumAbs / length;\n}\n\nfunction closeValue(slot: CciSlot, src: number): number {\n if (!Number.isFinite(src)) {\n // Hold prior \u2014 do not advance window; emit NaN when unwarmed,\n // otherwise re-emit the prior CCI using existing window state.\n if (slot.count < slot.length) return Number.NaN;\n const center = slot.sumTp / slot.length;\n const currentTp = slot.typicalPriceWindow.at(0);\n // Defensive: the window head is the most recently appended finite\n // typical price (we never append NaN \u2014 the outer `!isFinite(src)`\n // branch above bypasses append). Kept as a safety net.\n /* c8 ignore next */\n if (!Number.isFinite(currentTp)) return Number.NaN;\n const md = meanAbsDev(slot.typicalPriceWindow, center, slot.length);\n return cciFromCenter(center, currentTp, md);\n }\n if (slot.count < slot.length) {\n slot.typicalPriceWindow.append(src);\n slot.sumTp += src;\n slot.count += 1;\n if (slot.count < slot.length) return Number.NaN;\n const center = slot.sumTp / slot.length;\n const md = meanAbsDev(slot.typicalPriceWindow, center, slot.length);\n return cciFromCenter(center, src, md);\n }\n const outgoing = slot.typicalPriceWindow.at(slot.length - 1);\n slot.typicalPriceWindow.append(src);\n slot.sumTp = slot.sumTp + src - outgoing;\n const center = slot.sumTp / slot.length;\n const md = meanAbsDev(slot.typicalPriceWindow, center, slot.length);\n return cciFromCenter(center, src, md);\n}\n\nfunction tickValue(slot: CciSlot, src: number): number {\n if (slot.count < slot.length) return Number.NaN;\n if (!Number.isFinite(src)) {\n // Tick NaN: re-emit the prior closed CCI off the existing window.\n const center = slot.sumTp / slot.length;\n const currentTp = slot.typicalPriceWindow.at(0);\n // Defensive: see closeValue() comment \u2014 window head is always finite\n // because non-finite sources skip the append.\n /* c8 ignore next */\n if (!Number.isFinite(currentTp)) return Number.NaN;\n const md = meanAbsDev(slot.typicalPriceWindow, center, slot.length);\n return cciFromCenter(center, currentTp, md);\n }\n // Substitute the head bar's typical price with `src` and recompute.\n const headValue = slot.typicalPriceWindow.at(0);\n const adjustedSum = slot.sumTp - headValue + src;\n const center = adjustedSum / slot.length;\n let sumAbs = 0;\n for (let i = 0; i < slot.length; i += 1) {\n const v = i === 0 ? src : slot.typicalPriceWindow.at(i);\n const dev = v - center;\n sumAbs += dev < 0 ? -dev : dev;\n }\n const md = sumAbs / slot.length;\n return cciFromCenter(center, src, md);\n}\n\n/**\n * Commodity Channel Index \u2014 momentum oscillator centred on `0`.\n * Compares the source (typically `bar.hlc3`) to its SMA over the\n * trailing `length` bars, normalised by mean absolute deviation\n * with the classic Lambert `scaling = 0.015` constant. Unbounded\n * by construction; `meanDev === 0` (flat-line window) emits `NaN`.\n *\n * @formula tp = source[t] ;\n * sma = mean(tp[t \u2212 length + 1 .. t]) ;\n * meanAbsDev = mean(|tp[i] \u2212 sma| for i in window) ;\n * cci = (tp[t] \u2212 sma) / (0.015 \u00B7 meanAbsDev) ;\n * NaN when meanAbsDev === 0\n * @warmup length \u2212 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const c = ta.cci(\"slot\", bar.hlc3, 20);\n * // const head = c.current;\n */\nexport function cci(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: CciOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as CciSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src));\n } else {\n slot.outBuffer.append(closeValue(slot, src));\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/ema.ts\n// plus lib/ema-of-float64.ts\n// (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape.\n\nimport type { EmaOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype EmaSlot = {\n readonly kind: \"ta.ema\";\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly alpha: number;\n readonly length: number;\n seedSum: number;\n seedCount: number;\n prevEma: number;\n prevClosedEma: number;\n /** Per-offset Series-view cache; see `sma.ts` for the convention. */\n readonly shiftedViews: Map<number, Series<number>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.ema called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): EmaSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n kind: \"ta.ema\",\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n alpha: 2 / (length + 1),\n length,\n seedSum: 0,\n seedCount: 0,\n prevEma: Number.NaN,\n prevClosedEma: Number.NaN,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: EmaSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction compute(slot: EmaSlot, src: number, isTick: boolean): number {\n if (!Number.isFinite(src)) {\n return isTick ? slot.prevEma : slot.prevClosedEma;\n }\n if (slot.seedCount < slot.length) {\n if (isTick) {\n const nextSum = slot.seedSum + src;\n const nextCount = slot.seedCount + 1;\n if (nextCount < slot.length) return Number.NaN;\n return nextSum / slot.length;\n }\n slot.seedSum += src;\n slot.seedCount += 1;\n if (slot.seedCount < slot.length) {\n slot.prevClosedEma = Number.NaN;\n return Number.NaN;\n }\n const seedValue = slot.seedSum / slot.length;\n slot.prevClosedEma = seedValue;\n slot.prevEma = seedValue;\n return seedValue;\n }\n const prev = slot.prevClosedEma;\n const next = src * slot.alpha + prev * (1 - slot.alpha);\n if (!isTick) {\n slot.prevClosedEma = next;\n slot.prevEma = next;\n }\n return next;\n}\n\n/**\n * Exponential moving average. Recurrence `EMA[t] = \u03B1\u00B7x[t] + (1 \u2212 \u03B1)\u00B7EMA[t \u2212 1]`\n * with `\u03B1 = 2 / (length + 1)` after a seed of `simple mean of the first\n * `length` finite source values`. Tick-mode (`onBarTick`) recomputes the\n * head from the previous closed EMA so partial-bar values don't bleed\n * into the next close's recurrence.\n *\n * @formula \u03B1 = 2 / (length + 1) ;\n * seed at bar length\u22121 = mean(source[0..length\u22121]) ;\n * EMA[t] = source[t]\u00B7\u03B1 + EMA[t\u22121]\u00B7(1\u2212\u03B1)\n * @warmup length \u2212 1\n * @since 0.1\n * @stable\n *\n * `opts.offset` shifts the returned series so `series.current` reads\n * the value `offset` bars ago (PLAN.md \u00A79.1).\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const e = ta.ema(\"slot-id\", bar.close, 20);\n * // const head = e.current; // NaN until bar length-1\n * // const projected = ta.ema(\"slot2\", bar.close, 20, { offset: 5 });\n */\nexport function ema(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: EmaOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as EmaSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const value = compute(slot, readSourceValue(source), ctx.isTick);\n if (ctx.isTick) slot.outBuffer.replaceHead(value);\n else slot.outBuffer.append(value);\n return viewForOffset(slot, opts?.offset ?? 0);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/chaikin-osc.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Per \u00A79.4 we fold invinite's private ADL +\n// EMA copies onto the canonical `ta.adl` + `ta.ema` primitives via\n// three sub-slots (`${slotId}/adl`, `${slotId}/fast`, `${slotId}/slow`).\n\nimport type { ChaikinOscOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { adl } from \"./adl.js\";\nimport { ema } from \"./ema.js\";\n\nconst DEFAULT_FAST = 3;\nconst DEFAULT_SLOW = 10;\n\ntype ChaikinOscSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly shiftedViews: Map<number, Series<number>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.chaikinOsc called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): ChaikinOscSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: ChaikinOscSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction diff(fast: number, slow: number): number {\n if (!Number.isFinite(fast) || !Number.isFinite(slow)) return Number.NaN;\n return fast - slow;\n}\n\n/**\n * Chaikin Oscillator \u2014 `EMA(ADL, fastLength) \u2212 EMA(ADL, slowLength)`.\n * Composes one `ta.adl` sub-slot (cumulative money-flow volume) plus\n * two `ta.ema` sub-slots over the ADL series; a fix to `ta.adl` or\n * `ta.ema` flows in for free. Renders in its own pane (volume\n * category, oscillator-shape around zero).\n *\n * Defaults `{ fastLength: 3, slowLength: 10 }` (TradingView /\n * invinite canonical). ADL has warmup 0; the slow EMA seeds at bar\n * `slowLength \u2212 1`, so the oscillator first emits a finite value at\n * that bar.\n *\n * **Tick mode.** The sub-slots handle their own tick replay (ADL\n * snapshots `prevClosedCumAdl`; EMA snapshots `prevClosedEma`); this\n * primitive's parent slot just re-evaluates `fastEma \u2212 slowEma`\n * against the live sub-slot heads and `replaceHead`s its own output.\n *\n * @formula chaikinOsc[t] = ema(adl(t), fastLength) \u2212 ema(adl(t), slowLength)\n * @warmup slowLength \u2212 1\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts the returned series so `series.current` reads\n * the value `offset` bars ago (PLAN.md \u00A79.1).\n *\n * @example\n * // import { ta, plot } from \"@invinite-org/chartlang-core\";\n * // const c = ta.chaikinOsc();\n * // plot(c);\n */\nexport function chaikinOsc(slotId: string, opts?: ChaikinOscOpts): Series<number> {\n const ctx = getCtx();\n const fastLength = opts?.fastLength ?? DEFAULT_FAST;\n const slowLength = opts?.slowLength ?? DEFAULT_SLOW;\n const offset = opts?.offset ?? 0;\n\n const adlSeries = adl(`${slotId}/adl`);\n const fastSeries = ema(`${slotId}/fast`, adlSeries.current, fastLength);\n const slowSeries = ema(`${slotId}/slow`, adlSeries.current, slowLength);\n\n let slot = ctx.stream.taSlots.get(slotId) as ChaikinOscSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const value = diff(fastSeries.current, slowSeries.current);\n if (ctx.isTick) slot.outBuffer.replaceHead(value);\n else slot.outBuffer.append(value);\n return viewForOffset(slot, offset);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// No invinite source \u2014 semantics per Pine `ta.highest`. See PLAN.md \u00A73.1.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape.\n\nimport type { HighestOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype HighestSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /**\n * Closed source values across the trailing `length` bars (capacity\n * `length`). `at(0)` is the most recent close (the head bar).\n */\n readonly sourceWindow: Float64RingBuffer;\n /**\n * Monotonic-decreasing deque of absolute bar indices in the trailing\n * `length` window. Front = bar index whose source value is the\n * current rolling max.\n */\n monoIndices: number[];\n /** Source value at each retained index \u2014 mirrors `monoIndices`. */\n monoValues: number[];\n /** Number of closed bars folded into the slot. */\n barCount: number;\n /**\n * Max of the trailing `length` window EXCLUDING the head bar.\n * Computed once per close by walking the source window. Tick replay\n * reads this directly. `NEGATIVE_INFINITY` when no finite\n * non-head value exists.\n */\n closedMaxExcludingHead: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.highest called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): HighestSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n sourceWindow: new Float64RingBuffer(length),\n monoIndices: [],\n monoValues: [],\n barCount: 0,\n closedMaxExcludingHead: Number.NEGATIVE_INFINITY,\n };\n}\n\nfunction recomputeMaxExcludingHead(slot: HighestSlot): number {\n // The window holds the last `min(barCount, length)` closed sources;\n // `sourceWindow.at(0)` is the head bar. Walk the non-head entries\n // and find the max of the finite ones.\n let maxV = Number.NEGATIVE_INFINITY;\n const filled = slot.sourceWindow.length;\n for (let i = 1; i < filled; i += 1) {\n const v = slot.sourceWindow.at(i);\n if (Number.isFinite(v) && v > maxV) maxV = v;\n }\n return maxV;\n}\n\nfunction closeValue(slot: HighestSlot, src: number): number {\n slot.barCount += 1;\n const headIndex = slot.barCount - 1;\n slot.sourceWindow.append(src);\n\n // Evict deque front entries that fell out of the trailing window.\n const oldestAllowed = headIndex - slot.length + 1;\n while (slot.monoIndices.length > 0 && slot.monoIndices[0] < oldestAllowed) {\n slot.monoIndices.shift();\n slot.monoValues.shift();\n }\n\n if (Number.isFinite(src)) {\n // Maintain monotone-decreasing values from front to back. Pop on\n // strict `<` keeps equal values in the deque so the window can\n // tell when multiple bars share the same max.\n while (slot.monoIndices.length > 0 && slot.monoValues[slot.monoValues.length - 1] < src) {\n slot.monoIndices.pop();\n slot.monoValues.pop();\n }\n slot.monoIndices.push(headIndex);\n slot.monoValues.push(src);\n }\n // NaN sources are not pushed \u2014 NaN slots are skipped from the window\n // (matches `ta.highest`'s NaN-skip semantics).\n\n // Warmup: require at least `length` closed bars before emitting.\n if (slot.barCount < slot.length) {\n slot.closedMaxExcludingHead = Number.NEGATIVE_INFINITY;\n return Number.NaN;\n }\n\n slot.closedMaxExcludingHead = recomputeMaxExcludingHead(slot);\n\n if (slot.monoIndices.length === 0) {\n // All NaN in the window.\n return Number.NaN;\n }\n return slot.monoValues[0];\n}\n\nfunction tickValue(slot: HighestSlot, src: number): number {\n // Unwarmed: tick during warmup still NaN.\n if (slot.barCount < slot.length) return Number.NaN;\n if (!Number.isFinite(src)) {\n // NaN tick \u2014 treat the head as if its source were NaN; the\n // window's max excludes the head bar.\n return slot.closedMaxExcludingHead === Number.NEGATIVE_INFINITY\n ? Number.NaN\n : slot.closedMaxExcludingHead;\n }\n if (slot.closedMaxExcludingHead === Number.NEGATIVE_INFINITY) {\n // Window-excluding-head has no finite values (e.g. length === 1\n // or every other bar was NaN). The tick value is the only\n // candidate.\n return src;\n }\n return Math.max(slot.closedMaxExcludingHead, src);\n}\n\n/**\n * Rolling maximum of the last `length` source values. NaN inputs are\n * skipped from the window; the output is NaN until `length` closed\n * bars have been folded in. Tick-mode replays the head as\n * `max(closedMaxExcludingHead, tickValue)` so partial-bar values do\n * not pollute the next close's deque.\n *\n * @formula out[t] = max(source[t \u2212 length + 1 .. t]) (NaN slots skipped)\n * @warmup length \u2212 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const upper = ta.highest(bar.high, 20);\n * // plot(upper);\n */\nexport function highest(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: HighestOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as HighestSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src));\n } else {\n slot.outBuffer.append(closeValue(slot, src));\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// No invinite source \u2014 semantics per Pine `ta.lowest`. See PLAN.md \u00A73.1.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape.\n\nimport type { LowestOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype LowestSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /** Closed source values across the trailing `length` bars. */\n readonly sourceWindow: Float64RingBuffer;\n /** Monotone-increasing values front-to-back (front = current min). */\n monoIndices: number[];\n monoValues: number[];\n barCount: number;\n /**\n * Min of the trailing window EXCLUDING the head bar. Computed once\n * per close by walking the source window.\n */\n closedMinExcludingHead: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.lowest called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): LowestSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n sourceWindow: new Float64RingBuffer(length),\n monoIndices: [],\n monoValues: [],\n barCount: 0,\n closedMinExcludingHead: Number.POSITIVE_INFINITY,\n };\n}\n\nfunction recomputeMinExcludingHead(slot: LowestSlot): number {\n let minV = Number.POSITIVE_INFINITY;\n const filled = slot.sourceWindow.length;\n for (let i = 1; i < filled; i += 1) {\n const v = slot.sourceWindow.at(i);\n if (Number.isFinite(v) && v < minV) minV = v;\n }\n return minV;\n}\n\nfunction closeValue(slot: LowestSlot, src: number): number {\n slot.barCount += 1;\n const headIndex = slot.barCount - 1;\n slot.sourceWindow.append(src);\n\n const oldestAllowed = headIndex - slot.length + 1;\n while (slot.monoIndices.length > 0 && slot.monoIndices[0] < oldestAllowed) {\n slot.monoIndices.shift();\n slot.monoValues.shift();\n }\n\n if (Number.isFinite(src)) {\n // Strict `>` keeps equal values in the deque.\n while (slot.monoIndices.length > 0 && slot.monoValues[slot.monoValues.length - 1] > src) {\n slot.monoIndices.pop();\n slot.monoValues.pop();\n }\n slot.monoIndices.push(headIndex);\n slot.monoValues.push(src);\n }\n\n if (slot.barCount < slot.length) {\n slot.closedMinExcludingHead = Number.POSITIVE_INFINITY;\n return Number.NaN;\n }\n\n slot.closedMinExcludingHead = recomputeMinExcludingHead(slot);\n\n if (slot.monoIndices.length === 0) return Number.NaN;\n return slot.monoValues[0];\n}\n\nfunction tickValue(slot: LowestSlot, src: number): number {\n if (slot.barCount < slot.length) return Number.NaN;\n if (!Number.isFinite(src)) {\n return slot.closedMinExcludingHead === Number.POSITIVE_INFINITY\n ? Number.NaN\n : slot.closedMinExcludingHead;\n }\n if (slot.closedMinExcludingHead === Number.POSITIVE_INFINITY) {\n return src;\n }\n return Math.min(slot.closedMinExcludingHead, src);\n}\n\n/**\n * Rolling minimum of the last `length` source values. NaN inputs are\n * skipped from the window; the output is NaN until `length` closed\n * bars have been folded in. Tick-mode replays the head as\n * `min(closedMinExcludingHead, tickValue)`.\n *\n * @formula out[t] = min(source[t \u2212 length + 1 .. t]) (NaN slots skipped)\n * @warmup length \u2212 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const lower = ta.lowest(bar.low, 20);\n * // plot(lower);\n */\nexport function lowest(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: LowestOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as LowestSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src));\n } else {\n slot.outBuffer.append(closeValue(slot, src));\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/chande-kroll-stop.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. ChandeKrollStop composes Phase-1 `ta.atr`\n// plus Task-5 `ta.highest` / `ta.lowest` at sub-slots\n// `${slotId}/atr` / `${slotId}/highHigh` / `${slotId}/lowLow` for the\n// first pass, then walks a self-owned `Float64RingBuffer` window of\n// size `smoothingLength` for the second-pass max/min. The opts\n// naming (`length` / `multiplier` / `smoothingLength`) matches\n// Chande Kroll's 1995 paper \u2014 `length` is the ATR period AND the\n// first-pass rolling extreme window, `smoothingLength` is the\n// second-pass extreme window.\n\nimport type { ChandeKrollStopOpts, ChandeKrollStopResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { atr } from \"./atr.js\";\nimport { highest } from \"./highest.js\";\nimport { lowest } from \"./lowest.js\";\n\nconst DEFAULT_LENGTH = 10;\nconst DEFAULT_MULTIPLIER = 1;\nconst DEFAULT_SMOOTHING = 9;\n\ntype ChandeKrollStopSlot = {\n readonly outputs: ChandeKrollStopResult;\n readonly longBuffer: Float64RingBuffer;\n readonly shortBuffer: Float64RingBuffer;\n readonly length: number;\n readonly multiplier: number;\n readonly smoothingLength: number;\n /**\n * First-pass long/high stops across the trailing `smoothingLength`\n * CLOSED bars. `at(0)` is the most recent close.\n */\n readonly firstHighWindow: Float64RingBuffer;\n /** First-pass short/low stops across the trailing window. */\n readonly firstLowWindow: Float64RingBuffer;\n /** Number of CLOSED bars folded into the slot so far. */\n barCount: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.chandeKrollStop called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(\n capacity: number,\n length: number,\n multiplier: number,\n smoothingLength: number,\n): ChandeKrollStopSlot {\n const longBuffer = new Float64RingBuffer(capacity);\n const shortBuffer = new Float64RingBuffer(capacity);\n return {\n outputs: Object.freeze({\n long: makeSeriesView<number>(longBuffer),\n short: makeSeriesView<number>(shortBuffer),\n }),\n longBuffer,\n shortBuffer,\n length,\n multiplier,\n smoothingLength,\n firstHighWindow: new Float64RingBuffer(smoothingLength),\n firstLowWindow: new Float64RingBuffer(smoothingLength),\n barCount: 0,\n };\n}\n\nfunction firstPass(\n hi: number,\n lo: number,\n atrValue: number,\n multiplier: number,\n): { firstHigh: number; firstLow: number } {\n if (!Number.isFinite(hi) || !Number.isFinite(lo) || !Number.isFinite(atrValue)) {\n return { firstHigh: Number.NaN, firstLow: Number.NaN };\n }\n return {\n firstHigh: hi - multiplier * atrValue,\n firstLow: lo + multiplier * atrValue,\n };\n}\n\n/**\n * Scan `window.at(start)..at(end)` (inclusive of start, exclusive of\n * end+1) for the max of finite entries. Returns `NaN` if no finite\n * entry exists.\n */\nfunction maxOver(\n window: Float64RingBuffer,\n headOverride: number,\n startExclusiveOfHead: boolean,\n smoothingLength: number,\n): number {\n let best = Number.NEGATIVE_INFINITY;\n if (Number.isFinite(headOverride)) best = headOverride;\n const startAge = startExclusiveOfHead ? 1 : 0;\n const filled = window.length;\n for (let k = startAge; k < filled && k < smoothingLength; k += 1) {\n const v = window.at(k);\n if (Number.isFinite(v) && v > best) best = v;\n }\n return best === Number.NEGATIVE_INFINITY ? Number.NaN : best;\n}\n\nfunction minOver(\n window: Float64RingBuffer,\n headOverride: number,\n startExclusiveOfHead: boolean,\n smoothingLength: number,\n): number {\n let best = Number.POSITIVE_INFINITY;\n if (Number.isFinite(headOverride)) best = headOverride;\n const startAge = startExclusiveOfHead ? 1 : 0;\n const filled = window.length;\n for (let k = startAge; k < filled && k < smoothingLength; k += 1) {\n const v = window.at(k);\n if (Number.isFinite(v) && v < best) best = v;\n }\n return best === Number.POSITIVE_INFINITY ? Number.NaN : best;\n}\n\n/**\n * Chande Kroll Stop \u2014 two-pass ATR-offset trailing stops. The first\n * pass anchors each bar to its `length`-bar high/low extreme minus /\n * plus `multiplier \u00B7 ATR`; the second pass smooths the first-pass\n * stops by taking the rolling max / min over a `smoothingLength`-bar\n * window. `long` is the long-trade trailing stop ceiling (max of\n * `firstHigh`), `short` is the short-trade trailing stop floor (min\n * of `firstLow`). Composes Phase-1 `ta.atr` plus Task-5 `ta.highest`\n * and `ta.lowest` at sub-slots.\n *\n * Source field is hard-coded to `bar.high` / `bar.low` (matches Pine\n * `ta.cks` and the canonical TradingView CKS). Invinite's `source`\n * parameter is omitted; a `source` opt could land in a follow-up.\n *\n * NaN ATR or NaN extreme \u2192 NaN at both first-pass and second-pass\n * outputs for that bar (the rolling window retains the NaN slot;\n * downstream max/min skip NaN entries via `Number.isFinite`).\n *\n * @formula firstHigh = highest(bar.high, length) \u2212 multiplier \u00B7 atr(length) ;\n * firstLow = lowest(bar.low, length) + multiplier \u00B7 atr(length) ;\n * long = max(firstHigh over smoothingLength bars) ;\n * short = min(firstLow over smoothingLength bars)\n * @warmup length + smoothingLength \u2212 1\n * @anchors length, multiplier\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const c = ta.chandeKrollStop({ length: 10, multiplier: 1, smoothingLength: 9 });\n * // plot(c.long);\n * // plot(c.short);\n */\nexport function chandeKrollStop(slotId: string, opts?: ChandeKrollStopOpts): ChandeKrollStopResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as ChandeKrollStopSlot | undefined;\n if (slot === undefined) {\n const length = opts?.length ?? DEFAULT_LENGTH;\n const multiplier = opts?.multiplier ?? DEFAULT_MULTIPLIER;\n const smoothingLength = opts?.smoothingLength ?? DEFAULT_SMOOTHING;\n slot = initSlot(ctx.stream.ohlcv.close.capacity, length, multiplier, smoothingLength);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n // Compose: ta.atr + ta.highest + ta.lowest at sub-slots. Each\n // sub-slot owns its own tick replay; the head reads below are\n // correct in both close and tick contexts.\n const atrSeries = atr(`${slotId}/atr`, slot.length);\n const highSeries = highest(`${slotId}/highHigh`, bar.high, slot.length);\n const lowSeries = lowest(`${slotId}/lowLow`, bar.low, slot.length);\n\n const { firstHigh, firstLow } = firstPass(\n highSeries.current,\n lowSeries.current,\n atrSeries.current,\n slot.multiplier,\n );\n\n if (ctx.isTick) {\n // Second pass: scan the CLOSED window (excluding head) plus the\n // tick's first-pass value as the candidate for age 0.\n const long = maxOver(slot.firstHighWindow, firstHigh, true, slot.smoothingLength);\n const short = minOver(slot.firstLowWindow, firstLow, true, slot.smoothingLength);\n // Output is NaN unless both first-pass passes are warm AND the\n // smoothing window has enough closed entries (>= smoothingLength).\n // The closed window has `min(barCount, smoothingLength)` entries;\n // the tick adds one more candidate. So second-pass warm requires\n // `barCount >= smoothingLength`.\n const warm = slot.barCount >= slot.smoothingLength;\n slot.longBuffer.replaceHead(warm ? long : Number.NaN);\n slot.shortBuffer.replaceHead(warm ? short : Number.NaN);\n } else {\n slot.firstHighWindow.append(firstHigh);\n slot.firstLowWindow.append(firstLow);\n slot.barCount += 1;\n // Second-pass warmup needs `smoothingLength` first-pass bars\n // (matches invinite's `secondValidIdx = firstValidIdx + pLength\n // - 1`, which is `length - 1 + smoothingLength - 1` \u2014 i.e.\n // `barCount >= length + smoothingLength - 1`). With invinite's\n // `firstValidIdx = max(length - 1, length - 1)`, the second\n // valid index is `length + smoothingLength - 2` (0-based), so\n // bar `length + smoothingLength - 1` (1-based barCount) is the\n // first warm bar.\n const warm = slot.barCount >= slot.length + slot.smoothingLength - 1;\n if (!warm) {\n slot.longBuffer.append(Number.NaN);\n slot.shortBuffer.append(Number.NaN);\n } else {\n // Second pass over the full window (head included).\n const long = maxOver(slot.firstHighWindow, Number.NaN, false, slot.smoothingLength);\n const short = minOver(slot.firstLowWindow, Number.NaN, false, slot.smoothingLength);\n slot.longBuffer.append(long);\n slot.shortBuffer.append(short);\n }\n }\n return slot.outputs;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/chandelier.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Chandelier composes Phase-1 `ta.atr` plus\n// Task-5 `ta.highest` / `ta.lowest` at sub-slots `${slotId}/atr`,\n// `${slotId}/highHigh`, `${slotId}/lowLow` (sources from `bar.high` /\n// `bar.low` per Pine `ta.chandelier_exit`; invinite's `source` field\n// \u2014 defaults to close \u2014 is deliberately dropped in favour of the\n// Pine-canonical bar-high/low reading).\n\nimport type { ChandelierOpts, ChandelierResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { atr } from \"./atr.js\";\nimport { highest } from \"./highest.js\";\nimport { lowest } from \"./lowest.js\";\n\nconst DEFAULT_LENGTH = 22;\nconst DEFAULT_MULTIPLIER = 3;\n\ntype ChandelierSlot = {\n readonly outputs: ChandelierResult;\n readonly longBuffer: Float64RingBuffer;\n readonly shortBuffer: Float64RingBuffer;\n readonly length: number;\n readonly multiplier: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.chandelier called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number, length: number, multiplier: number): ChandelierSlot {\n const longBuffer = new Float64RingBuffer(capacity);\n const shortBuffer = new Float64RingBuffer(capacity);\n return {\n outputs: Object.freeze({\n long: makeSeriesView<number>(longBuffer),\n short: makeSeriesView<number>(shortBuffer),\n }),\n longBuffer,\n shortBuffer,\n length,\n multiplier,\n };\n}\n\nfunction compute(\n hi: number,\n lo: number,\n atrValue: number,\n multiplier: number,\n): { long: number; short: number } {\n if (!Number.isFinite(hi) || !Number.isFinite(lo) || !Number.isFinite(atrValue)) {\n return { long: Number.NaN, short: Number.NaN };\n }\n return {\n long: hi - multiplier * atrValue,\n short: lo + multiplier * atrValue,\n };\n}\n\n/**\n * Chandelier Exit \u2014 two ATR-offset trailing stops anchored to the\n * trailing `length`-bar extremes. `long` is the trailing stop for\n * long trades (highest of `bar.high` over the window minus\n * `multiplier \u00B7 ATR`); `short` is the symmetric stop for short\n * trades (lowest of `bar.low` plus `multiplier \u00B7 ATR`). Composes\n * Phase-1 `ta.atr` plus Task-5 `ta.highest` / `ta.lowest` at sub-slots\n * `${slotId}/atr` / `${slotId}/highHigh` / `${slotId}/lowLow`. Returns\n * a cached `{ long, short }` record (same identity every bar).\n *\n * Source field is hard-coded to `bar.high` (for the upper window)\n * and `bar.low` (for the lower window) \u2014 matches Pine\n * `ta.chandelier_exit` and the conventional TradingView reading.\n * Invinite's `source` parameter (default `close`) is deliberately\n * omitted; a `source` opt could land in a follow-up.\n *\n * NaN in ATR or the rolling extreme \u2192 NaN at both outputs. The\n * composed sub-slots each handle their own tick replay; tick-side\n * just reads `series.current` from each sub-slot and recomputes.\n *\n * @formula long = highest(bar.high, length) \u2212 multiplier \u00B7 atr(length) ;\n * short = lowest(bar.low, length) + multiplier \u00B7 atr(length)\n * @warmup length\n * @anchors length, multiplier\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const c = ta.chandelier({ length: 22, multiplier: 3 });\n * // plot(c.long);\n * // plot(c.short);\n */\nexport function chandelier(slotId: string, opts?: ChandelierOpts): ChandelierResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as ChandelierSlot | undefined;\n if (slot === undefined) {\n const length = opts?.length ?? DEFAULT_LENGTH;\n const multiplier = opts?.multiplier ?? DEFAULT_MULTIPLIER;\n slot = initSlot(ctx.stream.ohlcv.close.capacity, length, multiplier);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n // Compose: ta.atr + ta.highest + ta.lowest at sub-slots. The\n // composed calls route through the registry and respect ctx.isTick\n // automatically (each sub-slot owns its own tick-replay).\n const atrSeries = atr(`${slotId}/atr`, slot.length);\n const highSeries = highest(`${slotId}/highHigh`, bar.high, slot.length);\n const lowSeries = lowest(`${slotId}/lowLow`, bar.low, slot.length);\n\n const result = compute(\n highSeries.current,\n lowSeries.current,\n atrSeries.current,\n slot.multiplier,\n );\n if (ctx.isTick) {\n slot.longBuffer.replaceHead(result.long);\n slot.shortBuffer.replaceHead(result.short);\n } else {\n slot.longBuffer.append(result.long);\n slot.shortBuffer.append(result.short);\n }\n return slot.outputs;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// No invinite source \u2014 semantics per Pine `ta.change`. See PLAN.md \u00A73.1.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape.\n\nimport type { ChangeOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype ChangeSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /**\n * Closed-bar source values across the last `length + 1` bars. The\n * head (`at(0)`) is the most recent close; `at(length)` is the\n * lookback target the difference is taken against.\n */\n readonly sourceWindow: Float64RingBuffer;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.change called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): ChangeSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n sourceWindow: new Float64RingBuffer(length + 1),\n };\n}\n\nfunction closeValue(slot: ChangeSlot, src: number): number {\n slot.sourceWindow.append(src);\n if (slot.sourceWindow.length <= slot.length) return Number.NaN;\n const head = slot.sourceWindow.at(0);\n const old = slot.sourceWindow.at(slot.length);\n if (!Number.isFinite(head) || !Number.isFinite(old)) return Number.NaN;\n return head - old;\n}\n\nfunction tickValue(slot: ChangeSlot, src: number): number {\n // Tick replaces the head bar's source. Warmup count is based on\n // CLOSED bars in the window, not tick activity \u2014 so an unwarmed\n // slot returns NaN.\n if (slot.sourceWindow.length <= slot.length) return Number.NaN;\n // The bar `length` ago relative to the tick is the same bar that\n // was `length` ago relative to the most recent close (the lookback\n // history doesn't change mid-bar).\n const old = slot.sourceWindow.at(slot.length);\n if (!Number.isFinite(src) || !Number.isFinite(old)) return Number.NaN;\n return src - old;\n}\n\n/**\n * First-difference of the source: `source[0] \u2212 source[length]`.\n * `opts.length` defaults to `1` (one-bar delta). NaN in either operand\n * propagates to a NaN output. Warmup is `length` bars.\n *\n * @formula out[t] = source[t] \u2212 source[t \u2212 length]\n * @warmup length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const delta = ta.change(bar.close, { length: 5 });\n * // plot(delta);\n */\nexport function change(slotId: string, source: ScalarOrSeries, opts?: ChangeOpts): Series<number> {\n const ctx = getCtx();\n const length = opts?.length ?? 1;\n let slot = ctx.stream.taSlots.get(slotId) as ChangeSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src));\n } else {\n slot.outBuffer.append(closeValue(slot, src));\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/chop.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Chop composes `ta.highest` / `ta.lowest`\n// via sub-slots `${slotId}/highest` / `${slotId}/lowest` over\n// `bar.high` / `bar.low` for the range denominator; the TR-sum\n// numerator is maintained as a sliding-window sum inside the slot\n// (same internal TR formula as `ta.atr`, but raw \u2014 Pine `ta.chop`\n// uses raw TR sums rather than the Wilder-smoothed ATR).\n\nimport type { ChopOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { highest } from \"./highest.js\";\nimport { lowest } from \"./lowest.js\";\n\ntype ChopSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n readonly logN: number;\n /** Sliding window of TR values (capacity `length`). */\n readonly trWindow: Float64RingBuffer;\n sumTr: number;\n /** Close of the prior closed bar (TR uses `prev.close`). */\n prevClose: number;\n /** Close of the bar before the current bar (used by tick-mode TR). */\n prevPrevClose: number;\n /** TR sum as of the prior closed bar \u2014 used by tick-mode replay. */\n prevClosedSumTr: number;\n /** TR value the head close folded in \u2014 needed to roll it back on tick. */\n prevClosedHeadTr: number;\n /** TR value evicted by the head close \u2014 needed to restore on tick. */\n prevClosedEvictedTr: number;\n /** Number of closed bars folded into the slot. */\n barCount: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.chop called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): ChopSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n logN: Math.log10(length),\n trWindow: new Float64RingBuffer(length),\n sumTr: 0,\n prevClose: Number.NaN,\n prevPrevClose: Number.NaN,\n prevClosedSumTr: 0,\n prevClosedHeadTr: Number.NaN,\n prevClosedEvictedTr: Number.NaN,\n barCount: 0,\n };\n}\n\nfunction trueRange(high: number, low: number, prevClose: number): number {\n if (!Number.isFinite(prevClose)) return high - low;\n return Math.max(high - low, Math.abs(high - prevClose), Math.abs(low - prevClose));\n}\n\nfunction chopValue(slot: ChopSlot, upper: number, lower: number): number {\n if (slot.barCount < slot.length) return Number.NaN;\n // Defensive: upper / lower come from highest / lowest sub-slots over\n // bar.high / bar.low, both finite once the highest / lowest slots\n // are warmed. Same goes for sumTr (kept positive once trSeries seeds).\n /* c8 ignore next */\n if (!Number.isFinite(upper) || !Number.isFinite(lower)) return Number.NaN;\n const range = upper - lower;\n /* c8 ignore next */\n if (range <= 0) return Number.NaN;\n /* c8 ignore next */\n if (!Number.isFinite(slot.sumTr) || slot.sumTr <= 0) return Number.NaN;\n const raw = (100 * Math.log10(slot.sumTr / range)) / slot.logN;\n // Clamp to [0, 100]. The raw value can exceed 100 on bars with\n // large gaps (where TR > range) \u2014 Pine + TradingView present chop\n // as a bounded oscillator, so we clamp at the output to match.\n /* c8 ignore next 2 */\n if (raw < 0) return 0;\n if (raw > 100) return 100;\n return raw;\n}\n\nfunction closeValue(\n slot: ChopSlot,\n high: number,\n low: number,\n close: number,\n upper: number,\n lower: number,\n): number {\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n // Skip the bar (don't advance TR window state); emit NaN.\n return Number.NaN;\n }\n const tr = trueRange(high, low, slot.prevClose);\n // Capture pre-append state for tick-mode rollback.\n slot.prevClosedSumTr = slot.sumTr;\n const evicted =\n slot.trWindow.length === slot.length ? slot.trWindow.at(slot.length - 1) : Number.NaN;\n slot.prevClosedEvictedTr = evicted;\n if (Number.isFinite(evicted)) slot.sumTr -= evicted;\n slot.trWindow.append(tr);\n slot.sumTr += tr;\n slot.prevClosedHeadTr = tr;\n slot.prevPrevClose = slot.prevClose;\n slot.prevClose = close;\n slot.barCount += 1;\n return chopValue(slot, upper, lower);\n}\n\nfunction tickValue(\n slot: ChopSlot,\n high: number,\n low: number,\n close: number,\n upper: number,\n lower: number,\n): number {\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n return Number.NaN;\n }\n // Defensive: tickValue runs after at least one close, so barCount is \u2265 1.\n /* c8 ignore next */\n if (slot.barCount === 0) return Number.NaN;\n // Recompute the head TR using the BAR-BEFORE-CURRENT's close\n // (mirrors atr.ts:103-117 \u2014 the close-side advance moved\n // `prevPrevClose` into the slot before we replaced `prevClose`).\n const tr = trueRange(high, low, slot.prevPrevClose);\n // Synthesise the post-rollback sum and re-fold the tick's TR.\n let synthSum = slot.prevClosedSumTr;\n if (Number.isFinite(slot.prevClosedEvictedTr)) synthSum -= slot.prevClosedEvictedTr;\n synthSum += tr;\n // Temporarily flip the slot's sumTr so chopValue sees the synth.\n const savedSum = slot.sumTr;\n slot.sumTr = synthSum;\n const value = chopValue(slot, upper, lower);\n slot.sumTr = savedSum;\n return value;\n}\n\n/**\n * Choppiness Index \u2014 sub-pane volatility regime indicator. High\n * values (`> 61.8`) signal a sideways / choppy market; low values\n * (`< 38.2`) signal a strong trend. Output range `[0, 100]`. Reads\n * `bar.high` / `bar.low` / `bar.close` directly (no source param,\n * mirrors Pine). Composes the registered `ta.highest` / `ta.lowest`\n * primitives via sub-slots `${slotId}/highest` and `${slotId}/lowest`\n * for the range denominator; the TR-sum numerator is a sliding-window\n * sum inside the slot (same internal TR math as `ta.atr` but raw \u2014\n * Pine `ta.chop` does NOT use the Wilder-smoothed ATR). NaN until\n * the trailing `length`-bar window is fully warmed AND the range is\n * positive.\n *\n * @formula TR[t] = max(high \u2212 low, |high \u2212 prevClose|, |low \u2212 prevClose|) ;\n * range = highest(high, length) \u2212 lowest(low, length) ;\n * sumTr = \u03A3 TR over trailing length bars ;\n * chop = 100 \u00B7 log10(sumTr / range) / log10(length)\n * @warmup length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const c = ta.chop(14);\n * // plot(c);\n */\nexport function chop(slotId: string, length: number, _opts?: ChopOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as ChopSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n const upperSeries = highest(`${slotId}/highest`, bar.high, length);\n const lowerSeries = lowest(`${slotId}/lowest`, bar.low, length);\n const upper = upperSeries.current;\n const lower = lowerSeries.current;\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, bar.high, bar.low, bar.close, upper, lower));\n } else {\n slot.outBuffer.append(closeValue(slot, bar.high, bar.low, bar.close, upper, lower));\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/cmf.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. The rolling-window sum follows the\n// `ulcerIndex` \"subtract head + add tick\" pattern for tick-mode replay\n// (no window mutation on tick).\n\nimport type { CmfOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\n\ntype CmfSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /**\n * Closed-bar money-flow volume values across the trailing\n * `length` bars (capacity `length`). `at(0)` is the head bar's\n * MFV; older slots index upward.\n */\n readonly mfvWindow: Float64RingBuffer;\n /** Closed-bar volume values across the same window. */\n readonly volWindow: Float64RingBuffer;\n sumMfv: number;\n sumVol: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.cmf called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): CmfSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n mfvWindow: new Float64RingBuffer(length),\n volWindow: new Float64RingBuffer(length),\n sumMfv: 0,\n sumVol: 0,\n };\n}\n\n/**\n * Per-bar money-flow volume \u2014 CLV \u00D7 volume with the same zero-range\n * + NaN guards as `adl.ts` (defensive 0 contribution on either edge\n * case).\n */\nfunction mfvAt(close: number, high: number, low: number, volume: number): number {\n if (\n !Number.isFinite(close) ||\n !Number.isFinite(high) ||\n !Number.isFinite(low) ||\n !Number.isFinite(volume)\n ) {\n return 0;\n }\n const range = high - low;\n // Defensive: flat bar (high === low) \u2014 emit zero CLV contribution\n // rather than divide-by-zero. Real OHLC streams rarely hit this.\n /* c8 ignore next */\n if (range === 0) return 0;\n const clv = (close - low - (high - close)) / range;\n return clv * volume;\n}\n\n/** Safe-volume contribution to the rolling-window volume sum. */\nfunction safeVol(volume: number): number {\n return Number.isFinite(volume) ? volume : 0;\n}\n\nfunction emit(sumMfv: number, sumVol: number, ready: boolean): number {\n if (!ready || sumVol === 0) return Number.NaN;\n return sumMfv / sumVol;\n}\n\n/**\n * Chaikin Money Flow \u2014 trailing-window sum of money-flow volume\n * divided by trailing-window sum of volume. Bounded between -1 and\n * +1 mathematically. Zero-range bars (`high === low`) contribute 0\n * to the numerator (matches invinite's CLV guard); NaN OHLC / volume\n * bars contribute 0 to both numerator and denominator.\n *\n * **Tick mode.** Substitutes the tick's per-bar (mfv, volume)\n * contribution for the head slot's stored values without mutating the\n * trailing-window rings \u2014 mirrors the `ulcerIndex.ts` substitution\n * shape (\"hypSum = sum \u2212 head + tick\").\n *\n * @formula cmf[t] = \u03A3_{u \u2208 window(t)} mfv[u] / \u03A3_{u \u2208 window(t)} volume[u]\n * where mfv = ((C \u2212 L) \u2212 (H \u2212 C)) / (H \u2212 L) \u00B7 volume\n * @warmup length \u2212 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta, plot } from \"@invinite-org/chartlang-core\";\n * // const c = ta.cmf(20);\n * // plot(c);\n */\nexport function cmf(slotId: string, length: number, _opts?: CmfOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as CmfSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const { close, high, low, volume } = ctx.stream.bar;\n const mfv = mfvAt(close, high, low, volume);\n const vol = safeVol(volume);\n\n if (ctx.isTick) {\n // Tick replay against the closed window: substitute the head\n // slot's contribution with the tick's, leaving the window\n // untouched. Pre-warmup ticks emit NaN.\n if (slot.mfvWindow.length < slot.length) {\n slot.outBuffer.replaceHead(Number.NaN);\n return slot.series;\n }\n const headMfv = slot.mfvWindow.at(0);\n const headVol = slot.volWindow.at(0);\n const hypMfv = slot.sumMfv - headMfv + mfv;\n const hypVol = slot.sumVol - headVol + vol;\n slot.outBuffer.replaceHead(emit(hypMfv, hypVol, true));\n return slot.series;\n }\n\n // Close-side: evict the oldest slot if the ring is full, then\n // append the new (mfv, vol) pair and refresh the running sums.\n if (slot.mfvWindow.length === slot.length) {\n slot.sumMfv -= slot.mfvWindow.at(slot.length - 1);\n slot.sumVol -= slot.volWindow.at(slot.length - 1);\n }\n slot.mfvWindow.append(mfv);\n slot.volWindow.append(vol);\n slot.sumMfv += mfv;\n slot.sumVol += vol;\n slot.outBuffer.append(emit(slot.sumMfv, slot.sumVol, slot.mfvWindow.length === slot.length));\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/cmo.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n\nimport type { CmoOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype CmoSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n readonly gainWindow: Float64RingBuffer;\n readonly lossWindow: Float64RingBuffer;\n sumGain: number;\n sumLoss: number;\n prevSrc: number;\n /** Source as of the bar before the most recent close \u2014 used by tick replay. */\n prevClosedSrc: number;\n /** Most-recent close-side emit (the head bar's CMO). NaN if unwarmed. */\n cmo: number;\n /** Gain pushed onto the window during the most recent close. */\n closedHeadGain: number;\n /** Loss pushed onto the window during the most recent close. */\n closedHeadLoss: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.cmo called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): CmoSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n gainWindow: new Float64RingBuffer(length),\n lossWindow: new Float64RingBuffer(length),\n sumGain: 0,\n sumLoss: 0,\n prevSrc: Number.NaN,\n prevClosedSrc: Number.NaN,\n cmo: Number.NaN,\n closedHeadGain: 0,\n closedHeadLoss: 0,\n };\n}\n\nfunction cmoFromSums(sumGain: number, sumLoss: number): number {\n const denom = sumGain + sumLoss;\n if (denom === 0) return Number.NaN;\n const raw = (100 * (sumGain - sumLoss)) / denom;\n return Math.min(100, Math.max(-100, raw));\n}\n\nfunction closeValue(slot: CmoSlot, src: number): number {\n if (!Number.isFinite(src)) {\n // Hold prior values forward; window is unchanged.\n slot.closedHeadGain = 0;\n slot.closedHeadLoss = 0;\n return slot.cmo;\n }\n if (!Number.isFinite(slot.prevSrc)) {\n slot.prevSrc = src;\n slot.prevClosedSrc = src;\n slot.closedHeadGain = 0;\n slot.closedHeadLoss = 0;\n return Number.NaN;\n }\n const diff = src - slot.prevSrc;\n const gain = diff > 0 ? diff : 0;\n const loss = diff < 0 ? -diff : 0;\n slot.prevClosedSrc = slot.prevSrc;\n slot.prevSrc = src;\n slot.closedHeadGain = gain;\n slot.closedHeadLoss = loss;\n if (slot.gainWindow.length === slot.length) {\n const oldestGain = slot.gainWindow.at(slot.length - 1);\n const oldestLoss = slot.lossWindow.at(slot.length - 1);\n slot.sumGain -= oldestGain;\n slot.sumLoss -= oldestLoss;\n }\n slot.gainWindow.append(gain);\n slot.lossWindow.append(loss);\n slot.sumGain += gain;\n slot.sumLoss += loss;\n if (slot.gainWindow.length < slot.length) {\n slot.cmo = Number.NaN;\n return Number.NaN;\n }\n slot.cmo = cmoFromSums(slot.sumGain, slot.sumLoss);\n return slot.cmo;\n}\n\nfunction tickValue(slot: CmoSlot, src: number): number {\n if (!Number.isFinite(src) || !Number.isFinite(slot.prevClosedSrc)) {\n return slot.cmo;\n }\n if (slot.gainWindow.length < slot.length) return Number.NaN;\n // Swap the most recently pushed gain/loss for the tick's gain/loss.\n const diff = src - slot.prevClosedSrc;\n const gain = diff > 0 ? diff : 0;\n const loss = diff < 0 ? -diff : 0;\n const provGain = slot.sumGain - slot.closedHeadGain + gain;\n const provLoss = slot.sumLoss - slot.closedHeadLoss + loss;\n return cmoFromSums(provGain, provLoss);\n}\n\n/**\n * Chande Momentum Oscillator \u2014 `100 \u00B7 (\u03A3 gain \u2212 \u03A3 loss) / (\u03A3 gain + \u03A3 loss)`\n * over the trailing `length` window of per-bar diffs. Bounded `[-100, 100]`.\n * Flat-line input (zero denominator) \u2192 NaN. First emit lands at bar\n * `length` (after `length` diffs have been folded; warmup = `length`).\n *\n * @formula diff[t] = source[t] \u2212 source[t \u2212 1] ;\n * gain[t] = max(diff[t], 0) ;\n * loss[t] = max(\u2212diff[t], 0) ;\n * CMO[t] = 100 \u00B7 (\u03A3 gain \u2212 \u03A3 loss) / (\u03A3 gain + \u03A3 loss)\n * @warmup length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const c = ta.cmo(\"slot\", bar.close, 9);\n * // const head = c.current;\n */\nexport function cmo(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: CmoOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as CmoSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src));\n } else {\n slot.outBuffer.append(closeValue(slot, src));\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/rsi.ts\n// (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape.\n\nimport type { RsiOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { wilderStep } from \"./lib/wilderSmoothing.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype RsiSlot = {\n readonly kind: \"ta.rsi\";\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n seedGainSum: number;\n seedLossSum: number;\n /** Number of diffs (= closed bars \u2212 1) seen so far. */\n diffCount: number;\n avgGain: number;\n avgLoss: number;\n prevSrc: number;\n /** Source value as of the prior closed bar \u2014 used by tick-mode replay. */\n prevClosedSrc: number;\n /** Per-offset Series-view cache; see `sma.ts` for the convention. */\n readonly shiftedViews: Map<number, Series<number>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.rsi called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): RsiSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n kind: \"ta.rsi\",\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n seedGainSum: 0,\n seedLossSum: 0,\n diffCount: 0,\n avgGain: Number.NaN,\n avgLoss: Number.NaN,\n prevSrc: Number.NaN,\n prevClosedSrc: Number.NaN,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: RsiSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction rsiFromAvgs(avgGain: number, avgLoss: number): number {\n if (avgLoss === 0) return 100;\n return 100 - 100 / (1 + avgGain / avgLoss);\n}\n\nfunction closeValue(slot: RsiSlot, src: number): number {\n if (!Number.isFinite(src)) {\n // Skip the diff; hold prior values forward.\n if (Number.isFinite(slot.avgGain) && Number.isFinite(slot.avgLoss)) {\n return rsiFromAvgs(slot.avgGain, slot.avgLoss);\n }\n return Number.NaN;\n }\n if (!Number.isFinite(slot.prevSrc)) {\n slot.prevSrc = src;\n slot.prevClosedSrc = src;\n return Number.NaN;\n }\n const diff = src - slot.prevSrc;\n const gain = diff > 0 ? diff : 0;\n const loss = diff < 0 ? -diff : 0;\n slot.prevClosedSrc = slot.prevSrc;\n slot.prevSrc = src;\n slot.diffCount += 1;\n\n if (slot.diffCount < slot.length) {\n slot.seedGainSum += gain;\n slot.seedLossSum += loss;\n return Number.NaN;\n }\n if (slot.diffCount === slot.length) {\n slot.seedGainSum += gain;\n slot.seedLossSum += loss;\n slot.avgGain = slot.seedGainSum / slot.length;\n slot.avgLoss = slot.seedLossSum / slot.length;\n return rsiFromAvgs(slot.avgGain, slot.avgLoss);\n }\n slot.avgGain = wilderStep(slot.avgGain, gain, slot.length);\n slot.avgLoss = wilderStep(slot.avgLoss, loss, slot.length);\n return rsiFromAvgs(slot.avgGain, slot.avgLoss);\n}\n\nfunction tickValue(slot: RsiSlot, src: number): number {\n if (!Number.isFinite(src) || !Number.isFinite(slot.prevClosedSrc)) {\n if (Number.isFinite(slot.avgGain) && Number.isFinite(slot.avgLoss)) {\n return rsiFromAvgs(slot.avgGain, slot.avgLoss);\n }\n return Number.NaN;\n }\n // Replay the most recent diff using the (frozen) prior closed avgs.\n // We need pre-update avgs: at close we already overwrote `avgGain` /\n // `avgLoss`. So we reverse the Wilder step to recover them.\n if (slot.diffCount < slot.length) {\n // During seeding: simulate the seed completing with this tick.\n const diff = src - slot.prevClosedSrc;\n const gain = diff > 0 ? diff : 0;\n const loss = diff < 0 ? -diff : 0;\n const provisionalCount = slot.diffCount + 1;\n if (provisionalCount < slot.length) return Number.NaN;\n const provGain = (slot.seedGainSum + gain) / slot.length;\n const provLoss = (slot.seedLossSum + loss) / slot.length;\n return rsiFromAvgs(provGain, provLoss);\n }\n // Post-warmup: reverse the most recent Wilder step to get the prior-\n // close avgs, then apply this tick's diff against those.\n const diffClosed = slot.prevSrc - slot.prevClosedSrc;\n const closedGain = diffClosed > 0 ? diffClosed : 0;\n const closedLoss = diffClosed < 0 ? -diffClosed : 0;\n const priorAvgGain = (slot.avgGain * slot.length - closedGain) / (slot.length - 1);\n const priorAvgLoss = (slot.avgLoss * slot.length - closedLoss) / (slot.length - 1);\n const diff = src - slot.prevClosedSrc;\n const gain = diff > 0 ? diff : 0;\n const loss = diff < 0 ? -diff : 0;\n const provGain = wilderStep(priorAvgGain, gain, slot.length);\n const provLoss = wilderStep(priorAvgLoss, loss, slot.length);\n return rsiFromAvgs(provGain, provLoss);\n}\n\n/**\n * Wilder's Relative Strength Index. Output range `[0, 100]`. First\n * `length` bars NaN (no diff for bar 0, then a seed window of\n * `length` diffs). Output is `100 \u2212 100 / (1 + RS)` with\n * `RS = avgGain / avgLoss`; `avgLoss = 0` \u2192 RSI = 100.\n *\n * @formula diff[t] = source[t] \u2212 source[t \u2212 1] ;\n * seed at bar `length` = simple mean of first `length` diffs ;\n * avgGain[t] = (avgGain[t \u2212 1] \u00B7 (length \u2212 1) + gain[t]) / length ;\n * same for avgLoss ;\n * RSI = 100 \u2212 100 / (1 + avgGain / avgLoss)\n * @warmup length\n * @since 0.1\n * @stable\n *\n * `opts.offset` shifts the returned series so `series.current` reads\n * the value `offset` bars ago (PLAN.md \u00A79.1).\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const r = ta.rsi(\"slot\", bar.close, 14);\n * // const head = r.current;\n * // const lagged = ta.rsi(\"slot2\", bar.close, 14, { offset: 5 });\n */\nexport function rsi(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: RsiOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as RsiSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src));\n } else {\n slot.outBuffer.append(closeValue(slot, src));\n }\n return viewForOffset(slot, opts?.offset ?? 0);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/connors-rsi.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape. Composition: Phase-1\n// `ta.rsi` on the raw source (sub-slot `${slotId}/rsi`) + a second\n// `ta.rsi` on the signed-streak scalar (sub-slot\n// `${slotId}/streakRsi`) \u2014 no private RSI math duplication. The\n// signed-streak helper + the rolling percent-rank live inline in this\n// file per task spec \u00A73 (\"not factored to lib until a second consumer\n// appears\").\n//\n// DEVIATION from invinite: invinite's reference requires all three\n// components (RSI, streak-RSI, percent-rank) finite for the CRSI line\n// to be defined; on any NaN it propagates. The task spec \u00A76 overrides\n// to \"sub-component NaN \u2192 component skipped in the average\". We follow\n// the spec \u2014 fully-NaN inputs still emit NaN, but a partially-warm\n// state yields a partial average. This is a tighter alignment with\n// the Pine `ta.connorsRsi` semantic where streak-RSI warmup doesn't\n// gate the rsi-on-close component.\n\nimport type { ConnorsRsiOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { rsi } from \"./rsi.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_RSI_LENGTH = 3;\nconst DEFAULT_STREAK_LENGTH = 2;\nconst DEFAULT_ROC_LENGTH = 100;\n\ntype ConnorsRsiSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly rsiLength: number;\n readonly streakLength: number;\n readonly rocLength: number;\n /** Streak state at head (tick-aware). */\n streakSign: 1 | -1 | 0;\n streakRun: number;\n /** Snapshot at last close (used for tick replay). */\n prevClosedStreakSign: 1 | -1 | 0;\n prevClosedStreakRun: number;\n /** Source value at last close (used for streak diff on next close). */\n prevClosedSrc: number;\n /** Per-bar ROC(1) values (signed pct). Head `at(0)` is the current bar's ROC. */\n readonly rocWindow: Float64RingBuffer;\n /** Number of closed bars folded. */\n barCount: number;\n /** Per-offset Series-view cache. */\n readonly shiftedViews: Map<number, Series<number>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.connorsRsi called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(\n rsiLength: number,\n streakLength: number,\n rocLength: number,\n capacity: number,\n): ConnorsRsiSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n rsiLength,\n streakLength,\n rocLength,\n streakSign: 0,\n streakRun: 0,\n prevClosedStreakSign: 0,\n prevClosedStreakRun: 0,\n prevClosedSrc: Number.NaN,\n // rocWindow capacity = rocLength + 1: room for the current\n // bar's ROC at `at(0)` plus the trailing `rocLength` values\n // we percent-rank against.\n rocWindow: new Float64RingBuffer(rocLength + 1),\n barCount: 0,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: ConnorsRsiSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction stepStreak(\n prevSign: 1 | -1 | 0,\n prevRun: number,\n diff: number,\n): { sign: 1 | -1 | 0; run: number } {\n if (!Number.isFinite(diff) || diff === 0) {\n return { sign: 0, run: 0 };\n }\n if (diff > 0) {\n return { sign: 1, run: prevSign === 1 ? prevRun + 1 : 1 };\n }\n return { sign: -1, run: prevSign === -1 ? prevRun + 1 : 1 };\n}\n\nfunction streakScalar(sign: 1 | -1 | 0, run: number): number {\n if (sign === 0) return 0;\n return sign * run;\n}\n\nfunction pctChange(curr: number, prev: number): number {\n if (!Number.isFinite(curr) || !Number.isFinite(prev) || prev === 0) return Number.NaN;\n return (100 * (curr - prev)) / prev;\n}\n\n/**\n * Rolling percent rank of the head ROC value (`rocWindow.at(0)`)\n * within the trailing `rocLength` ROC values (exclusive of the head).\n * Returns 50 on an empty window (matches invinite). NaN target \u2192 NaN.\n */\nfunction percentRankHead(slot: ConnorsRsiSlot): number {\n const target = slot.rocWindow.at(0);\n if (!Number.isFinite(target)) return Number.NaN;\n const windowSize = slot.rocWindow.length - 1;\n // Defensive: percentRankHead is only called after the ROC window has\n // at least two entries (post-warmup), so windowSize >= 1 here.\n /* c8 ignore next */\n if (windowSize <= 0) return 50;\n const upper = Math.min(windowSize, slot.rocLength);\n let countBelow = 0;\n let validCount = 0;\n for (let j = 1; j <= upper; j += 1) {\n const v = slot.rocWindow.at(j);\n if (!Number.isFinite(v)) continue;\n validCount += 1;\n if (v < target) countBelow += 1;\n }\n return validCount === 0 ? 50 : (100 * countBelow) / validCount;\n}\n\nfunction blendCrsi(rsiHead: number, streakRsiHead: number, pctRank: number): number {\n let sum = 0;\n let count = 0;\n if (Number.isFinite(rsiHead)) {\n sum += rsiHead;\n count += 1;\n }\n if (Number.isFinite(streakRsiHead)) {\n sum += streakRsiHead;\n count += 1;\n }\n if (Number.isFinite(pctRank)) {\n sum += pctRank;\n count += 1;\n }\n return count === 0 ? Number.NaN : sum / count;\n}\n\n/**\n * Connors RSI \u2014 three-component blend of `RSI(source, rsiLength)`,\n * `RSI(streak, streakLength)`, and `PercentRank(ROC(source, 1),\n * rocLength)` averaged into a single line bounded `[0, 100]`. The\n * registry records `yDomain: { kind: \"fixed\", min: 0, max: 100 }` in\n * `TA_REGISTRY_METADATA`. Composes Phase-1 `ta.rsi` for both RSI\n * components (no private RSI math). Defaults `(3, 2, 100)` matches\n * Larry Connors' original spec.\n *\n * @formula diff = source[t] \u2212 source[t \u2212 1] ;\n * streak[t] = signed run-length of consecutive same-sign diffs ;\n * rsiClose = rsi(source, rsiLength) ;\n * rsiStreak = rsi(streak, streakLength) ;\n * roc1 = 100 \u00B7 diff / source[t \u2212 1] ;\n * pctRank = 100 \u00B7 #(roc1[i] < roc1[t]) / validWindowCount\n * over i in [t \u2212 rocLength, t \u2212 1] ;\n * crsi = (rsiClose + rsiStreak + pctRank) / 3 ;\n * components that are NaN are skipped \u2014 count adjusts\n * @warmup max(rsiLength, streakLength, rocLength) + 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const c = ta.connorsRsi(\"slot\", bar.close);\n * // plot(c);\n */\nexport function connorsRsi(\n slotId: string,\n source: ScalarOrSeries,\n opts?: ConnorsRsiOpts,\n): Series<number> {\n const ctx = getCtx();\n const rsiLength = opts?.rsiLength ?? DEFAULT_RSI_LENGTH;\n const streakLength = opts?.streakLength ?? DEFAULT_STREAK_LENGTH;\n const rocLength = opts?.rocLength ?? DEFAULT_ROC_LENGTH;\n let slot = ctx.stream.taSlots.get(slotId) as ConnorsRsiSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(rsiLength, streakLength, rocLength, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n\n if (ctx.isTick) {\n // Tick replay: use the SNAPSHOT (prevClosed*) state \u2014 do NOT\n // mutate `streakSign` / `streakRun` / `prevClosedSrc` /\n // `barCount` / advance rocWindow.\n const diff = pctChange(src, slot.prevClosedSrc);\n const { sign, run } = stepStreak(\n slot.prevClosedStreakSign,\n slot.prevClosedStreakRun,\n /* c8 ignore next */\n Number.isFinite(slot.prevClosedSrc) ? src - slot.prevClosedSrc : Number.NaN,\n );\n const roc = diff;\n slot.rocWindow.replaceHead(roc);\n const rsiHead = rsi(`${slotId}/rsi`, src, rsiLength).current;\n const streakRsiHead = rsi(\n `${slotId}/streakRsi`,\n streakScalar(sign, run),\n streakLength,\n ).current;\n const pr = percentRankHead(slot);\n slot.outBuffer.replaceHead(blendCrsi(rsiHead, streakRsiHead, pr));\n } else {\n const diff = Number.isFinite(slot.prevClosedSrc) ? src - slot.prevClosedSrc : Number.NaN;\n const { sign, run } = stepStreak(slot.streakSign, slot.streakRun, diff);\n const roc = pctChange(src, slot.prevClosedSrc);\n slot.rocWindow.append(roc);\n const rsiHead = rsi(`${slotId}/rsi`, src, rsiLength).current;\n const streakRsiHead = rsi(\n `${slotId}/streakRsi`,\n streakScalar(sign, run),\n streakLength,\n ).current;\n const pr = percentRankHead(slot);\n slot.outBuffer.append(blendCrsi(rsiHead, streakRsiHead, pr));\n // Advance close-side state.\n slot.prevClosedStreakSign = slot.streakSign;\n slot.prevClosedStreakRun = slot.streakRun;\n slot.streakSign = sign;\n slot.streakRun = run;\n slot.prevClosedSrc = src;\n slot.barCount += 1;\n }\n return viewForOffset(slot, opts?.offset ?? 0);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/coppock.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape.\n//\n// DEVIATION from the task spec's \"composes `ta.change`\" hint:\n// `ta.change` emits ABSOLUTE deltas, while Coppock's ROC is a\n// PERCENTAGE rate-of-change (`100 \u00B7 (src \u2212 src[n]) / src[n]`). We\n// compute the percentage ROCs inline against our own sourceWindow\n// rather than composing `ta.change`. The WMA math mirrors\n// `lib/wmaFloat64` (linear weights `(N, N \u2212 1, \u2026, 1)`, denominator\n// `N(N + 1) / 2`); we inline the WMA over a per-close `sumWindow`\n// rather than allocating a `Float64Array` per close to feed\n// `wmaFloat64`.\n\nimport type { CoppockOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_ROC1_LENGTH = 11;\nconst DEFAULT_ROC2_LENGTH = 14;\nconst DEFAULT_WMA_LENGTH = 10;\n\ntype CoppockSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly roc1Length: number;\n readonly roc2Length: number;\n readonly wmaLength: number;\n /** Last `max(roc1, roc2) + 1` closed source values. `at(0)` is the head. */\n readonly sourceWindow: Float64RingBuffer;\n /** Last `wmaLength` ROC1+ROC2 sums (`at(0)` is the head). */\n readonly sumWindow: Float64RingBuffer;\n /** Number of closed bars folded into the slot so far. */\n barCount: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.coppock called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(\n roc1Length: number,\n roc2Length: number,\n wmaLength: number,\n capacity: number,\n): CoppockSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n const lookbackCapacity = Math.max(roc1Length, roc2Length) + 1;\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n roc1Length,\n roc2Length,\n wmaLength,\n sourceWindow: new Float64RingBuffer(lookbackCapacity),\n sumWindow: new Float64RingBuffer(wmaLength),\n barCount: 0,\n };\n}\n\n/**\n * Percentage rate-of-change against a lookback value. Returns NaN on\n * a NaN / zero divisor (matching invinite's `prev === 0` guard).\n */\nfunction pctRoc(current: number, lookback: number): number {\n if (!Number.isFinite(lookback) || lookback === 0 || !Number.isFinite(current)) {\n return Number.NaN;\n }\n return (100 * (current - lookback)) / lookback;\n}\n\n/**\n * Inline linear-weighted moving average over the `sumWindow` ring.\n * `at(0)` is the most recent value (weight `wmaLength`); `at(wmaLength \u2212 1)`\n * is the oldest (weight `1`). Returns NaN if the window is not full\n * or any slot is non-finite.\n */\nfunction wmaOverSumWindow(slot: CoppockSlot): number {\n if (slot.sumWindow.length < slot.wmaLength) return Number.NaN;\n const denom = (slot.wmaLength * (slot.wmaLength + 1)) / 2;\n let acc = 0;\n for (let i = 0; i < slot.wmaLength; i += 1) {\n const v = slot.sumWindow.at(i);\n if (!Number.isFinite(v)) return Number.NaN;\n acc += v * (slot.wmaLength - i);\n }\n return acc / denom;\n}\n\nfunction computeRocSum(slot: CoppockSlot, src: number): number {\n // sourceWindow.at(roc1Length) is the bar `roc1Length` ago RELATIVE\n // TO the just-appended head (`at(0)` is `src`). Same for roc2.\n if (slot.sourceWindow.length <= slot.roc1Length) return Number.NaN;\n if (slot.sourceWindow.length <= slot.roc2Length) return Number.NaN;\n const lookback1 = slot.sourceWindow.at(slot.roc1Length);\n const lookback2 = slot.sourceWindow.at(slot.roc2Length);\n const roc1 = pctRoc(src, lookback1);\n const roc2 = pctRoc(src, lookback2);\n if (!Number.isFinite(roc1) || !Number.isFinite(roc2)) return Number.NaN;\n return roc1 + roc2;\n}\n\nfunction closeValue(slot: CoppockSlot, src: number): number {\n slot.sourceWindow.append(src);\n slot.barCount += 1;\n const sum = computeRocSum(slot, src);\n slot.sumWindow.append(sum);\n return wmaOverSumWindow(slot);\n}\n\nfunction tickValue(slot: CoppockSlot, src: number): number {\n if (slot.sourceWindow.length === 0) return Number.NaN;\n // Substitute the head of `sourceWindow` with the tick `src`. The\n // lookback bars (`at(roc1Length)` / `at(roc2Length)`) are\n // pre-close and unaffected by the tick.\n slot.sourceWindow.replaceHead(src);\n const sum = computeRocSum(slot, src);\n slot.sumWindow.replaceHead(sum);\n return wmaOverSumWindow(slot);\n}\n\n/**\n * Coppock Curve \u2014 long-term momentum indicator (Edwin Coppock, 1962).\n * `WMA(ROC(source, roc1Length) + ROC(source, roc2Length), wmaLength)`\n * where ROC is the percentage rate-of-change. Defaults `(11, 14, 10)`\n * matches Coppock's original monthly-equities formulation. Unbounded;\n * zero crossings are the canonical signal (positive \u2192 bullish).\n *\n * @formula roc1 = 100 \u00B7 (source[t] \u2212 source[t \u2212 roc1Length]) / source[t \u2212 roc1Length] ;\n * roc2 = 100 \u00B7 (source[t] \u2212 source[t \u2212 roc2Length]) / source[t \u2212 roc2Length] ;\n * sum = roc1 + roc2 ;\n * coppock = (\u03A3 sum[t \u2212 N + 1 + i] \u00B7 (i + 1)) / (N(N + 1) / 2)\n * for i in 0..N \u2212 1, N = wmaLength\n * @warmup max(roc1Length, roc2Length) + wmaLength \u2212 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const c = ta.coppock(\"slot\", bar.close);\n * // plot(c);\n */\nexport function coppock(\n slotId: string,\n source: ScalarOrSeries,\n opts?: CoppockOpts,\n): Series<number> {\n const ctx = getCtx();\n const roc1Length = opts?.roc1Length ?? DEFAULT_ROC1_LENGTH;\n const roc2Length = opts?.roc2Length ?? DEFAULT_ROC2_LENGTH;\n const wmaLength = opts?.wmaLength ?? DEFAULT_WMA_LENGTH;\n let slot = ctx.stream.taSlots.get(slotId) as CoppockSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(roc1Length, roc2Length, wmaLength, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src));\n } else {\n slot.outBuffer.append(closeValue(slot, src));\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// No invinite source \u2014 Phase-1 new code, semantics per Pine\n// `ta.crossover` / `ta.crossunder`. See PLAN.md \u00A73.1.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape.\n\nimport type { CrossoverOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype CrossSlot = {\n readonly outBuffer: RingBuffer<boolean>;\n readonly series: Series<boolean>;\n /** Prior closed-bar values of `a` and `b` (rolling 2-slot history). */\n prevA: number;\n prevB: number;\n /** As-of-current-close values, frozen so ticks replay against prior. */\n currA: number;\n currB: number;\n initialised: boolean;\n /** Per-offset Series-view cache; see `sma.ts` for the convention. */\n readonly shiftedViews: Map<number, Series<boolean>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.crossover called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): CrossSlot {\n const outBuffer = new RingBuffer<boolean>(capacity);\n return {\n outBuffer,\n series: makeSeriesView<boolean>(outBuffer) as Series<boolean>,\n prevA: Number.NaN,\n prevB: Number.NaN,\n currA: Number.NaN,\n currB: Number.NaN,\n initialised: false,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: CrossSlot, offset: number): Series<boolean> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<boolean>(slot.outBuffer, offset) as Series<boolean>;\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction detect(prevA: number, prevB: number, currA: number, currB: number): boolean {\n if (\n !Number.isFinite(prevA) ||\n !Number.isFinite(prevB) ||\n !Number.isFinite(currA) ||\n !Number.isFinite(currB)\n ) {\n return false;\n }\n return currA > currB && prevA <= prevB;\n}\n\n/**\n * `true` exactly at the bar where `a` crosses above `b`: `a.current >\n * b.current && a.prev <= b.prev`. `b` may be a scalar (treated as a\n * constant series). NaN inputs yield `false` \u2014 Pine semantics for\n * Boolean series (NaN doesn't bubble through booleans).\n *\n * The slot keeps a 2-slot history of both `a` and `b` so scalar\n * sources work without the caller wrapping them. Tick-mode replays\n * the head with the prior closed-bar's `(a, b)` pair so a partial-\n * bar value doesn't seed the next close's comparison.\n *\n * @formula out[t] = a[t] > b[t] && a[t \u2212 1] \u2264 b[t \u2212 1] (else false)\n * @warmup 1 (need a prior bar)\n * @since 0.1\n * @stable\n *\n * `opts.offset` shifts the boolean series so `series.current` returns\n * the crossover detection `offset` bars ago (PLAN.md \u00A79.1).\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const c = ta.crossover(\"slot\", fastEma, slowEma);\n * // if (c.current) { ... }\n * // const lagged = ta.crossover(\"slot2\", fastEma, slowEma, { offset: 1 });\n */\nexport function crossover(\n slotId: string,\n a: ScalarOrSeries,\n b: ScalarOrSeries,\n opts?: CrossoverOpts,\n): Series<boolean> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as CrossSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const aValue = readSourceValue(a);\n const bValue = readSourceValue(b);\n const offset = opts?.offset ?? 0;\n if (ctx.isTick) {\n const out = detect(slot.prevA, slot.prevB, aValue, bValue);\n slot.outBuffer.replaceHead(out);\n return viewForOffset(slot, offset);\n }\n if (!slot.initialised) {\n slot.initialised = true;\n slot.prevA = aValue;\n slot.prevB = bValue;\n slot.currA = aValue;\n slot.currB = bValue;\n slot.outBuffer.append(false);\n return viewForOffset(slot, offset);\n }\n // Standard close-side advance: prev becomes currA/B, currA/B become the new sample.\n slot.prevA = slot.currA;\n slot.prevB = slot.currB;\n slot.currA = aValue;\n slot.currB = bValue;\n slot.outBuffer.append(detect(slot.prevA, slot.prevB, slot.currA, slot.currB));\n return viewForOffset(slot, offset);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// No invinite source \u2014 Phase-1 new code, semantics per Pine\n// `ta.crossover` / `ta.crossunder`. See PLAN.md \u00A73.1.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape.\n\nimport type { CrossunderOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype CrossSlot = {\n readonly outBuffer: RingBuffer<boolean>;\n readonly series: Series<boolean>;\n prevA: number;\n prevB: number;\n currA: number;\n currB: number;\n initialised: boolean;\n /** Per-offset Series-view cache; see `sma.ts` for the convention. */\n readonly shiftedViews: Map<number, Series<boolean>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.crossunder called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): CrossSlot {\n const outBuffer = new RingBuffer<boolean>(capacity);\n return {\n outBuffer,\n series: makeSeriesView<boolean>(outBuffer) as Series<boolean>,\n prevA: Number.NaN,\n prevB: Number.NaN,\n currA: Number.NaN,\n currB: Number.NaN,\n initialised: false,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: CrossSlot, offset: number): Series<boolean> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<boolean>(slot.outBuffer, offset) as Series<boolean>;\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction detect(prevA: number, prevB: number, currA: number, currB: number): boolean {\n if (\n !Number.isFinite(prevA) ||\n !Number.isFinite(prevB) ||\n !Number.isFinite(currA) ||\n !Number.isFinite(currB)\n ) {\n return false;\n }\n return currA < currB && prevA >= prevB;\n}\n\n/**\n * `true` exactly at the bar where `a` crosses below `b`: `a.current <\n * b.current && a.prev >= b.prev`. Mirror of {@link crossover}; NaN\n * inputs yield `false`.\n *\n * @formula out[t] = a[t] < b[t] && a[t \u2212 1] \u2265 b[t \u2212 1] (else false)\n * @warmup 1\n * @since 0.1\n * @stable\n *\n * `opts.offset` shifts the boolean series so `series.current` returns\n * the crossunder detection `offset` bars ago (PLAN.md \u00A79.1).\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const c = ta.crossunder(\"slot\", fastEma, slowEma);\n * // if (c.current) { ... }\n * // const lagged = ta.crossunder(\"slot2\", fastEma, slowEma, { offset: 1 });\n */\nexport function crossunder(\n slotId: string,\n a: ScalarOrSeries,\n b: ScalarOrSeries,\n opts?: CrossunderOpts,\n): Series<boolean> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as CrossSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const aValue = readSourceValue(a);\n const bValue = readSourceValue(b);\n const offset = opts?.offset ?? 0;\n if (ctx.isTick) {\n const out = detect(slot.prevA, slot.prevB, aValue, bValue);\n slot.outBuffer.replaceHead(out);\n return viewForOffset(slot, offset);\n }\n if (!slot.initialised) {\n slot.initialised = true;\n slot.prevA = aValue;\n slot.prevB = bValue;\n slot.currA = aValue;\n slot.currB = bValue;\n slot.outBuffer.append(false);\n return viewForOffset(slot, offset);\n }\n slot.prevA = slot.currA;\n slot.prevB = slot.currB;\n slot.currA = aValue;\n slot.currB = bValue;\n slot.outBuffer.append(detect(slot.prevA, slot.prevB, slot.currA, slot.currB));\n return viewForOffset(slot, offset);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/dema.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. DEMA composes two EMA sub-slots derived from\n// the parent slot id.\n\nimport type { DemaOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { ema } from \"./ema.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype DemaSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.dema called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): DemaSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n };\n}\n\n/**\n * Double Exponential Moving Average \u2014 `DEMA = 2\u00B7EMA(src) \u2212 EMA(EMA(src))`.\n * Composes two EMA sub-slots derived from the parent slot id\n * (`${slotId}/ema1`, `${slotId}/ema2`). The outer EMA reads the inner\n * EMA's `.current` scalar each bar; the parent slot allocates its own\n * `outBuffer + series` because the output is a linear combination of\n * the two sub-slots (not equal to either). Mirrors the MACD / HMA\n * sub-slot pattern.\n *\n * @formula ema1 = EMA(source, length) ;\n * ema2 = EMA(ema1, length) ;\n * out = 2 \u00B7 ema1 \u2212 ema2\n * @warmup 2 \u00B7 length \u2212 2\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const d = ta.dema(bar.close, 20);\n * // plot(d);\n */\nexport function dema(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: DemaOpts,\n): Series<number> {\n const ctx = getCtx();\n const src = readSourceValue(source);\n const ema1Series = ema(`${slotId}/ema1`, src, length);\n const e1 = ema1Series.current;\n const ema2Series = ema(`${slotId}/ema2`, e1, length);\n const e2 = ema2Series.current;\n const value = Number.isFinite(e1) && Number.isFinite(e2) ? 2 * e1 - e2 : Number.NaN;\n\n let slot = ctx.stream.taSlots.get(slotId) as DemaSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n if (ctx.isTick) slot.outBuffer.replaceHead(value);\n else slot.outBuffer.append(value);\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/dmi.ts\n// plus lib/wilder-directional.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. DMI reads `bar.high` / `bar.low` / `bar.close`\n// directly (mirrors Pine's `ta.dmi(length)` which has no source param)\n// and runs the Wilder +DM / -DM / TR smoothing incrementally via\n// `wilderStep` (the same per-step recurrence the reference\n// `lib/wilderDirectional.ts` uses internally).\n\nimport type { DmiOpts, DmiResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport {\n advanceDirectionalClose,\n type DirectionalState,\n initDirectionalState,\n tickDirectional,\n} from \"./lib/directionalState.js\";\n\ntype DmiSlot = {\n readonly result: DmiResult;\n readonly plusDiBuffer: Float64RingBuffer;\n readonly minusDiBuffer: Float64RingBuffer;\n readonly dirState: DirectionalState;\n /**\n * Per-offset frozen `DmiResult` cache. `offset === 0` returns\n * `result` by identity. Non-zero offsets get a frozen result\n * whose two Series are `makeShiftedSeriesView` proxies over the\n * same two underlying ring buffers.\n */\n readonly shiftedResults: Map<number, DmiResult>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.dmi called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): DmiSlot {\n const plusDiBuffer = new Float64RingBuffer(capacity);\n const minusDiBuffer = new Float64RingBuffer(capacity);\n return {\n result: Object.freeze({\n plusDi: makeSeriesView<number>(plusDiBuffer),\n minusDi: makeSeriesView<number>(minusDiBuffer),\n }),\n plusDiBuffer,\n minusDiBuffer,\n dirState: initDirectionalState(length),\n shiftedResults: new Map(),\n };\n}\n\nfunction resultForOffset(slot: DmiSlot, offset: number): DmiResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n plusDi: makeShiftedSeriesView<number>(slot.plusDiBuffer, offset),\n minusDi: makeShiftedSeriesView<number>(slot.minusDiBuffer, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\n/**\n * Wilder's Directional Movement Index \u2014 `+DI` / `\u2212DI` pair derived\n * from the Wilder-smoothed `+DM` / `\u2212DM` over the smoothed True\n * Range. Reads `bar.high` / `bar.low` / `bar.close` directly\n * (mirrors Pine's `ta.dmi(length)` \u2014 no source param). Both series\n * \u2208 [0, 100] when defined; NaN until `length` closed bars have\n * folded into the seed window. The first defined value lands at\n * bar index `length` (counted zero-based \u2014 matches the\n * full-recompute reference in `lib/wilderDirectional.ts`).\n *\n * @formula TR[t] = max(high \u2212 low, |high \u2212 prevClose|, |low \u2212 prevClose|) ;\n * upMove = high[t] \u2212 high[t\u22121] ; downMove = low[t\u22121] \u2212 low[t] ;\n * +DM = upMove > downMove && upMove > 0 ? upMove : 0 ;\n * \u2212DM = downMove > upMove && downMove > 0 ? downMove : 0 ;\n * seed at bar `length` = simple sum over the seed window ;\n * smoothed via wilderStep(\u03B1 = 1/length) thereafter ;\n * +DI = 100 \u00B7 smoothed+DM / smoothedTR ;\n * \u2212DI = 100 \u00B7 smoothed\u2212DM / smoothedTR ;\n * DI falls back to 0 when smoothedTR is 0 (matches invinite).\n * @warmup length\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts both series in lockstep (PLAN.md \u00A79.1) \u2014\n * `series.current` on each output returns the value `offset` bars\n * ago.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const d = ta.dmi(\"slot\", 14);\n * // plot(d.plusDi);\n * // plot(d.minusDi);\n */\nexport function dmi(slotId: string, length: number, opts?: DmiOpts): DmiResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as DmiSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n if (ctx.isTick) {\n const { plusDi, minusDi } = tickDirectional(slot.dirState, bar.high, bar.low, bar.close);\n slot.plusDiBuffer.replaceHead(plusDi);\n slot.minusDiBuffer.replaceHead(minusDi);\n } else {\n const { plusDi, minusDi } = advanceDirectionalClose(\n slot.dirState,\n bar.high,\n bar.low,\n bar.close,\n );\n slot.plusDiBuffer.append(plusDi);\n slot.minusDiBuffer.append(minusDi);\n }\n return resultForOffset(slot, opts?.offset ?? 0);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/donchian.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Reads `bar.high` / `bar.low` directly (no\n// source param, mirrors Pine's `ta.highest` / `ta.lowest` over the\n// `high` / `low` series). Composes the registered `ta.highest` /\n// `ta.lowest` primitives via sub-slots `${slotId}/highest` and\n// `${slotId}/lowest` \u2014 the math equivalent of `lib/donchianMid`\n// (used by `ta.ichimoku` in its full-recompute path) but routed\n// through the slot-aware registry so a fix to either primitive\n// flows in for free.\n\nimport type { DonchianOpts, DonchianResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { highest } from \"./highest.js\";\nimport { lowest } from \"./lowest.js\";\n\ntype DonchianSlot = {\n readonly middleBuffer: Float64RingBuffer;\n readonly length: number;\n outputs: DonchianResult | null;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.donchian called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): DonchianSlot {\n return {\n middleBuffer: new Float64RingBuffer(capacity),\n length,\n outputs: null,\n };\n}\n\nfunction middleValue(upper: number, lower: number): number {\n if (!Number.isFinite(upper) || !Number.isFinite(lower)) return Number.NaN;\n return (upper + lower) / 2;\n}\n\n/**\n * Donchian Channels \u2014 overlay volatility indicator. Highest high and\n * lowest low over a fixed `length`-bar window form the upper / lower\n * band; their midpoint is the centerline. Reads `bar.high` /\n * `bar.low` directly (no source param, mirrors Pine). Composes the\n * registered `ta.highest` / `ta.lowest` primitives via sub-slots\n * `${slotId}/highest` and `${slotId}/lowest` \u2014 the math equivalent of\n * `lib/donchianMid` but routed through the slot-aware registry so a\n * fix to either primitive flows in for free. Returns a cached\n * `{ upper, middle, lower }` record (same identity every bar). NaN\n * across all outputs while the trailing window is fully unwarmed.\n *\n * @formula upper = highest(bar.high, length) ;\n * lower = lowest(bar.low, length) ;\n * middle = (upper + lower) / 2\n * @warmup length \u2212 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const d = ta.donchian(20);\n * // plot(d.upper);\n * // plot(d.middle);\n * // plot(d.lower);\n */\nexport function donchian(slotId: string, length: number, _opts?: DonchianOpts): DonchianResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as DonchianSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const upperSeries = highest(`${slotId}/highest`, ctx.stream.bar.high, length);\n const lowerSeries = lowest(`${slotId}/lowest`, ctx.stream.bar.low, length);\n if (slot.outputs === null) {\n slot.outputs = Object.freeze({\n upper: upperSeries,\n middle: makeSeriesView<number>(slot.middleBuffer),\n lower: lowerSeries,\n });\n }\n const value = middleValue(upperSeries.current, lowerSeries.current);\n if (ctx.isTick) {\n slot.middleBuffer.replaceHead(value);\n } else {\n slot.middleBuffer.append(value);\n }\n return slot.outputs;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/dpo.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape. Composition: `ta.sma`\n// over the source via a sub-slot (`${slotId}/sma`); a per-slot\n// `sourceWindow` Float64RingBuffer carries the trailing\n// `displacement + 1` source values for the `src[t \u2212 displacement]`\n// lookback.\n//\n// DEVIATION from invinite: only the non-centered (default) render\n// mode is shipped. Invinite's `centered: true` mode emits\n// `dpo[i] = src[i] - sma[i + displacement]`, which depends on the\n// future SMA; chartlang's append-only ring-buffer contract can't\n// backfill earlier emissions when the future SMA confirms, so we'd\n// have to emit centered as NaN at the head until the future SMA\n// lands \u2014 the visual would diverge from invinite. The non-centered\n// mode is the TradingView \"shifts back to the right to match current\n// price\" default, which is what most authors want.\n\nimport type { DpoOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { sma } from \"./sma.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype DpoSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n readonly displacement: number;\n /** Source values across the trailing `displacement + 1` bars. `at(0)` is the head. */\n readonly sourceWindow: Float64RingBuffer;\n /** Number of closed bars folded into the slot so far. */\n barCount: number;\n /** Per-offset Series-view cache. */\n readonly shiftedViews: Map<number, Series<number>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.dpo called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): DpoSlot {\n const displacement = Math.floor(length / 2) + 1;\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n displacement,\n sourceWindow: new Float64RingBuffer(displacement + 1),\n barCount: 0,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: DpoSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction computeDpo(slot: DpoSlot, smaCurrent: number): number {\n if (slot.sourceWindow.length <= slot.displacement) return Number.NaN;\n if (!Number.isFinite(smaCurrent)) return Number.NaN;\n const shifted = slot.sourceWindow.at(slot.displacement);\n if (!Number.isFinite(shifted)) return Number.NaN;\n return shifted - smaCurrent;\n}\n\n/**\n * Detrended Price Oscillator \u2014 strips the SMA trend out of price so\n * the remaining oscillator visualises the short-cycle component.\n * Non-centered (default) mode: `dpo[i] = source[i \u2212 displacement]\n * \u2212 sma[i]` with `displacement = floor(length / 2) + 1`. Composes\n * `ta.sma(${slotId}/sma, src, length)`; a per-slot source window\n * carries the trailing `displacement + 1` bars so the\n * `source[i \u2212 displacement]` lookback is O(1) per close.\n *\n * @formula displacement = floor(length / 2) + 1 ;\n * sma[i] = mean(source[i \u2212 length + 1 ..= i]) ;\n * dpo[i] = source[i \u2212 displacement] \u2212 sma[i]\n * @warmup length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const d = ta.dpo(\"slot\", bar.close, 21);\n * // const head = d.current;\n */\nexport function dpo(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: DpoOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as DpoSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.sourceWindow.replaceHead(src);\n const smaSeries = sma(`${slotId}/sma`, src, length);\n slot.outBuffer.replaceHead(computeDpo(slot, smaSeries.current));\n } else {\n slot.sourceWindow.append(src);\n slot.barCount += 1;\n const smaSeries = sma(`${slotId}/sma`, src, length);\n slot.outBuffer.append(computeDpo(slot, smaSeries.current));\n }\n return viewForOffset(slot, opts?.offset ?? 0);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/smma.ts\n// plus lib/smma-of-float64.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape.\n\nimport type { Series, SmmaOpts } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype SmmaSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly alpha: number;\n readonly length: number;\n seedSum: number;\n seedCount: number;\n prevSmma: number;\n prevClosedSmma: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.smma called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): SmmaSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n alpha: 1 / length,\n length,\n seedSum: 0,\n seedCount: 0,\n prevSmma: Number.NaN,\n prevClosedSmma: Number.NaN,\n };\n}\n\nfunction compute(slot: SmmaSlot, src: number, isTick: boolean): number {\n if (!Number.isFinite(src)) {\n // Mid-stream NaN forward-fills the prior value (matches\n // `smmaFloat64`'s recurrence-MA convention).\n return isTick ? slot.prevSmma : slot.prevClosedSmma;\n }\n if (slot.seedCount < slot.length) {\n if (isTick) {\n const nextSum = slot.seedSum + src;\n const nextCount = slot.seedCount + 1;\n if (nextCount < slot.length) return Number.NaN;\n return nextSum / slot.length;\n }\n slot.seedSum += src;\n slot.seedCount += 1;\n if (slot.seedCount < slot.length) {\n slot.prevClosedSmma = Number.NaN;\n return Number.NaN;\n }\n const seedValue = slot.seedSum / slot.length;\n slot.prevClosedSmma = seedValue;\n slot.prevSmma = seedValue;\n return seedValue;\n }\n const prev = slot.prevClosedSmma;\n const next = src * slot.alpha + prev * (1 - slot.alpha);\n if (!isTick) {\n slot.prevClosedSmma = next;\n slot.prevSmma = next;\n }\n return next;\n}\n\n/**\n * Smoothed moving average (Wilder's RMA). Recurrence\n * `SMMA[t] = \u03B1\u00B7x[t] + (1 \u2212 \u03B1)\u00B7SMMA[t \u2212 1]` with `\u03B1 = 1 / length`\n * after a seed of the simple mean of the first `length` finite\n * source values. Mid-stream NaN forward-fills the prior value\n * (matches the recurrence-MA convention shared with `ta.ema`).\n * Tick-mode (`onBarTick`) recomputes the head from the previous\n * closed SMMA so partial-bar values don't bleed into the next\n * close's recurrence.\n *\n * @formula \u03B1 = 1 / length ;\n * seed at bar length\u22121 = mean(source[0..length\u22121]) ;\n * SMMA[t] = source[t]\u00B7\u03B1 + SMMA[t\u22121]\u00B7(1\u2212\u03B1)\n * @warmup length \u2212 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const s = ta.smma(bar.close, 14);\n * // plot(s);\n */\nexport function smma(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: SmmaOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as SmmaSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const value = compute(slot, readSourceValue(source), ctx.isTick);\n if (ctx.isTick) slot.outBuffer.replaceHead(value);\n else slot.outBuffer.append(value);\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/wma.ts\n// plus lib/wma-of-float64.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape.\n\nimport type { Series, WmaOpts } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype WmaSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n readonly denom: number;\n /**\n * Closed source values across the trailing `length` bars. `at(0)` is\n * the most recent close (the head bar); `at(length - 1)` is the\n * oldest value still in the window.\n */\n readonly window: Float64RingBuffer;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.wma called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): WmaSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n denom: (length * (length + 1)) / 2,\n window: new Float64RingBuffer(length),\n };\n}\n\nfunction weightedFromWindow(slot: WmaSlot): number {\n // `window.at(0)` is the head; weight on the head is `length`, weight\n // on the oldest bar (`at(length - 1)`) is `1`. Any NaN slot in the\n // window short-circuits the result to NaN (matches `wmaFloat64`'s\n // window short-circuit semantics).\n let sum = 0;\n for (let j = 0; j < slot.length; j += 1) {\n const v = slot.window.at(j);\n if (!Number.isFinite(v)) return Number.NaN;\n sum += v * (slot.length - j);\n }\n return sum / slot.denom;\n}\n\nfunction closeValue(slot: WmaSlot, src: number): number {\n slot.window.append(src);\n if (slot.window.length < slot.length) return Number.NaN;\n return weightedFromWindow(slot);\n}\n\nfunction tickValue(slot: WmaSlot, src: number): number {\n // The window holds the closed-bar history. A tick replaces the head\n // bar's value with `src`; compute the weighted sum against the\n // closed window with `src` substituted at position 0.\n if (slot.window.length < slot.length) return Number.NaN;\n if (!Number.isFinite(src)) return Number.NaN;\n let sum = src * slot.length;\n for (let j = 1; j < slot.length; j += 1) {\n const v = slot.window.at(j);\n if (!Number.isFinite(v)) return Number.NaN;\n sum += v * (slot.length - j);\n }\n return sum / slot.denom;\n}\n\n/**\n * Weighted moving average \u2014 linear weights `1..N` over the trailing\n * `length` source values, denominator `N(N + 1) / 2`. Warmup of\n * `length \u2212 1` bars returns `NaN`; a NaN anywhere inside the window\n * also returns `NaN` (full-recompute weighted windows cannot\n * meaningfully forward-fill a gap). Tick-mode replays the head as\n * `(N\u00B7tickValue + \u03A3_{j=1..N-1} window[j]\u00B7(N\u2212j)) / denom` so a\n * partial-bar tick doesn't pollute the next close's weighted sum.\n *\n * @formula denom = length(length + 1) / 2 ;\n * out[t] = (\u03A3_{j=0..length-1} source[t \u2212 j] \u00B7 (length \u2212 j)) / denom\n * @warmup length \u2212 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const w = ta.wma(bar.close, 14);\n * // plot(w);\n */\nexport function wma(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: WmaOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as WmaSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src));\n } else {\n slot.outBuffer.append(closeValue(slot, src));\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/envelope.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Envelope composes the registered MA primitive\n// (sma / ema / wma / smma) via sub-slot `${slotId}/<maType>` over the\n// script-provided source \u2014 so a fix to any MA flows in for free.\n\nimport type {\n EnvelopeOpts,\n EnvelopeResult,\n MaTypeNoVolume,\n Series,\n} from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { ema } from \"./ema.js\";\nimport { sma } from \"./sma.js\";\nimport { smma } from \"./smma.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\nimport { wma } from \"./wma.js\";\n\nconst DEFAULT_LENGTH = 20;\nconst DEFAULT_PERCENT = 10;\nconst DEFAULT_MA_TYPE: MaTypeNoVolume = \"sma\";\n\ntype EnvelopeSlot = {\n readonly upperBuffer: Float64RingBuffer;\n readonly lowerBuffer: Float64RingBuffer;\n readonly length: number;\n readonly percent: number;\n readonly maType: MaTypeNoVolume;\n outputs: EnvelopeResult | null;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.envelope called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(\n length: number,\n percent: number,\n maType: MaTypeNoVolume,\n capacity: number,\n): EnvelopeSlot {\n return {\n upperBuffer: new Float64RingBuffer(capacity),\n lowerBuffer: new Float64RingBuffer(capacity),\n length,\n percent,\n maType,\n outputs: null,\n };\n}\n\nfunction dispatchMa(\n maType: MaTypeNoVolume,\n subSlotId: string,\n source: number,\n length: number,\n): Series<number> {\n switch (maType) {\n case \"sma\":\n return sma(subSlotId, source, length);\n case \"ema\":\n return ema(subSlotId, source, length);\n case \"wma\":\n return wma(subSlotId, source, length);\n case \"smma\":\n return smma(subSlotId, source, length);\n }\n}\n\n/**\n * Envelope \u2014 overlay percent-band envelope around an MA of the\n * script-provided source. Defaults `length = 20`, `percent = 10`,\n * `maType = \"sma\"` (matches Pine `ta.envelope` defaults). The upper /\n * lower bands are a pure multiplicative offset of the middle MA.\n * Composes the registered MA primitive via sub-slot\n * `${slotId}/<maType>` \u2014 fixes to any MA flow in for free. Returns a\n * cached `{ upper, middle, lower }` record (same identity every bar).\n * NaN across all outputs while the MA is unwarmed.\n *\n * @formula middle = MA(source, length, maType) ;\n * upper = middle \u00B7 (1 + percent / 100) ;\n * lower = middle \u00B7 (1 \u2212 percent / 100)\n * @warmup length \u2212 1\n * @anchors maType\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const e = ta.envelope(bar.close);\n * // plot(e.upper);\n * // plot(e.middle);\n * // plot(e.lower);\n */\nexport function envelope(\n slotId: string,\n source: ScalarOrSeries,\n opts?: EnvelopeOpts,\n): EnvelopeResult {\n const ctx = getCtx();\n const length = opts?.length ?? DEFAULT_LENGTH;\n const percent = opts?.percent ?? DEFAULT_PERCENT;\n const maType = opts?.maType ?? DEFAULT_MA_TYPE;\n let slot = ctx.stream.taSlots.get(slotId) as EnvelopeSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, percent, maType, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n const middleSeries = dispatchMa(slot.maType, `${slotId}/${slot.maType}`, src, slot.length);\n if (slot.outputs === null) {\n slot.outputs = Object.freeze({\n upper: makeSeriesView<number>(slot.upperBuffer),\n middle: middleSeries,\n lower: makeSeriesView<number>(slot.lowerBuffer),\n });\n }\n const mid = middleSeries.current;\n const factor = slot.percent / 100;\n let upperValue: number;\n let lowerValue: number;\n if (Number.isFinite(mid)) {\n upperValue = mid * (1 + factor);\n lowerValue = mid * (1 - factor);\n } else {\n upperValue = Number.NaN;\n lowerValue = Number.NaN;\n }\n if (ctx.isTick) {\n slot.upperBuffer.replaceHead(upperValue);\n slot.lowerBuffer.replaceHead(lowerValue);\n } else {\n slot.upperBuffer.append(upperValue);\n slot.lowerBuffer.append(lowerValue);\n }\n return slot.outputs;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/eom.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. The `length`-bar SMA over the raw EOM\n// series is inlined (rather than composed via a `ta.sma` sub-slot)\n// because each per-bar rawEom is a scalar derived from H/L/V + the\n// per-slot `prevMid` state \u2014 feeding it through SMA's `Series`-or-\n// scalar surface would be more friction than the trailing-window\n// running sum below.\n\nimport type { EomOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\n\n/**\n * Hard-coded divisor matching invinite's default\n * (`indicators/eom.ts:37` ships `divisor: 10000` as the\n * conventional choice). TV's published example uses 100 000 000 and\n * explicitly warns the divisor \"should be adjusted based on trading\n * volume\" \u2014 there is no canonical default. We pin invinite's default;\n * scripts that want a different scale can multiply the output.\n */\nconst DIVISOR = 10000;\n\ntype EomSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly shiftedViews: Map<number, Series<number>>;\n readonly length: number;\n /**\n * Closed-bar raw-EOM values across the trailing `length` bars\n * (capacity `length`). `at(0)` is the head (most recent); older\n * slots index upward.\n */\n readonly rawEomWindow: Float64RingBuffer;\n /** Running sum of `rawEomWindow` (over only the finite entries). */\n sumRawEom: number;\n /** Count of NaN entries in `rawEomWindow` \u2014 forces NaN output when > 0. */\n nanCount: number;\n /** Midpoint of the most recent closed bar (NaN before bar 0 lands). */\n prevMid: number;\n /**\n * Midpoint of the bar BEFORE the most recent close \u2014 needed so a\n * tick can recompute the head bar's rawEom against the same prevMid\n * the close-side update used. Snapshotted at the START of every\n * close-side update.\n */\n prevPrevMid: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.eom called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): EomSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n shiftedViews: new Map(),\n length,\n rawEomWindow: new Float64RingBuffer(length),\n sumRawEom: 0,\n nanCount: 0,\n prevMid: Number.NaN,\n prevPrevMid: Number.NaN,\n };\n}\n\nfunction viewForOffset(slot: EomSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction safeVol(volume: number): number {\n return Number.isFinite(volume) ? volume : 0;\n}\n\n/**\n * Per-bar raw EOM `(midpointMove) / boxRatio`. Returns NaN when the\n * range is zero (no movement, boxRatio undefined), boxRatio is zero\n * (volume-free bar), prevMid is NaN (first bar), or any input is NaN.\n */\nfunction rawEomAt(high: number, low: number, volume: number, prevMid: number): number {\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(prevMid)) {\n return Number.NaN;\n }\n const range = high - low;\n if (range === 0) return Number.NaN;\n const boxRatio = safeVol(volume) / DIVISOR / range;\n if (boxRatio === 0) return Number.NaN;\n const midpointMove = (high + low) / 2 - prevMid;\n return midpointMove / boxRatio;\n}\n\n/**\n * Emit the SMA over `rawEomWindow` once it's full AND contains no\n * NaN entries. Pre-warmup OR any NaN in the window \u2192 NaN.\n */\nfunction emit(slot: EomSlot, ready: boolean): number {\n if (!ready || slot.nanCount > 0) return Number.NaN;\n return slot.sumRawEom / slot.length;\n}\n\n/**\n * Ease of Movement \u2014 `length`-bar SMA of per-bar `(midpointMove) /\n * (boxRatio)` where `midpointMove = mid[t] \u2212 mid[t \u2212 1]` and\n * `boxRatio = (volume / divisor) / (high \u2212 low)`. Zero-range bars,\n * zero-volume bars, and any NaN input produce a NaN slot in the\n * window; the window SMA propagates NaN \u2014 any NaN in the trailing\n * `length` slots forces the output to NaN (forces a clean restart\n * after a flat / NaN bar). The hard-coded divisor matches invinite's\n * default of `10000`.\n *\n * **Tick mode.** Computes the tick's rawEom against the snapshot\n * prevMid, substitutes it for the head slot in the trailing window\n * (`hypSum = sum \u2212 headRawEom + tickRawEom`), and emits\n * `hypSum / length` if the window is full AND `hypNanCount === 0`,\n * else NaN. Does NOT mutate the closed window.\n *\n * @formula rawEom[t] = ((high[t] + low[t]) / 2 \u2212 (high[t \u2212 1] + low[t \u2212 1]) / 2)\n * / ((volume[t] / 10000) / (high[t] \u2212 low[t])) ;\n * eom[t] = SMA(rawEom, length)[t] ;\n * any NaN in the window \u2192 NaN\n * @warmup length (first defined output at bar `length`; bar 1 has the\n * first finite rawEom; the window needs `length` such values)\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts the returned series (PLAN.md \u00A79.1).\n *\n * @example\n * // import { ta, plot } from \"@invinite-org/chartlang-core\";\n * // const e = ta.eom(14);\n * // plot(e);\n */\nexport function eom(slotId: string, length: number, opts?: EomOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as EomSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const offset = opts?.offset ?? 0;\n const { high, low, volume } = ctx.stream.bar;\n\n if (ctx.isTick) {\n // Tick replay against the closed window: recompute the head\n // bar's rawEom against the SAME prevMid the close used (which\n // is the prior bar's midpoint = `prevPrevMid`), substitute it\n // for the head slot in the trailing window without mutating\n // the window. `sumRawEom` + `nanCount` already reflect the\n // post-close state; subtract the current head and add the tick's\n // rawEom. Pre-warmup ticks emit NaN.\n if (slot.rawEomWindow.length < slot.length) {\n slot.outBuffer.replaceHead(Number.NaN);\n return viewForOffset(slot, offset);\n }\n const tickRaw = rawEomAt(high, low, volume, slot.prevPrevMid);\n const headRaw = slot.rawEomWindow.at(0);\n const headWasNaN = !Number.isFinite(headRaw);\n const tickIsNaN = !Number.isFinite(tickRaw);\n const hypNan = slot.nanCount - (headWasNaN ? 1 : 0) + (tickIsNaN ? 1 : 0);\n if (hypNan > 0) {\n slot.outBuffer.replaceHead(Number.NaN);\n return viewForOffset(slot, offset);\n }\n // When we reach here `hypNan === 0`, which guarantees\n // `tickIsNaN === false` (the only way nanCount could decrement\n // is via the head being NaN and the tick being finite). The\n // `headWasNaN ? 0 : headRaw` guards against subtracting a NaN\n // headRaw when the head slot was NaN.\n const hypSum = slot.sumRawEom - (headWasNaN ? 0 : headRaw) + tickRaw;\n slot.outBuffer.replaceHead(hypSum / slot.length);\n return viewForOffset(slot, offset);\n }\n\n // Close-side: snapshot the bar-before-last's midpoint (so a tick on\n // the new head bar can recompute its rawEom against the same\n // prevMid the close used), then fold the new rawEom into the window.\n slot.prevPrevMid = slot.prevMid;\n\n const raw = rawEomAt(high, low, volume, slot.prevMid);\n const midpoint =\n Number.isFinite(high) && Number.isFinite(low) ? (high + low) / 2 : slot.prevMid;\n\n // Evict the oldest slot if the ring is full.\n if (slot.rawEomWindow.length === slot.length) {\n const oldest = slot.rawEomWindow.at(slot.length - 1);\n if (Number.isFinite(oldest)) slot.sumRawEom -= oldest;\n else slot.nanCount -= 1;\n }\n // Append the new rawEom + update sum / nanCount.\n slot.rawEomWindow.append(raw);\n if (Number.isFinite(raw)) slot.sumRawEom += raw;\n else slot.nanCount += 1;\n slot.prevMid = midpoint;\n\n const ready = slot.rawEomWindow.length === slot.length;\n slot.outBuffer.append(emit(slot, ready));\n return viewForOffset(slot, offset);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/fisher.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Composition: `ta.highest` + `ta.lowest`\n// sub-slots over `bar.hl2`; the clamp / atanh / EMA-blend recurrence\n// is inline (no registry helper expresses Fisher's bespoke \u03B1=0.66/0.67\n// blend).\n//\n// DIVERGENCE: invinite clamps `x` to \u00B10.999 before the `atanh` so the\n// transform never diverges. The task spec (\u00A76) overrides this: when\n// `|x| \u2265 1` we emit NaN at `fisher` AND hold the recurrence state\n// (`prevX` / `prevFisher` carry forward unchanged so the next bar\n// continues from the last valid state).\n\nimport type { FisherOpts, FisherResult, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { highest } from \"./highest.js\";\nimport { lowest } from \"./lowest.js\";\n\ntype FisherSlot = {\n result: FisherResult | null;\n readonly fisherBuf: Float64RingBuffer;\n readonly triggerBuf: Float64RingBuffer;\n readonly fisherSeries: Series<number>;\n readonly triggerSeries: Series<number>;\n readonly length: number;\n /** Closed-side state \u2014 last bar's contribution applied. */\n prevX: number;\n prevFisher: number;\n /** Snapshot BEFORE the most recent close-side update \u2014 used by tick replay. */\n prevClosedX: number;\n prevClosedFisher: number;\n barCount: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.fisher called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): FisherSlot {\n const fisherBuf = new Float64RingBuffer(capacity);\n const triggerBuf = new Float64RingBuffer(capacity);\n return {\n result: null,\n fisherBuf,\n triggerBuf,\n fisherSeries: makeSeriesView<number>(fisherBuf),\n triggerSeries: makeSeriesView<number>(triggerBuf),\n length,\n prevX: 0,\n prevFisher: 0,\n prevClosedX: 0,\n prevClosedFisher: 0,\n barCount: 0,\n };\n}\n\n/**\n * Compute `(fisherValue, triggerValue, nextX, nextFisher)` given the\n * normalised mid + the basis `(baseX, baseFisher)` snapshot. The\n * `triggerValue` written is the input `baseFisher` (Fisher's\n * 1-bar-lagged trigger). NaN at `fisher` propagates as a \"no-update\"\n * to `nextX` / `nextFisher` so the recurrence holds.\n */\nfunction computeStep(\n normalised: number,\n baseX: number,\n baseFisher: number,\n): { fisherValue: number; triggerValue: number; nextX: number; nextFisher: number } {\n const x = 0.66 * normalised + 0.67 * baseX;\n // Defensive: normalised \u2208 [-0.5, 0.5] means x asymptotes to \u00B11.0\n // but never crosses under exact arithmetic. Keep the clamp so a\n // pathological floating-point overshoot produces NaN rather than\n // \u00B1Infinity from `ln((1+x)/(1-x))`.\n /* c8 ignore start */\n if (Math.abs(x) >= 1) {\n return {\n fisherValue: Number.NaN,\n triggerValue: baseFisher,\n nextX: baseX,\n nextFisher: baseFisher,\n };\n }\n /* c8 ignore stop */\n const fisherValue = 0.5 * Math.log((1 + x) / (1 - x)) + 0.5 * baseFisher;\n return { fisherValue, triggerValue: baseFisher, nextX: x, nextFisher: fisherValue };\n}\n\n/**\n * John Ehlers' Fisher Transform. Normalises the rolling `bar.hl2`\n * midpoint to `[-0.5, 0.5]` over a `length`-bar window, blends with\n * the prior `x` (`0.66\u00B7norm + 0.67\u00B7prevX`), then applies the Fisher\n * z-transform `0.5\u00B7ln((1+x)/(1\u2212x))` with an EMA-style blend against\n * the prior Fisher. Composes `ta.highest` + `ta.lowest` sub-slots over\n * `bar.hl2` (`${slotId}/midHigh` + `${slotId}/midLow`). The clamp /\n * atanh / blend recurrence stays inline (no registry equivalent).\n *\n * The `trigger` output is the prior bar's `fisher` value (1-bar lag);\n * bar 0's `trigger` is NaN. When the recurrence would drive `|x| \u2265 1`\n * (pathological case), emits NaN at `fisher` and holds the recurrence\n * state \u2014 diverges from invinite's \u00B10.999 clamp per task spec.\n *\n * @formula mid = (bar.high + bar.low) / 2 ;\n * normalised = flatRange ? 0 : (mid \u2212 ll) / (hh \u2212 ll) \u2212 0.5\n * where hh = highest(mid, length), ll = lowest(mid, length) ;\n * x = 0.66 \u00B7 normalised + 0.67 \u00B7 prevX ;\n * NaN at fisher if |x| \u2265 1 (recurrence held) ;\n * fisher = 0.5 \u00B7 ln((1 + x) / (1 \u2212 x)) + 0.5 \u00B7 prevFisher ;\n * trigger[t] = prevFisher (the value of fisher before this close)\n * @warmup length (first defined `fisher` at bar `length - 1`; first defined `trigger` at bar `length`)\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const f = ta.fisher(\"slot\", 9);\n * // plot(f.fisher); plot(f.trigger);\n */\nexport function fisher(slotId: string, length: number, _opts?: FisherOpts): FisherResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as FisherSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n\n const mid = ctx.stream.bar.hl2;\n const hhSeries = highest(`${slotId}/midHigh`, mid, length);\n const llSeries = lowest(`${slotId}/midLow`, mid, length);\n const hh = hhSeries.current;\n const ll = llSeries.current;\n\n let normalised: number;\n if (!Number.isFinite(mid) || !Number.isFinite(hh) || !Number.isFinite(ll)) {\n normalised = Number.NaN;\n } else if (hh === ll) {\n normalised = 0;\n } else {\n normalised = (mid - ll) / (hh - ll) - 0.5;\n }\n\n if (ctx.isTick) {\n // Replay against the prevClosed* snapshot \u2014 the closed-side\n // (prevX, prevFisher) are unchanged by the tick.\n const step = Number.isFinite(normalised)\n ? computeStep(normalised, slot.prevClosedX, slot.prevClosedFisher)\n : {\n fisherValue: Number.NaN,\n triggerValue: slot.prevClosedFisher,\n nextX: slot.prevClosedX,\n nextFisher: slot.prevClosedFisher,\n };\n // First-bar trigger is NaN (no prior fisher) \u2014 barCount captures\n // the closed-side advances. Defensive: ticks always follow at\n // least one close, so barCount > 0 on this branch.\n const triggerOut =\n /* c8 ignore next */ slot.barCount === 0 ? Number.NaN : step.triggerValue;\n slot.fisherBuf.replaceHead(step.fisherValue);\n slot.triggerBuf.replaceHead(triggerOut);\n } else {\n // Close-side. Snapshot the closed state BEFORE the update so the\n // next tick can replay against (prevClosedX, prevClosedFisher).\n slot.prevClosedX = slot.prevX;\n slot.prevClosedFisher = slot.prevFisher;\n const step = Number.isFinite(normalised)\n ? computeStep(normalised, slot.prevX, slot.prevFisher)\n : {\n fisherValue: Number.NaN,\n triggerValue: slot.prevFisher,\n nextX: slot.prevX,\n nextFisher: slot.prevFisher,\n };\n const triggerOut = slot.barCount === 0 ? Number.NaN : step.triggerValue;\n slot.fisherBuf.append(step.fisherValue);\n slot.triggerBuf.append(triggerOut);\n slot.prevX = step.nextX;\n slot.prevFisher = step.nextFisher;\n slot.barCount += 1;\n }\n\n if (slot.result === null) {\n slot.result = Object.freeze({\n fisher: slot.fisherSeries,\n trigger: slot.triggerSeries,\n });\n }\n return slot.result;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// Ported from ../invinite/src/components/trading-chart/indicators/fixed-range-volume-profile.ts\n// @ 3234c8c0c3f9880d9d1e3a3ee63ebd55ddd535f4.\n// Translated, not transcribed \u2014 Series<T> shape, opts.offset, JSDoc.\n// See packages/runtime/src/ta/CLAUDE.md for the port convention.\n\nimport type {\n FixedRangeVolumeProfileOpts,\n FixedRangeVolumeProfileResult,\n} from \"@invinite-org/chartlang-core\";\n\nimport { pushDiagnostic } from \"../emit/index.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport {\n type VolumeProfileBar,\n type VolumeProfileCore,\n type VolumeProfileSnapshot,\n commitVolumeProfileSnapshot,\n createVolumeProfileCore,\n emitVolumeProfileHistogram,\n emptyVolumeProfileSnapshot,\n resolveVolumeProfileSnapshot,\n volumeProfileConfigFromOpts,\n} from \"./lib/volume-profile/index.js\";\n\ntype FixedRangeVolumeProfileSlot = VolumeProfileCore & {\n frozen: VolumeProfileSnapshot | null;\n readonly result: FixedRangeVolumeProfileResult;\n readonly shiftedResults: Map<number, FixedRangeVolumeProfileResult>;\n};\n\ntype MutableFixedRangeVolumeProfileSlot = Omit<FixedRangeVolumeProfileSlot, \"result\"> & {\n result: FixedRangeVolumeProfileResult;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.fixedRangeVolumeProfile called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): FixedRangeVolumeProfileSlot {\n const core = createVolumeProfileCore(capacity);\n const slot: MutableFixedRangeVolumeProfileSlot = {\n ...core,\n frozen: null,\n result: Object.freeze({\n get buckets() {\n return slot.buckets;\n },\n poc: makeSeriesView<number>(core.pocBuffer),\n valHigh: makeSeriesView<number>(core.valHighBuffer),\n valLow: makeSeriesView<number>(core.valLowBuffer),\n }),\n shiftedResults: new Map(),\n };\n return slot;\n}\n\nfunction resultForOffset(\n slot: FixedRangeVolumeProfileSlot,\n offset: number,\n): FixedRangeVolumeProfileResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n get buckets() {\n return slot.buckets;\n },\n poc: makeShiftedSeriesView<number>(slot.pocBuffer, offset),\n valHigh: makeShiftedSeriesView<number>(slot.valHighBuffer, offset),\n valLow: makeShiftedSeriesView<number>(slot.valLowBuffer, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\nfunction collectBars(\n ctx: RuntimeContext,\n from: number,\n to: number,\n): ReadonlyArray<VolumeProfileBar> {\n const { ohlcv } = ctx.stream;\n const bars: VolumeProfileBar[] = [];\n for (let lookback = ohlcv.close.length - 1; lookback >= 0; lookback -= 1) {\n const time = ohlcv.time.at(lookback);\n if (time < from || time > to) continue;\n bars.push({\n close: ohlcv.close.at(lookback),\n high: ohlcv.high.at(lookback),\n low: ohlcv.low.at(lookback),\n open: ohlcv.open.at(lookback),\n time,\n volume: ohlcv.volume.at(lookback),\n });\n }\n return bars;\n}\n\nfunction diagnoseInvertedRange(ctx: RuntimeContext, slotId: string): void {\n const key = `fixed-range-inverted|${slotId}`;\n if (ctx.diagnosedRequestKeys.has(key)) return;\n ctx.diagnosedRequestKeys.add(key);\n pushDiagnostic(ctx.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"fixed-range-inverted\",\n message: \"ta.fixedRangeVolumeProfile requires opts.from <= opts.to.\",\n slotId,\n bar: ctx.barIndex(),\n });\n}\n\n/**\n * Fixed-Range Volume Profile \u2014 bucketizes volume between two\n * user-picked time anchors, inclusive on both ends.\n *\n * Bars before `opts.from` emit NaN. Bars after `opts.to` reuse the\n * frozen profile captured at the `to` bar. If `opts.from > opts.to`,\n * the primitive emits one `fixed-range-inverted` diagnostic per slot\n * and returns NaN series values.\n *\n * @formula Port of invinite fixed-range-vp: collect candles in the\n * fixed `[from, to]` window, bucket volume by price, then\n * derive POC / value-area high / value-area low through the\n * shared volume-profile pipeline.\n * @anchors `opts.from: Time` and `opts.to: Time`, typically supplied\n * by two `input.time(..., { pickFromChart: true })` inputs.\n * @warmup NaN before `opts.from`; a degenerate `from === to`\n * one-bar window can emit on the anchor bar when it has\n * finite positive volume.\n * @since 0.5\n * @stable\n * @example\n * // import { input, plot, ta } from \"@invinite-org/chartlang-core\";\n * // const from = input.time(0, { pickFromChart: true, title: \"From\" });\n * // const to = input.time(0, { pickFromChart: true, title: \"To\" });\n * // const vp = ta.fixedRangeVolumeProfile({ from: from.value, to: to.value });\n * // plot(vp.poc, { style: { kind: \"horizontal-histogram\", buckets: vp.buckets } });\n */\nexport function fixedRangeVolumeProfile(\n slotId: string,\n opts: FixedRangeVolumeProfileOpts,\n): FixedRangeVolumeProfileResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as FixedRangeVolumeProfileSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n\n let snapshot: VolumeProfileSnapshot = emptyVolumeProfileSnapshot();\n if (opts.from > opts.to) {\n diagnoseInvertedRange(ctx, slotId);\n slot.frozen = null;\n } else if (ctx.stream.bar.time < opts.from) {\n slot.frozen = null;\n } else if (ctx.stream.bar.time > opts.to && slot.frozen !== null) {\n snapshot = slot.frozen;\n } else {\n snapshot = resolveVolumeProfileSnapshot({\n bars: collectBars(ctx, opts.from, opts.to),\n bucketColor: opts.bucketColor,\n config: volumeProfileConfigFromOpts(opts),\n });\n if (ctx.stream.bar.time >= opts.to) slot.frozen = snapshot;\n }\n\n commitVolumeProfileSnapshot(slot, ctx.isTick, snapshot);\n emitVolumeProfileHistogram(\n ctx,\n slotId,\n \"Fixed Range Volume Profile\",\n snapshot.poc,\n snapshot.buckets,\n );\n return resultForOffset(slot, opts.offset ?? 0);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/historical-volatility.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. The rolling log-returns window is folded\n// incrementally per bar (one append per close, one head-replace per\n// tick) rather than invinite's full-array recompute. The Phase-1\n// `lib/rollingStddev` helper is the full-recompute reference the\n// property test asserts against.\n\nimport type { HvOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_ANNUALISATION_FACTOR = 365;\n\ntype HvSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n readonly annualisationFactor: number;\n readonly logReturnsWindow: Float64RingBuffer;\n sumX: number;\n sumX2: number;\n /** Last closed source value (basis of next bar's log-return). */\n prevSrc: number;\n /** Per-offset Series-view cache; see `sma.ts` for the convention. */\n readonly shiftedViews: Map<number, Series<number>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.historicalVolatility called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, annualisationFactor: number, capacity: number): HvSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n annualisationFactor,\n logReturnsWindow: new Float64RingBuffer(length),\n sumX: 0,\n sumX2: 0,\n prevSrc: Number.NaN,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: HvSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction logReturn(prev: number, cur: number): number {\n if (!Number.isFinite(prev) || !Number.isFinite(cur) || prev <= 0 || cur <= 0) {\n return Number.NaN;\n }\n return Math.log(cur / prev);\n}\n\nfunction windowStdDev(window: Float64RingBuffer, sumX: number, sumX2: number): number {\n const n = window.length;\n // Defensive: callers gate on `length === capacity` so n > 0 here.\n /* c8 ignore next */\n if (n <= 0) return Number.NaN;\n const mean = sumX / n;\n const variance = sumX2 / n - mean * mean;\n return Math.sqrt(Math.max(0, variance));\n}\n\n/**\n * Recompute the window-sums by walking the buffer. Called when a NaN\n * has been folded into the running sums (which would otherwise poison\n * every subsequent recompute) \u2014 restores the running invariant from\n * the live window contents. O(length) but only runs when needed.\n */\nfunction recomputeSums(slot: HvSlot): void {\n let sumX = 0;\n let sumX2 = 0;\n let anyNaN = false;\n for (let i = 0; i < slot.logReturnsWindow.length; i += 1) {\n const v = slot.logReturnsWindow.at(slot.logReturnsWindow.length - 1 - i);\n if (!Number.isFinite(v)) {\n anyNaN = true;\n break;\n }\n sumX += v;\n sumX2 += v * v;\n }\n if (anyNaN) {\n slot.sumX = Number.NaN;\n slot.sumX2 = Number.NaN;\n } else {\n slot.sumX = sumX;\n slot.sumX2 = sumX2;\n }\n}\n\nfunction closeValue(slot: HvSlot, src: number): number {\n const lr = logReturn(slot.prevSrc, src);\n if (slot.logReturnsWindow.length < slot.logReturnsWindow.capacity) {\n slot.logReturnsWindow.append(lr);\n if (Number.isFinite(lr)) {\n slot.sumX += lr;\n slot.sumX2 += lr * lr;\n } else {\n slot.sumX = Number.NaN;\n slot.sumX2 = Number.NaN;\n }\n slot.prevSrc = src;\n return Number.NaN;\n }\n const outgoing = slot.logReturnsWindow.at(slot.logReturnsWindow.length - 1);\n slot.logReturnsWindow.append(lr);\n if (!Number.isFinite(lr)) {\n slot.sumX = Number.NaN;\n slot.sumX2 = Number.NaN;\n } else if (\n !Number.isFinite(slot.sumX) ||\n /* c8 ignore next */\n !Number.isFinite(outgoing)\n ) {\n // A previous NaN poisoned the running sums; rebuild from the\n // live window. NaN inside short-circuits to NaN. The\n // `!Number.isFinite(outgoing)` half of the OR is defensive \u2014\n // outgoing comes from the live window head and is only NaN\n // when a NaN was previously appended, which also poisoned\n // `sumX` (covered by the first half of the OR).\n recomputeSums(slot);\n } else {\n slot.sumX = slot.sumX - outgoing + lr;\n slot.sumX2 = slot.sumX2 - outgoing * outgoing + lr * lr;\n }\n slot.prevSrc = src;\n if (!Number.isFinite(slot.sumX)) return Number.NaN;\n const sd = windowStdDev(slot.logReturnsWindow, slot.sumX, slot.sumX2);\n return sd * Math.sqrt(slot.annualisationFactor) * 100;\n}\n\nfunction tickValue(slot: HvSlot, src: number): number {\n if (slot.logReturnsWindow.length < slot.logReturnsWindow.capacity) return Number.NaN;\n const lr = logReturn(slot.prevSrc, src);\n if (!Number.isFinite(lr) || !Number.isFinite(slot.sumX)) return Number.NaN;\n const oldestInHead = slot.logReturnsWindow.at(0);\n // Defensive: the close-side advance appends a finite lr (otherwise\n // sumX is poisoned and we returned at the guard above). The window\n // head can only be NaN if a prior NaN was appended, which is\n // already covered by the sumX guard.\n /* c8 ignore next */\n if (!Number.isFinite(oldestInHead)) return Number.NaN;\n const sumX = slot.sumX - oldestInHead + lr;\n const sumX2 = slot.sumX2 - oldestInHead * oldestInHead + lr * lr;\n const n = slot.logReturnsWindow.length;\n const mean = sumX / n;\n const variance = sumX2 / n - mean * mean;\n return Math.sqrt(Math.max(0, variance)) * Math.sqrt(slot.annualisationFactor) * 100;\n}\n\n/**\n * Historical Volatility \u2014 sub-pane line. Standard deviation of log\n * returns annualised + percent-scaled. Use `annualisationFactor: 365`\n * for crypto / 24-7 series (the default), `252` for trading-day\n * equity series. NaN through warmup (`[0, length \u2212 1]`) \u2014 the first\n * log return lands at bar 1 and the window needs `length` of them.\n * NaN inputs (\u2264 0 or non-finite source) yield NaN log-returns; any\n * NaN inside the window short-circuits the output to NaN.\n *\n * @formula lr[t] = ln(src[t] / src[t \u2212 1]) ;\n * hv[t] = stddev(lr[t \u2212 length + 1..= t]) \u00B7 sqrt(annualisationFactor) \u00B7 100\n * @warmup length\n * @anchors annualisationFactor\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts the returned series so `series.current` reads\n * the value `offset` bars ago (PLAN.md \u00A79.1).\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const hv = ta.historicalVolatility(bar.close, 10);\n * // plot(hv);\n */\nexport function historicalVolatility(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: HvOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as HvSlot | undefined;\n if (slot === undefined) {\n const annualisationFactor = opts?.annualisationFactor ?? DEFAULT_ANNUALISATION_FACTOR;\n slot = initSlot(length, annualisationFactor, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src));\n } else {\n slot.outBuffer.append(closeValue(slot, src));\n }\n return viewForOffset(slot, opts?.offset ?? 0);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/hma.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. The HMA primitive composes three WMA sub-\n// slots derived from the parent slot id.\n\nimport type { HmaOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\nimport { wma } from \"./wma.js\";\n\ntype HmaSlot = {\n readonly series: Series<number>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.hma called outside an active script step\");\n }\n return ctx;\n}\n\n/**\n * Hull moving average \u2014 `WMA(2\u00B7WMA(src, N/2) \u2212 WMA(src, N), sqrt(N))`.\n * Composes three WMA sub-slots derived from the parent slot id\n * (`${slotId}/half`, `${slotId}/full`, `${slotId}/final`). The intermediate\n * `diff = 2\u00B7halfWMA \u2212 fullWMA` is a scalar passed into the final WMA;\n * no separate primitive owns the diff stream. Warmup is the full chain:\n * `length + ceil(sqrt(length)) \u2212 2`. Tick-mode propagates through every\n * sub-slot's replace-head branch.\n *\n * @formula halfLen = floor(length / 2) ;\n * sqrtLen = round(sqrt(length)) ;\n * half = WMA(source, halfLen) ;\n * full = WMA(source, length) ;\n * diff = 2 \u00B7 half \u2212 full ;\n * out = WMA(diff, sqrtLen)\n * @warmup length + ceil(sqrt(length)) \u2212 2\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const h = ta.hma(bar.close, 21);\n * // plot(h);\n */\nexport function hma(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: HmaOpts,\n): Series<number> {\n const ctx = getCtx();\n const halfLen = Math.max(1, Math.floor(length / 2));\n const sqrtLen = Math.max(1, Math.round(Math.sqrt(length)));\n const src = readSourceValue(source);\n const halfSeries = wma(`${slotId}/half`, src, halfLen);\n const fullSeries = wma(`${slotId}/full`, src, length);\n const ha = halfSeries.current;\n const fa = fullSeries.current;\n const diff = Number.isFinite(ha) && Number.isFinite(fa) ? 2 * ha - fa : Number.NaN;\n const finalSeries = wma(`${slotId}/final`, diff, sqrtLen);\n\n let slot = ctx.stream.taSlots.get(slotId) as HmaSlot | undefined;\n if (slot === undefined) {\n slot = { series: finalSeries };\n ctx.stream.taSlots.set(slotId, slot);\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/ichimoku.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Ichimoku composes six `ta.highest` / `ta.lowest`\n// sub-slots (one pair each for Tenkan / Kijun / Senkou B) \u2014 the same\n// composition seam `donchian.ts` uses \u2014 so a fix to highest/lowest\n// flows in for free. The forward-displaced Senkou A / Senkou B and\n// backward-displaced Chikou are produced via per-slot delay ring\n// buffers of capacity `displacement + 1`.\n\nimport type { IchimokuOpts, IchimokuResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { highest } from \"./highest.js\";\nimport { lowest } from \"./lowest.js\";\n\nconst DEFAULT_CONVERSION_LENGTH = 9;\nconst DEFAULT_BASE_LENGTH = 26;\nconst DEFAULT_LEADING_SPAN_B_LENGTH = 52;\nconst DEFAULT_DISPLACEMENT = 26;\n\ntype IchimokuSlot = {\n readonly outputs: IchimokuResult;\n readonly tenkanBuffer: Float64RingBuffer;\n readonly kijunBuffer: Float64RingBuffer;\n readonly senkouABuffer: Float64RingBuffer;\n readonly senkouBBuffer: Float64RingBuffer;\n readonly chikouBuffer: Float64RingBuffer;\n readonly conversionLength: number;\n readonly baseLength: number;\n readonly leadingSpanBLength: number;\n readonly displacement: number;\n /** Forward-shift delay for senkouA: capacity `displacement + 1`.\n * At each close we append the new `senkouARaw`; `at(displacement)`\n * gives the value from `displacement` closes ago \u2014 exactly the\n * value we emit for `senkouA[t]`. */\n readonly senkouADelay: Float64RingBuffer;\n readonly senkouBDelay: Float64RingBuffer;\n /** Backward-shift delay for chikou: capacity `displacement + 1`.\n * `chikou[t] = close[t \u2212 displacement]` \u2014 at each close we append\n * the new close; `at(displacement)` gives the value from\n * `displacement` closes ago. */\n readonly closeDelay: Float64RingBuffer;\n readonly shiftedResults: Map<number, IchimokuResult>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.ichimoku called outside an active script step\");\n }\n return ctx;\n}\n\nfunction midpoint(hi: number, lo: number): number {\n if (!Number.isFinite(hi) || !Number.isFinite(lo)) return Number.NaN;\n return (hi + lo) / 2;\n}\n\nfunction spanAverage(a: number, b: number): number {\n if (!Number.isFinite(a) || !Number.isFinite(b)) return Number.NaN;\n return (a + b) / 2;\n}\n\nfunction delayedValue(delay: Float64RingBuffer, displacement: number): number {\n if (delay.length <= displacement) return Number.NaN;\n return delay.at(displacement);\n}\n\nfunction initSlot(\n capacity: number,\n conversionLength: number,\n baseLength: number,\n leadingSpanBLength: number,\n displacement: number,\n): IchimokuSlot {\n const tenkanBuffer = new Float64RingBuffer(capacity);\n const kijunBuffer = new Float64RingBuffer(capacity);\n const senkouABuffer = new Float64RingBuffer(capacity);\n const senkouBBuffer = new Float64RingBuffer(capacity);\n const chikouBuffer = new Float64RingBuffer(capacity);\n // The delay ring buffers need only `displacement + 1` slots \u2014 at\n // each close we append the new raw value; `at(displacement)`\n // returns the value from `displacement` closes ago.\n const delayCap = displacement + 1;\n return {\n outputs: Object.freeze({\n tenkan: makeSeriesView<number>(tenkanBuffer),\n kijun: makeSeriesView<number>(kijunBuffer),\n senkouA: makeSeriesView<number>(senkouABuffer),\n senkouB: makeSeriesView<number>(senkouBBuffer),\n chikou: makeSeriesView<number>(chikouBuffer),\n }),\n tenkanBuffer,\n kijunBuffer,\n senkouABuffer,\n senkouBBuffer,\n chikouBuffer,\n conversionLength,\n baseLength,\n leadingSpanBLength,\n displacement,\n senkouADelay: new Float64RingBuffer(delayCap),\n senkouBDelay: new Float64RingBuffer(delayCap),\n closeDelay: new Float64RingBuffer(delayCap),\n shiftedResults: new Map(),\n };\n}\n\nfunction resultForOffset(slot: IchimokuSlot, offset: number): IchimokuResult {\n if (offset === 0) return slot.outputs;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n tenkan: makeShiftedSeriesView<number>(slot.tenkanBuffer, offset),\n kijun: makeShiftedSeriesView<number>(slot.kijunBuffer, offset),\n senkouA: makeShiftedSeriesView<number>(slot.senkouABuffer, offset),\n senkouB: makeShiftedSeriesView<number>(slot.senkouBBuffer, offset),\n chikou: makeShiftedSeriesView<number>(slot.chikouBuffer, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\n/**\n * Ichimoku Cloud \u2014 five-line trend / cloud overlay. Composes six\n * `ta.highest` / `ta.lowest` sub-slots (Tenkan high+low, Kijun\n * high+low, Senkou B high+low) \u2014 the same composition seam\n * `ta.donchian` uses \u2014 so a fix to either rolling-extreme primitive\n * flows in for free. Forward-displaced Senkou A / Senkou B and\n * backward-displaced Chikou are produced via per-slot delay ring\n * buffers of capacity `displacement + 1`.\n *\n * `chikou.current` returns `close[t \u2212 displacement]` (the close from\n * `displacement` bars ago, plotted at today's position \u2014 the\n * lagging-span semantic). Renderer-side, the script author may\n * choose to draw it at the visually-offset position; the runtime\n * exposes the backward-shifted value so script-author conditionals\n * (cross / alert) see meaningful data.\n *\n * @formula tenkan[t] = (highest(high, conversionLength) + lowest(low, conversionLength)) / 2 ;\n * kijun[t] = (highest(high, baseLength) + lowest(low, baseLength)) / 2 ;\n * senkouARaw = (tenkan + kijun) / 2 ;\n * senkouBRaw = (highest(high, leadingSpanBLength) + lowest(low, leadingSpanBLength)) / 2 ;\n * senkouA[t] = senkouARaw[t \u2212 displacement] ;\n * senkouB[t] = senkouBRaw[t \u2212 displacement] ;\n * chikou[t] = close[t \u2212 displacement]\n * @anchors displacement, conversionLength, baseLength, leadingSpanBLength\n * @warmup max(conversionLength, baseLength, leadingSpanBLength) + displacement \u2212 1\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts all five outputs in lockstep (PLAN.md \u00A79.1).\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const i = ta.ichimoku(\"slot\");\n * // plot(i.tenkan);\n * // plot(i.kijun);\n * // plot(i.senkouA);\n * // plot(i.senkouB);\n * // plot(i.chikou);\n */\nexport function ichimoku(slotId: string, opts?: IchimokuOpts): IchimokuResult {\n const ctx = getCtx();\n const conversionLength = opts?.conversionLength ?? DEFAULT_CONVERSION_LENGTH;\n const baseLength = opts?.baseLength ?? DEFAULT_BASE_LENGTH;\n const leadingSpanBLength = opts?.leadingSpanBLength ?? DEFAULT_LEADING_SPAN_B_LENGTH;\n const displacement = opts?.displacement ?? DEFAULT_DISPLACEMENT;\n const offset = opts?.offset ?? 0;\n const bar = ctx.stream.bar;\n\n let slot = ctx.stream.taSlots.get(slotId) as IchimokuSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(\n ctx.stream.ohlcv.close.capacity,\n conversionLength,\n baseLength,\n leadingSpanBLength,\n displacement,\n );\n ctx.stream.taSlots.set(slotId, slot);\n }\n\n // Compose: rolling extremes via the registered ta.highest /\n // ta.lowest sub-slots. Each composed call advances the sub-slot on\n // the same close (or replaces its head on the same tick).\n const tenkanHi = highest(`${slotId}/tenkanHigh`, bar.high, conversionLength).current;\n const tenkanLo = lowest(`${slotId}/tenkanLow`, bar.low, conversionLength).current;\n const kijunHi = highest(`${slotId}/kijunHigh`, bar.high, baseLength).current;\n const kijunLo = lowest(`${slotId}/kijunLow`, bar.low, baseLength).current;\n const senkouBHi = highest(`${slotId}/senkouBHigh`, bar.high, leadingSpanBLength).current;\n const senkouBLo = lowest(`${slotId}/senkouBLow`, bar.low, leadingSpanBLength).current;\n\n const tenkan = midpoint(tenkanHi, tenkanLo);\n const kijun = midpoint(kijunHi, kijunLo);\n const senkouBRaw = midpoint(senkouBHi, senkouBLo);\n const senkouARaw = spanAverage(tenkan, kijun);\n\n if (ctx.isTick) {\n // Replace the head of the delay buffers with the tick's\n // updated raw values. `at(displacement)` then returns the\n // SAME value as before (the displacement-shifted slot is not\n // affected by the head's value), so the displaced output\n // heads are stable on tick.\n slot.senkouADelay.replaceHead(senkouARaw);\n slot.senkouBDelay.replaceHead(senkouBRaw);\n slot.closeDelay.replaceHead(bar.close);\n slot.tenkanBuffer.replaceHead(tenkan);\n slot.kijunBuffer.replaceHead(kijun);\n slot.senkouABuffer.replaceHead(delayedValue(slot.senkouADelay, displacement));\n slot.senkouBBuffer.replaceHead(delayedValue(slot.senkouBDelay, displacement));\n slot.chikouBuffer.replaceHead(delayedValue(slot.closeDelay, displacement));\n } else {\n slot.senkouADelay.append(senkouARaw);\n slot.senkouBDelay.append(senkouBRaw);\n slot.closeDelay.append(bar.close);\n slot.tenkanBuffer.append(tenkan);\n slot.kijunBuffer.append(kijun);\n slot.senkouABuffer.append(delayedValue(slot.senkouADelay, displacement));\n slot.senkouBBuffer.append(delayedValue(slot.senkouBDelay, displacement));\n slot.chikouBuffer.append(delayedValue(slot.closeDelay, displacement));\n }\n\n return resultForOffset(slot, offset);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/kama.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape.\n\nimport type { KamaOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_LENGTH = 10;\nconst DEFAULT_FAST = 2;\nconst DEFAULT_SLOW = 30;\n\ntype KamaSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n readonly fastAlpha: number;\n readonly slowAlpha: number;\n /** Trailing `length + 1` source values; `at(0)` is head, `at(length)` is oldest. */\n readonly sourceWindow: Float64RingBuffer;\n prevKama: number;\n prevClosedKama: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.kama called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(\n length: number,\n fastLength: number,\n slowLength: number,\n capacity: number,\n): KamaSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n fastAlpha: 2 / (fastLength + 1),\n slowAlpha: 2 / (slowLength + 1),\n sourceWindow: new Float64RingBuffer(length + 1),\n prevKama: Number.NaN,\n prevClosedKama: Number.NaN,\n };\n}\n\n/**\n * Compute the next KAMA value given the slot's current window state,\n * `headSrc` (the source value to evaluate at age 0 \u2014 may be the\n * just-appended close or a tick replacement), and `prev` (the prior\n * KAMA \u2014 either `prevClosedKama` on close or `prevClosedKama` on\n * tick; tick recomputes from the closed prior). Returns NaN until the\n * window holds `length + 1` finite samples.\n */\nfunction computeKama(slot: KamaSlot, headSrc: number, prev: number): number {\n if (slot.sourceWindow.length < slot.length + 1) return Number.NaN;\n if (!Number.isFinite(headSrc)) return prev;\n\n const oldest = slot.sourceWindow.at(slot.length);\n if (!Number.isFinite(oldest)) return prev;\n\n const change = Math.abs(headSrc - oldest);\n\n let volatility = 0;\n // Per-bar absolute diffs across the trailing `length` pairs:\n // |w[0] \u2212 w[1]| + |w[1] \u2212 w[2]| + \u2026 + |w[length-1] \u2212 w[length]|\n // with w[0] substituted by `headSrc` so tick replays work\n // without mutating the closed window.\n {\n const next = headSrc;\n const prior = slot.sourceWindow.at(1);\n if (!Number.isFinite(prior)) return prev;\n volatility += Math.abs(next - prior);\n }\n for (let j = 1; j < slot.length; j += 1) {\n const next = slot.sourceWindow.at(j);\n const prior = slot.sourceWindow.at(j + 1);\n if (!Number.isFinite(next) || !Number.isFinite(prior)) return prev;\n volatility += Math.abs(next - prior);\n }\n\n const er = volatility > 0 ? change / volatility : 0;\n const sc = (er * (slot.fastAlpha - slot.slowAlpha) + slot.slowAlpha) ** 2;\n\n // Seed at the warmup boundary with the source value itself\n // (matches invinite's convention + standard Pine `ta.kama`).\n if (!Number.isFinite(prev)) return headSrc;\n return prev + sc * (headSrc - prev);\n}\n\n/**\n * Kaufman's Adaptive Moving Average \u2014 an EMA-like recurrence whose\n * smoothing constant adapts to market efficiency. The \"efficiency\n * ratio\" is the directional change over the last `length` bars\n * divided by the total path-length over the same window; high\n * efficiency (trending) \u2192 smoothing approaches `fastAlpha`,\n * low efficiency (chop) \u2192 smoothing approaches `slowAlpha`.\n * Defaults: `length = 10`, `fastLength = 2`, `slowLength = 30`.\n *\n * NaN handling: mid-stream NaN source \u2192 KAMA carries the prior value\n * forward (matches the EMA / SMMA recurrence convention). Zero-\n * volatility window \u2192 `er = 0`, smoothing degenerates to `slowAlpha\u00B2`\n * but no change occurs because `src \u2212 prev` is itself 0 in the\n * constant-source regime.\n *\n * @formula fastAlpha = 2 / (fastLength + 1) ;\n * slowAlpha = 2 / (slowLength + 1) ;\n * change = |src[t] \u2212 src[t \u2212 length]| ;\n * vol = \u03A3_{j=0..length-1} |src[t \u2212 j] \u2212 src[t \u2212 j \u2212 1]| ;\n * er = vol > 0 ? change / vol : 0 ;\n * sc = (er \u00B7 (fastAlpha \u2212 slowAlpha) + slowAlpha)\u00B2 ;\n * KAMA[t] = KAMA[t \u2212 1] + sc \u00B7 (src[t] \u2212 KAMA[t \u2212 1])\n * @warmup length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const k = ta.kama(bar.close, { length: 10, fastLength: 2, slowLength: 30 });\n * // plot(k);\n */\nexport function kama(slotId: string, source: ScalarOrSeries, opts?: KamaOpts): Series<number> {\n const ctx = getCtx();\n const length = opts?.length ?? DEFAULT_LENGTH;\n const fastLength = opts?.fastLength ?? DEFAULT_FAST;\n const slowLength = opts?.slowLength ?? DEFAULT_SLOW;\n let slot = ctx.stream.taSlots.get(slotId) as KamaSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, fastLength, slowLength, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n // Tick replays the head off the existing closed window with\n // `src` substituted at age 0; `prevClosedKama` is the recurrence\n // anchor (the prior CLOSED bar's KAMA).\n const value = computeKama(slot, src, slot.prevClosedKama);\n slot.prevKama = Number.isFinite(value) ? value : slot.prevClosedKama;\n slot.outBuffer.replaceHead(value);\n } else {\n slot.sourceWindow.append(src);\n const value = computeKama(slot, src, slot.prevClosedKama);\n slot.prevClosedKama = Number.isFinite(value) ? value : slot.prevClosedKama;\n slot.prevKama = slot.prevClosedKama;\n slot.outBuffer.append(value);\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/keltner.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Keltner composes the registered MA primitive\n// (sma / ema / wma / smma) via sub-slot `${slotId}/<maType>` over\n// `bar.close` for the middle band, and `ta.atr` via sub-slot\n// `${slotId}/atr` for the band offset \u2014 so fixes to either flow in\n// for free (mirrors maRibbon / donchian composition convention).\n\nimport type {\n KeltnerOpts,\n KeltnerResult,\n MaTypeNoVolume,\n Series,\n} from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { atr } from \"./atr.js\";\nimport { ema } from \"./ema.js\";\nimport { sma } from \"./sma.js\";\nimport { smma } from \"./smma.js\";\nimport { wma } from \"./wma.js\";\n\nconst DEFAULT_LENGTH = 20;\nconst DEFAULT_MULTIPLIER = 2;\nconst DEFAULT_MA_TYPE: MaTypeNoVolume = \"ema\";\n\ntype KeltnerSlot = {\n readonly upperBuffer: Float64RingBuffer;\n readonly lowerBuffer: Float64RingBuffer;\n readonly length: number;\n readonly multiplier: number;\n readonly maType: MaTypeNoVolume;\n outputs: KeltnerResult | null;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.keltner called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(\n length: number,\n multiplier: number,\n maType: MaTypeNoVolume,\n capacity: number,\n): KeltnerSlot {\n return {\n upperBuffer: new Float64RingBuffer(capacity),\n lowerBuffer: new Float64RingBuffer(capacity),\n length,\n multiplier,\n maType,\n outputs: null,\n };\n}\n\nfunction dispatchMa(\n maType: MaTypeNoVolume,\n subSlotId: string,\n source: number,\n length: number,\n): Series<number> {\n switch (maType) {\n case \"sma\":\n return sma(subSlotId, source, length);\n case \"ema\":\n return ema(subSlotId, source, length);\n case \"wma\":\n return wma(subSlotId, source, length);\n case \"smma\":\n return smma(subSlotId, source, length);\n }\n}\n\n/**\n * Keltner Channels \u2014 overlay volatility envelope. Middle band is an\n * `maType` MA of `bar.close` over `length`; upper / lower bands sit\n * `multiplier \u00B7 ATR(length)` above / below the middle. Defaults\n * `length = 20`, `multiplier = 2`, `maType = \"ema\"` (Linda Raschke /\n * TradingView canonical form \u2014 Chester Keltner's original used a\n * different \"typical range\" formulation; every modern reference\n * defaults to EMA + Wilder ATR). Composes the registered MA primitive\n * via sub-slot `${slotId}/<maType>` and `ta.atr` via sub-slot\n * `${slotId}/atr` \u2014 fixes to either flow in for free. Returns a\n * cached `{ upper, middle, lower }` record (same identity every bar).\n * NaN across all outputs while the trailing window is unwarmed.\n *\n * @formula middle = MA(close, length, maType) ;\n * upper = middle + multiplier \u00B7 atr(length) ;\n * lower = middle \u2212 multiplier \u00B7 atr(length)\n * @warmup length\n * @anchors maType\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const k = ta.keltner({ length: 20, multiplier: 2 });\n * // plot(k.upper);\n * // plot(k.middle);\n * // plot(k.lower);\n */\nexport function keltner(slotId: string, opts?: KeltnerOpts): KeltnerResult {\n const ctx = getCtx();\n const length = opts?.length ?? DEFAULT_LENGTH;\n const multiplier = opts?.multiplier ?? DEFAULT_MULTIPLIER;\n const maType = opts?.maType ?? DEFAULT_MA_TYPE;\n let slot = ctx.stream.taSlots.get(slotId) as KeltnerSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, multiplier, maType, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const close = ctx.stream.bar.close;\n const middleSeries = dispatchMa(slot.maType, `${slotId}/${slot.maType}`, close, slot.length);\n const atrSeries = atr(`${slotId}/atr`, slot.length);\n if (slot.outputs === null) {\n slot.outputs = Object.freeze({\n upper: makeSeriesView<number>(slot.upperBuffer),\n middle: middleSeries,\n lower: makeSeriesView<number>(slot.lowerBuffer),\n });\n }\n const mid = middleSeries.current;\n const atrValue = atrSeries.current;\n let upperValue: number;\n let lowerValue: number;\n if (Number.isFinite(mid) && Number.isFinite(atrValue)) {\n upperValue = mid + slot.multiplier * atrValue;\n lowerValue = mid - slot.multiplier * atrValue;\n } else {\n upperValue = Number.NaN;\n lowerValue = Number.NaN;\n }\n if (ctx.isTick) {\n slot.upperBuffer.replaceHead(upperValue);\n slot.lowerBuffer.replaceHead(lowerValue);\n } else {\n slot.upperBuffer.append(upperValue);\n slot.lowerBuffer.append(lowerValue);\n }\n return slot.outputs;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/klinger.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Composition: three `ta.ema` sub-slots\n// (`${slotId}/fastEma`, `${slotId}/slowEma`, `${slotId}/signalEma`).\n// The Volume Force accumulator (trend / cm / dm) is bespoke\n// per-primitive state \u2014 no registry helper expresses VF.\n\nimport type { KlingerOpts, KlingerResult, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { ema } from \"./ema.js\";\n\nconst DEFAULT_FAST_LENGTH = 34;\nconst DEFAULT_SLOW_LENGTH = 55;\nconst DEFAULT_SIGNAL_LENGTH = 13;\n\ntype KlingerSlot = {\n result: KlingerResult | null;\n readonly klingerBuf: Float64RingBuffer;\n readonly klingerSeries: Series<number>;\n /** Active per-bar accumulator (closed-side, post most-recent close). */\n prevHlc: number;\n prevTrend: number;\n prevCm: number;\n prevDm: number;\n /** Snapshot BEFORE the most recent close \u2014 used by tick replay. */\n prevClosedHlc: number;\n prevClosedTrend: number;\n prevClosedCm: number;\n prevClosedDm: number;\n barCount: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.klinger called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): KlingerSlot {\n const klingerBuf = new Float64RingBuffer(capacity);\n return {\n result: null,\n klingerBuf,\n klingerSeries: makeSeriesView<number>(klingerBuf),\n prevHlc: Number.NaN,\n prevTrend: 0,\n prevCm: 0,\n prevDm: 0,\n prevClosedHlc: Number.NaN,\n prevClosedTrend: 0,\n prevClosedCm: 0,\n prevClosedDm: 0,\n barCount: 0,\n };\n}\n\n/**\n * Volume Force given the bar OHLCV + the prior bar's (hlc, trend, cm,\n * dm) snapshot. Returns the new (vf, trend, cm, dm) tuple.\n *\n * `vf = volume \u00B7 |2 \u00B7 (dm / cm \u2212 1)| \u00B7 trend \u00B7 100` when `cm` is\n * finite and non-zero; else `vf = 0`. NaN price inputs hold the prior\n * state forward (vf = 0).\n */\nfunction computeVf(\n high: number,\n low: number,\n close: number,\n volume: number,\n baseHlc: number,\n baseTrend: number,\n baseCm: number,\n baseDm: number,\n): { vf: number; hlc: number; trend: number; cm: number; dm: number } {\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n return { vf: 0, hlc: baseHlc, trend: baseTrend, cm: baseCm, dm: baseDm };\n }\n const hlc = high + low + close;\n const dm = high - low;\n let trend: number;\n if (!Number.isFinite(baseHlc)) {\n // First bar \u2014 no prior HLC. Seed trend = 0 (matches invinite's\n // initialisation: `prevTrend = 0`), emit vf = 0, propagate\n // baseDm = dm (subsequent bar's cm starts from this dm).\n return { vf: 0, hlc, trend: 0, cm: 0, dm };\n }\n if (hlc > baseHlc) trend = 1;\n else if (hlc < baseHlc) trend = -1;\n else trend = baseTrend;\n const cm = trend === baseTrend ? baseCm + dm : baseDm + dm;\n // Defensive: volume / vf-finite guards. Outer call site has already\n // checked high / low / close are finite; volume can still be NaN on\n // some exchanges, but the runtime feeds a finite default elsewhere.\n /* c8 ignore next */\n const volumeFinite = Number.isFinite(volume) ? volume : 0;\n let vf = 0;\n if (cm !== 0 && Number.isFinite(cm)) {\n vf = volumeFinite * Math.abs(2 * (dm / cm - 1)) * trend * 100;\n /* c8 ignore next */\n if (!Number.isFinite(vf)) vf = 0;\n }\n return { vf, hlc, trend, cm, dm };\n}\n\n/**\n * Klinger Volume Oscillator. Per-bar Volume Force accumulator drives\n * the difference of two EMAs (`fastLength` / `slowLength`); the\n * signal line is a third EMA over the Klinger line. Defaults\n * `(34, 55, 13)`. Composes 3 `ta.ema` sub-slots (`${slotId}/fastEma`,\n * `${slotId}/slowEma`, `${slotId}/signalEma`). The user-facing\n * `signal` Series IS the signalEma sub-slot's own Series view.\n *\n * Zero-volume bars emit `vf = 0` (no contribution); this matches\n * invinite's `safeVolume`-style shape and the task spec's \"no VF\n * update\" wording \u2014 zero-VF still flows into the EMAs, it just adds\n * zero. The first bar emits `vf = 0` (seed only \u2014 no prior HLC to\n * difference against).\n *\n * @formula hlc[t] = high + low + close ;\n * trend = hlc > prevHlc ? +1 : hlc < prevHlc ? \u22121 : prevTrend ;\n * dm = high \u2212 low ; cm = trend === prevTrend ? prevCm + dm : prevDm + dm ;\n * vf = cm \u2260 0 ? volume \u00B7 |2\u00B7(dm/cm \u2212 1)| \u00B7 trend \u00B7 100 : 0 ;\n * klinger = ema(vf, fastLength) \u2212 ema(vf, slowLength) ;\n * signal = ema(klinger, signalLength)\n * @warmup slowLength + signalLength \u2212 2\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const k = ta.klinger(\"slot\");\n * // plot(k.klinger); plot(k.signal);\n */\nexport function klinger(slotId: string, opts?: KlingerOpts): KlingerResult {\n const ctx = getCtx();\n const fastLength = opts?.fastLength ?? DEFAULT_FAST_LENGTH;\n const slowLength = opts?.slowLength ?? DEFAULT_SLOW_LENGTH;\n const signalLength = opts?.signalLength ?? DEFAULT_SIGNAL_LENGTH;\n\n let slot = ctx.stream.taSlots.get(slotId) as KlingerSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n\n const { high, low, close, volume } = ctx.stream.bar;\n\n let vf: number;\n if (ctx.isTick) {\n // Replay the head's VF against the prior-close snapshot.\n const step = computeVf(\n high,\n low,\n close,\n volume,\n slot.prevClosedHlc,\n slot.prevClosedTrend,\n slot.prevClosedCm,\n slot.prevClosedDm,\n );\n vf = step.vf;\n } else {\n // Close-side. Snapshot prior-close BEFORE folding in.\n slot.prevClosedHlc = slot.prevHlc;\n slot.prevClosedTrend = slot.prevTrend;\n slot.prevClosedCm = slot.prevCm;\n slot.prevClosedDm = slot.prevDm;\n const step = computeVf(\n high,\n low,\n close,\n volume,\n slot.prevHlc,\n slot.prevTrend,\n slot.prevCm,\n slot.prevDm,\n );\n vf = step.vf;\n slot.prevHlc = step.hlc;\n slot.prevTrend = step.trend;\n slot.prevCm = step.cm;\n slot.prevDm = step.dm;\n slot.barCount += 1;\n }\n\n const fastSeries = ema(`${slotId}/fastEma`, vf, fastLength);\n const slowSeries = ema(`${slotId}/slowEma`, vf, slowLength);\n const fa = fastSeries.current;\n const sa = slowSeries.current;\n const klingerValue = Number.isFinite(fa) && Number.isFinite(sa) ? fa - sa : Number.NaN;\n\n if (ctx.isTick) slot.klingerBuf.replaceHead(klingerValue);\n else slot.klingerBuf.append(klingerValue);\n\n const signalSeries = ema(`${slotId}/signalEma`, klingerValue, signalLength);\n\n if (slot.result === null) {\n slot.result = Object.freeze({\n klinger: slot.klingerSeries,\n signal: signalSeries,\n });\n }\n return slot.result;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/kst.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Composition: four `ta.sma` sub-slots (one per\n// smoothed ROC) + one `ta.sma` sub-slot for the signal line. The four\n// percentage ROCs are computed inline against the parent's source\n// ring (same convention as `coppock.ts` \u2014 `ta.change` emits absolute\n// deltas, while KST needs percentage rate-of-change).\n\nimport type { KstOpts, KstResult, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { sma } from \"./sma.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_ROC1_LENGTH = 10;\nconst DEFAULT_ROC2_LENGTH = 15;\nconst DEFAULT_ROC3_LENGTH = 20;\nconst DEFAULT_ROC4_LENGTH = 30;\nconst DEFAULT_ROC1_SMOOTH = 10;\nconst DEFAULT_ROC2_SMOOTH = 10;\nconst DEFAULT_ROC3_SMOOTH = 10;\nconst DEFAULT_ROC4_SMOOTH = 15;\nconst DEFAULT_SIGNAL_LENGTH = 9;\n\ntype KstSlot = {\n result: KstResult | null;\n readonly kstBuf: Float64RingBuffer;\n readonly kstSeries: Series<number>;\n readonly roc1Length: number;\n readonly roc2Length: number;\n readonly roc3Length: number;\n readonly roc4Length: number;\n /**\n * Last `max(rocN) + 1` closed source values; `at(0)` is the head.\n * Shared by all four percentage-ROC computations.\n */\n readonly sourceWindow: Float64RingBuffer;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.kst called outside an active script step\");\n }\n return ctx;\n}\n\nfunction pctRoc(current: number, lookback: number): number {\n if (!Number.isFinite(lookback) || lookback === 0 || !Number.isFinite(current)) {\n return Number.NaN;\n }\n return (100 * (current - lookback)) / lookback;\n}\n\nfunction rocFromWindow(window: Float64RingBuffer, src: number, length: number): number {\n if (window.length <= length) return Number.NaN;\n return pctRoc(src, window.at(length));\n}\n\n/**\n * Know Sure Thing (Martin Pring, 1992). Weighted sum of four SMA-\n * smoothed percentage rate-of-change series plus an SMA signal line.\n * Defaults `(10, 15, 20, 30, 10, 10, 10, 15, 9)` match Pring's\n * canonical settings. Composes 4 `ta.sma` sub-slots\n * (`${slotId}/r1Sma` .. `${slotId}/r4Sma`) for the smoothing layer\n * plus one `ta.sma` sub-slot (`${slotId}/signalSma`) for the signal\n * line. The percentage-ROC math is inline (mirrors `ta.coppock` \u2014\n * `ta.change` emits absolute deltas, not percentages).\n *\n * The user-facing `signal` Series IS the signalSma sub-slot's own\n * Series view (no extra output buffer on the parent slot). The\n * `kst` Series wraps the parent's own `kstBuf` ring. Result identity\n * is captured on the first call and returned by reference thereafter.\n *\n * @formula rN[t] = sma(pctRoc(source[t], source[t \u2212 rocNLength]), rocNSmooth) for N in 1..4 ;\n * kst[t] = r1 + 2\u00B7r2 + 3\u00B7r3 + 4\u00B7r4 ; NaN if any rN NaN ;\n * signal = sma(kst, signalLength)\n * @warmup max_N(rocNLength + rocNSmooth) + signalLength \u2212 2\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const k = ta.kst(\"slot\", bar.close);\n * // plot(k.kst); plot(k.signal);\n */\nexport function kst(slotId: string, source: ScalarOrSeries, opts?: KstOpts): KstResult {\n const ctx = getCtx();\n const roc1Length = opts?.roc1Length ?? DEFAULT_ROC1_LENGTH;\n const roc2Length = opts?.roc2Length ?? DEFAULT_ROC2_LENGTH;\n const roc3Length = opts?.roc3Length ?? DEFAULT_ROC3_LENGTH;\n const roc4Length = opts?.roc4Length ?? DEFAULT_ROC4_LENGTH;\n const roc1Smooth = opts?.roc1Smooth ?? DEFAULT_ROC1_SMOOTH;\n const roc2Smooth = opts?.roc2Smooth ?? DEFAULT_ROC2_SMOOTH;\n const roc3Smooth = opts?.roc3Smooth ?? DEFAULT_ROC3_SMOOTH;\n const roc4Smooth = opts?.roc4Smooth ?? DEFAULT_ROC4_SMOOTH;\n const signalLength = opts?.signalLength ?? DEFAULT_SIGNAL_LENGTH;\n\n const src = readSourceValue(source);\n\n let slot = ctx.stream.taSlots.get(slotId) as KstSlot | undefined;\n if (slot === undefined) {\n const capacity = ctx.stream.ohlcv.close.capacity;\n const kstBuf = new Float64RingBuffer(capacity);\n const lookbackCap = Math.max(roc1Length, roc2Length, roc3Length, roc4Length) + 1;\n slot = {\n result: null,\n kstBuf,\n kstSeries: makeSeriesView<number>(kstBuf),\n roc1Length,\n roc2Length,\n roc3Length,\n roc4Length,\n sourceWindow: new Float64RingBuffer(lookbackCap),\n };\n ctx.stream.taSlots.set(slotId, slot);\n }\n\n if (ctx.isTick) {\n slot.sourceWindow.replaceHead(src);\n } else {\n slot.sourceWindow.append(src);\n }\n\n const roc1 = rocFromWindow(slot.sourceWindow, src, slot.roc1Length);\n const roc2 = rocFromWindow(slot.sourceWindow, src, slot.roc2Length);\n const roc3 = rocFromWindow(slot.sourceWindow, src, slot.roc3Length);\n const roc4 = rocFromWindow(slot.sourceWindow, src, slot.roc4Length);\n\n const r1Series = sma(`${slotId}/r1Sma`, roc1, roc1Smooth);\n const r2Series = sma(`${slotId}/r2Sma`, roc2, roc2Smooth);\n const r3Series = sma(`${slotId}/r3Sma`, roc3, roc3Smooth);\n const r4Series = sma(`${slotId}/r4Sma`, roc4, roc4Smooth);\n\n const r1 = r1Series.current;\n const r2 = r2Series.current;\n const r3 = r3Series.current;\n const r4 = r4Series.current;\n\n const kstValue =\n Number.isFinite(r1) && Number.isFinite(r2) && Number.isFinite(r3) && Number.isFinite(r4)\n ? r1 + 2 * r2 + 3 * r3 + 4 * r4\n : Number.NaN;\n\n if (ctx.isTick) {\n slot.kstBuf.replaceHead(kstValue);\n } else {\n slot.kstBuf.append(kstValue);\n }\n\n const signalSeries = sma(`${slotId}/signalSma`, kstValue, signalLength);\n\n if (slot.result === null) {\n slot.result = Object.freeze({\n kst: slot.kstSeries,\n signal: signalSeries,\n });\n }\n return slot.result;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/lsma.ts\n// plus lib/linear-regression.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. The per-bar walk is the streaming-compatible\n// shape of `lib/linearRegression`'s closed-form formula; that helper is\n// reused verbatim as the reference computation in the property tests.\n\nimport type { LsmaOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype LsmaSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /** Precomputed `(length \u2212 1) / 2`. */\n readonly xMean: number;\n /** Precomputed `\u03A3 (j \u2212 xMean)\u00B2` for `j = 0..length \u2212 1`. */\n readonly sumXX: number;\n /**\n * Trailing `length` source values. `at(0)` is the head (most\n * recent close); `at(length \u2212 1)` is the oldest.\n */\n readonly sourceWindow: Float64RingBuffer;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.lsma called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): LsmaSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n const xMean = (length - 1) / 2;\n let sumXX = 0;\n for (let j = 0; j < length; j += 1) {\n const dev = j - xMean;\n sumXX += dev * dev;\n }\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n xMean,\n sumXX,\n sourceWindow: new Float64RingBuffer(length),\n };\n}\n\nfunction lsmaFromWindow(slot: LsmaSlot, headOverride?: number): number {\n // Single-pass scan: build sumY, then a second pass for the\n // covariance numerator. Two passes still fit the streaming budget\n // (O(length) per bar) and the structure mirrors the reference\n // `linearRegression` helper byte-for-byte at the math level.\n let sumY = 0;\n for (let j = 0; j < slot.length; j += 1) {\n // j = 0 \u2192 oldest (window.at(length - 1)); j = length - 1 \u2192 head.\n const ageFromHead = slot.length - 1 - j;\n const v =\n ageFromHead === 0 && headOverride !== undefined\n ? headOverride\n : slot.sourceWindow.at(ageFromHead);\n if (!Number.isFinite(v)) return Number.NaN;\n sumY += v;\n }\n const yMean = sumY / slot.length;\n let num = 0;\n for (let j = 0; j < slot.length; j += 1) {\n const ageFromHead = slot.length - 1 - j;\n const v =\n ageFromHead === 0 && headOverride !== undefined\n ? headOverride\n : slot.sourceWindow.at(ageFromHead);\n num += (j - slot.xMean) * (v - yMean);\n }\n const slope = num / slot.sumXX;\n const intercept = yMean - slope * slot.xMean;\n return intercept + slope * (slot.length - 1);\n}\n\nfunction closeValue(slot: LsmaSlot, src: number): number {\n slot.sourceWindow.append(src);\n if (slot.sourceWindow.length < slot.length) return Number.NaN;\n return lsmaFromWindow(slot);\n}\n\nfunction tickValue(slot: LsmaSlot, src: number): number {\n if (slot.sourceWindow.length < slot.length) return Number.NaN;\n if (!Number.isFinite(src)) return Number.NaN;\n return lsmaFromWindow(slot, src);\n}\n\n/**\n * Least Squares Moving Average \u2014 the value of the ordinary-least-\n * squares regression line `y = a + b\u00B7x` evaluated at the last bar of\n * the trailing `length`-bar window (with `x = 0..length \u2212 1` and `y`\n * the source values). Mathematically equivalent to\n * `linearRegression(source, length).value` from `lib/linearRegression`\n * \u2014 that helper is reused verbatim as the property-test reference.\n * Per-bar cost is a two-pass O(length) window walk (sumY, then\n * covariance numerator) to keep the per-bar allocation profile flat;\n * a NaN anywhere inside the window short-circuits the output to NaN\n * (matches the WMA / weighted-window convention).\n *\n * @formula xMean = (length \u2212 1) / 2 ;\n * sumXX = \u03A3 (j \u2212 xMean)\u00B2 for j = 0..length \u2212 1 ;\n * yMean = (1 / length) \u00B7 \u03A3 source[t \u2212 length + 1 + j] ;\n * slope = (\u03A3 (j \u2212 xMean) \u00B7 (source[t \u2212 length + 1 + j] \u2212 yMean)) / sumXX ;\n * intercept = yMean \u2212 slope \u00B7 xMean ;\n * out[t] = intercept + slope \u00B7 (length \u2212 1)\n * @warmup length \u2212 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const l = ta.lsma(bar.close, 25);\n * // plot(l);\n */\nexport function lsma(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: LsmaOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as LsmaSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src));\n } else {\n slot.outBuffer.append(closeValue(slot, src));\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/ma-ribbon.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. maRibbon dispatches per-bar through\n// `TA_REGISTRY`'s registered MA primitives (sma / ema / wma / smma)\n// via sub-slot ids derived from the parent slot id; no private MA copy.\n\nimport type {\n MaRibbonOpts,\n MaRibbonResult,\n MaTypeNoVolume,\n Series,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { ema } from \"./ema.js\";\nimport { sma } from \"./sma.js\";\nimport { smma } from \"./smma.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\nimport { wma } from \"./wma.js\";\n\nconst DEFAULT_LENGTHS: ReadonlyArray<number> = Object.freeze([10, 20, 30, 40, 50]);\nconst DEFAULT_MA_TYPE: MaTypeNoVolume = \"sma\";\n\ntype MaRibbonSlot = {\n readonly outputs: MaRibbonResult;\n readonly lengths: ReadonlyArray<number>;\n readonly maType: MaTypeNoVolume;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.maRibbon called outside an active script step\");\n }\n return ctx;\n}\n\nfunction dispatchMa(\n maType: MaTypeNoVolume,\n subSlotId: string,\n source: number,\n length: number,\n): Series<number> {\n switch (maType) {\n case \"sma\":\n return sma(subSlotId, source, length);\n case \"ema\":\n return ema(subSlotId, source, length);\n case \"wma\":\n return wma(subSlotId, source, length);\n case \"smma\":\n return smma(subSlotId, source, length);\n }\n}\n\n/**\n * Resolve the ordered `ma_<length>` keys for an `opts` value. Defaults\n * mirror `ta.maRibbon`'s defaults (`lengths = [10, 20, 30, 40, 50]`)\n * so a no-opts call yields `[\"ma_10\", \"ma_20\", \"ma_30\", \"ma_40\",\n * \"ma_50\"]`. Iteration order matches the resolved `lengths` array;\n * consumers (legend chips, sub-pane axes, the conformance harness) use\n * this helper to enumerate the `MaRibbonResult` record without\n * hard-coding key names.\n *\n * @formula keys = (opts.lengths ?? DEFAULT_LENGTHS).map(n => `ma_${n}`)\n * @since 0.2\n * @stable\n * @example\n * // import { maRibbonOutputKeys } from \"@invinite-org/chartlang-runtime\";\n * // const keys = maRibbonOutputKeys({ lengths: [10, 20, 30] });\n * // // keys === [\"ma_10\", \"ma_20\", \"ma_30\"]\n */\nexport function maRibbonOutputKeys(opts?: MaRibbonOpts): ReadonlyArray<string> {\n const lengths = opts?.lengths ?? DEFAULT_LENGTHS;\n const out: string[] = [];\n for (const length of lengths) out.push(`ma_${length}`);\n return out;\n}\n\n/**\n * MA Ribbon \u2014 a fan of K moving averages of the same kind at different\n * lengths. Returns a dynamic-key record `{ ma_<length>: Series<number> }`\n * keyed by the resolved `lengths` array. Each output is composed through\n * `TA_REGISTRY`'s registered MA primitive (`sma` / `ema` / `wma` /\n * `smma`) via the sub-slot id `${slotId}/ma_<length>` \u2014 no private MA\n * copy, so a fix to any MA primitive flows in for free (matches the\n * `donchian` / `bb` / `macd` composition convention). Defaults:\n * `lengths = [10, 20, 30, 40, 50]`, `maType = \"sma\"`. Per-output warmup\n * matches the source MA's warmup at that length.\n *\n * The sibling helper {@link maRibbonOutputKeys} returns the ordered\n * `ma_<length>` keys for stable iteration over the result record.\n * `TA_REGISTRY_METADATA.maRibbon` records the default primary key +\n * visible keys + `{ kind: \"auto\" }` y-domain for legend / pane sizing.\n *\n * @formula out.ma_<length> = MA(source, length) for length \u2208 lengths\n * @warmup per-output : matches the source MA's warmup at `length` ;\n * ribbon as a whole : `max(lengths) \u2212 1`\n * @anchors lengths, maType\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const r = ta.maRibbon(bar.close, { lengths: [10, 20, 30], maType: \"ema\" });\n * // plot(r.ma_10);\n * // plot(r.ma_20);\n * // plot(r.ma_30);\n */\nexport function maRibbon(\n slotId: string,\n source: ScalarOrSeries,\n opts?: MaRibbonOpts,\n): MaRibbonResult {\n const ctx = getCtx();\n const lengths = opts?.lengths ?? DEFAULT_LENGTHS;\n const maType = opts?.maType ?? DEFAULT_MA_TYPE;\n const src = readSourceValue(source);\n\n let slot = ctx.stream.taSlots.get(slotId) as MaRibbonSlot | undefined;\n if (slot === undefined) {\n // First call: drive every sub-slot to allocate its `Series<number>`,\n // then freeze the result record (identity-stable per parent slot).\n const outputs: Record<string, Series<number>> = {};\n for (const length of lengths) {\n const subSlotId = `${slotId}/ma_${length}`;\n outputs[`ma_${length}`] = dispatchMa(maType, subSlotId, src, length);\n }\n slot = {\n outputs: Object.freeze(outputs),\n lengths,\n maType,\n };\n ctx.stream.taSlots.set(slotId, slot);\n return slot.outputs;\n }\n\n // Subsequent calls: drive every sub-slot through its registered MA\n // primitive \u2014 the sub-slots own per-bar advancement (close-side\n // append / tick-side replaceHead via `ctx.isTick`).\n for (const length of slot.lengths) {\n const subSlotId = `${slotId}/ma_${length}`;\n dispatchMa(slot.maType, subSlotId, src, length);\n }\n return slot.outputs;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/macd.ts\n// (folded onto lib/ema-of-float64.ts per PLAN.md \u00A79.4)\n// (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. The MACD primitive composes three EMA\n// sub-slots and a virtual \"MACD line\" Float64 buffer the signal EMA\n// reads from.\n\nimport type { MacdOpts, MacdResult, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { ema } from \"./ema.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_FAST = 12;\nconst DEFAULT_SLOW = 26;\nconst DEFAULT_SIGNAL = 9;\n\ntype MacdSlot = {\n readonly result: MacdResult;\n readonly macdBuf: Float64RingBuffer;\n readonly histBuf: Float64RingBuffer;\n /**\n * Reference to the signal-EMA sub-slot's output ring buffer.\n * Captured at first call so per-offset shifted signal views can be\n * constructed without re-entering `ema()` (which would double-\n * advance the sub-slot's compute on every bar).\n */\n readonly signalBuf: Float64RingBuffer;\n /**\n * Per-offset frozen `MacdResult` cache. `offset === 0` returns\n * `result` directly (identity-preserving). Each cached result\n * proxies the same three underlying outputs via shifted views.\n */\n readonly shiftedResults: Map<number, MacdResult>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.macd called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(\n capacity: number,\n signalSeries: Series<number>,\n signalBuf: Float64RingBuffer,\n): MacdSlot {\n const macdBuf = new Float64RingBuffer(capacity);\n const histBuf = new Float64RingBuffer(capacity);\n return {\n result: Object.freeze({\n macd: makeSeriesView<number>(macdBuf),\n signal: signalSeries,\n hist: makeSeriesView<number>(histBuf),\n }),\n macdBuf,\n histBuf,\n signalBuf,\n shiftedResults: new Map(),\n };\n}\n\nfunction resultForOffset(slot: MacdSlot, offset: number): MacdResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n macd: makeShiftedSeriesView<number>(slot.macdBuf, offset),\n signal: makeShiftedSeriesView<number>(slot.signalBuf, offset),\n hist: makeShiftedSeriesView<number>(slot.histBuf, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\n/**\n * MACD \u2014 fast EMA minus slow EMA, with a signal-line EMA over the\n * MACD line and a histogram of their difference. Defaults\n * `{ fastLength: 12, slowLength: 26, signalLength: 9 }`. Composes\n * three EMA primitives at sub-slots `${slotId}/fast`, `${slotId}/slow`,\n * `${slotId}/signal`. The signal EMA reads from an internal MACD\n * Float64 ring; the user-facing `macd` Series wraps the same buffer.\n *\n * @formula fast = ema(source, fastLength) ;\n * slow = ema(source, slowLength) ;\n * macd = fast \u2212 slow ;\n * signal = ema(macd, signalLength) ;\n * hist = macd \u2212 signal\n * @warmup slowLength + signalLength \u2212 1 (slow EMA seeds at slowLength \u2212 1; signal EMA seeds signalLength \u2212 1 bars after that)\n * @since 0.1\n * @stable\n *\n * `opts.offset` shifts all three outputs in lockstep (PLAN.md \u00A79.1) \u2014\n * `series.current` on each output returns the value `offset` bars ago.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const m = ta.macd(\"slot\", bar.close);\n * // const h = m.hist.current;\n * // const lagged = ta.macd(\"slot2\", bar.close, { offset: 5 });\n */\nexport function macd(slotId: string, source: ScalarOrSeries, opts?: MacdOpts): MacdResult {\n const ctx = getCtx();\n const fastLength = opts?.fastLength ?? DEFAULT_FAST;\n const slowLength = opts?.slowLength ?? DEFAULT_SLOW;\n const signalLength = opts?.signalLength ?? DEFAULT_SIGNAL;\n const offset = opts?.offset ?? 0;\n const signalSlotId = `${slotId}/signal`;\n const src = readSourceValue(source);\n const fastSeries = ema(`${slotId}/fast`, src, fastLength);\n const slowSeries = ema(`${slotId}/slow`, src, slowLength);\n const fa = fastSeries.current;\n const sa = slowSeries.current;\n const macdValue = Number.isFinite(fa) && Number.isFinite(sa) ? fa - sa : Number.NaN;\n // Feed macdValue into the signal EMA. Always call with the\n // un-shifted (default) view \u2014 offset shifting for the composite\n // MacdResult happens via the local `resultForOffset`, which reads\n // directly off the signal-EMA's outBuffer (captured below).\n const signalSeries = ema(signalSlotId, macdValue, signalLength);\n\n let slot = ctx.stream.taSlots.get(slotId) as MacdSlot | undefined;\n if (slot === undefined) {\n // Capture the signal-EMA sub-slot's output ring buffer so\n // future shifted-view lookups don't need to re-enter `ema()`.\n const emaSlot = ctx.stream.taSlots.get(signalSlotId) as { outBuffer: Float64RingBuffer };\n slot = initSlot(ctx.stream.ohlcv.close.capacity, signalSeries, emaSlot.outBuffer);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const sig = signalSeries.current;\n const histValue =\n Number.isFinite(macdValue) && Number.isFinite(sig) ? macdValue - sig : Number.NaN;\n if (ctx.isTick) {\n slot.macdBuf.replaceHead(macdValue);\n slot.histBuf.replaceHead(histValue);\n } else {\n slot.macdBuf.append(macdValue);\n slot.histBuf.append(histValue);\n }\n return resultForOffset(slot, offset);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/mass-index.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. The chained EMA-of-range and EMA-of-EMA\n// arms compose `ta.ema` via sub-slots `${slotId}/ema1` /\n// `${slotId}/ema2` so the EMA recurrence + warmup semantics flow in\n// by reference. The rolling-sum-of-ratio window is folded\n// incrementally per bar.\n\nimport type { MassIndexOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { ema } from \"./ema.js\";\n\nconst DEFAULT_EMA_LENGTH = 9;\nconst DEFAULT_SUM_LENGTH = 25;\n\ntype MassIndexSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly emaLength: number;\n readonly sumLength: number;\n readonly ratioWindow: Float64RingBuffer;\n sumRatio: number;\n /** Per-offset Series-view cache; see `sma.ts` for the convention. */\n readonly shiftedViews: Map<number, Series<number>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.massIndex called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(emaLength: number, sumLength: number, capacity: number): MassIndexSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n emaLength,\n sumLength,\n ratioWindow: new Float64RingBuffer(sumLength),\n sumRatio: 0,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: MassIndexSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction ratioValue(e1: number, e2: number): number {\n if (!Number.isFinite(e1) || !Number.isFinite(e2) || e2 === 0) return Number.NaN;\n return e1 / e2;\n}\n\nfunction recomputeSum(slot: MassIndexSlot): void {\n let sum = 0;\n let anyNaN = false;\n for (let i = 0; i < slot.ratioWindow.length; i += 1) {\n const v = slot.ratioWindow.at(i);\n if (!Number.isFinite(v)) {\n anyNaN = true;\n break;\n }\n sum += v;\n }\n slot.sumRatio = anyNaN ? Number.NaN : sum;\n}\n\nfunction closeValue(slot: MassIndexSlot, ratio: number): number {\n if (slot.ratioWindow.length < slot.ratioWindow.capacity) {\n slot.ratioWindow.append(ratio);\n if (Number.isFinite(ratio)) {\n slot.sumRatio += ratio;\n } else {\n slot.sumRatio = Number.NaN;\n }\n if (slot.ratioWindow.length < slot.ratioWindow.capacity) return Number.NaN;\n return slot.sumRatio;\n }\n const outgoing = slot.ratioWindow.at(slot.ratioWindow.length - 1);\n slot.ratioWindow.append(ratio);\n if (Number.isFinite(outgoing) && Number.isFinite(ratio) && Number.isFinite(slot.sumRatio)) {\n slot.sumRatio = slot.sumRatio - outgoing + ratio;\n } else {\n recomputeSum(slot);\n }\n return slot.sumRatio;\n}\n\nfunction tickValue(slot: MassIndexSlot, ratio: number): number {\n if (slot.ratioWindow.length < slot.ratioWindow.capacity) return Number.NaN;\n const oldestInHead = slot.ratioWindow.at(0);\n // NaN propagates through subtraction/addition \u2014 Infinity does too \u2014\n // so a poisoned sum, NaN ratio, or NaN oldestInHead all surface as\n // a non-finite value at the head.\n return slot.sumRatio - oldestInHead + ratio;\n}\n\n/**\n * Mass Index \u2014 sub-pane volatility line tracking the range-EMA\n * \"bulge\" ratio to flag trend-reversal setups via the canonical\n * 27 threshold. Built on EMA-of-EMA-of-range via two chained\n * sub-slots (`${slotId}/ema1`, `${slotId}/ema2`) \u2014 a fix to EMA's\n * recurrence flows in for free. Reads `bar.high \u2212 bar.low` directly\n * (no source param). NaN when either chained EMA is NaN or when\n * the inner EMA of EMA is zero (degenerate ratio).\n *\n * @formula range[t] = high[t] \u2212 low[t] ;\n * ema1 = EMA(emaLength)(range) ;\n * ema2 = EMA(emaLength)(ema1) ;\n * ratio[t] = ema1[t] / ema2[t] ;\n * mi[t] = sum(ratio[t \u2212 sumLength + 1..= t])\n * @warmup emaLength + emaLength + sumLength \u2212 3\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts the returned series so `series.current` reads\n * the value `offset` bars ago (PLAN.md \u00A79.1).\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const mi = ta.massIndex();\n * // plot(mi);\n */\nexport function massIndex(slotId: string, opts?: MassIndexOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as MassIndexSlot | undefined;\n if (slot === undefined) {\n const emaLength = opts?.emaLength ?? DEFAULT_EMA_LENGTH;\n const sumLength = opts?.sumLength ?? DEFAULT_SUM_LENGTH;\n slot = initSlot(emaLength, sumLength, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const range = ctx.stream.bar.high - ctx.stream.bar.low;\n const ema1Series = ema(`${slotId}/ema1`, range, slot.emaLength);\n const e1 = ema1Series.current;\n const ema2Series = ema(`${slotId}/ema2`, e1, slot.emaLength);\n const e2 = ema2Series.current;\n const ratio = ratioValue(e1, e2);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, ratio));\n } else {\n slot.outBuffer.append(closeValue(slot, ratio));\n }\n return viewForOffset(slot, opts?.offset ?? 0);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/mcginley.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape.\n\nimport type { McginleyOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype McginleySlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /** Tick-side recurrence anchor (current bar, may be intra-bar). */\n prevMc: number;\n /** Close-side recurrence anchor (prior closed bar). */\n prevClosedMc: number;\n /** Number of finite source values folded into the slot so far. */\n seedCount: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.mcginley called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): McginleySlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n prevMc: Number.NaN,\n prevClosedMc: Number.NaN,\n seedCount: 0,\n };\n}\n\n/**\n * Apply the McGinley Dynamic recurrence step given the prior MC\n * anchor. `prev === 0` is the well-defined zero-seed edge case:\n * `(src/0)^4 = +Infinity` \u2192 division by `+Infinity` \u2192 0 \u2192 sticky-zero\n * fix-point. The task spec calls for NaN in that regime \u2014 concretely,\n * a `prev === 0` recurrence cannot escape the fix-point, so we emit\n * NaN to signal the degenerate state.\n */\nfunction step(src: number, prev: number, length: number): number {\n if (prev === 0) return Number.NaN;\n const ratio = src / prev;\n const denom = length * ratio * ratio * ratio * ratio;\n return prev + (src - prev) / denom;\n}\n\nfunction compute(slot: McginleySlot, src: number, isTick: boolean): number {\n if (!Number.isFinite(src)) {\n // Mid-stream NaN forward-fills the prior value (matches the\n // EMA / SMMA recurrence convention).\n return isTick ? slot.prevMc : slot.prevClosedMc;\n }\n // Warmup: emit NaN until `length` finite source values have been\n // seen (matches invinite's seed convention). At the warmup\n // boundary the recurrence is seeded with the source value itself.\n if (slot.seedCount < slot.length - 1) {\n if (isTick) return Number.NaN;\n slot.seedCount += 1;\n slot.prevClosedMc = Number.NaN;\n slot.prevMc = Number.NaN;\n return Number.NaN;\n }\n if (!Number.isFinite(slot.prevClosedMc)) {\n // Seed bar \u2014 `length`-th finite source value lands here.\n if (isTick) return src;\n slot.seedCount += 1;\n slot.prevClosedMc = src;\n slot.prevMc = src;\n return src;\n }\n const prev = slot.prevClosedMc;\n const next = step(src, prev, slot.length);\n if (!isTick) {\n slot.prevClosedMc = next;\n slot.prevMc = next;\n }\n return next;\n}\n\n/**\n * McGinley Dynamic \u2014 an adaptive moving average with an automatic\n * lag-compensation correction. The recurrence\n * `mc[t] = mc[t-1] + (src[t] \u2212 mc[t-1]) / (length \u00B7 (src[t] / mc[t-1])\u2074)`\n * scales the step size by the relative change between source and the\n * prior MA value, so the indicator tracks faster on strong moves and\n * smoother on quiet bars. NaN source forward-fills the prior value;\n * `prev === 0` is the well-defined zero-seed fix-point and emits NaN\n * (the recurrence cannot escape a zero anchor \u2014 matches the invinite\n * reference's NaN-correct degenerate handling).\n *\n * @formula seed at length-th finite source bar : mc = src ;\n * mc[t] = mc[t-1] + (src[t] \u2212 mc[t-1]) / (length \u00B7 (src[t] / mc[t-1])^4)\n * @warmup length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const m = ta.mcginley(bar.close, 14);\n * // plot(m);\n */\nexport function mcginley(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: McginleyOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as McginleySlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const value = compute(slot, readSourceValue(source), ctx.isTick);\n if (ctx.isTick) slot.outBuffer.replaceHead(value);\n else slot.outBuffer.append(value);\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/median.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Only the median-statistic line is ported;\n// invinite's median plugin also bundles \u00B1ATR bands + an EMA-smoothed\n// median line \u2014 those compositions are out of scope for the single-\n// output `ta.median` primitive (script authors compose them via\n// `ta.atr`, `ta.ema` as needed).\n\nimport type { MedianOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype MedianSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /**\n * Closed source values across the trailing `length` bars (capacity\n * `length`). `at(0)` is the head \u2014 most recent close \u2014 and\n * `at(length - 1)` is the oldest.\n */\n readonly window: Float64RingBuffer;\n /**\n * Reused scratch buffer for the per-bar sort. Capacity = `length`.\n * Only the first `k` slots (count of finite values in the window)\n * are populated + sorted per emission.\n */\n readonly sortedBuffer: Float64Array;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.median called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): MedianSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n window: new Float64RingBuffer(length),\n sortedBuffer: new Float64Array(length),\n };\n}\n\n/**\n * Compute the median of the window's finite values. Substitutes\n * `headOverride` for the head slot (age 0) when finite \u2014 used by\n * tick replay to evaluate the partial-bar tick without mutating\n * the closed window.\n *\n * Returns `NaN` when the window contains no finite values.\n */\nfunction medianOfWindow(slot: MedianSlot, headOverride: number): number {\n const buf = slot.sortedBuffer;\n let k = 0;\n const filled = slot.window.length;\n for (let i = 0; i < filled; i += 1) {\n const v = i === 0 ? headOverride : slot.window.at(i);\n if (Number.isFinite(v)) {\n buf[k] = v;\n k += 1;\n }\n }\n if (k === 0) return Number.NaN;\n // Sort only the populated prefix \u2014 `Float64Array.prototype.sort`\n // takes a comparator but here we slice a typed subarray view.\n const view = buf.subarray(0, k);\n view.sort();\n if (k % 2 === 1) return view[(k - 1) >> 1];\n return (view[(k >> 1) - 1] + view[k >> 1]) / 2;\n}\n\nfunction closeValue(slot: MedianSlot, src: number): number {\n slot.window.append(src);\n if (slot.window.length < slot.length) return Number.NaN;\n return medianOfWindow(slot, slot.window.at(0));\n}\n\nfunction tickValue(slot: MedianSlot, src: number): number {\n if (slot.window.length < slot.length) return Number.NaN;\n return medianOfWindow(slot, src);\n}\n\n/**\n * Rolling median \u2014 middle-value statistic across the trailing\n * `length` source values. NaN slots are dropped from the sort\n * (window length effectively shrinks); if every slot is NaN the\n * output is NaN. Robust to single-bar spikes the way an SMA isn't.\n * Tick-mode replays the head by substituting the tick value for\n * the age-0 slot before sorting \u2014 the closed window is unchanged.\n *\n * @formula out[t] = median(source[t \u2212 length + 1 .. t]) ;\n * odd length \u2192 middle value ; even length \u2192 mean of the\n * two middle values ; NaN slots dropped before sort\n * @warmup length \u2212 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const m = ta.median(bar.close, 21);\n * // plot(m);\n */\nexport function median(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: MedianOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as MedianSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src));\n } else {\n slot.outBuffer.append(closeValue(slot, src));\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/mfi.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. The rolling-window pos / neg money-flow sums\n// follow the `cmf.ts` / `ulcerIndex.ts` \"subtract head + add tick\"\n// tick-mode shape (no window mutation on tick).\n\nimport type { MfiOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\n\ntype MfiSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly shiftedViews: Map<number, Series<number>>;\n readonly length: number;\n /** Closed-bar positive money-flow contributions (capacity `length`). */\n readonly posMfWindow: Float64RingBuffer;\n /** Closed-bar negative money-flow contributions. */\n readonly negMfWindow: Float64RingBuffer;\n sumPosMf: number;\n sumNegMf: number;\n /** Most recent finite typical price (lookback target for the next bar). */\n prevTp: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.mfi called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): MfiSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n shiftedViews: new Map(),\n length,\n posMfWindow: new Float64RingBuffer(length),\n negMfWindow: new Float64RingBuffer(length),\n sumPosMf: 0,\n sumNegMf: 0,\n prevTp: Number.NaN,\n };\n}\n\nfunction viewForOffset(slot: MfiSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\n/**\n * Per-bar typical-price contributions to the (posMF, negMF) split,\n * given the prior typical price. NaN OHLC / volume \u2192 (0, 0). Equal\n * `tp === prevTp` or first bar (`prevTp` NaN) \u2192 (0, 0) per Pine\n * convention.\n */\nfunction bucketMf(tp: number, prevTp: number, volume: number): { posMf: number; negMf: number } {\n if (!Number.isFinite(tp) || !Number.isFinite(volume)) {\n return { posMf: 0, negMf: 0 };\n }\n if (!Number.isFinite(prevTp) || tp === prevTp) {\n return { posMf: 0, negMf: 0 };\n }\n const mf = tp * volume;\n if (tp > prevTp) return { posMf: mf, negMf: 0 };\n return { posMf: 0, negMf: mf };\n}\n\nfunction emitMfi(sumPos: number, sumNeg: number, ready: boolean): number {\n if (!ready) return Number.NaN;\n const total = sumPos + sumNeg;\n if (total === 0) return Number.NaN;\n return (100 * sumPos) / total;\n}\n\n/**\n * Money Flow Index \u2014 volume-weighted RSI over a trailing window of\n * `length` typical-price comparisons. Per-bar typical price `tp = (H +\n * L + C) / 3`; per-bar money flow `mf = tp \u00B7 volume` lands in the\n * positive bucket when `tp > prevTp`, in the negative bucket when\n * `tp < prevTp`, and is dropped on equality / first bar. The emit is\n * `100 \u00B7 sumPos / (sumPos + sumNeg)` once `length` such comparisons\n * have accumulated; NaN before warmup and when `sumPos + sumNeg ===\n * 0` (no flow either way \u2014 invinite's zero-denominator guard).\n *\n * Range `[0, 100]` when defined: `sumPos === 0` \u2192 0 (perfect\n * downflow); `sumNeg === 0` with `sumPos > 0` \u2192 100 (perfect\n * upflow). NaN OHLC / volume contributes 0 to both buckets (matches\n * `cmf.ts:62-75`'s defensive shape).\n *\n * **Tick mode.** Substitutes the tick's (posMf, negMf) contribution\n * for the head slot's stored values without mutating the trailing-\n * window rings or advancing `prevTp` \u2014 mirrors `cmf.ts:125-138`.\n *\n * @formula tp = (high + low + close) / 3 ;\n * mf = tp \u00B7 volume ;\n * pos = mf when tp > prevTp else 0 ;\n * neg = mf when tp < prevTp else 0 ;\n * mfi = 100 \u00B7 \u03A3 pos / (\u03A3 pos + \u03A3 neg) over the trailing `length` window\n * @warmup length + 1 (one bar to seed prevTp + `length` comparisons)\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts the returned series (PLAN.md \u00A79.1).\n *\n * @example\n * // import { ta, plot } from \"@invinite-org/chartlang-core\";\n * // const m = ta.mfi(14);\n * // plot(m);\n */\nexport function mfi(slotId: string, length: number, opts?: MfiOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as MfiSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const offset = opts?.offset ?? 0;\n const { high, low, close, volume } = ctx.stream.bar;\n const tp = (high + low + close) / 3;\n const { posMf, negMf } = bucketMf(tp, slot.prevTp, volume);\n\n // The seed bar (prevTp NaN) contributes no real comparison \u2014 we\n // skip the window append so the trailing window only ever holds\n // `length` REAL (prevTp-defined) comparisons. First finite emit\n // lands at bar `length` (warmup `length + 1` per the JSDoc).\n const hasComparison = Number.isFinite(slot.prevTp);\n\n if (ctx.isTick) {\n const ready = slot.posMfWindow.length === slot.length;\n if (!ready || !hasComparison) {\n slot.outBuffer.replaceHead(Number.NaN);\n return viewForOffset(slot, offset);\n }\n const headPos = slot.posMfWindow.at(0);\n const headNeg = slot.negMfWindow.at(0);\n const hypPos = slot.sumPosMf - headPos + posMf;\n const hypNeg = slot.sumNegMf - headNeg + negMf;\n slot.outBuffer.replaceHead(emitMfi(hypPos, hypNeg, true));\n return viewForOffset(slot, offset);\n }\n\n if (hasComparison) {\n if (slot.posMfWindow.length === slot.length) {\n slot.sumPosMf -= slot.posMfWindow.at(slot.length - 1);\n slot.sumNegMf -= slot.negMfWindow.at(slot.length - 1);\n }\n slot.posMfWindow.append(posMf);\n slot.negMfWindow.append(negMf);\n slot.sumPosMf += posMf;\n slot.sumNegMf += negMf;\n }\n if (Number.isFinite(tp)) slot.prevTp = tp;\n slot.outBuffer.append(\n emitMfi(slot.sumPosMf, slot.sumNegMf, slot.posMfWindow.length === slot.length),\n );\n return viewForOffset(slot, offset);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/momentum.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n\nimport type { MomentumOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { change } from \"./change.js\";\nimport type { ScalarOrSeries } from \"./lib/sourceValue.js\";\n\ntype MomentumSlot = {\n series: Series<number> | null;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.momentum called outside an active script step\");\n }\n return ctx;\n}\n\n/**\n * Momentum (Pine `mom`) \u2014 first-difference `source[0] \u2212 source[length]`\n * with a required `length`. Composes {@link change} via a sub-slot so\n * the math kernel lives in one place; the returned `Series<number>` is\n * the sub-slot's series view directly (parent slot just caches its\n * identity for `===`-stable reads). Warmup is `length` bars.\n *\n * @formula out[t] = source[t] \u2212 source[t \u2212 length]\n * @warmup length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const m = ta.momentum(\"slot\", bar.close, 10);\n * // const head = m.current;\n */\nexport function momentum(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: MomentumOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as MomentumSlot | undefined;\n if (slot === undefined) {\n slot = { series: null };\n ctx.stream.taSlots.set(slotId, slot);\n }\n const sub = change(`${slotId}/change`, source, { length });\n if (slot.series === null) slot.series = sub;\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/net-volume.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. The math is identical to `ta.obv`; both\n// primitives exist in invinite under their own names, so the\n// chartlang surface mirrors the public API for naming parity. See\n// `obv.ts` for the canonical commentary on `fold`, snapshot fields,\n// and NaN handling \u2014 this file repeats the shape verbatim under its\n// own slot type so each primitive has its own per-callsite state.\n\nimport type { NetVolumeOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\n\ntype NetVolumeSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly shiftedViews: Map<number, Series<number>>;\n cumNetVol: number;\n prevClose: number;\n prevClosedCumNetVol: number;\n prevClosedPrevClose: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.netVolume called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): NetVolumeSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n shiftedViews: new Map(),\n cumNetVol: 0,\n prevClose: Number.NaN,\n prevClosedCumNetVol: 0,\n prevClosedPrevClose: Number.NaN,\n };\n}\n\nfunction viewForOffset(slot: NetVolumeSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction signOfDelta(delta: number): number {\n if (delta > 0) return 1;\n if (delta < 0) return -1;\n return 0;\n}\n\nfunction fold(\n inCum: number,\n inPrevClose: number,\n close: number,\n volume: number,\n): { cum: number; prevClose: number } {\n if (!Number.isFinite(close)) {\n return { cum: inCum, prevClose: inPrevClose };\n }\n if (!Number.isFinite(inPrevClose)) {\n return { cum: inCum, prevClose: close };\n }\n if (!Number.isFinite(volume)) {\n return { cum: inCum, prevClose: close };\n }\n const direction = signOfDelta(close - inPrevClose);\n return { cum: inCum + direction * volume, prevClose: close };\n}\n\n/**\n * Net Volume \u2014 cumulative `sign(close \u2212 prevClose) \u00B7 volume`. **The\n * math is identical to `ta.obv`** (both primitives ship in invinite\n * under their own names; chartlang mirrors the public surface for\n * naming parity). Prefer `ta.obv` when writing new scripts \u2014 this\n * primitive exists to satisfy translation of Pine / invinite\n * indicators that call `netVolume()` directly. The cross-equivalence\n * is property-tested (`netVolume.property.test.ts`).\n *\n * First bar emits `0` (no prior close to difference against \u2014 Pine\n * convention). NaN volume carries the accumulator forward without an\n * update; NaN close holds `prevClose` at its prior value.\n *\n * **Tick mode.** Replays the head bar's contribution against a\n * snapshot of the prior-close `(cumNetVol, prevClose)` tuple.\n *\n * @formula netVolume[t] = netVolume[t \u2212 1] + sign(close[t] \u2212 close[t \u2212 1]) \u00B7 volume[t]\n * @warmup 1 (needs a prior close to compute the delta; bar 0 emits 0)\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts the returned series (PLAN.md \u00A79.1).\n *\n * @example\n * // import { ta, plot } from \"@invinite-org/chartlang-core\";\n * // const nv = ta.netVolume();\n * // plot(nv);\n */\nexport function netVolume(slotId: string, opts?: NetVolumeOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as NetVolumeSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const offset = opts?.offset ?? 0;\n const { close, volume } = ctx.stream.bar;\n\n if (ctx.isTick) {\n const next = fold(slot.prevClosedCumNetVol, slot.prevClosedPrevClose, close, volume);\n slot.outBuffer.replaceHead(next.cum);\n return viewForOffset(slot, offset);\n }\n\n slot.prevClosedCumNetVol = slot.cumNetVol;\n slot.prevClosedPrevClose = slot.prevClose;\n const next = fold(slot.cumNetVol, slot.prevClose, close, volume);\n slot.cumNetVol = next.cum;\n slot.prevClose = next.prevClose;\n slot.outBuffer.append(slot.cumNetVol);\n return viewForOffset(slot, offset);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/nvi.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. The runtime emits the RAW NVI line only;\n// invinite's optional smoothing block is left to the script author\n// (`ta.ema(ta.nvi(), 255)` etc.). The mirror primitive `ta.pvi`\n// re-uses this file's `nviLikeFold` shape with a flipped predicate.\n\nimport type { NviOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\n\n/**\n * Anchored seed value at bar 0 (and after any bar where the\n * accumulator has been carried-forward through NaN inputs).\n *\n * @anchors seedValue\n */\nconst SEED_VALUE = 1000;\n\ntype NviSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly shiftedViews: Map<number, Series<number>>;\n /** Active NVI value across the closed bars so far. */\n value: number;\n /** Most recent finite close. */\n prevClose: number;\n /** Most recent volume (treated as 0 on NaN). */\n prevVolume: number;\n /** Snapshot of `value` BEFORE the most recent close-side update. */\n prevClosedValue: number;\n prevClosedPrevClose: number;\n prevClosedPrevVolume: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.nvi called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): NviSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n shiftedViews: new Map(),\n value: SEED_VALUE,\n prevClose: Number.NaN,\n prevVolume: Number.NaN,\n prevClosedValue: SEED_VALUE,\n prevClosedPrevClose: Number.NaN,\n prevClosedPrevVolume: Number.NaN,\n };\n}\n\nfunction viewForOffset(slot: NviSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction safeVol(volume: number): number {\n return Number.isFinite(volume) ? volume : 0;\n}\n\n/**\n * Fold the bar's `(close, volume)` into the prior NVI state. NaN close\n * carries every field forward (don't advance `prevClose` \u2014 the next\n * finite close differences against the last finite one). NaN volume\n * is treated as 0 (matches invinite's `safeVolume` shape). The\n * comparison runs `currV < prevV` (NVI) and only updates when the\n * comparison holds AND `prevClose !== 0`.\n */\nfunction fold(\n inValue: number,\n inPrevClose: number,\n inPrevVolume: number,\n close: number,\n volume: number,\n): { value: number; prevClose: number; prevVolume: number } {\n if (!Number.isFinite(close)) {\n return { value: inValue, prevClose: inPrevClose, prevVolume: inPrevVolume };\n }\n const v = safeVol(volume);\n if (!Number.isFinite(inPrevClose)) {\n // First defined close \u2014 seed `prevClose` + `prevVolume`,\n // leave `value` at its 1000 seed.\n return { value: inValue, prevClose: close, prevVolume: v };\n }\n const pv = safeVol(inPrevVolume);\n const shouldUpdate = v < pv;\n if (!shouldUpdate || inPrevClose === 0) {\n return { value: inValue, prevClose: close, prevVolume: v };\n }\n const next = inValue * (1 + (close - inPrevClose) / inPrevClose);\n return { value: next, prevClose: close, prevVolume: v };\n}\n\n/**\n * Negative Volume Index \u2014 cumulative percentage-change in close on\n * bars whose volume is strictly LOWER than the prior bar's; bars with\n * equal-or-higher volume carry the prior NVI value unchanged. Seeded\n * at 1000 (anchor \u2014 see `SEED_VALUE`); the property tests pin the\n * seed at bar 0.\n *\n * NaN volume is treated as 0 (matches invinite's `safeVolume` shape) \u2014\n * a NaN-volume bar is \"lower\" than any positive-volume bar, so the\n * comparison is exercised. NaN close carries every accumulator field\n * forward without advancing \u2014 the next finite close differences\n * against the last finite one.\n *\n * **Tick mode.** Replays the head bar's contribution against a\n * snapshot of the prior-close `(value, prevClose, prevVolume)` tuple.\n *\n * @formula nvi[0] = 1000 ;\n * nvi[t] = (volume[t] < volume[t \u2212 1] && prevClose != 0)\n * ? nvi[t \u2212 1] \u00B7 (1 + (close[t] \u2212 close[t \u2212 1]) / close[t \u2212 1])\n * : nvi[t \u2212 1]\n * @warmup 1 (bar 0 emits the 1000 seed)\n * @anchors seedValue\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts the returned series (PLAN.md \u00A79.1).\n *\n * @example\n * // import { ta, plot } from \"@invinite-org/chartlang-core\";\n * // const n = ta.nvi();\n * // plot(n);\n */\nexport function nvi(slotId: string, opts?: NviOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as NviSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const offset = opts?.offset ?? 0;\n const { close, volume } = ctx.stream.bar;\n\n if (ctx.isTick) {\n const next = fold(\n slot.prevClosedValue,\n slot.prevClosedPrevClose,\n slot.prevClosedPrevVolume,\n close,\n volume,\n );\n slot.outBuffer.replaceHead(next.value);\n return viewForOffset(slot, offset);\n }\n\n slot.prevClosedValue = slot.value;\n slot.prevClosedPrevClose = slot.prevClose;\n slot.prevClosedPrevVolume = slot.prevVolume;\n const next = fold(slot.value, slot.prevClose, slot.prevVolume, close, volume);\n slot.value = next.value;\n slot.prevClose = next.prevClose;\n slot.prevVolume = next.prevVolume;\n slot.outBuffer.append(slot.value);\n return viewForOffset(slot, offset);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// No invinite source \u2014 semantics per Pine `ta.nz`. See PLAN.md \u00A73.1.\n\n/**\n * Replace `NaN` with a fallback. Returns `value` unchanged when it\n * is not `NaN`; otherwise returns `replacement` (defaults to `0`).\n * Stateless \u2014 does not allocate a slot, does not consult the active\n * runtime context.\n *\n * @formula Number.isNaN(value) ? (replacement ?? 0) : value\n * @warmup 0\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const safe = ta.nz(ta.change(bar.close).current, 0);\n */\nexport function nz(value: number, replacement?: number): number {\n if (Number.isNaN(value)) return replacement ?? 0;\n return value;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/obv.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. The runtime emits the RAW OBV cumulative\n// only; invinite's optional smoothing block is left to the script\n// author (`ta.ema(ta.obv(), n)` etc.).\n\nimport type { ObvOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\n\ntype ObvSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n /** Active cumulative OBV across the closed bars so far. */\n cumObv: number;\n /** Most recent finite close (the lookback target for the next delta). */\n prevClose: number;\n /** Snapshot of `cumObv` BEFORE the most recent close-side update. */\n prevClosedCumObv: number;\n /** Snapshot of `prevClose` BEFORE the most recent close-side update. */\n prevClosedPrevClose: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.obv called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): ObvSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n cumObv: 0,\n prevClose: Number.NaN,\n prevClosedCumObv: 0,\n prevClosedPrevClose: Number.NaN,\n };\n}\n\nfunction signOfDelta(delta: number): number {\n if (delta > 0) return 1;\n if (delta < 0) return -1;\n return 0;\n}\n\n/**\n * Compute the (cumObv, prevClose) accumulator state AFTER folding the\n * given bar into the prior (inCumObv, inPrevClose) state. NaN close or\n * NaN volume carries the accumulator forward unchanged (matches\n * invinite's `safeVolume(NaN) === 0` shape under the `prevClose === NaN`\n * first-bar guard).\n */\nfunction fold(\n inCumObv: number,\n inPrevClose: number,\n close: number,\n volume: number,\n): { cumObv: number; prevClose: number } {\n if (!Number.isFinite(close)) {\n return { cumObv: inCumObv, prevClose: inPrevClose };\n }\n if (!Number.isFinite(inPrevClose)) {\n // First bar with a defined close \u2014 seed `prevClose`, leave\n // `cumObv` at its zero seed.\n return { cumObv: inCumObv, prevClose: close };\n }\n if (!Number.isFinite(volume)) {\n // NaN volume \u2192 contribute nothing this bar, but advance\n // `prevClose` so the next delta is well-defined.\n return { cumObv: inCumObv, prevClose: close };\n }\n const direction = signOfDelta(close - inPrevClose);\n return { cumObv: inCumObv + direction * volume, prevClose: close };\n}\n\n/**\n * On-Balance Volume \u2014 cumulative volume signed by close-vs-prev-close\n * direction. Renders in its own pane (volume category). Flat closes\n * (delta = 0) contribute nothing; NaN volume carries the accumulator\n * forward without an update (matches invinite's `safeVolume`-style\n * defensive shape). The first bar emits `0` (no prior close to\n * difference against \u2014 Pine convention).\n *\n * **Tick mode.** Replays the head bar's contribution against a\n * snapshot of the prior-close (cumObv, prevClose) tuple so a partial-\n * bar tick doesn't pollute the next close's accumulator.\n *\n * @formula obv[t] = obv[t \u2212 1] + sign(close[t] \u2212 close[t \u2212 1]) \u00B7 volume[t]\n * @warmup 1 (needs a prior close to compute the delta; bar 0 emits 0)\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta, plot } from \"@invinite-org/chartlang-core\";\n * // const o = ta.obv();\n * // plot(o);\n */\nexport function obv(slotId: string, _opts?: ObvOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as ObvSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const { close, volume } = ctx.stream.bar;\n\n if (ctx.isTick) {\n const next = fold(slot.prevClosedCumObv, slot.prevClosedPrevClose, close, volume);\n slot.outBuffer.replaceHead(next.cumObv);\n return slot.series;\n }\n\n // Close-side: snapshot the prior-close state, then fold in.\n slot.prevClosedCumObv = slot.cumObv;\n slot.prevClosedPrevClose = slot.prevClose;\n const next = fold(slot.cumObv, slot.prevClose, close, volume);\n slot.cumObv = next.cumObv;\n slot.prevClose = next.prevClose;\n slot.outBuffer.append(slot.cumObv);\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/pivots-high-low.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Pivots H/L is self-contained \u2014 no\n// composition with `ta.highest` / `ta.lowest` because the centre bar\n// must be EXCLUDED from the windowed strict-extreme comparison AND\n// the tie-break differs between sides (strict-greater on the LEFT,\n// geq on the RIGHT for highs; matches TradingView `ta.pivothigh`).\n// The slot owns a `leftLength + rightLength + 1` ring buffer per\n// side (high / low) and scans it per close. Output deviates from\n// the typical line-style timing in that the value at bar `t`\n// describes bar `c = t \u2212 rightLength` (mirrors Williams Fractal's\n// centred-window convention from Task 26).\n\nimport type { PivotsHighLowOpts, PivotsHighLowResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\n\nconst DEFAULT_LEFT = 4;\nconst DEFAULT_RIGHT = 4;\n\ntype PivotsHighLowSlot = {\n readonly outputs: PivotsHighLowResult;\n readonly highBuffer: Float64RingBuffer;\n readonly lowBuffer: Float64RingBuffer;\n readonly leftLength: number;\n readonly rightLength: number;\n /**\n * Trailing `leftLength + rightLength + 1` highs. `at(0)` is the\n * most recent close (right-window head); `at(rightLength)` is the\n * centre bar; `at(leftLength + rightLength)` is the oldest\n * left-window bar.\n */\n readonly highWindow: Float64RingBuffer;\n /** Trailing `leftLength + rightLength + 1` lows. */\n readonly lowWindow: Float64RingBuffer;\n /** Number of CLOSED bars folded into the slot so far. */\n barCount: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.pivotsHighLow called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number, leftLength: number, rightLength: number): PivotsHighLowSlot {\n const highBuffer = new Float64RingBuffer(capacity);\n const lowBuffer = new Float64RingBuffer(capacity);\n const windowSize = leftLength + rightLength + 1;\n return {\n outputs: Object.freeze({\n high: makeSeriesView<number>(highBuffer),\n low: makeSeriesView<number>(lowBuffer),\n }),\n highBuffer,\n lowBuffer,\n leftLength,\n rightLength,\n highWindow: new Float64RingBuffer(windowSize),\n lowWindow: new Float64RingBuffer(windowSize),\n barCount: 0,\n };\n}\n\n/**\n * Scan the centred window for an up-pivot at the centre bar (age\n * `rightLength`). Returns `centreHigh` if the centre's high is\n * strictly greater than every left-side bar AND greater-or-equal to\n * every right-side bar (matches Pine `ta.pivothigh` tie-break \u2014\n * equal-high plateaus resolve to the LATER bar). Returns NaN if any\n * window entry is NaN or the strict/geq check fails. `headHigh` is\n * the substitute for age 0 (the most recent bar); tick replay\n * passes the tick's high there.\n */\nfunction scanUpPivot(\n highWindow: Float64RingBuffer,\n headHigh: number,\n leftLength: number,\n rightLength: number,\n): number {\n const centreAge = rightLength;\n const centreHigh = highWindow.at(centreAge);\n if (!Number.isFinite(centreHigh)) return Number.NaN;\n // Right-side window: ages 0..rightLength-1. Strict-or-equal: any\n // right-side bar with strictly greater high \u2192 not a pivot.\n for (let k = 0; k < rightLength; k += 1) {\n const v = k === 0 ? headHigh : highWindow.at(k);\n if (!Number.isFinite(v)) return Number.NaN;\n if (v > centreHigh) return Number.NaN;\n }\n // Left-side window: ages centreAge+1..centreAge+leftLength.\n // Strict: any left-side bar with greater-or-equal high \u2192 not a\n // pivot.\n for (let k = centreAge + 1; k <= centreAge + leftLength; k += 1) {\n const v = highWindow.at(k);\n if (!Number.isFinite(v)) return Number.NaN;\n if (v >= centreHigh) return Number.NaN;\n }\n return centreHigh;\n}\n\n/**\n * Scan the centred window for a down-pivot at the centre bar.\n * Mirrors {@link scanUpPivot} with `<` / `centreLow` (strict-less\n * on left, leq on right).\n */\nfunction scanDownPivot(\n lowWindow: Float64RingBuffer,\n headLow: number,\n leftLength: number,\n rightLength: number,\n): number {\n const centreAge = rightLength;\n const centreLow = lowWindow.at(centreAge);\n if (!Number.isFinite(centreLow)) return Number.NaN;\n for (let k = 0; k < rightLength; k += 1) {\n const v = k === 0 ? headLow : lowWindow.at(k);\n if (!Number.isFinite(v)) return Number.NaN;\n if (v < centreLow) return Number.NaN;\n }\n for (let k = centreAge + 1; k <= centreAge + leftLength; k += 1) {\n const v = lowWindow.at(k);\n if (!Number.isFinite(v)) return Number.NaN;\n if (v <= centreLow) return Number.NaN;\n }\n return centreLow;\n}\n\n/**\n * Pivots High Low \u2014 centred-window swing-pivot detector with\n * asymmetric `(leftLength, rightLength)` confirmation windows. For\n * each centre bar `c`, marks an **up-pivot** if `bar.high(c)` is\n * strictly greater than every `bar.high` in the `leftLength`-bar\n * left window AND greater-or-equal to every `bar.high` in the\n * `rightLength`-bar right window (matches Pine `ta.pivothigh`\n * tie-break \u2014 equal-high plateaus resolve to the LATER bar).\n * Mirrors for **down-pivot** with `bar.low` (strict-less on left,\n * leq on right).\n *\n * Output is centred \u2014 at live bar `t`, the value emitted at\n * `high.current` / `low.current` is the pivot status of bar `t \u2212\n * rightLength` (when bar `t` closes, we now have enough right-\n * window bars to confirm bar `t \u2212 rightLength`). The most recent\n * `rightLength` slots of each Series are intentionally NaN\n * (pending right-window confirmation). Warmup is `leftLength +\n * rightLength` bars before the first confirmed centre.\n *\n * Outputs encode **price levels**: `high.current` =\n * `bar.high(centre)` when up-pivot, NaN otherwise; `low.current` =\n * `bar.low(centre)` when down-pivot, NaN otherwise. NaN in any\n * window slot \u2192 no pivot at the centre. Returns a cached `{ high,\n * low }` record (same identity every bar).\n *\n * @formula high = bar.high(centre) when bar.high(centre) > every left high AND \u2265 every right high, NaN otherwise ;\n * low = bar.low(centre) when bar.low(centre) < every left low AND \u2264 every right low, NaN otherwise\n * @warmup leftLength + rightLength\n * @anchors leftLength, rightLength\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const p = ta.pivotsHighLow({ leftLength: 4, rightLength: 4 });\n * // plot(p.high);\n * // plot(p.low);\n */\nexport function pivotsHighLow(slotId: string, opts?: PivotsHighLowOpts): PivotsHighLowResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as PivotsHighLowSlot | undefined;\n if (slot === undefined) {\n const leftLength = opts?.leftLength ?? DEFAULT_LEFT;\n const rightLength = opts?.rightLength ?? DEFAULT_RIGHT;\n slot = initSlot(ctx.stream.ohlcv.close.capacity, leftLength, rightLength);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n const windowSize = slot.leftLength + slot.rightLength + 1;\n\n if (ctx.isTick) {\n // Tick: substitute head (age 0) with the tick's high/low; centre\n // is still at age `rightLength` in the closed window. Warmup\n // requires `barCount >= windowSize`.\n if (slot.barCount < windowSize) {\n slot.highBuffer.replaceHead(Number.NaN);\n slot.lowBuffer.replaceHead(Number.NaN);\n } else {\n slot.highBuffer.replaceHead(\n scanUpPivot(slot.highWindow, bar.high, slot.leftLength, slot.rightLength),\n );\n slot.lowBuffer.replaceHead(\n scanDownPivot(slot.lowWindow, bar.low, slot.leftLength, slot.rightLength),\n );\n }\n } else {\n slot.highWindow.append(bar.high);\n slot.lowWindow.append(bar.low);\n slot.barCount += 1;\n if (slot.barCount < windowSize) {\n slot.highBuffer.append(Number.NaN);\n slot.lowBuffer.append(Number.NaN);\n } else {\n // Close-side: head (age 0) IS this bar's high/low \u2014 pass\n // `headHigh = highWindow.at(0)` (no substitution).\n slot.highBuffer.append(\n scanUpPivot(\n slot.highWindow,\n slot.highWindow.at(0),\n slot.leftLength,\n slot.rightLength,\n ),\n );\n slot.lowBuffer.append(\n scanDownPivot(\n slot.lowWindow,\n slot.lowWindow.at(0),\n slot.leftLength,\n slot.rightLength,\n ),\n );\n }\n }\n return slot.outputs;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/pivots-standard.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Pivots Standard is self-contained \u2014 no\n// composition. Session boundaries are detected from `bar.time` via\n// `Math.floor(bar.time / 86_400_000)` (UTC-day key). Invinite's\n// full session-detection machinery (weekly / monthly / yearly /\n// custom session ranges) is reduced to daily-only here \u2014 Phase 2\n// ships daily pivots; broader session support could land in a\n// follow-up. Six published formula systems are reduced to four\n// (classic / fibonacci / camarilla / woodie) per task \u00A71; DeMark\n// and Traditional defer. R4 / R5 / S4 / S5 defer per the Phase-2\n// README \"Deferred / Follow-Up Work\" footnote.\n\nimport type {\n PivotsStandardOpts,\n PivotsStandardResult,\n PivotsStandardSystem,\n} from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\n\nconst DEFAULT_SYSTEM: PivotsStandardSystem = \"classic\";\n\nconst MS_PER_DAY = 86_400_000;\n\ntype SevenLevels = {\n pp: number;\n r1: number;\n s1: number;\n r2: number;\n s2: number;\n r3: number;\n s3: number;\n};\n\ntype PivotsStandardSlot = {\n readonly outputs: PivotsStandardResult;\n readonly ppBuffer: Float64RingBuffer;\n readonly r1Buffer: Float64RingBuffer;\n readonly s1Buffer: Float64RingBuffer;\n readonly r2Buffer: Float64RingBuffer;\n readonly s2Buffer: Float64RingBuffer;\n readonly r3Buffer: Float64RingBuffer;\n readonly s3Buffer: Float64RingBuffer;\n readonly system: PivotsStandardSystem;\n // Live state.\n barCount: number;\n currentDayKey: number;\n currentDayHigh: number;\n currentDayLow: number;\n currentDayClose: number;\n prevDayHigh: number;\n prevDayLow: number;\n prevDayClose: number;\n // Snapshot (start-of-current-bar).\n prevClosedBarCount: number;\n prevClosedCurrentDayKey: number;\n prevClosedCurrentDayHigh: number;\n prevClosedCurrentDayLow: number;\n prevClosedCurrentDayClose: number;\n prevClosedPrevDayHigh: number;\n prevClosedPrevDayLow: number;\n prevClosedPrevDayClose: number;\n};\n\nconst NAN = Number.NaN;\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.pivotsStandard called outside an active script step\");\n }\n return ctx;\n}\n\nfunction makeNaNLevels(): SevenLevels {\n return { pp: NAN, r1: NAN, s1: NAN, r2: NAN, s2: NAN, r3: NAN, s3: NAN };\n}\n\nfunction classic(h: number, l: number, c: number): SevenLevels {\n const p = (h + l + c) / 3;\n const range = h - l;\n return {\n pp: p,\n r1: 2 * p - l,\n s1: 2 * p - h,\n r2: p + range,\n s2: p - range,\n r3: p + 2 * range,\n s3: p - 2 * range,\n };\n}\n\nfunction fibonacci(h: number, l: number, c: number): SevenLevels {\n const p = (h + l + c) / 3;\n const range = h - l;\n return {\n pp: p,\n r1: p + 0.382 * range,\n s1: p - 0.382 * range,\n r2: p + 0.618 * range,\n s2: p - 0.618 * range,\n r3: p + range,\n s3: p - range,\n };\n}\n\n/**\n * Camarilla \u2014 R3 / S3 use the (1.1/4) coefficient per the published\n * TradingView formula. R4 / R5 / S4 / S5 defer per the Phase-2\n * README footnote.\n */\nfunction camarilla(h: number, l: number, c: number): SevenLevels {\n const p = (h + l + c) / 3;\n const range = h - l;\n return {\n pp: p,\n r1: c + (1.1 * range) / 12,\n s1: c - (1.1 * range) / 12,\n r2: c + (1.1 * range) / 6,\n s2: c - (1.1 * range) / 6,\n r3: c + (1.1 * range) / 4,\n s3: c - (1.1 * range) / 4,\n };\n}\n\n/**\n * Woodie \u2014 pivot point weights the close more heavily ((h+l+2c)/4).\n * R3 / S3 anchor on the daily high / low directly (mirrors invinite's\n * `h + 2(p-l)` / `l - 2(h-p)`).\n */\nfunction woodie(h: number, l: number, c: number): SevenLevels {\n const p = (h + l + 2 * c) / 4;\n const range = h - l;\n return {\n pp: p,\n r1: 2 * p - l,\n s1: 2 * p - h,\n r2: p + range,\n s2: p - range,\n r3: h + 2 * (p - l),\n s3: l - 2 * (h - p),\n };\n}\n\nconst FORMULA_DISPATCH: Readonly<\n Record<PivotsStandardSystem, (h: number, l: number, c: number) => SevenLevels>\n> = Object.freeze({\n classic,\n fibonacci,\n camarilla,\n woodie,\n});\n\nfunction computeLevels(slot: PivotsStandardSlot): SevenLevels {\n return computeLevelsFrom(slot.prevDayHigh, slot.prevDayLow, slot.prevDayClose, slot.system);\n}\n\nfunction computeLevelsFrom(\n prevHigh: number,\n prevLow: number,\n prevClose: number,\n system: PivotsStandardSystem,\n): SevenLevels {\n if (!Number.isFinite(prevHigh) || !Number.isFinite(prevLow) || !Number.isFinite(prevClose)) {\n return makeNaNLevels();\n }\n return FORMULA_DISPATCH[system](prevHigh, prevLow, prevClose);\n}\n\nfunction initSlot(capacity: number, system: PivotsStandardSystem): PivotsStandardSlot {\n const ppBuffer = new Float64RingBuffer(capacity);\n const r1Buffer = new Float64RingBuffer(capacity);\n const s1Buffer = new Float64RingBuffer(capacity);\n const r2Buffer = new Float64RingBuffer(capacity);\n const s2Buffer = new Float64RingBuffer(capacity);\n const r3Buffer = new Float64RingBuffer(capacity);\n const s3Buffer = new Float64RingBuffer(capacity);\n return {\n outputs: Object.freeze({\n pp: makeSeriesView<number>(ppBuffer),\n r1: makeSeriesView<number>(r1Buffer),\n s1: makeSeriesView<number>(s1Buffer),\n r2: makeSeriesView<number>(r2Buffer),\n s2: makeSeriesView<number>(s2Buffer),\n r3: makeSeriesView<number>(r3Buffer),\n s3: makeSeriesView<number>(s3Buffer),\n }),\n ppBuffer,\n r1Buffer,\n s1Buffer,\n r2Buffer,\n s2Buffer,\n r3Buffer,\n s3Buffer,\n system,\n barCount: 0,\n currentDayKey: 0,\n currentDayHigh: NAN,\n currentDayLow: NAN,\n currentDayClose: NAN,\n prevDayHigh: NAN,\n prevDayLow: NAN,\n prevDayClose: NAN,\n prevClosedBarCount: 0,\n prevClosedCurrentDayKey: 0,\n prevClosedCurrentDayHigh: NAN,\n prevClosedCurrentDayLow: NAN,\n prevClosedCurrentDayClose: NAN,\n prevClosedPrevDayHigh: NAN,\n prevClosedPrevDayLow: NAN,\n prevClosedPrevDayClose: NAN,\n };\n}\n\nfunction snapshot(slot: PivotsStandardSlot): void {\n slot.prevClosedBarCount = slot.barCount;\n slot.prevClosedCurrentDayKey = slot.currentDayKey;\n slot.prevClosedCurrentDayHigh = slot.currentDayHigh;\n slot.prevClosedCurrentDayLow = slot.currentDayLow;\n slot.prevClosedCurrentDayClose = slot.currentDayClose;\n slot.prevClosedPrevDayHigh = slot.prevDayHigh;\n slot.prevClosedPrevDayLow = slot.prevDayLow;\n slot.prevClosedPrevDayClose = slot.prevDayClose;\n}\n\n/** NaN-aware max \u2014 NaN inputs leave the running aggregate unchanged. */\nfunction safeMax(acc: number, x: number): number {\n if (!Number.isFinite(x)) return acc;\n // Defensive: callers seed `acc` finite before folding, so the\n // `!isFinite(acc)` recovery branch is only reachable if the seed bar\n // contained a NaN high/low \u2014 the surrounding pivot pipeline already\n // skips that case.\n /* c8 ignore next */\n if (!Number.isFinite(acc)) return x;\n return x > acc ? x : acc;\n}\n\nfunction safeMin(acc: number, x: number): number {\n if (!Number.isFinite(x)) return acc;\n /* c8 ignore next */\n if (!Number.isFinite(acc)) return x;\n return x < acc ? x : acc;\n}\n\nfunction emitLevels(slot: PivotsStandardSlot, levels: SevenLevels, isTick: boolean): void {\n if (isTick) {\n slot.ppBuffer.replaceHead(levels.pp);\n slot.r1Buffer.replaceHead(levels.r1);\n slot.s1Buffer.replaceHead(levels.s1);\n slot.r2Buffer.replaceHead(levels.r2);\n slot.s2Buffer.replaceHead(levels.s2);\n slot.r3Buffer.replaceHead(levels.r3);\n slot.s3Buffer.replaceHead(levels.s3);\n } else {\n slot.ppBuffer.append(levels.pp);\n slot.r1Buffer.append(levels.r1);\n slot.s1Buffer.append(levels.s1);\n slot.r2Buffer.append(levels.r2);\n slot.s2Buffer.append(levels.s2);\n slot.r3Buffer.append(levels.r3);\n slot.s3Buffer.append(levels.s3);\n }\n}\n\nfunction closeStep(\n slot: PivotsStandardSlot,\n time: number,\n high: number,\n low: number,\n close: number,\n): SevenLevels {\n const dayKey = Math.floor(time / MS_PER_DAY);\n snapshot(slot);\n if (slot.barCount === 0) {\n // Seed bar \u2014 start the in-progress day aggregate. No prevDay\n // yet \u2192 all outputs NaN.\n slot.barCount = 1;\n slot.currentDayKey = dayKey;\n slot.currentDayHigh = high;\n slot.currentDayLow = low;\n slot.currentDayClose = close;\n return makeNaNLevels();\n }\n if (dayKey !== slot.currentDayKey) {\n // Day boundary fired: promote currentDay \u2192 prevDay.\n slot.prevDayHigh = slot.currentDayHigh;\n slot.prevDayLow = slot.currentDayLow;\n slot.prevDayClose = slot.currentDayClose;\n slot.currentDayKey = dayKey;\n slot.currentDayHigh = high;\n slot.currentDayLow = low;\n slot.currentDayClose = close;\n } else {\n // Same day \u2014 update aggregate.\n slot.currentDayHigh = safeMax(slot.currentDayHigh, high);\n slot.currentDayLow = safeMin(slot.currentDayLow, low);\n if (Number.isFinite(close)) slot.currentDayClose = close;\n }\n slot.barCount += 1;\n return computeLevels(slot);\n}\n\nfunction tickStep(\n slot: PivotsStandardSlot,\n time: number,\n _high: number,\n _low: number,\n _close: number,\n): SevenLevels {\n if (slot.prevClosedBarCount === 0) {\n return makeNaNLevels();\n }\n // Tick replay from snapshot. Determine if the tick crosses a day\n // boundary relative to the snapshot's currentDayKey.\n const dayKey = Math.floor(time / MS_PER_DAY);\n const snapKey = slot.prevClosedCurrentDayKey;\n const snapPrevHigh = slot.prevClosedPrevDayHigh;\n const snapPrevLow = slot.prevClosedPrevDayLow;\n const snapPrevClose = slot.prevClosedPrevDayClose;\n if (dayKey !== snapKey) {\n // Boundary crossing on the tick \u2014 promote snapshot's current\n // day to prev (transient), levels derive from the snapshot's\n // currentDay.\n return computeLevelsFrom(\n slot.prevClosedCurrentDayHigh,\n slot.prevClosedCurrentDayLow,\n slot.prevClosedCurrentDayClose,\n slot.system,\n );\n }\n // Same day \u2014 levels still derive from the snapshot's prevDay.\n return computeLevelsFrom(snapPrevHigh, snapPrevLow, snapPrevClose, slot.system);\n}\n\n/**\n * Pivots Standard \u2014 classical daily pivot-point levels (P, R1..R3,\n * S1..S3) derived from the previous UTC-day's high / low / close.\n * Four formula systems supported: `\"classic\"` (default),\n * `\"fibonacci\"`, `\"camarilla\"`, `\"woodie\"`. Reads `bar.time` /\n * `bar.high` / `bar.low` / `bar.close` directly; session boundary\n * detection uses `Math.floor(bar.time / 86_400_000)` (UTC-day key).\n * Returns a cached seven-Series `{ pp, r1, s1, r2, s2, r3, s3 }`\n * record (same identity every bar).\n *\n * The runtime aggregates the in-progress day's HLC on every close;\n * when a new UTC-day opens, the in-progress aggregate is promoted\n * to `prevDay` and the new day's pivot levels are computed via the\n * selected formula. Outputs are NaN at every bar in the FIRST UTC\n * day (no `prevDay` available) and finite from the SECOND UTC day\n * onward.\n *\n * **Deferred:** R4 / R5 / S4 / S5 levels (Camarilla's full table\n * defines them; Phase 2 ships R1..R3 / S1..S3 only). DeMark /\n * Traditional formula systems also defer.\n *\n * NaN bar leaves the day aggregate unchanged (NaN-aware max / min).\n * Tick-mode replays from the snapshot captured at the start of the\n * current bar.\n *\n * @formula pp / r1..r3 / s1..s3 derived from prevDay HLC per system :\n * classic \u2014 pp = (h+l+c)/3 ; r1 = 2p \u2212 l ; s1 = 2p \u2212 h ; r2 = p + (h\u2212l) ; s2 = p \u2212 (h\u2212l) ; r3 = p + 2(h\u2212l) ; s3 = p \u2212 2(h\u2212l) ;\n * fibonacci \u2014 pp = (h+l+c)/3 ; r1/s1 = p \u00B1 0.382\u00B7(h\u2212l) ; r2/s2 = p \u00B1 0.618\u00B7(h\u2212l) ; r3/s3 = p \u00B1 (h\u2212l) ;\n * camarilla \u2014 pp = (h+l+c)/3 ; r1/s1 = c \u00B1 1.1\u00B7(h\u2212l)/12 ; r2/s2 = c \u00B1 1.1\u00B7(h\u2212l)/6 ; r3/s3 = c \u00B1 1.1\u00B7(h\u2212l)/4 ;\n * woodie \u2014 pp = (h+l+2c)/4 ; r1 = 2p \u2212 l ; s1 = 2p \u2212 h ; r2 = p + (h\u2212l) ; s2 = p \u2212 (h\u2212l) ; r3 = h + 2(p\u2212l) ; s3 = l \u2212 2(h\u2212p)\n * @warmup 1 UTC-day boundary (every output NaN until the second\n * UTC day opens)\n * @anchors system\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const p = ta.pivotsStandard();\n * // plot(p.pp);\n * // plot(p.r1);\n * // plot(p.s1);\n */\nexport function pivotsStandard(slotId: string, opts?: PivotsStandardOpts): PivotsStandardResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as PivotsStandardSlot | undefined;\n if (slot === undefined) {\n const system = opts?.system ?? DEFAULT_SYSTEM;\n slot = initSlot(ctx.stream.ohlcv.close.capacity, system);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n if (ctx.isTick) {\n const levels = tickStep(slot, bar.time, bar.high, bar.low, bar.close);\n emitLevels(slot, levels, true);\n } else {\n const levels = closeStep(slot, bar.time, bar.high, bar.low, bar.close);\n emitLevels(slot, levels, false);\n }\n return slot.outputs;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/pmo.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n\nimport type { PmoOpts, PmoResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { ema } from \"./ema.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_FIRST = 35;\nconst DEFAULT_SECOND = 20;\nconst DEFAULT_SIGNAL = 10;\n\n/**\n * Carl Swenlin's PMO uses a non-canonical EMA factor for the two\n * inner stages: `\u03B1 = 2 / length` (NOT the standard `\u03B1 = 2 / (length + 1)`).\n * The signal-line EMA (stage 5) uses the standard `ta.ema`. Per the\n * published TradingView formula:\n * https://www.tradingview.com/support/solutions/43000773010\n */\ntype SwenlinEmaState = {\n readonly alpha: number;\n readonly length: number;\n seedSum: number;\n seedCount: number;\n prevClosedEma: number;\n};\n\nfunction makeSwenlinState(length: number): SwenlinEmaState {\n return {\n alpha: 2 / length,\n length,\n seedSum: 0,\n seedCount: 0,\n prevClosedEma: Number.NaN,\n };\n}\n\nfunction swenlinClose(state: SwenlinEmaState, src: number): number {\n if (!Number.isFinite(src)) {\n // Forward-hold prior closed EMA \u2014 mirrors invinite's\n // pmo.ts:130 \"out[i] = out[i - 1]\" branch.\n return state.prevClosedEma;\n }\n if (state.seedCount < state.length) {\n state.seedSum += src;\n state.seedCount += 1;\n if (state.seedCount < state.length) {\n state.prevClosedEma = Number.NaN;\n return Number.NaN;\n }\n const seedValue = state.seedSum / state.length;\n state.prevClosedEma = seedValue;\n return seedValue;\n }\n const prev = state.prevClosedEma;\n const next = src * state.alpha + prev * (1 - state.alpha);\n state.prevClosedEma = next;\n return next;\n}\n\nfunction swenlinTick(state: SwenlinEmaState, src: number): number {\n if (!Number.isFinite(src)) return state.prevClosedEma;\n if (state.seedCount < state.length) {\n const nextSum = state.seedSum + src;\n const nextCount = state.seedCount + 1;\n // Defensive: the seed-completion branch (`nextCount === length`)\n // is unreachable in normal flow because `swenlinClose` runs\n // first on every bar and would have raised `seedCount` to\n // `length` if this bar completes the seed window \u2014 making the\n // outer `seedCount < length` guard false on the tick path.\n /* c8 ignore next 3 */\n if (nextCount < state.length) return Number.NaN;\n return nextSum / state.length;\n }\n return src * state.alpha + state.prevClosedEma * (1 - state.alpha);\n}\n\ntype PmoSlot = {\n readonly result: PmoResult;\n readonly pmoBuf: Float64RingBuffer;\n readonly signalBuf: Float64RingBuffer;\n readonly shiftedResults: Map<number, PmoResult>;\n readonly stage1: SwenlinEmaState;\n readonly stage2: SwenlinEmaState;\n prevSrc: number;\n prevClosedSrc: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.pmo called outside an active script step\");\n }\n return ctx;\n}\n\nfunction resultForOffset(slot: PmoSlot, offset: number): PmoResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n pmo: makeShiftedSeriesView<number>(slot.pmoBuf, offset),\n signal: makeShiftedSeriesView<number>(slot.signalBuf, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\nfunction computeRoc1(src: number, prevSrc: number): number {\n if (!Number.isFinite(src) || !Number.isFinite(prevSrc) || prevSrc === 0) {\n return Number.NaN;\n }\n return (src / prevSrc - 1) * 1000;\n}\n\n/**\n * Carl Swenlin's Price Momentum Oscillator (PMO). Three-pass smoothing\n * of the 1-bar ROC, scaled to PMO's characteristic \u00B110 swing range:\n *\n * 1. `roc1[t] = ((src[t] / src[t-1]) - 1) \u00D7 1000`.\n * 2. `ema1 = SwenlinEMA(firstSmoothing)(roc1)` \u2014 `\u03B1 = 2 / firstSmoothing`.\n * 3. `scaled = ema1 \u00D7 10`.\n * 4. `pmo = SwenlinEMA(secondSmoothing)(scaled)` \u2014 `\u03B1 = 2 / secondSmoothing`.\n * 5. `signal = EMA(signalLength)(pmo)` \u2014 standard `\u03B1 = 2 / (signalLength + 1)`.\n *\n * The Swenlin EMA factor diverges from canonical `ta.ema`'s `\u03B1 = 2 /\n * (length + 1)`; without it the PMO output is off by a multiplicative\n * constant. Matches TradingView's published PMO output verbatim.\n *\n * @formula roc1[t] = ((src[t]/src[t-1]) - 1) \u00D7 1000 ;\n * ema1[t] = SwenlinEMA(firstSmoothing)(roc1) ;\n * pmo[t] = SwenlinEMA(secondSmoothing)(ema1 \u00D7 10) ;\n * signal[t] = EMA(signalLength)(pmo)\n * @warmup firstSmoothing + secondSmoothing \u2212 1 (pmo line); firstSmoothing + secondSmoothing + signalLength \u2212 3 (signal line)\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const p = ta.pmo(\"slot\", bar.close);\n * // plot(p.pmo); plot(p.signal);\n */\nexport function pmo(slotId: string, source: ScalarOrSeries, opts?: PmoOpts): PmoResult {\n const ctx = getCtx();\n const firstSmoothing = opts?.firstSmoothing ?? DEFAULT_FIRST;\n const secondSmoothing = opts?.secondSmoothing ?? DEFAULT_SECOND;\n const signalLength = opts?.signalLength ?? DEFAULT_SIGNAL;\n const offset = opts?.offset ?? 0;\n const signalSlotId = `${slotId}/signal`;\n const isTick = ctx.isTick;\n const src = readSourceValue(source);\n\n let slot = ctx.stream.taSlots.get(slotId) as PmoSlot | undefined;\n\n // Stage 1: compute roc1 against the appropriate prev source.\n // The `?? Number.NaN` fallbacks below are defensive: in normal flow\n // the runner does a close-side advance before any tick, so by the\n // time `isTick` is true `slot` exists. On the close path, the\n // first-bar slot is still undefined and we want NaN ROC1.\n const prevForRoc = isTick\n ? /* c8 ignore next */ (slot?.prevClosedSrc ?? Number.NaN)\n : (slot?.prevSrc ?? Number.NaN);\n const roc1 = computeRoc1(src, prevForRoc);\n\n // Stages 2 + 4: Swenlin EMA chain. The stages live on the slot; if\n // slot is undefined this is the first bar and we materialise it.\n if (slot === undefined) {\n const pmoBuf = new Float64RingBuffer(ctx.stream.ohlcv.close.capacity);\n const stage1 = makeSwenlinState(firstSmoothing);\n const stage2 = makeSwenlinState(secondSmoothing);\n const stage1Value = swenlinClose(stage1, roc1);\n // Defensive: stage1Value is always NaN on bar 0 (Swenlin returns\n // NaN inside the seed window) so the `* 10` branch never fires\n // on the first-slot path.\n /* c8 ignore next */\n const scaled = Number.isFinite(stage1Value) ? stage1Value * 10 : Number.NaN;\n const stage2Value = swenlinClose(stage2, scaled);\n pmoBuf.append(stage2Value);\n const signalSeries = ema(signalSlotId, stage2Value, signalLength);\n const emaSlot = ctx.stream.taSlots.get(signalSlotId) as {\n outBuffer: Float64RingBuffer;\n };\n slot = {\n result: Object.freeze({\n pmo: makeSeriesView<number>(pmoBuf),\n signal: signalSeries,\n }),\n pmoBuf,\n signalBuf: emaSlot.outBuffer,\n shiftedResults: new Map(),\n stage1,\n stage2,\n prevSrc: src,\n prevClosedSrc: Number.NaN,\n };\n ctx.stream.taSlots.set(slotId, slot);\n return resultForOffset(slot, offset);\n }\n\n // Slot exists \u2014 advance / tick the chain.\n const stage1Value = isTick ? swenlinTick(slot.stage1, roc1) : swenlinClose(slot.stage1, roc1);\n const scaled = Number.isFinite(stage1Value) ? stage1Value * 10 : Number.NaN;\n const pmoValue = isTick ? swenlinTick(slot.stage2, scaled) : swenlinClose(slot.stage2, scaled);\n\n // Feed pmoValue into the signal EMA each bar (handles its own tick branch).\n void ema(signalSlotId, pmoValue, signalLength);\n\n if (isTick) {\n slot.pmoBuf.replaceHead(pmoValue);\n } else {\n slot.pmoBuf.append(pmoValue);\n slot.prevClosedSrc = slot.prevSrc;\n slot.prevSrc = src;\n }\n\n return resultForOffset(slot, offset);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/ppo.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Per \u00A79.4 we fold invinite's private EMA copy\n// onto the canonical `ta.ema` primitive via three sub-slots\n// (`${slotId}/fast`, `${slotId}/slow`, `${slotId}/signal`) \u2014 same\n// composition pattern as `ta.macd`.\n\nimport type { PpoOpts, PpoResult, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { ema } from \"./ema.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_FAST = 12;\nconst DEFAULT_SLOW = 26;\nconst DEFAULT_SIGNAL = 9;\n\ntype PpoSlot = {\n readonly result: PpoResult;\n readonly ppoBuf: Float64RingBuffer;\n readonly histBuf: Float64RingBuffer;\n /**\n * Reference to the signal-EMA sub-slot's output ring buffer.\n * Captured at first call so per-offset shifted signal views can be\n * constructed without re-entering `ema()` (which would double-\n * advance the sub-slot's compute on every bar). Same pattern as\n * `macd.ts`.\n */\n readonly signalBuf: Float64RingBuffer;\n /** Per-offset frozen `PpoResult` cache (identity-preserving for `offset === 0`). */\n readonly shiftedResults: Map<number, PpoResult>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.ppo called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(\n capacity: number,\n signalSeries: Series<number>,\n signalBuf: Float64RingBuffer,\n): PpoSlot {\n const ppoBuf = new Float64RingBuffer(capacity);\n const histBuf = new Float64RingBuffer(capacity);\n return {\n result: Object.freeze({\n ppo: makeSeriesView<number>(ppoBuf),\n signal: signalSeries,\n hist: makeSeriesView<number>(histBuf),\n }),\n ppoBuf,\n histBuf,\n signalBuf,\n shiftedResults: new Map(),\n };\n}\n\nfunction resultForOffset(slot: PpoSlot, offset: number): PpoResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n ppo: makeShiftedSeriesView<number>(slot.ppoBuf, offset),\n signal: makeShiftedSeriesView<number>(slot.signalBuf, offset),\n hist: makeShiftedSeriesView<number>(slot.histBuf, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\nfunction ppoValue(fast: number, slow: number): number {\n if (!Number.isFinite(fast) || !Number.isFinite(slow) || slow === 0) return Number.NaN;\n return (100 * (fast - slow)) / slow;\n}\n\n/**\n * Percentage Price Oscillator \u2014 same shape as MACD but normalised by\n * the slow EMA so the histogram + lines are scale-invariant across\n * symbols. Composes three `ta.ema` sub-slots (`${slotId}/fast`,\n * `${slotId}/slow`, `${slotId}/signal`); a fix to `ema` flows into\n * PPO for free. Multi-output: `{ ppo, signal, hist }`. The registry\n * records `primarySeriesKey: \"ppo\"`, `visibleSeriesKeys: [\"ppo\",\n * \"signal\", \"hist\"]`, and `yDomain: { kind: \"auto\" }` via\n * `TA_REGISTRY_METADATA`.\n *\n * Defaults `{ fastLength: 12, slowLength: 26, signalLength: 9 }`\n * (Appel-era \u2014 matches MACD). `slow === 0` (degenerate price stream)\n * emits `NaN` at the PPO line, which propagates to hist; signal can\n * still be defined off prior PPO values.\n *\n * @formula fast = ema(source, fastLength) ;\n * slow = ema(source, slowLength) ;\n * ppo = 100 \u00B7 (fast \u2212 slow) / slow ; NaN if slow === 0 ;\n * signal = ema(ppo, signalLength) ;\n * hist = ppo \u2212 signal\n * @warmup slowLength + signalLength \u2212 2\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts all three outputs in lockstep (PLAN.md \u00A79.1) \u2014\n * `series.current` on each output returns the value `offset` bars ago.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const p = ta.ppo(\"slot\", bar.close);\n * // const head = p.hist.current;\n * // const lagged = ta.ppo(\"slot2\", bar.close, { offset: 5 });\n */\nexport function ppo(slotId: string, source: ScalarOrSeries, opts?: PpoOpts): PpoResult {\n const ctx = getCtx();\n const fastLength = opts?.fastLength ?? DEFAULT_FAST;\n const slowLength = opts?.slowLength ?? DEFAULT_SLOW;\n const signalLength = opts?.signalLength ?? DEFAULT_SIGNAL;\n const offset = opts?.offset ?? 0;\n const signalSlotId = `${slotId}/signal`;\n const src = readSourceValue(source);\n const fastSeries = ema(`${slotId}/fast`, src, fastLength);\n const slowSeries = ema(`${slotId}/slow`, src, slowLength);\n const pv = ppoValue(fastSeries.current, slowSeries.current);\n // Feed PPO scalar into the signal EMA. Always call with the\n // un-shifted (default) view \u2014 offset shifting for the composite\n // PpoResult happens via `resultForOffset`, which reads directly off\n // the signal-EMA's outBuffer (captured below).\n const signalSeries = ema(signalSlotId, pv, signalLength);\n\n let slot = ctx.stream.taSlots.get(slotId) as PpoSlot | undefined;\n if (slot === undefined) {\n const emaSlot = ctx.stream.taSlots.get(signalSlotId) as { outBuffer: Float64RingBuffer };\n slot = initSlot(ctx.stream.ohlcv.close.capacity, signalSeries, emaSlot.outBuffer);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const sig = signalSeries.current;\n const histValue = Number.isFinite(pv) && Number.isFinite(sig) ? pv - sig : Number.NaN;\n if (ctx.isTick) {\n slot.ppoBuf.replaceHead(pv);\n slot.histBuf.replaceHead(histValue);\n } else {\n slot.ppoBuf.append(pv);\n slot.histBuf.append(histValue);\n }\n return resultForOffset(slot, offset);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/psar.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. PSAR reads `bar.high` / `bar.low` /\n// `bar.close` directly (mirrors Pine's `ta.psar` which has no source\n// param). The recurrence runs incrementally one bar at a time;\n// tick-mode replays the recurrence from a per-bar snapshot of the\n// state at the start of the current bar so a partial-bar tick doesn't\n// pollute the next close's flip detection.\n\nimport type { PsarOpts, PsarResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\n\nconst DEFAULT_ACC_START = 0.02;\nconst DEFAULT_ACC_STEP = 0.02;\nconst DEFAULT_ACC_MAX = 0.2;\n\nconst TREND_UP = 1;\nconst TREND_DOWN = -1;\n\ntype Trend = 1 | -1;\n\ntype PsarSlot = {\n readonly outputs: PsarResult;\n readonly sarBuffer: Float64RingBuffer;\n readonly directionBuffer: Float64RingBuffer;\n readonly accStart: number;\n readonly accStep: number;\n readonly accMax: number;\n /** Number of CLOSED bars folded into the slot so far. */\n barCount: number;\n // Live recurrence state \u2014 advanced on every close, snapshotted to\n // `prevClosed*` BEFORE the close runs the recurrence so a final\n // tick can replay from the seed.\n trend: Trend;\n ep: number;\n af: number;\n sar: number;\n /** Most recent CLOSED bar's high (i.e. bar at index `barCount - 1`). */\n prevHigh: number;\n /** Most recent CLOSED bar's low. */\n prevLow: number;\n /** The bar BEFORE prevHigh \u2014 i.e. the high 2 bars ago. */\n priorHigh: number;\n /** The bar BEFORE prevLow \u2014 i.e. the low 2 bars ago. */\n priorLow: number;\n /** The close of the most recent CLOSED bar \u2014 used by bar-1's\n * direction-decide step on the NEXT close (this is \"prevClose\"). */\n prevClose: number;\n // Snapshot-at-start-of-current-bar \u2014 captured each close BEFORE\n // the recurrence advances the live fields. Tick replays from\n // these so the next close sees the original seed.\n prevClosedTrend: Trend;\n prevClosedEp: number;\n prevClosedAf: number;\n prevClosedSar: number;\n prevClosedPrevHigh: number;\n prevClosedPrevLow: number;\n prevClosedPriorHigh: number;\n prevClosedPriorLow: number;\n prevClosedPrevClose: number;\n prevClosedBarCount: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.psar called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number, accStart: number, accStep: number, accMax: number): PsarSlot {\n const sarBuffer = new Float64RingBuffer(capacity);\n const directionBuffer = new Float64RingBuffer(capacity);\n return {\n outputs: Object.freeze({\n sar: makeSeriesView<number>(sarBuffer),\n direction: makeSeriesView<number>(directionBuffer),\n }),\n sarBuffer,\n directionBuffer,\n accStart,\n accStep,\n accMax,\n barCount: 0,\n trend: TREND_UP,\n ep: Number.NaN,\n af: accStart,\n sar: Number.NaN,\n prevHigh: Number.NaN,\n prevLow: Number.NaN,\n priorHigh: Number.NaN,\n priorLow: Number.NaN,\n prevClose: Number.NaN,\n prevClosedTrend: TREND_UP,\n prevClosedEp: Number.NaN,\n prevClosedAf: accStart,\n prevClosedSar: Number.NaN,\n prevClosedPrevHigh: Number.NaN,\n prevClosedPrevLow: Number.NaN,\n prevClosedPriorHigh: Number.NaN,\n prevClosedPriorLow: Number.NaN,\n prevClosedPrevClose: Number.NaN,\n prevClosedBarCount: 0,\n };\n}\n\nfunction snapshot(slot: PsarSlot): void {\n slot.prevClosedTrend = slot.trend;\n slot.prevClosedEp = slot.ep;\n slot.prevClosedAf = slot.af;\n slot.prevClosedSar = slot.sar;\n slot.prevClosedPrevHigh = slot.prevHigh;\n slot.prevClosedPrevLow = slot.prevLow;\n slot.prevClosedPriorHigh = slot.priorHigh;\n slot.prevClosedPriorLow = slot.priorLow;\n slot.prevClosedPrevClose = slot.prevClose;\n slot.prevClosedBarCount = slot.barCount;\n}\n\n/**\n * Run one bar of the recurrence given the prior CLOSED-bar state\n * (`prevTrend` / `prevEp` / `prevAf` / `prevSar` / `prevHigh` /\n * `prevLow` / `priorHigh` / `priorLow`) and the new bar's\n * `high` / `low`. Returns `{ trend, ep, af, sar }` for the new bar.\n * Used by both the close-side advance and the tick-side replay.\n */\nfunction recurrenceStep(\n prevTrend: Trend,\n prevEp: number,\n prevAf: number,\n prevSar: number,\n prevHigh: number,\n prevLow: number,\n priorHigh: number,\n priorLow: number,\n high: number,\n low: number,\n accStart: number,\n accStep: number,\n accMax: number,\n): { trend: Trend; ep: number; af: number; sar: number } {\n let candidateSar = prevSar + prevAf * (prevEp - prevSar);\n\n if (prevTrend === TREND_UP) {\n const lowerBound = Math.min(prevLow, priorLow);\n if (candidateSar > lowerBound) candidateSar = lowerBound;\n\n if (low <= candidateSar) {\n // Flip to downtrend: SAR becomes the prior EP, new EP is\n // this bar's low, AF resets.\n return { trend: TREND_DOWN, ep: low, af: accStart, sar: prevEp };\n }\n let ep = prevEp;\n let af = prevAf;\n if (high > prevEp) {\n ep = high;\n af = Math.min(prevAf + accStep, accMax);\n }\n return { trend: TREND_UP, ep, af, sar: candidateSar };\n }\n\n // prevTrend === TREND_DOWN\n const upperBound = Math.max(prevHigh, priorHigh);\n if (candidateSar < upperBound) candidateSar = upperBound;\n\n if (high >= candidateSar) {\n return { trend: TREND_UP, ep: high, af: accStart, sar: prevEp };\n }\n let ep = prevEp;\n let af = prevAf;\n if (low < prevEp) {\n ep = low;\n af = Math.min(prevAf + accStep, accMax);\n }\n return { trend: TREND_DOWN, ep, af, sar: candidateSar };\n}\n\nfunction closeStep(\n slot: PsarSlot,\n high: number,\n low: number,\n close: number,\n): { sar: number; direction: number } {\n // NaN suspends state: do not advance any of the live recurrence\n // fields. The snapshot remains the prior bar's state so the next\n // finite close picks up exactly where the last finite close left\n // off.\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n return { sar: Number.NaN, direction: Number.NaN };\n }\n\n // Snapshot the live state BEFORE any mutation so a tick-mode\n // replay (which arrives AFTER the close-side advance for the\n // same bar) sees the start-of-bar state.\n snapshot(slot);\n slot.barCount += 1;\n\n // First finite bar: seed slot. Invinite uses\n // `sar[0] = candles[0].low`, `trend[0] = TREND_UP`. The internal\n // recurrence state is initialised to `ep = high` (the initial\n // EP for an up-trend), `af = accStart`, with `prevHigh / prevLow\n // / priorHigh / priorLow` all set to this bar's H/L (no bar -1).\n if (slot.prevClosedBarCount === 0) {\n slot.trend = TREND_UP;\n slot.sar = low;\n slot.ep = high;\n slot.af = slot.accStart;\n slot.prevHigh = high;\n slot.prevLow = low;\n slot.priorHigh = high;\n slot.priorLow = low;\n slot.prevClose = close;\n return { sar: low, direction: TREND_UP };\n }\n\n // Second finite bar: decide initial direction by comparing this\n // bar's close to the prior CLOSED bar's close. Re-seed `ep` and\n // `sar` per the chosen direction.\n if (slot.prevClosedBarCount === 1) {\n const direction: Trend = close >= slot.prevClose ? TREND_UP : TREND_DOWN;\n slot.trend = direction;\n if (direction === TREND_UP) {\n slot.ep = high;\n slot.sar = slot.prevLow;\n } else {\n slot.ep = low;\n slot.sar = slot.prevHigh;\n }\n slot.af = slot.accStart;\n // Now run the recurrence for this bar starting from the just-\n // re-seeded `(trend, ep, af, sar)` with priorH/L = prevH/L\n // (only one prior bar exists).\n const step = recurrenceStep(\n slot.trend,\n slot.ep,\n slot.af,\n slot.sar,\n slot.prevHigh,\n slot.prevLow,\n slot.prevHigh,\n slot.prevLow,\n high,\n low,\n slot.accStart,\n slot.accStep,\n slot.accMax,\n );\n slot.trend = step.trend;\n slot.ep = step.ep;\n slot.af = step.af;\n slot.sar = step.sar;\n // Shift the look-back window forward.\n slot.priorHigh = slot.prevHigh;\n slot.priorLow = slot.prevLow;\n slot.prevHigh = high;\n slot.prevLow = low;\n slot.prevClose = close;\n return { sar: step.sar, direction: step.trend };\n }\n\n // Third finite bar onward: standard recurrence.\n const step = recurrenceStep(\n slot.trend,\n slot.ep,\n slot.af,\n slot.sar,\n slot.prevHigh,\n slot.prevLow,\n slot.priorHigh,\n slot.priorLow,\n high,\n low,\n slot.accStart,\n slot.accStep,\n slot.accMax,\n );\n slot.trend = step.trend;\n slot.ep = step.ep;\n slot.af = step.af;\n slot.sar = step.sar;\n slot.priorHigh = slot.prevHigh;\n slot.priorLow = slot.prevLow;\n slot.prevHigh = high;\n slot.prevLow = low;\n slot.prevClose = close;\n return { sar: step.sar, direction: step.trend };\n}\n\nfunction tickStep(\n slot: PsarSlot,\n high: number,\n low: number,\n close: number,\n): { sar: number; direction: number } {\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n return { sar: Number.NaN, direction: Number.NaN };\n }\n // Replay from the snapshot taken at the start of the current\n // CLOSED bar. The snapshot's `prevClosedBarCount` tells us which\n // branch of `closeStep` to mirror.\n const seedBarCount = slot.prevClosedBarCount;\n if (seedBarCount === 0) {\n // The current bar is the FIRST closed bar \u2014 its tick replay\n // is the seed itself, with the tick's low as the sar.\n return { sar: low, direction: TREND_UP };\n }\n if (seedBarCount === 1) {\n const direction: Trend = close >= slot.prevClosedPrevClose ? TREND_UP : TREND_DOWN;\n let ep: number;\n let sar: number;\n if (direction === TREND_UP) {\n ep = high;\n sar = slot.prevClosedPrevLow;\n } else {\n ep = low;\n sar = slot.prevClosedPrevHigh;\n }\n const af = slot.accStart;\n const step = recurrenceStep(\n direction,\n ep,\n af,\n sar,\n slot.prevClosedPrevHigh,\n slot.prevClosedPrevLow,\n slot.prevClosedPrevHigh,\n slot.prevClosedPrevLow,\n high,\n low,\n slot.accStart,\n slot.accStep,\n slot.accMax,\n );\n return { sar: step.sar, direction: step.trend };\n }\n const step = recurrenceStep(\n slot.prevClosedTrend,\n slot.prevClosedEp,\n slot.prevClosedAf,\n slot.prevClosedSar,\n slot.prevClosedPrevHigh,\n slot.prevClosedPrevLow,\n slot.prevClosedPriorHigh,\n slot.prevClosedPriorLow,\n high,\n low,\n slot.accStart,\n slot.accStep,\n slot.accMax,\n );\n return { sar: step.sar, direction: step.trend };\n}\n\n/**\n * Parabolic SAR \u2014 Wilder's classic stop-and-reverse oscillator with\n * extreme-point + acceleration-factor tracking. Reads `bar.high` /\n * `bar.low` / `bar.close` directly (no `source` arg \u2014 mirrors Pine).\n * Returns a cached `{ sar, direction }` record (same identity every\n * bar). `direction` is `+1` (uptrend) / `-1` (downtrend), NaN during\n * NaN-suspension. Warmup is `1` \u2014 bar 0 emits the seed value\n * (`sar = bar.low`, `direction = +1`); bar 1 decides the initial\n * direction from `close[1] >= close[0]` and runs the recurrence; bar\n * 2+ continues the recurrence.\n *\n * NaN inputs SUSPEND the recurrence: any non-finite OHL emits NaN /\n * NaN and freezes the live state so the next finite bar resumes from\n * the prior state. Replay-mode (`replaceHead`) recomputes from the\n * snapshot captured at the start of the current bar, so a final tick\n * cannot poison the next close's seed.\n *\n * @formula candidateSar = prevSar + prevAf \u00B7 (prevEp \u2212 prevSar) ;\n * up-trend clamp: candidateSar \u2264 min(prevLow, priorLow) ;\n * down-trend clamp: candidateSar \u2265 max(prevHigh, priorHigh) ;\n * flip (up\u2192down): bar.low \u2264 candidateSar \u2192 sar = prevEp, ep = low, af = accStart ;\n * flip (down\u2192up): bar.high \u2265 candidateSar \u2192 sar = prevEp, ep = high, af = accStart ;\n * EP advance: new extreme widens ep, af = min(af + accStep, accMax)\n * @warmup 1\n * @anchors accelerationStart, accelerationStep, accelerationMax\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const p = ta.psar({ accelerationStart: 0.02, accelerationStep: 0.02, accelerationMax: 0.2 });\n * // plot(p.sar);\n */\nexport function psar(slotId: string, opts?: PsarOpts): PsarResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as PsarSlot | undefined;\n if (slot === undefined) {\n const accStart = opts?.accelerationStart ?? DEFAULT_ACC_START;\n const accStep = opts?.accelerationStep ?? DEFAULT_ACC_STEP;\n const accMax = opts?.accelerationMax ?? DEFAULT_ACC_MAX;\n slot = initSlot(ctx.stream.ohlcv.close.capacity, accStart, accStep, accMax);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const high = ctx.stream.bar.high;\n const low = ctx.stream.bar.low;\n const close = ctx.stream.bar.close;\n if (ctx.isTick) {\n const { sar, direction } = tickStep(slot, high, low, close);\n slot.sarBuffer.replaceHead(sar);\n slot.directionBuffer.replaceHead(direction);\n } else {\n const { sar, direction } = closeStep(slot, high, low, close);\n slot.sarBuffer.append(sar);\n slot.directionBuffer.append(direction);\n }\n return slot.outputs;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/pvi.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Mirror of `nvi.ts` \u2014 same recurrence, the\n// only difference is the volume-comparison predicate (`>` vs `<`).\n// Kept as parallel files (rather than a shared helper) so each\n// primitive has its own slot type + JSDoc + per-callsite tests.\n\nimport type { PviOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\n\n/**\n * Anchored seed value at bar 0 (and after any bar where the\n * accumulator has been carried-forward through NaN inputs).\n *\n * @anchors seedValue\n */\nconst SEED_VALUE = 1000;\n\ntype PviSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly shiftedViews: Map<number, Series<number>>;\n value: number;\n prevClose: number;\n prevVolume: number;\n prevClosedValue: number;\n prevClosedPrevClose: number;\n prevClosedPrevVolume: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.pvi called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): PviSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n shiftedViews: new Map(),\n value: SEED_VALUE,\n prevClose: Number.NaN,\n prevVolume: Number.NaN,\n prevClosedValue: SEED_VALUE,\n prevClosedPrevClose: Number.NaN,\n prevClosedPrevVolume: Number.NaN,\n };\n}\n\nfunction viewForOffset(slot: PviSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction safeVol(volume: number): number {\n return Number.isFinite(volume) ? volume : 0;\n}\n\nfunction fold(\n inValue: number,\n inPrevClose: number,\n inPrevVolume: number,\n close: number,\n volume: number,\n): { value: number; prevClose: number; prevVolume: number } {\n if (!Number.isFinite(close)) {\n return { value: inValue, prevClose: inPrevClose, prevVolume: inPrevVolume };\n }\n const v = safeVol(volume);\n if (!Number.isFinite(inPrevClose)) {\n return { value: inValue, prevClose: close, prevVolume: v };\n }\n const pv = safeVol(inPrevVolume);\n const shouldUpdate = v > pv;\n if (!shouldUpdate || inPrevClose === 0) {\n return { value: inValue, prevClose: close, prevVolume: v };\n }\n const next = inValue * (1 + (close - inPrevClose) / inPrevClose);\n return { value: next, prevClose: close, prevVolume: v };\n}\n\n/**\n * Positive Volume Index \u2014 mirror of {@link nvi}. Cumulative percentage-\n * change in close on bars whose volume is strictly HIGHER than the\n * prior bar's; bars with equal-or-lower volume carry the prior PVI\n * value unchanged. Seeded at 1000.\n *\n * NaN volume is treated as 0 (matches invinite's `safeVolume` shape);\n * NaN close carries the accumulator forward without advancing\n * `prevClose`.\n *\n * **Tick mode.** Replays the head bar's contribution against a\n * snapshot of the prior-close `(value, prevClose, prevVolume)` tuple.\n *\n * @formula pvi[0] = 1000 ;\n * pvi[t] = (volume[t] > volume[t \u2212 1] && prevClose != 0)\n * ? pvi[t \u2212 1] \u00B7 (1 + (close[t] \u2212 close[t \u2212 1]) / close[t \u2212 1])\n * : pvi[t \u2212 1]\n * @warmup 1 (bar 0 emits the 1000 seed)\n * @anchors seedValue\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts the returned series (PLAN.md \u00A79.1).\n *\n * @example\n * // import { ta, plot } from \"@invinite-org/chartlang-core\";\n * // const p = ta.pvi();\n * // plot(p);\n */\nexport function pvi(slotId: string, opts?: PviOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as PviSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const offset = opts?.offset ?? 0;\n const { close, volume } = ctx.stream.bar;\n\n if (ctx.isTick) {\n const next = fold(\n slot.prevClosedValue,\n slot.prevClosedPrevClose,\n slot.prevClosedPrevVolume,\n close,\n volume,\n );\n slot.outBuffer.replaceHead(next.value);\n return viewForOffset(slot, offset);\n }\n\n slot.prevClosedValue = slot.value;\n slot.prevClosedPrevClose = slot.prevClose;\n slot.prevClosedPrevVolume = slot.prevVolume;\n const next = fold(slot.value, slot.prevClose, slot.prevVolume, close, volume);\n slot.value = next.value;\n slot.prevClose = next.prevClose;\n slot.prevVolume = next.prevVolume;\n slot.outBuffer.append(slot.value);\n return viewForOffset(slot, offset);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/pvo.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Per \u00A79.4 we fold invinite's private EMA\n// copies onto the canonical `ta.ema` primitive via three sub-slots\n// (`${slotId}/fast`, `${slotId}/slow`, `${slotId}/signal`) \u2014 same\n// composition pattern as `ta.ppo`.\n\nimport type { PvoOpts, PvoResult, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { ema } from \"./ema.js\";\n\nconst DEFAULT_FAST = 12;\nconst DEFAULT_SLOW = 26;\nconst DEFAULT_SIGNAL = 9;\n\ntype PvoSlot = {\n readonly result: PvoResult;\n readonly pvoBuf: Float64RingBuffer;\n readonly histBuf: Float64RingBuffer;\n /**\n * Reference to the signal-EMA sub-slot's output ring buffer \u2014\n * captured once at first call so per-offset shifted signal views\n * skip a re-entry into `ema(...)` (which would double-advance the\n * sub-slot's compute). Same pattern as `ppo.ts` / `macd.ts`.\n */\n readonly signalBuf: Float64RingBuffer;\n readonly shiftedResults: Map<number, PvoResult>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.pvo called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(\n capacity: number,\n signalSeries: Series<number>,\n signalBuf: Float64RingBuffer,\n): PvoSlot {\n const pvoBuf = new Float64RingBuffer(capacity);\n const histBuf = new Float64RingBuffer(capacity);\n return {\n result: Object.freeze({\n pvo: makeSeriesView<number>(pvoBuf),\n signal: signalSeries,\n hist: makeSeriesView<number>(histBuf),\n }),\n pvoBuf,\n histBuf,\n signalBuf,\n shiftedResults: new Map(),\n };\n}\n\nfunction resultForOffset(slot: PvoSlot, offset: number): PvoResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n pvo: makeShiftedSeriesView<number>(slot.pvoBuf, offset),\n signal: makeShiftedSeriesView<number>(slot.signalBuf, offset),\n hist: makeShiftedSeriesView<number>(slot.histBuf, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\nfunction pvoValue(fast: number, slow: number): number {\n if (!Number.isFinite(fast) || !Number.isFinite(slow) || slow === 0) return Number.NaN;\n return (100 * (fast - slow)) / slow;\n}\n\n/**\n * Percentage Volume Oscillator \u2014 MACD shape applied to `bar.volume`\n * and normalised by the slow EMA so the histogram + lines are\n * scale-invariant across symbols. Composes three `ta.ema` sub-slots\n * (`${slotId}/fast`, `${slotId}/slow`, `${slotId}/signal`); a fix to\n * `ta.ema` flows in for free. Multi-output: `{ pvo, signal, hist }`.\n * The registry records `primarySeriesKey: \"pvo\"`,\n * `visibleSeriesKeys: [\"pvo\", \"signal\", \"hist\"]`, and `yDomain: {\n * kind: \"auto\" }` via `TA_REGISTRY_METADATA`.\n *\n * Defaults `{ fastLength: 12, slowLength: 26, signalLength: 9 }`\n * (Appel-era \u2014 matches MACD / PPO). `slow === 0` (no volume in the\n * slow window) emits NaN on the PVO line, which propagates to hist;\n * signal can still be defined off prior PVO values.\n *\n * @formula fast = ema(volume, fastLength) ;\n * slow = ema(volume, slowLength) ;\n * pvo = 100 \u00B7 (fast \u2212 slow) / slow ; NaN if slow === 0 ;\n * signal = ema(pvo, signalLength) ;\n * hist = pvo \u2212 signal\n * @warmup slowLength + signalLength \u2212 2\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts all three outputs in lockstep (PLAN.md \u00A79.1).\n *\n * @example\n * // import { ta, plot } from \"@invinite-org/chartlang-runtime\";\n * // const p = ta.pvo(\"slot\");\n * // plot(p.pvo); plot(p.signal); plot(p.hist);\n */\nexport function pvo(slotId: string, opts?: PvoOpts): PvoResult {\n const ctx = getCtx();\n const fastLength = opts?.fastLength ?? DEFAULT_FAST;\n const slowLength = opts?.slowLength ?? DEFAULT_SLOW;\n const signalLength = opts?.signalLength ?? DEFAULT_SIGNAL;\n const offset = opts?.offset ?? 0;\n const signalSlotId = `${slotId}/signal`;\n const volume = ctx.stream.bar.volume;\n const fastSeries = ema(`${slotId}/fast`, volume, fastLength);\n const slowSeries = ema(`${slotId}/slow`, volume, slowLength);\n const pv = pvoValue(fastSeries.current, slowSeries.current);\n const signalSeries = ema(signalSlotId, pv, signalLength);\n\n let slot = ctx.stream.taSlots.get(slotId) as PvoSlot | undefined;\n if (slot === undefined) {\n const emaSlot = ctx.stream.taSlots.get(signalSlotId) as { outBuffer: Float64RingBuffer };\n slot = initSlot(ctx.stream.ohlcv.close.capacity, signalSeries, emaSlot.outBuffer);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const sig = signalSeries.current;\n const histValue = Number.isFinite(pv) && Number.isFinite(sig) ? pv - sig : Number.NaN;\n if (ctx.isTick) {\n slot.pvoBuf.replaceHead(pv);\n slot.histBuf.replaceHead(histValue);\n } else {\n slot.pvoBuf.append(pv);\n slot.histBuf.append(histValue);\n }\n return resultForOffset(slot, offset);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/pvt.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. The runtime emits the RAW PVT cumulative\n// only; invinite's optional smoothing block is left to the script\n// author (`ta.ema(ta.pvt(), n)` etc.).\n\nimport type { PvtOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\n\ntype PvtSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly shiftedViews: Map<number, Series<number>>;\n /** Active cumulative PVT across the closed bars so far. */\n cumPvt: number;\n /** Most recent finite close (the lookback target for the next delta). */\n prevClose: number;\n /** Snapshot of `cumPvt` BEFORE the most recent close-side update. */\n prevClosedCumPvt: number;\n /** Snapshot of `prevClose` BEFORE the most recent close-side update. */\n prevClosedPrevClose: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.pvt called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): PvtSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n shiftedViews: new Map(),\n cumPvt: 0,\n prevClose: Number.NaN,\n prevClosedCumPvt: 0,\n prevClosedPrevClose: Number.NaN,\n };\n}\n\nfunction viewForOffset(slot: PvtSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\n/**\n * Per-bar PVT contribution `volume \u00B7 (close \u2212 prevClose) / prevClose`.\n * Zero `prevClose` is a sentinel for \"undefined ratio\": we surface NaN\n * so the output bar carries a NaN, AND signal the caller (via\n * `Number.isNaN`) to carry `cumPvt` forward without an update. NaN\n * volume contributes 0; NaN close \u2192 0 (caller short-circuits).\n */\nfunction contribution(prevClose: number, close: number, volume: number): number {\n if (prevClose === 0) return Number.NaN;\n const v = Number.isFinite(volume) ? volume : 0;\n return (v * (close - prevClose)) / prevClose;\n}\n\n/**\n * Fold the given bar into the prior `(cum, prevClose)` accumulator.\n * NaN close \u2192 carry both forward unchanged (no advance of prevClose).\n * Zero prevClose \u2192 output the bar as NaN AND carry `cum` forward\n * (advance prevClose to `close` so the next finite ratio is well-\n * defined). First bar (`prevClose === NaN`) seeds `prevClose = close`\n * and leaves `cum` at its 0 seed.\n */\nfunction fold(\n inCum: number,\n inPrevClose: number,\n close: number,\n volume: number,\n): { cum: number; prevClose: number; emit: number } {\n if (!Number.isFinite(close)) {\n return { cum: inCum, prevClose: inPrevClose, emit: inCum };\n }\n if (!Number.isFinite(inPrevClose)) {\n // First defined bar: seed prevClose, output 0 (no prior delta).\n return { cum: inCum, prevClose: close, emit: inCum };\n }\n const c = contribution(inPrevClose, close, volume);\n if (Number.isNaN(c)) {\n // Zero prevClose: carry cum forward, advance prevClose so the\n // next finite ratio is well-defined; emit NaN this bar.\n return { cum: inCum, prevClose: close, emit: Number.NaN };\n }\n const next = inCum + c;\n return { cum: next, prevClose: close, emit: next };\n}\n\n/**\n * Price Volume Trend \u2014 cumulative `volume \u00B7 (close \u2212 prevClose) /\n * prevClose`. Conceptually similar to OBV but uses the magnitude of\n * the close-pct-change move (not just sign), so the rate of accumulation\n * scales with how strong the bar's move was. The first bar emits `0`\n * (Pine convention \u2014 no prior close to difference against).\n *\n * **Tick mode.** Replays the head bar's contribution against a\n * snapshot of the prior-close `(cumPvt, prevClose)` tuple so a partial-\n * bar tick doesn't pollute the next close's accumulator.\n *\n * @formula pvt[t] = pvt[t \u2212 1] + volume[t] \u00B7 (close[t] \u2212 close[t \u2212 1]) / close[t \u2212 1]\n * @warmup 1 (needs a prior close to compute the delta; bar 0 emits 0)\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts the returned series (PLAN.md \u00A79.1).\n *\n * @example\n * // import { ta, plot } from \"@invinite-org/chartlang-core\";\n * // const p = ta.pvt();\n * // plot(p);\n */\nexport function pvt(slotId: string, opts?: PvtOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as PvtSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const offset = opts?.offset ?? 0;\n const { close, volume } = ctx.stream.bar;\n\n if (ctx.isTick) {\n const next = fold(slot.prevClosedCumPvt, slot.prevClosedPrevClose, close, volume);\n slot.outBuffer.replaceHead(next.emit);\n return viewForOffset(slot, offset);\n }\n\n slot.prevClosedCumPvt = slot.cumPvt;\n slot.prevClosedPrevClose = slot.prevClose;\n const next = fold(slot.cumPvt, slot.prevClose, close, volume);\n slot.cumPvt = next.cum;\n slot.prevClose = next.prevClose;\n slot.outBuffer.append(next.emit);\n return viewForOffset(slot, offset);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/roc.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n\nimport type { RocOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype RocSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n readonly sourceWindow: Float64RingBuffer;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.roc called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): RocSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n sourceWindow: new Float64RingBuffer(length + 1),\n };\n}\n\nfunction rocValue(head: number, old: number): number {\n if (!Number.isFinite(head) || !Number.isFinite(old) || old === 0) return Number.NaN;\n return (100 * (head - old)) / old;\n}\n\nfunction closeValue(slot: RocSlot, src: number): number {\n slot.sourceWindow.append(src);\n if (slot.sourceWindow.length <= slot.length) return Number.NaN;\n const head = slot.sourceWindow.at(0);\n const old = slot.sourceWindow.at(slot.length);\n return rocValue(head, old);\n}\n\nfunction tickValue(slot: RocSlot, src: number): number {\n // Tick replaces the head bar's source. Warmup count is based on\n // CLOSED bars in the window \u2014 an unwarmed slot returns NaN.\n if (slot.sourceWindow.length <= slot.length) return Number.NaN;\n const old = slot.sourceWindow.at(slot.length);\n return rocValue(src, old);\n}\n\n/**\n * Rate of Change \u2014 `100 \u00D7 (source[0] \u2212 source[length]) / source[length]`.\n * NaN when either operand is NaN or the lagged source is exactly `0`\n * (division-by-zero guard). Warmup is `length` bars.\n *\n * @formula out[t] = 100 \u00B7 (source[t] \u2212 source[t \u2212 length]) / source[t \u2212 length]\n * @warmup length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const r = ta.roc(\"slot\", bar.close, 12);\n * // const head = r.current;\n */\nexport function roc(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: RocOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as RocSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src));\n } else {\n slot.outBuffer.append(closeValue(slot, src));\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/rvgi.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Composition: two `ta.sma` sub-slots\n// (`${slotId}/numSma`, `${slotId}/denSma`) for the numerator /\n// denominator smoothing. The per-bar 4-bar `(1, 2, 2, 1) / 6`\n// weighted sum + the 4-bar signal weighted sum are bespoke (no\n// registry helper exposes that exact weighted window).\n\nimport type { RvgiOpts, RvgiResult, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { sma } from \"./sma.js\";\n\nconst DEFAULT_LENGTH = 10;\n\ntype RvgiSlot = {\n result: RvgiResult | null;\n readonly rvgiBuf: Float64RingBuffer;\n readonly signalBuf: Float64RingBuffer;\n readonly rvgiSeries: Series<number>;\n readonly signalSeries: Series<number>;\n readonly length: number;\n /** Last 4 bars' `(close \u2212 open)` deltas; `at(0)` is the head. */\n readonly coWindow: Float64RingBuffer;\n /** Last 4 bars' `(high \u2212 low)` ranges; `at(0)` is the head. */\n readonly hlWindow: Float64RingBuffer;\n /** Last 4 rvgi outputs; `at(0)` is the head \u2014 feeds the signal. */\n readonly rvgiWindow: Float64RingBuffer;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.rvgi called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): RvgiSlot {\n const rvgiBuf = new Float64RingBuffer(capacity);\n const signalBuf = new Float64RingBuffer(capacity);\n return {\n result: null,\n rvgiBuf,\n signalBuf,\n rvgiSeries: makeSeriesView<number>(rvgiBuf),\n signalSeries: makeSeriesView<number>(signalBuf),\n length,\n coWindow: new Float64RingBuffer(4),\n hlWindow: new Float64RingBuffer(4),\n rvgiWindow: new Float64RingBuffer(4),\n };\n}\n\n/**\n * 4-bar `(1, 2, 2, 1) / 6` weighted sum over a `Float64RingBuffer`\n * with `at(0)` = head. Returns NaN if the ring isn't full or any\n * value is non-finite.\n */\nfunction weighted4(ring: Float64RingBuffer): number {\n if (ring.length < 4) return Number.NaN;\n const v0 = ring.at(0);\n const v1 = ring.at(1);\n const v2 = ring.at(2);\n const v3 = ring.at(3);\n if (\n !Number.isFinite(v0) ||\n !Number.isFinite(v1) ||\n !Number.isFinite(v2) ||\n !Number.isFinite(v3)\n ) {\n return Number.NaN;\n }\n return (v0 + 2 * v1 + 2 * v2 + v3) / 6;\n}\n\n/**\n * Relative Vigor Index (John Ehlers, 2002). Per-bar 4-bar weighted\n * sum of `(close \u2212 open)` (numerator) and `(high \u2212 low)` (denominator),\n * each smoothed via an SMA over `length` bars; `rvgi = numSma /\n * denSma`. The signal line is a 4-bar `(1, 2, 2, 1) / 6` weighted sum\n * of the rvgi line. Defaults `length = 10`. Composes 2 `ta.sma`\n * sub-slots (`${slotId}/numSma`, `${slotId}/denSma`).\n *\n * Flat-range bars (denominator SMA = 0) emit NaN at `rvgi`; that NaN\n * propagates into the signal's 4-bar window.\n *\n * @formula coN = closes[t \u2212 N] \u2212 opens[t \u2212 N] ; hlN = highs[t \u2212 N] \u2212 lows[t \u2212 N] ;\n * num = (co0 + 2\u00B7co1 + 2\u00B7co2 + co3) / 6 ; den = (hl0 + 2\u00B7hl1 + 2\u00B7hl2 + hl3) / 6 ;\n * rvgi = sma(num, length) / sma(den, length) ; NaN on den === 0 ;\n * signal = (rvgi[0] + 2\u00B7rvgi[1] + 2\u00B7rvgi[2] + rvgi[3]) / 6\n * @warmup length + 3 (numerator / denominator defined at bar 3 ; sma defined `length \u2212 1` bars later ; signal needs another 3)\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const r = ta.rvgi(\"slot\");\n * // plot(r.rvgi); plot(r.signal);\n */\nexport function rvgi(slotId: string, opts?: RvgiOpts): RvgiResult {\n const ctx = getCtx();\n const length = opts?.length ?? DEFAULT_LENGTH;\n\n let slot = ctx.stream.taSlots.get(slotId) as RvgiSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n\n const { open, high, low, close } = ctx.stream.bar;\n const co = Number.isFinite(close) && Number.isFinite(open) ? close - open : Number.NaN;\n const hl = Number.isFinite(high) && Number.isFinite(low) ? high - low : Number.NaN;\n\n if (ctx.isTick) {\n slot.coWindow.replaceHead(co);\n slot.hlWindow.replaceHead(hl);\n } else {\n slot.coWindow.append(co);\n slot.hlWindow.append(hl);\n }\n\n const numerator = weighted4(slot.coWindow);\n const denominator = weighted4(slot.hlWindow);\n\n const numSeries = sma(`${slotId}/numSma`, numerator, length);\n const denSeries = sma(`${slotId}/denSma`, denominator, length);\n const numSma = numSeries.current;\n const denSma = denSeries.current;\n let rvgiValue: number;\n if (!Number.isFinite(numSma) || !Number.isFinite(denSma) || denSma === 0) {\n rvgiValue = Number.NaN;\n } else {\n rvgiValue = numSma / denSma;\n }\n\n if (ctx.isTick) {\n slot.rvgiWindow.replaceHead(rvgiValue);\n slot.rvgiBuf.replaceHead(rvgiValue);\n } else {\n slot.rvgiWindow.append(rvgiValue);\n slot.rvgiBuf.append(rvgiValue);\n }\n\n const signalValue = weighted4(slot.rvgiWindow);\n\n if (ctx.isTick) slot.signalBuf.replaceHead(signalValue);\n else slot.signalBuf.append(signalValue);\n\n if (slot.result === null) {\n slot.result = Object.freeze({\n rvgi: slot.rvgiSeries,\n signal: slot.signalSeries,\n });\n }\n return slot.result;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/rvi.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. The up/down EMA arms compose `ta.ema` via\n// sub-slots `${slotId}/upEma` / `${slotId}/downEma` so the EMA\n// recurrence + warmup semantics flow in by reference.\n\nimport type { RviOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { ema } from \"./ema.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype RviSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n readonly sigmaWindow: Float64RingBuffer;\n sumX: number;\n sumX2: number;\n /** Last closed source value (basis of next bar's up/down classification). */\n prevSrc: number;\n /** Per-offset Series-view cache; see `sma.ts` for the convention. */\n readonly shiftedViews: Map<number, Series<number>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.rvi called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): RviSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n sigmaWindow: new Float64RingBuffer(length),\n sumX: 0,\n sumX2: 0,\n prevSrc: Number.NaN,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: RviSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction windowStdDev(n: number, sumX: number, sumX2: number): number {\n const mean = sumX / n;\n const variance = sumX2 / n - mean * mean;\n return Math.sqrt(Math.max(0, variance));\n}\n\n/** Fold a new source value into the sigma-window running sums. */\nfunction appendToSigmaWindow(slot: RviSlot, src: number): number {\n if (slot.sigmaWindow.length < slot.sigmaWindow.capacity) {\n slot.sigmaWindow.append(src);\n if (Number.isFinite(src)) {\n slot.sumX += src;\n slot.sumX2 += src * src;\n } else {\n slot.sumX = Number.NaN;\n slot.sumX2 = Number.NaN;\n }\n if (slot.sigmaWindow.length < slot.sigmaWindow.capacity) return Number.NaN;\n if (!Number.isFinite(slot.sumX)) return Number.NaN;\n return windowStdDev(slot.sigmaWindow.length, slot.sumX, slot.sumX2);\n }\n const outgoing = slot.sigmaWindow.at(slot.sigmaWindow.length - 1);\n slot.sigmaWindow.append(src);\n if (!Number.isFinite(src)) {\n slot.sumX = Number.NaN;\n slot.sumX2 = Number.NaN;\n return Number.NaN;\n }\n if (!Number.isFinite(slot.sumX) || !Number.isFinite(outgoing)) {\n // A previous NaN poisoned the running sums; rebuild from the\n // live window (NaN values short-circuit the result to NaN).\n let sumX = 0;\n let sumX2 = 0;\n for (let i = 0; i < slot.sigmaWindow.length; i += 1) {\n const v = slot.sigmaWindow.at(i);\n if (!Number.isFinite(v)) {\n slot.sumX = Number.NaN;\n slot.sumX2 = Number.NaN;\n return Number.NaN;\n }\n sumX += v;\n sumX2 += v * v;\n }\n slot.sumX = sumX;\n slot.sumX2 = sumX2;\n } else {\n slot.sumX = slot.sumX - outgoing + src;\n slot.sumX2 = slot.sumX2 - outgoing * outgoing + src * src;\n }\n return windowStdDev(slot.sigmaWindow.length, slot.sumX, slot.sumX2);\n}\n\n/** Sigma at the tick boundary against the closed sigma-window state. */\nfunction tickSigma(slot: RviSlot, src: number): number {\n if (slot.sigmaWindow.length < slot.sigmaWindow.capacity) return Number.NaN;\n if (!Number.isFinite(src)) return Number.NaN;\n const oldestInHead = slot.sigmaWindow.at(0);\n const sumX = slot.sumX - oldestInHead + src;\n const sumX2 = slot.sumX2 - oldestInHead * oldestInHead + src * src;\n return windowStdDev(slot.sigmaWindow.length, sumX, sumX2);\n}\n\nfunction classify(sigma: number, diff: number): { up: number; down: number } {\n if (!Number.isFinite(sigma) || !Number.isFinite(diff)) {\n return { up: Number.NaN, down: Number.NaN };\n }\n return {\n up: diff > 0 ? sigma : 0,\n down: diff < 0 ? sigma : 0,\n };\n}\n\nfunction rviValue(upEma: number, downEma: number): number {\n if (!Number.isFinite(upEma) || !Number.isFinite(downEma)) return Number.NaN;\n const total = upEma + downEma;\n if (total === 0) return Number.NaN;\n return (100 * upEma) / total;\n}\n\n/**\n * Relative Volatility Index \u2014 sub-pane oscillator bounded `[0, 100]`.\n * Like RSI but uses rolling stddev of the source instead of absolute\n * close changes for the magnitude, EMA-smoothed per TradingView's\n * `ta.rvi` reference. Composes `ta.ema` via two sub-slots\n * (`${slotId}/upEma`, `${slotId}/downEma`) \u2014 a fix to EMA's\n * recurrence flows in for free. NaN when either EMA arm is NaN or\n * when both arms are zero (zero-denominator).\n *\n * @formula sigma[t] = stddev(source[t \u2212 length + 1..= t]) ;\n * upRaw[t] = source[t] > source[t \u2212 1] ? sigma[t] : 0 ;\n * downRaw[t] = source[t] < source[t \u2212 1] ? sigma[t] : 0 ;\n * upEma = EMA(length)(upRaw) ;\n * downEma = EMA(length)(downRaw) ;\n * rvi[t] = 100 \u00B7 upEma[t] / (upEma[t] + downEma[t])\n * @warmup 2 \u00B7 length \u2212 1\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts the returned series so `series.current` reads\n * the value `offset` bars ago (PLAN.md \u00A79.1).\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const r = ta.rvi(bar.close, 10);\n * // plot(r);\n */\nexport function rvi(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: RviOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as RviSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n const sigma = tickSigma(slot, src);\n const diff = src - slot.prevSrc;\n const { up, down } = classify(sigma, diff);\n // Still drive the sub-slot EMAs so their tick-mode head stays\n // consistent with the closed state on a subsequent close.\n const upSeries = ema(`${slotId}/upEma`, up, slot.length);\n const downSeries = ema(`${slotId}/downEma`, down, slot.length);\n // NaN source short-circuits to NaN output regardless of how the\n // EMA arms forward-fill internally \u2014 RVI is undefined when the\n // current sample isn't measurable.\n const value = Number.isFinite(src)\n ? rviValue(upSeries.current, downSeries.current)\n : Number.NaN;\n slot.outBuffer.replaceHead(value);\n } else {\n const sigma = appendToSigmaWindow(slot, src);\n const diff = src - slot.prevSrc;\n const { up, down } = classify(sigma, diff);\n const upSeries = ema(`${slotId}/upEma`, up, slot.length);\n const downSeries = ema(`${slotId}/downEma`, down, slot.length);\n const value = Number.isFinite(src)\n ? rviValue(upSeries.current, downSeries.current)\n : Number.NaN;\n slot.outBuffer.append(value);\n slot.prevSrc = src;\n }\n return viewForOffset(slot, opts?.offset ?? 0);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// Ported from ../invinite/src/components/trading-chart/indicators/session-volume-profile.ts\n// @ 3234c8c0c3f9880d9d1e3a3ee63ebd55ddd535f4.\n// Translated, not transcribed \u2014 Series<T> shape, opts.offset, JSDoc.\n// See packages/runtime/src/ta/CLAUDE.md for the port convention.\n\nimport type {\n SessionVolumeProfileOpts,\n SessionVolumeProfileResult,\n} from \"@invinite-org/chartlang-core\";\n\nimport { pushDiagnostic } from \"../emit/index.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport {\n type VolumeProfileBar,\n type VolumeProfileCore,\n commitVolumeProfileSnapshot,\n createVolumeProfileCore,\n emitVolumeProfileHistogram,\n resolveVolumeProfileSnapshot,\n volumeProfileConfigFromOpts,\n} from \"./lib/volume-profile/index.js\";\n\nconst DAY_MS = 86_400_000;\n\ntype SessionVolumeProfileSlot = VolumeProfileCore & {\n readonly result: SessionVolumeProfileResult;\n readonly shiftedResults: Map<number, SessionVolumeProfileResult>;\n};\n\ntype MutableSessionVolumeProfileSlot = Omit<SessionVolumeProfileSlot, \"result\"> & {\n result: SessionVolumeProfileResult;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.sessionVolumeProfile called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): SessionVolumeProfileSlot {\n const core = createVolumeProfileCore(capacity);\n const slot: MutableSessionVolumeProfileSlot = {\n ...core,\n result: Object.freeze({\n get buckets() {\n return slot.buckets;\n },\n poc: makeSeriesView<number>(core.pocBuffer),\n valHigh: makeSeriesView<number>(core.valHighBuffer),\n valLow: makeSeriesView<number>(core.valLowBuffer),\n }),\n shiftedResults: new Map(),\n };\n return slot;\n}\n\nfunction resultForOffset(\n slot: SessionVolumeProfileSlot,\n offset: number,\n): SessionVolumeProfileResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n get buckets() {\n return slot.buckets;\n },\n poc: makeShiftedSeriesView<number>(slot.pocBuffer, offset),\n valHigh: makeShiftedSeriesView<number>(slot.valHighBuffer, offset),\n valLow: makeShiftedSeriesView<number>(slot.valLowBuffer, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\nfunction utcDayStart(time: number): number {\n return Math.floor(time / DAY_MS) * DAY_MS;\n}\n\nfunction parseSessionWindowMinutes(\n session: string,\n): { startMinutes: number; endMinutes: number } | null {\n const match = /^(\\d{1,2})(?::?(\\d{2}))?\\s*-\\s*(\\d{1,2})(?::?(\\d{2}))?$/.exec(session.trim());\n if (match === null) return null;\n const startHour = Number(match[1]);\n const startMinute = match[2] === undefined ? 0 : Number(match[2]);\n const endHour = Number(match[3]);\n const endMinute = match[4] === undefined ? 0 : Number(match[4]);\n if (startHour < 0 || startHour > 23 || startMinute < 0 || startMinute > 59) return null;\n if (endHour < 0 || endHour > 23 || endMinute < 0 || endMinute > 59) return null;\n return {\n startMinutes: startHour * 60 + startMinute,\n endMinutes: endHour * 60 + endMinute,\n };\n}\n\nfunction sessionBoundaryFromDescriptor(time: number, session: string): number | null {\n const parsed = parseSessionWindowMinutes(session);\n if (parsed === null) return null;\n const dayStart = utcDayStart(time);\n const boundary = dayStart + parsed.startMinutes * 60_000;\n return time >= boundary ? boundary : boundary - DAY_MS;\n}\n\nfunction diagnoseMissingSession(ctx: RuntimeContext, slotId: string): void {\n const key = `session-info-missing|${slotId}`;\n if (ctx.diagnosedRequestKeys.has(key)) return;\n ctx.diagnosedRequestKeys.add(key);\n pushDiagnostic(ctx.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"session-info-missing\",\n message:\n \"Adapter did not provide syminfo.session; ta.sessionVolumeProfile used UTC-day boundaries.\",\n slotId,\n bar: ctx.barIndex(),\n });\n}\n\nfunction resolveSessionStart(\n ctx: RuntimeContext,\n slotId: string,\n opts: SessionVolumeProfileOpts | undefined,\n): number {\n if (opts?.sessionStart !== undefined) return opts.sessionStart;\n const session = ctx.views.syminfo.session;\n if (!ctx.capabilities.symInfoFields.has(\"session\") || session === \"\") {\n diagnoseMissingSession(ctx, slotId);\n return utcDayStart(ctx.stream.bar.time);\n }\n const boundary = sessionBoundaryFromDescriptor(ctx.stream.bar.time, session);\n if (boundary === null) {\n diagnoseMissingSession(ctx, slotId);\n return utcDayStart(ctx.stream.bar.time);\n }\n return boundary;\n}\n\nfunction collectBars(ctx: RuntimeContext, sessionStart: number): ReadonlyArray<VolumeProfileBar> {\n const { ohlcv } = ctx.stream;\n const bars: VolumeProfileBar[] = [];\n for (let lookback = ohlcv.close.length - 1; lookback >= 0; lookback -= 1) {\n const time = ohlcv.time.at(lookback);\n if (time <= sessionStart) continue;\n bars.push({\n close: ohlcv.close.at(lookback),\n high: ohlcv.high.at(lookback),\n low: ohlcv.low.at(lookback),\n open: ohlcv.open.at(lookback),\n time,\n volume: ohlcv.volume.at(lookback),\n });\n }\n return bars;\n}\n\n/**\n * Session Volume Profile \u2014 bucketizes the current session's volume\n * by price, resetting when `bar.time` crosses the active session\n * boundary.\n *\n * @formula Port of invinite session-vp: find the current session\n * window, bucket volume by price, then derive POC / value-\n * area high / value-area low via the shared volume-profile\n * pipeline.\n * @anchors `syminfo.session` descriptor, or `opts.sessionStart`\n * override when provided.\n * @warmup NaN until a session window has positive volume; missing\n * `syminfo.session` falls back to UTC-day boundaries.\n * @since 0.5\n * @stable\n * @example\n * // import { plot, ta } from \"@invinite-org/chartlang-core\";\n * // const vp = ta.sessionVolumeProfile({ rowSize: 24 });\n * // plot(vp.poc, { style: { kind: \"horizontal-histogram\", buckets: vp.buckets } });\n */\nexport function sessionVolumeProfile(\n slotId: string,\n opts?: SessionVolumeProfileOpts,\n): SessionVolumeProfileResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as SessionVolumeProfileSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n\n const sessionStart = resolveSessionStart(ctx, slotId, opts);\n const bars = ctx.stream.bar.time <= sessionStart ? [] : collectBars(ctx, sessionStart);\n const snapshot = resolveVolumeProfileSnapshot({\n bars,\n bucketColor: opts?.bucketColor,\n config: volumeProfileConfigFromOpts(opts ?? {}),\n });\n commitVolumeProfileSnapshot(slot, ctx.isTick, snapshot);\n emitVolumeProfileHistogram(\n ctx,\n slotId,\n \"Session Volume Profile\",\n snapshot.poc,\n snapshot.buckets,\n );\n return resultForOffset(slot, opts?.offset ?? 0);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/smi.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n\nimport type { SmiOpts, SmiResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { ema } from \"./ema.js\";\nimport { highest } from \"./highest.js\";\nimport { lowest } from \"./lowest.js\";\n\nconst DEFAULT_K_LENGTH = 10;\nconst DEFAULT_FIRST = 3;\nconst DEFAULT_SECOND = 5;\nconst DEFAULT_D_LENGTH = 3;\n\ntype SmiSlot = {\n readonly result: SmiResult;\n readonly smiBuf: Float64RingBuffer;\n readonly signalBuf: Float64RingBuffer;\n readonly shiftedResults: Map<number, SmiResult>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.smi called outside an active script step\");\n }\n return ctx;\n}\n\nfunction resultForOffset(slot: SmiSlot, offset: number): SmiResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n smi: makeShiftedSeriesView<number>(slot.smiBuf, offset),\n signal: makeShiftedSeriesView<number>(slot.signalBuf, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\nfunction smiValue(numSmoothed: number, denSmoothed: number): number {\n if (!Number.isFinite(numSmoothed) || !Number.isFinite(denSmoothed) || denSmoothed === 0) {\n return Number.NaN;\n }\n return (100 * numSmoothed) / denSmoothed;\n}\n\n/**\n * Stochastic Momentum Index (William Blau). Composes `ta.highest` /\n * `ta.lowest` over `bar.high` / `bar.low` (`kLength` window) for the\n * rolling midpoint and range, then double-EMA-smooths both numerator\n * (`bar.close \u2212 midpoint`) and denominator (`range / 2`) through two\n * EMA layers (`firstSmoothing`, then `secondSmoothing`). The signal\n * line is a standard EMA(`dLength`) over the SMI output.\n *\n * Bounded `[-100, 100]` by construction (when defined). Flat-range\n * windows where the double-smoothed denominator collapses to zero\n * emit NaN at `smi` (and propagate to `signal`).\n *\n * Defaults: `(kLength, firstSmoothing, secondSmoothing, dLength) =\n * (10, 3, 5, 3)` \u2014 TradingView-canonical.\n *\n * The registry records `primarySeriesKey: \"smi\"`, `visibleSeriesKeys:\n * [\"smi\", \"signal\"]`, and `yDomain: { kind: \"fixed\", min: -100, max:\n * 100 }` via `TA_REGISTRY_METADATA`.\n *\n * @formula hh = highest(bar.high, kLength) ;\n * ll = lowest(bar.low, kLength) ;\n * cm = (hh + ll) / 2 ;\n * range = (hh - ll) / 2 ;\n * num = bar.close - cm ;\n * den = range ;\n * numSmoothed = EMA(secondSmoothing)(EMA(firstSmoothing)(num)) ;\n * denSmoothed = EMA(secondSmoothing)(EMA(firstSmoothing)(den)) ;\n * smi = 100 \u00B7 numSmoothed / denSmoothed ;\n * signal = EMA(dLength)(smi)\n * @warmup kLength + firstSmoothing + secondSmoothing + dLength \u2212 4\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const s = ta.smi(\"slot\");\n * // plot(s.smi); plot(s.signal);\n */\nexport function smi(slotId: string, opts?: SmiOpts): SmiResult {\n const ctx = getCtx();\n const kLength = opts?.kLength ?? DEFAULT_K_LENGTH;\n const firstSmoothing = opts?.firstSmoothing ?? DEFAULT_FIRST;\n const secondSmoothing = opts?.secondSmoothing ?? DEFAULT_SECOND;\n const dLength = opts?.dLength ?? DEFAULT_D_LENGTH;\n const offset = opts?.offset ?? 0;\n const isTick = ctx.isTick;\n const bar = ctx.stream.bar;\n\n const hh = highest(`${slotId}/hh`, bar.high, kLength).current;\n const ll = lowest(`${slotId}/ll`, bar.low, kLength).current;\n let num: number;\n let den: number;\n if (!Number.isFinite(hh) || !Number.isFinite(ll)) {\n num = Number.NaN;\n den = Number.NaN;\n } else {\n const cm = (hh + ll) / 2;\n num = bar.close - cm;\n den = (hh - ll) / 2;\n }\n\n const numFirst = ema(`${slotId}/nFirst`, num, firstSmoothing).current;\n const numSmoothed = ema(`${slotId}/nSecond`, numFirst, secondSmoothing).current;\n const denFirst = ema(`${slotId}/dFirst`, den, firstSmoothing).current;\n const denSmoothed = ema(`${slotId}/dSecond`, denFirst, secondSmoothing).current;\n const smiOut = smiValue(numSmoothed, denSmoothed);\n\n const signalSlotId = `${slotId}/signal`;\n const signalSeries = ema(signalSlotId, smiOut, dLength);\n\n let slot = ctx.stream.taSlots.get(slotId) as SmiSlot | undefined;\n if (slot === undefined) {\n const smiBuf = new Float64RingBuffer(ctx.stream.ohlcv.close.capacity);\n const emaSlot = ctx.stream.taSlots.get(signalSlotId) as {\n outBuffer: Float64RingBuffer;\n };\n slot = {\n result: Object.freeze({\n smi: makeSeriesView<number>(smiBuf),\n signal: signalSeries,\n }) as SmiResult,\n smiBuf,\n signalBuf: emaSlot.outBuffer,\n shiftedResults: new Map(),\n };\n ctx.stream.taSlots.set(slotId, slot);\n }\n\n if (isTick) {\n slot.smiBuf.replaceHead(smiOut);\n } else {\n slot.smiBuf.append(smiOut);\n }\n\n return resultForOffset(slot, offset);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/stoch.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape. Composition: `ta.highest`\n// + `ta.lowest` + two chained `ta.sma` layers (k-smoothing, then d).\n//\n// DIVERGENCE: invinite's flat-window (`hh === ll`) fallback returns\n// the prior valid kRaw (or 50 on the first slot). The task spec\n// (\u00A77) overrides this with NaN \u2014 we follow the spec, not invinite.\n// The plot-hash assertion for the conformance scenario reflects this\n// divergence.\n\nimport type { StochOpts, StochResult } from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { highest } from \"./highest.js\";\nimport { lowest } from \"./lowest.js\";\nimport { sma } from \"./sma.js\";\n\nconst DEFAULT_K_LENGTH = 14;\nconst DEFAULT_K_SMOOTHING = 3;\nconst DEFAULT_D_LENGTH = 3;\n\ntype StochSlot = {\n readonly result: StochResult;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.stoch called outside an active script step\");\n }\n return ctx;\n}\n\n/**\n * Stochastic Oscillator (%K + %D). Sources from `bar.high` / `bar.low`\n * / `bar.close` directly (no `source` arg \u2014 matches Pine). Composes\n * `ta.highest` + `ta.lowest` over `kLength`, two chained `ta.sma`\n * layers (`kSmoothing`, then `dLength`). Output bounded `[0, 100]`\n * (or `NaN`).\n *\n * Defaults `{ kLength: 14, kSmoothing: 3, dLength: 3 }`. The flat-\n * window (`hh === ll`) edge emits `NaN` at `k` (and propagates to\n * `d`) \u2014 diverges from invinite's prev-or-50 fallback per task spec.\n *\n * The registry records `primarySeriesKey: \"k\"`, `visibleSeriesKeys:\n * [\"k\", \"d\"]`, and `yDomain: { kind: \"fixed\", min: 0, max: 100 }`\n * via `TA_REGISTRY_METADATA`.\n *\n * @formula hh = highest(bar.high, kLength) ;\n * ll = lowest(bar.low, kLength) ;\n * kRaw = 100 \u00B7 (bar.close \u2212 ll) / (hh \u2212 ll) ; NaN if hh === ll ;\n * k = sma(kRaw, kSmoothing) ;\n * d = sma(k, dLength)\n * @warmup kLength + kSmoothing + dLength \u2212 3\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const s = ta.stoch(\"slot\", { kLength: 14, kSmoothing: 3, dLength: 3 });\n * // plot(s.k); plot(s.d);\n */\nexport function stoch(slotId: string, opts?: StochOpts): StochResult {\n const ctx = getCtx();\n const kLength = opts?.kLength ?? DEFAULT_K_LENGTH;\n const kSmoothing = opts?.kSmoothing ?? DEFAULT_K_SMOOTHING;\n const dLength = opts?.dLength ?? DEFAULT_D_LENGTH;\n const bar = ctx.stream.bar;\n\n const hhSeries = highest(`${slotId}/hh`, bar.high, kLength);\n const llSeries = lowest(`${slotId}/ll`, bar.low, kLength);\n const hh = hhSeries.current;\n const ll = llSeries.current;\n let kRaw: number;\n if (!Number.isFinite(hh) || !Number.isFinite(ll)) {\n kRaw = Number.NaN;\n } else if (hh === ll) {\n kRaw = Number.NaN;\n } else {\n kRaw = (100 * (bar.close - ll)) / (hh - ll);\n }\n\n const kSeries = sma(`${slotId}/kSmooth`, kRaw, kSmoothing);\n const dSeries = sma(`${slotId}/d`, kSeries.current, dLength);\n\n let slot = ctx.stream.taSlots.get(slotId) as StochSlot | undefined;\n if (slot === undefined) {\n slot = {\n result: Object.freeze({ k: kSeries, d: dSeries }),\n };\n ctx.stream.taSlots.set(slotId, slot);\n }\n return slot.result;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/stoch-rsi.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape. Composition: `ta.rsi` +\n// `ta.highest` + `ta.lowest` + two chained `ta.sma` layers, all via\n// sub-slot ids derived from the parent slot id.\n//\n// DIVERGENCE: invinite's flat-window (`hh === ll` of the RSI series)\n// fallback returns the prior valid kRaw (or 50 on the first slot).\n// The task spec (\u00A76) overrides this with NaN \u2014 we follow the spec.\n\nimport type { Series, StochRsiOpts, StochRsiResult } from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { highest } from \"./highest.js\";\nimport { lowest } from \"./lowest.js\";\nimport { rsi } from \"./rsi.js\";\nimport { sma } from \"./sma.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_RSI_LENGTH = 14;\nconst DEFAULT_STOCH_LENGTH = 14;\nconst DEFAULT_K_SMOOTHING = 3;\nconst DEFAULT_D_SMOOTHING = 3;\n\ntype StochRsiSlot = {\n readonly result: StochRsiResult;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.stochRsi called outside an active script step\");\n }\n return ctx;\n}\n\n/**\n * Stochastic of the Wilder RSI series (%K + %D). Composes\n * `ta.rsi(source, rsiLength)`, then applies the Stochastic transform\n * (`ta.highest` + `ta.lowest` over `stochLength`), then smooths via\n * `ta.sma(kSmoothing)` for `k` and `ta.sma(dSmoothing)` on `k` for\n * `d`. Output bounded `[0, 100]` (or `NaN`).\n *\n * Defaults `{ rsiLength: 14, stochLength: 14, kSmoothing: 3,\n * dSmoothing: 3 }`. The flat-window (`hh === ll` of the RSI series)\n * edge emits `NaN` at `k` (and propagates to `d`) \u2014 diverges from\n * invinite's prev-or-50 fallback per task spec.\n *\n * The registry records `primarySeriesKey: \"k\"`, `visibleSeriesKeys:\n * [\"k\", \"d\"]`, and `yDomain: { kind: \"fixed\", min: 0, max: 100 }`\n * via `TA_REGISTRY_METADATA`.\n *\n * @formula rsi = rsi(source, rsiLength) ;\n * hh = highest(rsi, stochLength) ;\n * ll = lowest(rsi, stochLength) ;\n * kRaw = 100 \u00B7 (rsi \u2212 ll) / (hh \u2212 ll) ; NaN if hh === ll ;\n * k = sma(kRaw, kSmoothing) ;\n * d = sma(k, dSmoothing)\n * @warmup rsiLength + stochLength + kSmoothing + dSmoothing \u2212 4\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const s = ta.stochRsi(\"slot\", bar.close);\n * // plot(s.k); plot(s.d);\n */\nexport function stochRsi(\n slotId: string,\n source: ScalarOrSeries,\n opts?: StochRsiOpts,\n): StochRsiResult {\n const ctx = getCtx();\n const rsiLength = opts?.rsiLength ?? DEFAULT_RSI_LENGTH;\n const stochLength = opts?.stochLength ?? DEFAULT_STOCH_LENGTH;\n const kSmoothing = opts?.kSmoothing ?? DEFAULT_K_SMOOTHING;\n const dSmoothing = opts?.dSmoothing ?? DEFAULT_D_SMOOTHING;\n\n const src = readSourceValue(source);\n const rsiSeries = rsi(`${slotId}/rsi`, src, rsiLength);\n const rsiCurrent = rsiSeries.current;\n const hhSeries = highest(`${slotId}/hh`, rsiCurrent, stochLength);\n const llSeries = lowest(`${slotId}/ll`, rsiCurrent, stochLength);\n const hh = hhSeries.current;\n const ll = llSeries.current;\n let kRaw: number;\n if (!Number.isFinite(hh) || !Number.isFinite(ll) || !Number.isFinite(rsiCurrent)) {\n kRaw = Number.NaN;\n } else if (hh === ll) {\n kRaw = Number.NaN;\n } else {\n kRaw = (100 * (rsiCurrent - ll)) / (hh - ll);\n }\n\n const kSeries = sma(`${slotId}/kSmooth`, kRaw, kSmoothing);\n const dSeries = sma(`${slotId}/d`, kSeries.current, dSmoothing);\n\n let slot = ctx.stream.taSlots.get(slotId) as StochRsiSlot | undefined;\n if (slot === undefined) {\n slot = {\n result: Object.freeze({ k: kSeries, d: dSeries } as {\n k: Series<number>;\n d: Series<number>;\n }),\n };\n ctx.stream.taSlots.set(slotId, slot);\n }\n return slot.result;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/supertrend.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Supertrend composes Phase-1 `ta.atr` at\n// sub-slot `${slotId}/atr`, so a fix to ATR flows in for free. The\n// source is hard-coded to `hl2` (Pine-canonical Supertrend); a\n// `source` opt could land in a follow-up.\n\nimport type { Series, SupertrendOpts, SupertrendResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { atr } from \"./atr.js\";\n\nconst DEFAULT_LENGTH = 10;\nconst DEFAULT_MULTIPLIER = 3;\n\nconst TREND_UP = 1;\nconst TREND_DOWN = -1;\n\ntype Trend = 1 | -1;\n\ntype SupertrendSlot = {\n readonly outputs: SupertrendResult;\n readonly lineBuffer: Float64RingBuffer;\n readonly directionBuffer: Float64RingBuffer;\n readonly length: number;\n readonly multiplier: number;\n /** Number of CLOSED bars folded into the slot WITH FINITE ATR\n * so far \u2014 i.e. bars where the Supertrend recurrence advanced. */\n warmBarCount: number;\n // Live recurrence state.\n prevFinalUpper: number;\n prevFinalLower: number;\n prevDirection: Trend;\n /** Close of the most recent CLOSED bar \u2014 feeds the\n * `close[i - 1] > finalUpper[i - 1]` clamp in the next close. */\n prevClose: number;\n // Snapshot-at-start-of-current-bar \u2014 captured each close BEFORE\n // the recurrence advances so a final tick replays from the seed.\n prevClosedFinalUpper: number;\n prevClosedFinalLower: number;\n prevClosedDirection: Trend;\n /** Close of the bar BEFORE the current bar \u2014 i.e. the close\n * 2 bars ago at the start of this bar. */\n prevClosedPrevClose: number;\n prevClosedWarmBarCount: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.supertrend called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number, length: number, multiplier: number): SupertrendSlot {\n const lineBuffer = new Float64RingBuffer(capacity);\n const directionBuffer = new Float64RingBuffer(capacity);\n return {\n outputs: Object.freeze({\n line: makeSeriesView<number>(lineBuffer),\n direction: makeSeriesView<number>(directionBuffer),\n }),\n lineBuffer,\n directionBuffer,\n length,\n multiplier,\n warmBarCount: 0,\n prevFinalUpper: Number.NaN,\n prevFinalLower: Number.NaN,\n prevDirection: TREND_UP,\n prevClose: Number.NaN,\n prevClosedFinalUpper: Number.NaN,\n prevClosedFinalLower: Number.NaN,\n prevClosedDirection: TREND_UP,\n prevClosedPrevClose: Number.NaN,\n prevClosedWarmBarCount: 0,\n };\n}\n\nfunction snapshot(slot: SupertrendSlot): void {\n slot.prevClosedFinalUpper = slot.prevFinalUpper;\n slot.prevClosedFinalLower = slot.prevFinalLower;\n slot.prevClosedDirection = slot.prevDirection;\n slot.prevClosedPrevClose = slot.prevClose;\n slot.prevClosedWarmBarCount = slot.warmBarCount;\n}\n\n/**\n * One step of the Supertrend recurrence given the snapshot of the\n * prior CLOSED bar's `(finalUpper, finalLower, direction, prevClose)`\n * and this bar's `mid` / `atr` / `close`. Returns the new\n * `(finalUpper, finalLower, direction, line)`. Used by both close\n * and tick. Caller decides whether to seed (first warm bar) or run\n * the recurrence based on the snapshot's `warmBarCount`.\n */\nfunction recurrenceStep(\n mid: number,\n atrValue: number,\n close: number,\n multiplier: number,\n prevFinalUpper: number,\n prevFinalLower: number,\n prevDirection: Trend,\n prevClose: number,\n): { finalUpper: number; finalLower: number; direction: Trend; line: number } {\n const basicUpper = mid + multiplier * atrValue;\n const basicLower = mid - multiplier * atrValue;\n const finalUpper =\n basicUpper < prevFinalUpper || prevClose > prevFinalUpper ? basicUpper : prevFinalUpper;\n const finalLower =\n basicLower > prevFinalLower || prevClose < prevFinalLower ? basicLower : prevFinalLower;\n let direction: Trend = prevDirection;\n if (close > prevFinalUpper) {\n direction = TREND_UP;\n } else if (close < prevFinalLower) {\n direction = TREND_DOWN;\n }\n const line = direction === TREND_UP ? finalLower : finalUpper;\n return { finalUpper, finalLower, direction, line };\n}\n\nfunction closeStep(\n slot: SupertrendSlot,\n mid: number,\n atrValue: number,\n close: number,\n): { line: number; direction: number } {\n // NaN inputs (incl. NaN ATR during warmup) freeze state.\n if (!Number.isFinite(mid) || !Number.isFinite(atrValue) || !Number.isFinite(close)) {\n return { line: Number.NaN, direction: Number.NaN };\n }\n snapshot(slot);\n slot.warmBarCount += 1;\n\n // First warm bar: seed. Set finalUpper / finalLower from the\n // basic bands, direction = +1, line = finalLower. (Matches\n // invinite's `supertrend.ts:99-111`.)\n if (slot.prevClosedWarmBarCount === 0) {\n const basicUpper = mid + slot.multiplier * atrValue;\n const basicLower = mid - slot.multiplier * atrValue;\n slot.prevFinalUpper = basicUpper;\n slot.prevFinalLower = basicLower;\n slot.prevDirection = TREND_UP;\n slot.prevClose = close;\n return { line: basicLower, direction: TREND_UP };\n }\n\n const step = recurrenceStep(\n mid,\n atrValue,\n close,\n slot.multiplier,\n slot.prevFinalUpper,\n slot.prevFinalLower,\n slot.prevDirection,\n slot.prevClose,\n );\n slot.prevFinalUpper = step.finalUpper;\n slot.prevFinalLower = step.finalLower;\n slot.prevDirection = step.direction;\n slot.prevClose = close;\n return { line: step.line, direction: step.direction };\n}\n\nfunction tickStep(\n slot: SupertrendSlot,\n mid: number,\n atrValue: number,\n close: number,\n): { line: number; direction: number } {\n if (!Number.isFinite(mid) || !Number.isFinite(atrValue) || !Number.isFinite(close)) {\n return { line: Number.NaN, direction: Number.NaN };\n }\n // Replay from snapshot.\n if (slot.prevClosedWarmBarCount === 0) {\n // The current bar is the FIRST warm bar \u2014 its tick replay\n // re-derives the seed (line = finalLower, direction = +1).\n const basicLower = mid - slot.multiplier * atrValue;\n return { line: basicLower, direction: TREND_UP };\n }\n const step = recurrenceStep(\n mid,\n atrValue,\n close,\n slot.multiplier,\n slot.prevClosedFinalUpper,\n slot.prevClosedFinalLower,\n slot.prevClosedDirection,\n slot.prevClosedPrevClose,\n );\n return { line: step.line, direction: step.direction };\n}\n\n/**\n * Supertrend \u2014 ATR-driven trailing-stop trend follower. Computes\n * `basicUpper / basicLower = hl2 \u00B1 multiplier \u00B7 atr(length)` per\n * bar, smooths to `finalUpper / finalLower` via the standard\n * persistence rule (carry forward unless the prior close pierced\n * the band), and emits a single `line` Series equal to the active\n * final band for the current direction. `direction` flips when\n * `close` crosses the prior `finalUpper` (\u2192 `+1`) or `finalLower`\n * (\u2192 `-1`). Composes Phase-1 `ta.atr` at sub-slot `${slotId}/atr`.\n *\n * NaN ATR (warmup or NaN-propagation) \u2192 NaN outputs; local state\n * freezes so the next finite bar resumes from the prior closed\n * state. Returns a cached `{ line, direction }` record\n * (same identity every bar). Warmup is `length` \u2014 the same as\n * `ta.atr`'s warmup, since Supertrend cannot run until ATR is warm.\n *\n * @formula basicUpper = hl2 + multiplier \u00B7 atr ;\n * basicLower = hl2 \u2212 multiplier \u00B7 atr ;\n * finalUpper = basicUpper < prevFinalUpper || prevClose > prevFinalUpper ? basicUpper : prevFinalUpper ;\n * finalLower = basicLower > prevFinalLower || prevClose < prevFinalLower ? basicLower : prevFinalLower ;\n * direction = close > prevFinalUpper ? +1 : close < prevFinalLower ? \u22121 : prevDirection ;\n * line = direction === +1 ? finalLower : finalUpper\n * @warmup length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const s = ta.supertrend({ length: 10, multiplier: 3 });\n * // plot(s.line);\n */\nexport function supertrend(slotId: string, opts?: SupertrendOpts): SupertrendResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as SupertrendSlot | undefined;\n if (slot === undefined) {\n const length = opts?.length ?? DEFAULT_LENGTH;\n const multiplier = opts?.multiplier ?? DEFAULT_MULTIPLIER;\n slot = initSlot(ctx.stream.ohlcv.close.capacity, length, multiplier);\n ctx.stream.taSlots.set(slotId, slot);\n }\n // Compose: ta.atr at a sub-slot. The composed call routes\n // through the registry and respects ctx.isTick automatically.\n const atrSeries: Series<number> = atr(`${slotId}/atr`, slot.length);\n const mid = ctx.stream.bar.hl2;\n const atrValue = atrSeries.current;\n const close = ctx.stream.bar.close;\n if (ctx.isTick) {\n const { line, direction } = tickStep(slot, mid, atrValue, close);\n slot.lineBuffer.replaceHead(line);\n slot.directionBuffer.replaceHead(direction);\n } else {\n const { line, direction } = closeStep(slot, mid, atrValue, close);\n slot.lineBuffer.append(line);\n slot.directionBuffer.append(direction);\n }\n return slot.outputs;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/tema.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. TEMA composes three EMA sub-slots derived\n// from the parent slot id.\n\nimport type { Series, TemaOpts } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { ema } from \"./ema.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype TemaSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.tema called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): TemaSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n };\n}\n\n/**\n * Triple Exponential Moving Average \u2014\n * `TEMA = 3\u00B7EMA(src) \u2212 3\u00B7EMA(EMA(src)) + EMA(EMA(EMA(src)))`. Composes\n * three EMA sub-slots derived from the parent slot id\n * (`${slotId}/ema1`, `${slotId}/ema2`, `${slotId}/ema3`). Each outer\n * EMA reads the inner EMA's `.current` scalar each bar; the parent\n * slot allocates its own `outBuffer + series` because the output is a\n * linear combination of the three sub-slots. Mirrors the DEMA / MACD\n * sub-slot pattern.\n *\n * @formula ema1 = EMA(source, length) ;\n * ema2 = EMA(ema1, length) ;\n * ema3 = EMA(ema2, length) ;\n * out = 3 \u00B7 ema1 \u2212 3 \u00B7 ema2 + ema3\n * @warmup 3 \u00B7 length \u2212 3\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const t = ta.tema(bar.close, 20);\n * // plot(t);\n */\nexport function tema(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: TemaOpts,\n): Series<number> {\n const ctx = getCtx();\n const src = readSourceValue(source);\n const e1 = ema(`${slotId}/ema1`, src, length).current;\n const e2 = ema(`${slotId}/ema2`, e1, length).current;\n const e3 = ema(`${slotId}/ema3`, e2, length).current;\n const value =\n Number.isFinite(e1) && Number.isFinite(e2) && Number.isFinite(e3)\n ? 3 * e1 - 3 * e2 + e3\n : Number.NaN;\n\n let slot = ctx.stream.taSlots.get(slotId) as TemaSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n if (ctx.isTick) slot.outBuffer.replaceHead(value);\n else slot.outBuffer.append(value);\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/trend-strength-index.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Named `trendStrengthIndex` to disambiguate\n// from the existing `ta.tsi` (Task 14 momentum True Strength Index).\n// The math is TradingView's documented Pearson-of-price-vs-bar-index\n// formulation \u2014 `lib/pearson.ts` (Task 4) is the reference helper.\n\nimport type { Series, TrendStrengthIndexOpts } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype TrendStrengthIndexSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /** Rolling window of recent source values, most-recent first\n * (`at(0)` = head, `at(length - 1)` = oldest). */\n readonly sourceWindow: Float64RingBuffer;\n /** Number of CLOSED bars folded into the slot so far. */\n barCount: number;\n /** Number of NaN values currently in the window \u2014 when > 0 the\n * Pearson denominator is undefined and the primitive emits NaN. */\n nanCount: number;\n /** The source value evicted on the current close (the tail value\n * popped when the window was full at append time). Used by tick\n * replay to restore the window to its pre-close state. */\n evictedSource: number;\n /** `nanCount` AS OF THE PRIOR CLOSE \u2014 restored by tick replay\n * before substituting the tick's contribution. */\n prevClosedNanCount: number;\n readonly shiftedViews: Map<number, Series<number>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.trendStrengthIndex called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): TrendStrengthIndexSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n sourceWindow: new Float64RingBuffer(length),\n barCount: 0,\n nanCount: 0,\n evictedSource: Number.NaN,\n prevClosedNanCount: 0,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: TrendStrengthIndexSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\n/**\n * Compute Pearson correlation between the trailing source window and a\n * matching length-`n` linear bar-index series `[0, 1, ..., n-1]`.\n * Mirrors `lib/pearson.ts`'s two-pass mean/covariance formulation\n * exactly (sum then mean, then per-slot deviations) so the property\n * test's full-recompute reference and the incremental head agree\n * within Float64 noise. Returns NaN if any slot is non-finite or the\n * source-side window variance is exactly zero.\n */\nfunction pearsonHead(window: Float64RingBuffer, length: number, headSource: number): number {\n let sumX = 0;\n let sumY = 0;\n for (let k = 0; k < length; k += 1) {\n const x = k === length - 1 ? headSource : window.at(length - 1 - k);\n // Defensive: callers gate on `nanCount === 0` so every window\n // slot is finite when we get here; the `headSource` is also\n // guarded upstream.\n /* c8 ignore next */\n if (!Number.isFinite(x)) return Number.NaN;\n sumX += x;\n sumY += k;\n }\n const meanX = sumX / length;\n const meanY = sumY / length;\n let sumXY = 0;\n let sumXX = 0;\n let sumYY = 0;\n for (let k = 0; k < length; k += 1) {\n const x = k === length - 1 ? headSource : window.at(length - 1 - k);\n const dX = x - meanX;\n const dY = k - meanY;\n sumXY += dX * dY;\n sumXX += dX * dX;\n sumYY += dY * dY;\n }\n if (sumXX === 0 || sumYY === 0) return Number.NaN;\n const r = sumXY / Math.sqrt(sumXX * sumYY);\n if (r < -1) return -1;\n if (r > 1) return 1;\n return r;\n}\n\nfunction closeStep(slot: TrendStrengthIndexSlot, src: number): number {\n slot.prevClosedNanCount = slot.nanCount;\n\n // Update the rolling window. If the window is full, the tail\n // (oldest) value is about to be evicted by `append` \u2014 capture it\n // and adjust the NaN count.\n if (slot.sourceWindow.length >= slot.length) {\n slot.evictedSource = slot.sourceWindow.at(slot.length - 1);\n if (Number.isNaN(slot.evictedSource)) slot.nanCount -= 1;\n } else {\n slot.evictedSource = Number.NaN;\n }\n slot.sourceWindow.append(src);\n if (!Number.isFinite(src)) slot.nanCount += 1;\n\n slot.barCount += 1;\n\n if (slot.barCount < slot.length) return Number.NaN;\n if (slot.nanCount > 0) return Number.NaN;\n return pearsonHead(slot.sourceWindow, slot.length, src);\n}\n\nfunction tickStep(slot: TrendStrengthIndexSlot, src: number): number {\n if (slot.barCount < slot.length) return Number.NaN;\n // Re-derive NaN count: start from the prior closed count,\n // un-account for the value evicted by the current close, and\n // account for the tick's substituted value at age 0.\n let nanCount = slot.prevClosedNanCount;\n // Defensive: `evictedSource` is only NaN when the close-side advance\n // evicted a NaN, requiring an earlier NaN bar in the stream that\n // we then tick on. Reachable but rare.\n /* c8 ignore next */\n if (Number.isNaN(slot.evictedSource)) nanCount -= 1;\n if (!Number.isFinite(src)) nanCount += 1;\n if (nanCount > 0) return Number.NaN;\n return pearsonHead(slot.sourceWindow, slot.length, src);\n}\n\n/**\n * Trend Strength Index \u2014 Pearson correlation between `source` and the\n * bar index over each trailing `length`-bar window. Bounded `[-1, +1]`:\n * `+1` = clean uptrend (price rises monotonically with bar index), `\u22121`\n * = clean downtrend, `0` = no linear trend. Distinct from\n * `ta.tsi` (Task 14's True Strength Index \u2014 a momentum oscillator).\n * The math is TradingView's documented Trend Strength Index\n * (https://www.tradingview.com/support/solutions/43000730926-trend-strength-index/).\n *\n * Default `length = 20` per chartlang task spec (invinite plugin\n * default is `14`).\n *\n * @formula meanX = \u03A3x / n ; meanY = \u03A3y / n ; n = length ;\n * num = \u03A3((x \u2212 meanX)(y \u2212 meanY)) ;\n * den = sqrt(\u03A3(x \u2212 meanX)\u00B2 \u00B7 \u03A3(y \u2212 meanY)\u00B2) ;\n * tsi = clamp(num / den, \u22121, +1) ;\n * NaN if the source window has zero variance, the index\n * variance is zero (`length < 2`), or any window slot is\n * non-finite.\n * @warmup length \u2212 1\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts the returned series so `series.current` reads\n * the value `offset` bars ago (PLAN.md \u00A79.1).\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const t = ta.trendStrengthIndex(\"slot\", bar.close, 20);\n * // plot(t);\n */\nexport function trendStrengthIndex(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: TrendStrengthIndexOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as TrendStrengthIndexSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickStep(slot, src));\n } else {\n slot.outBuffer.append(closeStep(slot, src));\n }\n return viewForOffset(slot, opts?.offset ?? 0);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/trix.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. TRIX composes three EMA sub-slots derived\n// from the parent slot id (`${slotId}/ema1` / `/ema2` / `/ema3`) for\n// the triple-smoothing chain plus a fourth `${slotId}/signal` EMA\n// over the TRIX line. Mirrors the MACD sub-slot composition pattern.\n\nimport type { Series, TrixOpts, TrixResult } from \"@invinite-org/chartlang-core\";\n\nimport { ema } from \"./ema.js\";\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_SIGNAL = 9;\n\ntype TrixSlot = {\n readonly result: TrixResult;\n readonly trixBuffer: Float64RingBuffer;\n /** Closed `ema3` as of the prior closed bar \u2014 divisor for the\n * next close's TRIX. */\n prevClosedEma3: number;\n /** Closed `ema3` as of the bar BEFORE the prior closed bar \u2014\n * used by tick replay (the current bar's \"prior\" is two closes\n * back from a tick on the in-progress bar). */\n prevPrevClosedEma3: number;\n /**\n * Per-offset frozen `TrixResult` cache. `offset === 0` returns\n * `result` by identity. Non-zero offsets get a frozen result\n * whose two Series are `makeShiftedSeriesView` proxies over the\n * same two underlying ring buffers.\n */\n readonly shiftedResults: Map<number, TrixResult>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.trix called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number, signalSeries: Series<number>): TrixSlot {\n const trixBuffer = new Float64RingBuffer(capacity);\n return {\n result: Object.freeze({\n trix: makeSeriesView<number>(trixBuffer),\n signal: signalSeries,\n }),\n trixBuffer,\n prevClosedEma3: Number.NaN,\n prevPrevClosedEma3: Number.NaN,\n shiftedResults: new Map(),\n };\n}\n\nfunction resultForOffset(slot: TrixSlot, offset: number, signalBuf: Float64RingBuffer): TrixResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n trix: makeShiftedSeriesView<number>(slot.trixBuffer, offset),\n signal: makeShiftedSeriesView<number>(signalBuf, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\n/**\n * TRIX \u2014 triple-smoothed EMA rate-of-change momentum oscillator\n * with an EMA-signal line. Composes three EMA sub-slots derived\n * from the parent slot id (`${slotId}/ema1` / `/ema2` / `/ema3`)\n * for the triple-smoothing chain, then computes\n * `100 \u00B7 (ema3[t] \u2212 ema3[t\u22121]) / ema3[t\u22121]` per bar, and folds the\n * result into a fourth EMA sub-slot (`${slotId}/signal`) for the\n * signal line.\n *\n * @formula ema1 = EMA(source, length) ;\n * ema2 = EMA(ema1, length) ;\n * ema3 = EMA(ema2, length) ;\n * trix[t] = ema3[t-1] === 0 ? NaN : 100 \u00B7 (ema3[t] \u2212 ema3[t-1]) / ema3[t-1] ;\n * signal[t] = EMA(trix, signalLength)\n * @warmup 3 \u00B7 length + signalLength \u2212 3 (first defined `signal` index ;\n * trix line first defined at `3 \u00B7 length \u2212 2`)\n * @anchors length, signalLength\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts both outputs in lockstep (PLAN.md \u00A79.1) \u2014\n * `series.current` on each output returns the value `offset` bars\n * ago.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const t = ta.trix(\"slot\", bar.close, 18);\n * // plot(t.trix);\n * // plot(t.signal);\n */\nexport function trix(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: TrixOpts,\n): TrixResult {\n const ctx = getCtx();\n const signalLength = opts?.signalLength ?? DEFAULT_SIGNAL;\n const offset = opts?.offset ?? 0;\n const src = readSourceValue(source);\n\n // Triple-smoothing chain. Each outer EMA reads the prior EMA's\n // `.current` scalar.\n const e1 = ema(`${slotId}/ema1`, src, length).current;\n const e2 = ema(`${slotId}/ema2`, e1, length).current;\n const e3 = ema(`${slotId}/ema3`, e2, length).current;\n\n let slot = ctx.stream.taSlots.get(slotId) as TrixSlot | undefined;\n // The TRIX divisor on the current bar is the prior closed `ema3`.\n // On close-side we use `prevClosedEma3` (set at the previous close\n // \u2014 this is `ema3[t-1]` from the script-author's view). On ticks\n // we use `prevPrevClosedEma3` (set two closes back) because the\n // CURRENT bar's close has not yet happened \u2014 tick replay's \"prev\n // closed ema3\" is still two closes back.\n let prevE3: number;\n if (slot === undefined) prevE3 = Number.NaN;\n else if (ctx.isTick) prevE3 = slot.prevPrevClosedEma3;\n else prevE3 = slot.prevClosedEma3;\n const trixValue =\n Number.isFinite(e3) && Number.isFinite(prevE3) && prevE3 !== 0\n ? (100 * (e3 - prevE3)) / prevE3\n : Number.NaN;\n // Feed the TRIX value into the signal EMA. Always read the\n // un-shifted view; offset shifting for the composite result is\n // handled locally via `resultForOffset`.\n const signalSeries = ema(`${slotId}/signal`, trixValue, signalLength);\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity, signalSeries);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const signalSubSlot = ctx.stream.taSlots.get(`${slotId}/signal`) as {\n outBuffer: Float64RingBuffer;\n };\n\n if (ctx.isTick) {\n slot.trixBuffer.replaceHead(trixValue);\n // Signal EMA's tick was handled by its own `ema()` call above.\n } else {\n slot.trixBuffer.append(trixValue);\n // Roll the prev-prev snapshot forward BEFORE overwriting\n // `prevClosedEma3` so tick replay on the next bar reads the\n // correct two-closes-back value.\n slot.prevPrevClosedEma3 = slot.prevClosedEma3;\n if (Number.isFinite(e3)) {\n slot.prevClosedEma3 = e3;\n }\n }\n return resultForOffset(slot, offset, signalSubSlot.outBuffer);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/tsi.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n\nimport type { TsiOpts, TsiResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { ema } from \"./ema.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_FIRST = 25;\nconst DEFAULT_SECOND = 13;\nconst DEFAULT_SIGNAL = 13;\n\ntype TsiSlot = {\n readonly result: TsiResult;\n readonly tsiBuf: Float64RingBuffer;\n readonly signalBuf: Float64RingBuffer;\n readonly shiftedResults: Map<number, TsiResult>;\n prevSrc: number;\n prevClosedSrc: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.tsi called outside an active script step\");\n }\n return ctx;\n}\n\nfunction resultForOffset(slot: TsiSlot, offset: number): TsiResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n tsi: makeShiftedSeriesView<number>(slot.tsiBuf, offset),\n signal: makeShiftedSeriesView<number>(slot.signalBuf, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\nfunction tsiValue(num: number, den: number): number {\n if (!Number.isFinite(num) || !Number.isFinite(den) || den === 0) return Number.NaN;\n return (100 * num) / den;\n}\n\n/**\n * True Strength Index (William Blau). Double-EMA-smoothed ratio of\n * one-bar price changes vs their absolute values, scaled \u00D7100. Per\n * TradingView's published formula:\n *\n * `mom = source[t] \u2212 source[t-1]`\n * `absMom = |mom|`\n * `ema1 = EMA(firstSmoothing)(mom)`\n * `ema2 = EMA(secondSmoothing)(ema1)`\n * `absEma1 = EMA(firstSmoothing)(absMom)`\n * `absEma2 = EMA(secondSmoothing)(absEma1)`\n * `tsi = 100 \u00D7 ema2 / absEma2`\n * `signal = EMA(signalLength)(tsi)`\n *\n * Bounded `[-100, 100]` by construction (when defined). Flat-input\n * windows where `absEma2` collapses to zero emit NaN at `tsi` (and\n * propagate to `signal`). Defaults `(firstSmoothing, secondSmoothing,\n * signalLength) = (25, 13, 13)`.\n *\n * Note: Pine's `ta.tsi()` returns the raw `ema2 / absEma2` ratio\n * (no \u00D7100). chartlang follows TradingView's published TSI study\n * (\u00D7100); for the raw ratio, divide by 100.\n *\n * @formula see above\n * @warmup firstSmoothing + secondSmoothing + signalLength \u2212 3\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const t = ta.tsi(\"slot\", bar.close);\n * // plot(t.tsi); plot(t.signal);\n */\nexport function tsi(slotId: string, source: ScalarOrSeries, opts?: TsiOpts): TsiResult {\n const ctx = getCtx();\n const firstSmoothing = opts?.firstSmoothing ?? DEFAULT_FIRST;\n const secondSmoothing = opts?.secondSmoothing ?? DEFAULT_SECOND;\n const signalLength = opts?.signalLength ?? DEFAULT_SIGNAL;\n const offset = opts?.offset ?? 0;\n const signalSlotId = `${slotId}/signal`;\n const isTick = ctx.isTick;\n const src = readSourceValue(source);\n\n let slot = ctx.stream.taSlots.get(slotId) as TsiSlot | undefined;\n // The `?? Number.NaN` fallbacks below are defensive: the runner\n // always close-side advances before tick, so `slot` exists by the\n // time `isTick` is true; on close-side the first-bar `slot` is\n // still undefined and we want NaN momentum (no prior bar).\n const prevForDiff = isTick\n ? /* c8 ignore next */ (slot?.prevClosedSrc ?? Number.NaN)\n : (slot?.prevSrc ?? Number.NaN);\n const mom =\n Number.isFinite(src) && Number.isFinite(prevForDiff) ? src - prevForDiff : Number.NaN;\n const absMom = Number.isFinite(mom) ? Math.abs(mom) : Number.NaN;\n\n const momEma1 = ema(`${slotId}/momEma1`, mom, firstSmoothing).current;\n const momEma2 = ema(`${slotId}/momEma2`, momEma1, secondSmoothing).current;\n const absEma1 = ema(`${slotId}/absMomEma1`, absMom, firstSmoothing).current;\n const absEma2 = ema(`${slotId}/absMomEma2`, absEma1, secondSmoothing).current;\n const tsiOut = tsiValue(momEma2, absEma2);\n\n const signalSeries = ema(signalSlotId, tsiOut, signalLength);\n\n if (slot === undefined) {\n const tsiBuf = new Float64RingBuffer(ctx.stream.ohlcv.close.capacity);\n const emaSlot = ctx.stream.taSlots.get(signalSlotId) as {\n outBuffer: Float64RingBuffer;\n };\n slot = {\n result: Object.freeze({\n tsi: makeSeriesView<number>(tsiBuf),\n signal: signalSeries,\n }),\n tsiBuf,\n signalBuf: emaSlot.outBuffer,\n shiftedResults: new Map(),\n prevSrc: src,\n prevClosedSrc: Number.NaN,\n };\n ctx.stream.taSlots.set(slotId, slot);\n slot.tsiBuf.append(tsiOut);\n return resultForOffset(slot, offset);\n }\n\n if (isTick) {\n slot.tsiBuf.replaceHead(tsiOut);\n } else {\n slot.tsiBuf.append(tsiOut);\n slot.prevClosedSrc = slot.prevSrc;\n slot.prevSrc = src;\n }\n\n return resultForOffset(slot, offset);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/ulcer-index.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Composes `ta.highest` via the sub-slot id\n// `${slotId}/highest` so a fix to `highest` flows through.\n\nimport type { Series, UlcerIndexOpts } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { highest } from \"./highest.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype UlcerIndexSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /** Sub-slot id passed to `ta.highest` for the rolling-max term. */\n readonly highestSub: string;\n /**\n * Closed-bar `drawdown_pct^2` values across the trailing `length`\n * bars (capacity `length`). `at(0)` is the head; older slots index\n * upward.\n */\n readonly drawdownSqWindow: Float64RingBuffer;\n sumDrawdownSq: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.ulcerIndex called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(slotId: string, length: number, capacity: number): UlcerIndexSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n highestSub: `${slotId}/highest`,\n drawdownSqWindow: new Float64RingBuffer(length),\n sumDrawdownSq: 0,\n };\n}\n\nfunction drawdownSquared(src: number, maxSrc: number): number {\n if (!Number.isFinite(src) || !Number.isFinite(maxSrc) || maxSrc === 0) {\n return Number.NaN;\n }\n const dd = (100 * (src - maxSrc)) / maxSrc;\n return dd * dd;\n}\n\nfunction closeValue(slot: UlcerIndexSlot, src: number, maxSrc: number): number {\n const ddSq = drawdownSquared(src, maxSrc);\n if (!Number.isFinite(ddSq)) {\n // Per task spec \u00A76 (NaN handling): NaN source \u2192 NaN output.\n // Do NOT advance the window \u2014 preserves the previous closed\n // state for the next bar to consume.\n return Number.NaN;\n }\n if (slot.drawdownSqWindow.length === slot.length) {\n // Window full: evict the oldest before append.\n slot.sumDrawdownSq -= slot.drawdownSqWindow.at(slot.length - 1);\n }\n slot.drawdownSqWindow.append(ddSq);\n slot.sumDrawdownSq += ddSq;\n return Math.sqrt(slot.sumDrawdownSq / slot.drawdownSqWindow.length);\n}\n\nfunction tickValue(slot: UlcerIndexSlot, src: number, maxSrc: number): number {\n if (slot.drawdownSqWindow.length === 0) return Number.NaN;\n const ddSq = drawdownSquared(src, maxSrc);\n if (!Number.isFinite(ddSq)) return Number.NaN;\n // Substitute the tick's ddSq for the head slot's ddSq without\n // mutating the closed window. Hypothetical sum = sum \u2212 head + tick.\n const headSq = slot.drawdownSqWindow.at(0);\n const hypSum = slot.sumDrawdownSq - headSq + ddSq;\n return Math.sqrt(hypSum / slot.drawdownSqWindow.length);\n}\n\n/**\n * Ulcer Index \u2014 drawdown-based volatility. The trailing-window RMS of\n * `drawdown_pct[t] = 100 \u00B7 (source[t] \u2212 highest(source, length)[t]) /\n * highest(source, length)[t]`. Composes `ta.highest` via the sub-slot\n * id `${slotId}/highest` so a fix to `highest` flows through. Always\n * non-negative.\n *\n * NaN sources (or zero rolling-max) emit NaN and do NOT advance the\n * window \u2014 the next bar's drawdown is computed against the still-valid\n * prior state.\n *\n * **Warmup ramp.** The first defined output lands at bar `length \u2212 1`\n * (when `highest(source, length)` first emits). Up to bar `2\u00B7(length \u2212\n * 1)` the window is partially populated and the RMS divides by the\n * actual `window.length`; from bar `2\u00B7(length \u2212 1)` onward the window\n * is fully warm and the RMS uses the full `length` denominator. This\n * matches the task spec's `length \u2212 1` warmup pin.\n *\n * @formula highVal[t] = max(source[t \u2212 length + 1 .. t]) ;\n * dd[t] = 100 \u00B7 (source[t] \u2212 highVal[t]) / highVal[t] ;\n * out[t] = sqrt(mean(dd^2 over the last `length` finite bars))\n * @warmup length \u2212 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const ui = ta.ulcerIndex(bar.close, 14);\n * // plot(ui);\n */\nexport function ulcerIndex(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: UlcerIndexOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as UlcerIndexSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(slotId, length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n // Compose: `highest` respects `ctx.isTick`. The sub-slot id is\n // stable per parent slot id.\n const maxSeries = highest(slot.highestSub, source, length);\n const maxSrc = maxSeries.current;\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src, maxSrc));\n } else {\n slot.outBuffer.append(closeValue(slot, src, maxSrc));\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/ultimate-osc.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Ultimate Oscillator derives from\n// `bar.high` / `bar.low` / `bar.close` directly (no `source` arg).\n// Three pairs of (buying-pressure, true-range) ring buffers + running\n// sums \u2014 one pair per (shortLength | mediumLength | longLength)\n// window. Zero-TR-window emits `NaN`.\n\nimport type { Series, UltimateOscOpts } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\n\nconst DEFAULT_SHORT_LENGTH = 7;\nconst DEFAULT_MEDIUM_LENGTH = 14;\nconst DEFAULT_LONG_LENGTH = 28;\n\ntype UltimateOscSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly shortLength: number;\n readonly mediumLength: number;\n readonly longLength: number;\n readonly bpShort: Float64RingBuffer;\n readonly bpMedium: Float64RingBuffer;\n readonly bpLong: Float64RingBuffer;\n readonly trShort: Float64RingBuffer;\n readonly trMedium: Float64RingBuffer;\n readonly trLong: Float64RingBuffer;\n sumBpShort: number;\n sumBpMedium: number;\n sumBpLong: number;\n sumTrShort: number;\n sumTrMedium: number;\n sumTrLong: number;\n /** Number of closed bars folded into the slot so far. */\n barCount: number;\n /** Close of the most recent closed bar \u2014 used by tick mode. */\n prevClose: number;\n /** Close of the bar before the most recent closed bar \u2014 used by tick mode. */\n prevPrevClose: number;\n /** bp / tr of the most recent closed bar (per window) \u2014 used by tick mode. */\n headBpShort: number;\n headBpMedium: number;\n headBpLong: number;\n headTrShort: number;\n headTrMedium: number;\n headTrLong: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.ultimateOsc called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(\n shortLength: number,\n mediumLength: number,\n longLength: number,\n capacity: number,\n): UltimateOscSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n shortLength,\n mediumLength,\n longLength,\n bpShort: new Float64RingBuffer(shortLength),\n bpMedium: new Float64RingBuffer(mediumLength),\n bpLong: new Float64RingBuffer(longLength),\n trShort: new Float64RingBuffer(shortLength),\n trMedium: new Float64RingBuffer(mediumLength),\n trLong: new Float64RingBuffer(longLength),\n sumBpShort: 0,\n sumBpMedium: 0,\n sumBpLong: 0,\n sumTrShort: 0,\n sumTrMedium: 0,\n sumTrLong: 0,\n barCount: 0,\n prevClose: Number.NaN,\n prevPrevClose: Number.NaN,\n headBpShort: 0,\n headBpMedium: 0,\n headBpLong: 0,\n headTrShort: 0,\n headTrMedium: 0,\n headTrLong: 0,\n };\n}\n\nfunction computeBpTr(\n high: number,\n low: number,\n close: number,\n prevClose: number,\n): [number, number] {\n // First bar (no prevClose) \u2014 invinite seeds bp = tr = 0 so the\n // running sums kick off at zero. We mirror that.\n if (!Number.isFinite(prevClose)) return [0, 0];\n const trueLow = Math.min(low, prevClose);\n const trueHigh = Math.max(high, prevClose);\n return [close - trueLow, trueHigh - trueLow];\n}\n\nfunction pushToWindow(\n ring: Float64RingBuffer,\n sum: number,\n incoming: number,\n capacity: number,\n): { newSum: number; outgoing: number } {\n let outgoing = 0;\n if (ring.length >= capacity) {\n outgoing = ring.at(capacity - 1);\n }\n ring.append(incoming);\n return { newSum: sum + incoming - outgoing, outgoing };\n}\n\nfunction uoFromSums(\n sumBpShort: number,\n sumTrShort: number,\n sumBpMedium: number,\n sumTrMedium: number,\n sumBpLong: number,\n sumTrLong: number,\n): number {\n if (sumTrShort === 0 || sumTrMedium === 0 || sumTrLong === 0) return Number.NaN;\n const avgShort = sumBpShort / sumTrShort;\n const avgMedium = sumBpMedium / sumTrMedium;\n const avgLong = sumBpLong / sumTrLong;\n return (100 * (4 * avgShort + 2 * avgMedium + avgLong)) / 7;\n}\n\nfunction closeValue(slot: UltimateOscSlot, high: number, low: number, close: number): number {\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n // Hold prior \u2014 do not advance window state; emit NaN if unwarmed.\n /* c8 ignore next */\n if (slot.barCount < slot.longLength) return Number.NaN;\n return uoFromSums(\n slot.sumBpShort,\n slot.sumTrShort,\n slot.sumBpMedium,\n slot.sumTrMedium,\n slot.sumBpLong,\n slot.sumTrLong,\n );\n }\n const [bp, tr] = computeBpTr(high, low, close, slot.prevClose);\n const short = pushToWindow(slot.bpShort, slot.sumBpShort, bp, slot.shortLength);\n slot.sumBpShort = short.newSum;\n const medium = pushToWindow(slot.bpMedium, slot.sumBpMedium, bp, slot.mediumLength);\n slot.sumBpMedium = medium.newSum;\n const long = pushToWindow(slot.bpLong, slot.sumBpLong, bp, slot.longLength);\n slot.sumBpLong = long.newSum;\n const trShort = pushToWindow(slot.trShort, slot.sumTrShort, tr, slot.shortLength);\n slot.sumTrShort = trShort.newSum;\n const trMedium = pushToWindow(slot.trMedium, slot.sumTrMedium, tr, slot.mediumLength);\n slot.sumTrMedium = trMedium.newSum;\n const trLong = pushToWindow(slot.trLong, slot.sumTrLong, tr, slot.longLength);\n slot.sumTrLong = trLong.newSum;\n\n slot.prevPrevClose = slot.prevClose;\n slot.prevClose = close;\n slot.barCount += 1;\n\n // Capture the new head's bp/tr per window for tick-mode replay.\n slot.headBpShort = bp;\n slot.headBpMedium = bp;\n slot.headBpLong = bp;\n slot.headTrShort = tr;\n slot.headTrMedium = tr;\n slot.headTrLong = tr;\n\n if (slot.barCount < slot.longLength) return Number.NaN;\n return uoFromSums(\n slot.sumBpShort,\n slot.sumTrShort,\n slot.sumBpMedium,\n slot.sumTrMedium,\n slot.sumBpLong,\n slot.sumTrLong,\n );\n}\n\nfunction tickValue(slot: UltimateOscSlot, high: number, low: number, close: number): number {\n if (slot.barCount < slot.longLength) return Number.NaN;\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n return uoFromSums(\n slot.sumBpShort,\n slot.sumTrShort,\n slot.sumBpMedium,\n slot.sumTrMedium,\n slot.sumBpLong,\n slot.sumTrLong,\n );\n }\n // The head bar's bp/tr were computed against prevPrevClose (the\n // close two bars ago). Replaying the head with the tick uses the\n // same prevPrevClose baseline.\n const [tickBp, tickTr] = computeBpTr(high, low, close, slot.prevPrevClose);\n return uoFromSums(\n slot.sumBpShort - slot.headBpShort + tickBp,\n slot.sumTrShort - slot.headTrShort + tickTr,\n slot.sumBpMedium - slot.headBpMedium + tickBp,\n slot.sumTrMedium - slot.headTrMedium + tickTr,\n slot.sumBpLong - slot.headBpLong + tickBp,\n slot.sumTrLong - slot.headTrLong + tickTr,\n );\n}\n\n/**\n * Larry Williams' Ultimate Oscillator. Sources from `bar.high` /\n * `bar.low` / `bar.close` directly (no `source` arg \u2014 matches Pine).\n * Weighted average of three buying-pressure / true-range ratios over\n * `shortLength` / `mediumLength` / `longLength` windows (defaults\n * `7` / `14` / `28`). Output bounded `[0, 100]` (or `NaN`).\n *\n * Zero-TR window (flat-line input over the long window) emits `NaN`.\n * The registry records `yDomain: { kind: \"fixed\", min: 0, max: 100 }`\n * via `TA_REGISTRY_METADATA`.\n *\n * @formula bp = close \u2212 min(low, prevClose) ;\n * tr = max(high, prevClose) \u2212 min(low, prevClose) ;\n * avgN = \u03A3 bp[t \u2212 N + 1 .. t] / \u03A3 tr[t \u2212 N + 1 .. t] ;\n * uo = 100 \u00B7 (4 \u00B7 avgShort + 2 \u00B7 avgMedium + avgLong) / 7\n * @warmup longLength\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const u = ta.ultimateOsc(\"slot\");\n * // plot(u);\n */\nexport function ultimateOsc(slotId: string, opts?: UltimateOscOpts): Series<number> {\n const ctx = getCtx();\n const shortLength = opts?.shortLength ?? DEFAULT_SHORT_LENGTH;\n const mediumLength = opts?.mediumLength ?? DEFAULT_MEDIUM_LENGTH;\n const longLength = opts?.longLength ?? DEFAULT_LONG_LENGTH;\n let slot = ctx.stream.taSlots.get(slotId) as UltimateOscSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(shortLength, mediumLength, longLength, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, bar.high, bar.low, bar.close));\n } else {\n slot.outBuffer.append(closeValue(slot, bar.high, bar.low, bar.close));\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// No invinite source \u2014 semantics per Pine `ta.valuewhen`. See PLAN.md \u00A73.1.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape.\n\nimport type { Series, ValuewhenOpts } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype ValuewhenSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly shiftedSeries: Map<number, Series<number>>;\n readonly occurrence: number;\n readonly capacity: number;\n /**\n * Oldest-first source values at the last `occurrence + 1` matching\n * bars. Length grows to `capacity = occurrence + 1` and then the\n * front is shifted on each subsequent match.\n */\n ring: number[];\n /** Total matches ever seen across the stream. */\n matchCount: number;\n /** Snapshot of `ring` BEFORE the most recent close-side update. */\n prevRing: ReadonlyArray<number>;\n /** Snapshot of `matchCount` BEFORE the most recent close-side update. */\n prevMatchCount: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.valuewhen called outside an active script step\");\n }\n return ctx;\n}\n\nfunction readBoolean(condition: Series<boolean>): boolean {\n return condition.current;\n}\n\nfunction initSlot(occurrence: number, capacity: number): ValuewhenSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n const ringCapacity = occurrence + 1;\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n shiftedSeries: new Map(),\n occurrence,\n capacity: ringCapacity,\n ring: [],\n matchCount: 0,\n prevRing: [],\n prevMatchCount: 0,\n };\n}\n\nfunction emitFromState(\n occurrence: number,\n ring: ReadonlyArray<number>,\n matchCount: number,\n): number {\n if (matchCount < occurrence + 1) return Number.NaN;\n // The ring is oldest-first within its capacity (occurrence + 1).\n // The `occurrence`-th most recent match is the OLDEST entry in a\n // full ring \u2014 i.e. ring[0].\n return ring[0];\n}\n\nfunction closeValue(slot: ValuewhenSlot, src: number, fired: boolean): number {\n slot.prevRing = slot.ring.slice();\n slot.prevMatchCount = slot.matchCount;\n if (fired) {\n slot.ring.push(src);\n if (slot.ring.length > slot.capacity) slot.ring.shift();\n slot.matchCount += 1;\n }\n return emitFromState(slot.occurrence, slot.ring, slot.matchCount);\n}\n\nfunction tickValue(slot: ValuewhenSlot, src: number, fired: boolean): number {\n // Replay against the snapshot taken before the most recent close.\n const ring = slot.prevRing.slice();\n let count = slot.prevMatchCount;\n if (fired) {\n ring.push(src);\n if (ring.length > slot.capacity) ring.shift();\n count += 1;\n }\n return emitFromState(slot.occurrence, ring, count);\n}\n\n/**\n * Source value at the bar of the n-th most recent `condition === true`.\n * `occurrence === 0` returns the value at the most recent match;\n * `occurrence === 1` the second most recent; etc. NaN until\n * `occurrence + 1` matches have been seen.\n *\n * NaN-source at the matching bar produces NaN in the ring entry, which\n * surfaces as NaN once that entry is the one emitted. Matches NaN-source\n * semantics in Pine.\n *\n * @formula out[t] = source[bar of n-th most recent condition true],\n * NaN until `occurrence + 1` matches\n * @warmup bar of the `occurrence + 1`-th match (data-dependent)\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const fast = ta.sma(bar.close, 10);\n * // const slow = ta.sma(bar.close, 30);\n * // const onCross = ta.valuewhen(ta.crossover(fast, slow), bar.close);\n * // plot(onCross);\n */\nexport function valuewhen(\n slotId: string,\n condition: Series<boolean>,\n source: ScalarOrSeries,\n occurrence = 0,\n opts: ValuewhenOpts = {},\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as ValuewhenSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(occurrence, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const fired = readBoolean(condition);\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src, fired));\n } else {\n slot.outBuffer.append(closeValue(slot, src, fired));\n }\n const offset = opts.offset ?? 0;\n if (offset === 0) return slot.series;\n const shifted = slot.shiftedSeries.get(offset);\n if (shifted !== undefined) return shifted;\n const next = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedSeries.set(offset, next);\n return next;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// Ported from ../invinite/src/components/trading-chart/indicators/visible-range-volume-profile.ts\n// @ 3234c8c0c3f9880d9d1e3a3ee63ebd55ddd535f4.\n// Translated, not transcribed \u2014 Series<T> shape, opts.offset, JSDoc.\n// See packages/runtime/src/ta/CLAUDE.md for the port convention.\n\nimport type {\n VisibleRangeVolumeProfileOpts,\n VisibleRangeVolumeProfileResult,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport {\n type VolumeProfileBar,\n type VolumeProfileCore,\n commitVolumeProfileSnapshot,\n createVolumeProfileCore,\n emitVolumeProfileHistogram,\n resolveVolumeProfileSnapshot,\n volumeProfileConfigFromOpts,\n} from \"./lib/volume-profile/index.js\";\n\ntype VisibleRangeVolumeProfileSlot = VolumeProfileCore & {\n readonly result: VisibleRangeVolumeProfileResult;\n readonly shiftedResults: Map<number, VisibleRangeVolumeProfileResult>;\n};\n\ntype MutableVisibleRangeVolumeProfileSlot = Omit<VisibleRangeVolumeProfileSlot, \"result\"> & {\n result: VisibleRangeVolumeProfileResult;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.visibleRangeVolumeProfile called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): VisibleRangeVolumeProfileSlot {\n const core = createVolumeProfileCore(capacity);\n const slot: MutableVisibleRangeVolumeProfileSlot = {\n ...core,\n result: Object.freeze({\n get buckets() {\n return slot.buckets;\n },\n poc: makeSeriesView<number>(core.pocBuffer),\n valHigh: makeSeriesView<number>(core.valHighBuffer),\n valLow: makeSeriesView<number>(core.valLowBuffer),\n }),\n shiftedResults: new Map(),\n };\n return slot;\n}\n\nfunction resultForOffset(\n slot: VisibleRangeVolumeProfileSlot,\n offset: number,\n): VisibleRangeVolumeProfileResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n get buckets() {\n return slot.buckets;\n },\n poc: makeShiftedSeriesView<number>(slot.pocBuffer, offset),\n valHigh: makeShiftedSeriesView<number>(slot.valHighBuffer, offset),\n valLow: makeShiftedSeriesView<number>(slot.valLowBuffer, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\nfunction collectBars(ctx: RuntimeContext): ReadonlyArray<VolumeProfileBar> {\n const { ohlcv } = ctx.stream;\n const { fromTime, toTime } = ctx.stream.bar.viewport;\n const bars: VolumeProfileBar[] = [];\n for (let lookback = ohlcv.close.length - 1; lookback >= 0; lookback -= 1) {\n const time = ohlcv.time.at(lookback);\n if (time < fromTime || time > toTime) continue;\n bars.push({\n close: ohlcv.close.at(lookback),\n high: ohlcv.high.at(lookback),\n low: ohlcv.low.at(lookback),\n open: ohlcv.open.at(lookback),\n time,\n volume: ohlcv.volume.at(lookback),\n });\n }\n return bars;\n}\n\n/**\n * Visible-Range Volume Profile \u2014 buckets the current visible range's\n * volume by price, emits a `horizontal-histogram`, and returns cached\n * POC / VAH / VAL series.\n *\n * The Phase 5 OSS runtime supplies the visible range through\n * `bar.viewport`, populated as the latest 100 bars ending at the\n * current head. Real chart viewport injection is deferred to adapter\n * integrations in Phase 6.\n *\n * @formula Port of invinite visible-range-vp: slice visible candles,\n * bucket volume by price, then derive POC / value-area high /\n * value-area low via the shared volume-profile pipeline.\n * @anchors Visible range = `(bar.viewport.fromTime, bar.viewport.toTime)`.\n * @warmup First 2 bars for non-degenerate bucketization; constant-price\n * positive-volume input emits a one-bucket fallback.\n * @since 0.5\n * @stable\n * @example\n * // import { ta, plot } from \"@invinite-org/chartlang-core\";\n * // const vp = ta.visibleRangeVolumeProfile({ rowSize: 24 });\n * // plot(vp.poc, { title: \"VRVP POC\" });\n */\nexport function visibleRangeVolumeProfile(\n slotId: string,\n opts?: VisibleRangeVolumeProfileOpts,\n): VisibleRangeVolumeProfileResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as VisibleRangeVolumeProfileSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n\n const snapshot = resolveVolumeProfileSnapshot({\n bars: collectBars(ctx),\n bucketColor: opts?.bucketColor,\n config: volumeProfileConfigFromOpts(opts ?? {}),\n });\n commitVolumeProfileSnapshot(slot, ctx.isTick, snapshot);\n emitVolumeProfileHistogram(\n ctx,\n slotId,\n \"Visible Range Volume Profile\",\n snapshot.poc,\n snapshot.buckets,\n );\n return resultForOffset(slot, opts?.offset ?? 0);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/vol.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n\nimport type { Series, VolOpts } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\n\ntype VolSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.vol called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): VolSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return { outBuffer, series: makeSeriesView<number>(outBuffer) };\n}\n\n/**\n * Volume passthrough \u2014 emits `bar.volume` as a `Series<number>` so\n * script authors can compose it like any other primitive (e.g. plot\n * as a histogram). Stateless math; the slot exists purely to back\n * the cached `Series<T>` Proxy + the per-callsite output buffer the\n * compiler-injected slot id keys.\n *\n * Tick-mode reads the live `bar.volume`, replacing the head \u2014 volume\n * can change mid-bar in real time.\n *\n * @formula out[t] = bar.volume[t]\n * @warmup 0\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta, plot } from \"@invinite-org/chartlang-runtime\";\n * // const v = ta.vol(\"slot\");\n * // plot(v, { style: { kind: \"histogram\", baseline: 0 } });\n */\nexport function vol(slotId: string, _opts?: VolOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as VolSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const value = ctx.stream.bar.volume;\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(value);\n } else {\n slot.outBuffer.append(value);\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/volatility-stop.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Volatility Stop composes Phase-1 `ta.atr` at\n// sub-slot `${slotId}/atr` (mirrors Supertrend); the source is\n// hard-coded to `bar.close` (Pine `ta.vstop` convention; invinite's\n// `source` field is deliberately dropped). The recurrence runs\n// incrementally one bar at a time; tick-mode replays the recurrence\n// from a per-bar snapshot of the state at the start of the current\n// bar so a partial-bar tick doesn't pollute the next close's flip\n// detection.\n\nimport type { VolatilityStopOpts, VolatilityStopResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { atr } from \"./atr.js\";\n\nconst DEFAULT_LENGTH = 20;\nconst DEFAULT_MULTIPLIER = 2;\n\nconst TREND_UP = 1;\nconst TREND_DOWN = -1;\nconst TREND_UNKNOWN = 0;\n\ntype Trend = 1 | -1 | 0;\n\ntype VolatilityStopSlot = {\n readonly outputs: VolatilityStopResult;\n readonly valueBuffer: Float64RingBuffer;\n readonly directionBuffer: Float64RingBuffer;\n readonly length: number;\n readonly multiplier: number;\n /** Number of CLOSED bars folded into the slot WITH FINITE ATR. */\n warmBarCount: number;\n direction: Trend;\n prevStop: number;\n prevSrc: number;\n // Snapshot (start-of-current-bar).\n prevClosedWarmBarCount: number;\n prevClosedDirection: Trend;\n prevClosedPrevStop: number;\n prevClosedPrevSrc: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.volatilityStop called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number, length: number, multiplier: number): VolatilityStopSlot {\n const valueBuffer = new Float64RingBuffer(capacity);\n const directionBuffer = new Float64RingBuffer(capacity);\n return {\n outputs: Object.freeze({\n value: makeSeriesView<number>(valueBuffer),\n direction: makeSeriesView<number>(directionBuffer),\n }),\n valueBuffer,\n directionBuffer,\n length,\n multiplier,\n warmBarCount: 0,\n direction: TREND_UNKNOWN,\n prevStop: Number.NaN,\n prevSrc: Number.NaN,\n prevClosedWarmBarCount: 0,\n prevClosedDirection: TREND_UNKNOWN,\n prevClosedPrevStop: Number.NaN,\n prevClosedPrevSrc: Number.NaN,\n };\n}\n\nfunction snapshot(slot: VolatilityStopSlot): void {\n slot.prevClosedWarmBarCount = slot.warmBarCount;\n slot.prevClosedDirection = slot.direction;\n slot.prevClosedPrevStop = slot.prevStop;\n slot.prevClosedPrevSrc = slot.prevSrc;\n}\n\n/**\n * One step of the Volatility Stop recurrence given the prior CLOSED-\n * bar snapshot. Returns the new `(value, direction)` for this bar.\n * Used by both close-side (which mutates the slot) and tick-side\n * (which reads the snapshot, does NOT mutate the slot).\n */\nfunction recurrenceStep(\n src: number,\n atrValue: number,\n multiplier: number,\n prevDirection: Trend,\n prevStop: number,\n prevSrc: number,\n): { value: number; direction: number; nextDirection: Trend; nextStop: number } {\n if (prevDirection === TREND_UNKNOWN) {\n // Second warm bar \u2014 decide initial direction from src[i] vs\n // src[i-1]. Initial stop seeds from the deviation band.\n const newDirection: Trend = src >= prevSrc ? TREND_UP : TREND_DOWN;\n const stop =\n newDirection === TREND_UP ? src - multiplier * atrValue : src + multiplier * atrValue;\n return {\n value: stop,\n direction: newDirection,\n nextDirection: newDirection,\n nextStop: stop,\n };\n }\n if (prevDirection === TREND_UP) {\n let next = src - multiplier * atrValue;\n if (next < prevStop) next = prevStop;\n if (src < next) {\n next = src + multiplier * atrValue;\n return {\n value: next,\n direction: TREND_DOWN,\n nextDirection: TREND_DOWN,\n nextStop: next,\n };\n }\n return { value: next, direction: TREND_UP, nextDirection: TREND_UP, nextStop: next };\n }\n // prevDirection === TREND_DOWN.\n let next = src + multiplier * atrValue;\n if (next > prevStop) next = prevStop;\n if (src > next) {\n next = src - multiplier * atrValue;\n return {\n value: next,\n direction: TREND_UP,\n nextDirection: TREND_UP,\n nextStop: next,\n };\n }\n return { value: next, direction: TREND_DOWN, nextDirection: TREND_DOWN, nextStop: next };\n}\n\nfunction closeStep(\n slot: VolatilityStopSlot,\n src: number,\n atrValue: number,\n): { value: number; direction: number } {\n // NaN suspends state: don't advance live fields. Snapshot stays\n // pinned to the prior bar's state.\n if (!Number.isFinite(src) || !Number.isFinite(atrValue)) {\n return { value: Number.NaN, direction: Number.NaN };\n }\n snapshot(slot);\n if (slot.warmBarCount === 0) {\n // First warm bar \u2014 can't decide direction yet (need a prior\n // src to compare). Seed `prevSrc` and emit NaN.\n slot.warmBarCount = 1;\n slot.prevSrc = src;\n slot.direction = TREND_UNKNOWN;\n slot.prevStop = Number.NaN;\n return { value: Number.NaN, direction: Number.NaN };\n }\n const step = recurrenceStep(\n src,\n atrValue,\n slot.multiplier,\n slot.direction,\n slot.prevStop,\n slot.prevSrc,\n );\n slot.warmBarCount += 1;\n slot.direction = step.nextDirection;\n slot.prevStop = step.nextStop;\n slot.prevSrc = src;\n return { value: step.value, direction: step.direction };\n}\n\nfunction tickStep(\n slot: VolatilityStopSlot,\n src: number,\n atrValue: number,\n): { value: number; direction: number } {\n if (!Number.isFinite(src) || !Number.isFinite(atrValue)) {\n return { value: Number.NaN, direction: Number.NaN };\n }\n if (slot.prevClosedWarmBarCount === 0) {\n // The current bar is the first warm bar \u2014 its tick replay is\n // the seed (NaN, NaN \u2014 direction undecided).\n return { value: Number.NaN, direction: Number.NaN };\n }\n const step = recurrenceStep(\n src,\n atrValue,\n slot.multiplier,\n slot.prevClosedDirection,\n slot.prevClosedPrevStop,\n slot.prevClosedPrevSrc,\n );\n return { value: step.value, direction: step.direction };\n}\n\n/**\n * Volatility Stop \u2014 PSAR-like trend-following stop driven by ATR\n * instead of acceleration factors. Trend up: `stop[i] = max(prevStop,\n * src \u2212 multiplier \u00B7 atr)`; flip to down when `src < stop[i]`, reset\n * to `src + multiplier \u00B7 atr`. Trend down symmetric. Reads\n * `bar.close` as source (Pine `ta.vstop` convention \u2014 invinite's\n * `source` opt is omitted; a `source` opt could land in a follow-up).\n * Composes Phase-1 `ta.atr` at sub-slot `${slotId}/atr`. Returns a\n * cached `{ value, direction }` record (same identity every bar).\n *\n * `direction` is `+1` (uptrend \u2192 stop is BELOW price), `-1`\n * (downtrend \u2192 stop is ABOVE price), NaN during warmup or NaN-\n * suspension. Warmup is `length` (ATR's warmup) \u2014 the FIRST warm bar\n * emits NaN (need a prior close to decide direction); the SECOND\n * warm bar seeds direction from `src[i] vs src[i-1]`.\n *\n * NaN ATR or NaN src \u2192 NaN outputs; local state freezes so the next\n * finite bar resumes from the prior closed state. Tick-mode replays\n * the recurrence from the snapshot captured at the start of the\n * current bar (mirrors PSAR / Supertrend).\n *\n * @formula up : value = max(prevStop, src \u2212 multiplier \u00B7 atr) ; flip to down on src < value ;\n * down : value = min(prevStop, src + multiplier \u00B7 atr) ; flip to up on src > value\n * @warmup length\n * @anchors length, multiplier\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const v = ta.volatilityStop({ length: 20, multiplier: 2 });\n * // plot(v.value);\n */\nexport function volatilityStop(slotId: string, opts?: VolatilityStopOpts): VolatilityStopResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as VolatilityStopSlot | undefined;\n if (slot === undefined) {\n const length = opts?.length ?? DEFAULT_LENGTH;\n const multiplier = opts?.multiplier ?? DEFAULT_MULTIPLIER;\n slot = initSlot(ctx.stream.ohlcv.close.capacity, length, multiplier);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const atrSeries = atr(`${slotId}/atr`, slot.length);\n const src = ctx.stream.bar.close;\n const atrValue = atrSeries.current;\n if (ctx.isTick) {\n const { value, direction } = tickStep(slot, src, atrValue);\n slot.valueBuffer.replaceHead(value);\n slot.directionBuffer.replaceHead(direction);\n } else {\n const { value, direction } = closeStep(slot, src, atrValue);\n slot.valueBuffer.append(value);\n slot.directionBuffer.append(direction);\n }\n return slot.outputs;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/vortex.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Vortex reads `bar.high` / `bar.low` /\n// `bar.close` directly (mirrors Pine's `ta.vortex(length)` \u2014 no source\n// param) and maintains rolling running-sum windows over `vmPlus`,\n// `vmMinus`, and TR for O(1) per-bar updates. NaN-on-zero-TR semantics\n// per chartlang task spec \u00A76 (invinite emits 0 on zero TR; chartlang\n// emits NaN to surface the degenerate window).\n\nimport type { VortexOpts, VortexResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\n\ntype VortexSlot = {\n readonly result: VortexResult;\n readonly plusBuffer: Float64RingBuffer;\n readonly minusBuffer: Float64RingBuffer;\n readonly length: number;\n readonly vmPlusWindow: Float64RingBuffer;\n readonly vmMinusWindow: Float64RingBuffer;\n readonly trWindow: Float64RingBuffer;\n runningPlus: number;\n runningMinus: number;\n runningTr: number;\n prevHigh: number;\n prevLow: number;\n prevClose: number;\n /** Snapshots captured at the prior close so tick replay can read\n * against the bar-before-current. */\n prevPrevHigh: number;\n prevPrevLow: number;\n prevPrevClose: number;\n /** Running sums AS OF THE PRIOR CLOSE \u2014 used by tick replay to\n * substitute the tick's contribution. */\n prevClosedRunningPlus: number;\n prevClosedRunningMinus: number;\n prevClosedRunningTr: number;\n /** Tail values evicted on the current close (the\n * `length`-bars-ago slot at the moment the current close advanced\n * the window). Used by tick replay to recompute the running sum\n * with the tick's substituted contribution. */\n evictedPlus: number;\n evictedMinus: number;\n evictedTr: number;\n /** Number of CLOSED bars folded into the slot so far. */\n barCount: number;\n readonly shiftedResults: Map<number, VortexResult>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.vortex called outside an active script step\");\n }\n return ctx;\n}\n\nfunction trueRange(high: number, low: number, prevClose: number): number {\n if (!Number.isFinite(prevClose)) return high - low;\n return Math.max(high - low, Math.abs(high - prevClose), Math.abs(low - prevClose));\n}\n\nfunction initSlot(length: number, capacity: number): VortexSlot {\n const plusBuffer = new Float64RingBuffer(capacity);\n const minusBuffer = new Float64RingBuffer(capacity);\n return {\n result: Object.freeze({\n plus: makeSeriesView<number>(plusBuffer),\n minus: makeSeriesView<number>(minusBuffer),\n }),\n plusBuffer,\n minusBuffer,\n length,\n vmPlusWindow: new Float64RingBuffer(length),\n vmMinusWindow: new Float64RingBuffer(length),\n trWindow: new Float64RingBuffer(length),\n runningPlus: 0,\n runningMinus: 0,\n runningTr: 0,\n prevHigh: Number.NaN,\n prevLow: Number.NaN,\n prevClose: Number.NaN,\n prevPrevHigh: Number.NaN,\n prevPrevLow: Number.NaN,\n prevPrevClose: Number.NaN,\n prevClosedRunningPlus: 0,\n prevClosedRunningMinus: 0,\n prevClosedRunningTr: 0,\n evictedPlus: 0,\n evictedMinus: 0,\n evictedTr: 0,\n barCount: 0,\n shiftedResults: new Map(),\n };\n}\n\nfunction resultForOffset(slot: VortexSlot, offset: number): VortexResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n plus: makeShiftedSeriesView<number>(slot.plusBuffer, offset),\n minus: makeShiftedSeriesView<number>(slot.minusBuffer, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\nfunction divide(num: number, den: number): number {\n // chartlang task spec \u00A76: zero-TR window \u2192 NaN (degenerate; invinite\n // emits 0). Surface as NaN so script-author conditionals can branch.\n if (den === 0 || !Number.isFinite(den) || !Number.isFinite(num)) return Number.NaN;\n return num / den;\n}\n\nfunction closeStep(\n slot: VortexSlot,\n high: number,\n low: number,\n close: number,\n): { plus: number; minus: number } {\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n // Hold state forward; emit NaN.\n return { plus: Number.NaN, minus: Number.NaN };\n }\n\n slot.barCount += 1;\n\n // Snapshot prior running sums (post-prior-close state \u2014 these are\n // the values tick replay needs to re-derive the head against the\n // PRIOR closed bar).\n slot.prevClosedRunningPlus = slot.runningPlus;\n slot.prevClosedRunningMinus = slot.runningMinus;\n slot.prevClosedRunningTr = slot.runningTr;\n\n const tr = trueRange(high, low, slot.prevClose);\n const vmPlus = Number.isFinite(slot.prevLow) ? Math.abs(high - slot.prevLow) : 0;\n const vmMinus = Number.isFinite(slot.prevHigh) ? Math.abs(low - slot.prevHigh) : 0;\n\n // Capture prev-prev BEFORE overwriting prev (tick replay reads\n // against the bar-before-current).\n slot.prevPrevHigh = slot.prevHigh;\n slot.prevPrevLow = slot.prevLow;\n slot.prevPrevClose = slot.prevClose;\n slot.prevHigh = high;\n slot.prevLow = low;\n slot.prevClose = close;\n\n // Roll the windows; capture evicted tail values for tick replay.\n if (slot.vmPlusWindow.length >= slot.length) {\n slot.evictedPlus = slot.vmPlusWindow.at(slot.length - 1);\n slot.evictedMinus = slot.vmMinusWindow.at(slot.length - 1);\n slot.evictedTr = slot.trWindow.at(slot.length - 1);\n slot.runningPlus -= slot.evictedPlus;\n slot.runningMinus -= slot.evictedMinus;\n slot.runningTr -= slot.evictedTr;\n } else {\n slot.evictedPlus = 0;\n slot.evictedMinus = 0;\n slot.evictedTr = 0;\n }\n slot.vmPlusWindow.append(vmPlus);\n slot.vmMinusWindow.append(vmMinus);\n slot.trWindow.append(tr);\n slot.runningPlus += vmPlus;\n slot.runningMinus += vmMinus;\n slot.runningTr += tr;\n\n // Warmup: first defined output at `barCount === length + 1` (i.e.\n // bar index `length` zero-based). The seed window completes when\n // the `length`-th VM/TR triple has been folded in.\n if (slot.barCount <= slot.length) {\n return { plus: Number.NaN, minus: Number.NaN };\n }\n return {\n plus: divide(slot.runningPlus, slot.runningTr),\n minus: divide(slot.runningMinus, slot.runningTr),\n };\n}\n\nfunction tickStep(\n slot: VortexSlot,\n high: number,\n low: number,\n close: number,\n): { plus: number; minus: number } {\n if (slot.barCount <= slot.length) return { plus: Number.NaN, minus: Number.NaN };\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n return { plus: Number.NaN, minus: Number.NaN };\n }\n // Tick replay against the BAR BEFORE the current bar.\n const tr = trueRange(high, low, slot.prevPrevClose);\n // Defensive: `prevPrev*` is seeded by the prior close-side advance,\n // so by the time `barCount > length` (the guard above) these are\n // finite. The `: 0` fallback is defence-in-depth.\n /* c8 ignore next 2 */\n const vmPlus = Number.isFinite(slot.prevPrevLow) ? Math.abs(high - slot.prevPrevLow) : 0;\n const vmMinus = Number.isFinite(slot.prevPrevHigh) ? Math.abs(low - slot.prevPrevHigh) : 0;\n // Re-derive the running sums by starting from the prior closed\n // sums, subtracting the head bar's evicted tail (captured at the\n // close-side advance), and adding the tick's contribution.\n const runningPlus = slot.prevClosedRunningPlus - slot.evictedPlus + vmPlus;\n const runningMinus = slot.prevClosedRunningMinus - slot.evictedMinus + vmMinus;\n const runningTr = slot.prevClosedRunningTr - slot.evictedTr + tr;\n return {\n plus: divide(runningPlus, runningTr),\n minus: divide(runningMinus, runningTr),\n };\n}\n\n/**\n * Vortex Indicator (Botes & Siepman, 2010) \u2014 paired `+VI` / `\u2212VI`\n * trend-direction lines. Reads `bar.high` / `bar.low` / `bar.close`\n * directly (mirrors Pine's `ta.vortex(length)` \u2014 no source param).\n * Maintains rolling running-sum windows over the per-bar `vmPlus`,\n * `vmMinus`, and TR series for O(1) per-bar updates. Returns a cached\n * `{ plus, minus }` record (same identity every bar).\n *\n * @formula TR[t] = max(high \u2212 low, |high \u2212 prevClose|, |low \u2212 prevClose|) ;\n * vmPlus[t] = |high[t] \u2212 low[t-1]| ;\n * vmMinus[t] = |low[t] \u2212 high[t-1]| ;\n * plus[t] = \u03A3(vmPlus, length) / \u03A3(TR, length) ;\n * minus[t] = \u03A3(vmMinus, length) / \u03A3(TR, length) ;\n * NaN when \u03A3(TR, length) === 0 (degenerate flat window).\n * @warmup length\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts both series in lockstep (PLAN.md \u00A79.1) \u2014\n * `series.current` on each output returns the value `offset` bars ago.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const v = ta.vortex(\"slot\", 14);\n * // plot(v.plus);\n * // plot(v.minus);\n */\nexport function vortex(slotId: string, length: number, opts?: VortexOpts): VortexResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as VortexSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n if (ctx.isTick) {\n const { plus, minus } = tickStep(slot, bar.high, bar.low, bar.close);\n slot.plusBuffer.replaceHead(plus);\n slot.minusBuffer.replaceHead(minus);\n } else {\n const { plus, minus } = closeStep(slot, bar.high, bar.low, bar.close);\n slot.plusBuffer.append(plus);\n slot.minusBuffer.append(minus);\n }\n return resultForOffset(slot, opts?.offset ?? 0);\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/vwap.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape.\n\nimport type { Series, VwapOpts } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\n\ntype VwapSource = NonNullable<VwapOpts[\"source\"]>;\n\nconst DEFAULT_SOURCE: VwapSource = \"hlc3\";\nconst MS_PER_DAY = 86_400_000;\n\ntype VwapSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n /** Active cumulative price\u00B7volume within the current UTC day. */\n cumPV: number;\n /** Active cumulative volume within the current UTC day. */\n cumV: number;\n /** UTC-day index of the most recent close: `floor(bar.time / 86_400_000)`. */\n currentDayKey: number;\n /** Snapshot of `cumPV` BEFORE the most recent close-side update. */\n prevClosedCumPV: number;\n /** Snapshot of `cumV` BEFORE the most recent close-side update. */\n prevClosedCumV: number;\n /** Snapshot of `currentDayKey` BEFORE the most recent close-side update. */\n prevClosedDayKey: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.vwap called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): VwapSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n cumPV: 0,\n cumV: 0,\n currentDayKey: Number.NaN,\n prevClosedCumPV: 0,\n prevClosedCumV: 0,\n prevClosedDayKey: Number.NaN,\n };\n}\n\nfunction readSource(ctx: RuntimeContext, source: VwapSource): number {\n switch (source) {\n case \"close\":\n return ctx.stream.bar.close;\n case \"hl2\":\n return ctx.stream.bar.hl2;\n case \"hlc3\":\n return ctx.stream.bar.hlc3;\n case \"ohlc4\":\n return ctx.stream.bar.ohlc4;\n case \"hlcc4\":\n return ctx.stream.bar.hlcc4;\n }\n}\n\nfunction dayKeyOf(time: number): number {\n return Math.floor(time / MS_PER_DAY);\n}\n\n/**\n * Fold one bar into a (cumPV, cumV, dayKey) accumulator and return\n * the post-fold tuple. The first arg is the accumulator state coming\n * in; the result is the state after consuming the bar.\n *\n * Resets the cumulative pair to zero when `dayKey` changes from the\n * incoming `inDayKey`. NaN source or NaN/non-finite volume contributes\n * zero (keeps the running average stable across data gaps); the day\n * boundary still triggers the reset.\n */\nfunction fold(\n inCumPV: number,\n inCumV: number,\n inDayKey: number,\n dayKey: number,\n src: number,\n volume: number,\n): { cumPV: number; cumV: number; dayKey: number } {\n let cumPV = inCumPV;\n let cumV = inCumV;\n if (inDayKey !== dayKey) {\n cumPV = 0;\n cumV = 0;\n }\n if (Number.isFinite(src) && Number.isFinite(volume) && volume > 0) {\n cumPV += src * volume;\n cumV += volume;\n }\n return { cumPV, cumV, dayKey };\n}\n\nfunction valueFromCum(cumPV: number, cumV: number): number {\n if (cumV === 0) return Number.NaN;\n return cumPV / cumV;\n}\n\n/**\n * Volume-Weighted Average Price (VWAP), session-anchored to the UTC\n * calendar day. Accumulates `\u03A3(source \u00B7 volume) / \u03A3(volume)` over\n * the bars since the most recent UTC midnight; resets to NaN at the\n * top of every UTC day. `source` defaults to `\"hlc3\"` per Pine.\n *\n * **Phase-2 session boundary.** Phase 2 keys the session reset off\n * `floor(bar.time / 86_400_000)` (the UTC calendar day). Phase 4\n * lifts session detection to `syminfo.session.regularStart` per\n * invinite \u2014 until then VWAP behaves as a UTC-day-anchored VWAP.\n *\n * **NaN handling.** Bars with NaN source or non-positive / NaN volume\n * contribute zero to the accumulator (the average stays well-defined\n * across data gaps). The first bar of every new day before any\n * volume accumulates yields NaN (`cumV === 0`).\n *\n * **Tick mode.** Replays the head bar's contribution against a\n * snapshot of the prior-close (cumPV, cumV, dayKey) tuple so a\n * partial-bar tick doesn't pollute the next close's accumulator.\n *\n * @formula vwap[t] = \u03A3_{u \u2208 session(t)}(source[u] \u00B7 volume[u]) / \u03A3_{u \u2208 session(t)}(volume[u])\n * @warmup 0 (NaN until the first bar with cumV > 0 in the session)\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const v = ta.vwap(\"slot\", { source: \"hlc3\" });\n * // const head = v.current;\n */\nexport function vwap(slotId: string, opts?: VwapOpts): Series<number> {\n const ctx = getCtx();\n const source = opts?.source ?? DEFAULT_SOURCE;\n let slot = ctx.stream.taSlots.get(slotId) as VwapSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSource(ctx, source);\n const volume = ctx.stream.bar.volume;\n const dayKey = dayKeyOf(ctx.stream.bar.time);\n\n if (ctx.isTick) {\n const next = fold(\n slot.prevClosedCumPV,\n slot.prevClosedCumV,\n slot.prevClosedDayKey,\n dayKey,\n src,\n volume,\n );\n slot.outBuffer.replaceHead(valueFromCum(next.cumPV, next.cumV));\n return slot.series;\n }\n\n // Close-side: snapshot the prior-close state, then fold in the new bar.\n slot.prevClosedCumPV = slot.cumPV;\n slot.prevClosedCumV = slot.cumV;\n slot.prevClosedDayKey = slot.currentDayKey;\n const next = fold(slot.cumPV, slot.cumV, slot.currentDayKey, dayKey, src, volume);\n slot.cumPV = next.cumPV;\n slot.cumV = next.cumV;\n slot.currentDayKey = next.dayKey;\n slot.outBuffer.append(valueFromCum(slot.cumPV, slot.cumV));\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/vwma.ts\n// plus lib/vwma-of-float64.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape.\n\nimport type { Series, VwmaOpts } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype VwmaSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /** Closed source values over the trailing `length` bars. */\n readonly sourceWindow: Float64RingBuffer;\n /** Parallel volume window over the trailing `length` bars. */\n readonly volumeWindow: Float64RingBuffer;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.vwma called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): VwmaSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n sourceWindow: new Float64RingBuffer(length),\n volumeWindow: new Float64RingBuffer(length),\n };\n}\n\nfunction weightedFromWindows(slot: VwmaSlot): number {\n let pvSum = 0;\n let volSum = 0;\n for (let j = 0; j < slot.length; j += 1) {\n const value = slot.sourceWindow.at(j);\n if (!Number.isFinite(value)) return Number.NaN;\n const rawVol = slot.volumeWindow.at(j);\n const v = Number.isFinite(rawVol) ? rawVol : 0;\n pvSum += value * v;\n volSum += v;\n }\n return volSum > 0 ? pvSum / volSum : Number.NaN;\n}\n\nfunction closeValue(slot: VwmaSlot, src: number, vol: number): number {\n slot.sourceWindow.append(src);\n slot.volumeWindow.append(vol);\n if (slot.sourceWindow.length < slot.length) return Number.NaN;\n return weightedFromWindows(slot);\n}\n\nfunction tickValue(slot: VwmaSlot, src: number, vol: number): number {\n if (slot.sourceWindow.length < slot.length) return Number.NaN;\n if (!Number.isFinite(src)) return Number.NaN;\n // Substitute (src, vol) at head position; walk the closed window\n // for positions 1..length-1.\n const headVol = Number.isFinite(vol) ? vol : 0;\n let pvSum = src * headVol;\n let volSum = headVol;\n for (let j = 1; j < slot.length; j += 1) {\n const value = slot.sourceWindow.at(j);\n if (!Number.isFinite(value)) return Number.NaN;\n const rawVol = slot.volumeWindow.at(j);\n const v = Number.isFinite(rawVol) ? rawVol : 0;\n pvSum += value * v;\n volSum += v;\n }\n return volSum > 0 ? pvSum / volSum : Number.NaN;\n}\n\n/**\n * Volume-weighted moving average \u2014 `\u03A3 source[t\u2212j] \u00B7 volume[t\u2212j]` over\n * the trailing `length` bars divided by `\u03A3 volume[t\u2212j]`. NaN volume\n * slots are treated as `0` (matches `vwmaFloat64`'s null-coalesce\n * semantics). A NaN source anywhere inside the window emits `NaN`;\n * a window whose total volume is `0` emits `NaN` (the ratio is\n * undefined). Reads bar volume from `RuntimeContext.stream.bar.volume`.\n *\n * @formula out[t] = (\u03A3_{j=0..length-1} source[t \u2212 j] \u00B7 volume[t \u2212 j])\n * / (\u03A3_{j=0..length-1} volume[t \u2212 j])\n * ; NaN when the denominator is 0.\n * @warmup length \u2212 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const v = ta.vwma(bar.close, 20);\n * // plot(v);\n */\nexport function vwma(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: VwmaOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as VwmaSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n const vol = ctx.stream.bar.volume;\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src, vol));\n } else {\n slot.outBuffer.append(closeValue(slot, src, vol));\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/williams-fractal.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. Williams Fractal is self-contained \u2014 no\n// composition with `ta.highest` / `ta.lowest` because the centre bar\n// must be EXCLUDED from the windowed strict-extreme comparison (and\n// the sub-primitives don't expose that semantic). The slot owns a\n// `2 \u00B7 length + 1` ring buffer per side (high / low) and scans it\n// per close. Output deviates from the task spec's literal \"boolean\"\n// wording in favour of price levels (matches invinite's\n// `upFractals[i] = high`); this gives the `marker` plot a y-anchor.\n\nimport type { WilliamsFractalOpts, WilliamsFractalResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\n\nconst DEFAULT_LENGTH = 2;\n\ntype WilliamsFractalSlot = {\n readonly outputs: WilliamsFractalResult;\n readonly upBuffer: Float64RingBuffer;\n readonly downBuffer: Float64RingBuffer;\n readonly length: number;\n /**\n * Trailing `2 \u00B7 length + 1` highs. `at(0)` is the most recent\n * close (right-window head); `at(length)` is the centre bar;\n * `at(2 \u00B7 length)` is the oldest left-window bar.\n */\n readonly highWindow: Float64RingBuffer;\n /** Trailing `2 \u00B7 length + 1` lows (centred window). */\n readonly lowWindow: Float64RingBuffer;\n /** Number of CLOSED bars folded into the slot so far. */\n barCount: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.williamsFractal called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number, length: number): WilliamsFractalSlot {\n const upBuffer = new Float64RingBuffer(capacity);\n const downBuffer = new Float64RingBuffer(capacity);\n const windowSize = 2 * length + 1;\n return {\n outputs: Object.freeze({\n up: makeSeriesView<number>(upBuffer),\n down: makeSeriesView<number>(downBuffer),\n }),\n upBuffer,\n downBuffer,\n length,\n highWindow: new Float64RingBuffer(windowSize),\n lowWindow: new Float64RingBuffer(windowSize),\n barCount: 0,\n };\n}\n\n/**\n * Scan the centred window for an up-fractal at the centre bar (age\n * `length`). Returns `centreHigh` if the centre's high is strictly\n * greater than every other entry in `[0, 2\u00B7length]` (NaN entries\n * fail the comparison \u2014 any NaN means no fractal). `headHigh` is\n * the substitute value for age 0 (`highWindow.at(0)`); tick replay\n * passes the tick's high there.\n */\nfunction scanUpFractal(highWindow: Float64RingBuffer, headHigh: number, length: number): number {\n const centreHigh = highWindow.at(length);\n if (!Number.isFinite(centreHigh)) return Number.NaN;\n const windowSize = 2 * length + 1;\n for (let k = 0; k < windowSize; k += 1) {\n if (k === length) continue;\n const v = k === 0 ? headHigh : highWindow.at(k);\n if (!Number.isFinite(v)) return Number.NaN;\n if (v >= centreHigh) return Number.NaN;\n }\n return centreHigh;\n}\n\n/**\n * Scan the centred window for a down-fractal at the centre bar.\n * Mirrors {@link scanUpFractal} with `<` / `centreLow`.\n */\nfunction scanDownFractal(lowWindow: Float64RingBuffer, headLow: number, length: number): number {\n const centreLow = lowWindow.at(length);\n if (!Number.isFinite(centreLow)) return Number.NaN;\n const windowSize = 2 * length + 1;\n for (let k = 0; k < windowSize; k += 1) {\n if (k === length) continue;\n const v = k === 0 ? headLow : lowWindow.at(k);\n if (!Number.isFinite(v)) return Number.NaN;\n if (v <= centreLow) return Number.NaN;\n }\n return centreLow;\n}\n\n/**\n * Williams Fractal \u2014 centred-window pivot detector. For each centre\n * bar `c`, marks an **up-fractal** if `bar.high(c)` is strictly\n * greater than every `bar.high` in the symmetric `length`-bar window\n * on either side (`c \u2212 length .. c \u2212 1` \u222A `c + 1 .. c + length`).\n * Mirrors for **down-fractal** with `bar.low`.\n *\n * Output is centred \u2014 at live bar `t`, the value emitted at\n * `up.current` / `down.current` is the fractal status of bar `t \u2212\n * length` (when bar `t` closes, we now have enough right-window bars\n * to confirm bar `t \u2212 length`). The most recent `length` slots of\n * the output Series are intentionally NaN (pending right-window\n * confirmation). Warmup is `2 \u00B7 length` bars before the first\n * confirmed centre.\n *\n * Outputs encode **price levels**: `up.current` = `bar.high(centre)`\n * when up-fractal, NaN otherwise; `down.current` = `bar.low(centre)`\n * when down-fractal, NaN otherwise. This gives the `marker` plot a\n * y-anchor (matches invinite's `upFractals[i] = high`). The task\n * spec's literal \"boolean\" wording is intentionally not honoured\n * because (a) the script-facing `plot()` only accepts numeric\n * series, (b) the marker style needs a price to anchor at, and (c)\n * level-series is what every reference implementation actually\n * does. NaN in any window slot \u2192 no fractal at the centre.\n *\n * Returns a cached `{ up, down }` record (same identity every bar).\n *\n * @formula up = bar.high(centre) when strict argmax over [c\u2212L, c+L] excluding c, NaN otherwise ;\n * down = bar.low(centre) when strict argmin over [c\u2212L, c+L] excluding c, NaN otherwise\n * @warmup 2 \u00B7 length\n * @anchors length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const f = ta.williamsFractal();\n * // plot(f.up, { style: { kind: \"marker\", shape: \"triangle-up\", size: 6 } });\n * // plot(f.down, { style: { kind: \"marker\", shape: \"triangle-down\", size: 6 } });\n */\nexport function williamsFractal(slotId: string, opts?: WilliamsFractalOpts): WilliamsFractalResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as WilliamsFractalSlot | undefined;\n if (slot === undefined) {\n const length = opts?.length ?? DEFAULT_LENGTH;\n slot = initSlot(ctx.stream.ohlcv.close.capacity, length);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n const windowSize = 2 * slot.length + 1;\n\n if (ctx.isTick) {\n // Tick: substitute head (age 0) with the tick's high/low; centre\n // is still at age `length` in the closed window. Warmup\n // requires `barCount >= windowSize`.\n if (slot.barCount < windowSize) {\n slot.upBuffer.replaceHead(Number.NaN);\n slot.downBuffer.replaceHead(Number.NaN);\n } else {\n slot.upBuffer.replaceHead(scanUpFractal(slot.highWindow, bar.high, slot.length));\n slot.downBuffer.replaceHead(scanDownFractal(slot.lowWindow, bar.low, slot.length));\n }\n } else {\n slot.highWindow.append(bar.high);\n slot.lowWindow.append(bar.low);\n slot.barCount += 1;\n if (slot.barCount < windowSize) {\n slot.upBuffer.append(Number.NaN);\n slot.downBuffer.append(Number.NaN);\n } else {\n // Close-side: head (age 0) IS this bar's high/low (we just\n // appended). Scan with `headHigh = highWindow.at(0)` \u2014\n // i.e. no substitution.\n slot.upBuffer.append(\n scanUpFractal(slot.highWindow, slot.highWindow.at(0), slot.length),\n );\n slot.downBuffer.append(\n scanDownFractal(slot.lowWindow, slot.lowWindow.at(0), slot.length),\n );\n }\n }\n return slot.outputs;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/williams-r.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape. Williams %R derives from\n// `bar.high` / `bar.low` / `bar.close` directly \u2014 no `source` arg\n// per Pine. Composes `ta.highest` + `ta.lowest` over the trailing\n// `length` bars.\n\nimport type { Series, WilliamsROpts } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { highest } from \"./highest.js\";\nimport { lowest } from \"./lowest.js\";\n\ntype WilliamsRSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.williamsR called outside an active script step\");\n }\n return ctx;\n}\n\nfunction williamsRValue(hh: number, ll: number, close: number): number {\n if (!Number.isFinite(hh) || !Number.isFinite(ll) || !Number.isFinite(close)) {\n return Number.NaN;\n }\n const denom = hh - ll;\n if (denom === 0) return Number.NaN;\n return (-100 * (hh - close)) / denom;\n}\n\n/**\n * Williams %R \u2014 momentum oscillator bounded in `[-100, 0]`. Sources\n * from `bar.high` / `bar.low` / `bar.close` directly (no `source`\n * arg \u2014 matches Pine). Composes `ta.highest` + `ta.lowest` over the\n * trailing `length` bars; `hh === ll` (flat-line window) emits `NaN`.\n *\n * The registry records `yDomain: { kind: \"fixed\", min: -100, max: 0 }`\n * via `TA_REGISTRY_METADATA`.\n *\n * @formula hh = highest(bar.high, length) ;\n * ll = lowest(bar.low, length) ;\n * wr = -100 \u00B7 (hh \u2212 bar.close) / (hh \u2212 ll) ; NaN if hh === ll\n * @warmup length \u2212 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const w = ta.williamsR(\"slot\", 14);\n * // plot(w);\n */\nexport function williamsR(slotId: string, length: number, _opts?: WilliamsROpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as WilliamsRSlot | undefined;\n if (slot === undefined) {\n const outBuffer = new Float64RingBuffer(ctx.stream.ohlcv.close.capacity);\n slot = { outBuffer, series: makeSeriesView<number>(outBuffer) };\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n const hh = highest(`${slotId}/hh`, bar.high, length).current;\n const ll = lowest(`${slotId}/ll`, bar.low, length).current;\n const value = williamsRValue(hh, ll, bar.close);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(value);\n } else {\n slot.outBuffer.append(value);\n }\n return slot.series;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/zig-zag.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, \u00A9 Invinite).\n// Re-licensed MIT for chartlang. See PLAN.md \u00A73.1 for the\n// provenance contract; the math is the reference, the code style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape \u2014 NOT invinite's\n// IndicatorPlugin shape. The chartlang port is **streaming**: the\n// output `value` Series carries the most-recently-confirmed pivot\n// price (held constant between confirmations), whereas invinite's\n// batch `compute` linearly interpolates pivot\u2192pivot and supports\n// `extendToLastBar` retro-painting. The append-only Series model\n// cannot rewrite older slots, so the streaming output is the closest\n// representable surface \u2014 useful as a \"trailing reference level\".\n\nimport type { ZigZagOpts, ZigZagResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\n\nconst DEFAULT_DEVIATION = 5;\nconst DEFAULT_DEPTH = 10;\n\nconst TREND_UP = 1;\nconst TREND_DOWN = -1;\nconst TREND_UNKNOWN = 0;\n\ntype Trend = 1 | -1 | 0;\n\ntype ZigZagSlot = {\n readonly outputs: ZigZagResult;\n readonly valueBuffer: Float64RingBuffer;\n readonly directionBuffer: Float64RingBuffer;\n readonly deviation: number;\n readonly depth: number;\n // Live state.\n barCount: number;\n direction: Trend;\n lastPivotPrice: number;\n lastPivotIndex: number;\n peakSinceLastPivot: number;\n peakIndex: number;\n // Snapshot (start-of-current-bar) \u2014 captured each close BEFORE\n // the recurrence advances so a final tick replays from the seed.\n prevClosedBarCount: number;\n prevClosedDirection: Trend;\n prevClosedLastPivotPrice: number;\n prevClosedLastPivotIndex: number;\n prevClosedPeakSinceLastPivot: number;\n prevClosedPeakIndex: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.zigZag called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number, deviation: number, depth: number): ZigZagSlot {\n const valueBuffer = new Float64RingBuffer(capacity);\n const directionBuffer = new Float64RingBuffer(capacity);\n return {\n outputs: Object.freeze({\n value: makeSeriesView<number>(valueBuffer),\n direction: makeSeriesView<number>(directionBuffer),\n }),\n valueBuffer,\n directionBuffer,\n deviation,\n depth,\n barCount: 0,\n direction: TREND_UNKNOWN,\n lastPivotPrice: Number.NaN,\n lastPivotIndex: -1,\n peakSinceLastPivot: Number.NaN,\n peakIndex: -1,\n prevClosedBarCount: 0,\n prevClosedDirection: TREND_UNKNOWN,\n prevClosedLastPivotPrice: Number.NaN,\n prevClosedLastPivotIndex: -1,\n prevClosedPeakSinceLastPivot: Number.NaN,\n prevClosedPeakIndex: -1,\n };\n}\n\nfunction snapshot(slot: ZigZagSlot): void {\n slot.prevClosedBarCount = slot.barCount;\n slot.prevClosedDirection = slot.direction;\n slot.prevClosedLastPivotPrice = slot.lastPivotPrice;\n slot.prevClosedLastPivotIndex = slot.lastPivotIndex;\n slot.prevClosedPeakSinceLastPivot = slot.peakSinceLastPivot;\n slot.prevClosedPeakIndex = slot.peakIndex;\n}\n\n/**\n * One step of the streaming ZigZag state machine. Returns the new\n * `(value, direction, lastPivotPrice, lastPivotIndex,\n * peakSinceLastPivot, peakIndex, direction)` state given the prior\n * state and this bar's `(close, barIndex)`. Used by both close-side\n * (which mutates the slot) and tick-side (which reads the snapshot,\n * does NOT mutate the slot).\n */\nfunction recurrenceStep(\n close: number,\n barIndex: number,\n deviation: number,\n depth: number,\n prevDirection: Trend,\n prevLastPivotPrice: number,\n prevLastPivotIndex: number,\n prevPeakSinceLastPivot: number,\n prevPeakIndex: number,\n): {\n value: number;\n direction: number;\n nextDirection: Trend;\n nextLastPivotPrice: number;\n nextLastPivotIndex: number;\n nextPeakSinceLastPivot: number;\n nextPeakIndex: number;\n} {\n const pctChangeVsPivot = ((close - prevLastPivotPrice) / prevLastPivotPrice) * 100;\n const barsSincePivot = barIndex - prevLastPivotIndex;\n\n if (prevDirection === TREND_UNKNOWN) {\n // Pre-first-pivot: commit when |pct| crosses deviation AND\n // depth bars have elapsed since bar 0.\n if (\n Math.abs(pctChangeVsPivot) >= deviation &&\n barsSincePivot >= depth &&\n prevLastPivotPrice !== 0\n ) {\n const newDirection: Trend = pctChangeVsPivot > 0 ? TREND_UP : TREND_DOWN;\n return {\n value: close,\n direction: newDirection,\n nextDirection: newDirection,\n nextLastPivotPrice: close,\n nextLastPivotIndex: barIndex,\n nextPeakSinceLastPivot: close,\n nextPeakIndex: barIndex,\n };\n }\n return {\n value: Number.NaN,\n direction: Number.NaN,\n nextDirection: TREND_UNKNOWN,\n nextLastPivotPrice: prevLastPivotPrice,\n nextLastPivotIndex: prevLastPivotIndex,\n nextPeakSinceLastPivot: prevPeakSinceLastPivot,\n nextPeakIndex: prevPeakIndex,\n };\n }\n\n if (prevDirection === TREND_UP) {\n // Trending up: update running peak when price makes new high.\n if (close > prevPeakSinceLastPivot) {\n return {\n value: prevLastPivotPrice,\n direction: TREND_UP,\n nextDirection: TREND_UP,\n nextLastPivotPrice: prevLastPivotPrice,\n nextLastPivotIndex: prevLastPivotIndex,\n nextPeakSinceLastPivot: close,\n nextPeakIndex: barIndex,\n };\n }\n // Reversal candidate: price dropped by `deviation %` from the\n // running peak AND `depth` bars have elapsed since the peak.\n // Reaching the up-trend branch requires a prior up-commit\n // which set lastPivotPrice (and thus peak) from a finite,\n // non-zero close \u2014 so peak > 0 here.\n const pctDropFromPeak = ((prevPeakSinceLastPivot - close) / prevPeakSinceLastPivot) * 100;\n const barsSincePeak = barIndex - prevPeakIndex;\n if (pctDropFromPeak >= deviation && barsSincePeak >= depth) {\n // Confirm the running peak as the new pivot; flip\n // direction. The new lastPivot is the peak (NOT the\n // current close).\n return {\n value: prevPeakSinceLastPivot,\n direction: TREND_DOWN,\n nextDirection: TREND_DOWN,\n nextLastPivotPrice: prevPeakSinceLastPivot,\n nextLastPivotIndex: prevPeakIndex,\n nextPeakSinceLastPivot: close,\n nextPeakIndex: barIndex,\n };\n }\n // No new peak, no reversal \u2014 hold the current pivot.\n return {\n value: prevLastPivotPrice,\n direction: TREND_UP,\n nextDirection: TREND_UP,\n nextLastPivotPrice: prevLastPivotPrice,\n nextLastPivotIndex: prevLastPivotIndex,\n nextPeakSinceLastPivot: prevPeakSinceLastPivot,\n nextPeakIndex: prevPeakIndex,\n };\n }\n\n // prevDirection === TREND_DOWN.\n if (close < prevPeakSinceLastPivot) {\n return {\n value: prevLastPivotPrice,\n direction: TREND_DOWN,\n nextDirection: TREND_DOWN,\n nextLastPivotPrice: prevLastPivotPrice,\n nextLastPivotIndex: prevLastPivotIndex,\n nextPeakSinceLastPivot: close,\n nextPeakIndex: barIndex,\n };\n }\n // Down-trend reach: a prior down-flip OR commit-down set the\n // trough's source to a finite close. The trough CAN be 0 (commit-\n // up at 0 then flip-down at 0); the previous close was 0 so the\n // pctRise calc would divide by zero. Guard.\n const pctRiseFromTrough =\n prevPeakSinceLastPivot !== 0\n ? ((close - prevPeakSinceLastPivot) / prevPeakSinceLastPivot) * 100\n : 0;\n const barsSinceTrough = barIndex - prevPeakIndex;\n if (pctRiseFromTrough >= deviation && barsSinceTrough >= depth) {\n return {\n value: prevPeakSinceLastPivot,\n direction: TREND_UP,\n nextDirection: TREND_UP,\n nextLastPivotPrice: prevPeakSinceLastPivot,\n nextLastPivotIndex: prevPeakIndex,\n nextPeakSinceLastPivot: close,\n nextPeakIndex: barIndex,\n };\n }\n return {\n value: prevLastPivotPrice,\n direction: TREND_DOWN,\n nextDirection: TREND_DOWN,\n nextLastPivotPrice: prevLastPivotPrice,\n nextLastPivotIndex: prevLastPivotIndex,\n nextPeakSinceLastPivot: prevPeakSinceLastPivot,\n nextPeakIndex: prevPeakIndex,\n };\n}\n\nfunction closeStep(\n slot: ZigZagSlot,\n close: number,\n barIndex: number,\n): { value: number; direction: number } {\n if (!Number.isFinite(close)) {\n // NaN close: freeze state. Snapshot is unchanged (covers tick\n // replay on the same NaN bar). Emit NaN/NaN.\n return { value: Number.NaN, direction: Number.NaN };\n }\n snapshot(slot);\n\n if (slot.barCount === 0) {\n // Seed bar \u2014 bar 0 is the candidate pivot, direction unknown.\n slot.barCount = 1;\n slot.lastPivotPrice = close;\n slot.lastPivotIndex = 0;\n slot.peakSinceLastPivot = close;\n slot.peakIndex = 0;\n slot.direction = TREND_UNKNOWN;\n return { value: Number.NaN, direction: Number.NaN };\n }\n\n const step = recurrenceStep(\n close,\n barIndex,\n slot.deviation,\n slot.depth,\n slot.direction,\n slot.lastPivotPrice,\n slot.lastPivotIndex,\n slot.peakSinceLastPivot,\n slot.peakIndex,\n );\n slot.barCount += 1;\n slot.direction = step.nextDirection;\n slot.lastPivotPrice = step.nextLastPivotPrice;\n slot.lastPivotIndex = step.nextLastPivotIndex;\n slot.peakSinceLastPivot = step.nextPeakSinceLastPivot;\n slot.peakIndex = step.nextPeakIndex;\n return { value: step.value, direction: step.direction };\n}\n\nfunction tickStep(\n slot: ZigZagSlot,\n close: number,\n barIndex: number,\n): { value: number; direction: number } {\n if (!Number.isFinite(close)) {\n return { value: Number.NaN, direction: Number.NaN };\n }\n if (slot.prevClosedBarCount === 0) {\n // The current bar is the first closed bar \u2014 its tick replay\n // is the seed itself (NaN, NaN).\n return { value: Number.NaN, direction: Number.NaN };\n }\n const step = recurrenceStep(\n close,\n barIndex,\n slot.deviation,\n slot.depth,\n slot.prevClosedDirection,\n slot.prevClosedLastPivotPrice,\n slot.prevClosedLastPivotIndex,\n slot.prevClosedPeakSinceLastPivot,\n slot.prevClosedPeakIndex,\n );\n return { value: step.value, direction: step.direction };\n}\n\n/**\n * ZigZag \u2014 streaming swing-pivot detector. Walks the close series\n * tracking a running candidate pivot; confirms a new pivot when the\n * price has reversed by at least `deviation %` from the candidate\n * AND `depth` bars have elapsed. The output `value` Series carries\n * the price of the most-recently-confirmed pivot (held constant\n * between confirmations); `direction` is `+1` (uptrend), `-1`\n * (downtrend), or NaN before the first confirmation. Returns a\n * cached `{ value, direction }` record (same identity every bar).\n *\n * Streaming adaptation of invinite's batch ZigZag: invinite paints\n * a linearly-interpolated polyline between confirmed pivots and\n * supports `extendToLastBar` retro-painting from the last confirmed\n * pivot to the right edge. The append-only Series model cannot\n * rewrite older slots, so the streaming output is the closest\n * representable surface (a \"trailing reference level\" Pine authors\n * would use as a stop). Defaults: `deviation = 5`, `depth = 10`.\n *\n * NaN close \u2192 NaN outputs and freezes the state machine. Tick-mode\n * replays the head from the snapshot captured at the start of the\n * current bar (mirrors PSAR / Supertrend).\n *\n * @formula Confirm pivot when |\u0394%| \u2265 deviation AND barsSince \u2265 depth :\n * up-trend: running peak updates on new highs ; flip on\n * |drop from peak| \u2265 deviation ; flip-direction emits the\n * peak (the just-confirmed top) as `value`, sets new\n * `direction = \u22121`. Down-trend symmetric.\n * @warmup input-dependent (NaN until first confirmed pivot)\n * @anchors deviation, depth\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const z = ta.zigZag({ deviation: 5 });\n * // plot(z.value);\n */\nexport function zigZag(slotId: string, opts?: ZigZagOpts): ZigZagResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as ZigZagSlot | undefined;\n if (slot === undefined) {\n const deviation = opts?.deviation ?? DEFAULT_DEVIATION;\n const depth = opts?.depth ?? DEFAULT_DEPTH;\n slot = initSlot(ctx.stream.ohlcv.close.capacity, deviation, depth);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const close = ctx.stream.bar.close;\n if (ctx.isTick) {\n // Tick replay uses the snapshot's barCount as the current-bar\n // index (the close-side incremented barCount AFTER taking the\n // snapshot, so the snapshot's barCount equals the index of\n // THIS bar).\n const barIndexForStep = slot.prevClosedBarCount;\n const { value, direction } = tickStep(slot, close, barIndexForStep);\n slot.valueBuffer.replaceHead(value);\n slot.directionBuffer.replaceHead(direction);\n } else {\n // Close-side uses slot.barCount (pre-increment in this close)\n // \u2014 the bar's 0-based index. Snapshot/seed branch handles\n // barCount === 0 explicitly.\n const barIndexForStep = slot.barCount;\n const { value, direction } = closeStep(slot, close, barIndexForStep);\n slot.valueBuffer.append(value);\n slot.directionBuffer.append(direction);\n }\n return slot.outputs;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type {\n AdlOpts,\n AdrOpts,\n AdxOpts,\n AlmaOpts,\n AnchoredVolumeProfileOpts,\n AnchoredVolumeProfileResult,\n AnchoredVwapOpts,\n AoOpts,\n AroonOpts,\n AroonOscOpts,\n AroonResult,\n AtrOpts,\n BarssinceOpts,\n BbOpts,\n BbPercentBOpts,\n BbResult,\n BbwOpts,\n BopOpts,\n CciOpts,\n ChaikinOscOpts,\n ChandeKrollStopOpts,\n ChandeKrollStopResult,\n ChandelierOpts,\n ChandelierResult,\n ChangeOpts,\n ChopOpts,\n CmfOpts,\n CmoOpts,\n ConnorsRsiOpts,\n CoppockOpts,\n CrossoverOpts,\n CrossunderOpts,\n DemaOpts,\n DmiOpts,\n DmiResult,\n DonchianOpts,\n DonchianResult,\n DpoOpts,\n EmaOpts,\n EnvelopeOpts,\n EnvelopeResult,\n EomOpts,\n FisherOpts,\n FisherResult,\n FixedRangeVolumeProfileOpts,\n FixedRangeVolumeProfileResult,\n HighestOpts,\n HmaOpts,\n HvOpts,\n IchimokuOpts,\n IchimokuResult,\n KamaOpts,\n KeltnerOpts,\n KeltnerResult,\n KlingerOpts,\n KlingerResult,\n KstOpts,\n KstResult,\n LowestOpts,\n LsmaOpts,\n MaRibbonOpts,\n MaRibbonResult,\n MacdOpts,\n MacdResult,\n MassIndexOpts,\n McginleyOpts,\n MedianOpts,\n MfiOpts,\n MomentumOpts,\n NetVolumeOpts,\n NviOpts,\n ObvOpts,\n PivotsHighLowOpts,\n PivotsHighLowResult,\n PivotsStandardOpts,\n PivotsStandardResult,\n PmoOpts,\n PmoResult,\n PpoOpts,\n PpoResult,\n PsarOpts,\n PsarResult,\n PviOpts,\n PvoOpts,\n PvoResult,\n PvtOpts,\n RocOpts,\n RsiOpts,\n RvgiOpts,\n RvgiResult,\n RviOpts,\n Series,\n SessionVolumeProfileOpts,\n SessionVolumeProfileResult,\n SmaOpts,\n SmiOpts,\n SmiResult,\n SmmaOpts,\n StdevOpts,\n StochOpts,\n StochResult,\n StochRsiOpts,\n StochRsiResult,\n SupertrendOpts,\n SupertrendResult,\n TemaOpts,\n TrendStrengthIndexOpts,\n TrixOpts,\n TrixResult,\n TsiOpts,\n TsiResult,\n UlcerIndexOpts,\n UltimateOscOpts,\n ValuewhenOpts,\n VisibleRangeVolumeProfileOpts,\n VisibleRangeVolumeProfileResult,\n VolOpts,\n VolatilityStopOpts,\n VolatilityStopResult,\n VortexOpts,\n VortexResult,\n VwapOpts,\n VwmaOpts,\n WilliamsFractalOpts,\n WilliamsFractalResult,\n WilliamsROpts,\n WmaOpts,\n ZigZagOpts,\n ZigZagResult,\n} from \"@invinite-org/chartlang-core\";\n\nimport { adl } from \"./adl.js\";\nimport { adr } from \"./adr.js\";\nimport { adx } from \"./adx.js\";\nimport { alma } from \"./alma.js\";\nimport { anchoredVolumeProfile } from \"./anchoredVolumeProfile.js\";\nimport { anchoredVwap } from \"./anchoredVwap.js\";\nimport { ao } from \"./ao.js\";\nimport { aroon } from \"./aroon.js\";\nimport { aroonOsc } from \"./aroonOsc.js\";\nimport { atr } from \"./atr.js\";\nimport { barssince } from \"./barssince.js\";\nimport { bb } from \"./bb.js\";\nimport { bbPercentB } from \"./bbPercentB.js\";\nimport { bbw } from \"./bbw.js\";\nimport { bop } from \"./bop.js\";\nimport { cci } from \"./cci.js\";\nimport { chaikinOsc } from \"./chaikinOsc.js\";\nimport { chandeKrollStop } from \"./chandeKrollStop.js\";\nimport { chandelier } from \"./chandelier.js\";\nimport { change } from \"./change.js\";\nimport { chop } from \"./chop.js\";\nimport { cmf } from \"./cmf.js\";\nimport { cmo } from \"./cmo.js\";\nimport { connorsRsi } from \"./connorsRsi.js\";\nimport { coppock } from \"./coppock.js\";\nimport { crossover } from \"./crossover.js\";\nimport { crossunder } from \"./crossunder.js\";\nimport { dema } from \"./dema.js\";\nimport { dmi } from \"./dmi.js\";\nimport { donchian } from \"./donchian.js\";\nimport { dpo } from \"./dpo.js\";\nimport { ema } from \"./ema.js\";\nimport { envelope } from \"./envelope.js\";\nimport { eom } from \"./eom.js\";\nimport { fisher } from \"./fisher.js\";\nimport { fixedRangeVolumeProfile } from \"./fixedRangeVolumeProfile.js\";\nimport { highest } from \"./highest.js\";\nimport { historicalVolatility } from \"./historicalVolatility.js\";\nimport { hma } from \"./hma.js\";\nimport { ichimoku } from \"./ichimoku.js\";\nimport { kama } from \"./kama.js\";\nimport { keltner } from \"./keltner.js\";\nimport { klinger } from \"./klinger.js\";\nimport { kst } from \"./kst.js\";\nimport type { ScalarOrSeries } from \"./lib/sourceValue.js\";\nimport { lowest } from \"./lowest.js\";\nimport { lsma } from \"./lsma.js\";\nimport { maRibbon } from \"./maRibbon.js\";\nimport { macd } from \"./macd.js\";\nimport { massIndex } from \"./massIndex.js\";\nimport { mcginley } from \"./mcginley.js\";\nimport { median } from \"./median.js\";\nimport { mfi } from \"./mfi.js\";\nimport { momentum } from \"./momentum.js\";\nimport { netVolume } from \"./netVolume.js\";\nimport { nvi } from \"./nvi.js\";\nimport { nz } from \"./nz.js\";\nimport { obv } from \"./obv.js\";\nimport { pivotsHighLow } from \"./pivotsHighLow.js\";\nimport { pivotsStandard } from \"./pivotsStandard.js\";\nimport { pmo } from \"./pmo.js\";\nimport { ppo } from \"./ppo.js\";\nimport { psar } from \"./psar.js\";\nimport { pvi } from \"./pvi.js\";\nimport { pvo } from \"./pvo.js\";\nimport { pvt } from \"./pvt.js\";\nimport { roc } from \"./roc.js\";\nimport { rsi } from \"./rsi.js\";\nimport { rvgi } from \"./rvgi.js\";\nimport { rvi } from \"./rvi.js\";\nimport { sessionVolumeProfile } from \"./sessionVolumeProfile.js\";\nimport { sma } from \"./sma.js\";\nimport { smi } from \"./smi.js\";\nimport { smma } from \"./smma.js\";\nimport { stdev } from \"./stdev.js\";\nimport { stoch } from \"./stoch.js\";\nimport { stochRsi } from \"./stochRsi.js\";\nimport { supertrend } from \"./supertrend.js\";\nimport { tema } from \"./tema.js\";\nimport { trendStrengthIndex } from \"./trendStrengthIndex.js\";\nimport { trix } from \"./trix.js\";\nimport { tsi } from \"./tsi.js\";\nimport { ulcerIndex } from \"./ulcerIndex.js\";\nimport { ultimateOsc } from \"./ultimateOsc.js\";\nimport { valuewhen } from \"./valuewhen.js\";\nimport { visibleRangeVolumeProfile } from \"./visibleRangeVolumeProfile.js\";\nimport { vol } from \"./vol.js\";\nimport { volatilityStop } from \"./volatilityStop.js\";\nimport { vortex } from \"./vortex.js\";\nimport { vwap } from \"./vwap.js\";\nimport { vwma } from \"./vwma.js\";\nimport { williamsFractal } from \"./williamsFractal.js\";\nimport { williamsR } from \"./williamsR.js\";\nimport { wma } from \"./wma.js\";\nimport { zigZag } from \"./zigZag.js\";\n\n/**\n * The runtime-facing surface of the `ta` namespace. Each method takes\n * a compiler-injected `slotId` as its first argument, then the user-\n * facing arguments core's `TaNamespace` types. The compiler (Task 2)\n * inlines the slot id as a string literal at every callsite so the\n * runtime can look up its per-callsite hidden state in\n * `RuntimeContext.stream.taSlots`. Script authors never see the slot\n * arg \u2014 they import `ta` and call `ta.ema(close, 20)`; the bundled\n * output becomes `runtime.ta.ema(\"slot-id\", close, 20)`.\n *\n * @formula N/A \u2014 type surface, see per-primitive JSDoc\n * @since 0.1\n * @stable\n * @example\n * // import type { RuntimeTaNamespace } from \"@invinite-org/chartlang-runtime\";\n * // const fn: RuntimeTaNamespace[\"ema\"] = (slotId, src, length) =>\n * // ({ current: NaN, length: 0 }) as never;\n */\nexport type RuntimeTaNamespace = {\n sma(slotId: string, source: ScalarOrSeries, length: number, opts?: SmaOpts): Series<number>;\n ema(slotId: string, source: ScalarOrSeries, length: number, opts?: EmaOpts): Series<number>;\n stdev(slotId: string, source: ScalarOrSeries, length: number, opts?: StdevOpts): Series<number>;\n bb(slotId: string, source: ScalarOrSeries, length: number, opts?: BbOpts): BbResult;\n rsi(slotId: string, source: ScalarOrSeries, length: number, opts?: RsiOpts): Series<number>;\n macd(slotId: string, source: ScalarOrSeries, opts?: MacdOpts): MacdResult;\n atr(slotId: string, length: number, opts?: AtrOpts): Series<number>;\n crossover(\n slotId: string,\n a: ScalarOrSeries,\n b: ScalarOrSeries,\n opts?: CrossoverOpts,\n ): Series<boolean>;\n crossunder(\n slotId: string,\n a: ScalarOrSeries,\n b: ScalarOrSeries,\n opts?: CrossunderOpts,\n ): Series<boolean>;\n nz(value: number, replacement?: number): number;\n highest(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: HighestOpts,\n ): Series<number>;\n lowest(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: LowestOpts,\n ): Series<number>;\n change(slotId: string, source: ScalarOrSeries, opts?: ChangeOpts): Series<number>;\n valuewhen(\n slotId: string,\n condition: Series<boolean>,\n source: ScalarOrSeries,\n occurrence?: number,\n opts?: ValuewhenOpts,\n ): Series<number>;\n barssince(slotId: string, condition: Series<boolean>, opts?: BarssinceOpts): Series<number>;\n wma(slotId: string, source: ScalarOrSeries, length: number, opts?: WmaOpts): Series<number>;\n vwma(slotId: string, source: ScalarOrSeries, length: number, opts?: VwmaOpts): Series<number>;\n hma(slotId: string, source: ScalarOrSeries, length: number, opts?: HmaOpts): Series<number>;\n smma(slotId: string, source: ScalarOrSeries, length: number, opts?: SmmaOpts): Series<number>;\n dema(slotId: string, source: ScalarOrSeries, length: number, opts?: DemaOpts): Series<number>;\n tema(slotId: string, source: ScalarOrSeries, length: number, opts?: TemaOpts): Series<number>;\n kama(slotId: string, source: ScalarOrSeries, opts?: KamaOpts): Series<number>;\n alma(slotId: string, source: ScalarOrSeries, length: number, opts?: AlmaOpts): Series<number>;\n lsma(slotId: string, source: ScalarOrSeries, length: number, opts?: LsmaOpts): Series<number>;\n mcginley(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: McginleyOpts,\n ): Series<number>;\n maRibbon(slotId: string, source: ScalarOrSeries, opts?: MaRibbonOpts): MaRibbonResult;\n ao(slotId: string, opts?: AoOpts): Series<number>;\n cmo(slotId: string, source: ScalarOrSeries, length: number, opts?: CmoOpts): Series<number>;\n momentum(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: MomentumOpts,\n ): Series<number>;\n roc(slotId: string, source: ScalarOrSeries, length: number, opts?: RocOpts): Series<number>;\n pmo(slotId: string, source: ScalarOrSeries, opts?: PmoOpts): PmoResult;\n smi(slotId: string, opts?: SmiOpts): SmiResult;\n tsi(slotId: string, source: ScalarOrSeries, opts?: TsiOpts): TsiResult;\n cci(slotId: string, source: ScalarOrSeries, length: number, opts?: CciOpts): Series<number>;\n stoch(slotId: string, opts?: StochOpts): StochResult;\n williamsR(slotId: string, length: number, opts?: WilliamsROpts): Series<number>;\n stochRsi(slotId: string, source: ScalarOrSeries, opts?: StochRsiOpts): StochRsiResult;\n ultimateOsc(slotId: string, opts?: UltimateOscOpts): Series<number>;\n coppock(slotId: string, source: ScalarOrSeries, opts?: CoppockOpts): Series<number>;\n ppo(slotId: string, source: ScalarOrSeries, opts?: PpoOpts): PpoResult;\n dpo(slotId: string, source: ScalarOrSeries, length: number, opts?: DpoOpts): Series<number>;\n connorsRsi(slotId: string, source: ScalarOrSeries, opts?: ConnorsRsiOpts): Series<number>;\n kst(slotId: string, source: ScalarOrSeries, opts?: KstOpts): KstResult;\n fisher(slotId: string, length: number, opts?: FisherOpts): FisherResult;\n klinger(slotId: string, opts?: KlingerOpts): KlingerResult;\n rvgi(slotId: string, opts?: RvgiOpts): RvgiResult;\n aroon(slotId: string, length: number, opts?: AroonOpts): AroonResult;\n aroonOsc(slotId: string, length: number, opts?: AroonOscOpts): Series<number>;\n vol(slotId: string, opts?: VolOpts): Series<number>;\n vwap(slotId: string, opts?: VwapOpts): Series<number>;\n anchoredVwap(slotId: string, anchorTime: number, opts?: AnchoredVwapOpts): Series<number>;\n anchoredVolumeProfile(\n slotId: string,\n opts: AnchoredVolumeProfileOpts,\n ): AnchoredVolumeProfileResult;\n fixedRangeVolumeProfile(\n slotId: string,\n opts: FixedRangeVolumeProfileOpts,\n ): FixedRangeVolumeProfileResult;\n sessionVolumeProfile(\n slotId: string,\n opts?: SessionVolumeProfileOpts,\n ): SessionVolumeProfileResult;\n visibleRangeVolumeProfile(\n slotId: string,\n opts?: VisibleRangeVolumeProfileOpts,\n ): VisibleRangeVolumeProfileResult;\n obv(slotId: string, opts?: ObvOpts): Series<number>;\n adl(slotId: string, opts?: AdlOpts): Series<number>;\n bop(slotId: string, opts?: BopOpts): Series<number>;\n cmf(slotId: string, length: number, opts?: CmfOpts): Series<number>;\n chaikinOsc(slotId: string, opts?: ChaikinOscOpts): Series<number>;\n mfi(slotId: string, length: number, opts?: MfiOpts): Series<number>;\n netVolume(slotId: string, opts?: NetVolumeOpts): Series<number>;\n pvo(slotId: string, opts?: PvoOpts): PvoResult;\n pvt(slotId: string, opts?: PvtOpts): Series<number>;\n eom(slotId: string, length: number, opts?: EomOpts): Series<number>;\n nvi(slotId: string, opts?: NviOpts): Series<number>;\n pvi(slotId: string, opts?: PviOpts): Series<number>;\n bbPercentB(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: BbPercentBOpts,\n ): Series<number>;\n bbw(slotId: string, source: ScalarOrSeries, length: number, opts?: BbwOpts): Series<number>;\n donchian(slotId: string, length: number, opts?: DonchianOpts): DonchianResult;\n keltner(slotId: string, opts?: KeltnerOpts): KeltnerResult;\n envelope(slotId: string, source: ScalarOrSeries, opts?: EnvelopeOpts): EnvelopeResult;\n chop(slotId: string, length: number, opts?: ChopOpts): Series<number>;\n median(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: MedianOpts,\n ): Series<number>;\n adr(slotId: string, opts?: AdrOpts): Series<number>;\n ulcerIndex(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: UlcerIndexOpts,\n ): Series<number>;\n historicalVolatility(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: HvOpts,\n ): Series<number>;\n rvi(slotId: string, source: ScalarOrSeries, length: number, opts?: RviOpts): Series<number>;\n massIndex(slotId: string, opts?: MassIndexOpts): Series<number>;\n psar(slotId: string, opts?: PsarOpts): PsarResult;\n supertrend(slotId: string, opts?: SupertrendOpts): SupertrendResult;\n chandelier(slotId: string, opts?: ChandelierOpts): ChandelierResult;\n chandeKrollStop(slotId: string, opts?: ChandeKrollStopOpts): ChandeKrollStopResult;\n williamsFractal(slotId: string, opts?: WilliamsFractalOpts): WilliamsFractalResult;\n zigZag(slotId: string, opts?: ZigZagOpts): ZigZagResult;\n pivotsHighLow(slotId: string, opts?: PivotsHighLowOpts): PivotsHighLowResult;\n pivotsStandard(slotId: string, opts?: PivotsStandardOpts): PivotsStandardResult;\n volatilityStop(slotId: string, opts?: VolatilityStopOpts): VolatilityStopResult;\n adx(slotId: string, length: number, opts?: AdxOpts): Series<number>;\n dmi(slotId: string, length: number, opts?: DmiOpts): DmiResult;\n trix(slotId: string, source: ScalarOrSeries, length: number, opts?: TrixOpts): TrixResult;\n vortex(slotId: string, length: number, opts?: VortexOpts): VortexResult;\n trendStrengthIndex(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: TrendStrengthIndexOpts,\n ): Series<number>;\n ichimoku(slotId: string, opts?: IchimokuOpts): IchimokuResult;\n};\n\n/**\n * Frozen registry of every Phase-1 + Phase-2 `ta.*` primitive. Wave-5\n * cardinality grows as each parallel task lands; the final Phase-2\n * count is verified at closeout (Task 30). Phase-1 ships 9; cross-\n * functional Task 5 adds 6; Task 6 adds 4 MA ports (`wma`, `vwma`,\n * `hma`, `smma`); Task 9 adds 3 oscillators; Task 13 adds 4 momentum;\n * Task 15 adds 2 trend.\n *\n * @formula N/A \u2014 frozen registry, see per-primitive JSDoc\n * @since 0.1\n * @stable\n * @example\n * // import { TA_REGISTRY } from \"@invinite-org/chartlang-runtime\";\n * // const keys = Object.keys(TA_REGISTRY);\n */\nexport const TA_REGISTRY = Object.freeze({\n sma,\n ema,\n stdev,\n bb,\n rsi,\n macd,\n atr,\n crossover,\n crossunder,\n nz,\n highest,\n lowest,\n change,\n valuewhen,\n barssince,\n wma,\n vwma,\n hma,\n smma,\n dema,\n tema,\n kama,\n alma,\n lsma,\n mcginley,\n maRibbon,\n ao,\n cmo,\n momentum,\n roc,\n pmo,\n smi,\n tsi,\n cci,\n stoch,\n williamsR,\n stochRsi,\n ultimateOsc,\n coppock,\n ppo,\n dpo,\n connorsRsi,\n kst,\n fisher,\n klinger,\n rvgi,\n aroon,\n aroonOsc,\n vol,\n vwap,\n anchoredVwap,\n anchoredVolumeProfile,\n fixedRangeVolumeProfile,\n sessionVolumeProfile,\n visibleRangeVolumeProfile,\n obv,\n adl,\n bop,\n cmf,\n chaikinOsc,\n mfi,\n netVolume,\n pvo,\n pvt,\n eom,\n nvi,\n pvi,\n bbPercentB,\n bbw,\n donchian,\n keltner,\n envelope,\n chop,\n median,\n adr,\n ulcerIndex,\n historicalVolatility,\n rvi,\n massIndex,\n psar,\n supertrend,\n chandelier,\n chandeKrollStop,\n williamsFractal,\n zigZag,\n pivotsHighLow,\n pivotsStandard,\n volatilityStop,\n adx,\n dmi,\n trix,\n vortex,\n trendStrengthIndex,\n ichimoku,\n} as const);\n\n/**\n * Y-domain hint a primitive can advertise. `\"auto\"` is the default \u2014\n * the renderer fits the visible-window data range. `\"fixed\"` pins the\n * range to a `[min, max]` interval (bounded oscillators like Stoch /\n * Williams %R).\n *\n * @formula N/A \u2014 metadata type, see consumer renderers\n * @since 0.2\n * @stable\n * @example\n * // const stochYDomain: YDomainSpec = { kind: \"fixed\", min: 0, max: 100 };\n */\nexport type YDomainSpec = Readonly<{ kind: \"auto\" } | { kind: \"fixed\"; min: number; max: number }>;\n\n/**\n * Per-primitive metadata layer the registry surfaces for renderers\n * (pane layout, legend ordering, y-axis scaling). Every field is\n * optional \u2014 primitives that don't advertise metadata default to\n * `primarySeriesKey = \"default\"` and `yDomain = { kind: \"auto\" }` in\n * the consumer. Phase-2 Task 9 introduces this surface; future\n * bounded oscillators (`stochRsi`, `ultimateOsc`) populate it\n * verbatim.\n *\n * @formula N/A \u2014 metadata type, see consumer renderers\n * @since 0.2\n * @stable\n * @example\n * // const meta: PrimitiveMetadata = {\n * // primarySeriesKey: \"k\",\n * // visibleSeriesKeys: [\"k\", \"d\"],\n * // yDomain: { kind: \"fixed\", min: 0, max: 100 },\n * // };\n */\nexport type PrimitiveMetadata = Readonly<{\n primarySeriesKey?: string;\n visibleSeriesKeys?: ReadonlyArray<string>;\n yDomain?: YDomainSpec;\n}>;\n\n/**\n * Frozen metadata table keyed by `TA_REGISTRY` id. Only primitives\n * with a non-default metadata payload appear. `ta.stoch` records its\n * `[0, 100]` range + `primarySeriesKey: \"k\"` + the visible-series\n * order for the legend. `ta.williamsR` records its `[-100, 0]` range.\n * Phase-1 entries + the cross-functional Task-5 entries are\n * unannotated.\n *\n * @formula N/A \u2014 frozen metadata table, see per-primitive `PrimitiveMetadata`\n * @since 0.2\n * @stable\n * @example\n * // import { TA_REGISTRY_METADATA } from \"@invinite-org/chartlang-runtime\";\n * // const stochMeta = TA_REGISTRY_METADATA.stoch;\n */\nexport const TA_REGISTRY_METADATA: Readonly<\n Partial<Record<keyof typeof TA_REGISTRY, PrimitiveMetadata>>\n> = Object.freeze({\n stoch: Object.freeze({\n primarySeriesKey: \"k\",\n visibleSeriesKeys: Object.freeze([\"k\", \"d\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"fixed\", min: 0, max: 100 } as const),\n }),\n williamsR: Object.freeze({\n yDomain: Object.freeze({ kind: \"fixed\", min: -100, max: 0 } as const),\n }),\n stochRsi: Object.freeze({\n primarySeriesKey: \"k\",\n visibleSeriesKeys: Object.freeze([\"k\", \"d\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"fixed\", min: 0, max: 100 } as const),\n }),\n ultimateOsc: Object.freeze({\n yDomain: Object.freeze({ kind: \"fixed\", min: 0, max: 100 } as const),\n }),\n ppo: Object.freeze({\n primarySeriesKey: \"ppo\",\n visibleSeriesKeys: Object.freeze([\"ppo\", \"signal\", \"hist\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n pvo: Object.freeze({\n primarySeriesKey: \"pvo\",\n visibleSeriesKeys: Object.freeze([\"pvo\", \"signal\", \"hist\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n sessionVolumeProfile: Object.freeze({\n primarySeriesKey: \"poc\",\n visibleSeriesKeys: Object.freeze([\"poc\", \"valHigh\", \"valLow\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n fixedRangeVolumeProfile: Object.freeze({\n primarySeriesKey: \"poc\",\n visibleSeriesKeys: Object.freeze([\"poc\", \"valHigh\", \"valLow\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n connorsRsi: Object.freeze({\n yDomain: Object.freeze({ kind: \"fixed\", min: 0, max: 100 } as const),\n }),\n pmo: Object.freeze({\n primarySeriesKey: \"pmo\",\n visibleSeriesKeys: Object.freeze([\"pmo\", \"signal\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n smi: Object.freeze({\n primarySeriesKey: \"smi\",\n visibleSeriesKeys: Object.freeze([\"smi\", \"signal\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"fixed\", min: -100, max: 100 } as const),\n }),\n tsi: Object.freeze({\n primarySeriesKey: \"tsi\",\n visibleSeriesKeys: Object.freeze([\"tsi\", \"signal\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n kst: Object.freeze({\n primarySeriesKey: \"kst\",\n visibleSeriesKeys: Object.freeze([\"kst\", \"signal\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n fisher: Object.freeze({\n primarySeriesKey: \"fisher\",\n visibleSeriesKeys: Object.freeze([\"fisher\", \"trigger\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n klinger: Object.freeze({\n primarySeriesKey: \"klinger\",\n visibleSeriesKeys: Object.freeze([\"klinger\", \"signal\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n rvgi: Object.freeze({\n primarySeriesKey: \"rvgi\",\n visibleSeriesKeys: Object.freeze([\"rvgi\", \"signal\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n anchoredVolumeProfile: Object.freeze({\n primarySeriesKey: \"poc\",\n visibleSeriesKeys: Object.freeze([\"poc\", \"valHigh\", \"valLow\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n aroon: Object.freeze({\n primarySeriesKey: \"up\",\n visibleSeriesKeys: Object.freeze([\"up\", \"down\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"fixed\", min: 0, max: 100 } as const),\n }),\n aroonOsc: Object.freeze({\n yDomain: Object.freeze({ kind: \"fixed\", min: -100, max: 100 } as const),\n }),\n donchian: Object.freeze({\n primarySeriesKey: \"middle\",\n visibleSeriesKeys: Object.freeze([\"upper\", \"middle\", \"lower\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n keltner: Object.freeze({\n primarySeriesKey: \"middle\",\n visibleSeriesKeys: Object.freeze([\"upper\", \"middle\", \"lower\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n envelope: Object.freeze({\n primarySeriesKey: \"middle\",\n visibleSeriesKeys: Object.freeze([\"upper\", \"middle\", \"lower\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n chop: Object.freeze({\n yDomain: Object.freeze({ kind: \"fixed\", min: 0, max: 100 } as const),\n }),\n psar: Object.freeze({\n primarySeriesKey: \"sar\",\n visibleSeriesKeys: Object.freeze([\"sar\", \"direction\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n supertrend: Object.freeze({\n primarySeriesKey: \"line\",\n visibleSeriesKeys: Object.freeze([\"line\", \"direction\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n chandelier: Object.freeze({\n primarySeriesKey: \"long\",\n visibleSeriesKeys: Object.freeze([\"long\", \"short\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n chandeKrollStop: Object.freeze({\n primarySeriesKey: \"long\",\n visibleSeriesKeys: Object.freeze([\"long\", \"short\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n williamsFractal: Object.freeze({\n primarySeriesKey: \"up\",\n visibleSeriesKeys: Object.freeze([\"up\", \"down\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n zigZag: Object.freeze({\n primarySeriesKey: \"value\",\n visibleSeriesKeys: Object.freeze([\"value\", \"direction\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n pivotsHighLow: Object.freeze({\n primarySeriesKey: \"high\",\n visibleSeriesKeys: Object.freeze([\"high\", \"low\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n pivotsStandard: Object.freeze({\n primarySeriesKey: \"pp\",\n visibleSeriesKeys: Object.freeze([\n \"pp\",\n \"r1\",\n \"s1\",\n \"r2\",\n \"s2\",\n \"r3\",\n \"s3\",\n ]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n volatilityStop: Object.freeze({\n primarySeriesKey: \"value\",\n visibleSeriesKeys: Object.freeze([\"value\", \"direction\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n maRibbon: Object.freeze({\n primarySeriesKey: \"ma_50\",\n visibleSeriesKeys: Object.freeze([\n \"ma_10\",\n \"ma_20\",\n \"ma_30\",\n \"ma_40\",\n \"ma_50\",\n ]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n adx: Object.freeze({\n yDomain: Object.freeze({ kind: \"fixed\", min: 0, max: 100 } as const),\n }),\n dmi: Object.freeze({\n primarySeriesKey: \"plusDi\",\n visibleSeriesKeys: Object.freeze([\"plusDi\", \"minusDi\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"fixed\", min: 0, max: 100 } as const),\n }),\n trix: Object.freeze({\n primarySeriesKey: \"trix\",\n visibleSeriesKeys: Object.freeze([\"trix\", \"signal\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n vortex: Object.freeze({\n primarySeriesKey: \"plus\",\n visibleSeriesKeys: Object.freeze([\"plus\", \"minus\"]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n trendStrengthIndex: Object.freeze({\n yDomain: Object.freeze({ kind: \"fixed\", min: -1, max: 1 } as const),\n }),\n ichimoku: Object.freeze({\n primarySeriesKey: \"tenkan\",\n visibleSeriesKeys: Object.freeze([\n \"tenkan\",\n \"kijun\",\n \"senkouA\",\n \"senkouB\",\n \"chikou\",\n ]) as ReadonlyArray<string>,\n yDomain: Object.freeze({ kind: \"auto\" } as const),\n }),\n});\n\n/**\n * The script-facing `ta` constant the compiler binds against. Equal\n * by identity to {@link TA_REGISTRY}; typed as the slot-aware\n * {@link RuntimeTaNamespace} so downstream consumers (the host-worker\n * boot, the conformance harness) get the runtime signature.\n *\n * @formula N/A \u2014 script-facing namespace, see per-primitive JSDoc\n * @since 0.1\n * @stable\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const out = ta.ema(\"slot-id\", { current: 12 }, 20);\n */\nexport const ta: RuntimeTaNamespace = TA_REGISTRY;\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { TaNamespace } from \"@invinite-org/chartlang-core\";\n\nimport { TA_REGISTRY } from \"./ta/index.js\";\n\n/**\n * The runtime's `ta` namespace as the compiled script sees it. Task 6's\n * `createScriptRunner` puts this on the `ComputeContext` it hands the\n * compiled script; Task 7 swapped the body from a throw-stub to the\n * real {@link TA_REGISTRY} (`./ta/registry`). Identity is preserved\n * across the swap \u2014 `buildComputeContext.ts` still imports `ta` from\n * here and the runner contract from Task 6 stays untouched.\n *\n * The runtime impls take a compiler-injected `slotId` as their first\n * argument; the compiler erases the extra arg at the type boundary so\n * `ComputeContext.ta: TaNamespace` (script-facing) and the bundled call\n * `ta.ema(\"slot-id\", src, length)` are structurally compatible at\n * runtime.\n *\n * @since 0.1\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // type S = typeof ta;\n */\nexport const ta: TaNamespace = TA_REGISTRY as unknown as TaNamespace;\n\nexport { alert, draw, hline, plot } from \"./emit/index.js\";\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { ComputeContext } from \"@invinite-org/chartlang-core\";\n\nimport type { RunnerState } from \"./createScriptRunner.js\";\nimport { alert, draw, hline, plot, ta } from \"./primitives.js\";\nimport { emitAlertCondition } from \"./emit/alertConditionEmission.js\";\nimport { buildRuntimeNamespace } from \"./emit/logEmission.js\";\nimport { buildRequestNamespace } from \"./request/index.js\";\nimport { buildStateNamespace } from \"./state/index.js\";\n\n/**\n * Build the `ComputeContext` the runner hands the compiled script on\n * every step. Phase 1 returns the runtime's stable `BarView` (identity\n * preserved across bars per PLAN \u00A76.7), the mount-resolved frozen\n * `inputs` record, and the runtime primitive implementations.\n *\n * The `bar` field is the mutable `BarView` typed-narrowed to the\n * readonly `Bar` surface the script sees. Identity is stable, so a\n * `const { bar } = ctx` at the top of `compute` keeps seeing the live\n * scalars without re-binding per bar.\n *\n * @since 0.1\n * @example\n * // import { buildComputeContext } from \"@invinite-org/chartlang-runtime\";\n * // const ctx = buildComputeContext(state);\n * // void ctx.bar.close;\n */\nexport function buildComputeContext(state: RunnerState): ComputeContext {\n const base = {\n bar: state.mainStream.bar,\n inputs: state.runtimeContext.resolvedInputs,\n ta,\n plot,\n hline,\n alert,\n draw,\n state: buildStateNamespace(),\n barstate: state.runtimeContext.views.barstate,\n syminfo: state.runtimeContext.views.syminfo,\n timeframe: state.runtimeContext.views.timeframe,\n request: buildRequestNamespace(),\n runtime: buildRuntimeNamespace(state.runtimeContext),\n };\n if (state.manifest.kind !== \"alertCondition\") return base;\n return {\n ...base,\n signal: (conditionId, fired) =>\n emitAlertCondition(state.runtimeContext, conditionId, fired),\n };\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { Bar } from \"@invinite-org/chartlang-core\";\n\nimport { buildComputeContext } from \"../buildComputeContext.js\";\nimport type { RunnerState } from \"../createScriptRunner.js\";\nimport { isRuntimeErrorHalt, pushDiagnostic } from \"../emit/index.js\";\nimport { resetSubIdCounters } from \"../emit/draw/index.js\";\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../runtimeContext.js\";\nimport { commitStateSlots, flushStateSlots } from \"../state/index.js\";\nimport { appendBarToStream, updateFallbackViewport } from \"../streamState.js\";\nimport { type EventKind, refreshRuntimeViews } from \"../views/index.js\";\n\n/**\n * \u00A76.7 main step. Appends every OHLCV ring buffer, mutates the runner's\n * shared `BarView` in place, clears the per-bar emission queues, and\n * runs the script's `compute` under `ACTIVE_RUNTIME_CONTEXT`. The four\n * \u00A76.7 invariants hold at the end of step 3 (right before `compute`).\n *\n * The derived sources (`hl2` / `hlc3` / `ohlc4` / `hlcc4`) come from\n * `rawBar` directly \u2014 cheaper than `ohlcv.X.at(0)` and sidesteps\n * `noNonNullAssertion`. The buffer and the `BarView` carry identical\n * values either way.\n *\n * `barIndex` advances exactly once per close. Errors thrown by\n * `compute` propagate out of `onBarClose`; the host (Task 9) owns\n * containment.\n *\n * @since 0.1\n * @example\n * // import { onBarClose } from \"@invinite-org/chartlang-runtime\";\n * // await onBarClose(state, rawBar);\n */\nexport async function onBarClose(\n state: RunnerState,\n rawBar: Bar,\n eventKind: EventKind = \"close\",\n): Promise<void> {\n appendBarToStream(state.mainStream, rawBar);\n updateFallbackViewport(state.mainStream);\n\n state.emissions.plots = [];\n state.emissions.drawings = [];\n state.emissions.alerts = [];\n state.emissions.alertConditions = [];\n state.emissions.logs = [];\n state.emissions.diagnostics = [];\n state.emissions.fromBar = state.barIndex;\n state.emissions.toBar = state.barIndex;\n state.runtimeContext.requestSecurityAlignments.clear();\n state.runtimeContext.requestSecurityAscendingBars.clear();\n state.runtimeContext.logBudget = 0;\n state.runtimeContext.logBudgetExceededDiagnosed = false;\n\n ACTIVE_RUNTIME_CONTEXT.current = state.runtimeContext;\n state.runtimeContext.isTick = false;\n try {\n resetSubIdCounters(state.runtimeContext);\n refreshRuntimeViews(state, eventKind);\n try {\n await Promise.resolve(state.compute(buildComputeContext(state)));\n commitStateSlots(state.runtimeContext);\n flushStateSlots(state.runtimeContext);\n } catch (err) {\n if (!isRuntimeErrorHalt(err)) throw err;\n state.emissions.plots = [];\n state.emissions.drawings = [];\n state.emissions.alerts = [];\n state.emissions.alertConditions = [];\n state.emissions.logs = [];\n pushDiagnostic(state.emissions, {\n kind: \"diagnostic\",\n severity: \"error\",\n code: \"runtime-error-thrown\",\n message: err.message,\n slotId: null,\n bar: state.barIndex,\n });\n }\n } finally {\n ACTIVE_RUNTIME_CONTEXT.current = null;\n }\n\n state.barIndex += 1;\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { Bar } from \"@invinite-org/chartlang-core\";\n\nimport { buildComputeContext } from \"../buildComputeContext.js\";\nimport type { RunnerState } from \"../createScriptRunner.js\";\nimport { isRuntimeErrorHalt, pushDiagnostic } from \"../emit/index.js\";\nimport { resetSubIdCounters } from \"../emit/draw/index.js\";\nimport { ACTIVE_RUNTIME_CONTEXT } from \"../runtimeContext.js\";\nimport { resetTentativeStateSlots } from \"../state/index.js\";\nimport { replaceTickHead, updateFallbackViewport } from \"../streamState.js\";\nimport { refreshRuntimeViews } from \"../views/index.js\";\n\n/**\n * \u00A76.7 tick path. Replaces the head slot on every close-side OHLCV\n * buffer (close / high / low / volume / derived sources) \u2014 does NOT\n * advance the buffer length. `time` and `open` are NOT replaced: ticks\n * happen within the in-progress bar whose open time was set on the\n * preceding `onBarClose`.\n *\n * The runtime exposes `state.runtimeContext.isTick = true` for the\n * duration of `compute`. Task 7 stateful primitives read this flag to\n * switch between `append` and `replaceHead` slot updates. `isTick` is\n * reset to `false` in the finally block regardless of compute outcome.\n *\n * `state.barIndex` is NOT incremented \u2014 consecutive ticks share the\n * in-progress bar's index.\n *\n * @since 0.1\n * @example\n * // import { onBarTick } from \"@invinite-org/chartlang-runtime\";\n * // await onBarTick(state, tickBar);\n */\nexport async function onBarTick(state: RunnerState, rawBar: Bar): Promise<void> {\n replaceTickHead(state.mainStream, rawBar);\n updateFallbackViewport(state.mainStream);\n\n state.emissions.plots = [];\n state.emissions.drawings = [];\n state.emissions.alerts = [];\n state.emissions.alertConditions = [];\n state.emissions.logs = [];\n state.emissions.diagnostics = [];\n state.emissions.fromBar = state.barIndex;\n state.emissions.toBar = state.barIndex;\n state.runtimeContext.requestSecurityAlignments.clear();\n state.runtimeContext.requestSecurityAscendingBars.clear();\n state.runtimeContext.logBudget = 0;\n state.runtimeContext.logBudgetExceededDiagnosed = false;\n\n ACTIVE_RUNTIME_CONTEXT.current = state.runtimeContext;\n state.runtimeContext.isTick = true;\n try {\n resetSubIdCounters(state.runtimeContext);\n resetTentativeStateSlots(state.runtimeContext);\n refreshRuntimeViews(state, \"tick\");\n try {\n await Promise.resolve(state.compute(buildComputeContext(state)));\n } catch (err) {\n if (!isRuntimeErrorHalt(err)) throw err;\n state.emissions.plots = [];\n state.emissions.drawings = [];\n state.emissions.alerts = [];\n state.emissions.alertConditions = [];\n state.emissions.logs = [];\n pushDiagnostic(state.emissions, {\n kind: \"diagnostic\",\n severity: \"error\",\n code: \"runtime-error-thrown\",\n message: err.message,\n slotId: null,\n bar: state.barIndex,\n });\n }\n } finally {\n state.runtimeContext.isTick = false;\n ACTIVE_RUNTIME_CONTEXT.current = null;\n }\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { Bar } from \"@invinite-org/chartlang-core\";\n\nimport type { RunnerState } from \"../createScriptRunner.js\";\nimport { onBarClose } from \"./onBarClose.js\";\n\n/**\n * Bulk-fill warmup. Walks `bars` forward and runs `onBarClose` per\n * entry, preserving the \u00A76.4 determinism contract (every bar passes\n * through `compute` in source order). A Phase-2 optimisation could\n * pre-fill ring buffers without re-running compute, but stay correct\n * first.\n *\n * Emissions accumulate across the bulk walk: PLAN \u00A76.1 promises\n * `drain()` returns every emission \"since the last drain\", but\n * `onBarClose` resets the per-bar queues at the top of each bar. Without\n * the accumulator below, a host that pushes a `{ kind: \"history\", bars }`\n * event and drains once afterwards (as `canvas2d-adapter` does) would\n * only see the final bar's emissions. We seed the accumulators from\n * the pre-history queues so an undrained prior emission isn't silently\n * dropped, then write the merged arrays back at the end. `fromBar`\n * reverts to the first bar of the walk; `toBar` is left as the final\n * `onBarClose` set it (the last bar's index).\n *\n * Errors thrown by `compute` propagate immediately \u2014 subsequent bars\n * do not run. The host (Task 9) owns containment + reporting.\n *\n * @since 0.1\n * @example\n * // import { onHistory } from \"@invinite-org/chartlang-runtime\";\n * // await onHistory(state, historicalBars);\n * // const out = drain(state); // every bar's emissions, not just the last.\n */\nexport async function onHistory(state: RunnerState, bars: ReadonlyArray<Bar>): Promise<void> {\n if (bars.length === 0) return;\n const fromBar = state.barIndex;\n const plots = state.emissions.plots;\n const drawings = state.emissions.drawings;\n const alerts = state.emissions.alerts;\n const alertConditions = state.emissions.alertConditions ?? [];\n const logs = state.emissions.logs;\n const diagnostics = state.emissions.diagnostics;\n for (const bar of bars) {\n await onBarClose(state, bar, \"history\");\n plots.push(...state.emissions.plots);\n drawings.push(...state.emissions.drawings);\n alerts.push(...state.emissions.alerts);\n alertConditions.push(...(state.emissions.alertConditions ?? []));\n logs.push(...state.emissions.logs);\n diagnostics.push(...state.emissions.diagnostics);\n }\n state.emissions.plots = plots;\n state.emissions.drawings = drawings;\n state.emissions.alerts = alerts;\n state.emissions.alertConditions = alertConditions;\n state.emissions.logs = logs;\n state.emissions.diagnostics = diagnostics;\n state.emissions.fromBar = fromBar;\n // `toBar` was set to the last bar's index by the final `onBarClose`.\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { Bar } from \"@invinite-org/chartlang-core\";\n\nimport { appendBarToStream, replaceStreamHead, type StreamState } from \"../streamState.js\";\n\n/**\n * Append a finalised candle to a secondary stream without running compute.\n *\n * @since 0.5\n * @internal\n * @example\n * // appendSecondaryBar(stream, bar);\n * const appended = true;\n * void appended;\n */\nexport function appendSecondaryBar(stream: StreamState, rawBar: Bar): void {\n appendBarToStream(stream, rawBar);\n}\n\n/**\n * Replace the current secondary stream head with an intra-bar update.\n *\n * @since 0.5\n * @internal\n * @example\n * // replaceSecondaryHead(stream, bar);\n * const replaced = true;\n * void replaced;\n */\nexport function replaceSecondaryHead(stream: StreamState, rawBar: Bar): void {\n replaceStreamHead(stream, rawBar);\n}\n\n/**\n * Append a history batch to a secondary stream in source order.\n *\n * @since 0.5\n * @internal\n * @example\n * // appendSecondaryHistory(stream, []);\n * const appended = true;\n * void appended;\n */\nexport function appendSecondaryHistory(stream: StreamState, bars: ReadonlyArray<Bar>): void {\n for (const bar of bars) {\n appendBarToStream(stream, bar);\n }\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { JsonValue, StateSnapshot, StreamSnapshot } from \"@invinite-org/chartlang-core\";\n\nconst bufferKeys = [\"time\", \"open\", \"high\", \"low\", \"close\", \"volume\"] as const;\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isJsonValue(value: unknown): value is JsonValue {\n if (value === null) return true;\n if (typeof value === \"string\" || typeof value === \"boolean\") return true;\n if (typeof value === \"number\") return Number.isFinite(value);\n if (Array.isArray(value)) return value.every((entry) => isJsonValue(entry));\n if (isRecord(value)) {\n return Object.values(value).every((entry) => isJsonValue(entry));\n }\n return false;\n}\n\nfunction isSnapshotNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isBufferArray(value: unknown): value is ReadonlyArray<number | null> {\n return (\n Array.isArray(value) && value.every((entry) => entry === null || isSnapshotNumber(entry))\n );\n}\n\nfunction isStreamSnapshot(value: unknown): value is StreamSnapshot {\n if (!isRecord(value)) return false;\n if (typeof value.interval !== \"string\") return false;\n if (!Number.isInteger(value.headIndex) || !Number.isInteger(value.filled)) return false;\n const buffers = value.buffers;\n if (!isRecord(buffers)) return false;\n return bufferKeys.every((key) => isBufferArray(buffers[key]));\n}\n\n/**\n * Validate a PLAN \u00A76.9 persistent state snapshot before restore/save.\n *\n * @since 0.5\n * @internal\n * @stable\n * @example\n * // import { validateSnapshot }\n * // from \"@invinite-org/chartlang-runtime/internal\";\n * // validateSnapshot(snapshot); // true when the shape is JSON-clean\n */\nexport function validateSnapshot(snap: unknown): snap is StateSnapshot {\n if (!isRecord(snap)) return false;\n if (snap.snapshotVersion !== 1) return false;\n if (!isSnapshotNumber(snap.lastBarTime) || !isSnapshotNumber(snap.savedAt)) return false;\n if (!isRecord(snap.streams) || !isRecord(snap.slots)) return false;\n if (!Object.values(snap.streams).every((stream) => isStreamSnapshot(stream))) return false;\n return Object.values(snap.slots).every((slot) => isJsonValue(slot));\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { JsonValue, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport type { StreamState } from \"../streamState.js\";\n\nconst TA_SLOT_PREFIX = \"ta:\";\n\ntype BufferSnapshot = Readonly<{\n headIndex: number;\n filled: number;\n values: ReadonlyArray<number | null>;\n}>;\n\ntype RestoredBaseSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly shiftedViews: Map<number, Series<number>>;\n};\n\ntype RestoredSmaSlot = RestoredBaseSlot & {\n readonly kind: \"ta.sma\";\n readonly length: number;\n readonly window: Float64RingBuffer;\n sum: number;\n};\n\ntype RestoredEmaSlot = RestoredBaseSlot & {\n readonly kind: \"ta.ema\";\n readonly alpha: number;\n readonly length: number;\n seedSum: number;\n seedCount: number;\n prevEma: number;\n prevClosedEma: number;\n};\n\ntype RestoredRsiSlot = RestoredBaseSlot & {\n readonly kind: \"ta.rsi\";\n readonly length: number;\n seedGainSum: number;\n seedLossSum: number;\n diffCount: number;\n avgGain: number;\n avgLoss: number;\n prevSrc: number;\n prevClosedSrc: number;\n};\n\ntype RestoredTaSlot = RestoredSmaSlot | RestoredEmaSlot | RestoredRsiSlot;\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction finiteOrNull(value: number): number | null {\n return Number.isFinite(value) ? value : null;\n}\n\nfunction restoreNumber(value: unknown): number | null {\n if (value === null) return Number.NaN;\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\n/**\n * Restore a record of named numeric fields, returning `null` if any one\n * field fails {@link restoreNumber}. Lets restore functions read several\n * persisted numbers in one all-or-nothing step instead of an OR-chain of\n * per-field null checks.\n *\n * @internal\n */\nfunction restoreNumbers<K extends string>(\n fields: Readonly<Record<K, unknown>>,\n): Record<K, number> | null {\n const out = {} as Record<K, number>;\n for (const key of Object.keys(fields) as K[]) {\n const restored = restoreNumber(fields[key]);\n if (restored === null) return null;\n out[key] = restored;\n }\n return out;\n}\n\nfunction isInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isInteger(value);\n}\n\nfunction isBufferSnapshot(value: unknown): value is BufferSnapshot {\n if (!isRecord(value)) return false;\n if (!isInteger(value.headIndex) || !isInteger(value.filled)) return false;\n return (\n Array.isArray(value.values) &&\n value.values.every(\n (entry) => entry === null || (typeof entry === \"number\" && Number.isFinite(entry)),\n )\n );\n}\n\nfunction serialiseBuffer(buffer: Float64RingBuffer): JsonValue {\n const snapshot = buffer.serialiseSnapshotBuffer();\n return {\n headIndex: snapshot.headIndex,\n filled: snapshot.filled,\n values: snapshot.values,\n };\n}\n\nfunction restoreBuffer(snapshot: BufferSnapshot, capacity: number): Float64RingBuffer | null {\n const buffer = new Float64RingBuffer(capacity);\n try {\n buffer.restoreFromSnapshotBuffer(snapshot);\n return buffer;\n } catch {\n return null;\n }\n}\n\nfunction baseSlot(outBuffer: Float64RingBuffer): RestoredBaseSlot {\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n shiftedViews: new Map<number, Series<number>>(),\n };\n}\n\nfunction isFloat64RingBuffer(value: unknown): value is Float64RingBuffer {\n return value instanceof Float64RingBuffer;\n}\n\nfunction serialiseSma(slot: Readonly<Record<string, unknown>>): JsonValue | null {\n if (\n slot.kind !== \"ta.sma\" ||\n typeof slot.length !== \"number\" ||\n typeof slot.sum !== \"number\" ||\n !isFloat64RingBuffer(slot.outBuffer) ||\n !isFloat64RingBuffer(slot.window)\n ) {\n return null;\n }\n return {\n kind: \"ta.sma\",\n length: slot.length,\n outBuffer: serialiseBuffer(slot.outBuffer),\n window: serialiseBuffer(slot.window),\n sum: finiteOrNull(slot.sum),\n };\n}\n\nfunction serialiseEma(slot: Readonly<Record<string, unknown>>): JsonValue | null {\n if (\n slot.kind !== \"ta.ema\" ||\n typeof slot.alpha !== \"number\" ||\n typeof slot.length !== \"number\" ||\n typeof slot.seedSum !== \"number\" ||\n typeof slot.seedCount !== \"number\" ||\n typeof slot.prevEma !== \"number\" ||\n typeof slot.prevClosedEma !== \"number\" ||\n !isFloat64RingBuffer(slot.outBuffer)\n ) {\n return null;\n }\n return {\n kind: \"ta.ema\",\n alpha: finiteOrNull(slot.alpha),\n length: slot.length,\n outBuffer: serialiseBuffer(slot.outBuffer),\n seedSum: finiteOrNull(slot.seedSum),\n seedCount: slot.seedCount,\n prevEma: finiteOrNull(slot.prevEma),\n prevClosedEma: finiteOrNull(slot.prevClosedEma),\n };\n}\n\nfunction serialiseRsi(slot: Readonly<Record<string, unknown>>): JsonValue | null {\n if (\n slot.kind !== \"ta.rsi\" ||\n typeof slot.length !== \"number\" ||\n typeof slot.seedGainSum !== \"number\" ||\n typeof slot.seedLossSum !== \"number\" ||\n typeof slot.diffCount !== \"number\" ||\n typeof slot.avgGain !== \"number\" ||\n typeof slot.avgLoss !== \"number\" ||\n typeof slot.prevSrc !== \"number\" ||\n typeof slot.prevClosedSrc !== \"number\" ||\n !isFloat64RingBuffer(slot.outBuffer)\n ) {\n return null;\n }\n return {\n kind: \"ta.rsi\",\n length: slot.length,\n outBuffer: serialiseBuffer(slot.outBuffer),\n seedGainSum: finiteOrNull(slot.seedGainSum),\n seedLossSum: finiteOrNull(slot.seedLossSum),\n diffCount: slot.diffCount,\n avgGain: finiteOrNull(slot.avgGain),\n avgLoss: finiteOrNull(slot.avgLoss),\n prevSrc: finiteOrNull(slot.prevSrc),\n prevClosedSrc: finiteOrNull(slot.prevClosedSrc),\n };\n}\n\nfunction restoreSma(snapshot: Readonly<Record<string, unknown>>): RestoredSmaSlot | null {\n const outSnapshot = snapshot.outBuffer;\n const windowSnapshot = snapshot.window;\n if (\n snapshot.kind !== \"ta.sma\" ||\n !isInteger(snapshot.length) ||\n !isBufferSnapshot(outSnapshot) ||\n !isBufferSnapshot(windowSnapshot)\n ) {\n return null;\n }\n const sum = restoreNumber(snapshot.sum);\n if (sum === null) return null;\n const outBuffer = restoreBuffer(outSnapshot, outSnapshot.values.length);\n const window = restoreBuffer(windowSnapshot, snapshot.length);\n if (outBuffer === null || window === null) return null;\n return {\n kind: \"ta.sma\",\n ...baseSlot(outBuffer),\n length: snapshot.length,\n window,\n sum,\n };\n}\n\nfunction restoreEma(snapshot: Readonly<Record<string, unknown>>): RestoredEmaSlot | null {\n const outSnapshot = snapshot.outBuffer;\n if (\n snapshot.kind !== \"ta.ema\" ||\n !isInteger(snapshot.length) ||\n !isInteger(snapshot.seedCount) ||\n !isBufferSnapshot(outSnapshot)\n ) {\n return null;\n }\n const numbers = restoreNumbers({\n alpha: snapshot.alpha,\n seedSum: snapshot.seedSum,\n prevEma: snapshot.prevEma,\n prevClosedEma: snapshot.prevClosedEma,\n });\n if (numbers === null) return null;\n const outBuffer = restoreBuffer(outSnapshot, outSnapshot.values.length);\n if (outBuffer === null) return null;\n return {\n kind: \"ta.ema\",\n ...baseSlot(outBuffer),\n alpha: numbers.alpha,\n length: snapshot.length,\n seedSum: numbers.seedSum,\n seedCount: snapshot.seedCount,\n prevEma: numbers.prevEma,\n prevClosedEma: numbers.prevClosedEma,\n };\n}\n\nfunction restoreRsi(snapshot: Readonly<Record<string, unknown>>): RestoredRsiSlot | null {\n const outSnapshot = snapshot.outBuffer;\n if (\n snapshot.kind !== \"ta.rsi\" ||\n !isInteger(snapshot.length) ||\n !isInteger(snapshot.diffCount) ||\n !isBufferSnapshot(outSnapshot)\n ) {\n return null;\n }\n const numbers = restoreNumbers({\n seedGainSum: snapshot.seedGainSum,\n seedLossSum: snapshot.seedLossSum,\n avgGain: snapshot.avgGain,\n avgLoss: snapshot.avgLoss,\n prevSrc: snapshot.prevSrc,\n prevClosedSrc: snapshot.prevClosedSrc,\n });\n if (numbers === null) return null;\n const outBuffer = restoreBuffer(outSnapshot, outSnapshot.values.length);\n if (outBuffer === null) return null;\n return {\n kind: \"ta.rsi\",\n ...baseSlot(outBuffer),\n length: snapshot.length,\n seedGainSum: numbers.seedGainSum,\n seedLossSum: numbers.seedLossSum,\n diffCount: snapshot.diffCount,\n avgGain: numbers.avgGain,\n avgLoss: numbers.avgLoss,\n prevSrc: numbers.prevSrc,\n prevClosedSrc: numbers.prevClosedSrc,\n };\n}\n\nfunction serialiseTaSlot(slot: unknown): JsonValue | null {\n if (!isRecord(slot)) return null;\n if (slot.kind === \"ta.sma\") return serialiseSma(slot);\n if (slot.kind === \"ta.ema\") return serialiseEma(slot);\n if (slot.kind === \"ta.rsi\") return serialiseRsi(slot);\n return null;\n}\n\nfunction restoreTaSlot(snapshot: unknown): RestoredTaSlot | null {\n if (!isRecord(snapshot)) return null;\n if (snapshot.kind === \"ta.sma\") return restoreSma(snapshot);\n if (snapshot.kind === \"ta.ema\") return restoreEma(snapshot);\n if (snapshot.kind === \"ta.rsi\") return restoreRsi(snapshot);\n return null;\n}\n\n/**\n * Return whether a snapshot slot key belongs to the TA persistence namespace.\n *\n * @since 0.5\n * @internal\n * @stable\n * @formula key.startsWith(\"ta:\")\n * @example\n * isTaSlotSnapshotKey(\"ta:slot#0\"); // true\n */\nexport function isTaSlotSnapshotKey(key: string): boolean {\n return key.startsWith(TA_SLOT_PREFIX);\n}\n\n/**\n * Serialise supported `ta.*` runtime slots into JSON-clean snapshot entries.\n *\n * @since 0.5\n * @internal\n * @stable\n * @formula snapshot[`ta:${slotId}`] = serialise(slot) for supported TA slots\n * @example\n * // const entries = serialiseTaSlots(stream);\n * const entries = {};\n * void entries;\n */\nexport function serialiseTaSlots(stream: StreamState): Readonly<Record<string, JsonValue>> {\n const out: Record<string, JsonValue> = {};\n for (const [slotId, slot] of stream.taSlots.entries()) {\n const snapshot = serialiseTaSlot(slot);\n if (snapshot !== null) {\n out[`${TA_SLOT_PREFIX}${slotId}`] = snapshot;\n }\n }\n return Object.freeze(out);\n}\n\n/**\n * Restore supported `ta.*` runtime slots from namespaced snapshot entries.\n *\n * @since 0.5\n * @internal\n * @stable\n * @formula stream.taSlots[slotId] = restore(snapshot[`ta:${slotId}`])\n * @example\n * // restoreTaSlots(stream, snapshot.slots);\n * const restored = true;\n * void restored;\n */\nexport function restoreTaSlots(\n stream: StreamState,\n slots: Readonly<Record<string, unknown>>,\n): void {\n stream.taSlots.clear();\n for (const [key, value] of Object.entries(slots)) {\n if (!isTaSlotSnapshotKey(key)) continue;\n const slot = restoreTaSlot(value);\n if (slot !== null) {\n stream.taSlots.set(key.slice(TA_SLOT_PREFIX.length), slot);\n }\n }\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { StateSnapshot, StreamSnapshot } from \"@invinite-org/chartlang-core\";\n\nimport type { RunnerState } from \"./createScriptRunner.js\";\nimport { pushDiagnostic } from \"./emit/index.js\";\nimport { validateSnapshot } from \"./persistentStateStore.validate.js\";\nimport { restoreStateSlots, serialiseStateSlots } from \"./state/index.js\";\nimport { isTaSlotSnapshotKey, restoreTaSlots, serialiseTaSlots } from \"./ta/persistence.js\";\n\n/**\n * Default PLAN \u00A76.9 write cadence for persistent snapshots.\n *\n * @since 0.5\n * @internal\n * @example\n * const stale = Date.now() - PERSISTENCE_INTERVAL_MS;\n * void stale;\n */\nexport const PERSISTENCE_INTERVAL_MS = 60_000;\n\nfunction firstStreamKey(snapshot: StateSnapshot): string | null {\n const entries = Object.entries(snapshot.streams);\n const first = entries[0];\n return first === undefined ? null : first[0];\n}\n\nfunction captureStreams(state: RunnerState): Readonly<Record<string, StreamSnapshot>> {\n const main = state.mainStream.serialiseSnapshot();\n const streams: Record<string, StreamSnapshot> = {\n [main.interval === \"\" ? \"main\" : main.interval]: main,\n };\n for (const [key, stream] of state.runtimeContext.secondaryStreams) {\n streams[key] = stream.serialiseSnapshot();\n }\n return Object.freeze(streams);\n}\n\n/**\n * Capture the runner's current stream and state-slot snapshot.\n *\n * @since 0.5\n * @internal\n * @example\n * // const snapshot = captureStateSnapshot(state, Date.now());\n * const captured = true;\n * void captured;\n */\nexport function captureStateSnapshot(state: RunnerState, savedAt: number): StateSnapshot | null {\n const streams = captureStreams(state);\n const slots = {\n ...serialiseStateSlots(state.runtimeContext),\n ...serialiseTaSlots(state.mainStream),\n };\n const candidate = {\n lastBarTime: state.mainStream.bar.time,\n streams,\n slots: Object.freeze(slots),\n savedAt,\n snapshotVersion: 1,\n };\n if (!validateSnapshot(candidate)) return null;\n return candidate;\n}\n\n// Phase-1 mounts have `bar.interval === \"\"` until the first bar lands; in that\n// window the snapshot is keyed by whatever captureStreams used (\"main\" or the\n// explicit interval). Fall back to the snapshot's first-entered stream so warm\n// restart still finds the buffer.\nfunction resolveMainStreamSnapshot(\n snapshot: StateSnapshot,\n mainInterval: string,\n): StreamSnapshot | undefined {\n const direct = mainInterval === \"\" ? undefined : snapshot.streams[mainInterval];\n if (direct !== undefined) return direct;\n const fallback = firstStreamKey(snapshot);\n return fallback === null ? undefined : snapshot.streams[fallback];\n}\n\n/**\n * Restore a validated snapshot into the runner's stream and slot store.\n *\n * @since 0.5\n * @internal\n * @example\n * // restoreStateSnapshot(state, snapshot);\n * const restored = true;\n * void restored;\n */\nexport function restoreStateSnapshot(state: RunnerState, snapshot: StateSnapshot): void {\n const stream = resolveMainStreamSnapshot(snapshot, state.mainStream.bar.interval);\n if (stream !== undefined) {\n state.mainStream.restoreFromSnapshot(stream);\n state.barIndex = Math.max(state.barIndex, stream.filled);\n }\n for (const [secondaryKey, secondary] of state.runtimeContext.secondaryStreams) {\n const secondarySnapshot = snapshot.streams[secondaryKey];\n if (secondarySnapshot !== undefined) {\n secondary.restoreFromSnapshot(secondarySnapshot);\n }\n }\n restoreTaSlots(state.mainStream, snapshot.slots);\n // Non-TA slots: everything not under the ta: namespace persists as\n // generic state.* slot data.\n const stateSlots: Record<string, unknown> = {};\n for (const [slotKey, value] of Object.entries(snapshot.slots)) {\n if (!isTaSlotSnapshotKey(slotKey)) {\n stateSlots[slotKey] = value;\n }\n }\n restoreStateSlots(state.runtimeContext, stateSlots);\n}\n\n/**\n * Save one snapshot and convert malformed/save failures into diagnostics.\n *\n * @since 0.5\n * @internal\n * @example\n * // await saveStateSnapshot(state, Date.now());\n * const saved = true;\n * void saved;\n */\nexport async function saveStateSnapshot(state: RunnerState, savedAt: number): Promise<boolean> {\n const store = state.runtimeContext.persistentStateStore;\n if (store === undefined) return false;\n const snapshot = captureStateSnapshot(state, savedAt);\n if (snapshot === null) {\n pushDiagnostic(state.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"state-snapshot-malformed\",\n message: \"persistent state snapshot was not JSON-clean\",\n slotId: null,\n bar: state.barIndex,\n });\n return false;\n }\n try {\n await store.save(snapshot);\n state.runtimeContext.lastPersistTime = savedAt;\n return true;\n } catch (err) {\n pushDiagnostic(state.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"state-snapshot-save-failed\",\n message: err instanceof Error ? err.message : String(err),\n slotId: null,\n bar: state.barIndex,\n });\n return false;\n }\n}\n\n/**\n * Save when the configured PLAN \u00A76.9 wall-clock cadence is stale.\n *\n * @since 0.5\n * @internal\n * @example\n * // await maybeSaveStateSnapshot(state, Date.now(), 60_000);\n * const maybe = true;\n * void maybe;\n */\nexport async function maybeSaveStateSnapshot(\n state: RunnerState,\n savedAt: number,\n intervalMs: number,\n): Promise<void> {\n if (state.runtimeContext.persistentStateStore === undefined) return;\n if (savedAt - state.runtimeContext.lastPersistTime >= intervalMs) {\n await saveStateSnapshot(state, savedAt);\n }\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type {\n CandleEvent,\n Capabilities,\n RunnerEmissions,\n} from \"@invinite-org/chartlang-adapter-kit\";\nimport type {\n Bar,\n CompiledScriptObject,\n ComputeFn,\n ScriptManifest,\n} from \"@invinite-org/chartlang-core\";\n\nimport { pushDiagnostic } from \"./emit/index.js\";\nimport {\n dispose as disposeImpl,\n drain as drainImpl,\n onBarClose as onBarCloseImpl,\n onBarTick as onBarTickImpl,\n onHistory as onHistoryImpl,\n} from \"./execution/index.js\";\nimport {\n appendSecondaryBar,\n appendSecondaryHistory,\n replaceSecondaryHead,\n} from \"./execution/secondaryStream.js\";\nimport { resolveInputs } from \"./inputs/index.js\";\nimport type { PersistentStateStore } from \"./persistentStateStore.js\";\nimport {\n PERSISTENCE_INTERVAL_MS,\n maybeSaveStateSnapshot,\n restoreStateSnapshot,\n saveStateSnapshot,\n} from \"./persistentStateStore.runtime.js\";\nimport { validateSnapshot } from \"./persistentStateStore.validate.js\";\nimport type { MutableRunnerEmissions, RuntimeContext } from \"./runtimeContext.js\";\nimport { type StateStore, inMemoryStateStore } from \"./stateStore.js\";\nimport { type StreamState, createStreamState } from \"./streamState.js\";\nimport { type AdapterSymInfo, createRuntimeViews, makeSymInfoView } from \"./views/index.js\";\n\n/**\n * Internal handle the execution functions read and mutate per step. Lives\n * inside `createScriptRunner`'s closure; never exposed on the public\n * barrel. `barIndex` is the only mutable field \u2014 `onBarClose` increments\n * it; `onBarTick` does not.\n *\n * @since 0.1\n * @example\n * // RunnerState is internal \u2014 execution functions accept it as\n * // their first argument:\n * // await onBarClose(state, rawBar);\n */\nexport type RunnerState = {\n readonly manifest: ScriptManifest;\n readonly compute: ComputeFn;\n readonly capabilities: Capabilities;\n readonly stateStore: StateStore;\n readonly persistenceIntervalMs: number;\n readonly now: () => number;\n readonly mainStream: StreamState;\n readonly runtimeContext: RuntimeContext;\n readonly emissions: MutableRunnerEmissions;\n barIndex: number;\n};\n\n/**\n * The user-facing handle `createScriptRunner` returns. Hosts (Worker,\n * QuickJS, conformance harness) drive a `ScriptRunner` through the\n * standard lifecycle: `load \u2192 onHistory \u2192 onBarClose \u00D7 N \u2192 onBarTick \u00D7 M\n * \u2192 drain \u2192 dispose`. PLAN \u00A76.1 fixes this shape; consumer-repo hosts\n * pin against it.\n *\n * `onHistory` / `onBarClose` / `onBarTick` return `Promise<void>` \u2014 the\n * runtime allows compute bodies to `await` (Phase 1 doesn't, but the\n * surface is forward-compatible with Phase-5 `request.security` warmup).\n *\n * @since 0.1\n * @example\n * // import { createScriptRunner }\n * // from \"@invinite-org/chartlang-runtime\";\n * // const runner = createScriptRunner({ compiled, capabilities });\n * // await runner.onHistory(historicalBars);\n * // const emissions = runner.drain();\n * // runner.dispose();\n */\nexport type ScriptRunner = {\n onHistory(bars: ReadonlyArray<Bar>): Promise<void>;\n onBarClose(bar: Bar): Promise<void>;\n onBarTick(bar: Bar): Promise<void>;\n push(event: CandleEvent): Promise<void>;\n warmStart(currentMainBarTime: number): Promise<void>;\n drain(): RunnerEmissions;\n dispose(): Promise<void>;\n};\n\n/**\n * Constructor arguments for {@link createScriptRunner}. `stateStore`\n * defaults to {@link inMemoryStateStore} so callers without persistence\n * needs can omit it. `symInfo` defaults to empty sentinels and is gated\n * by `capabilities.symInfoFields` at mount. `resolveInputs` is called\n * once at mount with `manifest.name`; worker-backed callers can pass an\n * already structured-cloned `inputOverrides` record instead.\n * `persistentStateStore` is the PLAN \u00A76.9 cross-mount snapshot store;\n * `persistenceIntervalMs` defaults to 60 seconds.\n *\n * @since 0.1\n * @example\n * // const args: CreateScriptRunnerArgs = {\n * // compiled,\n * // capabilities,\n * // stateStore: inMemoryStateStore(),\n * // };\n */\nexport type CreateScriptRunnerArgs = {\n readonly compiled: CompiledScriptObject;\n readonly capabilities: Capabilities;\n readonly stateStore?: StateStore;\n readonly persistentStateStore?: PersistentStateStore;\n readonly persistenceIntervalMs?: number;\n readonly now?: () => number;\n readonly symInfo?: AdapterSymInfo;\n readonly resolveInputs?: (scriptId: string) => Readonly<Record<string, unknown>>;\n readonly inputOverrides?: Readonly<Record<string, unknown>>;\n};\n\nfunction resolveCapacity(manifest: ScriptManifest): number {\n const requested = manifest.seriesCapacities.ohlcv;\n const fallback = manifest.maxLookback + 1;\n return Math.max(1, requested ?? fallback);\n}\n\nfunction createSecondaryStreams(\n manifest: ScriptManifest,\n capacity: number,\n): Map<string, StreamState> {\n const streams = new Map<string, StreamState>();\n for (const interval of manifest.requestedIntervals) {\n if (streams.has(interval)) continue;\n streams.set(interval, createStreamState({ interval, capacity, symbol: \"\" }));\n }\n return streams;\n}\n\nasync function pushMainEvent(state: RunnerState, event: CandleEvent): Promise<void> {\n switch (event.kind) {\n case \"history\":\n await onHistoryImpl(state, event.bars);\n return;\n case \"close\":\n await onBarCloseImpl(state, event.bar);\n await maybeSaveStateSnapshot(state, state.now(), state.persistenceIntervalMs);\n return;\n case \"tick\":\n await onBarTickImpl(state, event.bar);\n return;\n }\n}\n\nfunction pushUnknownSecondaryDiagnostic(state: RunnerState, streamKey: string): void {\n pushDiagnostic(state.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"unknown-secondary-stream\",\n message: `Secondary stream \"${streamKey}\" was not registered by the script manifest`,\n slotId: null,\n bar: state.barIndex,\n });\n}\n\nfunction pushSecondaryEvent(state: RunnerState, streamKey: string, event: CandleEvent): void {\n const stream = state.runtimeContext.secondaryStreams.get(streamKey);\n if (stream === undefined) {\n pushUnknownSecondaryDiagnostic(state, streamKey);\n return;\n }\n switch (event.kind) {\n case \"history\":\n appendSecondaryHistory(stream, event.bars);\n return;\n case \"close\":\n appendSecondaryBar(stream, event.bar);\n return;\n case \"tick\":\n replaceSecondaryHead(stream, event.bar);\n return;\n }\n}\n\n/**\n * Build a `ScriptRunner` for a compiled chartlang script. The runner\n * owns one `StreamState`, one `MutableRunnerEmissions` queue set, and\n * the `RuntimeContext` Task 7-8 primitives read through\n * `ACTIVE_RUNTIME_CONTEXT`. Phase 1 ships a single-stream model; the\n * `requestedIntervals` field on the manifest is always empty.\n *\n * Capacity sizing follows PLAN \u00A76.6: prefer\n * `manifest.seriesCapacities.ohlcv` (compiler-emitted per-series\n * lookback) and fall back to `manifest.maxLookback + 1`, clamped to a\n * minimum of 1 so an empty-history script still has a valid head slot.\n *\n * @since 0.1\n * @example\n * // import { createScriptRunner } from \"@invinite-org/chartlang-runtime\";\n * // const runner = createScriptRunner({ compiled, capabilities });\n * // await runner.onHistory([]);\n * // runner.drain();\n * // runner.dispose();\n */\nexport function createScriptRunner(args: CreateScriptRunnerArgs): ScriptRunner {\n const capacity = resolveCapacity(args.compiled.manifest);\n const mainStream = createStreamState({ interval: \"\", capacity, symbol: \"\" });\n const secondaryStreams = createSecondaryStreams(args.compiled.manifest, capacity);\n const stateStore = args.stateStore ?? inMemoryStateStore();\n const now = args.now ?? Date.now;\n const views = createRuntimeViews({\n syminfo: makeSymInfoView(args.symInfo ?? {}, args.capabilities.symInfoFields),\n });\n const emissions: MutableRunnerEmissions = {\n plots: [],\n drawings: [],\n alerts: [],\n alertConditions: [],\n logs: [],\n diagnostics: [],\n fromBar: 0,\n toBar: 0,\n };\n const alertConditions = new Map(\n (args.compiled.manifest.alertConditions ?? []).map((condition) => [\n condition.id,\n condition,\n ]),\n );\n\n const state: RunnerState = {\n manifest: args.compiled.manifest,\n compute: args.compiled.compute,\n capabilities: args.capabilities,\n stateStore,\n persistenceIntervalMs: args.persistenceIntervalMs ?? PERSISTENCE_INTERVAL_MS,\n now,\n mainStream,\n runtimeContext: {\n stream: mainStream,\n stateStore,\n ...(args.persistentStateStore === undefined\n ? {}\n : { persistentStateStore: args.persistentStateStore }),\n lastPersistTime: 0,\n capabilities: args.capabilities,\n emissions,\n barIndex: () => state.barIndex,\n isTick: false,\n drawingSlots: new Map(),\n drawingSubIdCounters: new Map(),\n drawingBucketCounters: {\n lines: 0,\n labels: 0,\n boxes: 0,\n polylines: 0,\n other: 0,\n },\n scriptMaxDrawings: args.compiled.manifest.maxDrawings ?? null,\n stateSlots: new Map(),\n secondaryStreams,\n requestSecurityBars: new Map(),\n requestSecurityAlignments: new Map(),\n requestSecurityAscendingBars: new Map(),\n requestLowerTfViews: new Map(),\n diagnosedRequestKeys: new Set(),\n alertConditions,\n diagnosedAlertConditionKeys: new Set(),\n logBudget: 0,\n logBudgetExceededDiagnosed: false,\n resolvedInputs: Object.freeze({}),\n diagnosedInputKeys: new Set(),\n views,\n },\n emissions,\n barIndex: 0,\n };\n const overrides =\n args.inputOverrides ??\n args.resolveInputs?.(args.compiled.manifest.name) ??\n Object.freeze({});\n state.runtimeContext.resolvedInputs = resolveInputs(\n args.compiled.manifest,\n overrides,\n state.runtimeContext,\n );\n\n return Object.freeze({\n async onHistory(bars) {\n await onHistoryImpl(state, bars);\n },\n async onBarClose(bar) {\n await onBarCloseImpl(state, bar);\n await maybeSaveStateSnapshot(state, state.now(), state.persistenceIntervalMs);\n },\n async onBarTick(bar) {\n await onBarTickImpl(state, bar);\n },\n async push(event) {\n if (event.streamKey === undefined) {\n await pushMainEvent(state, event);\n return;\n }\n pushSecondaryEvent(state, event.streamKey, event);\n },\n async warmStart(currentMainBarTime) {\n const store = state.runtimeContext.persistentStateStore;\n if (store === undefined) return;\n const snap = await store.load();\n if (snap === null) return;\n if (!validateSnapshot(snap)) return;\n if (snap.lastBarTime >= currentMainBarTime) {\n pushDiagnostic(state.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"state-snapshot-future-dated\",\n message: \"persistent state snapshot is ahead of the current bar cursor\",\n slotId: null,\n bar: state.barIndex,\n });\n try {\n await store.clear();\n } catch (err) {\n pushDiagnostic(state.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"state-snapshot-save-failed\",\n message: err instanceof Error ? err.message : String(err),\n slotId: null,\n bar: state.barIndex,\n });\n }\n return;\n }\n restoreStateSnapshot(state, snap);\n state.runtimeContext.lastPersistTime = snap.savedAt;\n pushDiagnostic(state.emissions, {\n kind: \"diagnostic\",\n severity: \"info\",\n code: \"state-snapshot-restored\",\n message: `persistent state snapshot restored through bar ${snap.lastBarTime}`,\n slotId: null,\n bar: state.barIndex,\n });\n },\n drain() {\n return drainImpl(state);\n },\n async dispose() {\n const finalSave = saveStateSnapshot(state, state.now());\n disposeImpl(state);\n await finalSave;\n },\n });\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport {\n type AlertEmission,\n type AlertConditionEmission,\n type DrawingEmission,\n type LogEmission,\n type PlotEmission,\n type RunnerEmissions,\n type RuntimeDiagnostic,\n validateEmission,\n} from \"@invinite-org/chartlang-adapter-kit\";\n\n/**\n * Walk a `RunnerEmissions` snapshot and replace any plot / alert that fails\n * adapter-kit's `validateEmission` with a `malformed-emission` diagnostic.\n * Drawings pass through unchanged in Phase 1 (no `draw.*` primitives ship\n * yet); diagnostics are appended to (never validated against \u2014 recursive\n * validation would loop).\n *\n * The boot calls this on every `drain()` before posting `emissions` back to\n * the host; the trust boundary for the postMessage wire format is here.\n *\n * @since 0.1\n * @stable\n * @example\n * // const out = filterEmissions(runner.drain());\n * // postMessage({ kind: \"emissions\", nonce, emissions: out });\n * const fn: typeof filterEmissions = filterEmissions;\n * void fn;\n */\nexport function filterEmissions(raw: RunnerEmissions): RunnerEmissions {\n const plots: Array<PlotEmission> = [];\n const drawings: Array<DrawingEmission> = [];\n const alerts: Array<AlertEmission> = [];\n const alertConditions: Array<AlertConditionEmission> = [];\n const logs: Array<LogEmission> = [];\n const diagnostics: Array<RuntimeDiagnostic> = [...raw.diagnostics];\n\n for (const p of raw.plots) {\n const r = validateEmission(p);\n if (r.ok) {\n plots.push(p);\n } else {\n diagnostics.push({\n kind: \"diagnostic\",\n severity: \"warning\",\n code: r.code,\n message: r.message,\n slotId: p.slotId,\n bar: p.bar,\n });\n }\n }\n for (const a of raw.alerts) {\n const r = validateEmission(a);\n if (r.ok) {\n alerts.push(a);\n } else {\n diagnostics.push({\n kind: \"diagnostic\",\n severity: \"warning\",\n code: r.code,\n message: r.message,\n slotId: a.slotId,\n bar: a.bar,\n });\n }\n }\n for (const condition of raw.alertConditions) {\n const r = validateEmission(condition);\n if (r.ok) {\n alertConditions.push(condition);\n } else {\n diagnostics.push({\n kind: \"diagnostic\",\n severity: \"warning\",\n code: r.code,\n message: r.message,\n slotId: null,\n bar: condition.bar,\n });\n }\n }\n for (const log of raw.logs) {\n const r = validateEmission(log);\n if (r.ok) {\n logs.push(log);\n } else {\n diagnostics.push({\n kind: \"diagnostic\",\n severity: \"warning\",\n code: r.code,\n message: r.message,\n slotId: null,\n bar: log.bar,\n });\n }\n }\n for (const d of raw.drawings) {\n drawings.push(d);\n }\n return {\n plots,\n drawings,\n alerts,\n alertConditions,\n logs,\n diagnostics,\n fromBar: raw.fromBar,\n toBar: raw.toBar,\n };\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { HostLimits } from \"./types.js\";\n\n/**\n * Phase-1 default `HostLimits`. `maxCpuMsPerStep` is the only enforced cap;\n * `maxHeapBytes` is advisory (no per-worker heap API exists in browsers\n * today) and `maxRingBufferBars` is forwarded for runtime sizing decisions.\n * `maxLoadTimeoutMs` bounds `host.load()` so a silently-dead worker can't\n * hang a consumer indefinitely; 30s is generous for module fetch + parse\n * on a slow network and still bounded enough to recover.\n * Frozen so consumers cannot mutate the singleton.\n *\n * @since 0.1\n * @stable\n * @example\n * import { DEFAULT_LIMITS } from \"@invinite-org/chartlang-host-worker\";\n * const cpu = DEFAULT_LIMITS.maxCpuMsPerStep; // 50\n * void cpu;\n */\nexport const DEFAULT_LIMITS: HostLimits = Object.freeze({\n maxHeapBytes: 64 * 1024 * 1024,\n maxCpuMsPerStep: 50,\n maxRingBufferBars: 5_000,\n maxLoadTimeoutMs: 30_000,\n});\n\n/**\n * Wall-clock measurement around `fn`. Returns `result` (always \u2014 Phase-1\n * enforcement is measurement, not preemption) and `overshoot` (the observed\n * elapsed ms when over budget, `0` otherwise). The worker boot uses this to\n * post `step-overshoot` to the host; Phase 5's QuickJS host swaps this seam\n * for real `setInterruptHandler`-based preemption.\n *\n * Re-throws if `fn` rejects \u2014 overshoot detection does not swallow errors.\n *\n * @since 0.1\n * @stable\n * @example\n * // const { result, overshoot } = await watchStep(async () => 42, 100);\n * // result === 42; overshoot === 0;\n * const fn: typeof watchStep = watchStep;\n * void fn;\n */\nexport async function watchStep<T>(\n fn: () => Promise<T>,\n maxMs: number,\n): Promise<{ readonly result: T; readonly overshoot: number }> {\n const start = performance.now();\n const result = await fn();\n const elapsed = performance.now() - start;\n return { result, overshoot: elapsed > maxMs ? elapsed : 0 };\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport { createScriptRunner } from \"@invinite-org/chartlang-runtime\";\n\nimport { filterEmissions } from \"./filterEmissions.js\";\nimport { watchStep } from \"./limits.js\";\nimport type { HostToWorker, WorkerToHost } from \"./protocol.js\";\nimport type { CompiledModuleExport, HostLimits, ScriptRunnerHandle } from \"./types.js\";\n\n/**\n * Duck-typed slice of the worker global scope the boot factory needs. Lets\n * tests drive `createWorkerBoot` against a `MessageChannel` port without\n * faking the full `WorkerGlobalScope`.\n *\n * @since 0.1\n * @stable\n * @example\n * const scope: WorkerBootScope = {\n * addEventListener: () => {},\n * postMessage: () => {},\n * };\n * void scope;\n */\nexport type WorkerBootScope = {\n addEventListener(type: \"message\", listener: (ev: MessageEvent<HostToWorker>) => void): void;\n postMessage(msg: WorkerToHost): void;\n};\n\nasync function importCompiledModule(moduleSource: string): Promise<CompiledModuleExport> {\n // `encodeURIComponent` preserves multi-byte UTF-8 across the data URL\n // without the Annex-B `unescape` round-trip. ESM `import(\"data:\u2026\")`\n // accepts percent-encoded text/javascript directly in both browsers\n // and Node 20+.\n const url = `data:text/javascript;charset=utf-8,${encodeURIComponent(moduleSource)}`;\n return (await import(/* @vite-ignore */ url)) as CompiledModuleExport;\n}\n\nfunction isFrame(value: unknown): value is HostToWorker {\n if (value === null || typeof value !== \"object\") return false;\n const k = (value as { readonly kind?: unknown }).kind;\n return typeof k === \"string\";\n}\n\n/**\n * Wire `scope` to the host-worker postMessage protocol. Lazily imports the\n * compiled module via a `data:` URL so the same code path runs inside a real\n * browser `Worker` and inside Node tests (`MessageChannel`-backed).\n *\n * Lifecycle:\n *\n * - `load` \u2192 dynamic import \u2192 `createScriptRunner(...)` \u2192 cache `limits`.\n * Posts `loaded` on success or `loadError` on failure.\n * - `candleEvent` \u2192 wrap dispatch in `watchStep(...)`; post `step-overshoot`\n * when over budget. Errors map to `fatal`.\n * - `drain` \u2192 validate every plot / alert emission; sink malformed ones into\n * the diagnostics array; post `emissions` with the original nonce.\n * - `dispose` \u2192 release the runner; subsequent messages map to `fatal`.\n *\n * @since 0.1\n * @stable\n * @example\n * // import { createWorkerBoot } from \"@invinite-org/chartlang-host-worker\";\n * // const scope = self;\n * // createWorkerBoot(scope);\n * const fn: typeof createWorkerBoot = createWorkerBoot;\n * void fn;\n */\nexport function createWorkerBoot(scope: WorkerBootScope): void {\n let runner: ScriptRunnerHandle | null = null;\n let limits: HostLimits | null = null;\n\n scope.addEventListener(\"message\", async (ev: MessageEvent<HostToWorker>) => {\n const msg = ev.data;\n if (!isFrame(msg)) {\n scope.postMessage({\n kind: \"fatal\",\n message: \"malformed host frame: not a plain object with a string 'kind'\",\n });\n return;\n }\n if (msg.kind === \"load\") {\n try {\n const mod = await importCompiledModule(msg.compiled.moduleSource);\n runner = createScriptRunner({\n compiled: mod.default,\n capabilities: msg.capabilities,\n ...(msg.symInfo !== undefined ? { symInfo: msg.symInfo } : {}),\n ...(msg.inputOverrides !== undefined\n ? { inputOverrides: msg.inputOverrides }\n : {}),\n });\n limits = msg.limits;\n scope.postMessage({ kind: \"loaded\" });\n } catch (err) {\n scope.postMessage({\n kind: \"loadError\",\n message: err instanceof Error ? err.message : String(err),\n });\n }\n return;\n }\n\n try {\n switch (msg.kind) {\n case \"candleEvent\": {\n if (runner === null || limits === null) {\n throw new Error(\"candleEvent before load\");\n }\n const r = runner;\n const { overshoot } = await watchStep(\n () => r.push(msg.event),\n limits.maxCpuMsPerStep,\n );\n if (overshoot > 0) {\n scope.postMessage({ kind: \"step-overshoot\", observedMs: overshoot });\n }\n break;\n }\n case \"drain\": {\n if (runner === null) {\n throw new Error(\"drain before load\");\n }\n const cleaned = filterEmissions(runner.drain());\n scope.postMessage({\n kind: \"emissions\",\n nonce: msg.nonce,\n emissions: cleaned,\n });\n break;\n }\n case \"dispose\": {\n await runner?.dispose();\n runner = null;\n limits = null;\n break;\n }\n default: {\n throw new Error(\n `unknown frame kind: ${(msg as { readonly kind: string }).kind}`,\n );\n }\n }\n } catch (err) {\n scope.postMessage({\n kind: \"fatal\",\n message: err instanceof Error ? err.message : String(err),\n });\n }\n });\n}\n", "// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\n/**\n * Production worker entry. Bundled to `dist/worker-boot.js` via\n * `scripts/buildWorkerBoot.ts` and loaded by the main-side host through a\n * `new URL(\"./worker-boot.js\", import.meta.url)` reference (see\n * `defaultWorkerFactory.ts`).\n *\n * The boot logic itself lives in {@link createWorkerBoot} so it can be\n * unit-tested against a `MessageChannel` port \u2014 this file is the thin\n * `self` adapter and is excluded from coverage (`vitest.config.ts`).\n *\n * @since 0.1\n * @stable\n */\n\nimport { createWorkerBoot, type WorkerBootScope } from \"./createWorkerBoot.js\";\n\ncreateWorkerBoot(self as unknown as WorkerBootScope);\n"],
|
|
5
|
+
"mappings": ";AA6CM,IAAO,aAAP,MAAiB;EAKS;EAJpB;EACA,OAAO;EACP,SAAS;EAEjB,YAA4B,UAAgB;AAAhB,SAAA,WAAA;AACxB,SAAK,MAAM,IAAI,MAAqB,QAAQ;EAChD;EAEA,OAAO,GAAI;AACP,SAAK,QAAQ,KAAK,OAAO,KAAK,KAAK;AACnC,SAAK,IAAI,KAAK,IAAI,IAAI;AACtB,QAAI,KAAK,SAAS,KAAK;AAAU,WAAK,UAAU;EACpD;EAEA,YAAY,GAAI;AACZ,QAAI,KAAK,SAAS,IAAI;AAClB,WAAK,OAAO,CAAC;AACb;IACJ;AACA,SAAK,IAAI,KAAK,IAAI,IAAI;EAC1B;EAEA,GAAG,GAAS;AACR,QAAI,IAAI,KAAK,KAAK,KAAK;AAAQ,aAAO;AACtC,WAAO,KAAK,KAAK,KAAK,OAAO,IAAI,KAAK,YAAY,KAAK,QAAQ;EACnE;EAEA,IAAI,SAAM;AACN,WAAO,KAAK;EAChB;EAEA,QAAK;AACD,SAAK,MAAM,IAAI,MAAqB,KAAK,QAAQ;AACjD,SAAK,OAAO;AACZ,SAAK,SAAS;EAClB;;AAsBE,IAAO,oBAAP,MAAwB;EAKE;EAJpB;EACA,OAAO;EACP,SAAS;EAEjB,YAA4B,UAAgB;AAAhB,SAAA,WAAA;AACxB,SAAK,MAAM,IAAI,aAAa,QAAQ;EACxC;EAEA,OAAO,GAAS;AACZ,SAAK,QAAQ,KAAK,OAAO,KAAK,KAAK;AACnC,SAAK,IAAI,KAAK,IAAI,IAAI;AACtB,QAAI,KAAK,SAAS,KAAK;AAAU,WAAK,UAAU;EACpD;EAEA,YAAY,GAAS;AACjB,QAAI,KAAK,SAAS,IAAI;AAClB,WAAK,OAAO,CAAC;AACb;IACJ;AACA,SAAK,IAAI,KAAK,IAAI,IAAI;EAC1B;EAEA,GAAG,GAAS;AACR,QAAI,IAAI,KAAK,KAAK,KAAK;AAAQ,aAAO,OAAO;AAC7C,WAAO,KAAK,KAAK,KAAK,OAAO,IAAI,KAAK,YAAY,KAAK,QAAQ;EACnE;EAEA,IAAI,SAAM;AACN,WAAO,KAAK;EAChB;EAEA,0BAAuB;AAKnB,UAAM,SAA+B,CAAA;AACrC,eAAW,SAAS,KAAK,KAAK;AAC1B,aAAO,KAAK,OAAO,MAAM,KAAK,IAAI,OAAO,KAAK;IAClD;AACA,WAAO,OAAO,OAAO;MACjB,WAAW,KAAK;MAChB,QAAQ,KAAK;MACb,QAAQ,OAAO,OAAO,MAAM;KAC/B;EACL;EAEA,0BACI,MAIE;AAEF,QACI,KAAK,OAAO,WAAW,KAAK,YAC5B,CAAC,OAAO,UAAU,KAAK,SAAS,KAChC,KAAK,YAAY,MACjB,KAAK,aAAa,KAAK,YACvB,CAAC,OAAO,UAAU,KAAK,MAAM,KAC7B,KAAK,SAAS,KACd,KAAK,SAAS,KAAK,YAClB,KAAK,WAAW,KAAK,KAAK,cAAc,MACxC,KAAK,SAAS,KAAK,KAAK,YAAY,GACvC;AACE,YAAM,IAAI,MAAM,8BAA8B;IAClD;AACA,UAAM,OAAO,IAAI,aAAa,KAAK,QAAQ;AAC3C,aAAS,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC5C,YAAM,QAAQ,KAAK,OAAO,CAAC;AAC3B,WAAK,CAAC,IAAI,UAAU,OAAO,OAAO,MAAM;IAC5C;AACA,SAAK,MAAM;AACX,SAAK,OAAO,KAAK;AACjB,SAAK,SAAS,KAAK;EACvB;EAEA,QAAK;AACD,SAAK,MAAM,IAAI,aAAa,KAAK,QAAQ;AACzC,SAAK,OAAO;AACZ,SAAK,SAAS;EAClB;;;;ACtJE,SAAU,eAAkB,KAAsB;AACpD,SAAO,IAAI,MAAM,CAAA,GAAiB;IAC9B,IAAI,SAAS,MAAI;AACb,UAAI,SAAS;AAAW,eAAO,IAAI,GAAG,CAAC;AACvC,UAAI,SAAS;AAAU,eAAO,IAAI;AAClC,UAAI,OAAO,SAAS,UAAU;AAC1B,cAAM,IAAI,OAAO,IAAI;AACrB,YAAI,OAAO,UAAU,CAAC,KAAK,KAAK;AAAG,iBAAO,IAAI,GAAG,CAAC;MACtD;AACA,aAAO;IACX;IACA,IAAI,SAAS,MAAI;AACb,UAAI,SAAS,aAAa,SAAS;AAAU,eAAO;AACpD,UAAI,OAAO,SAAS,UAAU;AAC1B,cAAM,IAAI,OAAO,IAAI;AACrB,eAAO,OAAO,UAAU,CAAC,KAAK,KAAK;MACvC;AACA,aAAO;IACX;GACH;AACL;AA4BM,SAAU,sBAAyB,KAAwB,QAAc;AAC3E,MAAI,WAAW;AAAG,WAAO,eAAkB,GAAG;AAC9C,SAAO,IAAI,MAAM,CAAA,GAAiB;IAC9B,IAAI,SAAS,MAAI;AACb,UAAI,SAAS;AAAW,eAAO,IAAI,GAAG,MAAM;AAC5C,UAAI,SAAS;AAAU,eAAO,IAAI;AAClC,UAAI,OAAO,SAAS,UAAU;AAC1B,cAAM,IAAI,OAAO,IAAI;AACrB,YAAI,OAAO,UAAU,CAAC,KAAK,KAAK;AAAG,iBAAO,IAAI,GAAG,IAAI,MAAM;MAC/D;AACA,aAAO;IACX;IACA,IAAI,SAAS,MAAI;AACb,UAAI,SAAS,aAAa,SAAS;AAAU,eAAO;AACpD,UAAI,OAAO,SAAS,UAAU;AAC1B,cAAM,IAAI,OAAO,IAAI;AACrB,eAAO,OAAO,UAAU,CAAC,KAAK,KAAK;MACvC;AACA,aAAO;IACX;GACH;AACL;;;ACzFA,SAAS,iBAAiB,QAAW;AACjC,SAAO;IACH,MAAM,OAAO,OAAO,OAAO,OAAO;IAClC,OAAO,OAAO,OAAO,OAAO,MAAM,OAAO,SAAS;IAClD,QAAQ,OAAO,OAAO,OAAO,OAAO,OAAO,MAAM,OAAO,SAAS;IACjE,QAAQ,OAAO,OAAO,OAAO,MAAM,OAAO,QAAQ,OAAO,SAAS;;AAE1E;AAiHA,IAAM,gBAAgB,CAAC,QAAQ,QAAQ,QAAQ,OAAO,SAAS,QAAQ;AAIvE,SAAS,WAAW,OAAmB;AACnC,SAAO;IACH,MAAM,MAAM;IACZ,MAAM,MAAM;IACZ,MAAM,MAAM;IACZ,KAAK,MAAM;IACX,OAAO,MAAM;IACb,QAAQ,MAAM;;AAEtB;AAEA,SAAS,QAAQ,QAAsC,OAAa;AAChE,QAAM,QAAQ,OAAO,KAAK;AAC1B,SAAO,UAAU,QAAQ,UAAU,SAAY,OAAO,MAAM;AAChE;AAEA,SAAS,wBAAwB,OAAqBA,WAAwB;AAC1E,QAAM,EAAE,WAAW,QAAQ,QAAO,IAAKA;AACvC,QAAM,WAAW,MAAM,IAAI;AAC3B,QAAM,UAAU;IACZ,KAAK,IAAI,MAAqB,QAAQ;IACtC,MAAM,IAAI,MAAqB,QAAQ;IACvC,OAAO,IAAI,MAAqB,QAAQ;IACxC,OAAO,IAAI,MAAqB,QAAQ;;AAE5C,WAAS,IAAI,GAAG,IAAI,UAAU,KAAK,GAAG;AAClC,UAAM,OAAO,QAAQ,QAAQ,MAAM,CAAC;AACpC,UAAM,MAAM,QAAQ,QAAQ,KAAK,CAAC;AAClC,UAAM,OAAO,QAAQ,QAAQ,MAAM,CAAC;AACpC,UAAM,QAAQ,QAAQ,QAAQ,OAAO,CAAC;AACtC,YAAQ,IAAI,CAAC,IAAI,OAAO,MAAM,IAAI,KAAK,OAAO,MAAM,GAAG,IAAI,QAAQ,OAAO,OAAO;AACjF,YAAQ,KAAK,CAAC,IACV,OAAO,MAAM,IAAI,KAAK,OAAO,MAAM,GAAG,KAAK,OAAO,MAAM,KAAK,IACvD,QACC,OAAO,MAAM,SAAS;AACjC,YAAQ,MAAM,CAAC,IACX,OAAO,MAAM,IAAI,KAAK,OAAO,MAAM,IAAI,KAAK,OAAO,MAAM,GAAG,KAAK,OAAO,MAAM,KAAK,IAC7E,QACC,OAAO,OAAO,MAAM,SAAS;AACxC,YAAQ,MAAM,CAAC,IACX,OAAO,MAAM,IAAI,KAAK,OAAO,MAAM,GAAG,KAAK,OAAO,MAAM,KAAK,IACvD,QACC,OAAO,MAAM,QAAQ,SAAS;EAC7C;AACA,QAAM,IAAI,0BAA0B,EAAE,WAAW,QAAQ,QAAQ,QAAQ,IAAG,CAAE;AAC9E,QAAM,KAAK,0BAA0B,EAAE,WAAW,QAAQ,QAAQ,QAAQ,KAAI,CAAE;AAChF,QAAM,MAAM,0BAA0B,EAAE,WAAW,QAAQ,QAAQ,QAAQ,MAAK,CAAE;AAClF,QAAM,MAAM,0BAA0B,EAAE,WAAW,QAAQ,QAAQ,QAAQ,MAAK,CAAE;AACtF;AAoBM,SAAU,kBAAkB,MAIjC;AACG,QAAM,EAAE,UAAU,UAAU,OAAM,IAAK;AACvC,QAAM,QAAsB;IACxB,MAAM,IAAI,kBAAkB,QAAQ;IACpC,MAAM,IAAI,kBAAkB,QAAQ;IACpC,MAAM,IAAI,kBAAkB,QAAQ;IACpC,KAAK,IAAI,kBAAkB,QAAQ;IACnC,OAAO,IAAI,kBAAkB,QAAQ;IACrC,QAAQ,IAAI,kBAAkB,QAAQ;IACtC,KAAK,IAAI,kBAAkB,QAAQ;IACnC,MAAM,IAAI,kBAAkB,QAAQ;IACpC,OAAO,IAAI,kBAAkB,QAAQ;IACrC,OAAO,IAAI,kBAAkB,QAAQ;;AAEzC,QAAM,MAAe;IACjB,MAAM;IACN,MAAM,OAAO;IACb,MAAM,OAAO;IACb,KAAK,OAAO;IACZ,OAAO,OAAO;IACd,QAAQ;IACR,KAAK,OAAO;IACZ,MAAM,OAAO;IACb,OAAO,OAAO;IACd,OAAO,OAAO;IACd;IACA;IACA,UAAU,OAAO,OAAO,EAAE,UAAU,GAAG,QAAQ,EAAC,CAAE;;AAEtD,QAAM,cAA0C;IAC5C,MAAM,eAAuB,MAAM,IAAI;IACvC,MAAM,eAAuB,MAAM,IAAI;IACvC,MAAM,eAAuB,MAAM,IAAI;IACvC,KAAK,eAAuB,MAAM,GAAG;IACrC,OAAO,eAAuB,MAAM,KAAK;IACzC,QAAQ,eAAuB,MAAM,MAAM;IAC3C,KAAK,eAAuB,MAAM,GAAG;IACrC,MAAM,eAAuB,MAAM,IAAI;IACvC,OAAO,eAAuB,MAAM,KAAK;IACzC,OAAO,eAAuB,MAAM,KAAK;;AAE7C,QAAM,SAAsB;IACxB;IACA;IACA;IACA;IACA,SAAS,oBAAI,IAAG;IAChB,oBAAiB;AACb,YAAM,QAAQ,MAAM,MAAM,wBAAuB;AACjD,YAAM,UAAU,WAAW,KAAK;AAChC,aAAO,OAAO,OAAO;QACjB,UAAU,IAAI;QACd,WAAW,MAAM;QACjB,QAAQ,MAAM;QACd,SAAS,OAAO,OAAO;UACnB,MAAM,QAAQ,KAAK,wBAAuB,EAAG;UAC7C,MAAM,QAAQ,KAAK,wBAAuB,EAAG;UAC7C,MAAM,QAAQ,KAAK,wBAAuB,EAAG;UAC7C,KAAK,QAAQ,IAAI,wBAAuB,EAAG;UAC3C,OAAO,MAAM;UACb,QAAQ,QAAQ,OAAO,wBAAuB,EAAG;SACpD;OACJ;IACL;IACA,oBAAoBA,WAAwB;AACxC,YAAM,UAAU,WAAW,KAAK;AAChC,iBAAW,OAAO,eAAe;AAC7B,gBAAQ,GAAG,EAAE,0BAA0B;UACnC,WAAWA,UAAS;UACpB,QAAQA,UAAS;UACjB,QAAQA,UAAS,QAAQ,GAAG;SAC/B;MACL;AACA,8BAAwB,OAAOA,SAAQ;AACvC,YAAM,UAAUA,UAAS;AACzB,UAAIA,UAAS,WAAW,KAAK,UAAU,GAAG;AACtC,YAAI,OAAO;AACX,YAAI,OAAO,OAAO;AAClB,YAAI,OAAO,OAAO;AAClB,YAAI,MAAM,OAAO;AACjB,YAAI,QAAQ,OAAO;AACnB,YAAI,SAAS;AACb,YAAI,MAAM,OAAO;AACjB,YAAI,OAAO,OAAO;AAClB,YAAI,QAAQ,OAAO;AACnB,YAAI,QAAQ,OAAO;MACvB,OAAO;AACH,YAAI,OAAO,QAAQA,UAAS,QAAQ,MAAM,OAAO;AACjD,YAAI,OAAO,QAAQA,UAAS,QAAQ,MAAM,OAAO;AACjD,YAAI,OAAO,QAAQA,UAAS,QAAQ,MAAM,OAAO;AACjD,YAAI,MAAM,QAAQA,UAAS,QAAQ,KAAK,OAAO;AAC/C,YAAI,QAAQ,QAAQA,UAAS,QAAQ,OAAO,OAAO;AACnD,YAAI,SAAS,QAAQA,UAAS,QAAQ,QAAQ,OAAO;AACrD,YAAI,OAAO,IAAI,OAAO,IAAI,OAAO;AACjC,YAAI,QAAQ,IAAI,OAAO,IAAI,MAAM,IAAI,SAAS;AAC9C,YAAI,SAAS,IAAI,OAAO,IAAI,OAAO,IAAI,MAAM,IAAI,SAAS;AAC1D,YAAI,SAAS,IAAI,OAAO,IAAI,MAAM,IAAI,QAAQ,IAAI,SAAS;MAC/D;AACA,UAAI,WAAWA,UAAS;IAC5B;;AAEJ,SAAO;AACX;AAYM,SAAU,kBAAkB,QAAqB,QAAW;AAC9D,QAAM,SAAS,iBAAiB,MAAM;AACtC,QAAM,EAAE,OAAO,IAAG,IAAK;AACvB,QAAM,KAAK,OAAO,OAAO,IAAI;AAC7B,QAAM,KAAK,OAAO,OAAO,IAAI;AAC7B,QAAM,KAAK,OAAO,OAAO,IAAI;AAC7B,QAAM,IAAI,OAAO,OAAO,GAAG;AAC3B,QAAM,MAAM,OAAO,OAAO,KAAK;AAC/B,QAAM,OAAO,OAAO,OAAO,MAAM;AACjC,QAAM,IAAI,OAAO,OAAO,GAAG;AAC3B,QAAM,KAAK,OAAO,OAAO,IAAI;AAC7B,QAAM,MAAM,OAAO,OAAO,KAAK;AAC/B,QAAM,MAAM,OAAO,OAAO,KAAK;AAC/B,MAAI,OAAO,OAAO;AAClB,MAAI,OAAO,OAAO;AAClB,MAAI,OAAO,OAAO;AAClB,MAAI,MAAM,OAAO;AACjB,MAAI,QAAQ,OAAO;AACnB,MAAI,SAAS,OAAO;AACpB,MAAI,MAAM,OAAO;AACjB,MAAI,OAAO,OAAO;AAClB,MAAI,QAAQ,OAAO;AACnB,MAAI,QAAQ,OAAO;AACnB,MAAI,SAAS,OAAO;AACpB,MAAI,WAAW,OAAO;AAC1B;AAaM,SAAU,kBAAkB,QAAqB,QAAW;AAC9D,MAAI,OAAO,MAAM,MAAM,WAAW,GAAG;AACjC,sBAAkB,QAAQ,MAAM;AAChC;EACJ;AACA,QAAM,SAAS,iBAAiB,MAAM;AACtC,QAAM,EAAE,OAAO,IAAG,IAAK;AACvB,QAAM,KAAK,YAAY,OAAO,IAAI;AAClC,QAAM,KAAK,YAAY,OAAO,IAAI;AAClC,QAAM,KAAK,YAAY,OAAO,IAAI;AAClC,QAAM,IAAI,YAAY,OAAO,GAAG;AAChC,QAAM,MAAM,YAAY,OAAO,KAAK;AACpC,QAAM,OAAO,YAAY,OAAO,MAAM;AACtC,QAAM,IAAI,YAAY,OAAO,GAAG;AAChC,QAAM,KAAK,YAAY,OAAO,IAAI;AAClC,QAAM,MAAM,YAAY,OAAO,KAAK;AACpC,QAAM,MAAM,YAAY,OAAO,KAAK;AACpC,MAAI,OAAO,OAAO;AAClB,MAAI,OAAO,OAAO;AAClB,MAAI,OAAO,OAAO;AAClB,MAAI,MAAM,OAAO;AACjB,MAAI,QAAQ,OAAO;AACnB,MAAI,SAAS,OAAO;AACpB,MAAI,MAAM,OAAO;AACjB,MAAI,OAAO,OAAO;AAClB,MAAI,QAAQ,OAAO;AACnB,MAAI,QAAQ,OAAO;AACnB,MAAI,SAAS,OAAO;AACpB,MAAI,WAAW,OAAO;AAC1B;AAaM,SAAU,gBAAgB,QAAqB,QAAW;AAC5D,QAAM,SAAS,iBAAiB,MAAM;AACtC,QAAM,EAAE,OAAO,IAAG,IAAK;AACvB,QAAM,MAAM,YAAY,OAAO,KAAK;AACpC,QAAM,KAAK,YAAY,OAAO,IAAI;AAClC,QAAM,IAAI,YAAY,OAAO,GAAG;AAChC,QAAM,OAAO,YAAY,OAAO,MAAM;AACtC,QAAM,IAAI,YAAY,OAAO,GAAG;AAChC,QAAM,KAAK,YAAY,OAAO,IAAI;AAClC,QAAM,MAAM,YAAY,OAAO,KAAK;AACpC,QAAM,MAAM,YAAY,OAAO,KAAK;AACpC,MAAI,QAAQ,OAAO;AACnB,MAAI,OAAO,OAAO;AAClB,MAAI,MAAM,OAAO;AACjB,MAAI,SAAS,OAAO;AACpB,MAAI,MAAM,OAAO;AACjB,MAAI,OAAO,OAAO;AAClB,MAAI,QAAQ,OAAO;AACnB,MAAI,QAAQ,OAAO;AACvB;AAUM,SAAU,uBAAuB,QAAqB,QAAQ,KAAG;AACnE,QAAM,SAAS,OAAO,MAAM,KAAK;AACjC,MAAI,WAAW,GAAG;AACd,WAAO,IAAI,WAAW,OAAO,OAAO,EAAE,UAAU,GAAG,QAAQ,EAAC,CAAE;AAC9D;EACJ;AACA,QAAM,WAAW,KAAK,IAAI,SAAS,GAAG,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC;AAC5D,QAAM,WAAW,OAAO,MAAM,KAAK,GAAG,QAAQ;AAC9C,QAAM,SAAS,OAAO,MAAM,KAAK,GAAG,CAAC;AACrC,SAAO,IAAI,WAAW,OAAO,OAAO;IAChC,UAAU,OAAO,SAAS,QAAQ,IAAI,WAAW;IACjD;GACH;AACL;;;ACrZM,SAAU,qBAAkB;AAC9B,QAAM,QAAQ,oBAAI,IAAG;AACrB,SAAO;IACH,IAAO,IAAU;AACb,aAAO,MAAM,IAAI,EAAE;IACvB;IACA,IAAO,IAAY,OAAQ;AACvB,YAAM,IAAI,IAAI,KAAK;IACvB;IACA,IAAI,IAAU;AACV,aAAO,MAAM,IAAI,EAAE;IACvB;IACA,QAAK;AACD,YAAM,MAAK;IACf;;AAER;;;ACxBM,SAAU,yBAAyB,KAAmB;AACxD,aAAW,QAAQ,IAAI,WAAW,OAAM,GAAI;AACxC,SAAK,UAAS;EAClB;AACJ;AAYM,SAAU,iBAAiB,KAAmB;AAChD,aAAW,QAAQ,IAAI,WAAW,OAAM,GAAI;AACxC,SAAK,WAAU;EACnB;AACJ;AAYM,SAAU,gBAAgB,KAAmB;AAC/C,aAAW,CAAC,KAAK,IAAI,KAAK,IAAI,WAAW,QAAO,GAAI;AAChD,QAAI,WAAW,IAAgC,KAAK;MAChD,WAAW,KAAK;MAChB,WAAW,KAAK;KACnB;EACL;AACJ;AAYM,SAAU,oBAAoB,KAAmB;AACnD,QAAM,MAA+B,CAAA;AACrC,aAAW,CAAC,KAAK,IAAI,KAAK,IAAI,WAAW,QAAO,GAAI;AAChD,QAAI,GAAG,IAAI;MACP,WAAW,KAAK,UAAU,KAAK,SAAS;MACxC,WAAW,KAAK,UAAU,KAAK,SAAS;;EAEhD;AACA,SAAO,OAAO,OAAO,GAAG;AAC5B;AAYM,SAAU,kBACZ,KACA,OAAwC;AAExC,MAAI,WAAW,MAAK;AACpB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC9C,QAAI,WAAW,IAAI,KAAK,KAAK;EACjC;AACJ;;;ACiJO,IAAM,yBAA6D;EACtE,SAAS;;;;AC5NP,IAAO,YAAP,MAAgB;EAME;EACC;EANrB;EACA;EAEA,YACI,MACgB,gBACC,cAAuC,CAAA,GAAE;AAD1C,SAAA,iBAAA;AACC,SAAA,cAAA;AAEjB,SAAK,YAAY;AACjB,SAAK,YAAY;EACrB;EAEA,MAAG;AACC,WAAO,KAAK,iBAAiB,KAAK,YAAY,KAAK;EACvD;EAEA,IAAI,OAAQ;AACR,QAAI,KAAK,gBAAgB;AACrB,WAAK,YAAY;IACrB,OAAO;AACH,WAAK,YAAY;IACrB;EACJ;EAEA,aAAU;AACN,QAAI,CAAC,KAAK,gBAAgB;AACtB,WAAK,YAAY,KAAK;IAC1B;EACJ;EAEA,YAAS;AACL,QAAI,CAAC,KAAK,gBAAgB;AACtB,WAAK,YAAY,KAAK;IAC1B;EACJ;EAEA,UAAU,OAAQ;AACd,WAAO,KAAK,YAAY,iBAAiB,KAAK,KAAK;EACvD;;AAaE,SAAU,cAAiB,MAAkB;AAC/C,SAAO;IACH,IAAI,QAAK;AACL,aAAO,KAAK,IAAG;IACnB;IACA,IAAI,MAAM,OAAQ;AACd,WAAK,IAAI,KAAK;IAClB;;AAER;;;ACxFA,IAAM,WAAW,CAAC,WAA2B,GAAG,MAAM;AAEtD,SAAS,OAAO,MAAY;AACxB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,GAAG,IAAI,uCAAuC;EAClE;AACA,SAAO;AACX;AAEA,SAAS,cACL,MACA,QACA,MACA,gBAAuB;AAEvB,QAAM,MAAM,OAAO,IAAI;AACvB,QAAM,MAAM,SAAS,MAAM;AAC3B,QAAM,WAAW,IAAI,WAAW,IAAI,GAAG;AACvC,MAAI,aAAa,QAAW;AACxB,WAAO,cAAc,QAAwB;EACjD;AAEA,QAAM,SAAS,IAAI,WAAW,IAAwB,GAAG;AACzD,QAAM,OAAO,IAAI,UAAa,QAAQ,aAAa,MAAM,cAAc;AACvE,MAAI,WAAW,QAAW;AACtB,SAAK,YAAY,OAAO;EAC5B;AACA,MAAI,WAAW,IAAI,KAAK,IAA0B;AAClD,SAAO,cAAc,IAAI;AAC7B;AAaM,SAAU,sBAAmB;AAC/B,QAAM,KAAK;IACP,OAAO,CAAC,QAAgB,SACpB,cAAc,eAAe,QAAQ,MAAM,KAAK;IACpD,KAAK,CAAC,QAAgB,SAClB,cAAc,aAAa,QAAQ,MAAM,KAAK;IAClD,MAAM,CAAC,QAAgB,SACnB,cAAc,cAAc,QAAQ,MAAM,KAAK;IACnD,QAAQ,CAAC,QAAgB,SACrB,cAAc,gBAAgB,QAAQ,MAAM,KAAK;IACrD,MAAM;MACF,OAAO,CAAC,QAAgB,SACpB,cAAc,oBAAoB,QAAQ,MAAM,IAAI;MACxD,KAAK,CAAC,QAAgB,SAClB,cAAc,kBAAkB,QAAQ,MAAM,IAAI;MACtD,MAAM,CAAC,QAAgB,SACnB,cAAc,mBAAmB,QAAQ,MAAM,IAAI;MACvD,QAAQ,CAAC,QAAgB,SACrB,cAAc,qBAAqB,QAAQ,MAAM,IAAI;;;AAGjE,SAAO,OAAO,GAAG,IAAI;AACrB,SAAO,OAAO,EAAE;AAChB,SAAO;AACX;;;ACzEA,IAAM,gBAAgB,oBAAI,IAAY;EAClC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACH;AAgBK,SAAU,cACZ,UACA,WACA,KAAmB;AAEnB,QAAM,MAA+B,CAAA;AACrC,aAAW,CAAC,KAAK,UAAU,KAAK,OAAO,QAAQ,SAAS,MAAM,GAAG;AAC7D,UAAMC,YAAW,gBAAgB,UAAU;AAC3C,QAAI,CAAC,OAAO,OAAO,WAAW,GAAG,KAAK,UAAU,GAAG,MAAM,QAAW;AAChE,UAAI,GAAG,IAAIA;AACX;IACJ;AACA,UAAM,WAAW,UAAU,GAAG;AAC9B,QAAI,kBAAkB,YAAY,QAAQ,GAAG;AACzC,UAAI,GAAG,IAAI;AACX;IACJ;AACA,wBAAoB,KAAK,KAAK,WAAW,MAAM,QAAQ;AACvD,QAAI,GAAG,IAAIA;EACf;AACA,SAAO,OAAO,OAAO,GAAG;AAC5B;AAEA,SAAS,gBAAgB,YAAoC;AACzD,MAAI,kBAAkB;AAAY,WAAO,WAAW;AACpD,SAAO;AACX;AAEA,SAAS,kBAAkB,YAAsC,OAAc;AAC3E,UAAQ,WAAW,MAAM;IACrB,KAAK;AACD,aAAO,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK;IAC9D,KAAK;IACL,KAAK;IACL,KAAK;AACD,aAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;IAC7D,KAAK;AACD,aAAO,OAAO,UAAU;IAC5B,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;AACD,aAAO,OAAO,UAAU;IAC5B,KAAK;AACD,aAAO,OAAO,UAAU,YAAY,WAAW,QAAQ,SAAS,KAAK;IACzE,KAAK;AACD,aAAO,OAAO,UAAU,YAAY,cAAc,IAAI,KAAK;IAC/D,KAAK;AACD,aAAO,UAAU,QAAQ,OAAO,UAAU;EAClD;AACJ;AAEA,SAAS,oBACL,KACA,KACA,UACA,OAAc;AAEd,MAAI,IAAI,mBAAmB,IAAI,GAAG;AAAG;AACrC,MAAI,mBAAmB,IAAI,GAAG;AAC9B,MAAI,UAAU,YAAY,KAAK;IAC3B,MAAM;IACN,UAAU;IACV,MAAM;IACN,SAAS,UAAU,GAAG,cAAc,QAAQ,SAAS,cAAc,KAAK,CAAC;IACzE,QAAQ;IACR,KAAK;GACR;AACL;AAEA,SAAS,cAAc,OAAc;AACjC,MAAI,UAAU;AAAM,WAAO;AAC3B,MAAI,OAAO,UAAU,YAAY,OAAO,MAAM,KAAK;AAAG,WAAO;AAC7D,SAAO,OAAO;AAClB;;;AClFM,SAAU,+BACZ,UACA,SAA2B;AAE3B,MAAI,SAAS,WAAW;AAAG,WAAO,CAAA;AAClC,QAAM,UAAmB,MAAM,KAAK,EAAE,QAAQ,SAAS,OAAM,GAAI,MAAM,CAAA,CAAE;AAEzE,MAAI,YAAY;AAChB,MAAI,WAAW;AACf,SAAO,WAAW,QAAQ,UAAU,QAAQ,QAAQ,EAAE,OAAO,SAAS,CAAC,EAAE,MAAM;AAC3E,gBAAY;EAChB;AAEA,SAAO,WAAW,QAAQ,QAAQ;AAC9B,UAAM,MAAM,QAAQ,QAAQ;AAC5B,WAAO,YAAY,IAAI,SAAS,UAAU,SAAS,YAAY,CAAC,EAAE,QAAQ,IAAI,MAAM;AAChF,mBAAa;IACjB;AACA,YAAQ,SAAS,EAAE,KAAK,GAAG;AAC3B,gBAAY;EAChB;AAEA,SAAO;AACX;;;ACjCA,IAAM,QAAQ,oBAAI,QAAO;AAWnB,SAAU,YAAY,UAA8B,SAA2B;AACjF,MAAI,QAAQ,MAAM,IAAI,QAAQ;AAC9B,MAAI,UAAU,QAAW;AACrB,YAAQ,oBAAI,QAAO;AACnB,UAAM,IAAI,UAAU,KAAK;EAC7B;AAEA,QAAM,SAAS,MAAM,IAAI,OAAO;AAChC,MACI,WAAW,UACX,OAAO,eAAe,SAAS,UAC/B,OAAO,cAAc,QAAQ,QAC/B;AACE,WAAO,OAAO;EAClB;AAEA,QAAM,UAAU,+BAA+B,UAAU,OAAO;AAChE,QAAM,IAAI,SAAS,EAAE,YAAY,SAAS,QAAQ,WAAW,QAAQ,QAAQ,QAAO,CAAE;AACtF,SAAO;AACX;;;AC5BM,SAAU,SACZ,KACA,MACA,QACA,UACA,MACA,SAAe;AAEf,QAAM,MAAM,GAAG,IAAI,IAAI,MAAM,IAAI,QAAQ,IAAI,IAAI;AACjD,MAAI,IAAI,qBAAqB,IAAI,GAAG;AAAG;AACvC,MAAI,qBAAqB,IAAI,GAAG;AAChC,MAAI,UAAU,YAAY,KAAK;IAC3B,MAAM;IACN,UAAU;IACV;IACA;IACA;IACA,KAAK,IAAI,SAAQ;GACpB;AACL;;;ACjBM,SAAU,cAAc,QAAqB,KAAW;AAC1D,QAAM,OAAO,OAAO,MAAM,KAAK,GAAG,GAAG;AACrC,QAAM,OAAO,OAAO,MAAM,KAAK,GAAG,GAAG;AACrC,QAAM,MAAM,OAAO,MAAM,IAAI,GAAG,GAAG;AACnC,QAAM,QAAQ,OAAO,MAAM,MAAM,GAAG,GAAG;AACvC,SAAO;IACH,MAAM,OAAO,MAAM,KAAK,GAAG,GAAG;IAC9B;IACA;IACA;IACA;IACA,QAAQ,OAAO,MAAM,OAAO,GAAG,GAAG;IAClC,QAAQ,OAAO,IAAI;IACnB,UAAU,OAAO,IAAI;IACrB,MAAM,OAAO,OAAO;IACpB,OAAO,OAAO,MAAM,SAAS;IAC7B,QAAQ,OAAO,OAAO,MAAM,SAAS;IACrC,QAAQ,OAAO,MAAM,QAAQ,SAAS;;AAE9C;AAaM,SAAU,iBAAiB,KAAqB,QAAmB;AACrE,QAAM,SAAS,IAAI,6BAA6B,IAAI,MAAM;AAC1D,MAAI,WAAW;AAAW,WAAO;AACjC,QAAM,OAAc,CAAA;AACpB,WAAS,MAAM,OAAO,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG;AAC9D,SAAK,KAAK,cAAc,QAAQ,GAAG,CAAC;EACxC;AACA,MAAI,6BAA6B,IAAI,QAAQ,IAAI;AACjD,SAAO;AACX;;;ACjDA,IAAM,eAAmC,OAAO,OAAO,CAAA,CAAE;AAEzD,SAAS,SACL,KACA,QACA,UACA,MACA,SAAe;AAEf,WAAS,KAAK,MAAM,QAAQ,UAAU,WAAW,OAAO;AACxD,SAAO;AACX;AAEA,SAAS,SACL,KACA,QACA,UACA,KAAW;AAEX,MAAI,CAAC,IAAI,aAAa,gBAAgB;AAClC,WAAO,SACH,KACA,QACA,UACA,iCACA,+EAA+E;EAEvF;AAEA,QAAM,QAAQ,IAAI,aAAa,UAAU,KAAK,CAAC,eAAe,WAAW,UAAU,QAAQ;AAC3F,MAAI,CAAC,OAAO;AACR,WAAO,SACH,KACA,QACA,UACA,wBACA,uBAAuB,QAAQ,oCAAoC;EAE3E;AAEA,QAAM,YAAY,IAAI,iBAAiB,IAAI,QAAQ;AACnD,MAAI,cAAc,QAAW;AACzB,WAAO,SACH,KACA,QACA,UACA,4BACA,uBAAuB,QAAQ,sCAAsC;EAE7E;AAEA,QAAM,WAAW,iBAAiB,KAAK,IAAI,MAAM;AACjD,QAAM,UAAU,iBAAiB,KAAK,SAAS;AAC/C,QAAM,UAAU,YAAY,UAAU,OAAO;AAC7C,QAAM,QAAQ,QAAQ,SAAS,IAAI;AACnC,SAAO,QAAQ,KAAK,KAAK;AAC7B;AAYM,SAAU,kBACZ,KACA,QACA,UAAgB;AAEhB,QAAM,WAAW,GAAG,MAAM,IAAI,QAAQ;AACtC,QAAM,WAAW,IAAI,oBAAoB,IAAI,QAAQ;AACrD,MAAI,aAAa;AAAW,WAAO;AAEnC,QAAM,SAAS;IACX,IAAI,UAAO;AACP,aAAO,SAAS,KAAK,QAAQ,UAAU,CAAC;IAC5C;IACA,IAAI,SAAM;AACN,aAAO,IAAI,OAAO,MAAM,MAAM;IAClC;;AAEJ,QAAM,OAAO,IAAI,MAAM,OAAO,OAAO,MAAM,GAAG;IAC1C,IAAI,KAAK,MAAM,UAAQ;AACnB,UAAI,OAAO,SAAS,UAAU;AAC1B,cAAM,IAAI,OAAO,IAAI;AACrB,YAAI,OAAO,UAAU,CAAC,KAAK,KAAK;AAAG,iBAAO,SAAS,KAAK,QAAQ,UAAU,CAAC;MAC/E;AACA,aAAO,QAAQ,IAAI,KAAK,MAAM,QAAQ;IAC1C;GACH;AACD,MAAI,oBAAoB,IAAI,UAAU,IAAI;AAC1C,SAAO;AACX;;;AC3EM,SAAU,oBACZ,KACA,WACA,KAAuB;AAEvB,QAAM,MAAM,IAAI,MAAc,IAAI,MAAM;AAExC,MAAI,IAAI,WAAW,KAAK,IAAI,WAAW,GAAG;AACtC,QAAI,KAAK,OAAO,GAAG;AACnB,WAAO;EACX;AAEA,MAAI,YAAY;AAChB,MAAI,UAAU;AAEd,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,GAAG;AACpC,UAAM,IAAI,IAAI,CAAC,EAAE;AAEjB,WAAO,YAAY,IAAI,UAAU,IAAI,SAAS,EAAE,QAAQ,GAAG;AACvD,gBAAU;AACV,mBAAa;IACjB;AAEA,QAAI,CAAC,IAAI,WAAW,IAAI,UAAU,OAAO,IAAI,OAAO;EACxD;AAEA,SAAO;AACX;;;AC1CA,IAAMC,SAAQ,oBAAI,QAAO;AAsBnB,SAAU,WACZ,SACA,WACA,SAA2B;AAE3B,MAAI,QAAQA,OAAM,IAAI,OAAO;AAC7B,MAAI,UAAU,QAAW;AACrB,YAAQ,oBAAI,QAAO;AACnB,IAAAA,OAAM,IAAI,SAAS,KAAK;EAC5B;AACA,MAAI,WAAW,MAAM,IAAI,OAAO;AAChC,MAAI,aAAa,QAAW;AACxB,eAAW,oBAAI,QAAO;AACtB,UAAM,IAAI,SAAS,QAAQ;EAC/B;AAEA,QAAM,SAAS,SAAS,IAAI,SAAS;AACrC,MACI,WAAW,UACX,OAAO,cAAc,QAAQ,UAC7B,OAAO,cAAc,QAAQ,QAC/B;AACE,WAAO,OAAO;EAClB;AAEA,QAAM,UAAiB,oBAAoB,SAAS,WAAW,OAAO;AACtE,WAAS,IAAI,WAAW;IACpB,WAAW,QAAQ;IACnB,WAAW,QAAQ;IACnB;GACH;AACD,SAAO;AACX;;;AC/CA,IAAM,sBAAuD,OAAO,OAAO;EACvE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACH;AAED,SAAS,WAAc,SAAU;AAC7B,SAAO,OAAO,OAAO,EAAE,SAAS,QAAQ,EAAC,CAAE;AAC/C;AAYM,SAAU,qBAAkB;AAC9B,QAAM,kBAAkB,WAAW,OAAO,GAAG;AAC7C,QAAM,kBAAkB,WAAW,EAAE;AACrC,SAAO,OAAO,OAAO;IACjB,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,OAAO;IACP,QAAQ;IACR,KAAK;IACL,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;IACR,UAAU;GACb;AACL;AAEA,SAAS,gBAAgB,QAAqB,WAA2B;AACrE,QAAM,SAAmB,CAAA;AACzB,QAAM,SAAS,OAAO,MAAM,SAAS;AACrC,WAAS,MAAM,OAAO,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG;AAClD,WAAO,KAAK,OAAO,GAAG,GAAG,CAAC;EAC9B;AACA,SAAO;AACX;AAEA,SAAS,aAAa,QAAgB,UAAkB,WAA2B;AAC/E,SAAO,GAAG,MAAM,IAAI,QAAQ,IAAI,SAAS;AAC7C;AAEA,SAAS,cACL,KACA,QACA,UACA,WACA,WAAsB;AAEtB,QAAM,MAAM,aAAa,QAAQ,UAAU,SAAS;AACpD,QAAM,WAAW,IAAI,0BAA0B,IAAI,GAAG;AACtD,MAAI,aAAa;AAAW,WAAO;AACnC,QAAM,UAAU,iBAAiB,KAAK,SAAS;AAC/C,QAAM,UAAU,iBAAiB,KAAK,IAAI,MAAM;AAChD,QAAM,UAAU,WAAW,SAAS,gBAAgB,WAAW,SAAS,GAAG,OAAO;AAClF,MAAI,0BAA0B,IAAI,KAAK,OAAO;AAC9C,SAAO;AACX;AAEA,SAAS,wBACL,KACA,QACA,UACA,WACA,WAAsB;AAEtB,QAAM,SAAS;IACX,IAAI,UAAO;AACP,YAAM,UAAU,cAAc,KAAK,QAAQ,UAAU,WAAW,SAAS;AACzE,YAAM,QAAQ,QAAQ,QAAQ,SAAS,CAAC;AACxC,aAAO,UAAU,SAAY,OAAO,MAAM;IAC9C;IACA,IAAI,SAAM;AACN,aAAO,IAAI,OAAO,MAAM,MAAM;IAClC;;AAEJ,SAAO,IAAI,MAAM,OAAO,OAAO,MAAM,GAAG;IACpC,IAAI,KAAK,MAAM,UAAQ;AACnB,UAAI,OAAO,SAAS,UAAU;AAC1B,cAAM,IAAI,OAAO,IAAI;AACrB,YAAI,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG;AAC/B,gBAAM,UAAU,cAAc,KAAK,QAAQ,UAAU,WAAW,SAAS;AACzE,gBAAM,QAAQ,QAAQ,QAAQ,SAAS,IAAI,CAAC;AAC5C,iBAAO,UAAU,SAAY,OAAO,MAAM;QAC9C;MACJ;AACA,aAAO,QAAQ,IAAI,KAAK,MAAM,QAAQ;IAC1C;GACH;AACL;AAEA,SAAS,yBAAyB,OAAa;AAC3C,QAAM,SAAS;IACX,IAAI,UAAO;AACP,aAAO;IACX;IACA,IAAI,SAAM;AACN,aAAO;IACX;;AAEJ,SAAO,IAAI,MAAM,OAAO,OAAO,MAAM,GAAG;IACpC,IAAI,KAAK,MAAM,UAAQ;AACnB,UAAI,OAAO,SAAS,UAAU;AAC1B,cAAM,IAAI,OAAO,IAAI;AACrB,YAAI,OAAO,UAAU,CAAC,KAAK,KAAK;AAAG,iBAAO;MAC9C;AACA,aAAO,QAAQ,IAAI,KAAK,MAAM,QAAQ;IAC1C;GACH;AACL;AAEA,SAAS,oBACL,KACA,QACA,UACA,WAAsB;AAEtB,QAAM,UAAU,oBAAI,IAAG;AACvB,aAAW,OAAO,qBAAqB;AACnC,YAAQ,IAAI,KAAK,wBAAwB,KAAK,QAAQ,UAAU,KAAK,SAAS,CAAC;EACnF;AACA,SAAO,OAAO,OAAO;IACjB,MAAM,QAAQ,IAAI,MAAM,KAAK,WAAW,OAAO,GAAG;IAClD,MAAM,QAAQ,IAAI,MAAM,KAAK,WAAW,OAAO,GAAG;IAClD,MAAM,QAAQ,IAAI,MAAM,KAAK,WAAW,OAAO,GAAG;IAClD,KAAK,QAAQ,IAAI,KAAK,KAAK,WAAW,OAAO,GAAG;IAChD,OAAO,QAAQ,IAAI,OAAO,KAAK,WAAW,OAAO,GAAG;IACpD,QAAQ,QAAQ,IAAI,QAAQ,KAAK,WAAW,OAAO,GAAG;IACtD,KAAK,QAAQ,IAAI,KAAK,KAAK,WAAW,OAAO,GAAG;IAChD,MAAM,QAAQ,IAAI,MAAM,KAAK,WAAW,OAAO,GAAG;IAClD,OAAO,QAAQ,IAAI,OAAO,KAAK,WAAW,OAAO,GAAG;IACpD,OAAO,QAAQ,IAAI,OAAO,KAAK,WAAW,OAAO,GAAG;IACpD,QAAQ,yBAAyB,UAAU,IAAI,MAAM;IACrD,UAAU,yBAAyB,QAAQ;GAC9C;AACL;AAEA,SAAS,YACL,KACA,UACA,QACA,UACA,MACA,SAAe;AAEf,WAAS,KAAK,MAAM,QAAQ,UAAU,YAAY,OAAO;AACzD,QAAM,MAAM,mBAAkB;AAC9B,MAAI,oBAAoB,IAAI,UAAU,GAAG;AACzC,SAAO;AACX;AAYM,SAAU,gBACZ,KACA,QACA,UAAgB;AAEhB,QAAM,WAAW,GAAG,MAAM,IAAI,QAAQ;AACtC,QAAM,WAAW,IAAI,oBAAoB,IAAI,QAAQ;AACrD,MAAI,aAAa;AAAW,WAAO;AAEnC,MAAI,CAAC,IAAI,aAAa,gBAAgB;AAClC,WAAO,YACH,KACA,UACA,QACA,UACA,iCACA,sEAAsE;EAE9E;AAEA,QAAM,QAAQ,IAAI,aAAa,UAAU,KAAK,CAAC,eAAe,WAAW,UAAU,QAAQ;AAC3F,MAAI,CAAC,OAAO;AACR,WAAO,YACH,KACA,UACA,QACA,UACA,wBACA,uBAAuB,QAAQ,oCAAoC;EAE3E;AAEA,QAAM,YAAY,IAAI,iBAAiB,IAAI,QAAQ;AACnD,MAAI,cAAc,QAAW;AACzB,WAAO,YACH,KACA,UACA,QACA,UACA,4BACA,uBAAuB,QAAQ,sCAAsC;EAE7E;AAEA,QAAM,MAAM,oBAAoB,KAAK,QAAQ,UAAU,SAAS;AAChE,MAAI,oBAAoB,IAAI,UAAU,GAAG;AACzC,SAAO;AACX;;;ACxOA,SAASC,QAAO,MAAY;AACxB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,GAAG,IAAI,uCAAuC;EAClE;AACA,SAAO;AACX;AAEA,SAAS,SAAS,QAAgB,MAAyB;AACvD,QAAM,MAAMA,QAAO,kBAAkB;AACrC,SAAO,gBAAgB,KAAK,QAAQ,KAAK,QAAQ;AACrD;AAEA,SAAS,QAAQ,QAAgB,MAAwB;AACrD,QAAM,MAAMA,QAAO,iBAAiB;AACpC,SAAO,kBAAkB,KAAK,QAAQ,KAAK,QAAQ;AACvD;AAgBM,SAAU,wBAAqB;AACjC,QAAM,KAAK,OAAO,OAAO,EAAE,UAAU,QAAO,CAAE;AAC9C,SAAO;AACX;;;ACHM,SAAU,iBAAiB,QAAsB;AACnD,QAAM,EAAE,WAAW,UAAU,UAAS,IAAK;AAC3C,SAAO,OAAO,OAAO;IACjB,SAAS,aAAa;IACtB,QAAQ;IACR,OAAO,cAAc,aAAa,cAAc;IAChD,WAAW,cAAc;IACzB,YAAY,cAAc;IAC1B,aAAa,cAAc;GAC9B;AACL;;;ACrDA,SAAS,YAAY,OAAa;AAC9B,QAAM,QAAQ,SAAS,KAAK,KAAK;AACjC,SAAO,UAAU,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC;AAClD;AAEA,IAAM,gBAAkD,OAAO,OAAO;EAClE,QAAQ;EACR,QAAQ;EACR,MAAM;EACN,OAAO;EACP,QAAQ;EACR,SAAS;EACT,WAAW;EACX,QAAQ;CACX;AAED,IAAM,kBAAkB,oBAAI,IAAI,CAAC,UAAU,UAAU,MAAM,CAAC;AAC5D,IAAM,iBAAiB,oBAAI,IAAI,CAAC,WAAW,aAAa,QAAQ,CAAC;AAgB3D,SAAU,kBACZ,UACA,YAA0C;AAE1C,QAAMC,SAAQ,YAAY,SAAS;AACnC,QAAM,SAAS,YAAY,QAAQ,KAAK,OAAO;AAC/C,QAAM,cAAc,cAAcA,MAAK,KAAK,OAAO;AACnD,QAAM,YACF,OAAO,SAAS,MAAM,KAAK,OAAO,SAAS,WAAW,IAAI,SAAS,cAAc,OAAO;AAE5F,SAAO,OAAO,OAAO;IACjB,QAAQ;IACR,YAAY,gBAAgB,IAAIA,MAAK;IACrC,SAASA,WAAU;IACnB,UAAUA,WAAU;IACpB,WAAW,eAAe,IAAIA,MAAK;IACnC;GACH;AACL;;;AC/CA,SAAS,eACL,WACA,UAAgB;AAEhB,SAAO,UAAU,KAAK,CAAC,cAAc,UAAU,UAAU,QAAQ;AACrE;AAaM,SAAU,oBAAoBC,QAAoB,WAAoB;AACxE,QAAM,EAAE,eAAc,IAAKA;AAC3B,QAAM,WAAW,eAAe,OAAO,IAAI;AAC3C,iBAAe,MAAM,WAAW,iBAAiB;IAC7C;IACA,UAAU,eAAe,SAAQ;IACjC,WAAW,cAAc;GAC5B;AACD,iBAAe,MAAM,YAAY,kBAC7B,UACA,eAAe,eAAe,aAAa,WAAW,QAAQ,CAAC;AAEvE;;;ACTA,IAAM,aAAkD,OAAO,OAAO,CAAA,CAAE;AAiBlE,SAAU,gBACZ,SACA,SAA4B;AAE5B,SAAO,OAAO,OAAO;IACjB,QAAQ,QAAQ,IAAI,QAAQ,IAAK,QAAQ,UAAU,KAAM;IACzD,MAAM,QAAQ,IAAI,MAAM,IAAK,QAAQ,QAAQ,WAAY;IACzD,SAAS,QAAQ,IAAI,SAAS,IAAK,QAAQ,WAAW,OAAO,MAAO,OAAO;IAC3E,UAAU,QAAQ,IAAI,UAAU,IAAK,QAAQ,YAAY,KAAM;IAC/D,cAAc,QAAQ,IAAI,cAAc,IAAK,QAAQ,gBAAgB,KAAM;IAC3E,UAAU,QAAQ,IAAI,UAAU,IAAK,QAAQ,YAAY,KAAM;IAC/D,UAAU,QAAQ,IAAI,UAAU,IAAK,QAAQ,YAAY,KAAM;IAC/D,SAAS,QAAQ,IAAI,SAAS,IAAK,QAAQ,WAAW,KAAM;IAC5D,MAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,OAAO,EAAE,GAAI,QAAQ,QAAQ,CAAA,EAAG,CAAE,IAAI;GAC5E;AACL;;;ACzBM,SAAU,mBAAmB,OAA2C,CAAA,GAAE;AAC5E,SAAO;IACH,UAAU,iBAAiB,EAAE,WAAW,WAAW,UAAU,GAAG,WAAW,MAAK,CAAE;IAClF,SAAS,KAAK,WAAW,gBAAgB,CAAA,GAAI,oBAAI,IAAG,CAAE;IACtD,WAAW,kBAAkB,IAAI,MAAS;;AAElD;;;ACtCA,IAAM,cAAc,OAAO,OAAO;EAC9B,GAAG;EACH,IAAI;EACJ,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;CACN;;;ACkBM,IAAM,QAAQ,OAAO,OAAO;;;;;;;;;;EAU/B,IACI,cACA,MAKC;AAED,WAAO,OAAO,OAAO,EAAE,MAAM,OAAgB,cAAc,GAAG,KAAI,CAAE;EACxE;;;;;;;;;;EAWA,MACI,cACA,MAKC;AAED,WAAO,OAAO,OAAO,EAAE,MAAM,SAAkB,cAAc,GAAG,KAAI,CAAE;EAC1E;;;;;;;;;;EAWA,KAAK,cAAuB,MAAkC;AAC1D,WAAO,OAAO,OAAO,EAAE,MAAM,QAAiB,cAAc,GAAG,KAAI,CAAE;EACzE;;;;;;;;;;EAWA,OACI,cACA,MAAgE;AAEhE,WAAO,OAAO,OAAO,EAAE,MAAM,UAAmB,cAAc,GAAG,KAAI,CAAE;EAC3E;;;;;;;;;;EAWA,KACI,cACA,SACA,MAAkC;AAElC,WAAO,OAAO,OAAO;MACjB,MAAM;MACN;MACA,SAAS,OAAO,OAAO,QAAQ,MAAK,CAAE;MACtC,GAAG;KACN;EACL;;;;;;;;;;EAWA,MAAM,cAAqB,MAAkC;AACzD,WAAO,OAAO,OAAO,EAAE,MAAM,SAAkB,cAAc,GAAG,KAAI,CAAE;EAC1E;;;;;;;;;;EAWA,OAAO,cAA2B,MAAkC;AAChE,WAAO,OAAO,OAAO,EAAE,MAAM,UAAmB,cAAc,GAAG,KAAI,CAAE;EAC3E;;;;;;;;;;EAWA,KACI,cACA,MAAoE;AAEpE,WAAO,OAAO,OAAO,EAAE,MAAM,QAAiB,cAAc,GAAG,KAAI,CAAE;EACzE;;;;;;;;;;EAWA,MAAM,cAAqB,MAAkC;AACzD,WAAO,OAAO,OAAO,EAAE,MAAM,SAAkB,cAAc,GAAG,KAAI,CAAE;EAC1E;;;;;;;;;;EAWA,OAAO,cAAsB,MAAkC;AAC3D,WAAO,OAAO,OAAO,EAAE,MAAM,UAAmB,cAAc,GAAG,KAAI,CAAE;EAC3E;;;;;;;;;;EAWA,SAAS,cAAsB,MAAkC;AAC7D,WAAO,OAAO,OAAO,EAAE,MAAM,YAAqB,cAAc,GAAG,KAAI,CAAE;EAC7E;;;;;;;;;;;;;EAcA,eAAkB,MAIjB;AACG,WAAO,OAAO,OAAO;MACjB,MAAM;MACN,MAAM,KAAK;MACX,QAAQ,KAAK;MACb,GAAI,KAAK,UAAU,SAAY,CAAA,IAAK,EAAE,OAAO,KAAK,MAAK;KAC1D;EACL;CACH;;;ACnOD,IAAM,WAAW,CAAC,SAAuB;AACrC,QAAM,IAAI,MAAM,GAAG,IAAI,uCAAuC;AAClE;AAiBO,IAAM,QAAQ,OAAO,OAAO;;;;;;;;;;EAU/B,MAAM,OAAa;AACf,WAAO,SAAS,aAAa;EACjC;;;;;;;;;;EAWA,IAAI,OAAa;AACb,WAAO,SAAS,WAAW;EAC/B;;;;;;;;;;EAWA,KAAK,OAAc;AACf,WAAO,SAAS,YAAY;EAChC;;;;;;;;;;EAWA,OAAO,OAAa;AAChB,WAAO,SAAS,cAAc;EAClC;;;;;;;;;;;EAYA,MAAM,OAAO,OAAO;IAChB,MAAM,OAAa;AACf,aAAO,SAAS,kBAAkB;IACtC;IACA,IAAI,OAAa;AACb,aAAO,SAAS,gBAAgB;IACpC;IACA,KAAK,OAAc;AACf,aAAO,SAAS,iBAAiB;IACrC;IACA,OAAO,OAAa;AAChB,aAAO,SAAS,mBAAmB;IACvC;GACH;CACJ;;;AC3DM,IAAM,WAAyB,OAAO,OAAO;EAChD,SAAS;EACT,QAAQ;EACR,OAAO;EACP,WAAW;EACX,YAAY;EACZ,aAAa;CAChB;;;ACUM,IAAM,UAAuB,OAAO,OAAO;EAC9C,QAAQ;EACR,MAAM;EACN,SAAS,OAAO;EAChB,UAAU;EACV,cAAc;EACd,UAAU;EACV,UAAU;EACV,SAAS;EACT,MAAM,OAAO,OAAO,CAAA,CAAE;CACzB;;;AC3BM,IAAM,YAA2B,OAAO,OAAO;EAClD,QAAQ;EACR,YAAY;EACZ,SAAS;EACT,UAAU;EACV,WAAW;EACX,WAAW,OAAO;CACrB;;;ACkBD,IAAMC,YAAW,CAAC,SAAuB;AACrC,QAAM,IAAI,MAAM,GAAG,IAAI,uCAAuC;AAClE;AAcO,IAAM,UAAU,OAAO,OAAO;;;;;;;;;;EAUjC,SAAS,OAA0B;AAC/B,WAAOA,UAAS,kBAAkB;EACtC;;;;;;;;;;EAUA,QAAQ,OAAyB;AAC7B,WAAOA,UAAS,iBAAiB;EACrC;CACH;;;AClFD,SAAS,SAAS,UAAkB,OAA2C;AAC3E,QAAM,IAAI,MAAM,kDAAkD;AACtE;AAWA,SAAS,SAAS,UAAkB,OAA2C;AAC3E,QAAM,IAAI,MAAM,kDAAkD;AACtE;AAWA,SAAS,UAAU,UAAkB,OAA2C;AAC5E,QAAM,IAAI,MAAM,mDAAmD;AACvE;AAcA,SAAS,OAAO,UAAgB;AAC5B,QAAM,IAAI,MAAM,+CAA+C;AACnE;AAWO,IAAM,UAAU,OAAO,OAAO;EACjC,KAAK,OAAO,OAAO;IACf,MAAM;IACN,MAAM;IACN,OAAO;GACV;EACD,OAAO;CACV;;;ACzEM,IAAM,gBAAgB,OAAO,OAAO;EACvC,MAAM;EACN,OAAO;EACP,MAAM;EACN,SAAS;EACT,MAAM;EACN,OAAO;EACP,MAAM;EACN,QAAQ;EACR,MAAM;EACN,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,KAAK;EACL,QAAQ;EACR,MAAM;EACN,OAAO;EACP,QAAQ;CACX;AAID,IAAM,YAAY;AAClB,IAAM,WAAW;AACjB,IAAM,MAAM;AACZ,IAAM,MAAM;AAEZ,SAAS,cAAc,OAAa;AAChC,SAAO,OAAO,UAAU,eAAe,KAAK,eAAe,KAAK;AACpE;AAEA,SAAS,UAAU,OAAa;AAC5B,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AACvD;AAEA,SAAS,iBAAiB,OAAa;AACnC,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AACvD;AAEA,SAAS,UAAU,OAAa;AAC5B,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AACzC;AAEA,SAAS,YAAY,OAAa;AAC9B,QAAM,SAAS,OAAO,KAAK;AAC3B,MAAI,OAAO,MAAM,MAAM;AAAG,WAAO;AACjC,SAAO;AACX;AAEA,SAAS,SAAS,GAAW,GAAW,GAAS;AAC7C,QAAM,MAAM,KAAK,IAAI,SAAS,KAAK,IAAI,GAAG,CAAC,CAAC,IAAI;AAChD,QAAM,MAAM,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,CAAC,CAAC,IAAI;AAC5C,QAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,CAAC,CAAC,IAAI;AAE9C,MAAI,QAAQ,GAAG;AACX,UAAM,OAAO,iBAAiB,QAAQ,GAAG;AACzC,WAAO,EAAE,GAAG,MAAM,GAAG,MAAM,GAAG,KAAI;EACtC;AAEA,QAAM,IAAI,QAAQ,MAAM,SAAS,IAAI,OAAO,QAAQ,MAAM,QAAQ;AAClE,QAAM,IAAI,IAAI,QAAQ;AACtB,QAAM,UAAU,CAAC,MAAqB;AAClC,QAAI,WAAW;AACf,QAAI,WAAW;AAAG,kBAAY;AAC9B,QAAI,WAAW;AAAG,kBAAY;AAC9B,QAAI,WAAW,IAAI;AAAG,aAAO,KAAK,IAAI,KAAK,IAAI;AAC/C,QAAI,WAAW,IAAI;AAAG,aAAO;AAC7B,QAAI,WAAW,IAAI;AAAG,aAAO,KAAK,IAAI,MAAM,IAAI,IAAI,YAAY;AAChE,WAAO;EACX;AAEA,SAAO;IACH,GAAG,iBAAiB,QAAQ,MAAM,IAAI,CAAC,IAAI,GAAG;IAC9C,GAAG,iBAAiB,QAAQ,GAAG,IAAI,GAAG;IACtC,GAAG,iBAAiB,QAAQ,MAAM,IAAI,CAAC,IAAI,GAAG;;AAEtD;AAaM,SAAU,WACZ,GAAQ;AAER,QAAM,QAAQ,EAAE,KAAI,EAAG,YAAW;AAClC,MAAI,cAAc,KAAK;AAAG,WAAO,WAAW,cAAc,KAAK,CAAC;AAEhE,QAAM,WAAW,UAAU,KAAK,KAAK;AACrC,MAAI,UAAU;AACV,UAAM,MAAM,SAAS,CAAC;AACtB,WAAO;MACH,GAAG,OAAO,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE;MAC3C,GAAG,OAAO,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE;MAC3C,GAAG,OAAO,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE;MAC3C,GAAG;;EAEX;AAEA,QAAM,UAAU,SAAS,KAAK,KAAK;AACnC,MAAI,SAAS;AACT,UAAM,MAAM,QAAQ,CAAC;AACrB,WAAO;MACH,GAAG,OAAO,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;MACtC,GAAG,OAAO,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;MACtC,GAAG,OAAO,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;MACtC,GAAG;;EAEX;AAEA,QAAM,WAAW,IAAI,KAAK,KAAK;AAC/B,MAAI,UAAU;AACV,UAAM,IAAI,YAAY,SAAS,CAAC,CAAC;AACjC,UAAM,IAAI,YAAY,SAAS,CAAC,CAAC;AACjC,UAAM,IAAI,YAAY,SAAS,CAAC,CAAC;AACjC,UAAM,IAAI,SAAS,CAAC,MAAM,SAAY,IAAI,YAAY,SAAS,CAAC,CAAC;AACjE,QAAI,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAAM,aAAO;AACjE,WAAO,EAAE,GAAG,UAAU,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG,GAAG,UAAU,CAAC,EAAC;EAC/E;AAEA,QAAM,WAAW,IAAI,KAAK,KAAK;AAC/B,MAAI,UAAU;AACV,UAAM,IAAI,YAAY,SAAS,CAAC,CAAC;AACjC,UAAM,IAAI,YAAY,SAAS,CAAC,CAAC;AACjC,UAAM,IAAI,YAAY,SAAS,CAAC,CAAC;AACjC,UAAM,IAAI,SAAS,CAAC,MAAM,SAAY,IAAI,YAAY,SAAS,CAAC,CAAC;AACjE,QAAI,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAAM,aAAO;AACjE,WAAO,EAAE,GAAG,SAAS,GAAG,GAAG,CAAC,GAAG,GAAG,UAAU,CAAC,EAAC;EAClD;AAEA,SAAO;AACX;;;ACxIA,IAAM,oBAAoB;AAE1B,SAASC,WAAU,OAAa;AAC5B,MAAI,OAAO,MAAM,KAAK;AAAG,WAAO;AAChC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AACzC;AAEA,SAASC,WAAU,OAAa;AAC5B,MAAI,OAAO,MAAM,KAAK;AAAG,WAAO;AAChC,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AACvD;AAEA,SAAS,SAAS,OAAa;AAC3B,MAAI,OAAO,MAAM,KAAK;AAAG,WAAO;AAChC,SAAO,KAAK,IAAI,SAAS,KAAK,IAAI,GAAG,KAAK,CAAC;AAC/C;AAEA,SAAS,aAAa,OAAa;AAC/B,MAAI,OAAO,MAAM,KAAK;AAAG,WAAO;AAChC,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC;AAC3C;AAEA,SAAS,aAAa,OAAa;AAC/B,QAAM,UAAU,KAAK,MAAM,QAAQ,GAAI,IAAI;AAC3C,SAAO,OAAO,OAAO;AACzB;AAEA,SAAS,QAAQ,GAAW,GAAW,GAAW,OAAa;AAC3D,MAAI,SAAS;AAAG,WAAO,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AAC3C,SAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,aAAa,KAAK,CAAC;AACxD;AAEA,SAAS,SAAS,GAAW,GAAW,GAAW,OAAa;AAC5D,SAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,aAAa,KAAK,CAAC;AACxD;AAgBM,SAAU,aAAa,GAAW,OAAkC;AACtE,QAAM,QAAQ,MAAM,CAAC;AACrB,MAAI,UAAU;AAAW,WAAO;AAChC,MAAI,MAAM,WAAW,KAAK,OAAO,MAAM,CAAC;AAAG,WAAO,MAAM;AAExD,QAAM,WAAWD,WAAU,CAAC;AAC5B,MAAI,YAAY,MAAM;AAAI,WAAO,MAAM;AACvC,QAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,MAAI,YAAY,KAAK;AAAI,WAAO,KAAK;AAErC,MAAI,WAAW;AACf,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACtC,UAAM,YAAY,MAAM,CAAC;AACzB,QAAI,YAAY,UAAU,IAAI;AAC1B,aAAO;AACP;IACJ;AACA,eAAW;EACf;AAEA,QAAM,OAAO,WAAW,SAAS,KAAK;AACtC,QAAM,QAAQ,WAAW,KAAK,KAAK;AACnC,MAAI,SAAS,QAAQ,UAAU;AAAM,WAAO,SAAS;AACrD,QAAM,SAAS,WAAW,SAAS,OAAO,KAAK,KAAK,SAAS;AAC7D,QAAM,QAAQ,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK;AAC5C,SAAO,QACHC,WAAU,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK,GAC7CA,WAAU,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK,GAC7CA,WAAU,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK,GAC7CD,WAAU,KAAK,CAAC;AAExB;AAaM,SAAU,UAAU,GAAU,OAAa;AAC7C,MAAI,OAAO,MAAM,KAAK;AAAG,WAAO;AAChC,QAAM,SAAS,WAAW,CAAC;AAC3B,MAAI,WAAW;AAAM,WAAO;AAC5B,SAAO,SAAS,OAAO,GAAG,OAAO,GAAG,OAAO,GAAGA,WAAU,KAAK,CAAC;AAClE;AAYM,SAAU,IAAI,GAAW,GAAW,GAAW,OAAc;AAC/D,QAAM,MAAMC,WAAU,CAAC;AACvB,QAAM,QAAQA,WAAU,CAAC;AACzB,QAAM,OAAOA,WAAU,CAAC;AACxB,MAAI,UAAU;AAAW,WAAO,OAAO,GAAG,KAAK,KAAK,KAAK,IAAI;AAC7D,SAAO,SAAS,KAAK,OAAO,MAAMD,WAAU,KAAK,CAAC;AACtD;AAaM,SAAU,IAAI,GAAW,GAAW,GAAW,OAAc;AAC/D,QAAM,MAAM,aAAa,SAAS,CAAC,CAAC;AACpC,QAAM,MAAM,aAAa,aAAa,CAAC,CAAC;AACxC,QAAM,QAAQ,aAAa,aAAa,CAAC,CAAC;AAC1C,MAAI,UAAU;AAAW,WAAO,OAAO,GAAG,KAAK,GAAG,MAAM,KAAK;AAC7D,SAAO,QAAQ,GAAG,KAAK,GAAG,MAAM,KAAK,MAAM,aAAaA,WAAU,KAAK,CAAC,CAAC;AAC7E;;;ACvIO,IAAM,QAAQ,OAAO,OAAO;EAC/B,GAAG;EACH;EACA;EACA;EACA;CACH;;;ACRD,IAAM,6BAAoE;EACtE,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,YAAY,MAAM,KAAI;EAC9B,EAAE,MAAM,SAAS,MAAM,KAAI;EAC3B,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,WAAW,MAAM,KAAI;EAC7B,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,gBAAgB,MAAM,KAAI;EAClC,EAAE,MAAM,iBAAiB,MAAM,KAAI;EACnC,EAAE,MAAM,cAAc,MAAM,KAAI;EAChC,EAAE,MAAM,aAAa,MAAM,KAAI;EAC/B,EAAE,MAAM,aAAa,MAAM,KAAI;EAC/B,EAAE,MAAM,gBAAgB,MAAM,KAAI;EAClC,EAAE,MAAM,gBAAgB,MAAM,KAAI;EAClC,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,WAAW,MAAM,KAAI;EAC7B,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,WAAW,MAAM,KAAI;EAC7B,EAAE,MAAM,WAAW,MAAM,KAAI;EAC7B,EAAE,MAAM,WAAW,MAAM,KAAI;EAC7B,EAAE,MAAM,WAAW,MAAM,KAAI;EAC7B,EAAE,MAAM,WAAW,MAAM,KAAI;EAC7B,EAAE,MAAM,WAAW,MAAM,KAAI;EAC7B,EAAE,MAAM,eAAe,MAAM,KAAI;EACjC,EAAE,MAAM,eAAe,MAAM,KAAI;EACjC,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,YAAY,MAAM,KAAI;EAC9B,EAAE,MAAM,gBAAgB,MAAM,KAAI;EAClC,EAAE,MAAM,eAAe,MAAM,KAAI;EACjC,EAAE,MAAM,kBAAkB,MAAM,KAAI;EACpC,EAAE,MAAM,cAAc,MAAM,KAAI;EAChC,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,iBAAiB,MAAM,KAAI;EACnC,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,aAAa,MAAM,KAAI;EAC/B,EAAE,MAAM,cAAc,MAAM,KAAI;EAChC,EAAE,MAAM,WAAW,MAAM,KAAI;EAC7B,EAAE,MAAM,SAAS,MAAM,KAAI;EAC3B,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,eAAe,MAAM,KAAI;EACjC,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,YAAY,MAAM,KAAI;EAC9B,EAAE,MAAM,eAAe,MAAM,KAAI;EACjC,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,WAAW,MAAM,KAAI;EAC7B,EAAE,MAAM,aAAa,MAAM,KAAI;EAC/B,EAAE,MAAM,yBAAyB,MAAM,KAAI;EAC3C,EAAE,MAAM,eAAe,MAAM,KAAI;EACjC,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,WAAW,MAAM,KAAI;EAC7B,EAAE,MAAM,mBAAmB,MAAM,KAAI;EACrC,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,iBAAiB,MAAM,KAAI;EACnC,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,gBAAgB,MAAM,KAAI;EAClC,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,gCAAgC,MAAM,KAAI;EAClD,EAAE,MAAM,4BAA4B,MAAM,KAAI;EAC9C,EAAE,MAAM,2BAA2B,MAAM,KAAI;EAC7C,EAAE,MAAM,8BAA8B,MAAM,KAAI;EAChD,EAAE,MAAM,aAAa,MAAM,KAAI;EAC/B,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,iBAAiB,MAAM,KAAI;EACnC,EAAE,MAAM,iBAAiB,MAAM,KAAI;EACnC,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,eAAe,MAAM,KAAI;EACjC,EAAE,MAAM,cAAc,MAAM,KAAI;EAChC,EAAE,MAAM,eAAe,MAAM,KAAI;EACjC,EAAE,MAAM,WAAW,MAAM,KAAI;EAC7B,EAAE,MAAM,2BAA2B,MAAM,KAAI;EAC7C,EAAE,MAAM,UAAU,MAAM,KAAI;EAC5B,EAAE,MAAM,gBAAgB,MAAM,KAAI;EAClC,EAAE,MAAM,WAAW,MAAM,KAAI;EAC7B,EAAE,MAAM,iBAAiB,MAAM,KAAI;EACnC,EAAE,MAAM,iBAAiB,MAAM,KAAI;EACnC,EAAE,MAAM,sBAAsB,MAAM,KAAI;EACxC,EAAE,MAAM,sBAAsB,MAAM,KAAI;EACxC,EAAE,MAAM,aAAa,MAAM,KAAI;EAC/B,EAAE,MAAM,oBAAoB,MAAM,KAAI;EACtC,EAAE,MAAM,qBAAqB,MAAM,KAAI;EACvC,EAAE,MAAM,qBAAqB,MAAM,KAAI;EACvC,EAAE,MAAM,SAAS,MAAM,MAAK;EAC5B,EAAE,MAAM,QAAQ,MAAM,KAAI;EAC1B,EAAE,MAAM,SAAS,MAAM,KAAI;EAC3B,EAAE,MAAM,SAAS,MAAM,KAAI;;;;EAI3B,EAAE,MAAM,aAAa,MAAM,KAAI;EAC/B,EAAE,MAAM,uBAAuB,MAAM,KAAI;EACzC,EAAE,MAAM,sBAAsB,MAAM,KAAI;EACxC,EAAE,MAAM,qBAAqB,MAAM,KAAI;EACvC,EAAE,MAAM,kBAAkB,MAAM,KAAI;EACpC,EAAE,MAAM,mBAAmB,MAAM,KAAI;EACrC,EAAE,MAAM,kBAAkB,MAAM,KAAI;EACpC,EAAE,MAAM,yBAAyB,MAAM,KAAI;EAC3C,EAAE,MAAM,iBAAiB,MAAM,KAAI;EACnC,EAAE,MAAM,iBAAiB,MAAM,KAAI;EACnC,EAAE,MAAM,eAAe,MAAM,KAAI;EACjC,EAAE,MAAM,gBAAgB,MAAM,KAAI;EAClC,EAAE,MAAM,aAAa,MAAM,KAAI;EAC/B,EAAE,MAAM,eAAe,MAAM,KAAI;EACjC,EAAE,MAAM,YAAY,MAAM,KAAI;EAC9B,EAAE,MAAM,cAAc,MAAM,KAAI;EAChC,EAAE,MAAM,oBAAoB,MAAM,KAAI;EACtC,EAAE,MAAM,YAAY,MAAM,KAAI;EAC9B,EAAE,MAAM,oBAAoB,MAAM,KAAI;EACtC,EAAE,MAAM,cAAc,MAAM,KAAI;EAChC,EAAE,MAAM,aAAa,MAAM,KAAI;EAC/B,EAAE,MAAM,cAAc,MAAM,KAAI;EAChC,EAAE,MAAM,oBAAoB,MAAM,KAAI;EACtC,EAAE,MAAM,oBAAoB,MAAM,KAAI;EACtC,EAAE,MAAM,sBAAsB,MAAM,KAAI;EACxC,EAAE,MAAM,qBAAqB,MAAM,KAAI;EACvC,EAAE,MAAM,sBAAsB,MAAM,KAAI;EACxC,EAAE,MAAM,wBAAwB,MAAM,KAAI;EAC1C,EAAE,MAAM,wBAAwB,MAAM,KAAI;EAC1C,EAAE,MAAM,uBAAuB,MAAM,KAAI;EACzC,EAAE,MAAM,0BAA0B,MAAM,KAAI;EAC5C,EAAE,MAAM,mBAAmB,MAAM,KAAI;EACrC,EAAE,MAAM,oBAAoB,MAAM,KAAI;EACtC,EAAE,MAAM,iBAAiB,MAAM,KAAI;EACnC,EAAE,MAAM,oBAAoB,MAAM,KAAI;EACtC,EAAE,MAAM,qBAAqB,MAAM,KAAI;EACvC,EAAE,MAAM,kBAAkB,MAAM,KAAI;EACpC,EAAE,MAAM,mBAAmB,MAAM,KAAI;EACrC,EAAE,MAAM,qBAAqB,MAAM,KAAI;EACvC,EAAE,MAAM,gBAAgB,MAAM,KAAI;EAClC,EAAE,MAAM,wBAAwB,MAAM,KAAI;EAC1C,EAAE,MAAM,mBAAmB,MAAM,KAAI;EACrC,EAAE,MAAM,gBAAgB,MAAM,KAAI;EAClC,EAAE,MAAM,kBAAkB,MAAM,KAAI;EACpC,EAAE,MAAM,iBAAiB,MAAM,KAAI;EACnC,EAAE,MAAM,qBAAqB,MAAM,KAAI;EACvC,EAAE,MAAM,sBAAsB,MAAM,KAAI;EACxC,EAAE,MAAM,yBAAyB,MAAM,KAAI;EAC3C,EAAE,MAAM,oBAAoB,MAAM,KAAI;EACtC,EAAE,MAAM,wBAAwB,MAAM,KAAI;EAC1C,EAAE,MAAM,2BAA2B,MAAM,KAAI;EAC7C,EAAE,MAAM,2BAA2B,MAAM,KAAI;EAC7C,EAAE,MAAM,8BAA8B,MAAM,KAAI;EAChD,EAAE,MAAM,4BAA4B,MAAM,KAAI;EAC9C,EAAE,MAAM,2BAA2B,MAAM,KAAI;EAC7C,EAAE,MAAM,2BAA2B,MAAM,KAAI;EAC7C,EAAE,MAAM,oBAAoB,MAAM,KAAI;EACtC,EAAE,MAAM,mBAAmB,MAAM,KAAI;EACrC,EAAE,MAAM,iBAAiB,MAAM,KAAI;EACnC,EAAE,MAAM,cAAc,MAAM,KAAI;EAChC,EAAE,MAAM,cAAc,MAAM,KAAI;EAChC,EAAE,MAAM,cAAc,MAAM,KAAI;EAChC,EAAE,MAAM,eAAe,MAAM,KAAI;EACjC,EAAE,MAAM,aAAa,MAAM,KAAI;EAC/B,EAAE,MAAM,cAAc,MAAM,KAAI;EAChC,EAAE,MAAM,gBAAgB,MAAM,KAAI;EAClC,EAAE,MAAM,oBAAoB,MAAM,KAAI;EACtC,EAAE,MAAM,kBAAkB,MAAM,KAAI;EACpC,EAAE,MAAM,mBAAmB,MAAM,KAAI;EACrC,EAAE,MAAM,qBAAqB,MAAM,KAAI;EACvC,EAAE,MAAM,oBAAoB,MAAM,KAAI;EACtC,EAAE,MAAM,mBAAmB,MAAM,KAAI;EACrC,EAAE,MAAM,+BAA+B,MAAM,MAAK;EAClD,EAAE,MAAM,eAAe,MAAM,MAAK;EAClC,EAAE,MAAM,iBAAiB,MAAM,MAAK;;AAoCjC,IAAM,sBAA2D,OAAO,OAC3E,IAAI,IAA4B,0BAA0B,CAAC;AAsBxD,IAAM,8BAA2E,IAAI,IAG1F,2BAA2B,IAAI,CAAC,UAAU,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC;;;AChIzD,IAAM,gBAA4C,OAAO,OAAO;EACnE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAC2C;AAkBxC,IAAM,iBAAmD,oBAAI,IAAyB;EACzF,CAAC,QAAQ,MAAM;EACf,CAAC,mBAAmB,gBAAgB;EACpC,CAAC,kBAAkB,eAAe;EAClC,CAAC,iBAAiB,cAAc;EAChC,CAAC,cAAc,WAAW;EAC1B,CAAC,eAAe,YAAY;EAC5B,CAAC,aAAa,WAAW;EACzB,CAAC,qBAAqB,kBAAkB;EACxC,CAAC,YAAY,UAAU;EACvB,CAAC,YAAY,UAAU;EACvB,CAAC,UAAU,QAAQ;EACnB,CAAC,WAAW,SAAS;EACrB,CAAC,QAAQ,MAAM;EACf,CAAC,UAAU,QAAQ;EACnB,CAAC,OAAO,KAAK;EACb,CAAC,SAAS,OAAO;EACjB,CAAC,gBAAgB,aAAa;EAC9B,CAAC,OAAO,KAAK;EACb,CAAC,eAAe,aAAa;EAC7B,CAAC,SAAS,OAAO;EACjB,CAAC,QAAQ,MAAM;EACf,CAAC,SAAS,OAAO;EACjB,CAAC,gBAAgB,aAAa;EAC9B,CAAC,iBAAiB,aAAa;EAC/B,CAAC,mBAAmB,eAAe;EACnC,CAAC,iBAAiB,cAAc;EAChC,CAAC,mBAAmB,eAAe;EACnC,CAAC,oBAAoB,iBAAiB;EACtC,CAAC,oBAAoB,iBAAiB;EACtC,CAAC,mBAAmB,gBAAgB;EACpC,CAAC,uBAAuB,mBAAmB;EAC3C,CAAC,eAAe,YAAY;EAC5B,CAAC,iBAAiB,aAAa;EAC/B,CAAC,aAAa,UAAU;EACxB,CAAC,iBAAiB,aAAa;EAC/B,CAAC,kBAAkB,cAAc;EACjC,CAAC,cAAc,WAAW;EAC1B,CAAC,eAAe,YAAY;EAC5B,CAAC,kBAAkB,cAAc;EACjC,CAAC,YAAY,SAAS;EACtB,CAAC,qBAAqB,iBAAiB;EACvC,CAAC,eAAe,YAAY;EAC5B,CAAC,YAAY,SAAS;EACtB,CAAC,aAAa,WAAW;EACzB,CAAC,YAAY,UAAU;EACvB,CAAC,iBAAiB,cAAc;EAChC,CAAC,kBAAkB,eAAe;EAClC,CAAC,sBAAsB,kBAAkB;EACzC,CAAC,gBAAgB,aAAa;EAC9B,CAAC,oBAAoB,iBAAiB;EACtC,CAAC,wBAAwB,oBAAoB;EAC7C,CAAC,wBAAwB,oBAAoB;EAC7C,CAAC,2BAA2B,uBAAuB;EACnD,CAAC,yBAAyB,qBAAqB;EAC/C,CAAC,wBAAwB,oBAAoB;EAC7C,CAAC,wBAAwB,oBAAoB;EAC7C,CAAC,gBAAgB,aAAa;EAC9B,CAAC,eAAe,YAAY;EAC5B,CAAC,aAAa,UAAU;EACxB,CAAC,SAAS,OAAO;EACjB,CAAC,SAAS,OAAO;EACjB,CAAC,SAAS,OAAO;CACpB;AAgBM,IAAM,iBAAmD,IAAI,IAChE,MAAM,KAAK,gBAAgB,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC;;;ACnP3D,IAAM,cAAuD,oBAAI,IAGtE;EACE,CAAC,QAAQ,OAAO;EAChB,CAAC,mBAAmB,OAAO;EAC3B,CAAC,kBAAkB,OAAO;EAC1B,CAAC,iBAAiB,OAAO;EACzB,CAAC,cAAc,OAAO;EACtB,CAAC,eAAe,OAAO;EACvB,CAAC,aAAa,OAAO;EACrB,CAAC,qBAAqB,OAAO;EAC7B,CAAC,YAAY,OAAO;EACpB,CAAC,YAAY,WAAW;EACxB,CAAC,UAAU,OAAO;EAClB,CAAC,WAAW,OAAO;EACnB,CAAC,QAAQ,WAAW;EACpB,CAAC,UAAU,QAAQ;EACnB,CAAC,OAAO,WAAW;EACnB,CAAC,SAAS,WAAW;EACrB,CAAC,gBAAgB,WAAW;EAC5B,CAAC,OAAO,WAAW;EACnB,CAAC,eAAe,WAAW;EAC3B,CAAC,SAAS,WAAW;EACrB,CAAC,QAAQ,QAAQ;EACjB,CAAC,SAAS,QAAQ;EAClB,CAAC,gBAAgB,QAAQ;EACzB,CAAC,iBAAiB,QAAQ;EAC1B,CAAC,mBAAmB,QAAQ;EAC5B,CAAC,iBAAiB,WAAW;EAC7B,CAAC,mBAAmB,WAAW;EAC/B,CAAC,oBAAoB,WAAW;EAChC,CAAC,oBAAoB,WAAW;EAChC,CAAC,mBAAmB,OAAO;EAC3B,CAAC,uBAAuB,OAAO;EAC/B,CAAC,eAAe,OAAO;EACvB,CAAC,iBAAiB,OAAO;EACzB,CAAC,aAAa,OAAO;EACrB,CAAC,iBAAiB,OAAO;EACzB,CAAC,kBAAkB,OAAO;EAC1B,CAAC,cAAc,OAAO;EACtB,CAAC,eAAe,OAAO;EACvB,CAAC,kBAAkB,OAAO;EAC1B,CAAC,YAAY,OAAO;EACpB,CAAC,qBAAqB,OAAO;EAC7B,CAAC,eAAe,OAAO;EACvB,CAAC,YAAY,OAAO;EACpB,CAAC,aAAa,WAAW;EACzB,CAAC,YAAY,WAAW;EACxB,CAAC,iBAAiB,WAAW;EAC7B,CAAC,kBAAkB,WAAW;EAC9B,CAAC,sBAAsB,WAAW;EAClC,CAAC,gBAAgB,WAAW;EAC5B,CAAC,oBAAoB,WAAW;EAChC,CAAC,wBAAwB,WAAW;EACpC,CAAC,wBAAwB,WAAW;EACpC,CAAC,2BAA2B,WAAW;EACvC,CAAC,yBAAyB,WAAW;EACrC,CAAC,wBAAwB,WAAW;EACpC,CAAC,wBAAwB,WAAW;EACpC,CAAC,gBAAgB,OAAO;EACxB,CAAC,eAAe,OAAO;EACvB,CAAC,aAAa,OAAO;EACrB,CAAC,SAAS,OAAO;EACjB,CAAC,SAAS,OAAO;EACjB,CAAC,SAAS,OAAO;CACpB;AAiBK,SAAU,UAAU,MAAiB;AACvC,QAAM,SAAS,YAAY,IAAI,IAAI;AACnC,MAAI,WAAW,QAAW;AACtB,UAAM,IAAI,MAAM,wCAAwC,IAAI,GAAG;EACnE;AACA,SAAO;AACX;;;ACmCO,IAAM,OAAsB,eAAc;AAEjD,SAAS,iBAAc;AACnB,QAAM,UAAuC;IACzC,IAAI,SAAS,UAAQ;AACjB,YAAM,OAAO,OAAO,QAAQ;AAC5B,aAAO,eAAe,QAAQ,IAAI,EAAE;IACxC;;AAEJ,SAAO,IAAI,MAAM,CAAA,GAAqB,OAAO;AACjD;AAEA,SAAS,eAAe,WAAiB;AACrC,SAAO,MAAY;AACf,UAAM,IAAI,MAAM,GAAG,SAAS,kCAAkC;EAClE;AACJ;;;ACnKO,IAAM,qBAA8C,OAAO,OAAO;EACrE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACH;;;ACaD,IAAM,yBAA8C,oBAAI,IAAI;EACxD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACH;AAED,IAAM,oBAAyC,oBAAI,IAAI,CAAC,SAAS,UAAU,QAAQ,CAAC;AAEpF,IAAM,sBAA2C,oBAAI,IAAI;EACrD;EACA;EACA;EACA;EACA;CACH;AAED,IAAM,qBAA0C,oBAAI,IAAI;EACpD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACH;AAED,IAAM,uBAA4C,oBAAI,IAAI,CAAC,SAAS,SAAS,UAAU,CAAC;AAExF,IAAM,yBAA8C,oBAAI,IAAI,CAAC,MAAM,MAAM,CAAC;AAE1E,IAAM,wBAA6C,oBAAI,IAAI,CAAC,SAAS,SAAS,QAAQ,CAAC;AAEvF,IAAM,mBAAmB;AAEzB,IAAM,yBAA8C,oBAAI,IAAI,CAAC,QAAQ,WAAW,UAAU,CAAC;AAE3F,IAAM,mBAAwC,oBAAI,IAAI,CAAC,QAAQ,QAAQ,OAAO,CAAC;AAE/E,IAAM,uBAA4C,oBAAI,IAAI;EACtD;EACA;EACA;EACA;EACA;EACA;CACH;AAED,IAAM,8BAAmD,oBAAI,IAAI,CAAC,QAAQ,WAAW,OAAO,CAAC;AAE7F,IAAM,sBAA2C,IAAI,IAAY,aAAa;AAE9E,IAAM,oBAAyC,oBAAI,IAAI,CAAC,UAAU,UAAU,QAAQ,CAAC;AAErF,IAAM,yBAA8C,oBAAI,IAAoB;EACxE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACH;AAED,SAAS,IAAI,SAAiB,OAAuB,sBAAoB;AACrE,SAAO,EAAE,IAAI,OAAO,MAAM,QAAO;AACrC;AAEA,SAAS,cAAc,GAAU;AAC7B,MAAI,OAAO,MAAM,YAAY,MAAM;AAAM,WAAO;AAChD,QAAM,QAAQ,OAAO,eAAe,CAAC;AACrC,SAAO,UAAU,OAAO,aAAa,UAAU;AACnD;AAEA,SAAS,eAAe,GAAU;AAC9B,SAAO,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC;AACrD;AAEA,SAAS,qBAAqB,GAAU;AACpC,SAAO,OAAO,MAAM,YAAY,OAAO,UAAU,CAAC,KAAK,KAAK;AAChE;AAEA,SAAS,iBAAiB,GAAU;AAChC,SAAO,OAAO,MAAM,YAAY,EAAE,SAAS;AAC/C;AAQA,SAAS,SAAS,GAAYE,OAAY;AACtC,MAAI,MAAM;AAAM,WAAO,EAAE,IAAI,KAAI;AACjC,QAAM,IAAI,OAAO;AACjB,MAAI,MAAM,aAAa,MAAM;AAAU,WAAO,EAAE,IAAI,KAAI;AACxD,MAAI,MAAM,UAAU;AAChB,QAAI,CAAC,OAAO,SAAS,CAAW,GAAG;AAC/B,aAAO,IAAI,GAAGA,KAAI,qBAAqB;IAC3C;AACA,WAAO,EAAE,IAAI,KAAI;EACrB;AACA,MAAI,MAAM;AAAa,WAAO,IAAI,GAAGA,KAAI,kCAAkC;AAC3E,MAAI,MAAM;AAAU,WAAO,IAAI,GAAGA,KAAI,uBAAuB;AAC7D,MAAI,MAAM;AAAY,WAAO,IAAI,GAAGA,KAAI,yBAAyB;AACjE,MAAI,MAAM;AAAU,WAAO,IAAI,GAAGA,KAAI,uBAAuB;AAE7D,MAAI,MAAM,QAAQ,CAAC,GAAG;AAClB,aAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AAC/B,YAAM,IAAI,SAAS,EAAE,CAAC,GAAG,GAAGA,KAAI,IAAI,CAAC,GAAG;AACxC,UAAI,CAAC,EAAE;AAAI,eAAO;IACtB;AACA,WAAO,EAAE,IAAI,KAAI;EACrB;AACA,MAAI,CAAC,cAAc,CAAC,GAAG;AACnB,WAAO,IAAI,GAAGA,KAAI,kCAAkC;EACxD;AACA,aAAW,OAAO,OAAO,KAAK,CAAC,GAAG;AAM9B,QAAI;AACJ,QAAI;AACA,cAAQ,QAAQ,IAAI,GAAG,GAAG;IAC9B,QAAQ;AACJ,aAAO,IAAI,GAAGA,KAAI,IAAI,GAAG,iCAAiC;IAC9D;AACA,UAAM,IAAI,SAAS,OAAO,GAAGA,KAAI,IAAI,GAAG,EAAE;AAC1C,QAAI,CAAC,EAAE;AAAI,aAAO;EACtB;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,sBAAsB,OAA8B;AACzD,QAAM,YAAY,MAAM;AACxB,MAAI,CAAC,eAAe,SAAS,KAAK,aAAa,GAAG;AAC9C,WAAO,IAAI,mDAAmD;EAClE;AACA,QAAM,YAAY,MAAM;AACxB,MAAI,OAAO,cAAc,YAAY,CAAC,kBAAkB,IAAI,SAAS,GAAG;AACpE,WAAO,IAAI,qBAAqB,OAAO,SAAS,CAAC,6BAA6B;EAClF;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,kBAAkB,OAA8B;AACrD,QAAM,YAAY,sBAAsB,KAAK;AAC7C,MAAI,CAAC,UAAU;AAAI,WAAO;AAC1B,QAAM,YAAY,MAAM;AACxB,MAAI,CAAC,eAAe,SAAS,KAAK,YAAY,KAAK,YAAY,GAAG;AAC9D,WAAO,IAAI,oDAAoD;EACnE;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,6BAA6B,OAA8B;AAChE,QAAM,WAAW,MAAM;AACvB,MAAI,CAAC,eAAe,QAAQ,GAAG;AAC3B,WAAO,IAAI,yCAAyC;EACxD;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,wBAAwB,OAA8B;AAC3D,QAAM,QAAQ,MAAM;AACpB,MAAI,UAAU,QAAQ,CAAC,eAAe,KAAK,GAAG;AAC1C,WAAO,IAAI,8CAA8C;EAC7D;AACA,QAAM,QAAQ,MAAM;AACpB,MAAI,UAAU,QAAQ,CAAC,eAAe,KAAK,GAAG;AAC1C,WAAO,IAAI,8CAA8C;EAC7D;AACA,MAAI,UAAU,QAAQ,UAAU,MAAM;AAClC,WAAO,IAAI,gEAAgE;EAC/E;AACA,QAAM,QAAQ,MAAM;AACpB,MAAI,CAAC,eAAe,KAAK,KAAK,QAAQ,KAAK,QAAQ,GAAG;AAClD,WAAO,IAAI,gDAAgD;EAC/D;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,mBAAmB,OAA8B;AACtD,QAAMC,QAAO,MAAM;AACnB,MAAI,OAAOA,UAAS,YAAYA,MAAK,WAAW,GAAG;AAC/C,WAAO,IAAI,wCAAwC;EACvD;AACA,MAAIA,MAAK,SAAS,kBAAkB;AAChC,WAAO,IAAI,+BAA+B,gBAAgB,aAAa;EAC3E;AACA,QAAM,WAAW,MAAM;AACvB,MAAI,OAAO,aAAa,YAAY,CAAC,sBAAsB,IAAI,QAAQ,GAAG;AACtE,WAAO,IAAI,oBAAoB,OAAO,QAAQ,CAAC,iCAAiC;EACpF;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,oBAAoB,OAA8B;AACvD,QAAM,QAAQ,MAAM;AACpB,MAAI,OAAO,UAAU,YAAY,CAAC,oBAAoB,IAAI,KAAK,GAAG;AAC9D,WAAO,IAAI,iBAAiB,OAAO,KAAK,CAAC,+BAA+B;EAC5E;AACA,QAAM,OAAO,MAAM;AACnB,MAAI,CAAC,eAAe,IAAI,KAAK,QAAQ,GAAG;AACpC,WAAO,IAAI,8CAA8C;EAC7D;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,yBAAyB,OAA8B;AAC5D,QAAM,WAAW,MAAM;AACvB,MACI,aAAa,WACZ,OAAO,aAAa,YAAY,CAAC,qBAAqB,IAAI,QAAQ,IACrE;AACE,WAAO,IAAI,oBAAoB,OAAO,QAAQ,CAAC,gCAAgC;EACnF;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,uBAAuB,OAA8B;AAC1D,QAAM,QAAQ,MAAM;AACpB,MAAI,OAAO,UAAU,YAAY,CAAC,mBAAmB,IAAI,KAAK,GAAG;AAC7D,WAAO,IAAI,iBAAiB,OAAO,KAAK,CAAC,8BAA8B;EAC3E;AACA,QAAM,OAAO,MAAM;AACnB,MAAI,CAAC,eAAe,IAAI,KAAK,QAAQ,GAAG;AACpC,WAAO,IAAI,8CAA8C;EAC7D;AACA,SAAO,yBAAyB,KAAK;AACzC;AAEA,SAAS,uBAAuB,OAA8B;AAC1D,QAAM,OAAO,MAAM;AACnB,MAAI,OAAO,SAAS,YAAY,KAAK,WAAW,GAAG;AAC/C,WAAO,IAAI,wCAAwC;EACvD;AACA,QAAM,OAAO,MAAM;AACnB,MAAI,CAAC,eAAe,IAAI,KAAK,QAAQ,GAAG;AACpC,WAAO,IAAI,8CAA8C;EAC7D;AACA,SAAO,yBAAyB,KAAK;AACzC;AAEA,SAAS,mBAAmB,OAA8B;AACtD,QAAM,YAAY,MAAM;AACxB,MAAI,OAAO,cAAc,YAAY,CAAC,uBAAuB,IAAI,SAAS,GAAG;AACzE,WAAO,IAAI,qBAAqB,OAAO,SAAS,CAAC,kCAAkC;EACvF;AACA,QAAM,OAAO,MAAM;AACnB,MAAI,CAAC,eAAe,IAAI,KAAK,QAAQ,GAAG;AACpC,WAAO,IAAI,8CAA8C;EAC7D;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,cAAc,OAAgBD,OAAY;AAC/C,MAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAAG;AACjD,WAAO,IAAI,GAAGA,KAAI,8BAA8B;EACpD;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,4BAA4B,OAA8B;AAC/D,QAAM,OAAO,cAAc,MAAM,MAAM,YAAY;AACnD,MAAI,CAAC,KAAK;AAAI,WAAO;AACrB,QAAM,OAAO,cAAc,MAAM,MAAM,YAAY;AACnD,MAAI,CAAC,KAAK;AAAI,WAAO;AACrB,MAAI,MAAM,SAAS,QAAW;AAC1B,WAAO,cAAc,MAAM,MAAM,YAAY;EACjD;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,yBAAyB,OAAgCA,OAAY;AAC1E,SAAO,cAAc,MAAM,OAAOA,KAAI;AAC1C;AAEA,SAAS,qBAAqB,OAA8B;AACxD,QAAME,SAAQ,yBAAyB,OAAO,aAAa;AAC3D,MAAI,CAACA,OAAM;AAAI,WAAOA;AACtB,QAAM,SAAS,MAAM;AACrB,MAAI,WAAW,WAAc,CAAC,eAAe,MAAM,KAAK,SAAS,KAAK,SAAS,MAAM;AACjF,WAAO,IAAI,mDAAmD;EAClE;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,iCAAiC,OAA8B;AACpE,QAAM,UAAU,MAAM;AACtB,MAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AACzB,WAAO,IAAI,iCAAiC;EAChD;AACA,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,UAAM,SAAS,QAAQ,CAAC;AACxB,QAAI,CAAC,cAAc,MAAM,GAAG;AACxB,aAAO,IAAI,iBAAiB,CAAC,sBAAsB;IACvD;AACA,QAAI,CAAC,eAAe,OAAO,KAAK,GAAG;AAC/B,aAAO,IAAI,iBAAiB,CAAC,kCAAkC;IACnE;AACA,QAAI,CAAC,eAAe,OAAO,MAAM,KAAK,OAAO,SAAS,GAAG;AACrD,aAAO,IAAI,iBAAiB,CAAC,gDAAgD;IACjF;AACA,QAAI,OAAO,UAAU,QAAW;AAC5B,YAAMA,SAAQ,cAAc,OAAO,OAAO,iBAAiB,CAAC,SAAS;AACrE,UAAI,CAACA,OAAM;AAAI,eAAOA;IAC1B;EACJ;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,kBAAkB,OAAc;AACrC,MAAI,CAAC,cAAc,KAAK;AAAG,WAAO,IAAI,sBAAsB;AAC5D,QAAM,OAAO,MAAM;AACnB,MAAI,OAAO,SAAS,YAAY,CAAC,uBAAuB,IAAI,IAAI,GAAG;AAC/D,WAAO,IAAI,gBAAgB,OAAO,IAAI,CAAC,4BAA4B;EACvE;AACA,UAAQ,MAAM;IACV,KAAK;IACL,KAAK;IACL,KAAK;AACD,aAAO,sBAAsB,KAAK;IACtC,KAAK;IACL,KAAK;AACD,aAAO,6BAA6B,KAAK;IAC7C,KAAK;AACD,aAAO,kBAAkB,KAAK;IAClC,KAAK;AACD,aAAO,wBAAwB,KAAK;IACxC,KAAK;AACD,aAAO,mBAAmB,KAAK;IACnC,KAAK;AACD,aAAO,oBAAoB,KAAK;IACpC,KAAK;AACD,aAAO,uBAAuB,KAAK;IACvC,KAAK;AACD,aAAO,uBAAuB,KAAK;IACvC,KAAK;AACD,aAAO,mBAAmB,KAAK;IACnC,KAAK;AACD,aAAO,4BAA4B,KAAK;IAC5C,KAAK;IACL,KAAK;AACD,aAAO,yBAAyB,OAAO,aAAa;IACxD,KAAK;AACD,aAAO,qBAAqB,KAAK;IACrC,KAAK;AACD,aAAO,iCAAiC,KAAK;;IAEjD;AACI,aAAO,IAAI,gBAAgB,IAAI,oBAAoB;EAC3D;AACJ;AAEA,SAAS,qBAAqB,GAA0B;AACpD,MAAI,CAAC,iBAAiB,EAAE,MAAM;AAAG,WAAO,IAAI,yCAAyC;AACrF,MAAI,OAAO,EAAE,UAAU;AAAU,WAAO,IAAI,8BAA8B;AAC1E,QAAM,cAAc,kBAAkB,EAAE,KAAK;AAC7C,MAAI,CAAC,YAAY;AAAI,WAAO;AAC5B,MAAI,CAAC,qBAAqB,EAAE,GAAG,GAAG;AAC9B,WAAO,IAAI,0CAA0C;EACzD;AACA,MAAI,CAAC,eAAe,EAAE,IAAI;AAAG,WAAO,IAAI,oCAAoC;AAC5E,QAAM,QAAQ,EAAE;AAChB,MAAI,UAAU,QAAQ,CAAC,eAAe,KAAK,GAAG;AAC1C,WAAO,IAAI,6CAA6C;EAC5D;AACA,QAAMA,SAAQ,EAAE;AAChB,MAAIA,WAAU,QAAQ,OAAOA,WAAU,UAAU;AAC7C,WAAO,IAAI,sCAAsC;EACrD;AACA,MAAI,CAAC,cAAc,EAAE,IAAI;AAAG,WAAO,IAAI,mCAAmC;AAC1E,QAAM,aAAa,SAAS,EAAE,MAAM,WAAW;AAC/C,MAAI,CAAC,WAAW;AAAI,WAAO;AAC3B,MAAI,OAAO,EAAE,SAAS;AAAU,WAAO,IAAI,6BAA6B;AACxE,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,sBAAsB,GAA0B;AACrD,MAAI,CAAC,iBAAiB,EAAE,MAAM;AAAG,WAAO,IAAI,0CAA0C;AACtF,QAAM,WAAW,EAAE;AACnB,MAAI,OAAO,aAAa,YAAY,CAAC,uBAAuB,IAAI,QAAQ,GAAG;AACvE,WAAO,IAAI,oBAAoB,OAAO,QAAQ,CAAC,2BAA2B;EAC9E;AACA,MAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG;AAC9B,WAAO,IAAI,2CAA2C;EAC1D;AACA,MAAI,CAAC,qBAAqB,EAAE,GAAG,GAAG;AAC9B,WAAO,IAAI,2CAA2C;EAC1D;AACA,MAAI,CAAC,eAAe,EAAE,IAAI;AAAG,WAAO,IAAI,qCAAqC;AAC7E,MAAI,CAAC,cAAc,EAAE,IAAI;AAAG,WAAO,IAAI,oCAAoC;AAC3E,QAAM,aAAa,SAAS,EAAE,MAAM,YAAY;AAChD,MAAI,CAAC,WAAW;AAAI,WAAO;AAC3B,QAAM,WAAW,EAAE;AACnB,MAAI,CAAC,MAAM,QAAQ,QAAQ;AAAG,WAAO,IAAI,kCAAkC;AAC3E,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACtC,UAAM,IAAI,SAAS,CAAC;AACpB,QAAI,OAAO,MAAM,YAAY,CAAC,qBAAqB,IAAI,CAAC,GAAG;AACvD,aAAO,IAAI,kBAAkB,CAAC,OAAO,OAAO,CAAC,CAAC,gCAAgC;IAClF;EACJ;AACA,MAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG;AAChC,WAAO,IAAI,6CAA6C;EAC5D;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,+BAA+B,GAA0B;AAC9D,MAAI,CAAC,iBAAiB,EAAE,WAAW,GAAG;AAClC,WAAO,IAAI,yDAAyD;EACxE;AACA,MAAI,OAAO,EAAE,UAAU,UAAU;AAC7B,WAAO,IAAI,yCAAyC;EACxD;AACA,MAAI,OAAO,EAAE,gBAAgB,UAAU;AACnC,WAAO,IAAI,+CAA+C;EAC9D;AACA,MAAI,OAAO,EAAE,mBAAmB,UAAU;AACtC,WAAO,IAAI,kDAAkD;EACjE;AACA,MAAI,OAAO,EAAE,UAAU,WAAW;AAC9B,WAAO,IAAI,0CAA0C;EACzD;AACA,MAAI,CAAC,qBAAqB,EAAE,GAAG,GAAG;AAC9B,WAAO,IAAI,qDAAqD;EACpE;AACA,MAAI,CAAC,eAAe,EAAE,IAAI,GAAG;AACzB,WAAO,IAAI,+CAA+C;EAC9D;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,oBAAoB,GAA0B;AACnD,QAAM,QAAQ,EAAE;AAChB,MAAI,OAAO,UAAU,YAAY,CAAC,iBAAiB,IAAI,KAAK,GAAG;AAC3D,WAAO,IAAI,eAAe,OAAO,KAAK,CAAC,4BAA4B;EACvE;AACA,MAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG;AAC9B,WAAO,IAAI,yCAAyC;EACxD;AACA,QAAM,OAAO,EAAE;AACf,MAAI,SAAS,QAAW;AACpB,QAAI,CAAC,cAAc,IAAI;AAAG,aAAO,IAAI,kCAAkC;AACvE,UAAM,aAAa,SAAS,MAAM,UAAU;AAC5C,QAAI,CAAC,WAAW;AAAI,aAAO;EAC/B;AACA,MAAI,CAAC,qBAAqB,EAAE,GAAG,GAAG;AAC9B,WAAO,IAAI,yCAAyC;EACxD;AACA,MAAI,CAAC,eAAe,EAAE,IAAI,GAAG;AACzB,WAAO,IAAI,mCAAmC;EAClD;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,aAAa,GAAU;AAC5B,MAAI,CAAC,cAAc,CAAC;AAAG,WAAO;AAC9B,SAAO,eAAe,EAAE,IAAI,KAAK,eAAe,EAAE,KAAK;AAC3D;AAEA,SAAS,oBAAoB,GAAYF,OAAc,OAAa;AAChE,MAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,OAAO;AACzC,WAAO,IAAI,GAAGA,KAAI,eAAe,KAAK,2BAA2B;EACrE;AACA,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC5B,QAAI,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG;AACrB,aAAO,IAAI,GAAGA,KAAI,IAAI,CAAC,gDAAgD;IAC3E;EACJ;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,mBAAmB,GAAYA,OAAY;AAChD,SAAO,oBAAoB,GAAGA,OAAM,CAAC;AACzC;AAEA,SAAS,qBAAqB,GAAYA,OAAY;AAClD,SAAO,oBAAoB,GAAGA,OAAM,CAAC;AACzC;AAEA,SAAS,mBAAmB,GAAYA,OAAY;AAChD,SAAO,oBAAoB,GAAGA,OAAM,CAAC;AACzC;AAEA,SAAS,oBAAoB,GAAYA,OAAY;AACjD,SAAO,oBAAoB,GAAGA,OAAM,CAAC;AACzC;AAEA,SAAS,mBAAmB,GAAYA,OAAY;AAChD,SAAO,oBAAoB,GAAGA,OAAM,CAAC;AACzC;AAEA,SAAS,uBAAuB,GAAYA,OAAc,eAAqB;AAC3E,MAAI,MAAM;AAAW,WAAO,EAAE,IAAI,KAAI;AACtC,MAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,eAAe;AACjD,WAAO,IAAI,GAAGA,KAAI,yBAAyB,aAAa,UAAU;EACtE;AACA,WAAS,IAAI,GAAG,IAAI,eAAe,KAAK;AACpC,QAAI,OAAO,EAAE,CAAC,MAAM,UAAU;AAC1B,aAAO,IAAI,GAAGA,KAAI,IAAI,CAAC,qBAAqB;IAChD;EACJ;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,uBACL,GACAA,OACA,KACA,KAAW;AAEX,MAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,SAAS,KAAK;AACvD,WAAO,IAAI,GAAGA,KAAI,yBAAyB,GAAG,KAAK,GAAG,cAAc;EACxE;AACA,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AAC/B,QAAI,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG;AACrB,aAAO,IAAI,GAAGA,KAAI,IAAI,CAAC,gDAAgD;IAC3E;EACJ;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,sBAAsB,GAAYA,OAAY;AACnD,MAAI,CAAC,cAAc,CAAC;AAAG,WAAO,IAAI,GAAGA,KAAI,0BAA0B;AACnE,MAAI,EAAE,UAAU,UAAa,OAAO,EAAE,UAAU,UAAU;AACtD,WAAO,IAAI,GAAGA,KAAI,0BAA0B;EAChD;AACA,MAAI,EAAE,cAAc,WAAc,CAAC,eAAe,EAAE,SAAS,KAAK,EAAE,aAAa,IAAI;AACjF,WAAO,IAAI,GAAGA,KAAI,8CAA8C;EACpE;AACA,MAAI,EAAE,cAAc,UAAa,CAAC,kBAAkB,IAAI,OAAO,EAAE,SAAS,CAAC,GAAG;AAC1E,WAAO,IAAI,GAAGA,KAAI,gBAAgB,OAAO,EAAE,SAAS,CAAC,6BAA6B;EACtF;AACA,MAAI,EAAE,eAAe,UAAa,OAAO,EAAE,eAAe,WAAW;AACjE,WAAO,IAAI,GAAGA,KAAI,gCAAgC;EACtD;AACA,MAAI,EAAE,gBAAgB,UAAa,OAAO,EAAE,gBAAgB,WAAW;AACnE,WAAO,IAAI,GAAGA,KAAI,iCAAiC;EACvD;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,mBAAmB,GAAYA,OAAY;AAChD,MAAI,CAAC,cAAc,CAAC;AAAG,WAAO,IAAI,GAAGA,KAAI,0BAA0B;AACnE,MAAI,EAAE,WAAW,UAAa,OAAO,EAAE,WAAW,UAAU;AACxD,WAAO,IAAI,GAAGA,KAAI,2BAA2B;EACjD;AACA,MAAI,EAAE,SAAS,UAAa,OAAO,EAAE,SAAS,UAAU;AACpD,WAAO,IAAI,GAAGA,KAAI,yBAAyB;EAC/C;AACA,MAAI,EAAE,cAAc,WAAc,CAAC,eAAe,EAAE,SAAS,KAAK,EAAE,aAAa,IAAI;AACjF,WAAO,IAAI,GAAGA,KAAI,8CAA8C;EACpE;AACA,MAAI,EAAE,cAAc,UAAa,CAAC,kBAAkB,IAAI,OAAO,EAAE,SAAS,CAAC,GAAG;AAC1E,WAAO,IAAI,GAAGA,KAAI,gBAAgB,OAAO,EAAE,SAAS,CAAC,6BAA6B;EACtF;AACA,MACI,EAAE,cAAc,WACf,CAAC,eAAe,EAAE,SAAS,KAAK,EAAE,YAAY,KAAK,EAAE,YAAY,IACpE;AACE,WAAO,IAAI,GAAGA,KAAI,+CAA+C;EACrE;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,oBAAoBG,QAA8B;AACvD,MAAIA,OAAM,SAAS,UAAa,OAAOA,OAAM,SAAS,UAAU;AAC5D,WAAO,IAAI,sCAAsC;EACrD;AACA,MAAIA,OAAM,YAAY,UAAa,OAAOA,OAAM,YAAY,WAAW;AACnE,WAAO,IAAI,0CAA0C;EACzD;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,kBAAkBA,QAA8B;AACrD,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,4BAA4BA,QAA8B;AAC/D,MAAI,CAAC,eAAeA,OAAM,KAAK;AAAG,WAAO,IAAI,8CAA8C;AAC3F,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,2BAA2BA,QAA8B;AAC9D,MAAI,CAAC,aAAaA,OAAM,MAAM;AAAG,WAAO,IAAI,wCAAwC;AACpF,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,0BAA0BA,QAA8B;AAC7D,MAAI,CAAC,eAAeA,OAAM,IAAI;AAAG,WAAO,IAAI,6CAA6C;AACzF,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,uBAAuBA,QAA8B;AAC1D,MAAI,CAAC,aAAaA,OAAM,MAAM;AAAG,WAAO,IAAI,wCAAwC;AACpF,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,wBAAwBA,QAA8B;AAC3D,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,uBAAuBA,QAA8B;AAC1D,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,mBAAmBA,OAAM,OAAO,qBAAqB;AAChE;AAEA,SAAS,8BAA8BA,QAA8B;AACjE,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,mBAAmBA,OAAM,OAAO,qBAAqB;AAChE;AAEA,SAAS,sBAAsBA,QAA8B;AACzD,QAAM,eAAe,qBAAqBA,OAAM,SAAS,uBAAuB;AAChF,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,mBAAmBA,OAAM,OAAO,qBAAqB;AAChE;AAEA,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAE7B,SAAS,sBAAsBA,QAA8B;AACzD,QAAM,eAAe,uBACjBA,OAAM,SACN,yBACA,sBACA,oBAAoB;AAExB,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,oBAAoBA,QAA8B;AACvD,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,mBAAmBA,OAAM,OAAO,qBAAqB;AAChE;AAEA,SAAS,qBAAqBA,QAA8B;AACxD,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,mBAAmBA,OAAM,OAAO,qBAAqB;AAChE;AAEA,SAAS,iBAAiB,GAAYH,OAAY;AAC9C,QAAM,YAAY,sBAAsB,GAAGA,KAAI;AAC/C,MAAI,CAAC,UAAU;AAAI,WAAO;AAE1B,QAAM,MAAM;AACZ,MAAI,IAAI,WAAW,UAAa,OAAO,IAAI,WAAW,WAAW;AAC7D,WAAO,IAAI,GAAGA,KAAI,4BAA4B;EAClD;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AAEzB,SAAS,kBAAkBG,QAA8B;AACrD,QAAM,eAAe,uBACjBA,OAAM,SACN,yBACA,kBACA,gBAAgB;AAEpB,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,iBAAiBA,OAAM,OAAO,qBAAqB;AAC9D;AAEA,IAAM,mBAAwC,oBAAI,IAAI,CAAC,QAAQ,SAAS,UAAU,SAAS,MAAM,CAAC;AAElG,IAAM,oBAAyC,oBAAI,IAAI,CAAC,QAAQ,UAAU,OAAO,CAAC;AAElF,IAAM,oBAAyC,oBAAI,IAAI,CAAC,OAAO,UAAU,QAAQ,CAAC;AAElF,IAAM,wBAA6C,oBAAI,IAAI;EACvD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACH;AAED,SAAS,iBAAiB,GAAYH,OAAY;AAC9C,MAAI,CAAC,cAAc,CAAC;AAAG,WAAO,IAAI,GAAGA,KAAI,0BAA0B;AACnE,MAAI,EAAE,UAAU,UAAa,OAAO,EAAE,UAAU,UAAU;AACtD,WAAO,IAAI,GAAGA,KAAI,0BAA0B;EAChD;AACA,MAAI,EAAE,SAAS,UAAa,CAAC,iBAAiB,IAAI,OAAO,EAAE,IAAI,CAAC,GAAG;AAC/D,WAAO,IAAI,GAAGA,KAAI,WAAW,OAAO,EAAE,IAAI,CAAC,4BAA4B;EAC3E;AACA,MAAI,EAAE,WAAW,UAAa,CAAC,kBAAkB,IAAI,OAAO,EAAE,MAAM,CAAC,GAAG;AACpE,WAAO,IAAI,GAAGA,KAAI,aAAa,OAAO,EAAE,MAAM,CAAC,yBAAyB;EAC5E;AACA,MAAI,EAAE,WAAW,UAAa,CAAC,kBAAkB,IAAI,OAAO,EAAE,MAAM,CAAC,GAAG;AACpE,WAAO,IAAI,GAAGA,KAAI,aAAa,OAAO,EAAE,MAAM,CAAC,yBAAyB;EAC5E;AACA,MAAI,EAAE,YAAY,UAAa,OAAO,EAAE,YAAY,UAAU;AAC1D,WAAO,IAAI,GAAGA,KAAI,4BAA4B;EAClD;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,oBAAoBG,QAA8B;AACvD,MAAI,CAAC,aAAaA,OAAM,MAAM;AAAG,WAAO,IAAI,wCAAwC;AACpF,MAAIA,OAAM,SAAS,UAAa,OAAOA,OAAM,SAAS,UAAU;AAC5D,WAAO,IAAI,sCAAsC;EACrD;AACA,MAAIA,OAAM,UAAU,UAAa,CAAC,eAAeA,OAAM,KAAK,GAAG;AAC3D,WAAO,IAAI,8CAA8C;EAC7D;AACA,SAAO,iBAAiBA,OAAM,OAAO,qBAAqB;AAC9D;AAEA,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAE7B,SAAS,yBAAyB,GAAYH,OAAY;AACtD,MAAI,CAAC,cAAc,CAAC;AAAG,WAAO,IAAI,GAAGA,KAAI,0BAA0B;AACnE,MAAI,OAAO,EAAE,UAAU;AAAU,WAAO,IAAI,GAAGA,KAAI,0BAA0B;AAC7E,MAAI,CAAC,eAAe,EAAE,KAAK,KAAK,EAAE,QAAQ,KAAK,EAAE,QAAQ,GAAG;AACxD,WAAO,IAAI,GAAGA,KAAI,2CAA2C;EACjE;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,mBAAmB,GAAYA,OAAY;AAChD,MAAI,CAAC,cAAc,CAAC;AAAG,WAAO,IAAI,GAAGA,KAAI,0BAA0B;AACnE,MAAI,OAAO,EAAE,WAAW;AAAU,WAAO,IAAI,GAAGA,KAAI,2BAA2B;AAC/E,MAAI,OAAO,EAAE,SAAS;AAAU,WAAO,IAAI,GAAGA,KAAI,yBAAyB;AAC3E,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,iBAAiBG,QAA8B;AACpD,QAAM,eAAe,qBAAqBA,OAAM,SAAS,uBAAuB;AAChF,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,mBAAmBA,QAA8B;AACtD,QAAM,eAAe,qBAAqBA,OAAM,SAAS,uBAAuB;AAChF,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,yBAAyBA,QAA8B;AAC5D,QAAM,eAAe,oBAAoBA,OAAM,SAAS,uBAAuB;AAC/E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,iBAAiBA,QAA8B;AACpD,QAAM,eAAe,uBACjBA,OAAM,SACN,yBACA,sBACA,oBAAoB;AAExB,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,yBAAyBA,QAA8B;AAC5D,QAAM,eAAe,uBACjBA,OAAM,SACN,yBACA,sBACA,oBAAoB;AAExB,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,yBAAyBA,OAAM,OAAO,qBAAqB;AACtE;AAEA,SAAS,mBAAmBA,QAA8B;AACtD,QAAM,eAAe,uBACjBA,OAAM,SACN,yBACA,sBACA,oBAAoB;AAExB,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,mBAAmBA,OAAM,OAAO,qBAAqB;AAChE;AAEA,IAAM,uBAAuB;AAE7B,SAAS,kBAAkB,GAAYH,OAAY;AAC/C,QAAM,YAAY,sBAAsB,GAAGA,KAAI;AAC/C,MAAI,CAAC,UAAU;AAAI,WAAO;AAE1B,QAAM,MAAM;AACZ,MAAI,IAAI,UAAU,UAAa,OAAO,IAAI,UAAU,UAAU;AAC1D,WAAO,IAAI,GAAGA,KAAI,0BAA0B;EAChD;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,wBAAwB,GAAYA,OAAY;AACrD,MAAI,CAAC,cAAc,CAAC;AAAG,WAAO,IAAI,GAAGA,KAAI,0BAA0B;AACnE,MAAI,EAAE,UAAU,UAAa,OAAO,EAAE,UAAU,UAAU;AACtD,WAAO,IAAI,GAAGA,KAAI,0BAA0B;EAChD;AACA,MAAI,EAAE,SAAS,UAAa,OAAO,EAAE,SAAS,UAAU;AACpD,WAAO,IAAI,GAAGA,KAAI,yBAAyB;EAC/C;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,kBAAkBG,QAA8B;AACrD,MAAI,CAAC,aAAaA,OAAM,MAAM;AAAG,WAAO,IAAI,wCAAwC;AAMpF,QAAM,gBAAgB,SAASA,OAAM,MAAM,oBAAoB;AAC/D,MAAI,CAAC,cAAc;AAAI,WAAO;AAC9B,MAAI,OAAOA,OAAM,SAAS,UAAU;AAChC,WAAO,IAAI,sCAAsC;EACrD;AACA,MAAIA,OAAM,KAAK,WAAW,GAAG;AACzB,WAAO,IAAI,gDAAgD;EAC/D;AACA,MAAIA,OAAM,KAAK,SAAS,sBAAsB;AAC1C,WAAO,IAAI,uCAAuC,oBAAoB,aAAa;EACvF;AACA,SAAO,iBAAiBA,OAAM,OAAO,qBAAqB;AAC9D;AAEA,SAAS,mBAAmBA,QAA8B;AACtD,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,kBAAkBA,OAAM,OAAO,qBAAqB;AAC/D;AAEA,SAAS,yBAAyBA,QAA8B;AAC5D,MAAI,CAAC,aAAaA,OAAM,MAAM;AAAG,WAAO,IAAI,wCAAwC;AACpF,SAAO,wBAAwBA,OAAM,OAAO,qBAAqB;AACrE;AAEA,SAAS,yBAAyBA,QAA8B;AAC5D,MAAI,CAAC,aAAaA,OAAM,MAAM;AAAG,WAAO,IAAI,wCAAwC;AACpF,SAAO,wBAAwBA,OAAM,OAAO,qBAAqB;AACrE;AAEA,SAAS,2BAA2BA,QAA8B;AAC9D,MAAI,CAAC,aAAaA,OAAM,MAAM;AAAG,WAAO,IAAI,wCAAwC;AACpF,SAAO,wBAAwBA,OAAM,OAAO,qBAAqB;AACrE;AAEA,IAAM,2BAAgD,oBAAI,IAAI;EAC1D;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACH;AAED,SAAS,4BAA4B,GAAYH,OAAY;AACzD,MAAI,CAAC,cAAc,CAAC;AAAG,WAAO,IAAI,GAAGA,KAAI,0BAA0B;AACnE,MAAI,EAAE,WAAW,UAAa,CAAC,yBAAyB,IAAI,OAAO,EAAE,MAAM,CAAC,GAAG;AAC3E,WAAO,IAAI,GAAGA,KAAI,aAAa,OAAO,EAAE,MAAM,CAAC,yBAAyB;EAC5E;AACA,MAAI,EAAE,oBAAoB,QAAW;AACjC,QAAI,CAAC,eAAe,EAAE,eAAe,KAAK,EAAE,kBAAkB,GAAG;AAC7D,aAAO,IAAI,GAAGA,KAAI,wDAAwD;IAC9E;EACJ;AACA,MAAI,EAAE,kBAAkB,UAAa,OAAO,EAAE,kBAAkB,WAAW;AACvE,WAAO,IAAI,GAAGA,KAAI,mCAAmC;EACzD;AACA,MAAI,EAAE,kBAAkB,UAAa,OAAO,EAAE,kBAAkB,WAAW;AACvE,WAAO,IAAI,GAAGA,KAAI,mCAAmC;EACzD;AACA,MAAI,EAAE,UAAU,UAAa,OAAO,EAAE,UAAU,UAAU;AACtD,WAAO,IAAI,GAAGA,KAAI,0BAA0B;EAChD;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,0BAA0BG,QAA8B;AAC7D,QAAM,eAAe,qBAAqBA,OAAM,SAAS,uBAAuB;AAChF,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,2BAA2BA,QAA8B;AAC9D,QAAM,eAAe,qBAAqBA,OAAM,SAAS,uBAAuB;AAChF,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,6BAA6BA,QAA8B;AAChE,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,6BAA6BA,QAA8B;AAChE,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,QAAM,UAAUA,OAAM;AACtB,MAAI,EAAE,QAAQ,CAAC,EAAE,OAAO,QAAQ,CAAC,EAAE,OAAO;AACtC,WAAO,IAAI,kEAAkE;EACjF;AACA,SAAO,4BAA4BA,OAAM,OAAO,qBAAqB;AACzE;AAEA,SAAS,gBAAgB,GAAYH,OAAY;AAC7C,MAAI,CAAC,cAAc,CAAC;AAAG,WAAO,IAAI,GAAGA,KAAI,0BAA0B;AACnE,MAAI,EAAE,WAAW,QAAW;AACxB,QAAI,CAAC,MAAM,QAAQ,EAAE,MAAM,GAAG;AAC1B,aAAO,IAAI,GAAGA,KAAI,6CAA6C;IACnE;AACA,QAAI,EAAE,OAAO,WAAW,GAAG;AACvB,aAAO,IAAI,GAAGA,KAAI,0CAA0C;IAChE;AACA,aAAS,IAAI,GAAG,IAAI,EAAE,OAAO,QAAQ,KAAK;AACtC,UAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,GAAG;AAC9B,eAAO,IAAI,GAAGA,KAAI,WAAW,CAAC,4BAA4B;MAC9D;IACJ;EACJ;AACA,MAAI,EAAE,eAAe,UAAa,OAAO,EAAE,eAAe,WAAW;AACjE,WAAO,IAAI,GAAGA,KAAI,gCAAgC;EACtD;AACA,MAAI,EAAE,UAAU,UAAa,OAAO,EAAE,UAAU,UAAU;AACtD,WAAO,IAAI,GAAGA,KAAI,0BAA0B;EAChD;AACA,MAAI,EAAE,eAAe,UAAa,OAAO,EAAE,eAAe,WAAW;AACjE,WAAO,IAAI,GAAGA,KAAI,gCAAgC;EACtD;AACA,MAAI,EAAE,gBAAgB,UAAa,OAAO,EAAE,gBAAgB,WAAW;AACnE,WAAO,IAAI,GAAGA,KAAI,iCAAiC;EACvD;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,4BAA4BG,QAA8B;AAC/D,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,gBAAgBA,OAAM,OAAO,qBAAqB;AAC7D;AAEA,SAAS,+BAA+BA,QAA8B;AAClE,QAAM,eAAe,qBAAqBA,OAAM,SAAS,uBAAuB;AAChF,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,gBAAgBA,OAAM,OAAO,qBAAqB;AAC7D;AAEA,SAAS,wBAAwBA,QAA8B;AAC3D,QAAM,eAAe,qBAAqBA,OAAM,SAAS,uBAAuB;AAChF,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,gBAAgBA,OAAM,OAAO,qBAAqB;AAC7D;AAEA,SAAS,yBAAyBA,QAA8B;AAC5D,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,gBAAgBA,OAAM,OAAO,qBAAqB;AAC7D;AAEA,SAAS,sBAAsBA,QAA8B;AACzD,QAAM,eAAe,qBAAqBA,OAAM,SAAS,uBAAuB;AAChF,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,gBAAgBA,OAAM,OAAO,qBAAqB;AAC7D;AAEA,SAAS,yBAAyBA,QAA8B;AAC5D,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,gBAAgBA,OAAM,OAAO,qBAAqB;AAC7D;AAEA,SAAS,0BAA0BA,QAA8B;AAC7D,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,gBAAgBA,OAAM,OAAO,qBAAqB;AAC7D;AAEA,SAAS,uBAAuBA,QAA8B;AAC1D,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,gBAAgBA,OAAM,OAAO,qBAAqB;AAC7D;AAEA,SAAS,wBAAwBA,QAA8B;AAC3D,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,gBAAgBA,OAAM,OAAO,qBAAqB;AAC7D;AAEA,SAAS,0BAA0BA,QAA8B;AAC7D,QAAM,eAAe,qBAAqBA,OAAM,SAAS,uBAAuB;AAChF,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,gBAAgBA,OAAM,OAAO,qBAAqB;AAC7D;AAEA,SAAS,qBAAqBA,QAA8B;AACxD,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,6BAA6BA,QAA8B;AAChE,MAAI,CAAC,aAAaA,OAAM,MAAM;AAAG,WAAO,IAAI,wCAAwC;AACpF,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,wBAAwBA,QAA8B;AAC3D,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,qBAAqBA,QAA8B;AACxD,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,IAAM,qBAA0C,oBAAI,IAAI;EACpD;EACA;EACA;EACA;CACH;AAED,SAAS,uBAAuBA,QAA8B;AAC1D,QAAM,eAAe,qBAAqBA,OAAM,SAAS,uBAAuB;AAChF,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,MAAI,OAAOA,OAAM,YAAY,YAAY,CAAC,mBAAmB,IAAIA,OAAM,OAAO,GAAG;AAC7E,WAAO,IACH,2BAA2B,OAAOA,OAAM,OAAO,CAAC,+DAA+D;EAEvH;AACA,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,sBAAsBA,QAA8B;AACzD,QAAM,eAAe,qBAAqBA,OAAM,SAAS,uBAAuB;AAChF,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,0BAA0BA,QAA8B;AAC7D,QAAM,eAAe,oBAAoBA,OAAM,SAAS,uBAAuB;AAC/E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,2BAA2BA,QAA8B;AAC9D,QAAM,eAAe,oBAAoBA,OAAM,SAAS,uBAAuB;AAC/E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,8BAA8BA,QAA8B;AACjE,QAAM,eAAe,oBAAoBA,OAAM,SAAS,uBAAuB;AAC/E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,yBAAyBA,QAA8B;AAC5D,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,6BAA6BA,QAA8B;AAChE,QAAM,eAAe,qBAAqBA,OAAM,SAAS,uBAAuB;AAChF,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,gCAAgCA,QAA8B;AACnE,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,gCAAgCA,QAA8B;AACnE,QAAM,eAAe,oBAAoBA,OAAM,SAAS,uBAAuB;AAC/E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,QAAM,cAAc,uBAAuBA,OAAM,QAAQ,wBAAwB,CAAC;AAClF,MAAI,CAAC,YAAY;AAAI,WAAO;AAC5B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,mCAAmCA,QAA8B;AACtE,QAAM,eAAe,qBAAqBA,OAAM,SAAS,uBAAuB;AAChF,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,QAAM,cAAc,uBAAuBA,OAAM,QAAQ,wBAAwB,CAAC;AAClF,MAAI,CAAC,YAAY;AAAI,WAAO;AAC5B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,iCAAiCA,QAA8B;AACpE,QAAM,eAAe,oBAAoBA,OAAM,SAAS,uBAAuB;AAC/E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,QAAM,cAAc,uBAAuBA,OAAM,QAAQ,wBAAwB,CAAC;AAClF,MAAI,CAAC,YAAY;AAAI,WAAO;AAC5B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,gCAAgCA,QAA8B;AACnE,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,QAAM,cAAc,uBAAuBA,OAAM,QAAQ,wBAAwB,CAAC;AAClF,MAAI,CAAC,YAAY;AAAI,WAAO;AAC5B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,gCAAgCA,QAA8B;AACnE,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,QAAM,cAAc,uBAAuBA,OAAM,QAAQ,wBAAwB,CAAC;AAClF,MAAI,CAAC,YAAY;AAAI,WAAO;AAC5B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,yBAAyBA,QAA8B;AAC5D,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,wBAAwBA,QAA8B;AAC3D,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,SAAS,sBAAsBA,QAA8B;AACzD,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,SAAO,sBAAsBA,OAAM,OAAO,qBAAqB;AACnE;AAEA,IAAM,uBAAuB;AAE7B,SAAS,uBAAuB,GAAYH,OAAY;AACpD,MAAI,CAAC,MAAM,QAAQ,CAAC,GAAG;AACnB,WAAO,IAAI,GAAGA,KAAI,yCAAyC;EAC/D;AACA,MAAI,EAAE,SAAS,sBAAsB;AACjC,WAAO,IAAI,GAAGA,KAAI,qBAAqB,oBAAoB,UAAU;EACzE;AACA,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AAC/B,QAAI,OAAO,EAAE,CAAC,MAAM,UAAU;AAC1B,aAAO,IAAI,GAAGA,KAAI,IAAI,CAAC,qBAAqB;IAChD;EACJ;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,kBAAkB,GAAYA,OAAY;AAC/C,MAAI,CAAC,cAAc,CAAC;AAAG,WAAO,IAAI,GAAGA,KAAI,0BAA0B;AACnE,MAAI,EAAE,UAAU,UAAa,OAAO,EAAE,UAAU,UAAU;AACtD,WAAO,IAAI,GAAGA,KAAI,0BAA0B;EAChD;AACA,MAAI,EAAE,YAAY,UAAa,OAAO,EAAE,YAAY,UAAU;AAC1D,WAAO,IAAI,GAAGA,KAAI,4BAA4B;EAClD;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,mBAAmBG,QAA8B;AACtD,SAAO,uBAAuBA,OAAM,gBAAgB,8BAA8B;AACtF;AAEA,SAAS,mBAAmBA,QAA8B;AACtD,QAAM,eAAe,mBAAmBA,OAAM,SAAS,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAAI,WAAO;AAC7B,QAAM,aAAa,uBAAuBA,OAAM,gBAAgB,8BAA8B;AAC9F,MAAI,CAAC,WAAW;AAAI,WAAO;AAC3B,SAAO,kBAAkBA,OAAM,OAAO,qBAAqB;AAC/D;AAEA,SAAS,kBAAkB,MAAeH,OAAY;AAClD,MAAI,CAAC,cAAc,IAAI;AAAG,WAAO,IAAI,GAAGA,KAAI,0BAA0B;AACtE,MAAI,OAAO,KAAK,SAAS;AAAU,WAAO,IAAI,GAAGA,KAAI,yBAAyB;AAC9E,MAAI,KAAK,YAAY,UAAa,OAAO,KAAK,YAAY,UAAU;AAChE,WAAO,IAAI,GAAGA,KAAI,4BAA4B;EAClD;AACA,MAAI,KAAK,cAAc,UAAa,OAAO,KAAK,cAAc,UAAU;AACpE,WAAO,IAAI,GAAGA,KAAI,8BAA8B;EACpD;AACA,MAAI,KAAK,eAAe,UAAa,CAAC,kBAAkB,IAAI,OAAO,KAAK,UAAU,CAAC,GAAG;AAClF,WAAO,IAAI,GAAGA,KAAI,iBAAiB,OAAO,KAAK,UAAU,CAAC,yBAAyB;EACvF;AACA,MAAI,KAAK,eAAe,UAAa,CAAC,kBAAkB,IAAI,OAAO,KAAK,UAAU,CAAC,GAAG;AAClF,WAAO,IAAI,GAAGA,KAAI,iBAAiB,OAAO,KAAK,UAAU,CAAC,yBAAyB;EACvF;AACA,MAAI,KAAK,aAAa,UAAa,CAAC,iBAAiB,IAAI,OAAO,KAAK,QAAQ,CAAC,GAAG;AAC7E,WAAO,IAAI,GAAGA,KAAI,eAAe,OAAO,KAAK,QAAQ,CAAC,4BAA4B;EACtF;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,mBAAmBG,QAA8B;AACtD,QAAM,WAAWA,OAAM;AACvB,MAAI,OAAO,aAAa,YAAY,CAAC,sBAAsB,IAAI,QAAQ,GAAG;AACtE,WAAO,IAAI,4BAA4B,OAAO,QAAQ,CAAC,iCAAiC;EAC5F;AACA,QAAM,QAAQA,OAAM;AACpB,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AAC7C,WAAO,IAAI,mDAAmD;EAClE;AACA,WAAS,WAAW,GAAG,WAAW,MAAM,QAAQ,YAAY;AACxD,UAAM,MAAM,MAAM,QAAQ;AAC1B,QAAI,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAI,WAAW,GAAG;AACzC,aAAO,IAAI,uBAAuB,QAAQ,8BAA8B;IAC5E;AACA,aAAS,cAAc,GAAG,cAAc,IAAI,QAAQ,eAAe;AAC/D,YAAM,YAAY,kBACd,IAAI,WAAW,GACf,uBAAuB,QAAQ,KAAK,WAAW,GAAG;AAEtD,UAAI,CAAC,UAAU;AAAI,eAAO;IAC9B;EACJ;AACA,QAAM,iBAAiBA,OAAM,gBAAgB;AAC7C,QAAM,iBAAiBA,OAAM,gBAAgB;AAC7C,MAAI,mBAAmB,gBAAgB;AACnC,WAAO,IAAI,kEAAkE;EACjF;AACA,MAAI,gBAAgB;AAChB,UAAM,aAAa,cAAcA,OAAM,aAAa,2BAA2B;AAC/E,QAAI,CAAC,WAAW;AAAI,aAAO;AAC3B,QAAI,CAAC,eAAeA,OAAM,WAAW,KAAKA,OAAM,eAAe,GAAG;AAC9D,aAAO,IAAI,6DAA6D;IAC5E;EACJ;AACA,MAAIA,OAAM,UAAU,QAAW;AAC3B,QAAI,CAAC,cAAcA,OAAM,KAAK;AAAG,aAAO,IAAI,6CAA6C;AACzF,UAAM,aAAa,cAAcA,OAAM,MAAM,OAAO,2BAA2B;AAC/E,QAAI,CAAC,WAAW;AAAI,aAAO;AAC3B,QAAI,CAAC,eAAeA,OAAM,MAAM,KAAK,KAAKA,OAAM,MAAM,SAAS,GAAG;AAC9D,aAAO,IAAI,6DAA6D;IAC5E;EACJ;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAUA,SAAS,oBAAoB,MAAmBA,QAA8B;AAC1E,UAAQ,MAAM;IACV,KAAK;AACD,aAAO,kBAAkBA,MAAK;IAClC,KAAK;AACD,aAAO,4BAA4BA,MAAK;IAC5C,KAAK;AACD,aAAO,2BAA2BA,MAAK;IAC3C,KAAK;AACD,aAAO,0BAA0BA,MAAK;IAC1C,KAAK;AACD,aAAO,uBAAuBA,MAAK;IACvC,KAAK;AACD,aAAO,wBAAwBA,MAAK;IACxC,KAAK;AACD,aAAO,uBAAuBA,MAAK;IACvC,KAAK;AACD,aAAO,8BAA8BA,MAAK;IAC9C,KAAK;AACD,aAAO,sBAAsBA,MAAK;IACtC,KAAK;AACD,aAAO,sBAAsBA,MAAK;IACtC,KAAK;AACD,aAAO,oBAAoBA,MAAK;IACpC,KAAK;AACD,aAAO,qBAAqBA,MAAK;IACrC,KAAK;AACD,aAAO,kBAAkBA,MAAK;IAClC,KAAK;AACD,aAAO,oBAAoBA,MAAK;IACpC,KAAK;AACD,aAAO,iBAAiBA,MAAK;IACjC,KAAK;AACD,aAAO,mBAAmBA,MAAK;IACnC,KAAK;AACD,aAAO,yBAAyBA,MAAK;IACzC,KAAK;AACD,aAAO,iBAAiBA,MAAK;IACjC,KAAK;AACD,aAAO,yBAAyBA,MAAK;IACzC,KAAK;AACD,aAAO,mBAAmBA,MAAK;IACnC,KAAK;AACD,aAAO,kBAAkBA,MAAK;IAClC,KAAK;AACD,aAAO,mBAAmBA,MAAK;IACnC,KAAK;AACD,aAAO,yBAAyBA,MAAK;IACzC,KAAK;AACD,aAAO,yBAAyBA,MAAK;IACzC,KAAK;AACD,aAAO,2BAA2BA,MAAK;IAC3C,KAAK;AACD,aAAO,0BAA0BA,MAAK;IAC1C,KAAK;AACD,aAAO,2BAA2BA,MAAK;IAC3C,KAAK;AACD,aAAO,6BAA6BA,MAAK;IAC7C,KAAK;AACD,aAAO,6BAA6BA,MAAK;IAC7C,KAAK;AACD,aAAO,4BAA4BA,MAAK;IAC5C,KAAK;AACD,aAAO,+BAA+BA,MAAK;IAC/C,KAAK;AACD,aAAO,wBAAwBA,MAAK;IACxC,KAAK;AACD,aAAO,yBAAyBA,MAAK;IACzC,KAAK;AACD,aAAO,sBAAsBA,MAAK;IACtC,KAAK;AACD,aAAO,yBAAyBA,MAAK;IACzC,KAAK;AACD,aAAO,0BAA0BA,MAAK;IAC1C,KAAK;AACD,aAAO,uBAAuBA,MAAK;IACvC,KAAK;AACD,aAAO,wBAAwBA,MAAK;IACxC,KAAK;AACD,aAAO,0BAA0BA,MAAK;IAC1C,KAAK;AACD,aAAO,qBAAqBA,MAAK;IACrC,KAAK;AACD,aAAO,6BAA6BA,MAAK;IAC7C,KAAK;AACD,aAAO,wBAAwBA,MAAK;IACxC,KAAK;AACD,aAAO,qBAAqBA,MAAK;IACrC,KAAK;AACD,aAAO,uBAAuBA,MAAK;IACvC,KAAK;AACD,aAAO,sBAAsBA,MAAK;IACtC,KAAK;AACD,aAAO,0BAA0BA,MAAK;IAC1C,KAAK;AACD,aAAO,2BAA2BA,MAAK;IAC3C,KAAK;AACD,aAAO,8BAA8BA,MAAK;IAC9C,KAAK;AACD,aAAO,yBAAyBA,MAAK;IACzC,KAAK;AACD,aAAO,6BAA6BA,MAAK;IAC7C,KAAK;AACD,aAAO,gCAAgCA,MAAK;IAChD,KAAK;AACD,aAAO,gCAAgCA,MAAK;IAChD,KAAK;AACD,aAAO,mCAAmCA,MAAK;IACnD,KAAK;AACD,aAAO,iCAAiCA,MAAK;IACjD,KAAK;AACD,aAAO,gCAAgCA,MAAK;IAChD,KAAK;AACD,aAAO,gCAAgCA,MAAK;IAChD,KAAK;AACD,aAAO,yBAAyBA,MAAK;IACzC,KAAK;AACD,aAAO,wBAAwBA,MAAK;IACxC,KAAK;AACD,aAAO,sBAAsBA,MAAK;IACtC,KAAK;AACD,aAAO,mBAAmBA,MAAK;IACnC,KAAK;AACD,aAAO,mBAAmBA,MAAK;IACnC,KAAK;AACD,aAAO,mBAAmBA,MAAK;EACvC;AACJ;AAEA,SAAS,wBAAwB,GAA0B;AACvD,MAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG;AAC/B,WAAO,IAAI,8CAA8C;EAC7D;AACA,QAAM,cAAc,EAAE;AACtB,MAAI,OAAO,gBAAgB,YAAY,CAAC,oBAAoB,IAAI,WAAW,GAAG;AAC1E,WAAO;MACH,IAAI;MACJ,MAAM;MACN,SAAS,yBAAyB,OAAO,WAAW,CAAC;;EAE7D;AACA,MAAI,OAAO,EAAE,OAAO,YAAY,CAAC,kBAAkB,IAAI,EAAE,EAAE,GAAG;AAC1D,WAAO,IAAI,gBAAgB,OAAO,EAAE,EAAE,CAAC,0CAA0C;EACrF;AACA,MAAI,CAAC,qBAAqB,EAAE,GAAG,GAAG;AAC9B,WAAO,IAAI,6CAA6C;EAC5D;AACA,MAAI,CAAC,eAAe,EAAE,IAAI,GAAG;AACzB,WAAO,IAAI,uCAAuC;EACtD;AACA,QAAMA,SAAQ,EAAE;AAChB,MAAI,CAAC,cAAcA,MAAK,GAAG;AACvB,WAAO,IAAI,uCAAuC;EACtD;AACA,MAAIA,OAAM,SAAS,aAAa;AAC5B,WAAO,IACH,wBAAwB,OAAOA,OAAM,IAAI,CAAC,qCAAqC,WAAW,GAAG;EAErG;AACA,QAAM,YAAY,oBAAoBA,MAAK;AAC3C,MAAI,CAAC,UAAU;AAAI,WAAO;AAC1B,SAAO,oBAAoB,aAA4BA,MAAK;AAChE;AAEA,SAAS,mBAAmB,GAA0B;AAClD,QAAM,WAAW,EAAE;AACnB,MAAI,OAAO,aAAa,YAAY,CAAC,4BAA4B,IAAI,QAAQ,GAAG;AAC5E,WAAO,IAAI,yBAAyB,OAAO,QAAQ,CAAC,2BAA2B;EACnF;AACA,QAAM,OAAO,EAAE;AACf,MAAI,OAAO,SAAS,YAAY,CAAC,uBAAuB,IAAI,IAAI,GAAG;AAC/D,WAAO,IAAI,qBAAqB,OAAO,IAAI,CAAC,iCAAiC;EACjF;AACA,MAAI,OAAO,EAAE,YAAY;AAAU,WAAO,IAAI,sCAAsC;AACpF,QAAM,SAAS,EAAE;AACjB,MAAI,WAAW,QAAQ,OAAO,WAAW,UAAU;AAC/C,WAAO,IAAI,6CAA6C;EAC5D;AACA,QAAM,MAAM,EAAE;AACd,MAAI,QAAQ,QAAQ,CAAC,qBAAqB,GAAG,GAAG;AAC5C,WAAO,IAAI,wDAAwD;EACvE;AACA,SAAO,EAAE,IAAI,KAAI;AACrB;AAyBM,SAAU,iBAAiB,GAAU;AACvC,MAAI,CAAC,cAAc,CAAC,GAAG;AACnB,WAAO,IAAI,8BAA8B;EAC7C;AACA,MAAI,EAAE,UAAU,IAAI;AAChB,WAAO,IAAI,uCAAuC;EACtD;AACA,QAAM,OAAO,EAAE;AACf,UAAQ,MAAM;IACV,KAAK;AACD,aAAO,qBAAqB,CAAC;IACjC,KAAK;AACD,aAAO,sBAAsB,CAAC;IAClC,KAAK;AACD,aAAO,+BAA+B,CAAC;IAC3C,KAAK;AACD,aAAO,oBAAoB,CAAC;IAChC,KAAK;AACD,aAAO,wBAAwB,CAAC;IACpC,KAAK;AACD,aAAO,mBAAmB,CAAC;IAC/B;AACI,aAAO,IAAI,mBAAmB,OAAO,IAAI,CAAC,gCAAgC;EAClF;AACJ;;;ACxhDM,SAAU,SAAS,OAA+B,GAAe;AACnE,QAAM,SAAS,iBAAiB,CAAC;AACjC,MAAI,CAAC,OAAO,IAAI;AACZ,mBAAe,OAAO;MAClB,MAAM;MACN,UAAU;MACV,MAAM;MACN,SAAS,OAAO;MAChB,QAAQ,EAAE;MACV,KAAK,EAAE;KACV;AACD;EACJ;AACA,WAAS,IAAI,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;AACjD,UAAM,WAAW,MAAM,MAAM,CAAC;AAC9B,QAAI,SAAS,WAAW,EAAE,UAAU,SAAS,QAAQ,EAAE,KAAK;AACxD,YAAM,MAAM,CAAC,IAAI;AACjB;IACJ;EACJ;AACA,QAAM,MAAM,KAAK,CAAC;AACtB;AAaM,SAAU,UAAU,OAA+B,GAAgB;AACrE,QAAM,SAAS,iBAAiB,CAAC;AACjC,MAAI,CAAC,OAAO,IAAI;AACZ,mBAAe,OAAO;MAClB,MAAM;MACN,UAAU;MACV,MAAM;MACN,SAAS,OAAO;MAChB,QAAQ,EAAE;MACV,KAAK,EAAE;KACV;AACD;EACJ;AACA,WAAS,IAAI,MAAM,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;AAClD,UAAM,WAAW,MAAM,OAAO,CAAC;AAC/B,QAAI,SAAS,WAAW,EAAE,UAAU,SAAS,QAAQ,EAAE,KAAK;AACxD,YAAM,OAAO,CAAC,IAAI;AAClB;IACJ;EACJ;AACA,QAAM,OAAO,KAAK,CAAC;AACvB;AAYM,SAAU,mBAAmB,OAA+B,GAAyB;AACvF,QAAM,SAAS,iBAAiB,CAAC;AACjC,MAAI,CAAC,OAAO,IAAI;AACZ,mBAAe,OAAO;MAClB,MAAM;MACN,UAAU;MACV,MAAM;MACN,SAAS,OAAO;MAChB,QAAQ;MACR,KAAK,EAAE;KACV;AACD;EACJ;AACA,QAAM,SAAS,MAAM,mBAAmB,CAAA;AACxC,QAAM,kBAAkB;AACxB,SAAO,KAAK,CAAC;AACjB;AAWM,SAAU,QAAQ,OAA+B,GAAc;AACjE,QAAM,SAAS,iBAAiB,CAAC;AACjC,MAAI,CAAC,OAAO,IAAI;AACZ,mBAAe,OAAO;MAClB,MAAM;MACN,UAAU;MACV,MAAM;MACN,SAAS,OAAO;MAChB,QAAQ;MACR,KAAK,EAAE;KACV;AACD;EACJ;AACA,QAAM,KAAK,KAAK,CAAC;AACrB;AAeM,SAAU,eAAe,OAA+B,GAAoB;AAC9E,QAAM,YAAY,KAAK,CAAC;AAC5B;;;ACtJA,IAAM,sBAAsB;AAC5B,IAAM,eAAe;AAaf,SAAU,iBAAiB,GAAS;AACtC,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,GAAG;AAClC,SAAK,EAAE,WAAW,CAAC;AACnB,QAAI,KAAK,KAAK,GAAG,YAAY;EACjC;AACA,UAAQ,MAAM,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACjD;;;ACdA,IAAM,sBAAsB;AAE5B,SAAS,iBACL,QACA,KACA,SACA,MAAyC;AAEzC,SAAO,GAAG,MAAM,KAAK,GAAG,KAAK,iBAAiB,UAAU,KAAK,UAAU,IAAI,CAAC,CAAC;AACjF;AAEA,SAAS,gBAAgB,OAAc;AACnC,MAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,WAAO,MAAM,IAAI,CAAC,SAAS,gBAAgB,IAAI,CAAC;EACpD;AACA,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC7C,WAAO,OAAO,YACV,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,gBAAgB,IAAI,CAAC,CAAC,CAAC;EAEhF;AACA,SAAO;AACX;AAEA,SAAS,aACL,MAAyC;AAEzC,SAAO,gBAAgB,IAAI;AAC/B;AAEA,SAAS,UAAU,KAAqB,QAAgB,SAAiB,MAAe;AACpF,MAAI,IAAI,aAAa,OAAO,SAAS,GAAG;AACpC,mBAAe,IAAI,WAAW;MAC1B,MAAM;MACN,UAAU;MACV,MAAM;MACN,SAAS;MACT;MACA,KAAK,IAAI,SAAQ;KACpB;AACD;EACJ;AAEA,QAAM,WAA2B,MAAM,KAAK,IAAI,aAAa,MAAM;AACnE,QAAM,MAAM,IAAI,SAAQ;AACxB,QAAM,OAAO,aAAa,KAAK,QAAQ,CAAA,CAAE;AAEzC,QAAM,WAA0B;IAC5B,MAAM;IACN;IACA,UAAU,KAAK,YAAY;IAC3B;IACA;IACA,MAAM,IAAI,OAAO,IAAI;IACrB;IACA,UAAU,OAAO,OAAO,SAAS,MAAK,CAAE;IACxC,WAAW,iBAAiB,QAAQ,KAAK,SAAS,IAAI;;AAG1D,YAAU,IAAI,WAAW,QAAQ;AACrC;AAwDM,SAAUC,OAAM,MAAc,MAA2B,MAAgB;AAC3E,MAAI,OAAO,SAAS,UAAU;AAG1B,UAAM,IAAI,MAAM,mBAAmB;EACvC;AACA,QAAM,MAAM,uBAAuB;AACnC,MAAI,CAAC;AAAK,UAAM,IAAI,MAAM,mBAAmB;AAC7C,YAAU,KAAK,MAAM,MAAM,QAAQ,CAAA,CAAE;AACzC;;;AC9HA,SAAS,aACL,KACA,MACA,aACA,SAAe;AAEf,QAAM,MAAM,GAAG,IAAI,IAAI,WAAW;AAClC,QAAM,YAAY,IAAI;AACtB,MAAI,WAAW,IAAI,GAAG;AAAG;AACzB,aAAW,IAAI,GAAG;AAClB,iBAAe,IAAI,WAAW;IAC1B,MAAM;IACN,UAAU;IACV;IACA;IACA,QAAQ;IACR,KAAK,IAAI,SAAQ;GACpB;AACL;AAcM,SAAU,mBAAmB,KAAqB,aAAqB,OAAc;AACvF,MAAI,CAAC,IAAI,aAAa,iBAAiB;AACnC,iBACI,KACA,kCACA,aACA,4DAA4D;AAEhE;EACJ;AACA,QAAM,YAAY,IAAI,iBAAiB,IAAI,WAAW;AACtD,MAAI,cAAc,QAAW;AACzB,iBACI,KACA,2BACA,aACA,oBAAoB,WAAW,2CAA2C;AAE9E;EACJ;AACA,QAAM,WAAmC;IACrC,MAAM;IACN;IACA,OAAO,UAAU;IACjB,aAAa,UAAU;IACvB,gBAAgB,UAAU;IAC1B;IACA,KAAK,IAAI,SAAQ;IACjB,MAAM,IAAI,OAAO,IAAI;;AAEzB,qBAAmB,IAAI,WAAW,QAAQ;AAC9C;;;AC7DA,SAAS,gBAAgB,KAAqB,QAAqB;AAC/D,QAAM,aAAa,IAAI,aAAa,qBAAqB,MAAM;AAC/D,QAAM,YAAY,IAAI,oBAAoB,MAAM,KAAK,OAAO;AAC5D,SAAO,KAAK,IAAI,YAAY,SAAS;AACzC;AA2CM,SAAU,YAAY,KAAqB,GAAkB;AAC/D,MAAI,CAAC,IAAI,aAAa,SAAS,IAAI,EAAE,WAAW,GAAG;AAC/C,mBAAe,IAAI,WAAW;MAC1B,MAAM;MACN,UAAU;MACV,MAAM;MACN,SAAS,uCAAuC,EAAE,WAAW;MAC7D,QAAQ,EAAE;MACV,KAAK,EAAE;KACV;AACD;EACJ;AAEA,QAAM,aAAa,iBAAiB,CAAC;AACrC,MAAI,CAAC,WAAW,IAAI;AAChB,mBAAe,IAAI,WAAW;MAC1B,MAAM;MACN,UAAU;MACV,MAAM,WAAW;MACjB,SAAS,WAAW;MACpB,QAAQ,EAAE;MACV,KAAK,EAAE;KACV;AACD;EACJ;AAEA,QAAM,SAAS,UAAU,EAAE,WAAW;AACtC,MAAI,EAAE,OAAO,UAAU;AACnB,UAAM,OAAO,IAAI,sBAAsB,MAAM;AAC7C,UAAM,MAAM,gBAAgB,KAAK,MAAM;AACvC,QAAI,QAAQ,KAAK;AACb,qBAAe,IAAI,WAAW;QAC1B,MAAM;QACN,UAAU;QACV,MAAM;QACN,SAAS,WAAW,MAAM,aAAa,GAAG;QAC1C,QAAQ,EAAE;QACV,KAAK,EAAE;OACV;AACD;IACJ;AACA,QAAI,sBAAsB,MAAM,IAAI,OAAO;EAC/C,WAAW,EAAE,OAAO,UAAU;AAC1B,UAAM,OAAO,IAAI,sBAAsB,MAAM;AAC7C,QAAI,sBAAsB,MAAM,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC;EAC5D;AAEA,QAAM,WAAW,IAAI,UAAU;AAC/B,WAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;AAC9C,UAAM,WAAW,SAAS,CAAC;AAC3B,QAAI,SAAS,aAAa,EAAE,YAAY,SAAS,QAAQ,EAAE,KAAK;AAC5D,eAAS,CAAC,IAAI;AACd;IACJ;EACJ;AACA,WAAS,KAAK,CAAC;AACnB;;;ACzGA,IAAMC,uBAAsB;AAE5B,SAAS,WAAW,MAAoB,OAA4B;AAQhE,SAAO,EAAE,GAAG,MAAM,GAAG,OAAO,MAAM,KAAK,KAAI;AAC/C;AAEA,SAAS,KACL,KACA,UACA,MACA,IACAC,QAAmB;AAEnB,cAAY,KAAK;IACb,MAAM;IACN;IACA,aAAa;IACb;IACA,OAAAA;IACA,KAAK,IAAI,SAAQ;IACjB,MAAM,IAAI,OAAO,IAAI;GACxB;AACL;AAoCM,SAAU,oBACZ,QACA,OACA,MACA,cAA0B;AAE1B,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMD,oBAAmB;AAErD,QAAM,WAAW,GAAG,MAAM,IAAI,KAAK;AACnC,QAAM,WAAW,IAAI,aAAa,IAAI,QAAQ;AAE9C,MAAI;AACJ,MAAI;AACJ,MAAI,aAAa,QAAW;AACxB,WAAO,EAAE,UAAU,MAAM,OAAO,cAAc,SAAS,MAAK;AAC5D,QAAI,aAAa,IAAI,UAAU,IAAI;AACnC,SAAK;EACT,OAAO;AAIH,aAAS,QAAQ,WAAW,SAAS,OAAO,YAAY;AACxD,aAAS,UAAU;AACnB,WAAO;AACP,SAAK;EACT;AAEA,OAAK,KAAK,UAAU,MAAM,IAAI,KAAK,KAAK;AAExC,SAAO;IACH,IAAI;IACJ,OAAO,OAA4B;AAM/B,YAAM,UAAU,uBAAuB;AACvC,UAAI,YAAY;AAAM;AACtB,YAAM,IAAI,QAAQ,aAAa,IAAI,QAAQ;AAC3C,UAAI,MAAM,UAAa,EAAE;AAAS;AAClC,QAAE,QAAQ,WAAW,EAAE,OAAO,KAAK;AACnC,WAAK,SAAS,UAAU,MAAM,UAAU,EAAE,KAAK;IACnD;IACA,SAAM;AACF,YAAM,UAAU,uBAAuB;AACvC,UAAI,YAAY;AAAM;AACtB,YAAM,IAAI,QAAQ,aAAa,IAAI,QAAQ;AAC3C,UAAI,MAAM,UAAa,EAAE;AAAS;AAMlC,QAAE,UAAU;AACZ,WAAK,SAAS,UAAU,MAAM,UAAU,EAAE,KAAK;IACnD;;AAER;;;AC7GM,SAAU,UAAU,KAAqB,QAAc;AACzD,QAAM,WAAW,IAAI;AACrB,QAAM,UAAU,SAAS,IAAI,MAAM,KAAK;AACxC,WAAS,IAAI,QAAQ,UAAU,CAAC;AAChC,SAAO;AACX;AAcM,SAAU,mBAAmB,KAAmB;AAClD,MAAI,qBAAqB,MAAK;AAClC;;;ACtBA,IAAME,uBAAsB;AAE5B,SAAS,UAAU,QAAgB,GAAe,GAAe,MAAe;AAC5E,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,oBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAoB,EAAE,MAAM,SAAS,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,KAAI;AACvE,SAAO,oBAAoB,QAAQ,OAAO,SAASA,MAAK;AAC5D;AA0DM,SAAU,MACZ,MACA,MACA,MACA,MAAgB;AAEhB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,oBAAmB;EACvC;AACA,SAAO,UAAU,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AAC/D;;;AC5EA,IAAME,uBAAsB;AAE5B,SAAS,kBACL,QACA,QACA,MAAqB;AAErB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,oBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA4B,EAAE,MAAM,mBAAmB,QAAQ,OAAO,KAAI;AAChF,SAAO,oBAAoB,QAAQ,OAAO,mBAAmBA,MAAK;AACtE;AAmDM,SAAU,cACZ,MACA,MACA,MAAsB;AAEtB,MAAI,OAAO,SAAS,YAAY,SAAS,QAAW;AAChD,UAAM,IAAI,MAAMD,oBAAmB;EACvC;AACA,SAAO,kBAAkB,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACjE;;;ACxEA,IAAME,uBAAsB;AAE5B,SAAS,gBAAgB,QAAgB,QAAoB,MAAqB;AAC9E,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,oBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA0B,EAAE,MAAM,iBAAiB,QAAQ,OAAO,KAAI;AAC5E,SAAO,oBAAoB,QAAQ,OAAO,iBAAiBA,MAAK;AACpE;AAmDM,SAAU,YACZ,MACA,MACA,MAAsB;AAEtB,MAAI,OAAO,SAAS,YAAY,SAAS,QAAW;AAChD,UAAM,IAAI,MAAMD,oBAAmB;EACvC;AACA,SAAO,gBAAgB,MAAM,MAAoB,QAAQ,CAAA,CAAE;AAC/D;;;ACpEA,IAAME,uBAAsB;AAE5B,SAAS,gBAAgB,QAAgB,QAAoB,MAAqB;AAC9E,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,oBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA0B,EAAE,MAAM,gBAAgB,QAAQ,OAAO,KAAI;AAC3E,SAAO,oBAAoB,QAAQ,OAAO,gBAAgBA,MAAK;AACnE;AAuDM,SAAU,YACZ,MACA,MACA,MAAsB;AAEtB,MAAI,OAAO,SAAS,YAAY,SAAS,QAAW;AAChD,UAAM,IAAI,MAAMD,oBAAmB;EACvC;AACA,SAAO,gBAAgB,MAAM,MAAoB,QAAQ,CAAA,CAAE;AAC/D;;;AC7EA,IAAME,uBAAsB;AAE5B,SAAS,SAAS,QAAgB,QAAoB,MAAc,MAAc;AAC9E,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,oBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAmB,EAAE,MAAM,QAAQ,QAAQ,MAAM,OAAO,KAAI;AAClE,SAAO,oBAAoB,QAAQ,OAAO,QAAQA,MAAK;AAC3D;AA0DM,SAAU,KACZ,MACA,MACA,MACA,MAAe;AAEf,MACI,OAAO,SAAS,YAChB,SAAS,UACT,OAAO,SAAS,YAChB,OAAO,SAAS,UAClB;AACE,UAAM,IAAI,MAAMD,oBAAmB;EACvC;AACA,SAAO,SAAS,MAAM,MAAM,MAAM,QAAQ,CAAA,CAAE;AAChD;;;AC5EA,IAAME,uBAAsB;AAE5B,SAAS,WACL,QACA,QACA,cACA,MAAgB;AAEhB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,oBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAqB;IACvB,MAAM;IACN,SAAS,CAAC,QAAQ,YAAY;IAC9B,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,UAAUA,MAAK;AAC7D;AA8DM,SAAU,OACZ,MACA,MACA,MACA,MAAiB;AAEjB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,oBAAmB;EACvC;AACA,SAAO,WAAW,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AAChE;;;ACzFA,IAAME,uBAAsB;AAE5B,SAAS,YACL,QACA,GACA,GACA,MAAgB;AAEhB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,oBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAsB,EAAE,MAAM,WAAW,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,KAAI;AAC3E,SAAO,oBAAoB,QAAQ,OAAO,WAAWA,MAAK;AAC9D;AA0DM,SAAU,QACZ,MACA,MACA,MACA,MAAiB;AAEjB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,oBAAmB;EACvC;AACA,SAAO,YAAY,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACjE;;;ACjFA,IAAME,wBAAsB;AAO5B,SAAS,WAAW,QAAgB,QAAoB,MAAgB;AACpE,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AAGnC,QAAM,EAAE,MAAAC,OAAM,OAAO,GAAG,MAAK,IAAK;AAClC,QAAMC,SAAqB;IACvB,MAAM;IACN;IACA,GAAID,UAAS,SAAY,EAAE,MAAAA,MAAI,IAAK,CAAA;IACpC,GAAI,UAAU,SAAY,EAAE,MAAK,IAAK,CAAA;IACtC;;AAEJ,SAAO,oBAAoB,QAAQ,OAAO,UAAUC,MAAK;AAC7D;AAiDM,SAAU,OACZ,MACA,MACA,MAAiB;AAEjB,MAAI,OAAO,SAAS,YAAY,SAAS,QAAW;AAChD,UAAM,IAAI,MAAMF,qBAAmB;EACvC;AACA,SAAO,WAAW,MAAM,MAAoB,QAAQ,CAAA,CAAE;AAC1D;;;ACrFA,IAAMG,wBAAsB;AAE5B,SAAS,SACL,QACA,SACA,MAAc;AAEd,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAmB,EAAE,MAAM,QAAQ,SAAS,OAAO,KAAI;AAC7D,SAAO,oBAAoB,QAAQ,OAAO,QAAQA,MAAK;AAC3D;AA0DM,SAAU,KACZ,MACA,MACA,MAAe;AAEf,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,SAAS,MAAM,MAAmC,QAAQ,CAAA,CAAE;AACvE;;;AC1EA,IAAME,wBAAsB;AAE5B,SAAS,aACL,QACA,SACA,MAAmB;AAEnB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAuB,EAAE,MAAM,YAAY,SAAS,OAAO,KAAI;AACrE,SAAO,oBAAoB,QAAQ,OAAO,YAAYA,MAAK;AAC/D;AA0DM,SAAU,SACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,aAAa,MAAM,MAAmC,QAAQ,CAAA,CAAE;AAC3E;;;AC/EA,IAAME,wBAAsB;AAE5B,SAAS,cACL,QACA,GACA,GACA,MAAgB;AAEhB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAwB,EAAE,MAAM,aAAa,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,KAAI;AAC/E,SAAO,oBAAoB,QAAQ,OAAO,aAAaA,MAAK;AAChE;AAwDM,SAAU,UACZ,MACA,MACA,MACA,MAAiB;AAEjB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,cAAc,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACnE;;;AC/EA,IAAME,wBAAsB;AAE5B,SAAS,qBACL,QACA,SACA,MAAgB;AAEhB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA+B,EAAE,MAAM,qBAAqB,SAAS,OAAO,KAAI;AACtF,SAAO,oBAAoB,QAAQ,OAAO,qBAAqBA,MAAK;AACxE;AA4DM,SAAU,iBACZ,MACA,MACA,MAAiB;AAEjB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,qBAAqB,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACpE;;;ACjFA,IAAME,wBAAsB;AAE5B,SAAS,aAAa,QAAgB,SAAuB,MAAgB;AACzE,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAuB,EAAE,MAAM,YAAY,SAAS,OAAO,KAAI;AACrE,SAAO,oBAAoB,QAAQ,OAAO,YAAYA,MAAK;AAC/D;AAqDM,SAAU,SACZ,MACA,MACA,MAAiB;AAEjB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,aAAa,MAAM,MAAsB,QAAQ,CAAA,CAAE;AAC9D;;;ACtEA,IAAME,wBAAsB;AAE5B,SAAS,oBACL,QACA,SACA,MAAmB;AAEnB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA8B,EAAE,MAAM,oBAAoB,SAAS,OAAO,KAAI;AACpF,SAAO,oBAAoB,QAAQ,OAAO,oBAAoBA,MAAK;AACvE;AA0DM,SAAU,gBACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,oBAAoB,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACnE;;;AC/EA,IAAME,wBAAsB;AAE5B,SAAS,kBACL,QACA,SACA,MAAmB;AAEnB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA4B,EAAE,MAAM,mBAAmB,SAAS,OAAO,KAAI;AACjF,SAAO,oBAAoB,QAAQ,OAAO,mBAAmBA,MAAK;AACtE;AA2DM,SAAU,cACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,kBAAkB,MAAM,MAAsB,QAAQ,CAAA,CAAE;AACnE;;;AChFA,IAAME,wBAAsB;AAE5B,SAAS,oBACL,QACA,GACA,GACA,MAAyB;AAEzB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA8B;IAChC,MAAM;IACN,SAAS,CAAC,GAAG,CAAC;IACd,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,oBAAoBA,MAAK;AACvE;AAqEM,SAAU,gBACZ,MACA,MACA,MACA,MAA0B;AAE1B,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,oBAAoB,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACzE;;;AChGA,IAAME,wBAAsB;AAE5B,SAAS,iBACL,QACA,SACA,MAAmB;AAEnB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA2B,EAAE,MAAM,iBAAiB,SAAS,OAAO,KAAI;AAC9E,SAAO,oBAAoB,QAAQ,OAAO,iBAAiBA,MAAK;AACpE;AA0DM,SAAU,aACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,iBAAiB,MAAM,MAAsB,QAAQ,CAAA,CAAE;AAClE;;;AC7EA,IAAME,wBAAsB;AAE5B,SAAS,UAAU,QAAgB,GAAe,GAAe,MAAe;AAC5E,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAoB;IACtB,MAAM;IACN,SAAS,CAAC,GAAG,CAAC;IACd,gBAAgB,CAAA;IAChB,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,SAASA,MAAK;AAC5D;AA0DM,SAAU,MACZ,MACA,MACA,MACA,MAAgB;AAEhB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,UAAU,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AAC/D;;;ACvFA,IAAME,wBAAsB;AAE5B,SAAS,UAAU,QAAgB,gBAAqC;AACpE,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAoB;IACtB,MAAM;IACN;;AAEJ,SAAO,oBAAoB,QAAQ,OAAO,SAASA,MAAK;AAC5D;AA0DM,SAAU,MACZ,MACA,MAA4B;AAE5B,MAAI,OAAO,SAAS,YAAY,SAAS,QAAW;AAChD,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,UAAU,MAAM,IAAI;AAC/B;;;ACzEA,IAAME,wBAAsB;AAE5B,SAAS,QAAQ,QAAgB,SAAuB,MAAmB;AACvE,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAkB,EAAE,MAAM,OAAO,SAAS,OAAO,KAAI;AAC3D,SAAO,oBAAoB,QAAQ,OAAO,OAAOA,MAAK;AAC1D;AAuDM,SAAU,IACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,QAAQ,MAAM,MAAsB,QAAQ,CAAA,CAAE;AACzD;;;ACxEA,IAAME,wBAAsB;AAE5B,SAAS,UACL,QACA,SACA,MAAgB;AAEhB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAoB,EAAE,MAAM,SAAS,SAAS,OAAO,KAAI;AAC/D,SAAO,oBAAoB,QAAQ,OAAO,SAASA,MAAK;AAC5D;AA2DM,SAAU,MACZ,MACA,MACA,MAAiB;AAEjB,MACI,OAAO,SAAS,YAChB,SAAS,UACT,CAAC,MAAM,QAAQ,IAAI,KACnB,SAAS,QACX;AACE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,UAAU,MAAM,MAAmC,IAAI;AAClE;;;ACrFA,IAAME,wBAAsB;AAE5B,SAAS,UAAU,QAAgB,SAAuB,MAAmB;AACzE,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAoB,EAAE,MAAM,SAAS,SAAS,OAAO,KAAI;AAC/D,SAAO,oBAAoB,QAAQ,OAAO,SAASA,MAAK;AAC5D;AAsDM,SAAU,MACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,UAAU,MAAM,MAAsB,QAAQ,CAAA,CAAE;AAC3D;;;ACvEA,IAAME,wBAAsB;AAE5B,SAAS,gBAAgB,QAAgB,SAAsB,MAAmB;AAC9E,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA0B,EAAE,MAAM,gBAAgB,SAAS,OAAO,KAAI;AAC5E,SAAO,oBAAoB,QAAQ,OAAO,gBAAgBA,MAAK;AACnE;AA6DM,SAAU,YACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,gBAAgB,MAAM,MAAqB,QAAQ,CAAA,CAAE;AAChE;;;AC9EA,IAAME,wBAAsB;AAE5B,SAAS,gBACL,QACA,SACA,MAAsB;AAEtB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA0B,EAAE,MAAM,eAAe,SAAS,OAAO,KAAI;AAC3E,SAAO,oBAAoB,QAAQ,OAAO,eAAeA,MAAK;AAClE;AA6DM,SAAU,YACZ,MACA,MACA,MAAuB;AAEvB,MACI,OAAO,SAAS,YAChB,SAAS,UACT,CAAC,MAAM,QAAQ,IAAI,KACnB,SAAS,QACX;AACE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,gBAAgB,MAAM,MAAmC,IAAI;AACxE;;;ACvFA,IAAME,wBAAsB;AAE5B,SAAS,QACL,QACA,SACA,MAAmB;AAEnB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAkB,EAAE,MAAM,OAAO,SAAS,OAAO,KAAI;AAC3D,SAAO,oBAAoB,QAAQ,OAAO,OAAOA,MAAK;AAC1D;AAwDM,SAAU,IACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,QAAQ,MAAM,MAAmC,QAAQ,CAAA,CAAE;AACtE;;;AC7EA,IAAME,wBAAsB;AAE5B,SAAS,gBACL,QACA,GACA,GACA,MAAmB;AAEnB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA0B;IAC5B,MAAM;IACN,SAAS,CAAC,GAAG,CAAC;IACd,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,gBAAgBA,MAAK;AACnE;AAyDM,SAAU,YACZ,MACA,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,gBAAgB,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACrE;;;ACpFA,IAAME,wBAAsB;AAE5B,SAAS,aACL,QACA,GACA,GACA,MAAmB;AAEnB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAuB;IACzB,MAAM;IACN,SAAS,CAAC,GAAG,CAAC;IACd,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,aAAaA,MAAK;AAChE;AAwDM,SAAU,SACZ,MACA,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,aAAa,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AAClE;;;ACnFA,IAAME,wBAAsB;AAE5B,SAAS,eACL,QACA,GACA,GACA,MAAmB;AAEnB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAyB;IAC3B,MAAM;IACN,SAAS,CAAC,GAAG,CAAC;IACd,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,eAAeA,MAAK;AAClE;AAwDM,SAAU,WACZ,MACA,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,eAAe,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACpE;;;ACnFA,IAAME,wBAAsB;AAI5B,SAAS,0BACL,QACA,SACA,MAAoB;AAEpB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAM,EAAE,QAAQ,GAAG,MAAK,IAAK;AAC7B,QAAMC,SACF,WAAW,SACL,EAAE,MAAM,2BAA2B,SAAS,MAAK,IACjD,EAAE,MAAM,2BAA2B,SAAS,QAAQ,MAAK;AACnE,SAAO,oBAAoB,QAAQ,OAAO,2BAA2BA,MAAK;AAC9E;AAsDM,SAAU,sBACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,0BAA0B,MAAM,MAAuB,QAAQ,CAAA,CAAqB;AAC/F;;;ACjFA,IAAME,wBAAsB;AAI5B,SAAS,uBACL,QACA,SACA,MAAqB;AAErB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAM,EAAE,QAAQ,GAAG,MAAK,IAAK;AAC7B,QAAMC,SACF,WAAW,SACL,EAAE,MAAM,wBAAwB,SAAS,MAAK,IAC9C,EAAE,MAAM,wBAAwB,SAAS,QAAQ,MAAK;AAChE,SAAO,oBAAoB,QAAQ,OAAO,wBAAwBA,MAAK;AAC3E;AA2DM,SAAU,mBACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,uBAAuB,MAAM,MAAqB,QAAQ,CAAA,CAAsB;AAC3F;;;ACtFA,IAAME,wBAAsB;AAI5B,SAAS,uBACL,QACA,SACA,MAAiB;AAEjB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAM,EAAE,QAAQ,GAAG,MAAK,IAAK;AAC7B,QAAMC,SACF,WAAW,SACL,EAAE,MAAM,wBAAwB,SAAS,MAAK,IAC9C,EAAE,MAAM,wBAAwB,SAAS,QAAQ,MAAK;AAChE,SAAO,oBAAoB,QAAQ,OAAO,wBAAwBA,MAAK;AAC3E;AAyDM,SAAU,mBACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,uBAAuB,MAAM,MAAsB,QAAQ,CAAA,CAAkB;AACxF;;;ACpFA,IAAME,wBAAsB;AAI5B,SAAS,wBACL,QACA,SACA,MAAkB;AAElB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAM,EAAE,QAAQ,GAAG,MAAK,IAAK;AAC7B,QAAMC,SACF,WAAW,SACL,EAAE,MAAM,yBAAyB,SAAS,MAAK,IAC/C,EAAE,MAAM,yBAAyB,SAAS,QAAQ,MAAK;AACjE,SAAO,oBAAoB,QAAQ,OAAO,yBAAyBA,MAAK;AAC5E;AAwDM,SAAU,oBACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,wBAAwB,MAAM,MAAsB,QAAQ,CAAA,CAAmB;AAC1F;;;AC/EA,IAAME,wBAAsB;AAI5B,SAAS,uBACL,QACA,SACA,MAAqB;AAErB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAM,EAAE,QAAQ,GAAG,MAAK,IAAK;AAC7B,QAAMC,SACF,WAAW,SACL,EAAE,MAAM,wBAAwB,SAAS,MAAK,IAC9C,EAAE,MAAM,wBAAwB,SAAS,QAAQ,MAAK;AAChE,SAAO,oBAAoB,QAAQ,OAAO,wBAAwBA,MAAK;AAC3E;AA2DM,SAAU,mBACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,uBAAuB,MAAM,MAAqB,QAAQ,CAAA,CAAsB;AAC3F;;;AC1FA,IAAME,wBAAsB;AAE5B,SAAS,eAAe,QAAgB,SAAuB,MAAa;AACxE,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAyB,EAAE,MAAM,eAAe,SAAS,OAAO,KAAI;AAC1E,SAAO,oBAAoB,QAAQ,OAAO,eAAeA,MAAK;AAClE;AAoDM,SAAU,WACZ,MACA,MACA,MAAc;AAEd,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,eAAe,MAAM,MAAsB,QAAQ,CAAA,CAAE;AAChE;;;ACrEA,IAAME,wBAAsB;AAE5B,SAAS,mBACL,QACA,GACA,GACA,MAAa;AAEb,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA6B;IAC/B,MAAM;IACN,SAAS,CAAC,GAAG,CAAC;IACd,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,mBAAmBA,MAAK;AACtE;AAwDM,SAAU,eACZ,MACA,MACA,MACA,MAAc;AAEd,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,mBAAmB,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACxE;;;ACnFA,IAAME,wBAAsB;AAE5B,SAAS,gBACL,QACA,GACA,GACA,MAAa;AAEb,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA0B;IAC5B,MAAM;IACN,SAAS,CAAC,GAAG,CAAC;IACd,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,iBAAiBA,MAAK;AACpE;AAyDM,SAAU,YACZ,MACA,MACA,MACA,MAAc;AAEd,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,gBAAgB,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACrE;;;ACpFA,IAAME,wBAAsB;AAE5B,SAAS,sBACL,QACA,SACA,MAAa;AAEb,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAgC;IAClC,MAAM;IACN;IACA,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,uBAAuBA,MAAK;AAC1E;AAyDM,SAAU,kBACZ,MACA,MACA,MAAc;AAEd,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,sBAAsB,MAAM,MAAsB,QAAQ,CAAA,CAAE;AACvE;;;AClFA,IAAME,wBAAsB;AAE5B,SAAS,aAAa,QAAgB,SAAuB,MAAa;AACtE,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAuB,EAAE,MAAM,aAAa,SAAS,OAAO,KAAI;AACtE,SAAO,oBAAoB,QAAQ,OAAO,aAAaA,MAAK;AAChE;AAqDM,SAAU,SACZ,MACA,MACA,MAAc;AAEd,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,aAAa,MAAM,MAAsB,QAAQ,CAAA,CAAE;AAC9D;;;ACtEA,IAAME,wBAAsB;AAE5B,SAAS,eACL,QACA,GACA,GACA,MAAa;AAEb,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAyB;IAC3B,MAAM;IACN,SAAS,CAAC,GAAG,CAAC;IACd,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,eAAeA,MAAK;AAClE;AAyDM,SAAU,WACZ,MACA,MACA,MACA,MAAc;AAEd,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,eAAe,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACpE;;;ACpFA,IAAME,wBAAsB;AAE5B,SAAS,iBACL,QACA,GACA,GACA,MAAa;AAEb,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA2B;IAC7B,MAAM;IACN,SAAS,CAAC,GAAG,CAAC;IACd,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,kBAAkBA,MAAK;AACrE;AAuDM,SAAU,aACZ,MACA,MACA,MACA,MAAc;AAEd,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,iBAAiB,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACtE;;;AClFA,IAAME,wBAAsB;AAE5B,SAAS,gBACL,QACA,GACA,GACA,MAAa;AAEb,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA0B;IAC5B,MAAM;IACN,SAAS,CAAC,GAAG,CAAC;IACd,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,iBAAiBA,MAAK;AACpE;AAuDM,SAAU,YACZ,MACA,MACA,MACA,MAAc;AAEd,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,gBAAgB,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACrE;;;AClFA,IAAME,wBAAsB;AAE5B,SAAS,cAAc,QAAgB,GAAe,GAAe,MAAa;AAC9E,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAwB;IAC1B,MAAM;IACN,SAAS,CAAC,GAAG,CAAC;IACd,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,cAAcA,MAAK;AACjE;AAyDM,SAAU,UACZ,MACA,MACA,MACA,MAAc;AAEd,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,cAAc,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACnE;;;AC/EA,IAAME,wBAAsB;AAE5B,SAAS,iBAAiB,QAAgB,SAAuB,MAAa;AAC1E,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA2B;IAC7B,MAAM;IACN;IACA,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,kBAAkBA,MAAK;AACrE;AAwDM,SAAU,aACZ,MACA,MACA,MAAc;AAEd,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,iBAAiB,MAAM,MAAsB,QAAQ,CAAA,CAAE;AAClE;;;AC7EA,IAAME,wBAAsB;AAE5B,SAAS,YACL,QACA,GACA,GACA,MAAmB;AAEnB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAsB;IACxB,MAAM;IACN,SAAS,CAAC,GAAG,CAAC;IACd,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,YAAYA,MAAK;AAC/D;AAuDM,SAAU,QACZ,MACA,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,YAAY,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACjE;;;AClFA,IAAME,wBAAsB;AAE5B,SAAS,YACL,QACA,GACA,GACA,MAAmB;AAEnB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAsB;IACxB,MAAM;IACN,SAAS,CAAC,GAAG,CAAC;IACd,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,YAAYA,MAAK;AAC/D;AAuDM,SAAU,QACZ,MACA,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,YAAY,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACjE;;;AClFA,IAAME,wBAAsB;AAE5B,SAAS,eACL,QACA,GACA,GACA,MAAmB;AAEnB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAyB;IAC3B,MAAM;IACN,SAAS,CAAC,GAAG,CAAC;IACd,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,eAAeA,MAAK;AAClE;AAsDM,SAAU,WACZ,MACA,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,eAAe,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACpE;;;ACjFA,IAAME,wBAAsB;AAE5B,SAAS,oBACL,QACA,QACA,MAAmB;AAEnB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA8B;IAChC,MAAM;IACN;IACA,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,qBAAqBA,MAAK;AACxE;AAkDM,SAAU,gBACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,QAAW;AAChD,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,oBAAoB,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACnE;;;AC3EA,IAAME,wBAAsB;AAE5B,SAAS,cAAc,QAAgB,QAAoB,MAAmB;AAC1E,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAwB,EAAE,MAAM,cAAc,QAAQ,OAAO,KAAI;AACvE,SAAO,oBAAoB,QAAQ,OAAO,cAAcA,MAAK;AACjE;AAgDM,SAAU,UACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,OAAO,SAAS,UAAU;AAC5E,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,cAAc,MAAM,MAAoB,QAAQ,CAAA,CAAE;AAC7D;;;ACjEA,IAAME,wBAAsB;AAE5B,SAAS,mBAAmB,QAAgB,OAAc,MAAmB;AACzE,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA6B,EAAE,MAAM,mBAAmB,OAAO,OAAO,KAAI;AAChF,SAAO,oBAAoB,QAAQ,OAAO,mBAAmBA,MAAK;AACtE;AA4CM,SAAU,eACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAAU;AACtD,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,mBAAmB,MAAM,MAAM,QAAQ,CAAA,CAAE;AACpD;;;AC7DA,IAAME,wBAAsB;AAE5B,SAAS,kBAAkB,QAAgB,QAAoB,MAAmB;AAC9E,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA4B,EAAE,MAAM,kBAAkB,QAAQ,OAAO,KAAI;AAC/E,SAAO,oBAAoB,QAAQ,OAAO,kBAAkBA,MAAK;AACrE;AAmDM,SAAU,cACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,OAAO,SAAS,UAAU;AAC5E,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,kBAAkB,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACjE;;;ACjEA,IAAME,wBAAsB;AAE5B,SAAS,SACL,QACA,GACA,GACA,MAAmB;AAEnB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAmB,EAAE,MAAM,QAAQ,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,KAAI;AACrE,SAAO,oBAAoB,QAAQ,OAAO,QAAQA,MAAK;AAC3D;AA2DM,SAAU,KACZ,MACA,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,SAAS,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AAC9D;;;ACrFA,IAAME,wBAAsB;AAE5B,SAAS,eACL,QACA,GACA,GACA,MAAmB;AAEnB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAyB,EAAE,MAAM,eAAe,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,KAAI;AAClF,SAAO,oBAAoB,QAAQ,OAAO,eAAeA,MAAK;AAClE;AAsDM,SAAU,WACZ,MACA,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,SAAS,QAAW;AACtE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,eAAe,MAAM,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACpE;;;AC7EA,IAAME,wBAAsB;AAE5B,SAAS,iBAAiB,QAAgB,MAAY,MAAmB;AACrE,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA2B,EAAE,MAAM,iBAAiB,MAAM,OAAO,KAAI;AAC3E,SAAO,oBAAoB,QAAQ,OAAO,iBAAiBA,MAAK;AACpE;AA4CM,SAAU,aACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAAU;AACtD,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,iBAAiB,MAAM,MAAM,QAAQ,CAAA,CAAE;AAClD;;;AC7DA,IAAME,wBAAsB;AAE5B,SAAS,gBAAgB,QAAgB,SAAqB,MAAmB;AAC7E,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA0B,EAAE,MAAM,gBAAgB,SAAS,OAAO,KAAI;AAC5E,SAAO,oBAAoB,QAAQ,OAAO,gBAAgBA,MAAK;AACnE;AAuDM,SAAU,YACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,gBAAgB,MAAM,MAAoB,QAAQ,CAAA,CAAE;AAC/D;;;ACvEA,IAAME,wBAAsB;AAE5B,SAAS,kBACL,QACA,SACA,MAAmB;AAEnB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA4B,EAAE,MAAM,kBAAkB,SAAS,OAAO,KAAI;AAChF,SAAO,oBAAoB,QAAQ,OAAO,kBAAkBA,MAAK;AACrE;AA0DM,SAAU,cACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,kBAAkB,MAAM,MAAqB,QAAQ,CAAA,CAAE;AAClE;;;AC3EA,IAAME,wBAAsB;AAE5B,SAAS,qBACL,QACA,SACA,MAAmB;AAEnB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA+B;IACjC,MAAM;IACN;IACA,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,sBAAsBA,MAAK;AACzE;AAyDM,SAAU,iBACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,qBAAqB,MAAM,MAAqB,QAAQ,CAAA,CAAE;AACrE;;;ACvFA,IAAME,wBAAsB;AAE5B,SAAS,uBACL,QACA,SACA,MAAmB;AAEnB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAiC;IACnC,MAAM;IACN;IACA,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,wBAAwBA,MAAK;AAC3E;AA0DM,SAAU,mBACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,uBAAuB,MAAM,MAAoB,QAAQ,CAAA,CAAE;AACtE;;;AC7EA,IAAME,wBAAsB;AAE5B,SAAS,oBACL,QACA,SACA,MAAmB;AAEnB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA8B;IAChC,MAAM;IACN;IACA,OAAO;;AAEX,SAAO,oBAAoB,QAAQ,OAAO,oBAAoBA,MAAK;AACvE;AAwDM,SAAU,gBACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,oBAAoB,MAAM,MAAsB,QAAQ,CAAA,CAAE;AACrE;;;ACvFA,IAAME,wBAAsB;AAE5B,SAAS,iBACL,QACA,SACA,MAAmB;AAEnB,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAA2B,EAAE,MAAM,iBAAiB,SAAS,OAAO,KAAI;AAC9E,SAAO,oBAAoB,QAAQ,OAAO,iBAAiBA,MAAK;AACpE;AAwDM,SAAU,aACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,iBAAiB,MAAM,MAAqB,QAAQ,CAAA,CAAE;AACjE;;;AC7EA,IAAME,wBAAsB;AAE5B,SAAS,aAAa,QAAgB,SAAuB,MAAmB;AAC5E,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAuB,EAAE,MAAM,YAAY,SAAS,OAAO,KAAI;AACrE,SAAO,oBAAoB,QAAQ,OAAO,YAAYA,MAAK;AAC/D;AAsDM,SAAU,SACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,aAAa,MAAM,MAAsB,QAAQ,CAAA,CAAE;AAC9D;;;ACnEA,IAAME,wBAAsB;AAM5B,SAAS,cAAc,QAAgB,SAAuB,MAAmB;AAC7E,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAM,EAAE,SAAS,YAAY,GAAG,MAAK,IAAK;AAC1C,QAAMC,SAAwB;IAC1B,MAAM;IACN;IACA,SAAS,cAAc;IACvB;;AAEJ,SAAO,oBAAoB,QAAQ,OAAO,aAAaA,MAAK;AAChE;AA6DM,SAAU,UACZ,MACA,MACA,MAAoB;AAEpB,MAAI,OAAO,SAAS,YAAY,SAAS,UAAa,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxE,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,SAAO,cAAc,MAAM,MAAsB,QAAQ,CAAA,CAAE;AAC/D;;;ACzGA,IAAME,wBAAsB;AAE5B,SAAS,UAAU,QAAgB,MAAe;AAC9C,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ;AAAM,UAAM,IAAI,MAAMA,qBAAmB;AACrD,QAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAMC,SAAoB;IACtB,MAAM;IACN,UAAU,KAAK;IACf,OAAO,KAAK;IACZ,GAAI,KAAK,gBAAgB,SAAY,CAAA,IAAK,EAAE,aAAa,KAAK,YAAW;IACzE,GAAI,KAAK,gBAAgB,SAAY,CAAA,IAAK,EAAE,aAAa,KAAK,YAAW;IACzE,GAAI,KAAK,UAAU,SAAY,CAAA,IAAK,EAAE,OAAO,KAAK,MAAK;;AAE3D,SAAO,oBAAoB,QAAQ,OAAO,SAASA,MAAK;AAC5D;AAkDM,SAAUC,OAAM,MAA0B,MAAgB;AAC5D,MAAI,OAAO,SAAS,YAAY,SAAS,QAAW;AAChD,UAAM,IAAI,MAAMF,qBAAmB;EACvC;AACA,SAAO,UAAU,MAAM,IAAI;AAC/B;;;ACVA,IAAM,aAAa;;EAEf;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;;EAEA;EACA;EACA;;EAEA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;;EAEA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;;EAEA;EACA;;EAEA,OAAAG;;AAGJ,IAAM,kBAAuC,IAAI,IAAI,OAAO,KAAK,UAAU,CAAC;AAyBrE,IAAM,iBAAgC,IAAI,MAAM,YAAwC;EAC3F,IAAI,QAAQ,UAAQ;AAChB,UAAM,OAAO,OAAO,QAAQ;AAC5B,QAAI,gBAAgB,IAAI,IAAI,GAAG;AAC3B,aAAO,QAAQ,IAAI,QAAQ,QAAQ;IACvC;AAQA,WAAO,QAAQ,IAAI,MAAgB,QAAQ;EAC/C;CACH;;;ACrLD,IAAMC,wBAAsB;AAE5B,SAAS,UAAU,KAAqB,QAAgB,OAAe,MAAe;AAClF,QAAM,QAAmB;IACrB,MAAM;IACN,WAAW,KAAK,aAAa;IAC7B,WAAW,KAAK,aAAa;;AAGjC,MAAI,CAAC,IAAI,aAAa,MAAM,IAAI,iBAAiB,GAAG;AAChD,mBAAe,IAAI,WAAW;MAC1B,MAAM;MACN,UAAU;MACV,MAAM;MACN,SAAS;MACT;MACA,KAAK,IAAI,SAAQ;KACpB;AACD;EACJ;AAEA,QAAM,WAAyB;IAC3B,MAAM;IACN;IACA,OAAO,KAAK,SAAS;IACrB;IACA,KAAK,IAAI,SAAQ;IACjB,MAAM,IAAI,OAAO,IAAI;IACrB,OAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;IACxC,OAAO,KAAK,SAAS;IACrB,MAAM,CAAA;IACN,MAAM;;AAGV,WAAS,IAAI,WAAW,QAAQ;AACpC;AAoDM,SAAUC,OAAM,MAAuB,MAA2B,MAAgB;AACpF,MAAI,OAAO,SAAS,UAAU;AAC1B,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,QAAM,MAAM,uBAAuB;AACnC,MAAI,CAAC;AAAK,UAAM,IAAI,MAAMA,qBAAmB;AAC7C,MAAI,OAAO,SAAS,UAAU;AAC1B,UAAM,IAAI,MAAMA,qBAAmB;EACvC;AACA,YAAU,KAAK,MAAM,MAAM,QAAQ,CAAA,CAAE;AACzC;;;ACvGA,IAAM,yBAAyB,OAAO,oBAAoB;AAgBpD,SAAU,qBAAqB,SAAe;AAChD,SAAO,OAAO,OAAO,EAAE,UAAU,wBAAwB,QAAO,CAAE;AACtE;AAWM,SAAU,mBAAmB,KAAY;AAC3C,SACI,OAAO,QAAQ,YACf,QAAQ,QACR,cAAc,OACb,IAAwC,aAAa,0BACtD,aAAa,OACb,OAAQ,IAAuC,YAAY;AAEnE;;;AC/BA,IAAM,oBAAoB;AAE1B,SAASE,eAAc,GAAU;AAC7B,MAAI,OAAO,MAAM,YAAY,MAAM;AAAM,WAAO;AAChD,QAAM,QAAQ,OAAO,eAAe,CAAC;AACrC,SAAO,UAAU,OAAO,aAAa,UAAU;AACnD;AAEA,SAAS,YAAY,GAAU;AAC3B,MAAI,MAAM;AAAM,WAAO;AACvB,QAAM,IAAI,OAAO;AACjB,MAAI,MAAM,aAAa,MAAM;AAAU,WAAO;AAC9C,MAAI,MAAM;AAAU,WAAO,OAAO,SAAS,CAAC;AAC5C,MAAI,MAAM,QAAQ,CAAC;AAAG,WAAO,EAAE,MAAM,WAAW;AAChD,MAAI,CAACA,eAAc,CAAC;AAAG,WAAO;AAC9B,aAAW,OAAO,OAAO,KAAK,CAAC,GAAG;AAC9B,QAAI;AACJ,QAAI;AACA,cAAQ,QAAQ,IAAI,GAAG,GAAG;IAC9B,QAAQ;AACJ,aAAO;IACX;AACA,QAAI,CAAC,YAAY,KAAK;AAAG,aAAO;EACpC;AACA,SAAO;AACX;AAEA,SAAS,kBAAkB,OAAgB;AACvC,MAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,WAAO,OAAO,OAAO,MAAM,IAAI,CAAC,SAAS,kBAAkB,IAAI,CAAC,CAAC;EACrE;AACA,MAAIA,eAAc,KAAK,GAAG;AACtB,UAAM,UAAU,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM;MACvD;MACA,kBAAkB,IAAiB;KACtC;AACD,WAAO,OAAO,OAAO,OAAO,YAAY,OAAO,CAAC;EACpD;AACA,SAAO;AACX;AAEA,SAASC,cACL,MAAyC;AAEzC,SAAO,kBAAkB,IAAI;AACjC;AAEA,SAAS,kBAAkB,KAAmB;AAC1C,MAAI,IAAI;AAA4B;AACpC,MAAI,6BAA6B;AACjC,iBAAe,IAAI,WAAW;IAC1B,MAAM;IACN,UAAU;IACV,MAAM;IACN,SACI;IACJ,QAAQ;IACR,KAAK,IAAI,SAAQ;GACpB;AACL;AAYM,SAAU,QACZ,KACA,OACA,SACA,MAA0C;AAE1C,MAAI,CAAC,IAAI,aAAa;AAAM;AAC5B,MAAI,IAAI,aAAa,mBAAmB;AACpC,sBAAkB,GAAG;AACrB;EACJ;AACA,MAAI,SAAS,UAAa,CAAC,YAAY,IAAI,GAAG;AAC1C,mBAAe,IAAI,WAAW;MAC1B,MAAM;MACN,UAAU;MACV,MAAM;MACN,SAAS;MACT,QAAQ;MACR,KAAK,IAAI,SAAQ;KACpB;AACD;EACJ;AACA,QAAM,WAAwB;IAC1B,MAAM;IACN;IACA;IACA,GAAI,SAAS,SAAY,CAAA,IAAK,EAAE,MAAMA,cAAa,IAAI,EAAC;IACxD,KAAK,IAAI,SAAQ;IACjB,MAAM,IAAI,OAAO,IAAI;;AAEzB,MAAI,aAAa;AACjB,UAAQ,IAAI,WAAW,QAAQ;AACnC;AAYM,SAAU,sBAAsB,KAAmB;AACrD,SAAO,OAAO,OAAO;IACjB,KAAK,OAAO,OAAO;MACf,MAAM,CAAC,SAAiB,SACpB,QAAQ,KAAK,QAAQ,SAAS,IAAI;MACtC,MAAM,CAAC,SAAiB,SACpB,QAAQ,KAAK,QAAQ,SAAS,IAAI;MACtC,OAAO,CAAC,SAAiB,SACrB,QAAQ,KAAK,SAAS,SAAS,IAAI;KAC1C;IACD,OAAO,CAAC,YAAW;AACf,YAAM,qBAAqB,OAAO;IACtC;GACH;AACL;;;ACrHM,SAAU,YACZ,WACA,KACA,QAAc;AAEd,QAAM,OAAO,aAAa;AAC1B,MAAI,SAAS;AAAW,WAAO;AAC/B,MAAI,IAAI,aAAa,YAAY,GAAG;AAChC,mBAAe,IAAI,WAAW;MAC1B,MAAM;MACN,UAAU;MACV,MAAM;MACN,SAAS,SAAS,IAAI;MACtB;MACA,KAAK,IAAI,SAAQ;KACpB;AACD,WAAO;EACX;AACA,iBAAe,IAAI,WAAW;IAC1B,MAAM;IACN,UAAU;IACV,MAAM;IACN,SAAS,uCAAuC,IAAI;IACpD;IACA,KAAK,IAAI,SAAQ;GACpB;AACD,SAAO;AACX;;;ACvCA,IAAMC,wBAAsB;AAE5B,SAAS,eAAe,GAAU;AAC9B,SAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,aAAa;AAC/D;AAEA,SAAS,iBAAiB,GAAU;AAChC,SAAO,OAAO,MAAM,YAAY,eAAe,CAAC;AACpD;AAEA,SAAS,aAAa,OAA8B;AAChD,QAAM,WAAW,OAAO,UAAU,WAAW,QAAQ,MAAM;AAC3D,SAAO,OAAO,SAAS,QAAQ,IAAI,WAAW;AAClD;AAEA,SAAS,WAAW,MAAc;AAC9B,QAAM,QAAQ,KAAK;AACnB,MAAI,UAAU,QAAW;AACrB,WAAO;MACH,MAAM;MACN,WAAW,KAAK,aAAa;MAC7B,WAAW,KAAK,aAAa;;EAErC;AACA,UAAQ,MAAM,MAAM;IAChB,KAAK;AACD,aAAO,EAAE,MAAM,aAAa,UAAU,MAAM,YAAY,EAAC;IAC7D,KAAK;AACD,aAAO,EAAE,MAAM,UAAU,OAAO,MAAM,OAAO,MAAM,MAAM,KAAI;IACjE,KAAK;AACD,aAAO;QACH,MAAM;QACN,OAAO,MAAM;QACb,MAAM,MAAM;QACZ,GAAI,MAAM,aAAa,SAAY,CAAA,IAAK,EAAE,UAAU,MAAM,SAAQ;;IAE1E,KAAK;AACD,aAAO;QACH,MAAM;QACN,MAAM,MAAM;QACZ,MAAM,MAAM;QACZ,GAAI,MAAM,aAAa,SAAY,CAAA,IAAK,EAAE,UAAU,MAAM,SAAQ;;IAE1E,KAAK;AACD,aAAO,EAAE,MAAM,SAAS,WAAW,MAAM,WAAW,MAAM,MAAM,KAAI;IACxE,KAAK;AACD,aAAO;QACH,MAAM;QACN,MAAM,MAAM;QACZ,MAAM,MAAM;QACZ,GAAI,MAAM,SAAS,SAAY,CAAA,IAAK,EAAE,MAAM,MAAM,KAAI;;IAE9D,KAAK;AACD,aAAO,EAAE,MAAM,gBAAgB,OAAO,MAAM,MAAK;IACrD,KAAK;AACD,aAAO;QACH,MAAM;QACN,OAAO,MAAM;QACb,GAAI,MAAM,WAAW,SAAY,CAAA,IAAK,EAAE,QAAQ,MAAM,OAAM;;IAEpE,KAAK;AACD,aAAO,EAAE,MAAM,aAAa,OAAO,MAAM,MAAK;IAClD,KAAK;AACD,aAAO,EAAE,MAAM,wBAAwB,SAAS,MAAM,QAAO;IACjE,KAAK;IACL,KAAK;IACL,KAAK;AACD,aAAO;QACH,MAAM,MAAM;QACZ,WAAW,KAAK,aAAa;QAC7B,WAAW,KAAK,aAAa;;EAEzC;AACJ;AAEA,SAAS,SACL,KACA,QACA,OACA,MAAc;AAEd,QAAM,QAAmB,WAAW,IAAI;AAExC,MAAI,CAAC,IAAI,aAAa,MAAM,IAAI,MAAM,IAAI,GAAG;AACzC,mBAAe,IAAI,WAAW;MAC1B,MAAM;MACN,UAAU;MACV,MAAM;MACN,SAAS,oCAAoC,MAAM,IAAI;MACvD;MACA,KAAK,IAAI,SAAQ;KACpB;AACD;EACJ;AAEA,QAAM,OAAO,YAAY,KAAK,MAAM,KAAK,MAAM;AAE/C,QAAM,WAAyB;IAC3B,MAAM;IACN;IACA,OAAO,KAAK,SAAS;IACrB;IACA,KAAK,IAAI,SAAQ;IACjB,MAAM,IAAI,OAAO,IAAI;IACrB,OAAO,aAAa,KAAK;IACzB,OAAO,KAAK,SAAS;IACrB,MAAM,CAAA;IACN;;AAGJ,WAAS,IAAI,WAAW,QAAQ;AACpC;AAuDM,SAAUC,MACZ,MACA,MACA,MAAe;AAEf,MAAI,OAAO,SAAS,UAAU;AAC1B,UAAM,IAAI,MAAMD,qBAAmB;EACvC;AACA,QAAM,MAAM,uBAAuB;AACnC,MAAI,CAAC;AAAK,UAAM,IAAI,MAAMA,qBAAmB;AAC7C,MAAI,CAAC,iBAAiB,IAAI,GAAG;AACzB,UAAM,IAAI,MAAMA,qBAAmB;EACvC;AACA,WAAS,KAAK,MAAM,MAAM,QAAQ,CAAA,CAAE;AACxC;;;ACrKM,SAAU,MAAME,QAAkB;AACpC,QAAM,MAAuB,OAAO,OAAO;IACvC,OAAOA,OAAM,UAAU;IACvB,UAAUA,OAAM,UAAU;IAC1B,QAAQA,OAAM,UAAU;IACxB,iBAAiBA,OAAM,UAAU,mBAAmB,CAAA;IACpD,MAAMA,OAAM,UAAU;IACtB,aAAaA,OAAM,UAAU;IAC7B,SAASA,OAAM,UAAU;IACzB,OAAOA,OAAM,UAAU;GAC1B;AACD,EAAAA,OAAM,UAAU,QAAQ,CAAA;AACxB,EAAAA,OAAM,UAAU,WAAW,CAAA;AAC3B,EAAAA,OAAM,UAAU,SAAS,CAAA;AACzB,EAAAA,OAAM,UAAU,kBAAkB,CAAA;AAClC,EAAAA,OAAM,UAAU,OAAO,CAAA;AACvB,EAAAA,OAAM,UAAU,cAAc,CAAA;AAC9B,SAAO;AACX;;;ACjBM,SAAU,QAAQC,QAAkB;AACtC,kBAAgBA,OAAM,cAAc;AACpC,aAAW,OAAO,OAAO,OAAOA,OAAM,WAAW,KAAK,GAAG;AACrD,QAAI,MAAK;EACb;AACA,aAAW,UAAUA,OAAM,eAAe,iBAAiB,OAAM,GAAI;AACjE,eAAW,OAAO,OAAO,OAAO,OAAO,KAAK,GAAG;AAC3C,UAAI,MAAK;IACb;AACA,WAAO,QAAQ,MAAK;EACxB;AACA,EAAAA,OAAM,WAAW,QAAQ,MAAK;AAC9B,EAAAA,OAAM,UAAU,QAAQ,CAAA;AACxB,EAAAA,OAAM,UAAU,WAAW,CAAA;AAC3B,EAAAA,OAAM,UAAU,SAAS,CAAA;AACzB,EAAAA,OAAM,UAAU,cAAc,CAAA;AAC9B,EAAAA,OAAM,eAAe,aAAa,MAAK;AACvC,EAAAA,OAAM,eAAe,qBAAqB,MAAK;AAC/C,EAAAA,OAAM,eAAe,WAAW,MAAK;AACrC,EAAAA,OAAM,eAAe,iBAAiB,MAAK;AAC3C,EAAAA,OAAM,eAAe,oBAAoB,MAAK;AAC9C,EAAAA,OAAM,eAAe,0BAA0B,MAAK;AACpD,EAAAA,OAAM,eAAe,6BAA6B,MAAK;AACvD,EAAAA,OAAM,eAAe,oBAAoB,MAAK;AAC9C,EAAAA,OAAM,eAAe,qBAAqB,MAAK;AAC/C,EAAAA,OAAM,eAAe,mBAAmB,MAAK;AAC7C,QAAM,WAAWA,OAAM,eAAe;AACtC,WAAS,QAAQ;AACjB,WAAS,SAAS;AAClB,WAAS,QAAQ;AACjB,WAAS,YAAY;AACrB,WAAS,QAAQ;AACrB;;;AChCA,SAASC,UAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAAS,SAAS,UAAgB;AAC9B,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC,QAAQ;IACR,kBAAkB;;AAE1B;AASA,SAAS,MAAM,OAAe,MAAc,KAAa,QAAc;AACnE,MACI,CAAC,OAAO,SAAS,KAAK,KACtB,CAAC,OAAO,SAAS,IAAI,KACrB,CAAC,OAAO,SAAS,GAAG,KACpB,CAAC,OAAO,SAAS,MAAM,GACzB;AACE,WAAO;EACX;AACA,QAAM,QAAQ,OAAO;AACrB,MAAI,UAAU;AAAG,WAAO;AACxB,QAAM,OAAO,QAAQ,OAAO,OAAO,UAAU;AAC7C,SAAO,MAAM;AACjB;AA0BM,SAAU,IAAI,QAAgB,OAAe;AAC/C,QAAM,MAAMA,QAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAO,SAAS,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/C,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,EAAE,OAAO,MAAM,KAAK,OAAM,IAAK,IAAI,OAAO;AAChD,QAAM,MAAM,MAAM,OAAO,MAAM,KAAK,MAAM;AAE1C,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAY,KAAK,mBAAmB,GAAG;AACtD,WAAO,KAAK;EAChB;AAEA,OAAK,mBAAmB,KAAK;AAC7B,OAAK,UAAU;AACf,OAAK,UAAU,OAAO,KAAK,MAAM;AACjC,SAAO,KAAK;AAChB;;;ACxFA,IAAM,iBAAiB;AACvB,IAAM,aAAa;AAwBnB,SAASC,UAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,UAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,iBAAiB,IAAI,kBAAkB,MAAM;IAC7C,WAAW;IACX,WAAW,OAAO;IAClB,UAAU,OAAO;IACjB,eAAe,OAAO;;AAE9B;AAEA,SAAS,UAAU,MAAa;AAK5B,MAAI,CAAC,OAAO,SAAS,KAAK,SAAS,KAAK,CAAC,OAAO,SAAS,KAAK,QAAQ;AAAG;AACzE,QAAM,QAAQ,KAAK,YAAY,KAAK;AACpC,MAAI,KAAK,gBAAgB,WAAW,KAAK,QAAQ;AAE7C,SAAK,aAAa,KAAK,gBAAgB,GAAG,KAAK,SAAS,CAAC;EAC7D;AACA,OAAK,gBAAgB,OAAO,KAAK;AACjC,OAAK,aAAa;AACtB;AAEA,SAASC,MAAK,MAAa;AACvB,MAAI,KAAK,gBAAgB,SAAS,KAAK;AAAQ,WAAO,OAAO;AAC7D,SAAO,KAAK,YAAY,KAAK;AACjC;AAEA,SAAS,UAAU,MAAe,MAAc,KAAa,MAAY;AAErE,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,IAAI,GAAG;AAC3E,WAAOA,MAAK,IAAI;EACpB;AACA,QAAM,SAAS,KAAK,MAAM,OAAO,UAAU;AAC3C,MAAI,OAAO,MAAM,KAAK,aAAa,GAAG;AAClC,SAAK,gBAAgB;AACrB,SAAK,YAAY;AACjB,SAAK,WAAW;AAChB,WAAOA,MAAK,IAAI;EACpB;AACA,MAAI,WAAW,KAAK,eAAe;AAG/B,cAAU,IAAI;AACd,SAAK,gBAAgB;AACrB,SAAK,YAAY;AACjB,SAAK,WAAW;AAChB,WAAOA,MAAK,IAAI;EACpB;AAEA,MAAI,OAAO,KAAK;AAAW,SAAK,YAAY;AAC5C,MAAI,MAAM,KAAK;AAAU,SAAK,WAAW;AACzC,SAAOA,MAAK,IAAI;AACpB;AAqCM,SAAU,IAAI,QAAgB,MAAc;AAC9C,QAAM,MAAMF,QAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,UAAM,SAAS,MAAM,UAAU;AAC/B,WAAOC,UAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,EAAE,MAAM,KAAK,KAAI,IAAK,IAAI,OAAO;AACvC,MAAI,IAAI,QAAQ;AAIZ,SAAK,UAAU,YAAYC,MAAK,IAAI,CAAC;EACzC,OAAO;AACH,SAAK,UAAU,OAAO,UAAU,MAAM,MAAM,KAAK,IAAI,CAAC;EAC1D;AACA,SAAO,KAAK;AAChB;;;ACjJM,SAAU,WAAW,MAAc,QAAgB,QAAc;AACnE,UAAQ,QAAQ,SAAS,KAAK,UAAU;AAC5C;;;ACmCM,SAAU,qBAAqB,QAAc;AAC/C,SAAO;IACH;IACA,UAAU;IACV,UAAU,OAAO;IACjB,SAAS,OAAO;IAChB,WAAW,OAAO;IAClB,cAAc,OAAO;IACrB,aAAa,OAAO;IACpB,eAAe,OAAO;IACtB,YAAY;IACZ,aAAa;IACb,QAAQ;IACR,gBAAgB,OAAO;IACvB,iBAAiB,OAAO;IACxB,YAAY,OAAO;IACnB,0BAA0B,OAAO;IACjC,2BAA2B,OAAO;IAClC,sBAAsB,OAAO;IAC7B,QAAQ,OAAO;IACf,SAAS,OAAO;;AAExB;AAEA,SAAS,UAAU,MAAc,KAAa,WAAiB;AAM3D,MAAI,CAAC,OAAO,SAAS,SAAS;AAAG,WAAO,OAAO;AAC/C,SAAO,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,SAAS,GAAG,KAAK,IAAI,MAAM,SAAS,CAAC;AACrF;AAEA,SAAS,uBACL,MACA,KACA,UACA,SAAe;AAEf,QAAM,SAAS,OAAO;AACtB,QAAM,WAAW,UAAU;AAC3B,QAAM,MAAM,SAAS,YAAY,SAAS,IAAI,SAAS;AACvD,QAAM,MAAM,WAAW,UAAU,WAAW,IAAI,WAAW;AAC3D,SAAO,EAAE,KAAK,IAAG;AACrB;AAmBM,SAAU,wBACZ,UACA,MACA,KACA,OAAa;AAEb,QAAM,EAAE,OAAM,IAAK;AAEnB,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AAI5E,WAAO,EAAE,QAAQ,SAAS,QAAQ,SAAS,SAAS,QAAO;EAC/D;AAEA,WAAS,YAAY;AAErB,MAAI,SAAS,aAAa,GAAG;AAKzB,aAAS,eAAe,SAAS;AACjC,aAAS,cAAc,SAAS;AAChC,aAAS,gBAAgB,SAAS;AAClC,aAAS,WAAW;AACpB,aAAS,UAAU;AACnB,aAAS,YAAY;AACrB,aAAS,UAAU,OAAO;AAC1B,WAAO,EAAE,QAAQ,OAAO,KAAK,SAAS,OAAO,IAAG;EACpD;AAEA,QAAM,KAAK,UAAU,MAAM,KAAK,SAAS,SAAS;AAClD,QAAM,EAAE,KAAK,IAAG,IAAK,uBAAuB,MAAM,KAAK,SAAS,UAAU,SAAS,OAAO;AAI1F,WAAS,eAAe,SAAS;AACjC,WAAS,cAAc,SAAS;AAChC,WAAS,gBAAgB,SAAS;AAClC,WAAS,WAAW;AACpB,WAAS,UAAU;AACnB,WAAS,YAAY;AAErB,MAAI,SAAS,YAAY,QAAQ;AAI7B,aAAS,cAAc;AACvB,aAAS,eAAe;AACxB,aAAS,UAAU;AACnB,WAAO,EAAE,QAAQ,OAAO,KAAK,SAAS,OAAO,IAAG;EACpD;AAEA,MAAI,SAAS,aAAa,SAAS,GAAG;AAMlC,aAAS,2BAA2B,SAAS;AAC7C,aAAS,4BAA4B,SAAS;AAC9C,aAAS,uBAAuB,SAAS;AACzC,aAAS,cAAc;AACvB,aAAS,eAAe;AACxB,aAAS,UAAU;AACnB,aAAS,iBAAiB,SAAS;AACnC,aAAS,kBAAkB,SAAS;AACpC,aAAS,aAAa,SAAS;AAC/B,UAAM,MAAM,SAAS;AACrB,UAAMC,UAAS,QAAQ,IAAI,IAAK,MAAM,SAAS,iBAAkB;AACjE,UAAMC,WAAU,QAAQ,IAAI,IAAK,MAAM,SAAS,kBAAmB;AACnE,aAAS,SAASD;AAClB,aAAS,UAAUC;AACnB,WAAO,EAAE,QAAAD,SAAQ,SAAAC,SAAO;EAC5B;AAGA,WAAS,2BAA2B,SAAS;AAC7C,WAAS,4BAA4B,SAAS;AAC9C,WAAS,uBAAuB,SAAS;AACzC,WAAS,iBAAiB,WAAW,SAAS,gBAAgB,KAAK,MAAM;AACzE,WAAS,kBAAkB,WAAW,SAAS,iBAAiB,KAAK,MAAM;AAC3E,WAAS,aAAa,WAAW,SAAS,YAAY,IAAI,MAAM;AAChE,QAAM,MAAM,SAAS;AACrB,QAAM,SAAS,QAAQ,IAAI,IAAK,MAAM,SAAS,iBAAkB;AACjE,QAAM,UAAU,QAAQ,IAAI,IAAK,MAAM,SAAS,kBAAmB;AACnE,WAAS,SAAS;AAClB,WAAS,UAAU;AACnB,SAAO,EAAE,QAAQ,QAAO;AAC5B;AAgBM,SAAU,gBACZ,UACA,MACA,KACA,OAAa;AAEb,MAAI,SAAS,WAAW,SAAS,SAAS,GAAG;AACzC,WAAO,EAAE,QAAQ,OAAO,KAAK,SAAS,OAAO,IAAG;EACpD;AACA,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AAC5E,WAAO,EAAE,QAAQ,SAAS,QAAQ,SAAS,SAAS,QAAO;EAC/D;AAMA,QAAM,KAAK,UAAU,MAAM,KAAK,SAAS,aAAa;AACtD,QAAM,EAAE,KAAK,IAAG,IAAK,uBACjB,MACA,KACA,SAAS,cACT,SAAS,WAAW;AAGxB,MAAI,SAAS,aAAa,SAAS,SAAS,GAAG;AAK3C,UAAM,aAAa,SAAS,2BAA2B;AACvD,UAAM,cAAc,SAAS,4BAA4B;AACzD,UAAM,SAAS,SAAS,uBAAuB;AAG/C,UAAMD;;MAA8B,WAAW,IAAI,IAAK,MAAM,aAAc;;AAC5E,UAAMC;;MAA+B,WAAW,IAAI,IAAK,MAAM,cAAe;;AAC9E,WAAO,EAAE,QAAAD,SAAQ,SAAAC,SAAO;EAC5B;AACA,QAAM,WAAW,WAAW,SAAS,0BAA0B,KAAK,SAAS,MAAM;AACnF,QAAM,YAAY,WAAW,SAAS,2BAA2B,KAAK,SAAS,MAAM;AACrF,QAAM,OAAO,WAAW,SAAS,sBAAsB,IAAI,SAAS,MAAM;AAC1E,QAAM;;IAA8B,SAAS,IAAI,IAAK,MAAM,WAAY;;AACxE,QAAM;;IAA+B,SAAS,IAAI,IAAK,MAAM,YAAa;;AAC1E,SAAO,EAAE,QAAQ,QAAO;AAC5B;;;ACtPA,IAAM,oBAAoB;AAuB1B,SAASC,UAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,UAAS,QAAgB,iBAAyB,UAAgB;AACvE,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,UAAU,qBAAqB,MAAM;IACrC,QAAQ;IACR,aAAa;IACb,KAAK,OAAO;IACZ,eAAe,OAAO;IACtB,kBAAkB;IAClB,uBAAuB;IACvB,cAAc,oBAAI,IAAG;;AAE7B;AAEA,SAAS,cAAc,MAAe,QAAc;AAChD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA8B,KAAK,WAAW,MAAM;AAC3D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAEA,SAAS,SAAS,QAAgB,SAAe;AAC7C,QAAM,MAAM,SAAS;AACrB,MAAI,QAAQ;AAAG,WAAO;AACtB,SAAQ,MAAM,KAAK,IAAI,SAAS,OAAO,IAAK;AAChD;AAEA,SAAS,WAAW,MAAe,MAAc,KAAa,OAAa;AACvE,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AAM5E,WAAO,OAAO,SAAS,KAAK,GAAG,IAAI,KAAK,MAAM,OAAO;EACzD;AACA,QAAM,EAAE,QAAQ,QAAO,IAAK,wBAAwB,KAAK,UAAU,MAAM,KAAK,KAAK;AACnF,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,CAAC,OAAO,SAAS,OAAO,GAAG;AAEvD,SAAK,gBAAgB,KAAK;AAC1B,SAAK,mBAAmB,KAAK;AAC7B,SAAK,wBAAwB,KAAK;AAClC,WAAO,OAAO;EAClB;AACA,QAAM,KAAK,SAAS,QAAQ,OAAO;AAEnC,OAAK,gBAAgB,KAAK;AAC1B,OAAK,mBAAmB,KAAK;AAC7B,OAAK,wBAAwB,KAAK;AAElC,MAAI,KAAK,cAAc,KAAK,iBAAiB;AACzC,SAAK,UAAU;AACf,SAAK,eAAe;AACpB,QAAI,KAAK,gBAAgB,KAAK,iBAAiB;AAC3C,WAAK,MAAM,KAAK,SAAS,KAAK;AAC9B,aAAO,KAAK;IAChB;AACA,WAAO,OAAO;EAClB;AACA,OAAK,MAAM,WAAW,KAAK,KAAK,IAAI,KAAK,eAAe;AACxD,SAAO,KAAK;AAChB;AAEA,SAAS,UAAU,MAAe,MAAc,KAAa,OAAa;AACtE,QAAM,EAAE,QAAQ,QAAO,IAAK,gBAAgB,KAAK,UAAU,MAAM,KAAK,KAAK;AAC3E,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,CAAC,OAAO,SAAS,OAAO,GAAG;AAMvD;;MAA4B,OAAO,SAAS,KAAK,GAAG,IAAI,KAAK,MAAM,OAAO;;EAC9E;AACA,QAAM,KAAK,SAAS,QAAQ,OAAO;AAOnC,MAAI,KAAK,wBAAwB,KAAK,iBAAiB;AACnD,UAAM,mBAAmB,KAAK,wBAAwB;AACtD,QAAI,mBAAmB,KAAK;AAAiB,aAAO,OAAO;AAC3D,YAAQ,KAAK,mBAAmB,MAAM,KAAK;EAC/C;AAEA,SAAO,WAAW,KAAK,eAAe,IAAI,KAAK,eAAe;AAClE;AA8BM,SAAU,IAAI,QAAgB,QAAgB,MAAc;AAC9D,QAAM,MAAMD,QAAM;AAClB,QAAM,kBAAkB,MAAM,aAAa;AAC3C,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,UAAS,QAAQ,iBAAiB,IAAI,OAAO,MAAM,MAAM,QAAQ;AACxE,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,IAAI,OAAO;AACvB,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAY,UAAU,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC;EAC5E,OAAO;AACH,SAAK,UAAU,OAAO,WAAW,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC;EACxE;AACA,SAAO,cAAc,MAAM,MAAM,UAAU,CAAC;AAChD;;;ACpKM,SAAU,gBAAgB,QAAsB;AAClD,MAAI,OAAO,WAAW;AAAU,WAAO;AACvC,SAAO,OAAO;AAClB;;;ACjBA,IAAM,iBAAiB;AACvB,IAAM,gBAAgB;AAqBtB,SAASC,UAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,8CAA8C;EAClE;AACA,SAAO;AACX;AAEA,SAASC,UAAS,QAAgB,cAAsB,OAAe,UAAgB;AACnF,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,QAAM,IAAI,gBAAgB,SAAS;AACnC,QAAM,IAAI,SAAS;AACnB,QAAM,UAAU,IAAI,aAAa,MAAM;AACvC,MAAI,aAAa;AACjB,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;AAChC,UAAM,IAAI,IAAI;AACd,UAAM,IAAI,KAAK,IAAI,EAAE,IAAI,MAAM,IAAI,IAAI,EAAE;AACzC,YAAQ,CAAC,IAAI;AACb,kBAAc;EAClB;AACA,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,cAAc,IAAI,kBAAkB,MAAM;IAC1C;IACA;;AAER;AAEA,SAAS,mBAAmB,MAAgB,cAAqB;AAC7D,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AAErC,UAAM,cAAc,KAAK,SAAS,IAAI;AACtC,UAAM,IACF,gBAAgB,KAAK,iBAAiB,SAChC,eACA,KAAK,aAAa,GAAG,WAAW;AAC1C,QAAI,CAAC,OAAO,SAAS,CAAC;AAAG,aAAO,OAAO;AACvC,WAAO,IAAI,KAAK,QAAQ,CAAC;EAC7B;AACA,SAAO,MAAM,KAAK;AACtB;AAEA,SAASC,YAAW,MAAgB,KAAW;AAC3C,OAAK,aAAa,OAAO,GAAG;AAC5B,MAAI,KAAK,aAAa,SAAS,KAAK;AAAQ,WAAO,OAAO;AAC1D,SAAO,mBAAmB,IAAI;AAClC;AAEA,SAASC,WAAU,MAAgB,KAAW;AAC1C,MAAI,KAAK,aAAa,SAAS,KAAK;AAAQ,WAAO,OAAO;AAC1D,MAAI,CAAC,OAAO,SAAS,GAAG;AAAG,WAAO,OAAO;AACzC,SAAO,mBAAmB,MAAM,GAAG;AACvC;AAiCM,SAAU,KACZ,QACA,QACA,QACA,MAAe;AAEf,QAAM,MAAMH,QAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,UACH,QACA,MAAM,UAAU,gBAChB,MAAM,SAAS,eACf,IAAI,OAAO,MAAM,MAAM,QAAQ;AAEnC,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYE,WAAU,MAAM,GAAG,CAAC;EACnD,OAAO;AACH,SAAK,UAAU,OAAOD,YAAW,MAAM,GAAG,CAAC;EAC/C;AACA,SAAO,KAAK;AAChB;;;ACvIM,SAAU,iBACZ,UACA,UACA,YACA,SACA,UAAgB;AAEhB,MAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,CAAC,OAAO,SAAS,QAAQ,KAAK,WAAW,GAAG;AAC1E,WAAO,IAAI,aAAa,CAAC,UAAU,QAAQ,CAAC;EAChD;AACA,MAAI,YAAY;AAAU,WAAO,IAAI,aAAa,CAAC,UAAU,QAAQ,CAAC;AAEtE,MAAI,eAAe,eAAe;AAC9B,UAAM,cAAc,UAAU;AAC9B,QAAI,eAAe;AAAG,aAAO,IAAI,aAAa,CAAC,UAAU,QAAQ,CAAC;AAElE,UAAM,YAAY,KAAK,MAAM,WAAW,WAAW,IAAI;AACvD,UAAM,UAAU,KAAK,KAAK,WAAW,WAAW,IAAI;AACpD,UAAME,SAAQ,KAAK,IAAI,GAAG,KAAK,OAAO,UAAU,aAAa,WAAW,CAAC;AACzE,UAAMC,SAAQ,IAAI,aAAaD,SAAQ,CAAC;AACxC,aAAS,IAAI,GAAG,KAAKA,QAAO,KAAK;AAAG,MAAAC,OAAM,CAAC,IAAI,YAAY,IAAI;AAC/D,WAAOA;EACX;AAEA,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,CAAC;AAC7C,QAAM,SAAS,WAAW,YAAY;AACtC,QAAM,QAAQ,IAAI,aAAa,QAAQ,CAAC;AACxC,WAAS,IAAI,GAAG,KAAK,OAAO,KAAK;AAAG,UAAM,CAAC,IAAI,WAAW,IAAI;AAC9D,SAAO;AACX;;;ACJM,SAAU,wBACZ,MACA,aACA,aAAwB;AAExB,QAAM,cAAc,YAAY,SAAS;AACzC,MAAI,eAAe;AAAG,WAAO,EAAE,SAAS,CAAA,GAAI,QAAQ,IAAI,MAAM,CAAA,GAAI,aAAa,EAAC;AAEhF,QAAM,cAAc,IAAI,aAAa,WAAW;AAChD,QAAM,gBAAgB,IAAI,aAAa,WAAW;AAElD,aAAW,OAAO,MAAM;AACpB,UAAMC,OAAM,OAAO,SAAS,IAAI,MAAM,IAAI,IAAI,SAAS;AACvD,QAAIA,QAAO;AAAG;AAEd,UAAM,MAAM,IAAI;AAChB,UAAM,OAAO,IAAI;AAIjB,QAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,IAAI;AAAG;AACrD,QAAI,CAAC,OAAO,SAAS,IAAI,IAAI,KAAK,CAAC,OAAO,SAAS,IAAI,KAAK;AAAG;AAC/D,QAAI,QAAQ;AAAK;AAEjB,UAAM,OAAO,OAAO;AACpB,UAAM,OAAO,IAAI,SAAS,IAAI;AAE9B,aAAS,IAAI,GAAG,IAAI,aAAa,KAAK,GAAG;AACrC,YAAM,UAAU,YAAY,CAAC;AAC7B,YAAM,WAAW,YAAY,IAAI,CAAC;AAClC,UAAI,YAAY;AAAK;AACrB,UAAI,WAAW;AAAM;AAErB,YAAM,UAAU,KAAK,IAAI,UAAU,IAAI,IAAI,KAAK,IAAI,SAAS,GAAG;AAChE,UAAI,WAAW;AAAG;AAElB,YAAM,QAASA,OAAM,UAAW;AAChC,UAAI;AAAM,oBAAY,CAAC,KAAK;;AACvB,sBAAc,CAAC,KAAK;IAC7B;EACJ;AAEA,QAAM,OAAO,IAAI,MAAwB,WAAW;AACpD,QAAM,UAAU,IAAI,MAA2B,WAAW;AAC1D,MAAI,cAAc;AAClB,MAAI,SAAS;AACb,MAAI,YAAY;AAEhB,WAAS,IAAI,GAAG,IAAI,aAAa,KAAK,GAAG;AACrC,UAAM,QAAQ,YAAY,CAAC;AAC3B,UAAM,UAAU,cAAc,CAAC;AAC/B,UAAM,QAAQ,YAAY,OAAO,SAAS,WAAW;AACrD,UAAM,MAAM,YAAY,CAAC;AACzB,UAAM,OAAO,YAAY,IAAI,CAAC;AAC9B,UAAM,OAAO,MAAM,QAAQ;AAE3B,SAAK,CAAC,IAAI;MACN,YAAY,MAAM;MAClB;MACA;MACA;MACA,UAAU,MAAM;MAChB,QAAQ,MAAM;;AAElB,YAAQ,CAAC,IAAI,EAAE,OAAO,KAAK,QAAQ,MAAM,OAAM;AAC/C,mBAAe,MAAM;AACrB,QAAI,MAAM,SAAS,WAAW;AAC1B,kBAAY,MAAM;AAClB,eAAS;IACb;EACJ;AAEA,SAAO,EAAE,SAAS,QAAQ,MAAM,YAAW;AAC/C;AAEA,SAAS,YACL,OACA,SACA,aAAwB;AAExB,UAAQ,aAAa;IACjB,KAAK,SAAS;AACV,YAAM,SAAS,QAAQ;AACvB,aAAO,EAAE,YAAY,GAAG,UAAU,QAAQ,OAAM;IACpD;IACA,KAAK,SAAS;AACV,YAAM,WAAW,KAAK,IAAI,GAAG,QAAQ,OAAO;AAC5C,YAAM,aAAa,KAAK,IAAI,GAAG,UAAU,KAAK;AAC9C,aAAO,EAAE,YAAY,UAAU,QAAQ,WAAW,WAAU;IAChE;IACA,KAAK;AACD,aAAO,EAAE,YAAY,SAAS,UAAU,OAAO,QAAQ,QAAQ,QAAO;EAC9E;AACJ;;;ACkEO,IAAM,oBAAoB;;;ACxL3B,SAAU,iBACZ,MACA,eAAe,IACf,SAAiB,aAAa,IAAI,GAAC;AAEnC,MAAI,KAAK,WAAW,KAAK,SAAS,KAAK,UAAU,KAAK,QAAQ;AAC1D,WAAO;MACH,kBAAkB;MAClB,KAAK,OAAO;MACZ;MACA,QAAQ;MACR,SAAS,OAAO;MAChB,QAAQ;MACR,QAAQ,OAAO;;EAEvB;AAEA,QAAM,cAAc,KAAK,OAAO,CAAC,KAAK,QAAQ,MAAM,IAAI,QAAQ,CAAC;AACjE,QAAM,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,YAAY,CAAC;AACzD,QAAM,SAAS,eAAe,YAAY;AAC1C,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,aAAa,KAAK,MAAM,EAAE;AAE9B,SAAO,aAAa,WAAW,SAAS,KAAK,UAAU,IAAI,KAAK,SAAS;AACrE,UAAM,iBAAiB,UAAU,IAAI,KAAK;AAC1C,UAAM,iBAAiB,SAAS,KAAK;AAErC,QAAI,WAAW;AACf,QAAI,gBAAgB;AAChB,iBAAW,KAAK,UAAU,CAAC,EAAE;AAC7B,UAAI,UAAU,IAAI,KAAK;AAAQ,oBAAY,KAAK,UAAU,CAAC,EAAE;IACjE;AAEA,QAAI,WAAW;AACf,QAAI,gBAAgB;AAChB,iBAAW,KAAK,SAAS,CAAC,EAAE;AAC5B,UAAI,SAAS,KAAK;AAAG,oBAAY,KAAK,SAAS,CAAC,EAAE;IACtD;AAEA,QAAI,mBAAmB,CAAC,kBAAkB,YAAY,WAAW;AAC7D,YAAM,UAAU,UAAU,IAAI,KAAK;AACnC,oBAAc,KAAK,UAAU,CAAC,EAAE;AAChC,iBAAW;AACX,UAAI,WAAW,aAAa,QAAQ;AAChC,sBAAc,KAAK,UAAU,CAAC,EAAE;AAChC,mBAAW;MACf;IACJ,OAAO;AACH,YAAM,UAAU,SAAS,KAAK;AAC9B,oBAAc,KAAK,SAAS,CAAC,EAAE;AAC/B,gBAAU;AACV,UAAI,WAAW,aAAa,QAAQ;AAChC,sBAAc,KAAK,SAAS,CAAC,EAAE;AAC/B,kBAAU;MACd;IACJ;EACJ;AAEA,SAAO;IACH,kBAAkB;IAClB,KAAK,KAAK,MAAM,EAAE;IAClB;IACA,QAAQ;IACR,SAAS,KAAK,OAAO,EAAE;IACvB,QAAQ;IACR,QAAQ,KAAK,MAAM,EAAE;;AAE7B;AAEA,SAAS,aAAa,MAAqC;AACvD,MAAI,SAAS;AACb,MAAI,YAAY;AAChB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACrC,QAAI,KAAK,CAAC,EAAE,SAAS,WAAW;AAC5B,eAAS;AACT,kBAAY,KAAK,CAAC,EAAE;IACxB;EACJ;AACA,SAAO;AACX;;;ACvFA,IAAM,cAAc;AAad,SAAU,wBAAwB,MAMvC;AACG,QAAM,EAAE,UAAU,WAAW,eAAe,aAAa,OAAM,IAAK;AACpE,QAAM,YAAY,SAAS;AAC3B,QAAM,gBAAgB,IAAI,aAAa,SAAS;AAChD,QAAM,oBAAoB,IAAI,aAAa,SAAS;AACpD,QAAM,mBAAmB,IAAI,aAAa,SAAS;AACnD,gBAAc,KAAK,OAAO,GAAG;AAC7B,oBAAkB,KAAK,OAAO,GAAG;AACjC,mBAAiB,KAAK,OAAO,GAAG;AAChC,MAAI,cAAc;AAAG,WAAO,EAAE,eAAe,mBAAmB,iBAAgB;AAEhF,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,YAAY,GAAG,aAAa,CAAC;AAClE,QAAM,QAAQ,KAAK,IAAI,SAAS,KAAK,IAAI,YAAY,GAAG,WAAW,CAAC;AACpE,QAAM,SAAS,UAAU,SAAS,IAAI,YAAY;AAClD,QAAM,cAAc,eAAe,QAAQ,SAAS,OAAO,EAAE,IAAI;AACjE,MAAI,YAAY;AAEhB,WAAS,IAAI,SAAS,KAAK,OAAO,KAAK,GAAG;AACtC,WAAO,YAAY,OAAO,UAAU,OAAO,SAAS,EAAE,QAAQ,SAAS,CAAC,EAAE;AACtE,mBAAa;AACjB,UAAM,QAAQ,OAAO,MAAM,aAAa,SAAS;AACjD,QAAI,MAAM,UAAU;AAAa;AAEjC,UAAM,EAAE,UAAU,SAAQ,IAAK,iBAAiB,KAAK;AACrD,UAAM,QAAQ,iBACV,UACA,UACA,OAAO,cAAc,gBACrB,OAAO,SACP,OAAO,YAAY,iBAAiB;AAExC,UAAM,aAAa,wBAAwB,OAAO,OAAO,OAAO,eAAe,QAAQ;AACvF,QAAI,WAAW,eAAe;AAAG;AAEjC,UAAM,YAAY,iBAAiB,WAAW,MAAM,OAAO,cAAc,WAAW,MAAM;AAC1F,kBAAc,CAAC,IAAI,UAAU;AAC7B,sBAAkB,CAAC,IAAI,UAAU;AACjC,qBAAiB,CAAC,IAAI,UAAU;EACpC;AAEA,SAAO,EAAE,eAAe,mBAAmB,iBAAgB;AAC/D;AAEA,SAAS,eAAe,MAAuC,QAAc;AACzE,MAAI,KAAK;AACT,MAAI,KAAK,KAAK;AACd,SAAO,KAAK,IAAI;AACZ,UAAM,MAAO,KAAK,OAAQ;AAC1B,QAAI,KAAK,GAAG,EAAE,OAAO;AAAQ,WAAK,MAAM;;AACnC,WAAK;EACd;AACA,SAAO;AACX;AAaM,SAAU,iBAAiB,MAA2D;AAIxF,MAAI,WAAW,OAAO;AACtB,MAAI,WAAW,OAAO;AACtB,aAAW,OAAO,MAAM;AAIpB,QAAI,CAAC,OAAO,SAAS,IAAI,GAAG,KAAK,CAAC,OAAO,SAAS,IAAI,IAAI;AAAG;AAC7D,QAAI,IAAI,MAAM;AAAU,iBAAW,IAAI;AACvC,QAAI,IAAI,OAAO;AAAU,iBAAW,IAAI;EAC5C;AACA,MAAI,aAAa,OAAO;AAAmB,WAAO,EAAE,UAAU,GAAG,UAAU,EAAC;AAC5E,SAAO,EAAE,UAAU,SAAQ;AAC/B;;;AC9FO,IAAM,iCAAiC;AAYvC,IAAM,6BAA6B;AAcpC,SAAU,wBAAwB,MAQvC;AACG,MAAI,KAAK,mBAAmB,gCAAgC;AACxD,WAAO,EAAE,OAAO,MAAM,QAAQ,uBAAuB,oBAAoB,KAAI;EACjF;AAEA,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,WAAW,oBAAoB,IAAI;AACzC,MAAI,SAAS,SAAS,eAAe,SAAS,cAAc,YAAY;AACpE,WAAO;MACH,OAAO;MACP,QAAQ;MACR,oBACI,KAAK,eAAe,gBACd,KAAK,MACA,SAAS,WAAW,SAAS,aACzB,aAAa,SAAS,SAAS,IAExC,KAAK,IAAI,GAAG,UAAU;;EAExC;AAEA,SAAO,EAAE,OAAO,OAAO,QAAQ,MAAM,oBAAoB,KAAI;AACjE;AAEA,SAAS,oBAAoB,MAM5B;AAUG,QAAM,EAAE,UAAU,UAAU,QAAO,IAAK;AACxC,MACI,YAAY,UACZ,aAAa,UACb,aAAa,UACb,CAAC,OAAO,SAAS,QAAQ,KACzB,CAAC,OAAO,SAAS,QAAQ,KACzB,WAAW,KACX,YAAY,UACd;AACE,WAAO,EAAE,aAAa,GAAG,MAAM,UAAS;EAC5C;AACA,QAAM,WAAW,KAAK,YAAY;AAClC,MAAI,KAAK,eAAe,eAAe;AACnC,UAAM,QAAQ,UAAU;AACxB,WAAO,QAAQ,IACT;MACI,aAAa,KAAK,MAAM,WAAW,YAAY,KAAK;MACpD,MAAM;MACN;MACA;MACA;MACA;QAEJ,EAAE,aAAa,GAAG,MAAM,UAAS;EAC3C;AACA,SAAO;IACH,aAAa,KAAK,MAAM,OAAO;IAC/B,MAAM;IACN;IACA;IACA;IACA;;AAER;;;ACnGM,SAAU,eAAe,MAO9B;AACG,QAAM,EAAE,UAAU,OAAM,IAAK;AAC7B,QAAM,YAAY,KAAK,aAAa,CAAA;AACpC,MAAI,SAAS,WAAW;AAAG,WAAO,aAAa,OAAO,MAAM,IAAI;AAEhE,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,SAAS,GAAG,KAAK,aAAa,CAAC;AAC7E,QAAM,QAAQ,KAAK,IAAI,SAAS,KAAK,IAAI,SAAS,SAAS,GAAG,KAAK,WAAW,CAAC;AAC/E,QAAM,YAAY,SAAS,MAAM,SAAS,QAAQ,CAAC;AAEnD,QAAM,aAAa,gBACf,WACA,UAAU,CAAC,EAAE,MACb,UAAU,UAAU,SAAS,CAAC,EAAE,IAAI;AAExC,QAAM,eAAe,WAAW,SAAS,IAAI,aAAa;AAC1D,QAAM,QAAQ,iBAAiB,YAAY;AAC3C,QAAM,aAAa,wBAAwB;IACvC,kBAAkB,WAAW;IAC7B,UAAU,MAAM;IAChB,UAAU,MAAM;IAChB,SAAS,OAAO;IAChB,YAAY,OAAO,cAAc;IACjC,UAAU,OAAO,YAAY;GAChC;AACD,MAAI,WAAW;AACX,WAAO,aAAa,WAAW,OAAO,WAAW,QAAQ,WAAW,kBAAkB;AAC1F,MAAI,MAAM,YAAY,MAAM;AAAU,WAAO,aAAa,OAAO,MAAM,IAAI;AAE3E,QAAM,QAAQ,iBACV,MAAM,UACN,MAAM,UACN,OAAO,cAAc,gBACrB,OAAO,SACP,OAAO,YAAY,iBAAiB;AAExC,QAAM,aAAa,wBAAwB,cAAc,OAAO,OAAO,eAAe,QAAQ;AAC9F,MAAI,WAAW,eAAe;AAAG,WAAO,aAAa,OAAO,MAAM,IAAI;AAEtE,QAAM,YAAY,iBAAiB,WAAW,MAAM,OAAO,cAAc,WAAW,MAAM;AAC1F,QAAM,gBAAgB,IAAI,aAAa,WAAW,KAAK,MAAM;AAC7D,QAAM,KAAK,KAAK,IAAI,UAAU,QAAQ,UAAU,MAAM;AACtD,QAAM,KAAK,KAAK,IAAI,UAAU,QAAQ,UAAU,MAAM;AACtD,WAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAAG,kBAAc,CAAC,IAAI,KAAK,MAAM,KAAK,KAAK,IAAI;AAE9F,QAAM,OAAO;IACT,SAAS,WAAW;IACpB;IACA,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,SAAS,UAAU;IACnB,QAAQ,UAAU;IAClB;;AAGJ,MAAI,KAAK,sBAAsB,MAAM;AACjC,WAAO;MACH,GAAG;MACH,YAAY,wBAAwB;QAChC;QACA;QACA;QACA,eAAe;QACf,aAAa;OAChB;;EAET;AAEA,SAAO;AACX;AAEA,SAAS,aACL,OACA,QACA,oBAAiC;AAEjC,SAAO;IACH,SAAS,CAAA;IACT,YAAY,EAAE,OAAO,QAAQ,mBAAkB;IAC/C,KAAK,OAAO;IACZ,MAAM,CAAA;IACN,SAAS,OAAO;IAChB,QAAQ,OAAO;IACf,eAAe,IAAI,aAAa,CAAC;;AAEzC;AAaM,SAAU,gBACZ,MACA,YACA,UAAgB;AAEhB,MAAI,KAAK,WAAW;AAAG,WAAO;AAC9B,QAAM,QAAQC,gBAAe,MAAM,UAAU;AAC7C,QAAM,MAAM,eAAe,MAAM,QAAQ;AACzC,MAAI,SAAS;AAAK,WAAO,CAAA;AACzB,SAAO,KAAK,MAAM,OAAO,GAAG;AAChC;AAEA,SAASA,gBAAe,MAAuC,QAAc;AACzE,MAAI,KAAK;AACT,MAAI,KAAK,KAAK;AACd,SAAO,KAAK,IAAI;AACZ,UAAM,MAAO,KAAK,OAAQ;AAC1B,QAAI,KAAK,GAAG,EAAE,OAAO;AAAQ,WAAK,MAAM;;AACnC,WAAK;EACd;AACA,SAAO;AACX;AAEA,SAAS,eAAe,MAAuC,QAAc;AACzE,MAAI,KAAK;AACT,MAAI,KAAK,KAAK;AACd,SAAO,KAAK,IAAI;AACZ,UAAM,MAAO,KAAK,OAAQ;AAC1B,QAAI,KAAK,GAAG,EAAE,QAAQ;AAAQ,WAAK,MAAM;;AACpC,WAAK;EACd;AACA,SAAO;AACX;;;AC7FA,IAAM,mBAAmB;AACzB,IAAM,yBAAyB;AAC/B,IAAM,wBAAwB;AAcxB,SAAU,wBAAwB,UAAgB;AACpD,SAAO;IACH,SAAS,CAAA;IACT,WAAW,IAAI,kBAAkB,QAAQ;IACzC,eAAe,IAAI,kBAAkB,QAAQ;IAC7C,cAAc,IAAI,kBAAkB,QAAQ;;AAEpD;AAgBM,SAAU,4BAA4B,MAG3C;AACG,QAAM,UAAU,KAAK;AACrB,QAAM,eAAe,KAAK,gBAAgB;AAC1C,SAAO;IACH,SAAS,YAAY,UAAa,WAAW,IAAI,mBAAmB;IACpE,cAAc,gBAAgB,IAAI,eAAe,MAAM;;AAE/D;AAgBM,SAAU,wBACZ,MACA,aAA+B;AAE/B,MAAI,cAAc;AAClB,MAAI,QAAQ,OAAO;AACnB,aAAW,OAAO,MAAM;AACpB,QAAI,CAAC,OAAO,SAAS,IAAI,KAAK;AAAG;AACjC,YAAQ,IAAI;AACZ,QAAI,OAAO,SAAS,IAAI,MAAM,KAAK,IAAI,SAAS;AAAG,qBAAe,IAAI;EAC1E;AACA,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,eAAe;AAAG,WAAO;AACxD,QAAM,SACF,gBAAgB,SACV,EAAE,OAAO,QAAQ,YAAW,IAC5B,EAAE,OAAO,QAAQ,aAAa,OAAO,YAAW;AAC1D,SAAO;IACH,SAAS,CAAC,MAAM;IAChB,KAAK;IACL,SAAS;IACT,QAAQ;;AAEhB;AAcM,SAAU,6BAA0B;AACtC,SAAO;IACH,SAAS,CAAA;IACT,KAAK,OAAO;IACZ,SAAS,OAAO;IAChB,QAAQ,OAAO;;AAEvB;AAcM,SAAU,6BAA6B,MAI5C;AACG,QAAM,EAAE,MAAM,QAAQ,YAAW,IAAK;AACtC,QAAM,UACF,KAAK,WAAW,IACV,OACA,eAAe;IACX;IACA,UAAU;IACV,eAAe;IACf,aAAa,KAAK,SAAS;GAC9B;AACX,MAAI,YAAY,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAChD,WAAO;MACH,SAAS,QAAQ,QAAQ,IAAI,CAAC,WAC1B,gBAAgB,SAAY,SAAS,EAAE,GAAG,QAAQ,OAAO,YAAW,CAAE;MAE1E,KAAK,QAAQ;MACb,SAAS,QAAQ;MACjB,QAAQ,QAAQ;;EAExB;AACA,SAAO,wBAAwB,MAAM,WAAW,KAAK,2BAA0B;AACnF;AAcM,SAAU,4BACZ,MACA,QACAC,WAA+B;AAE/B,OAAK,UAAUA,UAAS;AACxB,MAAI,QAAQ;AACR,SAAK,UAAU,YAAYA,UAAS,GAAG;AACvC,SAAK,cAAc,YAAYA,UAAS,OAAO;AAC/C,SAAK,aAAa,YAAYA,UAAS,MAAM;EACjD,OAAO;AACH,SAAK,UAAU,OAAOA,UAAS,GAAG;AAClC,SAAK,cAAc,OAAOA,UAAS,OAAO;AAC1C,SAAK,aAAa,OAAOA,UAAS,MAAM;EAC5C;AACJ;AAiBM,SAAU,2BACZ,KACA,QACA,OACA,OACA,SAAuC;AAEvC,MAAI,CAAC,IAAI,aAAa,MAAM,IAAI,sBAAsB,GAAG;AACrD,UAAM,MAAM,yBAAyB,MAAM;AAC3C,QAAI,IAAI,qBAAqB,IAAI,GAAG;AAAG;AACvC,QAAI,qBAAqB,IAAI,GAAG;AAChC,mBAAe,IAAI,WAAW;MAC1B,MAAM;MACN,UAAU;MACV,MAAM;MACN,SAAS;MACT;MACA,KAAK,IAAI,SAAQ;KACpB;AACD;EACJ;AACA,QAAM,WAAyB;IAC3B,KAAK,IAAI,SAAQ;IACjB,OAAO;IACP,MAAM;IACN,MAAM,CAAA;IACN,MAAM;IACN,QAAQ,GAAG,MAAM,GAAG,qBAAqB;IACzC,OAAO,EAAE,MAAM,wBAAwB,QAAO;IAC9C,MAAM,IAAI,OAAO,IAAI;IACrB;IACA,OAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;;AAE5C,WAAS,IAAI,WAAW,QAAQ;AACpC;;;AC1QA,SAASC,UAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,+DAA+D;EACnF;AACA,SAAO;AACX;AAEA,SAASC,UAAS,UAAgB;AAC9B,QAAM,OAAO,wBAAwB,QAAQ;AAC7C,QAAM,OAAyC;IAC3C,GAAG;IACH,QAAQ,OAAO,OAAO;MAClB,IAAI,UAAO;AACP,eAAO,KAAK;MAChB;MACA,KAAK,eAAuB,KAAK,SAAS;MAC1C,SAAS,eAAuB,KAAK,aAAa;MAClD,QAAQ,eAAuB,KAAK,YAAY;KACnD;IACD,gBAAgB,oBAAI,IAAG;;AAE3B,SAAO;AACX;AAEA,SAAS,gBACL,MACA,QAAc;AAEd,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,SAAS,KAAK,eAAe,IAAI,MAAM;AAC3C,MAAI,WAAW,QAAW;AACtB,aAAS,OAAO,OAAO;MACnB,IAAI,UAAO;AACP,eAAO,KAAK;MAChB;MACA,KAAK,sBAA8B,KAAK,WAAW,MAAM;MACzD,SAAS,sBAA8B,KAAK,eAAe,MAAM;MACjE,QAAQ,sBAA8B,KAAK,cAAc,MAAM;KAClE;AACD,SAAK,eAAe,IAAI,QAAQ,MAAM;EAC1C;AACA,SAAO;AACX;AAEA,SAAS,YAAY,KAAqB,QAAc;AACpD,MAAI,IAAI,OAAO,IAAI,QAAQ;AAAQ,WAAO,CAAA;AAE1C,QAAM,EAAE,MAAK,IAAK,IAAI;AACtB,QAAM,OAA2B,CAAA;AACjC,WAAS,WAAW,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,YAAY,GAAG;AACtE,UAAM,OAAO,MAAM,KAAK,GAAG,QAAQ;AACnC,QAAI,OAAO;AAAQ;AACnB,SAAK,KAAK;MACN,OAAO,MAAM,MAAM,GAAG,QAAQ;MAC9B,MAAM,MAAM,KAAK,GAAG,QAAQ;MAC5B,KAAK,MAAM,IAAI,GAAG,QAAQ;MAC1B,MAAM,MAAM,KAAK,GAAG,QAAQ;MAC5B;MACA,QAAQ,MAAM,OAAO,GAAG,QAAQ;KACnC;EACL;AACA,SAAO;AACX;AAqBM,SAAU,sBACZ,QACA,MAA+B;AAE/B,QAAM,MAAMD,QAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,UAAS,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/C,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AAEA,QAAMC,YAAW,6BAA6B;IAC1C,MAAM,YAAY,KAAK,KAAK,MAAM;IAClC,aAAa,KAAK;IAClB,QAAQ,4BAA4B,IAAI;GAC3C;AACD,8BAA4B,MAAM,IAAI,QAAQA,SAAQ;AACtD,6BACI,KACA,QACA,2BACAA,UAAS,KACTA,UAAS,OAAO;AAEpB,SAAO,gBAAgB,MAAM,KAAK,UAAU,CAAC;AACjD;;;AC1HA,IAAM,iBAAqC;AAqB3C,SAASC,UAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,sDAAsD;EAC1E;AACA,SAAO;AACX;AAEA,SAASC,UAAS,UAAkB,YAAkB;AAClD,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,OAAO;IACP,MAAM;IACN,SAAS;IACT,iBAAiB;IACjB,gBAAgB;IAChB,mBAAmB;;AAE3B;AAEA,SAAS,WAAW,KAAqB,QAA0B;AAC/D,UAAQ,QAAQ;IACZ,KAAK;AACD,aAAO,IAAI,OAAO,IAAI;IAC1B,KAAK;AACD,aAAO,IAAI,OAAO,IAAI;IAC1B,KAAK;AACD,aAAO,IAAI,OAAO,IAAI;IAC1B,KAAK;AACD,aAAO,IAAI,OAAO,IAAI;IAC1B,KAAK;AACD,aAAO,IAAI,OAAO,IAAI;EAC9B;AACJ;AASA,SAAS,KACL,SACA,QACA,WACA,YACA,MACA,KACA,QAAc;AAEd,MAAI,OAAO,YAAY;AACnB,WAAO,EAAE,OAAO,SAAS,MAAM,QAAQ,SAAS,UAAS;EAC7D;AACA,MAAI,QAAQ;AACZ,MAAI,OAAO;AACX,MAAI,OAAO,SAAS,GAAG,KAAK,OAAO,SAAS,MAAM,KAAK,SAAS,GAAG;AAC/D,aAAS,MAAM;AACf,YAAQ;EACZ;AACA,SAAO,EAAE,OAAO,MAAM,SAAS,KAAI;AACvC;AAEA,SAAS,aAAa,SAAkB,OAAe,MAAY;AAC/D,MAAI,CAAC,WAAW,SAAS;AAAG,WAAO,OAAO;AAC1C,SAAO,QAAQ;AACnB;AAmCM,SAAU,aACZ,QACA,YACA,MAAuB;AAEvB,QAAM,MAAMD,QAAM;AAClB,QAAM,SAAS,MAAM,UAAU;AAC/B,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,UAAS,IAAI,OAAO,MAAM,MAAM,UAAU,UAAU;AAC3D,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,WAAW,KAAK,MAAM;AAClC,QAAM,SAAS,IAAI,OAAO,IAAI;AAC9B,QAAM,OAAO,IAAI,OAAO,IAAI;AAE5B,MAAI,IAAI,QAAQ;AACZ,UAAMC,QAAO,KACT,KAAK,iBACL,KAAK,gBACL,KAAK,mBACL,KAAK,YACL,MACA,KACA,MAAM;AAEV,SAAK,UAAU,YAAY,aAAaA,MAAK,SAASA,MAAK,OAAOA,MAAK,IAAI,CAAC;AAC5E,WAAO,KAAK;EAChB;AAGA,OAAK,kBAAkB,KAAK;AAC5B,OAAK,iBAAiB,KAAK;AAC3B,OAAK,oBAAoB,KAAK;AAC9B,QAAM,OAAO,KAAK,KAAK,OAAO,KAAK,MAAM,KAAK,SAAS,KAAK,YAAY,MAAM,KAAK,MAAM;AACzF,OAAK,QAAQ,KAAK;AAClB,OAAK,OAAO,KAAK;AACjB,OAAK,UAAU,KAAK;AACpB,OAAK,UAAU,OAAO,aAAa,KAAK,SAAS,KAAK,OAAO,KAAK,IAAI,CAAC;AACvE,SAAO,KAAK;AAChB;;;AC/IA,SAASC,UAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,UAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH,MAAM;IACN;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,QAAQ,IAAI,kBAAkB,MAAM;IACpC,KAAK;IACL,cAAc,oBAAI,IAAG;;AAE7B;AAEA,SAASC,eAAc,MAAe,QAAc;AAChD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA8B,KAAK,WAAW,MAAM;AAC3D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAEA,SAASC,WAAU,MAAe,KAAW;AAIzC,MAAI,CAAC,OAAO,SAAS,GAAG;AAAG,WAAO,OAAO;AACzC,MAAI,KAAK,OAAO,SAAS,KAAK;AAAQ,WAAO,OAAO;AACpD,QAAM,eAAe,KAAK,OAAO,GAAG,CAAC;AACrC,UAAQ,KAAK,MAAM,eAAe,OAAO,KAAK;AAClD;AAEA,SAASC,YAAW,MAAe,KAAW;AAC1C,MAAI,CAAC,OAAO,SAAS,GAAG,GAAG;AAIvB,QAAI,KAAK,OAAO,SAAS,KAAK;AAAQ,aAAO,OAAO;AACpD,WAAO,KAAK,MAAM,KAAK;EAC3B;AACA,MAAI,KAAK,OAAO,SAAS,KAAK,QAAQ;AAClC,SAAK,OAAO,OAAO,GAAG;AACtB,SAAK,OAAO;AACZ,QAAI,KAAK,OAAO,SAAS,KAAK;AAAQ,aAAO,OAAO;AACpD,WAAO,KAAK,MAAM,KAAK;EAC3B;AACA,QAAM,WAAW,KAAK,OAAO,GAAG,KAAK,SAAS,CAAC;AAC/C,OAAK,OAAO,OAAO,GAAG;AACtB,OAAK,MAAM,KAAK,MAAM,MAAM;AAC5B,SAAO,KAAK,MAAM,KAAK;AAC3B;AAqBM,SAAU,IACZ,QACA,QACA,QACA,MAAc;AAEd,QAAM,MAAMJ,QAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,UAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYE,WAAU,MAAM,GAAG,CAAC;EACnD,OAAO;AACH,SAAK,UAAU,OAAOC,YAAW,MAAM,GAAG,CAAC;EAC/C;AACA,SAAOF,eAAc,MAAM,MAAM,UAAU,CAAC;AAChD;;;AC7HA,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAS5B,SAASG,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,4CAA4C;EAChE;AACA,SAAO;AACX;AAEA,SAASC,UAAS,UAAkB,QAAc;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC,YAAY,GAAG,MAAM;IACrB,YAAY,GAAG,MAAM;;AAE7B;AAEA,SAAS,QAAQ,MAAc,MAAY;AACvC,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,IAAI;AAAG,WAAO,OAAO;AACpE,SAAO,OAAO;AAClB;AAoBM,SAAU,GAAG,QAAgB,MAAa;AAC5C,QAAM,MAAMD,SAAM;AAClB,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,aAAa,MAAM,cAAc;AACvC,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,UAAS,IAAI,OAAO,MAAM,MAAM,UAAU,MAAM;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,IAAI,OAAO,IAAI;AAC3B,QAAM,aAAa,IAAI,KAAK,YAAY,KAAK,UAAU;AACvD,QAAM,aAAa,IAAI,KAAK,YAAY,KAAK,UAAU;AACvD,QAAM,QAAQ,QAAQ,WAAW,SAAS,WAAW,OAAO;AAC5D,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAY,KAAK;EACpC,OAAO;AACH,SAAK,UAAU,OAAO,KAAK;EAC/B;AACA,SAAO,KAAK;AAChB;;;AC1CA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,+CAA+C;EACnE;AACA,SAAO;AACX;AAEA,SAASC,UAAS,QAAgB,UAAgB;AAC9C,QAAM,WAAW,IAAI,kBAAkB,QAAQ;AAC/C,QAAM,aAAa,IAAI,kBAAkB,QAAQ;AACjD,SAAO;IACH,SAAS,OAAO,OAAO;MACnB,IAAI,eAAuB,QAAQ;MACnC,MAAM,eAAuB,UAAU;KAC1C;IACD;IACA;IACA;IACA,YAAY,IAAI,kBAAkB,SAAS,CAAC;IAC5C,WAAW,IAAI,kBAAkB,SAAS,CAAC;IAC3C,UAAU;IACV,eAAe;IACf,cAAc;;AAEtB;AAaA,SAAS,eAAe,QAA2B,UAAkB,QAAc;AAC/E,MAAI,UAAU;AACd,MAAI,UAAU,OAAO;AACrB,MAAI,OAAO,SAAS,QAAQ,GAAG;AAC3B,cAAU;AACV,cAAU;EACd;AACA,WAAS,IAAI,GAAG,KAAK,QAAQ,KAAK,GAAG;AACjC,UAAM,IAAI,OAAO,GAAG,CAAC;AACrB,QAAI,OAAO,SAAS,CAAC,KAAK,IAAI,SAAS;AACnC,gBAAU;AACV,gBAAU;IACd;EACJ;AACA,SAAO;AACX;AAEA,SAAS,cAAc,QAA2B,SAAiB,QAAc;AAC7E,MAAI,UAAU;AACd,MAAI,UAAU,OAAO;AACrB,MAAI,OAAO,SAAS,OAAO,GAAG;AAC1B,cAAU;AACV,cAAU;EACd;AACA,WAAS,IAAI,GAAG,KAAK,QAAQ,KAAK,GAAG;AACjC,UAAM,IAAI,OAAO,GAAG,CAAC;AACrB,QAAI,OAAO,SAAS,CAAC,KAAK,IAAI,SAAS;AACnC,gBAAU;AACV,gBAAU;IACd;EACJ;AACA,SAAO;AACX;AAEA,SAASC,WAAU,MAAiB,MAAc,KAAW;AACzD,OAAK,YAAY;AACjB,OAAK,WAAW,OAAO,IAAI;AAC3B,OAAK,UAAU,OAAO,GAAG;AAKzB,MAAI,KAAK,YAAY,KAAK,QAAQ;AAC9B,WAAO,EAAE,IAAI,OAAO,KAAK,MAAM,OAAO,IAAG;EAC7C;AAEA,QAAM,gBAAgB,eAAe,KAAK,YAAY,KAAK,WAAW,GAAG,CAAC,GAAG,KAAK,MAAM;AACxF,QAAM,eAAe,cAAc,KAAK,WAAW,KAAK,UAAU,GAAG,CAAC,GAAG,KAAK,MAAM;AACpF,MAAI,kBAAkB,MAAM,iBAAiB,IAAI;AAC7C,WAAO,EAAE,IAAI,OAAO,KAAK,MAAM,OAAO,IAAG;EAC7C;AACA,OAAK,gBAAgB;AACrB,OAAK,eAAe;AACpB,QAAM,KAAM,OAAO,KAAK,SAAS,iBAAkB,KAAK;AACxD,QAAM,OAAQ,OAAO,KAAK,SAAS,gBAAiB,KAAK;AACzD,SAAO,EAAE,IAAI,KAAI;AACrB;AAEA,SAAS,SAAS,MAAiB,MAAc,KAAW;AACxD,MAAI,KAAK,YAAY,KAAK;AAAQ,WAAO,EAAE,IAAI,OAAO,KAAK,MAAM,OAAO,IAAG;AAK3E,QAAM,gBAAgB,eAAe,KAAK,YAAY,MAAM,KAAK,MAAM;AACvE,QAAM,eAAe,cAAc,KAAK,WAAW,KAAK,KAAK,MAAM;AACnE,MAAI,kBAAkB,MAAM,iBAAiB,IAAI;AAC7C,WAAO,EAAE,IAAI,OAAO,KAAK,MAAM,OAAO,IAAG;EAC7C;AACA,QAAM,KAAM,OAAO,KAAK,SAAS,iBAAkB,KAAK;AACxD,QAAM,OAAQ,OAAO,KAAK,SAAS,gBAAiB,KAAK;AACzD,SAAO,EAAE,IAAI,KAAI;AACrB;AAyBM,SAAU,MAAM,QAAgB,QAAgB,OAAiB;AACnE,QAAM,MAAMF,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,UAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,OAAO,IAAI,OAAO,IAAI;AAC5B,QAAM,MAAM,IAAI,OAAO,IAAI;AAC3B,MAAI,IAAI,QAAQ;AACZ,UAAM,EAAE,IAAI,KAAI,IAAK,SAAS,MAAM,MAAM,GAAG;AAC7C,SAAK,SAAS,YAAY,EAAE;AAC5B,SAAK,WAAW,YAAY,IAAI;EACpC,OAAO;AACH,UAAM,EAAE,IAAI,KAAI,IAAKC,WAAU,MAAM,MAAM,GAAG;AAC9C,SAAK,SAAS,OAAO,EAAE;AACvB,SAAK,WAAW,OAAO,IAAI;EAC/B;AACA,SAAO,KAAK;AAChB;;;AC7KA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,kDAAkD;EACtE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAgB;AAC9B,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;;AAEhD;AAkBM,SAAU,SAAS,QAAgB,QAAgB,OAAoB;AACzE,QAAM,MAAMD,SAAM;AAIlB,QAAM,IAAI,MAAM,GAAG,MAAM,UAAU,MAAM;AAEzC,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/C,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,KAAK,EAAE,GAAG;AAChB,QAAM,OAAO,EAAE,KAAK;AACpB,QAAM,QAAQ,OAAO,SAAS,EAAE,KAAK,OAAO,SAAS,IAAI,IAAI,KAAK,OAAO,OAAO;AAChF,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAY,KAAK;EACpC,OAAO;AACH,SAAK,UAAU,OAAO,KAAK;EAC/B;AACA,SAAO,KAAK;AAChB;;;ACvCA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,WAAW;IACX,SAAS;IACT,KAAK,OAAO;IACZ,WAAW,OAAO;IAClB,eAAe,OAAO;IACtB,eAAe,OAAO;IACtB,cAAc,oBAAI,IAAG;;AAE7B;AAEA,SAASC,eAAc,MAAe,QAAc;AAChD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA8B,KAAK,WAAW,MAAM;AAC3D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAEA,SAASC,WAAU,MAAc,KAAa,WAAiB;AAC3D,MAAI,CAAC,OAAO,SAAS,SAAS;AAAG,WAAO,OAAO;AAC/C,SAAO,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,SAAS,GAAG,KAAK,IAAI,MAAM,SAAS,CAAC;AACrF;AAEA,SAASC,YAAW,MAAe,MAAc,KAAa,OAAa;AACvE,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AAC5E,QAAI,OAAO,SAAS,KAAK,GAAG;AAAG,aAAO,KAAK;AAC3C,WAAO,OAAO;EAClB;AACA,QAAM,KAAKD,WAAU,MAAM,KAAK,KAAK,SAAS;AAC9C,OAAK,gBAAgB,KAAK;AAC1B,OAAK,YAAY;AACjB,OAAK,WAAW;AAEhB,MAAI,KAAK,UAAU,KAAK,QAAQ;AAC5B,SAAK,aAAa;AAClB,WAAO,OAAO;EAClB;AACA,MAAI,KAAK,YAAY,KAAK,QAAQ;AAC9B,SAAK,aAAa;AAClB,SAAK,MAAM,KAAK,YAAY,KAAK;AACjC,SAAK,gBAAgB,KAAK;AAC1B,WAAO,KAAK;EAChB;AACA,OAAK,gBAAgB,KAAK;AAC1B,OAAK,MAAM,WAAW,KAAK,KAAK,IAAI,KAAK,MAAM;AAC/C,SAAO,KAAK;AAChB;AAEA,SAASE,WAAU,MAAe,MAAc,KAAa,OAAa;AACtE,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AAC5E,WAAO,OAAO,SAAS,KAAK,GAAG,IAAI,KAAK,MAAM,OAAO;EACzD;AACA,MAAI,KAAK,UAAU,KAAK;AAAQ,WAAO,OAAO;AAG9C,QAAM,KAAKF,WAAU,MAAM,KAAK,KAAK,aAAa;AAClD,MAAI,KAAK,YAAY,KAAK,QAAQ;AAG9B,WAAO,KAAK;EAChB;AACA,SAAO,WAAW,KAAK,eAAe,IAAI,KAAK,MAAM;AACzD;AAwBM,SAAU,IAAI,QAAgB,QAAgB,MAAc;AAC9D,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,IAAI,OAAO;AACvB,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYI,WAAU,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC;EAC5E,OAAO;AACH,SAAK,UAAU,OAAOD,YAAW,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC;EACxE;AACA,SAAOF,eAAc,MAAM,MAAM,UAAU,CAAC;AAChD;;;AChIA,SAASI,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,mDAAmD;EACvE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAgB;AAC9B,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC,eAAe,oBAAI,IAAG;IACtB,WAAW;IACX,UAAU;IACV,eAAe;IACf,cAAc;;AAEtB;AAEA,SAASC,YAAW,MAAqB,OAAc;AACnD,OAAK,gBAAgB,KAAK;AAC1B,OAAK,eAAe,KAAK;AACzB,MAAI,OAAO;AACP,SAAK,YAAY;AACjB,SAAK,WAAW;EACpB,WAAW,KAAK,UAAU;AACtB,SAAK,aAAa;EACtB;AACA,SAAO,KAAK,WAAW,KAAK,YAAY,OAAO;AACnD;AAEA,SAASC,WAAU,MAAqB,OAAc;AAElD,MAAI,YAAY,KAAK;AACrB,MAAI,WAAW,KAAK;AACpB,MAAI,OAAO;AACP,gBAAY;AACZ,eAAW;EACf,WAAW,UAAU;AACjB,iBAAa;EACjB;AACA,SAAO,WAAW,YAAY,OAAO;AACzC;AAoBM,SAAU,UACZ,QACA,WACA,OAAsB,CAAA,GAAE;AAExB,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/C,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,QAAQ,UAAU,YAAY;AACpC,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYE,WAAU,MAAM,KAAK,CAAC;EACrD,OAAO;AACH,SAAK,UAAU,OAAOD,YAAW,MAAM,KAAK,CAAC;EACjD;AACA,QAAM,SAAS,KAAK,UAAU;AAC9B,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,QAAM,UAAU,KAAK,cAAc,IAAI,MAAM;AAC7C,MAAI,YAAY;AAAW,WAAO;AAClC,QAAM,OAAO,sBAA8B,KAAK,WAAW,MAAM;AACjE,OAAK,cAAc,IAAI,QAAQ,IAAI;AACnC,SAAO;AACX;;;ACpFA,SAASE,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,+CAA+C;EACnE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAkB,QAAe;AAC/D,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA;IACA,QAAQ,IAAI,kBAAkB,MAAM;IACpC,MAAM;IACN,OAAO;IACP,cAAc,oBAAI,IAAG;;AAE7B;AAEA,SAASC,eAAc,MAAiB,QAAc;AAClD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA8B,KAAK,WAAW,MAAM;AAC3D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAEA,SAAS,YAAY,MAAe;AAChC,SAAO,KAAK,SAAS,KAAK,SAAS,KAAK,SAAS;AACrD;AAEA,SAAS,eAAe,MAAc,OAAe,MAAe;AAChE,QAAM,QAAQ,YAAY,IAAI;AAC9B,MAAI,SAAS;AAAG,WAAO,OAAO;AAC9B,QAAM,OAAO,OAAO,KAAK;AACzB,QAAM,YAAY,QAAQ,KAAK,SAAS,OAAO,QAAQ;AAEvD,SAAO,KAAK,KAAK,KAAK,IAAI,GAAG,QAAQ,CAAC;AAC1C;AAEA,SAASC,YAAW,MAAiB,KAAW;AAC5C,MAAI,CAAC,OAAO,SAAS,GAAG,GAAG;AACvB,QAAI,KAAK,OAAO,SAAS,KAAK;AAAQ,aAAO,OAAO;AACpD,WAAO,eAAe,KAAK,MAAM,KAAK,OAAO,IAAI;EACrD;AACA,MAAI,KAAK,OAAO,SAAS,KAAK,QAAQ;AAClC,SAAK,OAAO,OAAO,GAAG;AACtB,SAAK,QAAQ;AACb,SAAK,SAAS,MAAM;AACpB,QAAI,KAAK,OAAO,SAAS,KAAK;AAAQ,aAAO,OAAO;AACpD,WAAO,eAAe,KAAK,MAAM,KAAK,OAAO,IAAI;EACrD;AACA,QAAM,WAAW,KAAK,OAAO,GAAG,KAAK,SAAS,CAAC;AAC/C,OAAK,OAAO,OAAO,GAAG;AACtB,OAAK,OAAO,KAAK,OAAO,MAAM;AAC9B,OAAK,QAAQ,KAAK,QAAQ,MAAM,MAAM,WAAW;AACjD,SAAO,eAAe,KAAK,MAAM,KAAK,OAAO,IAAI;AACrD;AAEA,SAASC,WAAU,MAAiB,KAAW;AAC3C,MAAI,CAAC,OAAO,SAAS,GAAG;AAAG,WAAO,OAAO;AACzC,MAAI,KAAK,OAAO,SAAS,KAAK;AAAQ,WAAO,OAAO;AACpD,QAAM,eAAe,KAAK,OAAO,GAAG,CAAC;AACrC,QAAM,OAAO,KAAK,OAAO,eAAe;AACxC,QAAM,QAAQ,KAAK,QAAQ,eAAe,eAAe,MAAM;AAC/D,SAAO,eAAe,MAAM,OAAO,IAAI;AAC3C;AAuBM,SAAU,MACZ,QACA,QACA,QACA,MAAgB;AAEhB,QAAM,MAAMJ,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,UAAM,SAAS,MAAM,WAAW;AAChC,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,UAAU,MAAM;AAC/D,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYG,WAAU,MAAM,GAAG,CAAC;EACnD,OAAO;AACH,SAAK,UAAU,OAAOD,YAAW,MAAM,GAAG,CAAC;EAC/C;AACA,SAAOD,eAAc,MAAM,MAAM,UAAU,CAAC;AAChD;;;AC3HA,IAAM,qBAAqB;AAsB3B,SAASG,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,4CAA4C;EAChE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAkB,QAAwB,WAA4B;AACpF,QAAM,QAAQ,IAAI,kBAAkB,QAAQ;AAC5C,QAAM,QAAQ,IAAI,kBAAkB,QAAQ;AAC5C,QAAM,YAAY,eAAuB,KAAK;AAC9C,QAAM,YAAY,eAAuB,KAAK;AAC9C,SAAO;IACH,QAAQ,OAAO,OAAO,EAAE,OAAO,WAAW,QAAQ,OAAO,UAAS,CAAE;IACpE;IACA;IACA;IACA;IACA,gBAAgB,oBAAI,IAAG;;AAE/B;AAEA,SAASC,iBAAgB,MAAc,QAAc;AACjD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,SAAS,KAAK,eAAe,IAAI,MAAM;AAC3C,MAAI,WAAW,QAAW;AACtB,aAAS,OAAO,OAAO;MACnB,OAAO,sBAA8B,KAAK,OAAO,MAAM;MACvD,QAAQ,sBAA8B,KAAK,WAAW,MAAM;MAC5D,OAAO,sBAA8B,KAAK,OAAO,MAAM;KAC1D;AACD,SAAK,eAAe,IAAI,QAAQ,MAAM;EAC1C;AACA,SAAO;AACX;AA0BM,SAAU,GACZ,QACA,QACA,QACA,MAAa;AAEb,QAAM,MAAMF,SAAM;AAClB,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,MAAM,gBAAgB,MAAM;AAClC,QAAM,eAAe,GAAG,MAAM;AAC9B,QAAM,cAAc,GAAG,MAAM;AAM7B,QAAM,eAAe,IAAI,cAAc,KAAK,MAAM;AAGlD,QAAM,cAAc,MAAM,aAAa,KAAK,QAAQ,EAAE,QAAQ,KAAI,CAAE;AAEpE,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AAGpB,UAAM,UAAU,IAAI,OAAO,QAAQ,IAAI,YAAY;AACnD,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,UAAU,cAAc,QAAQ,SAAS;AAChF,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AAEA,QAAM,MAAM,aAAa;AACzB,QAAM,QAAQ,YAAY;AAC1B,MAAI;AACJ,MAAI;AACJ,MAAI,OAAO,SAAS,GAAG,KAAK,OAAO,SAAS,KAAK,GAAG;AAChD,iBAAa,MAAM,aAAa;AAChC,iBAAa,MAAM,aAAa;EACpC,OAAO;AACH,iBAAa,OAAO;AACpB,iBAAa,OAAO;EACxB;AACA,MAAI,IAAI,QAAQ;AACZ,SAAK,MAAM,YAAY,UAAU;AACjC,SAAK,MAAM,YAAY,UAAU;EACrC,OAAO;AACH,SAAK,MAAM,OAAO,UAAU;AAC5B,SAAK,MAAM,OAAO,UAAU;EAChC;AACA,SAAOC,iBAAgB,MAAM,MAAM,UAAU,CAAC;AAClD;;;ACrIA,IAAMC,sBAAqB;AAU3B,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,oDAAoD;EACxE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,YAAoB,UAAgB;AAClE,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA;IACA,OAAO;;AAEf;AAEA,SAAS,cAAc,KAAa,OAAe,OAAa;AAC5D,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AAC7E,WAAO,OAAO;EAClB;AACA,QAAM,QAAQ,QAAQ;AACtB,MAAI,UAAU;AAAG,WAAO,OAAO;AAC/B,UAAQ,MAAM,SAAS;AAC3B;AAqBM,SAAU,WACZ,QACA,QACA,QACA,MAAqB;AAErB,QAAM,MAAMD,SAAM;AAClB,QAAM,aAAa,MAAM,cAAcD;AACvC,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOE,WAAS,QAAQ,YAAY,IAAI,OAAO,MAAM,MAAM,QAAQ;AACnE,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,QAAM,QAAQ,GAAG,GAAG,MAAM,OAAO,QAAQ,QAAQ,EAAE,WAAU,CAAE;AAC/D,MAAI,KAAK,UAAU;AAAM,SAAK,QAAQ;AACtC,QAAM,QAAQ,cAAc,KAAK,MAAM,MAAM,SAAS,MAAM,MAAM,OAAO;AACzE,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAY,KAAK;EACpC,OAAO;AACH,SAAK,UAAU,OAAO,KAAK;EAC/B;AACA,SAAO,KAAK;AAChB;;;AC9EA,IAAMC,sBAAqB;AAU3B,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,YAAoB,UAAgB;AAClE,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA;IACA,OAAO;;AAEf;AAEA,SAAS,SAAS,OAAe,QAAgB,OAAa;AAC1D,MACI,CAAC,OAAO,SAAS,KAAK,KACtB,CAAC,OAAO,SAAS,MAAM,KACvB,CAAC,OAAO,SAAS,KAAK,KACtB,WAAW,GACb;AACE,WAAO,OAAO;EAClB;AACA,UAAQ,QAAQ,SAAS;AAC7B;AAqBM,SAAU,IACZ,QACA,QACA,QACA,MAAc;AAEd,QAAM,MAAMD,SAAM;AAClB,QAAM,aAAa,MAAM,cAAcD;AACvC,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOE,WAAS,QAAQ,YAAY,IAAI,OAAO,MAAM,MAAM,QAAQ;AACnE,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,QAAQ,GAAG,GAAG,MAAM,OAAO,QAAQ,QAAQ,EAAE,WAAU,CAAE;AAC/D,MAAI,KAAK,UAAU;AAAM,SAAK,QAAQ;AACtC,QAAM,QAAQ,SAAS,MAAM,MAAM,SAAS,MAAM,OAAO,SAAS,MAAM,MAAM,OAAO;AACrF,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAY,KAAK;EACpC,OAAO;AACH,SAAK,UAAU,OAAO,KAAK;EAC/B;AACA,SAAO,KAAK;AAChB;;;AChFA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAgB;AAC9B,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO,EAAE,WAAW,QAAQ,eAAuB,SAAS,EAAC;AACjE;AAEA,SAAS,MAAM,MAAc,MAAc,KAAa,OAAa;AACjE,MACI,CAAC,OAAO,SAAS,IAAI,KACrB,CAAC,OAAO,SAAS,IAAI,KACrB,CAAC,OAAO,SAAS,GAAG,KACpB,CAAC,OAAO,SAAS,KAAK,GACxB;AACE,WAAO,OAAO;EAClB;AACA,QAAM,QAAQ,OAAO;AACrB,MAAI,UAAU;AAAG,WAAO;AACxB,UAAQ,QAAQ,QAAQ;AAC5B;AAqBM,SAAU,IAAI,QAAgB,OAAe;AAC/C,QAAM,MAAMD,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/C,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,EAAE,MAAM,MAAM,KAAK,MAAK,IAAK,IAAI,OAAO;AAC9C,QAAM,QAAQ,MAAM,MAAM,MAAM,KAAK,KAAK;AAC1C,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAY,KAAK;EACpC,OAAO;AACH,SAAK,UAAU,OAAO,KAAK;EAC/B;AACA,SAAO,KAAK;AAChB;;;ACjEA,IAAM,UAAU;AAahB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,oBAAoB,IAAI,kBAAkB,MAAM;IAChD,OAAO;IACP,OAAO;;AAEf;AAEA,SAAS,cAAc,QAAgB,WAAmB,SAAe;AACrE,MAAI,YAAY;AAAG,WAAO,OAAO;AACjC,UAAQ,YAAY,WAAW,UAAU;AAC7C;AAEA,SAAS,WAAW,QAA2B,QAAgB,QAAc;AACzE,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;AAChC,UAAM,IAAI,OAAO,GAAG,CAAC;AACrB,UAAM,MAAM,IAAI;AAChB,cAAU,MAAM,IAAI,CAAC,MAAM;EAC/B;AACA,SAAO,SAAS;AACpB;AAEA,SAASC,YAAW,MAAe,KAAW;AAC1C,MAAI,CAAC,OAAO,SAAS,GAAG,GAAG;AAGvB,QAAI,KAAK,QAAQ,KAAK;AAAQ,aAAO,OAAO;AAC5C,UAAMC,UAAS,KAAK,QAAQ,KAAK;AACjC,UAAM,YAAY,KAAK,mBAAmB,GAAG,CAAC;AAK9C,QAAI,CAAC,OAAO,SAAS,SAAS;AAAG,aAAO,OAAO;AAC/C,UAAMC,MAAK,WAAW,KAAK,oBAAoBD,SAAQ,KAAK,MAAM;AAClE,WAAO,cAAcA,SAAQ,WAAWC,GAAE;EAC9C;AACA,MAAI,KAAK,QAAQ,KAAK,QAAQ;AAC1B,SAAK,mBAAmB,OAAO,GAAG;AAClC,SAAK,SAAS;AACd,SAAK,SAAS;AACd,QAAI,KAAK,QAAQ,KAAK;AAAQ,aAAO,OAAO;AAC5C,UAAMD,UAAS,KAAK,QAAQ,KAAK;AACjC,UAAMC,MAAK,WAAW,KAAK,oBAAoBD,SAAQ,KAAK,MAAM;AAClE,WAAO,cAAcA,SAAQ,KAAKC,GAAE;EACxC;AACA,QAAM,WAAW,KAAK,mBAAmB,GAAG,KAAK,SAAS,CAAC;AAC3D,OAAK,mBAAmB,OAAO,GAAG;AAClC,OAAK,QAAQ,KAAK,QAAQ,MAAM;AAChC,QAAM,SAAS,KAAK,QAAQ,KAAK;AACjC,QAAM,KAAK,WAAW,KAAK,oBAAoB,QAAQ,KAAK,MAAM;AAClE,SAAO,cAAc,QAAQ,KAAK,EAAE;AACxC;AAEA,SAASC,WAAU,MAAe,KAAW;AACzC,MAAI,KAAK,QAAQ,KAAK;AAAQ,WAAO,OAAO;AAC5C,MAAI,CAAC,OAAO,SAAS,GAAG,GAAG;AAEvB,UAAMF,UAAS,KAAK,QAAQ,KAAK;AACjC,UAAM,YAAY,KAAK,mBAAmB,GAAG,CAAC;AAI9C,QAAI,CAAC,OAAO,SAAS,SAAS;AAAG,aAAO,OAAO;AAC/C,UAAMC,MAAK,WAAW,KAAK,oBAAoBD,SAAQ,KAAK,MAAM;AAClE,WAAO,cAAcA,SAAQ,WAAWC,GAAE;EAC9C;AAEA,QAAM,YAAY,KAAK,mBAAmB,GAAG,CAAC;AAC9C,QAAM,cAAc,KAAK,QAAQ,YAAY;AAC7C,QAAM,SAAS,cAAc,KAAK;AAClC,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACrC,UAAM,IAAI,MAAM,IAAI,MAAM,KAAK,mBAAmB,GAAG,CAAC;AACtD,UAAM,MAAM,IAAI;AAChB,cAAU,MAAM,IAAI,CAAC,MAAM;EAC/B;AACA,QAAM,KAAK,SAAS,KAAK;AACzB,SAAO,cAAc,QAAQ,KAAK,EAAE;AACxC;AAuBM,SAAU,IACZ,QACA,QACA,QACA,OAAe;AAEf,QAAM,MAAMJ,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYI,WAAU,MAAM,GAAG,CAAC;EACnD,OAAO;AACH,SAAK,UAAU,OAAOH,YAAW,MAAM,GAAG,CAAC;EAC/C;AACA,SAAO,KAAK;AAChB;;;ACtIA,SAASI,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH,MAAM;IACN;IACA,QAAQ,eAAuB,SAAS;IACxC,OAAO,KAAK,SAAS;IACrB;IACA,SAAS;IACT,WAAW;IACX,SAAS,OAAO;IAChB,eAAe,OAAO;IACtB,cAAc,oBAAI,IAAG;;AAE7B;AAEA,SAASC,eAAc,MAAe,QAAc;AAChD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA8B,KAAK,WAAW,MAAM;AAC3D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAEA,SAAS,QAAQ,MAAe,KAAa,QAAe;AACxD,MAAI,CAAC,OAAO,SAAS,GAAG,GAAG;AACvB,WAAO,SAAS,KAAK,UAAU,KAAK;EACxC;AACA,MAAI,KAAK,YAAY,KAAK,QAAQ;AAC9B,QAAI,QAAQ;AACR,YAAM,UAAU,KAAK,UAAU;AAC/B,YAAM,YAAY,KAAK,YAAY;AACnC,UAAI,YAAY,KAAK;AAAQ,eAAO,OAAO;AAC3C,aAAO,UAAU,KAAK;IAC1B;AACA,SAAK,WAAW;AAChB,SAAK,aAAa;AAClB,QAAI,KAAK,YAAY,KAAK,QAAQ;AAC9B,WAAK,gBAAgB,OAAO;AAC5B,aAAO,OAAO;IAClB;AACA,UAAM,YAAY,KAAK,UAAU,KAAK;AACtC,SAAK,gBAAgB;AACrB,SAAK,UAAU;AACf,WAAO;EACX;AACA,QAAM,OAAO,KAAK;AAClB,QAAM,OAAO,MAAM,KAAK,QAAQ,QAAQ,IAAI,KAAK;AACjD,MAAI,CAAC,QAAQ;AACT,SAAK,gBAAgB;AACrB,SAAK,UAAU;EACnB;AACA,SAAO;AACX;AAyBM,SAAU,IACZ,QACA,QACA,QACA,MAAc;AAEd,QAAM,MAAMF,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,QAAQ,QAAQ,MAAM,gBAAgB,MAAM,GAAG,IAAI,MAAM;AAC/D,MAAI,IAAI;AAAQ,SAAK,UAAU,YAAY,KAAK;;AAC3C,SAAK,UAAU,OAAO,KAAK;AAChC,SAAOC,eAAc,MAAM,MAAM,UAAU,CAAC;AAChD;;;ACpHA,IAAM,eAAe;AACrB,IAAM,eAAe;AAQrB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,oDAAoD;EACxE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAgB;AAC9B,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC,cAAc,oBAAI,IAAG;;AAE7B;AAEA,SAASC,eAAc,MAAsB,QAAc;AACvD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA8B,KAAK,WAAW,MAAM;AAC3D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAEA,SAAS,KAAK,MAAc,MAAY;AACpC,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,IAAI;AAAG,WAAO,OAAO;AACpE,SAAO,OAAO;AAClB;AAgCM,SAAU,WAAW,QAAgB,MAAqB;AAC5D,QAAM,MAAMF,SAAM;AAClB,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,SAAS,MAAM,UAAU;AAE/B,QAAM,YAAY,IAAI,GAAG,MAAM,MAAM;AACrC,QAAM,aAAa,IAAI,GAAG,MAAM,SAAS,UAAU,SAAS,UAAU;AACtE,QAAM,aAAa,IAAI,GAAG,MAAM,SAAS,UAAU,SAAS,UAAU;AAEtE,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/C,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,QAAQ,KAAK,WAAW,SAAS,WAAW,OAAO;AACzD,MAAI,IAAI;AAAQ,SAAK,UAAU,YAAY,KAAK;;AAC3C,SAAK,UAAU,OAAO,KAAK;AAChC,SAAOC,eAAc,MAAM,MAAM;AACrC;;;ACrEA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,iDAAiD;EACrE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,cAAc,IAAI,kBAAkB,MAAM;IAC1C,aAAa,CAAA;IACb,YAAY,CAAA;IACZ,UAAU;IACV,wBAAwB,OAAO;;AAEvC;AAEA,SAAS,0BAA0B,MAAiB;AAIhD,MAAI,OAAO,OAAO;AAClB,QAAM,SAAS,KAAK,aAAa;AACjC,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;AAChC,UAAM,IAAI,KAAK,aAAa,GAAG,CAAC;AAChC,QAAI,OAAO,SAAS,CAAC,KAAK,IAAI;AAAM,aAAO;EAC/C;AACA,SAAO;AACX;AAEA,SAASC,YAAW,MAAmB,KAAW;AAC9C,OAAK,YAAY;AACjB,QAAM,YAAY,KAAK,WAAW;AAClC,OAAK,aAAa,OAAO,GAAG;AAG5B,QAAM,gBAAgB,YAAY,KAAK,SAAS;AAChD,SAAO,KAAK,YAAY,SAAS,KAAK,KAAK,YAAY,CAAC,IAAI,eAAe;AACvE,SAAK,YAAY,MAAK;AACtB,SAAK,WAAW,MAAK;EACzB;AAEA,MAAI,OAAO,SAAS,GAAG,GAAG;AAItB,WAAO,KAAK,YAAY,SAAS,KAAK,KAAK,WAAW,KAAK,WAAW,SAAS,CAAC,IAAI,KAAK;AACrF,WAAK,YAAY,IAAG;AACpB,WAAK,WAAW,IAAG;IACvB;AACA,SAAK,YAAY,KAAK,SAAS;AAC/B,SAAK,WAAW,KAAK,GAAG;EAC5B;AAKA,MAAI,KAAK,WAAW,KAAK,QAAQ;AAC7B,SAAK,yBAAyB,OAAO;AACrC,WAAO,OAAO;EAClB;AAEA,OAAK,yBAAyB,0BAA0B,IAAI;AAE5D,MAAI,KAAK,YAAY,WAAW,GAAG;AAE/B,WAAO,OAAO;EAClB;AACA,SAAO,KAAK,WAAW,CAAC;AAC5B;AAEA,SAASC,WAAU,MAAmB,KAAW;AAE7C,MAAI,KAAK,WAAW,KAAK;AAAQ,WAAO,OAAO;AAC/C,MAAI,CAAC,OAAO,SAAS,GAAG,GAAG;AAGvB,WAAO,KAAK,2BAA2B,OAAO,oBACxC,OAAO,MACP,KAAK;EACf;AACA,MAAI,KAAK,2BAA2B,OAAO,mBAAmB;AAI1D,WAAO;EACX;AACA,SAAO,KAAK,IAAI,KAAK,wBAAwB,GAAG;AACpD;AAmBM,SAAU,QACZ,QACA,QACA,QACA,OAAmB;AAEnB,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYE,WAAU,MAAM,GAAG,CAAC;EACnD,OAAO;AACH,SAAK,UAAU,OAAOD,YAAW,MAAM,GAAG,CAAC;EAC/C;AACA,SAAO,KAAK;AAChB;;;AC9IA,SAASE,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,gDAAgD;EACpE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,cAAc,IAAI,kBAAkB,MAAM;IAC1C,aAAa,CAAA;IACb,YAAY,CAAA;IACZ,UAAU;IACV,wBAAwB,OAAO;;AAEvC;AAEA,SAAS,0BAA0B,MAAgB;AAC/C,MAAI,OAAO,OAAO;AAClB,QAAM,SAAS,KAAK,aAAa;AACjC,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;AAChC,UAAM,IAAI,KAAK,aAAa,GAAG,CAAC;AAChC,QAAI,OAAO,SAAS,CAAC,KAAK,IAAI;AAAM,aAAO;EAC/C;AACA,SAAO;AACX;AAEA,SAASC,YAAW,MAAkB,KAAW;AAC7C,OAAK,YAAY;AACjB,QAAM,YAAY,KAAK,WAAW;AAClC,OAAK,aAAa,OAAO,GAAG;AAE5B,QAAM,gBAAgB,YAAY,KAAK,SAAS;AAChD,SAAO,KAAK,YAAY,SAAS,KAAK,KAAK,YAAY,CAAC,IAAI,eAAe;AACvE,SAAK,YAAY,MAAK;AACtB,SAAK,WAAW,MAAK;EACzB;AAEA,MAAI,OAAO,SAAS,GAAG,GAAG;AAEtB,WAAO,KAAK,YAAY,SAAS,KAAK,KAAK,WAAW,KAAK,WAAW,SAAS,CAAC,IAAI,KAAK;AACrF,WAAK,YAAY,IAAG;AACpB,WAAK,WAAW,IAAG;IACvB;AACA,SAAK,YAAY,KAAK,SAAS;AAC/B,SAAK,WAAW,KAAK,GAAG;EAC5B;AAEA,MAAI,KAAK,WAAW,KAAK,QAAQ;AAC7B,SAAK,yBAAyB,OAAO;AACrC,WAAO,OAAO;EAClB;AAEA,OAAK,yBAAyB,0BAA0B,IAAI;AAE5D,MAAI,KAAK,YAAY,WAAW;AAAG,WAAO,OAAO;AACjD,SAAO,KAAK,WAAW,CAAC;AAC5B;AAEA,SAASC,WAAU,MAAkB,KAAW;AAC5C,MAAI,KAAK,WAAW,KAAK;AAAQ,WAAO,OAAO;AAC/C,MAAI,CAAC,OAAO,SAAS,GAAG,GAAG;AACvB,WAAO,KAAK,2BAA2B,OAAO,oBACxC,OAAO,MACP,KAAK;EACf;AACA,MAAI,KAAK,2BAA2B,OAAO,mBAAmB;AAC1D,WAAO;EACX;AACA,SAAO,KAAK,IAAI,KAAK,wBAAwB,GAAG;AACpD;AAkBM,SAAU,OACZ,QACA,QACA,QACA,OAAkB;AAElB,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYE,WAAU,MAAM,GAAG,CAAC;EACnD,OAAO;AACH,SAAK,UAAU,OAAOD,YAAW,MAAM,GAAG,CAAC;EAC/C;AACA,SAAO,KAAK;AAChB;;;ACnHA,IAAME,kBAAiB;AACvB,IAAMC,sBAAqB;AAC3B,IAAMC,qBAAoB;AAoB1B,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,yDAAyD;EAC7E;AACA,SAAO;AACX;AAEA,SAASC,WACL,UACA,QACA,YACA,iBAAuB;AAEvB,QAAM,aAAa,IAAI,kBAAkB,QAAQ;AACjD,QAAM,cAAc,IAAI,kBAAkB,QAAQ;AAClD,SAAO;IACH,SAAS,OAAO,OAAO;MACnB,MAAM,eAAuB,UAAU;MACvC,OAAO,eAAuB,WAAW;KAC5C;IACD;IACA;IACA;IACA;IACA;IACA,iBAAiB,IAAI,kBAAkB,eAAe;IACtD,gBAAgB,IAAI,kBAAkB,eAAe;IACrD,UAAU;;AAElB;AAEA,SAAS,UACL,IACA,IACA,UACA,YAAkB;AAElB,MAAI,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,OAAO,SAAS,QAAQ,GAAG;AAC5E,WAAO,EAAE,WAAW,OAAO,KAAK,UAAU,OAAO,IAAG;EACxD;AACA,SAAO;IACH,WAAW,KAAK,aAAa;IAC7B,UAAU,KAAK,aAAa;;AAEpC;AAOA,SAAS,QACL,QACA,cACA,sBACA,iBAAuB;AAEvB,MAAI,OAAO,OAAO;AAClB,MAAI,OAAO,SAAS,YAAY;AAAG,WAAO;AAC1C,QAAM,WAAW,uBAAuB,IAAI;AAC5C,QAAM,SAAS,OAAO;AACtB,WAAS,IAAI,UAAU,IAAI,UAAU,IAAI,iBAAiB,KAAK,GAAG;AAC9D,UAAM,IAAI,OAAO,GAAG,CAAC;AACrB,QAAI,OAAO,SAAS,CAAC,KAAK,IAAI;AAAM,aAAO;EAC/C;AACA,SAAO,SAAS,OAAO,oBAAoB,OAAO,MAAM;AAC5D;AAEA,SAAS,QACL,QACA,cACA,sBACA,iBAAuB;AAEvB,MAAI,OAAO,OAAO;AAClB,MAAI,OAAO,SAAS,YAAY;AAAG,WAAO;AAC1C,QAAM,WAAW,uBAAuB,IAAI;AAC5C,QAAM,SAAS,OAAO;AACtB,WAAS,IAAI,UAAU,IAAI,UAAU,IAAI,iBAAiB,KAAK,GAAG;AAC9D,UAAM,IAAI,OAAO,GAAG,CAAC;AACrB,QAAI,OAAO,SAAS,CAAC,KAAK,IAAI;AAAM,aAAO;EAC/C;AACA,SAAO,SAAS,OAAO,oBAAoB,OAAO,MAAM;AAC5D;AAmCM,SAAU,gBAAgB,QAAgB,MAA0B;AACtE,QAAM,MAAMD,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,UAAM,SAAS,MAAM,UAAUH;AAC/B,UAAM,aAAa,MAAM,cAAcC;AACvC,UAAM,kBAAkB,MAAM,mBAAmBC;AACjD,WAAOE,WAAS,IAAI,OAAO,MAAM,MAAM,UAAU,QAAQ,YAAY,eAAe;AACpF,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,IAAI,OAAO;AAIvB,QAAM,YAAY,IAAI,GAAG,MAAM,QAAQ,KAAK,MAAM;AAClD,QAAM,aAAa,QAAQ,GAAG,MAAM,aAAa,IAAI,MAAM,KAAK,MAAM;AACtE,QAAM,YAAY,OAAO,GAAG,MAAM,WAAW,IAAI,KAAK,KAAK,MAAM;AAEjE,QAAM,EAAE,WAAW,SAAQ,IAAK,UAC5B,WAAW,SACX,UAAU,SACV,UAAU,SACV,KAAK,UAAU;AAGnB,MAAI,IAAI,QAAQ;AAGZ,UAAM,OAAO,QAAQ,KAAK,iBAAiB,WAAW,MAAM,KAAK,eAAe;AAChF,UAAM,QAAQ,QAAQ,KAAK,gBAAgB,UAAU,MAAM,KAAK,eAAe;AAM/E,UAAM,OAAO,KAAK,YAAY,KAAK;AACnC,SAAK,WAAW,YAAY,OAAO,OAAO,OAAO,GAAG;AACpD,SAAK,YAAY,YAAY,OAAO,QAAQ,OAAO,GAAG;EAC1D,OAAO;AACH,SAAK,gBAAgB,OAAO,SAAS;AACrC,SAAK,eAAe,OAAO,QAAQ;AACnC,SAAK,YAAY;AASjB,UAAM,OAAO,KAAK,YAAY,KAAK,SAAS,KAAK,kBAAkB;AACnE,QAAI,CAAC,MAAM;AACP,WAAK,WAAW,OAAO,OAAO,GAAG;AACjC,WAAK,YAAY,OAAO,OAAO,GAAG;IACtC,OAAO;AAEH,YAAM,OAAO,QAAQ,KAAK,iBAAiB,OAAO,KAAK,OAAO,KAAK,eAAe;AAClF,YAAM,QAAQ,QAAQ,KAAK,gBAAgB,OAAO,KAAK,OAAO,KAAK,eAAe;AAClF,WAAK,WAAW,OAAO,IAAI;AAC3B,WAAK,YAAY,OAAO,KAAK;IACjC;EACJ;AACA,SAAO,KAAK;AAChB;;;AC/MA,IAAMC,kBAAiB;AACvB,IAAMC,sBAAqB;AAU3B,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,oDAAoD;EACxE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAkB,QAAgB,YAAkB;AAClE,QAAM,aAAa,IAAI,kBAAkB,QAAQ;AACjD,QAAM,cAAc,IAAI,kBAAkB,QAAQ;AAClD,SAAO;IACH,SAAS,OAAO,OAAO;MACnB,MAAM,eAAuB,UAAU;MACvC,OAAO,eAAuB,WAAW;KAC5C;IACD;IACA;IACA;IACA;;AAER;AAEA,SAASC,SACL,IACA,IACA,UACA,YAAkB;AAElB,MAAI,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,OAAO,SAAS,QAAQ,GAAG;AAC5E,WAAO,EAAE,MAAM,OAAO,KAAK,OAAO,OAAO,IAAG;EAChD;AACA,SAAO;IACH,MAAM,KAAK,aAAa;IACxB,OAAO,KAAK,aAAa;;AAEjC;AAmCM,SAAU,WAAW,QAAgB,MAAqB;AAC5D,QAAM,MAAMF,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,UAAM,SAAS,MAAM,UAAUF;AAC/B,UAAM,aAAa,MAAM,cAAcC;AACvC,WAAOE,WAAS,IAAI,OAAO,MAAM,MAAM,UAAU,QAAQ,UAAU;AACnE,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,IAAI,OAAO;AAIvB,QAAM,YAAY,IAAI,GAAG,MAAM,QAAQ,KAAK,MAAM;AAClD,QAAM,aAAa,QAAQ,GAAG,MAAM,aAAa,IAAI,MAAM,KAAK,MAAM;AACtE,QAAM,YAAY,OAAO,GAAG,MAAM,WAAW,IAAI,KAAK,KAAK,MAAM;AAEjE,QAAM,SAASC,SACX,WAAW,SACX,UAAU,SACV,UAAU,SACV,KAAK,UAAU;AAEnB,MAAI,IAAI,QAAQ;AACZ,SAAK,WAAW,YAAY,OAAO,IAAI;AACvC,SAAK,YAAY,YAAY,OAAO,KAAK;EAC7C,OAAO;AACH,SAAK,WAAW,OAAO,OAAO,IAAI;AAClC,SAAK,YAAY,OAAO,OAAO,KAAK;EACxC;AACA,SAAO,KAAK;AAChB;;;AChHA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,gDAAgD;EACpE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,cAAc,IAAI,kBAAkB,SAAS,CAAC;;AAEtD;AAEA,SAASC,aAAW,MAAkB,KAAW;AAC7C,OAAK,aAAa,OAAO,GAAG;AAC5B,MAAI,KAAK,aAAa,UAAU,KAAK;AAAQ,WAAO,OAAO;AAC3D,QAAM,OAAO,KAAK,aAAa,GAAG,CAAC;AACnC,QAAM,MAAM,KAAK,aAAa,GAAG,KAAK,MAAM;AAC5C,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,GAAG;AAAG,WAAO,OAAO;AACnE,SAAO,OAAO;AAClB;AAEA,SAASC,YAAU,MAAkB,KAAW;AAI5C,MAAI,KAAK,aAAa,UAAU,KAAK;AAAQ,WAAO,OAAO;AAI3D,QAAM,MAAM,KAAK,aAAa,GAAG,KAAK,MAAM;AAC5C,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,GAAG;AAAG,WAAO,OAAO;AAClE,SAAO,MAAM;AACjB;AAiBM,SAAU,OAAO,QAAgB,QAAwB,MAAiB;AAC5E,QAAM,MAAMH,SAAM;AAClB,QAAM,SAAS,MAAM,UAAU;AAC/B,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYE,YAAU,MAAM,GAAG,CAAC;EACnD,OAAO;AACH,SAAK,UAAU,OAAOD,aAAW,MAAM,GAAG,CAAC;EAC/C;AACA,SAAO,KAAK;AAChB;;;AClDA,SAASE,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,8CAA8C;EAClE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,MAAM,KAAK,MAAM,MAAM;IACvB,UAAU,IAAI,kBAAkB,MAAM;IACtC,OAAO;IACP,WAAW,OAAO;IAClB,eAAe,OAAO;IACtB,iBAAiB;IACjB,kBAAkB,OAAO;IACzB,qBAAqB,OAAO;IAC5B,UAAU;;AAElB;AAEA,SAASC,WAAU,MAAc,KAAa,WAAiB;AAC3D,MAAI,CAAC,OAAO,SAAS,SAAS;AAAG,WAAO,OAAO;AAC/C,SAAO,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,SAAS,GAAG,KAAK,IAAI,MAAM,SAAS,CAAC;AACrF;AAEA,SAAS,UAAU,MAAgB,OAAe,OAAa;AAC3D,MAAI,KAAK,WAAW,KAAK;AAAQ,WAAO,OAAO;AAK/C,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,SAAS,KAAK;AAAG,WAAO,OAAO;AACtE,QAAM,QAAQ,QAAQ;AAEtB,MAAI,SAAS;AAAG,WAAO,OAAO;AAE9B,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,KAAK,KAAK,SAAS;AAAG,WAAO,OAAO;AACnE,QAAM,MAAO,MAAM,KAAK,MAAM,KAAK,QAAQ,KAAK,IAAK,KAAK;AAK1D,MAAI,MAAM;AAAG,WAAO;AACpB,MAAI,MAAM;AAAK,WAAO;AACtB,SAAO;AACX;AAEA,SAASC,aACL,MACA,MACA,KACA,OACA,OACA,OAAa;AAEb,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AAE5E,WAAO,OAAO;EAClB;AACA,QAAM,KAAKD,WAAU,MAAM,KAAK,KAAK,SAAS;AAE9C,OAAK,kBAAkB,KAAK;AAC5B,QAAM,UACF,KAAK,SAAS,WAAW,KAAK,SAAS,KAAK,SAAS,GAAG,KAAK,SAAS,CAAC,IAAI,OAAO;AACtF,OAAK,sBAAsB;AAC3B,MAAI,OAAO,SAAS,OAAO;AAAG,SAAK,SAAS;AAC5C,OAAK,SAAS,OAAO,EAAE;AACvB,OAAK,SAAS;AACd,OAAK,mBAAmB;AACxB,OAAK,gBAAgB,KAAK;AAC1B,OAAK,YAAY;AACjB,OAAK,YAAY;AACjB,SAAO,UAAU,MAAM,OAAO,KAAK;AACvC;AAEA,SAASE,YACL,MACA,MACA,KACA,OACA,OACA,OAAa;AAEb,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AAC5E,WAAO,OAAO;EAClB;AAGA,MAAI,KAAK,aAAa;AAAG,WAAO,OAAO;AAIvC,QAAM,KAAKF,WAAU,MAAM,KAAK,KAAK,aAAa;AAElD,MAAI,WAAW,KAAK;AACpB,MAAI,OAAO,SAAS,KAAK,mBAAmB;AAAG,gBAAY,KAAK;AAChE,cAAY;AAEZ,QAAM,WAAW,KAAK;AACtB,OAAK,QAAQ;AACb,QAAM,QAAQ,UAAU,MAAM,OAAO,KAAK;AAC1C,OAAK,QAAQ;AACb,SAAO;AACX;AA4BM,SAAU,KAAK,QAAgB,QAAgB,OAAgB;AACjE,QAAM,MAAMF,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,IAAI,OAAO;AACvB,QAAM,cAAc,QAAQ,GAAG,MAAM,YAAY,IAAI,MAAM,MAAM;AACjE,QAAM,cAAc,OAAO,GAAG,MAAM,WAAW,IAAI,KAAK,MAAM;AAC9D,QAAM,QAAQ,YAAY;AAC1B,QAAM,QAAQ,YAAY;AAC1B,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYG,YAAU,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,OAAO,KAAK,CAAC;EAC1F,OAAO;AACH,SAAK,UAAU,OAAOD,aAAW,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,OAAO,KAAK,CAAC;EACtF;AACA,SAAO,KAAK;AAChB;;;ACtKA,SAASE,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,WAAW,IAAI,kBAAkB,MAAM;IACvC,WAAW,IAAI,kBAAkB,MAAM;IACvC,QAAQ;IACR,QAAQ;;AAEhB;AAOA,SAASC,OAAM,OAAe,MAAc,KAAa,QAAc;AACnE,MACI,CAAC,OAAO,SAAS,KAAK,KACtB,CAAC,OAAO,SAAS,IAAI,KACrB,CAAC,OAAO,SAAS,GAAG,KACpB,CAAC,OAAO,SAAS,MAAM,GACzB;AACE,WAAO;EACX;AACA,QAAM,QAAQ,OAAO;AAIrB,MAAI,UAAU;AAAG,WAAO;AACxB,QAAM,OAAO,QAAQ,OAAO,OAAO,UAAU;AAC7C,SAAO,MAAM;AACjB;AAGA,SAAS,QAAQ,QAAc;AAC3B,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC9C;AAEA,SAASC,MAAK,QAAgB,QAAgB,OAAc;AACxD,MAAI,CAAC,SAAS,WAAW;AAAG,WAAO,OAAO;AAC1C,SAAO,SAAS;AACpB;AAyBM,SAAU,IAAI,QAAgB,QAAgB,OAAe;AAC/D,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,EAAE,OAAO,MAAM,KAAK,OAAM,IAAK,IAAI,OAAO;AAChD,QAAM,MAAMC,OAAM,OAAO,MAAM,KAAK,MAAM;AAC1C,QAAME,OAAM,QAAQ,MAAM;AAE1B,MAAI,IAAI,QAAQ;AAIZ,QAAI,KAAK,UAAU,SAAS,KAAK,QAAQ;AACrC,WAAK,UAAU,YAAY,OAAO,GAAG;AACrC,aAAO,KAAK;IAChB;AACA,UAAM,UAAU,KAAK,UAAU,GAAG,CAAC;AACnC,UAAM,UAAU,KAAK,UAAU,GAAG,CAAC;AACnC,UAAM,SAAS,KAAK,SAAS,UAAU;AACvC,UAAM,SAAS,KAAK,SAAS,UAAUA;AACvC,SAAK,UAAU,YAAYD,MAAK,QAAQ,QAAQ,IAAI,CAAC;AACrD,WAAO,KAAK;EAChB;AAIA,MAAI,KAAK,UAAU,WAAW,KAAK,QAAQ;AACvC,SAAK,UAAU,KAAK,UAAU,GAAG,KAAK,SAAS,CAAC;AAChD,SAAK,UAAU,KAAK,UAAU,GAAG,KAAK,SAAS,CAAC;EACpD;AACA,OAAK,UAAU,OAAO,GAAG;AACzB,OAAK,UAAU,OAAOC,IAAG;AACzB,OAAK,UAAU;AACf,OAAK,UAAUA;AACf,OAAK,UAAU,OAAOD,MAAK,KAAK,QAAQ,KAAK,QAAQ,KAAK,UAAU,WAAW,KAAK,MAAM,CAAC;AAC3F,SAAO,KAAK;AAChB;;;ACrHA,SAASE,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,YAAY,IAAI,kBAAkB,MAAM;IACxC,YAAY,IAAI,kBAAkB,MAAM;IACxC,SAAS;IACT,SAAS;IACT,SAAS,OAAO;IAChB,eAAe,OAAO;IACtB,KAAK,OAAO;IACZ,gBAAgB;IAChB,gBAAgB;;AAExB;AAEA,SAAS,YAAY,SAAiB,SAAe;AACjD,QAAM,QAAQ,UAAU;AACxB,MAAI,UAAU;AAAG,WAAO,OAAO;AAC/B,QAAM,MAAO,OAAO,UAAU,WAAY;AAC1C,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,MAAM,GAAG,CAAC;AAC5C;AAEA,SAASC,aAAW,MAAe,KAAW;AAC1C,MAAI,CAAC,OAAO,SAAS,GAAG,GAAG;AAEvB,SAAK,iBAAiB;AACtB,SAAK,iBAAiB;AACtB,WAAO,KAAK;EAChB;AACA,MAAI,CAAC,OAAO,SAAS,KAAK,OAAO,GAAG;AAChC,SAAK,UAAU;AACf,SAAK,gBAAgB;AACrB,SAAK,iBAAiB;AACtB,SAAK,iBAAiB;AACtB,WAAO,OAAO;EAClB;AACA,QAAMC,QAAO,MAAM,KAAK;AACxB,QAAM,OAAOA,QAAO,IAAIA,QAAO;AAC/B,QAAM,OAAOA,QAAO,IAAI,CAACA,QAAO;AAChC,OAAK,gBAAgB,KAAK;AAC1B,OAAK,UAAU;AACf,OAAK,iBAAiB;AACtB,OAAK,iBAAiB;AACtB,MAAI,KAAK,WAAW,WAAW,KAAK,QAAQ;AACxC,UAAM,aAAa,KAAK,WAAW,GAAG,KAAK,SAAS,CAAC;AACrD,UAAM,aAAa,KAAK,WAAW,GAAG,KAAK,SAAS,CAAC;AACrD,SAAK,WAAW;AAChB,SAAK,WAAW;EACpB;AACA,OAAK,WAAW,OAAO,IAAI;AAC3B,OAAK,WAAW,OAAO,IAAI;AAC3B,OAAK,WAAW;AAChB,OAAK,WAAW;AAChB,MAAI,KAAK,WAAW,SAAS,KAAK,QAAQ;AACtC,SAAK,MAAM,OAAO;AAClB,WAAO,OAAO;EAClB;AACA,OAAK,MAAM,YAAY,KAAK,SAAS,KAAK,OAAO;AACjD,SAAO,KAAK;AAChB;AAEA,SAASC,YAAU,MAAe,KAAW;AACzC,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,KAAK,aAAa,GAAG;AAC/D,WAAO,KAAK;EAChB;AACA,MAAI,KAAK,WAAW,SAAS,KAAK;AAAQ,WAAO,OAAO;AAExD,QAAMD,QAAO,MAAM,KAAK;AACxB,QAAM,OAAOA,QAAO,IAAIA,QAAO;AAC/B,QAAM,OAAOA,QAAO,IAAI,CAACA,QAAO;AAChC,QAAM,WAAW,KAAK,UAAU,KAAK,iBAAiB;AACtD,QAAM,WAAW,KAAK,UAAU,KAAK,iBAAiB;AACtD,SAAO,YAAY,UAAU,QAAQ;AACzC;AAqBM,SAAU,IACZ,QACA,QACA,QACA,OAAe;AAEf,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYG,YAAU,MAAM,GAAG,CAAC;EACnD,OAAO;AACH,SAAK,UAAU,OAAOF,aAAW,MAAM,GAAG,CAAC;EAC/C;AACA,SAAO,KAAK;AAChB;;;ACzHA,SAASG,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH,MAAM;IACN;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,aAAa;IACb,aAAa;IACb,WAAW;IACX,SAAS,OAAO;IAChB,SAAS,OAAO;IAChB,SAAS,OAAO;IAChB,eAAe,OAAO;IACtB,cAAc,oBAAI,IAAG;;AAE7B;AAEA,SAASC,eAAc,MAAe,QAAc;AAChD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA8B,KAAK,WAAW,MAAM;AAC3D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAEA,SAAS,YAAY,SAAiB,SAAe;AACjD,MAAI,YAAY;AAAG,WAAO;AAC1B,SAAO,MAAM,OAAO,IAAI,UAAU;AACtC;AAEA,SAASC,aAAW,MAAe,KAAW;AAC1C,MAAI,CAAC,OAAO,SAAS,GAAG,GAAG;AAEvB,QAAI,OAAO,SAAS,KAAK,OAAO,KAAK,OAAO,SAAS,KAAK,OAAO,GAAG;AAChE,aAAO,YAAY,KAAK,SAAS,KAAK,OAAO;IACjD;AACA,WAAO,OAAO;EAClB;AACA,MAAI,CAAC,OAAO,SAAS,KAAK,OAAO,GAAG;AAChC,SAAK,UAAU;AACf,SAAK,gBAAgB;AACrB,WAAO,OAAO;EAClB;AACA,QAAMC,QAAO,MAAM,KAAK;AACxB,QAAM,OAAOA,QAAO,IAAIA,QAAO;AAC/B,QAAM,OAAOA,QAAO,IAAI,CAACA,QAAO;AAChC,OAAK,gBAAgB,KAAK;AAC1B,OAAK,UAAU;AACf,OAAK,aAAa;AAElB,MAAI,KAAK,YAAY,KAAK,QAAQ;AAC9B,SAAK,eAAe;AACpB,SAAK,eAAe;AACpB,WAAO,OAAO;EAClB;AACA,MAAI,KAAK,cAAc,KAAK,QAAQ;AAChC,SAAK,eAAe;AACpB,SAAK,eAAe;AACpB,SAAK,UAAU,KAAK,cAAc,KAAK;AACvC,SAAK,UAAU,KAAK,cAAc,KAAK;AACvC,WAAO,YAAY,KAAK,SAAS,KAAK,OAAO;EACjD;AACA,OAAK,UAAU,WAAW,KAAK,SAAS,MAAM,KAAK,MAAM;AACzD,OAAK,UAAU,WAAW,KAAK,SAAS,MAAM,KAAK,MAAM;AACzD,SAAO,YAAY,KAAK,SAAS,KAAK,OAAO;AACjD;AAEA,SAASC,YAAU,MAAe,KAAW;AACzC,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,KAAK,aAAa,GAAG;AAC/D,QAAI,OAAO,SAAS,KAAK,OAAO,KAAK,OAAO,SAAS,KAAK,OAAO,GAAG;AAChE,aAAO,YAAY,KAAK,SAAS,KAAK,OAAO;IACjD;AACA,WAAO,OAAO;EAClB;AAIA,MAAI,KAAK,YAAY,KAAK,QAAQ;AAE9B,UAAMD,QAAO,MAAM,KAAK;AACxB,UAAME,QAAOF,QAAO,IAAIA,QAAO;AAC/B,UAAMG,QAAOH,QAAO,IAAI,CAACA,QAAO;AAChC,UAAM,mBAAmB,KAAK,YAAY;AAC1C,QAAI,mBAAmB,KAAK;AAAQ,aAAO,OAAO;AAClD,UAAMI,aAAY,KAAK,cAAcF,SAAQ,KAAK;AAClD,UAAMG,aAAY,KAAK,cAAcF,SAAQ,KAAK;AAClD,WAAO,YAAYC,WAAUC,SAAQ;EACzC;AAGA,QAAM,aAAa,KAAK,UAAU,KAAK;AACvC,QAAM,aAAa,aAAa,IAAI,aAAa;AACjD,QAAM,aAAa,aAAa,IAAI,CAAC,aAAa;AAClD,QAAM,gBAAgB,KAAK,UAAU,KAAK,SAAS,eAAe,KAAK,SAAS;AAChF,QAAM,gBAAgB,KAAK,UAAU,KAAK,SAAS,eAAe,KAAK,SAAS;AAChF,QAAML,QAAO,MAAM,KAAK;AACxB,QAAM,OAAOA,QAAO,IAAIA,QAAO;AAC/B,QAAM,OAAOA,QAAO,IAAI,CAACA,QAAO;AAChC,QAAM,WAAW,WAAW,cAAc,MAAM,KAAK,MAAM;AAC3D,QAAM,WAAW,WAAW,cAAc,MAAM,KAAK,MAAM;AAC3D,SAAO,YAAY,UAAU,QAAQ;AACzC;AA0BM,SAAU,IACZ,QACA,QACA,QACA,MAAc;AAEd,QAAM,MAAMJ,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYI,YAAU,MAAM,GAAG,CAAC;EACnD,OAAO;AACH,SAAK,UAAU,OAAOF,aAAW,MAAM,GAAG,CAAC;EAC/C;AACA,SAAOD,eAAc,MAAM,MAAM,UAAU,CAAC;AAChD;;;ACjKA,IAAM,qBAAqB;AAC3B,IAAM,wBAAwB;AAC9B,IAAM,qBAAqB;AAwB3B,SAASQ,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,oDAAoD;EACxE;AACA,SAAO;AACX;AAEA,SAASC,WACL,WACA,cACA,WACA,UAAgB;AAEhB,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA;IACA;IACA,YAAY;IACZ,WAAW;IACX,sBAAsB;IACtB,qBAAqB;IACrB,eAAe,OAAO;;;;IAItB,WAAW,IAAI,kBAAkB,YAAY,CAAC;IAC9C,UAAU;IACV,cAAc,oBAAI,IAAG;;AAE7B;AAEA,SAASC,eAAc,MAAsB,QAAc;AACvD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA8B,KAAK,WAAW,MAAM;AAC3D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAEA,SAAS,WACL,UACA,SACAC,OAAY;AAEZ,MAAI,CAAC,OAAO,SAASA,KAAI,KAAKA,UAAS,GAAG;AACtC,WAAO,EAAE,MAAM,GAAG,KAAK,EAAC;EAC5B;AACA,MAAIA,QAAO,GAAG;AACV,WAAO,EAAE,MAAM,GAAG,KAAK,aAAa,IAAI,UAAU,IAAI,EAAC;EAC3D;AACA,SAAO,EAAE,MAAM,IAAI,KAAK,aAAa,KAAK,UAAU,IAAI,EAAC;AAC7D;AAEA,SAAS,aAAa,MAAkB,KAAW;AAC/C,MAAI,SAAS;AAAG,WAAO;AACvB,SAAO,OAAO;AAClB;AAEA,SAAS,UAAU,MAAc,MAAY;AACzC,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,IAAI,KAAK,SAAS;AAAG,WAAO,OAAO;AAClF,SAAQ,OAAO,OAAO,QAAS;AACnC;AAOA,SAAS,gBAAgB,MAAoB;AACzC,QAAM,SAAS,KAAK,UAAU,GAAG,CAAC;AAClC,MAAI,CAAC,OAAO,SAAS,MAAM;AAAG,WAAO,OAAO;AAC5C,QAAM,aAAa,KAAK,UAAU,SAAS;AAI3C,MAAI,cAAc;AAAG,WAAO;AAC5B,QAAM,QAAQ,KAAK,IAAI,YAAY,KAAK,SAAS;AACjD,MAAI,aAAa;AACjB,MAAI,aAAa;AACjB,WAAS,IAAI,GAAG,KAAK,OAAO,KAAK,GAAG;AAChC,UAAM,IAAI,KAAK,UAAU,GAAG,CAAC;AAC7B,QAAI,CAAC,OAAO,SAAS,CAAC;AAAG;AACzB,kBAAc;AACd,QAAI,IAAI;AAAQ,oBAAc;EAClC;AACA,SAAO,eAAe,IAAI,KAAM,MAAM,aAAc;AACxD;AAEA,SAAS,UAAU,SAAiB,eAAuB,SAAe;AACtE,MAAI,MAAM;AACV,MAAI,QAAQ;AACZ,MAAI,OAAO,SAAS,OAAO,GAAG;AAC1B,WAAO;AACP,aAAS;EACb;AACA,MAAI,OAAO,SAAS,aAAa,GAAG;AAChC,WAAO;AACP,aAAS;EACb;AACA,MAAI,OAAO,SAAS,OAAO,GAAG;AAC1B,WAAO;AACP,aAAS;EACb;AACA,SAAO,UAAU,IAAI,OAAO,MAAM,MAAM;AAC5C;AA6BM,SAAU,WACZ,QACA,QACA,MAAqB;AAErB,QAAM,MAAMH,SAAM;AAClB,QAAM,YAAY,MAAM,aAAa;AACrC,QAAM,eAAe,MAAM,gBAAgB;AAC3C,QAAM,YAAY,MAAM,aAAa;AACrC,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,WAAW,cAAc,WAAW,IAAI,OAAO,MAAM,MAAM,QAAQ;AACnF,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAElC,MAAI,IAAI,QAAQ;AAIZ,UAAME,QAAO,UAAU,KAAK,KAAK,aAAa;AAC9C,UAAM,EAAE,MAAM,IAAG,IAAK;MAClB,KAAK;MACL,KAAK;;MAEL,OAAO,SAAS,KAAK,aAAa,IAAI,MAAM,KAAK,gBAAgB,OAAO;IAAG;AAE/E,UAAMC,OAAMD;AACZ,SAAK,UAAU,YAAYC,IAAG;AAC9B,UAAM,UAAU,IAAI,GAAG,MAAM,QAAQ,KAAK,SAAS,EAAE;AACrD,UAAM,gBAAgB,IAClB,GAAG,MAAM,cACT,aAAa,MAAM,GAAG,GACtB,YAAY,EACd;AACF,UAAM,KAAK,gBAAgB,IAAI;AAC/B,SAAK,UAAU,YAAY,UAAU,SAAS,eAAe,EAAE,CAAC;EACpE,OAAO;AACH,UAAMD,QAAO,OAAO,SAAS,KAAK,aAAa,IAAI,MAAM,KAAK,gBAAgB,OAAO;AACrF,UAAM,EAAE,MAAM,IAAG,IAAK,WAAW,KAAK,YAAY,KAAK,WAAWA,KAAI;AACtE,UAAMC,OAAM,UAAU,KAAK,KAAK,aAAa;AAC7C,SAAK,UAAU,OAAOA,IAAG;AACzB,UAAM,UAAU,IAAI,GAAG,MAAM,QAAQ,KAAK,SAAS,EAAE;AACrD,UAAM,gBAAgB,IAClB,GAAG,MAAM,cACT,aAAa,MAAM,GAAG,GACtB,YAAY,EACd;AACF,UAAM,KAAK,gBAAgB,IAAI;AAC/B,SAAK,UAAU,OAAO,UAAU,SAAS,eAAe,EAAE,CAAC;AAE3D,SAAK,uBAAuB,KAAK;AACjC,SAAK,sBAAsB,KAAK;AAChC,SAAK,aAAa;AAClB,SAAK,YAAY;AACjB,SAAK,gBAAgB;AACrB,SAAK,YAAY;EACrB;AACA,SAAOF,eAAc,MAAM,MAAM,UAAU,CAAC;AAChD;;;ACrOA,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAgB3B,SAASG,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,iDAAiD;EACrE;AACA,SAAO;AACX;AAEA,SAASC,WACL,YACA,YACA,WACA,UAAgB;AAEhB,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,QAAM,mBAAmB,KAAK,IAAI,YAAY,UAAU,IAAI;AAC5D,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA;IACA;IACA,cAAc,IAAI,kBAAkB,gBAAgB;IACpD,WAAW,IAAI,kBAAkB,SAAS;IAC1C,UAAU;;AAElB;AAMA,SAAS,OAAO,SAAiB,UAAgB;AAC7C,MAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,aAAa,KAAK,CAAC,OAAO,SAAS,OAAO,GAAG;AAC3E,WAAO,OAAO;EAClB;AACA,SAAQ,OAAO,UAAU,YAAa;AAC1C;AAQA,SAAS,iBAAiB,MAAiB;AACvC,MAAI,KAAK,UAAU,SAAS,KAAK;AAAW,WAAO,OAAO;AAC1D,QAAM,QAAS,KAAK,aAAa,KAAK,YAAY,KAAM;AACxD,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,KAAK,WAAW,KAAK,GAAG;AACxC,UAAM,IAAI,KAAK,UAAU,GAAG,CAAC;AAC7B,QAAI,CAAC,OAAO,SAAS,CAAC;AAAG,aAAO,OAAO;AACvC,WAAO,KAAK,KAAK,YAAY;EACjC;AACA,SAAO,MAAM;AACjB;AAEA,SAAS,cAAc,MAAmB,KAAW;AAGjD,MAAI,KAAK,aAAa,UAAU,KAAK;AAAY,WAAO,OAAO;AAC/D,MAAI,KAAK,aAAa,UAAU,KAAK;AAAY,WAAO,OAAO;AAC/D,QAAM,YAAY,KAAK,aAAa,GAAG,KAAK,UAAU;AACtD,QAAM,YAAY,KAAK,aAAa,GAAG,KAAK,UAAU;AACtD,QAAM,OAAO,OAAO,KAAK,SAAS;AAClC,QAAM,OAAO,OAAO,KAAK,SAAS;AAClC,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,IAAI;AAAG,WAAO,OAAO;AACpE,SAAO,OAAO;AAClB;AAEA,SAASC,aAAW,MAAmB,KAAW;AAC9C,OAAK,aAAa,OAAO,GAAG;AAC5B,OAAK,YAAY;AACjB,QAAM,MAAM,cAAc,MAAM,GAAG;AACnC,OAAK,UAAU,OAAO,GAAG;AACzB,SAAO,iBAAiB,IAAI;AAChC;AAEA,SAASC,YAAU,MAAmB,KAAW;AAC7C,MAAI,KAAK,aAAa,WAAW;AAAG,WAAO,OAAO;AAIlD,OAAK,aAAa,YAAY,GAAG;AACjC,QAAM,MAAM,cAAc,MAAM,GAAG;AACnC,OAAK,UAAU,YAAY,GAAG;AAC9B,SAAO,iBAAiB,IAAI;AAChC;AAuBM,SAAU,QACZ,QACA,QACA,MAAkB;AAElB,QAAM,MAAMH,SAAM;AAClB,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,YAAY,MAAM,aAAa;AACrC,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,YAAY,YAAY,WAAW,IAAI,OAAO,MAAM,MAAM,QAAQ;AAClF,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYE,YAAU,MAAM,GAAG,CAAC;EACnD,OAAO;AACH,SAAK,UAAU,OAAOD,aAAW,MAAM,GAAG,CAAC;EAC/C;AACA,SAAO,KAAK;AAChB;;;ACpJA,SAASE,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,mDAAmD;EACvE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAgB;AAC9B,QAAM,YAAY,IAAI,WAAoB,QAAQ;AAClD,SAAO;IACH;IACA,QAAQ,eAAwB,SAAS;IACzC,OAAO,OAAO;IACd,OAAO,OAAO;IACd,OAAO,OAAO;IACd,OAAO,OAAO;IACd,aAAa;IACb,cAAc,oBAAI,IAAG;;AAE7B;AAEA,SAASC,eAAc,MAAiB,QAAc;AAClD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA+B,KAAK,WAAW,MAAM;AAC5D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAEA,SAAS,OAAO,OAAe,OAAe,OAAe,OAAa;AACtE,MACI,CAAC,OAAO,SAAS,KAAK,KACtB,CAAC,OAAO,SAAS,KAAK,KACtB,CAAC,OAAO,SAAS,KAAK,KACtB,CAAC,OAAO,SAAS,KAAK,GACxB;AACE,WAAO;EACX;AACA,SAAO,QAAQ,SAAS,SAAS;AACrC;AA2BM,SAAU,UACZ,QACA,GACA,GACA,MAAoB;AAEpB,QAAM,MAAMF,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/C,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,SAAS,gBAAgB,CAAC;AAChC,QAAM,SAAS,gBAAgB,CAAC;AAChC,QAAM,SAAS,MAAM,UAAU;AAC/B,MAAI,IAAI,QAAQ;AACZ,UAAM,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,QAAQ,MAAM;AACzD,SAAK,UAAU,YAAY,GAAG;AAC9B,WAAOC,eAAc,MAAM,MAAM;EACrC;AACA,MAAI,CAAC,KAAK,aAAa;AACnB,SAAK,cAAc;AACnB,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,UAAU,OAAO,KAAK;AAC3B,WAAOA,eAAc,MAAM,MAAM;EACrC;AAEA,OAAK,QAAQ,KAAK;AAClB,OAAK,QAAQ,KAAK;AAClB,OAAK,QAAQ;AACb,OAAK,QAAQ;AACb,OAAK,UAAU,OAAO,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,KAAK,CAAC;AAC5E,SAAOA,eAAc,MAAM,MAAM;AACrC;;;AC3GA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,oDAAoD;EACxE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAgB;AAC9B,QAAM,YAAY,IAAI,WAAoB,QAAQ;AAClD,SAAO;IACH;IACA,QAAQ,eAAwB,SAAS;IACzC,OAAO,OAAO;IACd,OAAO,OAAO;IACd,OAAO,OAAO;IACd,OAAO,OAAO;IACd,aAAa;IACb,cAAc,oBAAI,IAAG;;AAE7B;AAEA,SAASC,gBAAc,MAAiB,QAAc;AAClD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA+B,KAAK,WAAW,MAAM;AAC5D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAEA,SAASC,QAAO,OAAe,OAAe,OAAe,OAAa;AACtE,MACI,CAAC,OAAO,SAAS,KAAK,KACtB,CAAC,OAAO,SAAS,KAAK,KACtB,CAAC,OAAO,SAAS,KAAK,KACtB,CAAC,OAAO,SAAS,KAAK,GACxB;AACE,WAAO;EACX;AACA,SAAO,QAAQ,SAAS,SAAS;AACrC;AAqBM,SAAU,WACZ,QACA,GACA,GACA,MAAqB;AAErB,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/C,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,SAAS,gBAAgB,CAAC;AAChC,QAAM,SAAS,gBAAgB,CAAC;AAChC,QAAM,SAAS,MAAM,UAAU;AAC/B,MAAI,IAAI,QAAQ;AACZ,UAAM,MAAME,QAAO,KAAK,OAAO,KAAK,OAAO,QAAQ,MAAM;AACzD,SAAK,UAAU,YAAY,GAAG;AAC9B,WAAOD,gBAAc,MAAM,MAAM;EACrC;AACA,MAAI,CAAC,KAAK,aAAa;AACnB,SAAK,cAAc;AACnB,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,UAAU,OAAO,KAAK;AAC3B,WAAOA,gBAAc,MAAM,MAAM;EACrC;AACA,OAAK,QAAQ,KAAK;AAClB,OAAK,QAAQ,KAAK;AAClB,OAAK,QAAQ;AACb,OAAK,QAAQ;AACb,OAAK,UAAU,OAAOC,QAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,KAAK,CAAC;AAC5E,SAAOD,gBAAc,MAAM,MAAM;AACrC;;;ACnGA,SAASE,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,8CAA8C;EAClE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;;AAER;AAuBM,SAAU,KACZ,QACA,QACA,QACA,OAAgB;AAEhB,QAAM,MAAMD,SAAM;AAClB,QAAM,MAAM,gBAAgB,MAAM;AAClC,QAAM,aAAa,IAAI,GAAG,MAAM,SAAS,KAAK,MAAM;AACpD,QAAM,KAAK,WAAW;AACtB,QAAM,aAAa,IAAI,GAAG,MAAM,SAAS,IAAI,MAAM;AACnD,QAAM,KAAK,WAAW;AACtB,QAAM,QAAQ,OAAO,SAAS,EAAE,KAAK,OAAO,SAAS,EAAE,IAAI,IAAI,KAAK,KAAK,OAAO;AAEhF,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,MAAI,IAAI;AAAQ,SAAK,UAAU,YAAY,KAAK;;AAC3C,SAAK,UAAU,OAAO,KAAK;AAChC,SAAO,KAAK;AAChB;;;AC5CA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,eAAe,IAAI,kBAAkB,QAAQ;AACnD,QAAM,gBAAgB,IAAI,kBAAkB,QAAQ;AACpD,SAAO;IACH,QAAQ,OAAO,OAAO;MAClB,QAAQ,eAAuB,YAAY;MAC3C,SAAS,eAAuB,aAAa;KAChD;IACD;IACA;IACA,UAAU,qBAAqB,MAAM;IACrC,gBAAgB,oBAAI,IAAG;;AAE/B;AAEA,SAASC,iBAAgB,MAAe,QAAc;AAClD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,SAAS,KAAK,eAAe,IAAI,MAAM;AAC3C,MAAI,WAAW,QAAW;AACtB,aAAS,OAAO,OAAO;MACnB,QAAQ,sBAA8B,KAAK,cAAc,MAAM;MAC/D,SAAS,sBAA8B,KAAK,eAAe,MAAM;KACpE;AACD,SAAK,eAAe,IAAI,QAAQ,MAAM;EAC1C;AACA,SAAO;AACX;AAmCM,SAAU,IAAI,QAAgB,QAAgB,MAAc;AAC9D,QAAM,MAAMF,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,IAAI,OAAO;AACvB,MAAI,IAAI,QAAQ;AACZ,UAAM,EAAE,QAAQ,QAAO,IAAK,gBAAgB,KAAK,UAAU,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK;AACvF,SAAK,aAAa,YAAY,MAAM;AACpC,SAAK,cAAc,YAAY,OAAO;EAC1C,OAAO;AACH,UAAM,EAAE,QAAQ,QAAO,IAAK,wBACxB,KAAK,UACL,IAAI,MACJ,IAAI,KACJ,IAAI,KAAK;AAEb,SAAK,aAAa,OAAO,MAAM;AAC/B,SAAK,cAAc,OAAO,OAAO;EACrC;AACA,SAAOC,iBAAgB,MAAM,MAAM,UAAU,CAAC;AAClD;;;ACtGA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,kDAAkD;EACtE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,SAAO;IACH,cAAc,IAAI,kBAAkB,QAAQ;IAC5C;IACA,SAAS;;AAEjB;AAEA,SAAS,YAAY,OAAe,OAAa;AAC7C,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,SAAS,KAAK;AAAG,WAAO,OAAO;AACtE,UAAQ,QAAQ,SAAS;AAC7B;AA4BM,SAAU,SAAS,QAAgB,QAAgB,OAAoB;AACzE,QAAM,MAAMD,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,cAAc,QAAQ,GAAG,MAAM,YAAY,IAAI,OAAO,IAAI,MAAM,MAAM;AAC5E,QAAM,cAAc,OAAO,GAAG,MAAM,WAAW,IAAI,OAAO,IAAI,KAAK,MAAM;AACzE,MAAI,KAAK,YAAY,MAAM;AACvB,SAAK,UAAU,OAAO,OAAO;MACzB,OAAO;MACP,QAAQ,eAAuB,KAAK,YAAY;MAChD,OAAO;KACV;EACL;AACA,QAAM,QAAQ,YAAY,YAAY,SAAS,YAAY,OAAO;AAClE,MAAI,IAAI,QAAQ;AACZ,SAAK,aAAa,YAAY,KAAK;EACvC,OAAO;AACH,SAAK,aAAa,OAAO,KAAK;EAClC;AACA,SAAO,KAAK;AAChB;;;ACzDA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,eAAe,KAAK,MAAM,SAAS,CAAC,IAAI;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA;IACA,cAAc,IAAI,kBAAkB,eAAe,CAAC;IACpD,UAAU;IACV,cAAc,oBAAI,IAAG;;AAE7B;AAEA,SAASC,gBAAc,MAAe,QAAc;AAChD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA8B,KAAK,WAAW,MAAM;AAC3D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAEA,SAAS,WAAW,MAAe,YAAkB;AACjD,MAAI,KAAK,aAAa,UAAU,KAAK;AAAc,WAAO,OAAO;AACjE,MAAI,CAAC,OAAO,SAAS,UAAU;AAAG,WAAO,OAAO;AAChD,QAAM,UAAU,KAAK,aAAa,GAAG,KAAK,YAAY;AACtD,MAAI,CAAC,OAAO,SAAS,OAAO;AAAG,WAAO,OAAO;AAC7C,SAAO,UAAU;AACrB;AAuBM,SAAU,IACZ,QACA,QACA,QACA,MAAc;AAEd,QAAM,MAAMF,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AACZ,SAAK,aAAa,YAAY,GAAG;AACjC,UAAM,YAAY,IAAI,GAAG,MAAM,QAAQ,KAAK,MAAM;AAClD,SAAK,UAAU,YAAY,WAAW,MAAM,UAAU,OAAO,CAAC;EAClE,OAAO;AACH,SAAK,aAAa,OAAO,GAAG;AAC5B,SAAK,YAAY;AACjB,UAAM,YAAY,IAAI,GAAG,MAAM,QAAQ,KAAK,MAAM;AAClD,SAAK,UAAU,OAAO,WAAW,MAAM,UAAU,OAAO,CAAC;EAC7D;AACA,SAAOC,gBAAc,MAAM,MAAM,UAAU,CAAC;AAChD;;;ACpGA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,8CAA8C;EAClE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC,OAAO,IAAI;IACX;IACA,SAAS;IACT,WAAW;IACX,UAAU,OAAO;IACjB,gBAAgB,OAAO;;AAE/B;AAEA,SAASC,SAAQ,MAAgB,KAAa,QAAe;AACzD,MAAI,CAAC,OAAO,SAAS,GAAG,GAAG;AAGvB,WAAO,SAAS,KAAK,WAAW,KAAK;EACzC;AACA,MAAI,KAAK,YAAY,KAAK,QAAQ;AAC9B,QAAI,QAAQ;AACR,YAAM,UAAU,KAAK,UAAU;AAC/B,YAAM,YAAY,KAAK,YAAY;AACnC,UAAI,YAAY,KAAK;AAAQ,eAAO,OAAO;AAC3C,aAAO,UAAU,KAAK;IAC1B;AACA,SAAK,WAAW;AAChB,SAAK,aAAa;AAClB,QAAI,KAAK,YAAY,KAAK,QAAQ;AAC9B,WAAK,iBAAiB,OAAO;AAC7B,aAAO,OAAO;IAClB;AACA,UAAM,YAAY,KAAK,UAAU,KAAK;AACtC,SAAK,iBAAiB;AACtB,SAAK,WAAW;AAChB,WAAO;EACX;AACA,QAAM,OAAO,KAAK;AAClB,QAAM,OAAO,MAAM,KAAK,QAAQ,QAAQ,IAAI,KAAK;AACjD,MAAI,CAAC,QAAQ;AACT,SAAK,iBAAiB;AACtB,SAAK,WAAW;EACpB;AACA,SAAO;AACX;AAwBM,SAAU,KACZ,QACA,QACA,QACA,OAAgB;AAEhB,QAAM,MAAMF,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,QAAQC,SAAQ,MAAM,gBAAgB,MAAM,GAAG,IAAI,MAAM;AAC/D,MAAI,IAAI;AAAQ,SAAK,UAAU,YAAY,KAAK;;AAC3C,SAAK,UAAU,OAAO,KAAK;AAChC,SAAO,KAAK;AAChB;;;AC3FA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,OAAQ,UAAU,SAAS,KAAM;IACjC,QAAQ,IAAI,kBAAkB,MAAM;;AAE5C;AAEA,SAASC,oBAAmB,MAAa;AAKrC,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACrC,UAAM,IAAI,KAAK,OAAO,GAAG,CAAC;AAC1B,QAAI,CAAC,OAAO,SAAS,CAAC;AAAG,aAAO,OAAO;AACvC,WAAO,KAAK,KAAK,SAAS;EAC9B;AACA,SAAO,MAAM,KAAK;AACtB;AAEA,SAASC,aAAW,MAAe,KAAW;AAC1C,OAAK,OAAO,OAAO,GAAG;AACtB,MAAI,KAAK,OAAO,SAAS,KAAK;AAAQ,WAAO,OAAO;AACpD,SAAOD,oBAAmB,IAAI;AAClC;AAEA,SAASE,YAAU,MAAe,KAAW;AAIzC,MAAI,KAAK,OAAO,SAAS,KAAK;AAAQ,WAAO,OAAO;AACpD,MAAI,CAAC,OAAO,SAAS,GAAG;AAAG,WAAO,OAAO;AACzC,MAAI,MAAM,MAAM,KAAK;AACrB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACrC,UAAM,IAAI,KAAK,OAAO,GAAG,CAAC;AAC1B,QAAI,CAAC,OAAO,SAAS,CAAC;AAAG,aAAO,OAAO;AACvC,WAAO,KAAK,KAAK,SAAS;EAC9B;AACA,SAAO,MAAM,KAAK;AACtB;AAsBM,SAAU,IACZ,QACA,QACA,QACA,OAAe;AAEf,QAAM,MAAMJ,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYG,YAAU,MAAM,GAAG,CAAC;EACnD,OAAO;AACH,SAAK,UAAU,OAAOD,aAAW,MAAM,GAAG,CAAC;EAC/C;AACA,SAAO,KAAK;AAChB;;;AChGA,IAAME,kBAAiB;AACvB,IAAM,kBAAkB;AACxB,IAAM,kBAAkC;AAWxC,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,kDAAkD;EACtE;AACA,SAAO;AACX;AAEA,SAASC,WACL,QACA,SACA,QACA,UAAgB;AAEhB,SAAO;IACH,aAAa,IAAI,kBAAkB,QAAQ;IAC3C,aAAa,IAAI,kBAAkB,QAAQ;IAC3C;IACA;IACA;IACA,SAAS;;AAEjB;AAEA,SAAS,WACL,QACA,WACA,QACA,QAAc;AAEd,UAAQ,QAAQ;IACZ,KAAK;AACD,aAAO,IAAI,WAAW,QAAQ,MAAM;IACxC,KAAK;AACD,aAAO,IAAI,WAAW,QAAQ,MAAM;IACxC,KAAK;AACD,aAAO,IAAI,WAAW,QAAQ,MAAM;IACxC,KAAK;AACD,aAAO,KAAK,WAAW,QAAQ,MAAM;EAC7C;AACJ;AA2BM,SAAU,SACZ,QACA,QACA,MAAmB;AAEnB,QAAM,MAAMD,SAAM;AAClB,QAAM,SAAS,MAAM,UAAUD;AAC/B,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,SAAS,MAAM,UAAU;AAC/B,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOE,WAAS,QAAQ,SAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACxE,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,QAAM,eAAe,WAAW,KAAK,QAAQ,GAAG,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM;AACzF,MAAI,KAAK,YAAY,MAAM;AACvB,SAAK,UAAU,OAAO,OAAO;MACzB,OAAO,eAAuB,KAAK,WAAW;MAC9C,QAAQ;MACR,OAAO,eAAuB,KAAK,WAAW;KACjD;EACL;AACA,QAAM,MAAM,aAAa;AACzB,QAAM,SAAS,KAAK,UAAU;AAC9B,MAAI;AACJ,MAAI;AACJ,MAAI,OAAO,SAAS,GAAG,GAAG;AACtB,iBAAa,OAAO,IAAI;AACxB,iBAAa,OAAO,IAAI;EAC5B,OAAO;AACH,iBAAa,OAAO;AACpB,iBAAa,OAAO;EACxB;AACA,MAAI,IAAI,QAAQ;AACZ,SAAK,YAAY,YAAY,UAAU;AACvC,SAAK,YAAY,YAAY,UAAU;EAC3C,OAAO;AACH,SAAK,YAAY,OAAO,UAAU;AAClC,SAAK,YAAY,OAAO,UAAU;EACtC;AACA,SAAO,KAAK;AAChB;;;ACzHA,IAAM,UAAU;AA4BhB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC,cAAc,oBAAI,IAAG;IACrB;IACA,cAAc,IAAI,kBAAkB,MAAM;IAC1C,WAAW;IACX,UAAU;IACV,SAAS,OAAO;IAChB,aAAa,OAAO;;AAE5B;AAEA,SAASC,gBAAc,MAAe,QAAc;AAChD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA8B,KAAK,WAAW,MAAM;AAC3D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAEA,SAASC,SAAQ,QAAc;AAC3B,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC9C;AAOA,SAAS,SAAS,MAAc,KAAa,QAAgB,SAAe;AACxE,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,OAAO,GAAG;AAC9E,WAAO,OAAO;EAClB;AACA,QAAM,QAAQ,OAAO;AACrB,MAAI,UAAU;AAAG,WAAO,OAAO;AAC/B,QAAM,WAAWA,SAAQ,MAAM,IAAI,UAAU;AAC7C,MAAI,aAAa;AAAG,WAAO,OAAO;AAClC,QAAM,gBAAgB,OAAO,OAAO,IAAI;AACxC,SAAO,eAAe;AAC1B;AAMA,SAASC,MAAK,MAAe,OAAc;AACvC,MAAI,CAAC,SAAS,KAAK,WAAW;AAAG,WAAO,OAAO;AAC/C,SAAO,KAAK,YAAY,KAAK;AACjC;AAkCM,SAAU,IAAI,QAAgB,QAAgB,MAAc;AAC9D,QAAM,MAAMJ,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,EAAE,MAAM,KAAK,OAAM,IAAK,IAAI,OAAO;AAEzC,MAAI,IAAI,QAAQ;AAQZ,QAAI,KAAK,aAAa,SAAS,KAAK,QAAQ;AACxC,WAAK,UAAU,YAAY,OAAO,GAAG;AACrC,aAAOC,gBAAc,MAAM,MAAM;IACrC;AACA,UAAM,UAAU,SAAS,MAAM,KAAK,QAAQ,KAAK,WAAW;AAC5D,UAAM,UAAU,KAAK,aAAa,GAAG,CAAC;AACtC,UAAM,aAAa,CAAC,OAAO,SAAS,OAAO;AAC3C,UAAM,YAAY,CAAC,OAAO,SAAS,OAAO;AAC1C,UAAM,SAAS,KAAK,YAAY,aAAa,IAAI,MAAM,YAAY,IAAI;AACvE,QAAI,SAAS,GAAG;AACZ,WAAK,UAAU,YAAY,OAAO,GAAG;AACrC,aAAOA,gBAAc,MAAM,MAAM;IACrC;AAMA,UAAM,SAAS,KAAK,aAAa,aAAa,IAAI,WAAW;AAC7D,SAAK,UAAU,YAAY,SAAS,KAAK,MAAM;AAC/C,WAAOA,gBAAc,MAAM,MAAM;EACrC;AAKA,OAAK,cAAc,KAAK;AAExB,QAAM,MAAM,SAAS,MAAM,KAAK,QAAQ,KAAK,OAAO;AACpD,QAAMG,YACF,OAAO,SAAS,IAAI,KAAK,OAAO,SAAS,GAAG,KAAK,OAAO,OAAO,IAAI,KAAK;AAG5E,MAAI,KAAK,aAAa,WAAW,KAAK,QAAQ;AAC1C,UAAM,SAAS,KAAK,aAAa,GAAG,KAAK,SAAS,CAAC;AACnD,QAAI,OAAO,SAAS,MAAM;AAAG,WAAK,aAAa;;AAC1C,WAAK,YAAY;EAC1B;AAEA,OAAK,aAAa,OAAO,GAAG;AAC5B,MAAI,OAAO,SAAS,GAAG;AAAG,SAAK,aAAa;;AACvC,SAAK,YAAY;AACtB,OAAK,UAAUA;AAEf,QAAM,QAAQ,KAAK,aAAa,WAAW,KAAK;AAChD,OAAK,UAAU,OAAOD,MAAK,MAAM,KAAK,CAAC;AACvC,SAAOF,gBAAc,MAAM,MAAM;AACrC;;;AC9KA,SAASI,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,gDAAgD;EACpE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,QAAM,aAAa,IAAI,kBAAkB,QAAQ;AACjD,SAAO;IACH,QAAQ;IACR;IACA;IACA,cAAc,eAAuB,SAAS;IAC9C,eAAe,eAAuB,UAAU;IAChD;IACA,OAAO;IACP,YAAY;IACZ,aAAa;IACb,kBAAkB;IAClB,UAAU;;AAElB;AASA,SAAS,YACL,YACA,OACA,YAAkB;AAElB,QAAM,IAAI,OAAO,aAAa,OAAO;AAMrC,MAAI,KAAK,IAAI,CAAC,KAAK,GAAG;AAClB,WAAO;MACH,aAAa,OAAO;MACpB,cAAc;MACd,OAAO;MACP,YAAY;;EAEpB;AAEA,QAAM,cAAc,MAAM,KAAK,KAAK,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM;AAC9D,SAAO,EAAE,aAAa,cAAc,YAAY,OAAO,GAAG,YAAY,YAAW;AACrF;AAgCM,SAAU,OAAO,QAAgB,QAAgB,OAAkB;AACrE,QAAM,MAAMD,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AAEA,QAAM,MAAM,IAAI,OAAO,IAAI;AAC3B,QAAM,WAAW,QAAQ,GAAG,MAAM,YAAY,KAAK,MAAM;AACzD,QAAM,WAAW,OAAO,GAAG,MAAM,WAAW,KAAK,MAAM;AACvD,QAAM,KAAK,SAAS;AACpB,QAAM,KAAK,SAAS;AAEpB,MAAI;AACJ,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,OAAO,SAAS,EAAE,GAAG;AACvE,iBAAa,OAAO;EACxB,WAAW,OAAO,IAAI;AAClB,iBAAa;EACjB,OAAO;AACH,kBAAc,MAAM,OAAO,KAAK,MAAM;EAC1C;AAEA,MAAI,IAAI,QAAQ;AAGZ,UAAMC,QAAO,OAAO,SAAS,UAAU,IACjC,YAAY,YAAY,KAAK,aAAa,KAAK,gBAAgB,IAC/D;MACI,aAAa,OAAO;MACpB,cAAc,KAAK;MACnB,OAAO,KAAK;MACZ,YAAY,KAAK;;AAK3B,UAAM;;MACmB,KAAK,aAAa,IAAI,OAAO,MAAMA,MAAK;;AACjE,SAAK,UAAU,YAAYA,MAAK,WAAW;AAC3C,SAAK,WAAW,YAAY,UAAU;EAC1C,OAAO;AAGH,SAAK,cAAc,KAAK;AACxB,SAAK,mBAAmB,KAAK;AAC7B,UAAMA,QAAO,OAAO,SAAS,UAAU,IACjC,YAAY,YAAY,KAAK,OAAO,KAAK,UAAU,IACnD;MACI,aAAa,OAAO;MACpB,cAAc,KAAK;MACnB,OAAO,KAAK;MACZ,YAAY,KAAK;;AAE3B,UAAM,aAAa,KAAK,aAAa,IAAI,OAAO,MAAMA,MAAK;AAC3D,SAAK,UAAU,OAAOA,MAAK,WAAW;AACtC,SAAK,WAAW,OAAO,UAAU;AACjC,SAAK,QAAQA,MAAK;AAClB,SAAK,aAAaA,MAAK;AACvB,SAAK,YAAY;EACrB;AAEA,MAAI,KAAK,WAAW,MAAM;AACtB,SAAK,SAAS,OAAO,OAAO;MACxB,QAAQ,KAAK;MACb,SAAS,KAAK;KACjB;EACL;AACA,SAAO,KAAK;AAChB;;;ACpKA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,iEAAiE;EACrF;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAgB;AAC9B,QAAM,OAAO,wBAAwB,QAAQ;AAC7C,QAAM,OAA2C;IAC7C,GAAG;IACH,QAAQ;IACR,QAAQ,OAAO,OAAO;MAClB,IAAI,UAAO;AACP,eAAO,KAAK;MAChB;MACA,KAAK,eAAuB,KAAK,SAAS;MAC1C,SAAS,eAAuB,KAAK,aAAa;MAClD,QAAQ,eAAuB,KAAK,YAAY;KACnD;IACD,gBAAgB,oBAAI,IAAG;;AAE3B,SAAO;AACX;AAEA,SAASC,iBACL,MACA,QAAc;AAEd,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,SAAS,KAAK,eAAe,IAAI,MAAM;AAC3C,MAAI,WAAW,QAAW;AACtB,aAAS,OAAO,OAAO;MACnB,IAAI,UAAO;AACP,eAAO,KAAK;MAChB;MACA,KAAK,sBAA8B,KAAK,WAAW,MAAM;MACzD,SAAS,sBAA8B,KAAK,eAAe,MAAM;MACjE,QAAQ,sBAA8B,KAAK,cAAc,MAAM;KAClE;AACD,SAAK,eAAe,IAAI,QAAQ,MAAM;EAC1C;AACA,SAAO;AACX;AAEA,SAASC,aACL,KACA,MACA,IAAU;AAEV,QAAM,EAAE,MAAK,IAAK,IAAI;AACtB,QAAM,OAA2B,CAAA;AACjC,WAAS,WAAW,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,YAAY,GAAG;AACtE,UAAM,OAAO,MAAM,KAAK,GAAG,QAAQ;AACnC,QAAI,OAAO,QAAQ,OAAO;AAAI;AAC9B,SAAK,KAAK;MACN,OAAO,MAAM,MAAM,GAAG,QAAQ;MAC9B,MAAM,MAAM,KAAK,GAAG,QAAQ;MAC5B,KAAK,MAAM,IAAI,GAAG,QAAQ;MAC1B,MAAM,MAAM,KAAK,GAAG,QAAQ;MAC5B;MACA,QAAQ,MAAM,OAAO,GAAG,QAAQ;KACnC;EACL;AACA,SAAO;AACX;AAEA,SAAS,sBAAsB,KAAqB,QAAc;AAC9D,QAAM,MAAM,wBAAwB,MAAM;AAC1C,MAAI,IAAI,qBAAqB,IAAI,GAAG;AAAG;AACvC,MAAI,qBAAqB,IAAI,GAAG;AAChC,iBAAe,IAAI,WAAW;IAC1B,MAAM;IACN,UAAU;IACV,MAAM;IACN,SAAS;IACT;IACA,KAAK,IAAI,SAAQ;GACpB;AACL;AA6BM,SAAU,wBACZ,QACA,MAAiC;AAEjC,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/C,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AAEA,MAAIG,YAAkC,2BAA0B;AAChE,MAAI,KAAK,OAAO,KAAK,IAAI;AACrB,0BAAsB,KAAK,MAAM;AACjC,SAAK,SAAS;EAClB,WAAW,IAAI,OAAO,IAAI,OAAO,KAAK,MAAM;AACxC,SAAK,SAAS;EAClB,WAAW,IAAI,OAAO,IAAI,OAAO,KAAK,MAAM,KAAK,WAAW,MAAM;AAC9D,IAAAA,YAAW,KAAK;EACpB,OAAO;AACH,IAAAA,YAAW,6BAA6B;MACpC,MAAMD,aAAY,KAAK,KAAK,MAAM,KAAK,EAAE;MACzC,aAAa,KAAK;MAClB,QAAQ,4BAA4B,IAAI;KAC3C;AACD,QAAI,IAAI,OAAO,IAAI,QAAQ,KAAK;AAAI,WAAK,SAASC;EACtD;AAEA,8BAA4B,MAAM,IAAI,QAAQA,SAAQ;AACtD,6BACI,KACA,QACA,8BACAA,UAAS,KACTA,UAAS,OAAO;AAEpB,SAAOF,iBAAgB,MAAM,KAAK,UAAU,CAAC;AACjD;;;AChKA,IAAM,+BAA+B;AAgBrC,SAASG,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,8DAA8D;EAClF;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,qBAA6B,UAAgB;AAC3E,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA;IACA,kBAAkB,IAAI,kBAAkB,MAAM;IAC9C,MAAM;IACN,OAAO;IACP,SAAS,OAAO;IAChB,cAAc,oBAAI,IAAG;;AAE7B;AAEA,SAASC,gBAAc,MAAc,QAAc;AAC/C,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA8B,KAAK,WAAW,MAAM;AAC3D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAEA,SAAS,UAAU,MAAc,KAAW;AACxC,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,QAAQ,KAAK,OAAO,GAAG;AAC1E,WAAO,OAAO;EAClB;AACA,SAAO,KAAK,IAAI,MAAM,IAAI;AAC9B;AAEA,SAAS,aAAa,QAA2B,MAAc,OAAa;AACxE,QAAM,IAAI,OAAO;AAGjB,MAAI,KAAK;AAAG,WAAO,OAAO;AAC1B,QAAM,OAAO,OAAO;AACpB,QAAM,WAAW,QAAQ,IAAI,OAAO;AACpC,SAAO,KAAK,KAAK,KAAK,IAAI,GAAG,QAAQ,CAAC;AAC1C;AAQA,SAAS,cAAc,MAAY;AAC/B,MAAI,OAAO;AACX,MAAI,QAAQ;AACZ,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,KAAK,iBAAiB,QAAQ,KAAK,GAAG;AACtD,UAAM,IAAI,KAAK,iBAAiB,GAAG,KAAK,iBAAiB,SAAS,IAAI,CAAC;AACvE,QAAI,CAAC,OAAO,SAAS,CAAC,GAAG;AACrB,eAAS;AACT;IACJ;AACA,YAAQ;AACR,aAAS,IAAI;EACjB;AACA,MAAI,QAAQ;AACR,SAAK,OAAO,OAAO;AACnB,SAAK,QAAQ,OAAO;EACxB,OAAO;AACH,SAAK,OAAO;AACZ,SAAK,QAAQ;EACjB;AACJ;AAEA,SAASC,aAAW,MAAc,KAAW;AACzC,QAAM,KAAK,UAAU,KAAK,SAAS,GAAG;AACtC,MAAI,KAAK,iBAAiB,SAAS,KAAK,iBAAiB,UAAU;AAC/D,SAAK,iBAAiB,OAAO,EAAE;AAC/B,QAAI,OAAO,SAAS,EAAE,GAAG;AACrB,WAAK,QAAQ;AACb,WAAK,SAAS,KAAK;IACvB,OAAO;AACH,WAAK,OAAO,OAAO;AACnB,WAAK,QAAQ,OAAO;IACxB;AACA,SAAK,UAAU;AACf,WAAO,OAAO;EAClB;AACA,QAAM,WAAW,KAAK,iBAAiB,GAAG,KAAK,iBAAiB,SAAS,CAAC;AAC1E,OAAK,iBAAiB,OAAO,EAAE;AAC/B,MAAI,CAAC,OAAO,SAAS,EAAE,GAAG;AACtB,SAAK,OAAO,OAAO;AACnB,SAAK,QAAQ,OAAO;EACxB,WACI,CAAC,OAAO,SAAS,KAAK,IAAI;EAE1B,CAAC,OAAO,SAAS,QAAQ,GAC3B;AAOE,kBAAc,IAAI;EACtB,OAAO;AACH,SAAK,OAAO,KAAK,OAAO,WAAW;AACnC,SAAK,QAAQ,KAAK,QAAQ,WAAW,WAAW,KAAK;EACzD;AACA,OAAK,UAAU;AACf,MAAI,CAAC,OAAO,SAAS,KAAK,IAAI;AAAG,WAAO,OAAO;AAC/C,QAAM,KAAK,aAAa,KAAK,kBAAkB,KAAK,MAAM,KAAK,KAAK;AACpE,SAAO,KAAK,KAAK,KAAK,KAAK,mBAAmB,IAAI;AACtD;AAEA,SAASC,YAAU,MAAc,KAAW;AACxC,MAAI,KAAK,iBAAiB,SAAS,KAAK,iBAAiB;AAAU,WAAO,OAAO;AACjF,QAAM,KAAK,UAAU,KAAK,SAAS,GAAG;AACtC,MAAI,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,OAAO,SAAS,KAAK,IAAI;AAAG,WAAO,OAAO;AACvE,QAAM,eAAe,KAAK,iBAAiB,GAAG,CAAC;AAM/C,MAAI,CAAC,OAAO,SAAS,YAAY;AAAG,WAAO,OAAO;AAClD,QAAM,OAAO,KAAK,OAAO,eAAe;AACxC,QAAM,QAAQ,KAAK,QAAQ,eAAe,eAAe,KAAK;AAC9D,QAAM,IAAI,KAAK,iBAAiB;AAChC,QAAM,OAAO,OAAO;AACpB,QAAM,WAAW,QAAQ,IAAI,OAAO;AACpC,SAAO,KAAK,KAAK,KAAK,IAAI,GAAG,QAAQ,CAAC,IAAI,KAAK,KAAK,KAAK,mBAAmB,IAAI;AACpF;AA0BM,SAAU,qBACZ,QACA,QACA,QACA,MAAa;AAEb,QAAM,MAAMJ,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,UAAM,sBAAsB,MAAM,uBAAuB;AACzD,WAAOC,WAAS,QAAQ,qBAAqB,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC5E,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYG,YAAU,MAAM,GAAG,CAAC;EACnD,OAAO;AACH,SAAK,UAAU,OAAOD,aAAW,MAAM,GAAG,CAAC;EAC/C;AACA,SAAOD,gBAAc,MAAM,MAAM,UAAU,CAAC;AAChD;;;ACtMA,SAASG,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AA0BM,SAAU,IACZ,QACA,QACA,QACA,OAAe;AAEf,QAAM,MAAMA,SAAM;AAClB,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,CAAC,CAAC;AAClD,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,KAAK,MAAM,CAAC,CAAC;AACzD,QAAM,MAAM,gBAAgB,MAAM;AAClC,QAAM,aAAa,IAAI,GAAG,MAAM,SAAS,KAAK,OAAO;AACrD,QAAM,aAAa,IAAI,GAAG,MAAM,SAAS,KAAK,MAAM;AACpD,QAAM,KAAK,WAAW;AACtB,QAAM,KAAK,WAAW;AACtB,QAAMC,QAAO,OAAO,SAAS,EAAE,KAAK,OAAO,SAAS,EAAE,IAAI,IAAI,KAAK,KAAK,OAAO;AAC/E,QAAM,cAAc,IAAI,GAAG,MAAM,UAAUA,OAAM,OAAO;AAExD,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAO,EAAE,QAAQ,YAAW;AAC5B,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,SAAO,KAAK;AAChB;;;ACrDA,IAAM,4BAA4B;AAClC,IAAM,sBAAsB;AAC5B,IAAM,gCAAgC;AACtC,IAAM,uBAAuB;AA2B7B,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,kDAAkD;EACtE;AACA,SAAO;AACX;AAEA,SAAS,SAAS,IAAY,IAAU;AACpC,MAAI,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,OAAO,SAAS,EAAE;AAAG,WAAO,OAAO;AAChE,UAAQ,KAAK,MAAM;AACvB;AAEA,SAAS,YAAY,GAAW,GAAS;AACrC,MAAI,CAAC,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC;AAAG,WAAO,OAAO;AAC9D,UAAQ,IAAI,KAAK;AACrB;AAEA,SAAS,aAAa,OAA0B,cAAoB;AAChE,MAAI,MAAM,UAAU;AAAc,WAAO,OAAO;AAChD,SAAO,MAAM,GAAG,YAAY;AAChC;AAEA,SAASC,WACL,UACA,kBACA,YACA,oBACA,cAAoB;AAEpB,QAAM,eAAe,IAAI,kBAAkB,QAAQ;AACnD,QAAM,cAAc,IAAI,kBAAkB,QAAQ;AAClD,QAAM,gBAAgB,IAAI,kBAAkB,QAAQ;AACpD,QAAM,gBAAgB,IAAI,kBAAkB,QAAQ;AACpD,QAAM,eAAe,IAAI,kBAAkB,QAAQ;AAInD,QAAM,WAAW,eAAe;AAChC,SAAO;IACH,SAAS,OAAO,OAAO;MACnB,QAAQ,eAAuB,YAAY;MAC3C,OAAO,eAAuB,WAAW;MACzC,SAAS,eAAuB,aAAa;MAC7C,SAAS,eAAuB,aAAa;MAC7C,QAAQ,eAAuB,YAAY;KAC9C;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,cAAc,IAAI,kBAAkB,QAAQ;IAC5C,cAAc,IAAI,kBAAkB,QAAQ;IAC5C,YAAY,IAAI,kBAAkB,QAAQ;IAC1C,gBAAgB,oBAAI,IAAG;;AAE/B;AAEA,SAASC,iBAAgB,MAAoB,QAAc;AACvD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,SAAS,KAAK,eAAe,IAAI,MAAM;AAC3C,MAAI,WAAW,QAAW;AACtB,aAAS,OAAO,OAAO;MACnB,QAAQ,sBAA8B,KAAK,cAAc,MAAM;MAC/D,OAAO,sBAA8B,KAAK,aAAa,MAAM;MAC7D,SAAS,sBAA8B,KAAK,eAAe,MAAM;MACjE,SAAS,sBAA8B,KAAK,eAAe,MAAM;MACjE,QAAQ,sBAA8B,KAAK,cAAc,MAAM;KAClE;AACD,SAAK,eAAe,IAAI,QAAQ,MAAM;EAC1C;AACA,SAAO;AACX;AAyCM,SAAU,SAAS,QAAgB,MAAmB;AACxD,QAAM,MAAMF,SAAM;AAClB,QAAM,mBAAmB,MAAM,oBAAoB;AACnD,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,qBAAqB,MAAM,sBAAsB;AACvD,QAAM,eAAe,MAAM,gBAAgB;AAC3C,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,MAAM,IAAI,OAAO;AAEvB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WACH,IAAI,OAAO,MAAM,MAAM,UACvB,kBACA,YACA,oBACA,YAAY;AAEhB,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AAKA,QAAM,WAAW,QAAQ,GAAG,MAAM,eAAe,IAAI,MAAM,gBAAgB,EAAE;AAC7E,QAAM,WAAW,OAAO,GAAG,MAAM,cAAc,IAAI,KAAK,gBAAgB,EAAE;AAC1E,QAAM,UAAU,QAAQ,GAAG,MAAM,cAAc,IAAI,MAAM,UAAU,EAAE;AACrE,QAAM,UAAU,OAAO,GAAG,MAAM,aAAa,IAAI,KAAK,UAAU,EAAE;AAClE,QAAM,YAAY,QAAQ,GAAG,MAAM,gBAAgB,IAAI,MAAM,kBAAkB,EAAE;AACjF,QAAM,YAAY,OAAO,GAAG,MAAM,eAAe,IAAI,KAAK,kBAAkB,EAAE;AAE9E,QAAM,SAAS,SAAS,UAAU,QAAQ;AAC1C,QAAM,QAAQ,SAAS,SAAS,OAAO;AACvC,QAAM,aAAa,SAAS,WAAW,SAAS;AAChD,QAAM,aAAa,YAAY,QAAQ,KAAK;AAE5C,MAAI,IAAI,QAAQ;AAMZ,SAAK,aAAa,YAAY,UAAU;AACxC,SAAK,aAAa,YAAY,UAAU;AACxC,SAAK,WAAW,YAAY,IAAI,KAAK;AACrC,SAAK,aAAa,YAAY,MAAM;AACpC,SAAK,YAAY,YAAY,KAAK;AAClC,SAAK,cAAc,YAAY,aAAa,KAAK,cAAc,YAAY,CAAC;AAC5E,SAAK,cAAc,YAAY,aAAa,KAAK,cAAc,YAAY,CAAC;AAC5E,SAAK,aAAa,YAAY,aAAa,KAAK,YAAY,YAAY,CAAC;EAC7E,OAAO;AACH,SAAK,aAAa,OAAO,UAAU;AACnC,SAAK,aAAa,OAAO,UAAU;AACnC,SAAK,WAAW,OAAO,IAAI,KAAK;AAChC,SAAK,aAAa,OAAO,MAAM;AAC/B,SAAK,YAAY,OAAO,KAAK;AAC7B,SAAK,cAAc,OAAO,aAAa,KAAK,cAAc,YAAY,CAAC;AACvE,SAAK,cAAc,OAAO,aAAa,KAAK,cAAc,YAAY,CAAC;AACvE,SAAK,aAAa,OAAO,aAAa,KAAK,YAAY,YAAY,CAAC;EACxE;AAEA,SAAOC,iBAAgB,MAAM,MAAM;AACvC;;;ACxNA,IAAMC,kBAAiB;AACvB,IAAMC,gBAAe;AACrB,IAAMC,gBAAe;AAcrB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,8CAA8C;EAClE;AACA,SAAO;AACX;AAEA,SAASC,WACL,QACA,YACA,YACA,UAAgB;AAEhB,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,WAAW,KAAK,aAAa;IAC7B,WAAW,KAAK,aAAa;IAC7B,cAAc,IAAI,kBAAkB,SAAS,CAAC;IAC9C,UAAU,OAAO;IACjB,gBAAgB,OAAO;;AAE/B;AAUA,SAAS,YAAY,MAAgB,SAAiB,MAAY;AAC9D,MAAI,KAAK,aAAa,SAAS,KAAK,SAAS;AAAG,WAAO,OAAO;AAC9D,MAAI,CAAC,OAAO,SAAS,OAAO;AAAG,WAAO;AAEtC,QAAM,SAAS,KAAK,aAAa,GAAG,KAAK,MAAM;AAC/C,MAAI,CAAC,OAAO,SAAS,MAAM;AAAG,WAAO;AAErC,QAAMC,UAAS,KAAK,IAAI,UAAU,MAAM;AAExC,MAAI,aAAa;AAKjB;AACI,UAAM,OAAO;AACb,UAAM,QAAQ,KAAK,aAAa,GAAG,CAAC;AACpC,QAAI,CAAC,OAAO,SAAS,KAAK;AAAG,aAAO;AACpC,kBAAc,KAAK,IAAI,OAAO,KAAK;EACvC;AACA,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACrC,UAAM,OAAO,KAAK,aAAa,GAAG,CAAC;AACnC,UAAM,QAAQ,KAAK,aAAa,GAAG,IAAI,CAAC;AACxC,QAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,KAAK;AAAG,aAAO;AAC9D,kBAAc,KAAK,IAAI,OAAO,KAAK;EACvC;AAEA,QAAM,KAAK,aAAa,IAAIA,UAAS,aAAa;AAClD,QAAM,MAAM,MAAM,KAAK,YAAY,KAAK,aAAa,KAAK,cAAc;AAIxE,MAAI,CAAC,OAAO,SAAS,IAAI;AAAG,WAAO;AACnC,SAAO,OAAO,MAAM,UAAU;AAClC;AAiCM,SAAU,KAAK,QAAgB,QAAwB,MAAe;AACxE,QAAM,MAAMF,SAAM;AAClB,QAAM,SAAS,MAAM,UAAUH;AAC/B,QAAM,aAAa,MAAM,cAAcC;AACvC,QAAM,aAAa,MAAM,cAAcC;AACvC,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOE,WAAS,QAAQ,YAAY,YAAY,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/E,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AAIZ,UAAM,QAAQ,YAAY,MAAM,KAAK,KAAK,cAAc;AACxD,SAAK,WAAW,OAAO,SAAS,KAAK,IAAI,QAAQ,KAAK;AACtD,SAAK,UAAU,YAAY,KAAK;EACpC,OAAO;AACH,SAAK,aAAa,OAAO,GAAG;AAC5B,UAAM,QAAQ,YAAY,MAAM,KAAK,KAAK,cAAc;AACxD,SAAK,iBAAiB,OAAO,SAAS,KAAK,IAAI,QAAQ,KAAK;AAC5D,SAAK,WAAW,KAAK;AACrB,SAAK,UAAU,OAAO,KAAK;EAC/B;AACA,SAAO,KAAK;AAChB;;;ACnIA,IAAME,kBAAiB;AACvB,IAAMC,sBAAqB;AAC3B,IAAMC,mBAAkC;AAWxC,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,iDAAiD;EACrE;AACA,SAAO;AACX;AAEA,SAASC,WACL,QACA,YACA,QACA,UAAgB;AAEhB,SAAO;IACH,aAAa,IAAI,kBAAkB,QAAQ;IAC3C,aAAa,IAAI,kBAAkB,QAAQ;IAC3C;IACA;IACA;IACA,SAAS;;AAEjB;AAEA,SAASC,YACL,QACA,WACA,QACA,QAAc;AAEd,UAAQ,QAAQ;IACZ,KAAK;AACD,aAAO,IAAI,WAAW,QAAQ,MAAM;IACxC,KAAK;AACD,aAAO,IAAI,WAAW,QAAQ,MAAM;IACxC,KAAK;AACD,aAAO,IAAI,WAAW,QAAQ,MAAM;IACxC,KAAK;AACD,aAAO,KAAK,WAAW,QAAQ,MAAM;EAC7C;AACJ;AA8BM,SAAU,QAAQ,QAAgB,MAAkB;AACtD,QAAM,MAAMF,SAAM;AAClB,QAAM,SAAS,MAAM,UAAUH;AAC/B,QAAM,aAAa,MAAM,cAAcC;AACvC,QAAM,SAAS,MAAM,UAAUC;AAC/B,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOE,WAAS,QAAQ,YAAY,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC3E,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,QAAQ,IAAI,OAAO,IAAI;AAC7B,QAAM,eAAeC,YAAW,KAAK,QAAQ,GAAG,MAAM,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM;AAC3F,QAAM,YAAY,IAAI,GAAG,MAAM,QAAQ,KAAK,MAAM;AAClD,MAAI,KAAK,YAAY,MAAM;AACvB,SAAK,UAAU,OAAO,OAAO;MACzB,OAAO,eAAuB,KAAK,WAAW;MAC9C,QAAQ;MACR,OAAO,eAAuB,KAAK,WAAW;KACjD;EACL;AACA,QAAM,MAAM,aAAa;AACzB,QAAM,WAAW,UAAU;AAC3B,MAAI;AACJ,MAAI;AACJ,MAAI,OAAO,SAAS,GAAG,KAAK,OAAO,SAAS,QAAQ,GAAG;AACnD,iBAAa,MAAM,KAAK,aAAa;AACrC,iBAAa,MAAM,KAAK,aAAa;EACzC,OAAO;AACH,iBAAa,OAAO;AACpB,iBAAa,OAAO;EACxB;AACA,MAAI,IAAI,QAAQ;AACZ,SAAK,YAAY,YAAY,UAAU;AACvC,SAAK,YAAY,YAAY,UAAU;EAC3C,OAAO;AACH,SAAK,YAAY,OAAO,UAAU;AAClC,SAAK,YAAY,OAAO,UAAU;EACtC;AACA,SAAO,KAAK;AAChB;;;ACpIA,IAAMC,uBAAsB;AAC5B,IAAMC,uBAAsB;AAC5B,IAAM,wBAAwB;AAmB9B,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,iDAAiD;EACrE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAgB;AAC9B,QAAM,aAAa,IAAI,kBAAkB,QAAQ;AACjD,SAAO;IACH,QAAQ;IACR;IACA,eAAe,eAAuB,UAAU;IAChD,SAAS,OAAO;IAChB,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,eAAe,OAAO;IACtB,iBAAiB;IACjB,cAAc;IACd,cAAc;IACd,UAAU;;AAElB;AAUA,SAAS,UACL,MACA,KACA,OACA,QACA,SACA,WACA,QACA,QAAc;AAEd,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AAC5E,WAAO,EAAE,IAAI,GAAG,KAAK,SAAS,OAAO,WAAW,IAAI,QAAQ,IAAI,OAAM;EAC1E;AACA,QAAM,MAAM,OAAO,MAAM;AACzB,QAAM,KAAK,OAAO;AAClB,MAAI;AACJ,MAAI,CAAC,OAAO,SAAS,OAAO,GAAG;AAI3B,WAAO,EAAE,IAAI,GAAG,KAAK,OAAO,GAAG,IAAI,GAAG,GAAE;EAC5C;AACA,MAAI,MAAM;AAAS,YAAQ;WAClB,MAAM;AAAS,YAAQ;;AAC3B,YAAQ;AACb,QAAM,KAAK,UAAU,YAAY,SAAS,KAAK,SAAS;AAKxD,QAAM,eAAe,OAAO,SAAS,MAAM,IAAI,SAAS;AACxD,MAAI,KAAK;AACT,MAAI,OAAO,KAAK,OAAO,SAAS,EAAE,GAAG;AACjC,SAAK,eAAe,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE,IAAI,QAAQ;AAE1D,QAAI,CAAC,OAAO,SAAS,EAAE;AAAG,WAAK;EACnC;AACA,SAAO,EAAE,IAAI,KAAK,OAAO,IAAI,GAAE;AACnC;AA+BM,SAAU,QAAQ,QAAgB,MAAkB;AACtD,QAAM,MAAMD,SAAM;AAClB,QAAM,aAAa,MAAM,cAAcF;AACvC,QAAM,aAAa,MAAM,cAAcC;AACvC,QAAM,eAAe,MAAM,gBAAgB;AAE3C,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOE,WAAS,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/C,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AAEA,QAAM,EAAE,MAAM,KAAK,OAAO,OAAM,IAAK,IAAI,OAAO;AAEhD,MAAI;AACJ,MAAI,IAAI,QAAQ;AAEZ,UAAMC,QAAO,UACT,MACA,KACA,OACA,QACA,KAAK,eACL,KAAK,iBACL,KAAK,cACL,KAAK,YAAY;AAErB,SAAKA,MAAK;EACd,OAAO;AAEH,SAAK,gBAAgB,KAAK;AAC1B,SAAK,kBAAkB,KAAK;AAC5B,SAAK,eAAe,KAAK;AACzB,SAAK,eAAe,KAAK;AACzB,UAAMA,QAAO,UACT,MACA,KACA,OACA,QACA,KAAK,SACL,KAAK,WACL,KAAK,QACL,KAAK,MAAM;AAEf,SAAKA,MAAK;AACV,SAAK,UAAUA,MAAK;AACpB,SAAK,YAAYA,MAAK;AACtB,SAAK,SAASA,MAAK;AACnB,SAAK,SAASA,MAAK;AACnB,SAAK,YAAY;EACrB;AAEA,QAAM,aAAa,IAAI,GAAG,MAAM,YAAY,IAAI,UAAU;AAC1D,QAAM,aAAa,IAAI,GAAG,MAAM,YAAY,IAAI,UAAU;AAC1D,QAAM,KAAK,WAAW;AACtB,QAAM,KAAK,WAAW;AACtB,QAAM,eAAe,OAAO,SAAS,EAAE,KAAK,OAAO,SAAS,EAAE,IAAI,KAAK,KAAK,OAAO;AAEnF,MAAI,IAAI;AAAQ,SAAK,WAAW,YAAY,YAAY;;AACnD,SAAK,WAAW,OAAO,YAAY;AAExC,QAAM,eAAe,IAAI,GAAG,MAAM,cAAc,cAAc,YAAY;AAE1E,MAAI,KAAK,WAAW,MAAM;AACtB,SAAK,SAAS,OAAO,OAAO;MACxB,SAAS,KAAK;MACd,QAAQ;KACX;EACL;AACA,SAAO,KAAK;AAChB;;;AChMA,IAAMC,uBAAsB;AAC5B,IAAMC,uBAAsB;AAC5B,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAC5B,IAAMC,yBAAwB;AAiB9B,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,QAAO,SAAiB,UAAgB;AAC7C,MAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,aAAa,KAAK,CAAC,OAAO,SAAS,OAAO,GAAG;AAC3E,WAAO,OAAO;EAClB;AACA,SAAQ,OAAO,UAAU,YAAa;AAC1C;AAEA,SAAS,cAAc,QAA2B,KAAa,QAAc;AACzE,MAAI,OAAO,UAAU;AAAQ,WAAO,OAAO;AAC3C,SAAOA,QAAO,KAAK,OAAO,GAAG,MAAM,CAAC;AACxC;AA6BM,SAAU,IAAI,QAAgB,QAAwB,MAAc;AACtE,QAAM,MAAMD,SAAM;AAClB,QAAM,aAAa,MAAM,cAAcH;AACvC,QAAM,aAAa,MAAM,cAAcC;AACvC,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,eAAe,MAAM,gBAAgBC;AAE3C,QAAM,MAAM,gBAAgB,MAAM;AAElC,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,UAAM,WAAW,IAAI,OAAO,MAAM,MAAM;AACxC,UAAM,SAAS,IAAI,kBAAkB,QAAQ;AAC7C,UAAM,cAAc,KAAK,IAAI,YAAY,YAAY,YAAY,UAAU,IAAI;AAC/E,WAAO;MACH,QAAQ;MACR;MACA,WAAW,eAAuB,MAAM;MACxC;MACA;MACA;MACA;MACA,cAAc,IAAI,kBAAkB,WAAW;;AAEnD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AAEA,MAAI,IAAI,QAAQ;AACZ,SAAK,aAAa,YAAY,GAAG;EACrC,OAAO;AACH,SAAK,aAAa,OAAO,GAAG;EAChC;AAEA,QAAM,OAAO,cAAc,KAAK,cAAc,KAAK,KAAK,UAAU;AAClE,QAAM,OAAO,cAAc,KAAK,cAAc,KAAK,KAAK,UAAU;AAClE,QAAM,OAAO,cAAc,KAAK,cAAc,KAAK,KAAK,UAAU;AAClE,QAAM,OAAO,cAAc,KAAK,cAAc,KAAK,KAAK,UAAU;AAElE,QAAM,WAAW,IAAI,GAAG,MAAM,UAAU,MAAM,UAAU;AACxD,QAAM,WAAW,IAAI,GAAG,MAAM,UAAU,MAAM,UAAU;AACxD,QAAM,WAAW,IAAI,GAAG,MAAM,UAAU,MAAM,UAAU;AACxD,QAAM,WAAW,IAAI,GAAG,MAAM,UAAU,MAAM,UAAU;AAExD,QAAM,KAAK,SAAS;AACpB,QAAM,KAAK,SAAS;AACpB,QAAM,KAAK,SAAS;AACpB,QAAM,KAAK,SAAS;AAEpB,QAAM,WACF,OAAO,SAAS,EAAE,KAAK,OAAO,SAAS,EAAE,KAAK,OAAO,SAAS,EAAE,KAAK,OAAO,SAAS,EAAE,IACjF,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAC3B,OAAO;AAEjB,MAAI,IAAI,QAAQ;AACZ,SAAK,OAAO,YAAY,QAAQ;EACpC,OAAO;AACH,SAAK,OAAO,OAAO,QAAQ;EAC/B;AAEA,QAAM,eAAe,IAAI,GAAG,MAAM,cAAc,UAAU,YAAY;AAEtE,MAAI,KAAK,WAAW,MAAM;AACtB,SAAK,SAAS,OAAO,OAAO;MACxB,KAAK,KAAK;MACV,QAAQ;KACX;EACL;AACA,SAAO,KAAK;AAChB;;;ACpIA,SAASG,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,8CAA8C;EAClE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,QAAM,SAAS,SAAS,KAAK;AAC7B,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;AAChC,UAAM,MAAM,IAAI;AAChB,aAAS,MAAM;EACnB;AACA,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA;IACA;IACA,cAAc,IAAI,kBAAkB,MAAM;;AAElD;AAEA,SAAS,eAAe,MAAgB,cAAqB;AAKzD,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AAErC,UAAM,cAAc,KAAK,SAAS,IAAI;AACtC,UAAM,IACF,gBAAgB,KAAK,iBAAiB,SAChC,eACA,KAAK,aAAa,GAAG,WAAW;AAC1C,QAAI,CAAC,OAAO,SAAS,CAAC;AAAG,aAAO,OAAO;AACvC,YAAQ;EACZ;AACA,QAAM,QAAQ,OAAO,KAAK;AAC1B,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACrC,UAAM,cAAc,KAAK,SAAS,IAAI;AACtC,UAAM,IACF,gBAAgB,KAAK,iBAAiB,SAChC,eACA,KAAK,aAAa,GAAG,WAAW;AAC1C,YAAQ,IAAI,KAAK,UAAU,IAAI;EACnC;AACA,QAAM,QAAQ,MAAM,KAAK;AACzB,QAAM,YAAY,QAAQ,QAAQ,KAAK;AACvC,SAAO,YAAY,SAAS,KAAK,SAAS;AAC9C;AAEA,SAASC,aAAW,MAAgB,KAAW;AAC3C,OAAK,aAAa,OAAO,GAAG;AAC5B,MAAI,KAAK,aAAa,SAAS,KAAK;AAAQ,WAAO,OAAO;AAC1D,SAAO,eAAe,IAAI;AAC9B;AAEA,SAASC,YAAU,MAAgB,KAAW;AAC1C,MAAI,KAAK,aAAa,SAAS,KAAK;AAAQ,WAAO,OAAO;AAC1D,MAAI,CAAC,OAAO,SAAS,GAAG;AAAG,WAAO,OAAO;AACzC,SAAO,eAAe,MAAM,GAAG;AACnC;AA6BM,SAAU,KACZ,QACA,QACA,QACA,OAAgB;AAEhB,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYE,YAAU,MAAM,GAAG,CAAC;EACnD,OAAO;AACH,SAAK,UAAU,OAAOD,aAAW,MAAM,GAAG,CAAC;EAC/C;AACA,SAAO,KAAK;AAChB;;;AC5HA,IAAM,kBAAyC,OAAO,OAAO,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;AACjF,IAAME,mBAAkC;AAQxC,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,kDAAkD;EACtE;AACA,SAAO;AACX;AAEA,SAASC,YACL,QACA,WACA,QACA,QAAc;AAEd,UAAQ,QAAQ;IACZ,KAAK;AACD,aAAO,IAAI,WAAW,QAAQ,MAAM;IACxC,KAAK;AACD,aAAO,IAAI,WAAW,QAAQ,MAAM;IACxC,KAAK;AACD,aAAO,IAAI,WAAW,QAAQ,MAAM;IACxC,KAAK;AACD,aAAO,KAAK,WAAW,QAAQ,MAAM;EAC7C;AACJ;AAwDM,SAAU,SACZ,QACA,QACA,MAAmB;AAEnB,QAAM,MAAMC,SAAM;AAClB,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,SAAS,MAAM,UAAUC;AAC/B,QAAM,MAAM,gBAAgB,MAAM;AAElC,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AAGpB,UAAM,UAA0C,CAAA;AAChD,eAAW,UAAU,SAAS;AAC1B,YAAM,YAAY,GAAG,MAAM,OAAO,MAAM;AACxC,cAAQ,MAAM,MAAM,EAAE,IAAIC,YAAW,QAAQ,WAAW,KAAK,MAAM;IACvE;AACA,WAAO;MACH,SAAS,OAAO,OAAO,OAAO;MAC9B;MACA;;AAEJ,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;AACnC,WAAO,KAAK;EAChB;AAKA,aAAW,UAAU,KAAK,SAAS;AAC/B,UAAM,YAAY,GAAG,MAAM,OAAO,MAAM;AACxC,IAAAA,YAAW,KAAK,QAAQ,WAAW,KAAK,MAAM;EAClD;AACA,SAAO,KAAK;AAChB;;;AClIA,IAAMC,gBAAe;AACrB,IAAMC,gBAAe;AACrB,IAAM,iBAAiB;AAqBvB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,8CAA8C;EAClE;AACA,SAAO;AACX;AAEA,SAASC,WACL,UACA,cACA,WAA4B;AAE5B,QAAM,UAAU,IAAI,kBAAkB,QAAQ;AAC9C,QAAM,UAAU,IAAI,kBAAkB,QAAQ;AAC9C,SAAO;IACH,QAAQ,OAAO,OAAO;MAClB,MAAM,eAAuB,OAAO;MACpC,QAAQ;MACR,MAAM,eAAuB,OAAO;KACvC;IACD;IACA;IACA;IACA,gBAAgB,oBAAI,IAAG;;AAE/B;AAEA,SAASC,iBAAgB,MAAgB,QAAc;AACnD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,SAAS,KAAK,eAAe,IAAI,MAAM;AAC3C,MAAI,WAAW,QAAW;AACtB,aAAS,OAAO,OAAO;MACnB,MAAM,sBAA8B,KAAK,SAAS,MAAM;MACxD,QAAQ,sBAA8B,KAAK,WAAW,MAAM;MAC5D,MAAM,sBAA8B,KAAK,SAAS,MAAM;KAC3D;AACD,SAAK,eAAe,IAAI,QAAQ,MAAM;EAC1C;AACA,SAAO;AACX;AA4BM,SAAU,KAAK,QAAgB,QAAwB,MAAe;AACxE,QAAM,MAAMF,SAAM;AAClB,QAAM,aAAa,MAAM,cAAcF;AACvC,QAAM,aAAa,MAAM,cAAcC;AACvC,QAAM,eAAe,MAAM,gBAAgB;AAC3C,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,eAAe,GAAG,MAAM;AAC9B,QAAM,MAAM,gBAAgB,MAAM;AAClC,QAAM,aAAa,IAAI,GAAG,MAAM,SAAS,KAAK,UAAU;AACxD,QAAM,aAAa,IAAI,GAAG,MAAM,SAAS,KAAK,UAAU;AACxD,QAAM,KAAK,WAAW;AACtB,QAAM,KAAK,WAAW;AACtB,QAAM,YAAY,OAAO,SAAS,EAAE,KAAK,OAAO,SAAS,EAAE,IAAI,KAAK,KAAK,OAAO;AAKhF,QAAM,eAAe,IAAI,cAAc,WAAW,YAAY;AAE9D,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AAGpB,UAAM,UAAU,IAAI,OAAO,QAAQ,IAAI,YAAY;AACnD,WAAOE,WAAS,IAAI,OAAO,MAAM,MAAM,UAAU,cAAc,QAAQ,SAAS;AAChF,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,aAAa;AACzB,QAAM,YACF,OAAO,SAAS,SAAS,KAAK,OAAO,SAAS,GAAG,IAAI,YAAY,MAAM,OAAO;AAClF,MAAI,IAAI,QAAQ;AACZ,SAAK,QAAQ,YAAY,SAAS;AAClC,SAAK,QAAQ,YAAY,SAAS;EACtC,OAAO;AACH,SAAK,QAAQ,OAAO,SAAS;AAC7B,SAAK,QAAQ,OAAO,SAAS;EACjC;AACA,SAAOC,iBAAgB,MAAM,MAAM;AACvC;;;ACjIA,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAa3B,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,mDAAmD;EACvE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,WAAmB,WAAmB,UAAgB;AACpE,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA;IACA,aAAa,IAAI,kBAAkB,SAAS;IAC5C,UAAU;IACV,cAAc,oBAAI,IAAG;;AAE7B;AAEA,SAASC,gBAAc,MAAqB,QAAc;AACtD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA8B,KAAK,WAAW,MAAM;AAC3D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAEA,SAAS,WAAW,IAAY,IAAU;AACtC,MAAI,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,OAAO,SAAS,EAAE,KAAK,OAAO;AAAG,WAAO,OAAO;AAC5E,SAAO,KAAK;AAChB;AAEA,SAAS,aAAa,MAAmB;AACrC,MAAI,MAAM;AACV,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,KAAK,YAAY,QAAQ,KAAK,GAAG;AACjD,UAAM,IAAI,KAAK,YAAY,GAAG,CAAC;AAC/B,QAAI,CAAC,OAAO,SAAS,CAAC,GAAG;AACrB,eAAS;AACT;IACJ;AACA,WAAO;EACX;AACA,OAAK,WAAW,SAAS,OAAO,MAAM;AAC1C;AAEA,SAASC,aAAW,MAAqB,OAAa;AAClD,MAAI,KAAK,YAAY,SAAS,KAAK,YAAY,UAAU;AACrD,SAAK,YAAY,OAAO,KAAK;AAC7B,QAAI,OAAO,SAAS,KAAK,GAAG;AACxB,WAAK,YAAY;IACrB,OAAO;AACH,WAAK,WAAW,OAAO;IAC3B;AACA,QAAI,KAAK,YAAY,SAAS,KAAK,YAAY;AAAU,aAAO,OAAO;AACvE,WAAO,KAAK;EAChB;AACA,QAAM,WAAW,KAAK,YAAY,GAAG,KAAK,YAAY,SAAS,CAAC;AAChE,OAAK,YAAY,OAAO,KAAK;AAC7B,MAAI,OAAO,SAAS,QAAQ,KAAK,OAAO,SAAS,KAAK,KAAK,OAAO,SAAS,KAAK,QAAQ,GAAG;AACvF,SAAK,WAAW,KAAK,WAAW,WAAW;EAC/C,OAAO;AACH,iBAAa,IAAI;EACrB;AACA,SAAO,KAAK;AAChB;AAEA,SAASC,YAAU,MAAqB,OAAa;AACjD,MAAI,KAAK,YAAY,SAAS,KAAK,YAAY;AAAU,WAAO,OAAO;AACvE,QAAM,eAAe,KAAK,YAAY,GAAG,CAAC;AAI1C,SAAO,KAAK,WAAW,eAAe;AAC1C;AA4BM,SAAU,UAAU,QAAgB,MAAoB;AAC1D,QAAM,MAAMJ,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,UAAM,YAAY,MAAM,aAAa;AACrC,UAAM,YAAY,MAAM,aAAa;AACrC,WAAOC,WAAS,WAAW,WAAW,IAAI,OAAO,MAAM,MAAM,QAAQ;AACrE,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,QAAQ,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI;AACnD,QAAM,aAAa,IAAI,GAAG,MAAM,SAAS,OAAO,KAAK,SAAS;AAC9D,QAAM,KAAK,WAAW;AACtB,QAAM,aAAa,IAAI,GAAG,MAAM,SAAS,IAAI,KAAK,SAAS;AAC3D,QAAM,KAAK,WAAW;AACtB,QAAM,QAAQ,WAAW,IAAI,EAAE;AAC/B,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYG,YAAU,MAAM,KAAK,CAAC;EACrD,OAAO;AACH,SAAK,UAAU,OAAOD,aAAW,MAAM,KAAK,CAAC;EACjD;AACA,SAAOD,gBAAc,MAAM,MAAM,UAAU,CAAC;AAChD;;;ACrIA,SAASG,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,kDAAkD;EACtE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,QAAQ,OAAO;IACf,cAAc,OAAO;IACrB,WAAW;;AAEnB;AAUA,SAAS,KAAK,KAAa,MAAc,QAAc;AACnD,MAAI,SAAS;AAAG,WAAO,OAAO;AAC9B,QAAM,QAAQ,MAAM;AACpB,QAAM,QAAQ,SAAS,QAAQ,QAAQ,QAAQ;AAC/C,SAAO,QAAQ,MAAM,QAAQ;AACjC;AAEA,SAASC,SAAQ,MAAoB,KAAa,QAAe;AAC7D,MAAI,CAAC,OAAO,SAAS,GAAG,GAAG;AAGvB,WAAO,SAAS,KAAK,SAAS,KAAK;EACvC;AAIA,MAAI,KAAK,YAAY,KAAK,SAAS,GAAG;AAClC,QAAI;AAAQ,aAAO,OAAO;AAC1B,SAAK,aAAa;AAClB,SAAK,eAAe,OAAO;AAC3B,SAAK,SAAS,OAAO;AACrB,WAAO,OAAO;EAClB;AACA,MAAI,CAAC,OAAO,SAAS,KAAK,YAAY,GAAG;AAErC,QAAI;AAAQ,aAAO;AACnB,SAAK,aAAa;AAClB,SAAK,eAAe;AACpB,SAAK,SAAS;AACd,WAAO;EACX;AACA,QAAM,OAAO,KAAK;AAClB,QAAM,OAAO,KAAK,KAAK,MAAM,KAAK,MAAM;AACxC,MAAI,CAAC,QAAQ;AACT,SAAK,eAAe;AACpB,SAAK,SAAS;EAClB;AACA,SAAO;AACX;AAwBM,SAAU,SACZ,QACA,QACA,QACA,OAAoB;AAEpB,QAAM,MAAMF,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,QAAQC,SAAQ,MAAM,gBAAgB,MAAM,GAAG,IAAI,MAAM;AAC/D,MAAI,IAAI;AAAQ,SAAK,UAAU,YAAY,KAAK;;AAC3C,SAAK,UAAU,OAAO,KAAK;AAChC,SAAO,KAAK;AAChB;;;AChGA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,gDAAgD;EACpE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,QAAQ,IAAI,kBAAkB,MAAM;IACpC,cAAc,IAAI,aAAa,MAAM;;AAE7C;AAUA,SAAS,eAAe,MAAkB,cAAoB;AAC1D,QAAM,MAAM,KAAK;AACjB,MAAI,IAAI;AACR,QAAM,SAAS,KAAK,OAAO;AAC3B,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;AAChC,UAAM,IAAI,MAAM,IAAI,eAAe,KAAK,OAAO,GAAG,CAAC;AACnD,QAAI,OAAO,SAAS,CAAC,GAAG;AACpB,UAAI,CAAC,IAAI;AACT,WAAK;IACT;EACJ;AACA,MAAI,MAAM;AAAG,WAAO,OAAO;AAG3B,QAAM,OAAO,IAAI,SAAS,GAAG,CAAC;AAC9B,OAAK,KAAI;AACT,MAAI,IAAI,MAAM;AAAG,WAAO,KAAM,IAAI,KAAM,CAAC;AACzC,UAAQ,MAAM,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK;AACjD;AAEA,SAASC,aAAW,MAAkB,KAAW;AAC7C,OAAK,OAAO,OAAO,GAAG;AACtB,MAAI,KAAK,OAAO,SAAS,KAAK;AAAQ,WAAO,OAAO;AACpD,SAAO,eAAe,MAAM,KAAK,OAAO,GAAG,CAAC,CAAC;AACjD;AAEA,SAASC,YAAU,MAAkB,KAAW;AAC5C,MAAI,KAAK,OAAO,SAAS,KAAK;AAAQ,WAAO,OAAO;AACpD,SAAO,eAAe,MAAM,GAAG;AACnC;AAsBM,SAAU,OACZ,QACA,QACA,QACA,OAAkB;AAElB,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYE,YAAU,MAAM,GAAG,CAAC;EACnD,OAAO;AACH,SAAK,UAAU,OAAOD,aAAW,MAAM,GAAG,CAAC;EAC/C;AACA,SAAO,KAAK;AAChB;;;ACvGA,SAASE,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC,cAAc,oBAAI,IAAG;IACrB;IACA,aAAa,IAAI,kBAAkB,MAAM;IACzC,aAAa,IAAI,kBAAkB,MAAM;IACzC,UAAU;IACV,UAAU;IACV,QAAQ,OAAO;;AAEvB;AAEA,SAASC,gBAAc,MAAe,QAAc;AAChD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA8B,KAAK,WAAW,MAAM;AAC3D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAQA,SAAS,SAAS,IAAY,QAAgB,QAAc;AACxD,MAAI,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,OAAO,SAAS,MAAM,GAAG;AAClD,WAAO,EAAE,OAAO,GAAG,OAAO,EAAC;EAC/B;AACA,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,OAAO,QAAQ;AAC3C,WAAO,EAAE,OAAO,GAAG,OAAO,EAAC;EAC/B;AACA,QAAM,KAAK,KAAK;AAChB,MAAI,KAAK;AAAQ,WAAO,EAAE,OAAO,IAAI,OAAO,EAAC;AAC7C,SAAO,EAAE,OAAO,GAAG,OAAO,GAAE;AAChC;AAEA,SAAS,QAAQ,QAAgB,QAAgB,OAAc;AAC3D,MAAI,CAAC;AAAO,WAAO,OAAO;AAC1B,QAAM,QAAQ,SAAS;AACvB,MAAI,UAAU;AAAG,WAAO,OAAO;AAC/B,SAAQ,MAAM,SAAU;AAC5B;AAqCM,SAAU,IAAI,QAAgB,QAAgB,MAAc;AAC9D,QAAM,MAAMF,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,EAAE,MAAM,KAAK,OAAO,OAAM,IAAK,IAAI,OAAO;AAChD,QAAM,MAAM,OAAO,MAAM,SAAS;AAClC,QAAM,EAAE,OAAO,MAAK,IAAK,SAAS,IAAI,KAAK,QAAQ,MAAM;AAMzD,QAAM,gBAAgB,OAAO,SAAS,KAAK,MAAM;AAEjD,MAAI,IAAI,QAAQ;AACZ,UAAM,QAAQ,KAAK,YAAY,WAAW,KAAK;AAC/C,QAAI,CAAC,SAAS,CAAC,eAAe;AAC1B,WAAK,UAAU,YAAY,OAAO,GAAG;AACrC,aAAOC,gBAAc,MAAM,MAAM;IACrC;AACA,UAAM,UAAU,KAAK,YAAY,GAAG,CAAC;AACrC,UAAM,UAAU,KAAK,YAAY,GAAG,CAAC;AACrC,UAAM,SAAS,KAAK,WAAW,UAAU;AACzC,UAAM,SAAS,KAAK,WAAW,UAAU;AACzC,SAAK,UAAU,YAAY,QAAQ,QAAQ,QAAQ,IAAI,CAAC;AACxD,WAAOA,gBAAc,MAAM,MAAM;EACrC;AAEA,MAAI,eAAe;AACf,QAAI,KAAK,YAAY,WAAW,KAAK,QAAQ;AACzC,WAAK,YAAY,KAAK,YAAY,GAAG,KAAK,SAAS,CAAC;AACpD,WAAK,YAAY,KAAK,YAAY,GAAG,KAAK,SAAS,CAAC;IACxD;AACA,SAAK,YAAY,OAAO,KAAK;AAC7B,SAAK,YAAY,OAAO,KAAK;AAC7B,SAAK,YAAY;AACjB,SAAK,YAAY;EACrB;AACA,MAAI,OAAO,SAAS,EAAE;AAAG,SAAK,SAAS;AACvC,OAAK,UAAU,OACX,QAAQ,KAAK,UAAU,KAAK,UAAU,KAAK,YAAY,WAAW,KAAK,MAAM,CAAC;AAElF,SAAOA,gBAAc,MAAM,MAAM;AACrC;;;AC5JA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,kDAAkD;EACtE;AACA,SAAO;AACX;AAmBM,SAAU,SACZ,QACA,QACA,QACA,OAAoB;AAEpB,QAAM,MAAMA,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAO,EAAE,QAAQ,KAAI;AACrB,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,OAAO,GAAG,MAAM,WAAW,QAAQ,EAAE,OAAM,CAAE;AACzD,MAAI,KAAK,WAAW;AAAM,SAAK,SAAS;AACxC,SAAO,KAAK;AAChB;;;AC1BA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,mDAAmD;EACvE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAgB;AAC9B,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC,cAAc,oBAAI,IAAG;IACrB,WAAW;IACX,WAAW,OAAO;IAClB,qBAAqB;IACrB,qBAAqB,OAAO;;AAEpC;AAEA,SAASC,gBAAc,MAAqB,QAAc;AACtD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA8B,KAAK,WAAW,MAAM;AAC3D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAEA,SAAS,YAAY,OAAa;AAC9B,MAAI,QAAQ;AAAG,WAAO;AACtB,MAAI,QAAQ;AAAG,WAAO;AACtB,SAAO;AACX;AAEA,SAASC,MACL,OACA,aACA,OACA,QAAc;AAEd,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AACzB,WAAO,EAAE,KAAK,OAAO,WAAW,YAAW;EAC/C;AACA,MAAI,CAAC,OAAO,SAAS,WAAW,GAAG;AAC/B,WAAO,EAAE,KAAK,OAAO,WAAW,MAAK;EACzC;AACA,MAAI,CAAC,OAAO,SAAS,MAAM,GAAG;AAC1B,WAAO,EAAE,KAAK,OAAO,WAAW,MAAK;EACzC;AACA,QAAM,YAAY,YAAY,QAAQ,WAAW;AACjD,SAAO,EAAE,KAAK,QAAQ,YAAY,QAAQ,WAAW,MAAK;AAC9D;AA8BM,SAAU,UAAU,QAAgB,MAAoB;AAC1D,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/C,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,EAAE,OAAO,OAAM,IAAK,IAAI,OAAO;AAErC,MAAI,IAAI,QAAQ;AACZ,UAAMG,QAAOD,MAAK,KAAK,qBAAqB,KAAK,qBAAqB,OAAO,MAAM;AACnF,SAAK,UAAU,YAAYC,MAAK,GAAG;AACnC,WAAOF,gBAAc,MAAM,MAAM;EACrC;AAEA,OAAK,sBAAsB,KAAK;AAChC,OAAK,sBAAsB,KAAK;AAChC,QAAM,OAAOC,MAAK,KAAK,WAAW,KAAK,WAAW,OAAO,MAAM;AAC/D,OAAK,YAAY,KAAK;AACtB,OAAK,YAAY,KAAK;AACtB,OAAK,UAAU,OAAO,KAAK,SAAS;AACpC,SAAOD,gBAAc,MAAM,MAAM;AACrC;;;ACjHA,IAAM,aAAa;AAkBnB,SAASG,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAgB;AAC9B,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC,cAAc,oBAAI,IAAG;IACrB,OAAO;IACP,WAAW,OAAO;IAClB,YAAY,OAAO;IACnB,iBAAiB;IACjB,qBAAqB,OAAO;IAC5B,sBAAsB,OAAO;;AAErC;AAEA,SAASC,gBAAc,MAAe,QAAc;AAChD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA8B,KAAK,WAAW,MAAM;AAC3D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAEA,SAASC,SAAQ,QAAc;AAC3B,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC9C;AAUA,SAASC,MACL,SACA,aACA,cACA,OACA,QAAc;AAEd,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AACzB,WAAO,EAAE,OAAO,SAAS,WAAW,aAAa,YAAY,aAAY;EAC7E;AACA,QAAM,IAAID,SAAQ,MAAM;AACxB,MAAI,CAAC,OAAO,SAAS,WAAW,GAAG;AAG/B,WAAO,EAAE,OAAO,SAAS,WAAW,OAAO,YAAY,EAAC;EAC5D;AACA,QAAM,KAAKA,SAAQ,YAAY;AAC/B,QAAM,eAAe,IAAI;AACzB,MAAI,CAAC,gBAAgB,gBAAgB,GAAG;AACpC,WAAO,EAAE,OAAO,SAAS,WAAW,OAAO,YAAY,EAAC;EAC5D;AACA,QAAM,OAAO,WAAW,KAAK,QAAQ,eAAe;AACpD,SAAO,EAAE,OAAO,MAAM,WAAW,OAAO,YAAY,EAAC;AACzD;AAkCM,SAAU,IAAI,QAAgB,MAAc;AAC9C,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/C,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,EAAE,OAAO,OAAM,IAAK,IAAI,OAAO;AAErC,MAAI,IAAI,QAAQ;AACZ,UAAMI,QAAOD,MACT,KAAK,iBACL,KAAK,qBACL,KAAK,sBACL,OACA,MAAM;AAEV,SAAK,UAAU,YAAYC,MAAK,KAAK;AACrC,WAAOH,gBAAc,MAAM,MAAM;EACrC;AAEA,OAAK,kBAAkB,KAAK;AAC5B,OAAK,sBAAsB,KAAK;AAChC,OAAK,uBAAuB,KAAK;AACjC,QAAM,OAAOE,MAAK,KAAK,OAAO,KAAK,WAAW,KAAK,YAAY,OAAO,MAAM;AAC5E,OAAK,QAAQ,KAAK;AAClB,OAAK,YAAY,KAAK;AACtB,OAAK,aAAa,KAAK;AACvB,OAAK,UAAU,OAAO,KAAK,KAAK;AAChC,SAAOF,gBAAc,MAAM,MAAM;AACrC;;;AC7JM,SAAU,GAAG,OAAe,aAAoB;AAClD,MAAI,OAAO,MAAM,KAAK;AAAG,WAAO,eAAe;AAC/C,SAAO;AACX;;;ACSA,SAASI,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAgB;AAC9B,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC,QAAQ;IACR,WAAW,OAAO;IAClB,kBAAkB;IAClB,qBAAqB,OAAO;;AAEpC;AAEA,SAASC,aAAY,OAAa;AAC9B,MAAI,QAAQ;AAAG,WAAO;AACtB,MAAI,QAAQ;AAAG,WAAO;AACtB,SAAO;AACX;AASA,SAASC,MACL,UACA,aACA,OACA,QAAc;AAEd,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AACzB,WAAO,EAAE,QAAQ,UAAU,WAAW,YAAW;EACrD;AACA,MAAI,CAAC,OAAO,SAAS,WAAW,GAAG;AAG/B,WAAO,EAAE,QAAQ,UAAU,WAAW,MAAK;EAC/C;AACA,MAAI,CAAC,OAAO,SAAS,MAAM,GAAG;AAG1B,WAAO,EAAE,QAAQ,UAAU,WAAW,MAAK;EAC/C;AACA,QAAM,YAAYD,aAAY,QAAQ,WAAW;AACjD,SAAO,EAAE,QAAQ,WAAW,YAAY,QAAQ,WAAW,MAAK;AACpE;AAwBM,SAAU,IAAI,QAAgB,OAAe;AAC/C,QAAM,MAAMF,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/C,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,EAAE,OAAO,OAAM,IAAK,IAAI,OAAO;AAErC,MAAI,IAAI,QAAQ;AACZ,UAAMG,QAAOD,MAAK,KAAK,kBAAkB,KAAK,qBAAqB,OAAO,MAAM;AAChF,SAAK,UAAU,YAAYC,MAAK,MAAM;AACtC,WAAO,KAAK;EAChB;AAGA,OAAK,mBAAmB,KAAK;AAC7B,OAAK,sBAAsB,KAAK;AAChC,QAAM,OAAOD,MAAK,KAAK,QAAQ,KAAK,WAAW,OAAO,MAAM;AAC5D,OAAK,SAAS,KAAK;AACnB,OAAK,YAAY,KAAK;AACtB,OAAK,UAAU,OAAO,KAAK,MAAM;AACjC,SAAO,KAAK;AAChB;;;AC3GA,IAAM,eAAe;AACrB,IAAM,gBAAgB;AAqBtB,SAASE,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,uDAAuD;EAC3E;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAkB,YAAoB,aAAmB;AACvE,QAAM,aAAa,IAAI,kBAAkB,QAAQ;AACjD,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,QAAM,aAAa,aAAa,cAAc;AAC9C,SAAO;IACH,SAAS,OAAO,OAAO;MACnB,MAAM,eAAuB,UAAU;MACvC,KAAK,eAAuB,SAAS;KACxC;IACD;IACA;IACA;IACA;IACA,YAAY,IAAI,kBAAkB,UAAU;IAC5C,WAAW,IAAI,kBAAkB,UAAU;IAC3C,UAAU;;AAElB;AAYA,SAAS,YACL,YACA,UACA,YACA,aAAmB;AAEnB,QAAM,YAAY;AAClB,QAAM,aAAa,WAAW,GAAG,SAAS;AAC1C,MAAI,CAAC,OAAO,SAAS,UAAU;AAAG,WAAO,OAAO;AAGhD,WAAS,IAAI,GAAG,IAAI,aAAa,KAAK,GAAG;AACrC,UAAM,IAAI,MAAM,IAAI,WAAW,WAAW,GAAG,CAAC;AAC9C,QAAI,CAAC,OAAO,SAAS,CAAC;AAAG,aAAO,OAAO;AACvC,QAAI,IAAI;AAAY,aAAO,OAAO;EACtC;AAIA,WAAS,IAAI,YAAY,GAAG,KAAK,YAAY,YAAY,KAAK,GAAG;AAC7D,UAAM,IAAI,WAAW,GAAG,CAAC;AACzB,QAAI,CAAC,OAAO,SAAS,CAAC;AAAG,aAAO,OAAO;AACvC,QAAI,KAAK;AAAY,aAAO,OAAO;EACvC;AACA,SAAO;AACX;AAOA,SAAS,cACL,WACA,SACA,YACA,aAAmB;AAEnB,QAAM,YAAY;AAClB,QAAM,YAAY,UAAU,GAAG,SAAS;AACxC,MAAI,CAAC,OAAO,SAAS,SAAS;AAAG,WAAO,OAAO;AAC/C,WAAS,IAAI,GAAG,IAAI,aAAa,KAAK,GAAG;AACrC,UAAM,IAAI,MAAM,IAAI,UAAU,UAAU,GAAG,CAAC;AAC5C,QAAI,CAAC,OAAO,SAAS,CAAC;AAAG,aAAO,OAAO;AACvC,QAAI,IAAI;AAAW,aAAO,OAAO;EACrC;AACA,WAAS,IAAI,YAAY,GAAG,KAAK,YAAY,YAAY,KAAK,GAAG;AAC7D,UAAM,IAAI,UAAU,GAAG,CAAC;AACxB,QAAI,CAAC,OAAO,SAAS,CAAC;AAAG,aAAO,OAAO;AACvC,QAAI,KAAK;AAAW,aAAO,OAAO;EACtC;AACA,SAAO;AACX;AAwCM,SAAU,cAAc,QAAgB,MAAwB;AAClE,QAAM,MAAMD,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,UAAM,aAAa,MAAM,cAAc;AACvC,UAAM,cAAc,MAAM,eAAe;AACzC,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,UAAU,YAAY,WAAW;AACxE,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,IAAI,OAAO;AACvB,QAAM,aAAa,KAAK,aAAa,KAAK,cAAc;AAExD,MAAI,IAAI,QAAQ;AAIZ,QAAI,KAAK,WAAW,YAAY;AAC5B,WAAK,WAAW,YAAY,OAAO,GAAG;AACtC,WAAK,UAAU,YAAY,OAAO,GAAG;IACzC,OAAO;AACH,WAAK,WAAW,YACZ,YAAY,KAAK,YAAY,IAAI,MAAM,KAAK,YAAY,KAAK,WAAW,CAAC;AAE7E,WAAK,UAAU,YACX,cAAc,KAAK,WAAW,IAAI,KAAK,KAAK,YAAY,KAAK,WAAW,CAAC;IAEjF;EACJ,OAAO;AACH,SAAK,WAAW,OAAO,IAAI,IAAI;AAC/B,SAAK,UAAU,OAAO,IAAI,GAAG;AAC7B,SAAK,YAAY;AACjB,QAAI,KAAK,WAAW,YAAY;AAC5B,WAAK,WAAW,OAAO,OAAO,GAAG;AACjC,WAAK,UAAU,OAAO,OAAO,GAAG;IACpC,OAAO;AAGH,WAAK,WAAW,OACZ,YACI,KAAK,YACL,KAAK,WAAW,GAAG,CAAC,GACpB,KAAK,YACL,KAAK,WAAW,CACnB;AAEL,WAAK,UAAU,OACX,cACI,KAAK,WACL,KAAK,UAAU,GAAG,CAAC,GACnB,KAAK,YACL,KAAK,WAAW,CACnB;IAET;EACJ;AACA,SAAO,KAAK;AAChB;;;AC3MA,IAAM,iBAAuC;AAE7C,IAAMC,cAAa;AA0CnB,IAAM,MAAM,OAAO;AAEnB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,wDAAwD;EAC5E;AACA,SAAO;AACX;AAEA,SAAS,gBAAa;AAClB,SAAO,EAAE,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAG;AAC1E;AAEA,SAAS,QAAQ,GAAW,GAAW,GAAS;AAC5C,QAAM,KAAK,IAAI,IAAI,KAAK;AACxB,QAAM,QAAQ,IAAI;AAClB,SAAO;IACH,IAAI;IACJ,IAAI,IAAI,IAAI;IACZ,IAAI,IAAI,IAAI;IACZ,IAAI,IAAI;IACR,IAAI,IAAI;IACR,IAAI,IAAI,IAAI;IACZ,IAAI,IAAI,IAAI;;AAEpB;AAEA,SAAS,UAAU,GAAW,GAAW,GAAS;AAC9C,QAAM,KAAK,IAAI,IAAI,KAAK;AACxB,QAAM,QAAQ,IAAI;AAClB,SAAO;IACH,IAAI;IACJ,IAAI,IAAI,QAAQ;IAChB,IAAI,IAAI,QAAQ;IAChB,IAAI,IAAI,QAAQ;IAChB,IAAI,IAAI,QAAQ;IAChB,IAAI,IAAI;IACR,IAAI,IAAI;;AAEhB;AAOA,SAAS,UAAU,GAAW,GAAW,GAAS;AAC9C,QAAM,KAAK,IAAI,IAAI,KAAK;AACxB,QAAM,QAAQ,IAAI;AAClB,SAAO;IACH,IAAI;IACJ,IAAI,IAAK,MAAM,QAAS;IACxB,IAAI,IAAK,MAAM,QAAS;IACxB,IAAI,IAAK,MAAM,QAAS;IACxB,IAAI,IAAK,MAAM,QAAS;IACxB,IAAI,IAAK,MAAM,QAAS;IACxB,IAAI,IAAK,MAAM,QAAS;;AAEhC;AAOA,SAAS,OAAO,GAAW,GAAW,GAAS;AAC3C,QAAM,KAAK,IAAI,IAAI,IAAI,KAAK;AAC5B,QAAM,QAAQ,IAAI;AAClB,SAAO;IACH,IAAI;IACJ,IAAI,IAAI,IAAI;IACZ,IAAI,IAAI,IAAI;IACZ,IAAI,IAAI;IACR,IAAI,IAAI;IACR,IAAI,IAAI,KAAK,IAAI;IACjB,IAAI,IAAI,KAAK,IAAI;;AAEzB;AAEA,IAAM,mBAEF,OAAO,OAAO;EACd;EACA;EACA;EACA;CACH;AAED,SAAS,cAAc,MAAwB;AAC3C,SAAO,kBAAkB,KAAK,aAAa,KAAK,YAAY,KAAK,cAAc,KAAK,MAAM;AAC9F;AAEA,SAAS,kBACL,UACA,SACA,WACA,QAA4B;AAE5B,MAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,CAAC,OAAO,SAAS,OAAO,KAAK,CAAC,OAAO,SAAS,SAAS,GAAG;AACxF,WAAO,cAAa;EACxB;AACA,SAAO,iBAAiB,MAAM,EAAE,UAAU,SAAS,SAAS;AAChE;AAEA,SAASC,WAAS,UAAkB,QAA4B;AAC5D,QAAM,WAAW,IAAI,kBAAkB,QAAQ;AAC/C,QAAM,WAAW,IAAI,kBAAkB,QAAQ;AAC/C,QAAM,WAAW,IAAI,kBAAkB,QAAQ;AAC/C,QAAM,WAAW,IAAI,kBAAkB,QAAQ;AAC/C,QAAM,WAAW,IAAI,kBAAkB,QAAQ;AAC/C,QAAM,WAAW,IAAI,kBAAkB,QAAQ;AAC/C,QAAM,WAAW,IAAI,kBAAkB,QAAQ;AAC/C,SAAO;IACH,SAAS,OAAO,OAAO;MACnB,IAAI,eAAuB,QAAQ;MACnC,IAAI,eAAuB,QAAQ;MACnC,IAAI,eAAuB,QAAQ;MACnC,IAAI,eAAuB,QAAQ;MACnC,IAAI,eAAuB,QAAQ;MACnC,IAAI,eAAuB,QAAQ;MACnC,IAAI,eAAuB,QAAQ;KACtC;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,UAAU;IACV,eAAe;IACf,gBAAgB;IAChB,eAAe;IACf,iBAAiB;IACjB,aAAa;IACb,YAAY;IACZ,cAAc;IACd,oBAAoB;IACpB,yBAAyB;IACzB,0BAA0B;IAC1B,yBAAyB;IACzB,2BAA2B;IAC3B,uBAAuB;IACvB,sBAAsB;IACtB,wBAAwB;;AAEhC;AAEA,SAAS,SAAS,MAAwB;AACtC,OAAK,qBAAqB,KAAK;AAC/B,OAAK,0BAA0B,KAAK;AACpC,OAAK,2BAA2B,KAAK;AACrC,OAAK,0BAA0B,KAAK;AACpC,OAAK,4BAA4B,KAAK;AACtC,OAAK,wBAAwB,KAAK;AAClC,OAAK,uBAAuB,KAAK;AACjC,OAAK,yBAAyB,KAAK;AACvC;AAGA,SAAS,QAAQ,KAAa,GAAS;AACnC,MAAI,CAAC,OAAO,SAAS,CAAC;AAAG,WAAO;AAMhC,MAAI,CAAC,OAAO,SAAS,GAAG;AAAG,WAAO;AAClC,SAAO,IAAI,MAAM,IAAI;AACzB;AAEA,SAAS,QAAQ,KAAa,GAAS;AACnC,MAAI,CAAC,OAAO,SAAS,CAAC;AAAG,WAAO;AAEhC,MAAI,CAAC,OAAO,SAAS,GAAG;AAAG,WAAO;AAClC,SAAO,IAAI,MAAM,IAAI;AACzB;AAEA,SAAS,WAAW,MAA0B,QAAqB,QAAe;AAC9E,MAAI,QAAQ;AACR,SAAK,SAAS,YAAY,OAAO,EAAE;AACnC,SAAK,SAAS,YAAY,OAAO,EAAE;AACnC,SAAK,SAAS,YAAY,OAAO,EAAE;AACnC,SAAK,SAAS,YAAY,OAAO,EAAE;AACnC,SAAK,SAAS,YAAY,OAAO,EAAE;AACnC,SAAK,SAAS,YAAY,OAAO,EAAE;AACnC,SAAK,SAAS,YAAY,OAAO,EAAE;EACvC,OAAO;AACH,SAAK,SAAS,OAAO,OAAO,EAAE;AAC9B,SAAK,SAAS,OAAO,OAAO,EAAE;AAC9B,SAAK,SAAS,OAAO,OAAO,EAAE;AAC9B,SAAK,SAAS,OAAO,OAAO,EAAE;AAC9B,SAAK,SAAS,OAAO,OAAO,EAAE;AAC9B,SAAK,SAAS,OAAO,OAAO,EAAE;AAC9B,SAAK,SAAS,OAAO,OAAO,EAAE;EAClC;AACJ;AAEA,SAASC,WACL,MACA,MACA,MACA,KACA,OAAa;AAEb,QAAM,SAAS,KAAK,MAAM,OAAOH,WAAU;AAC3C,WAAS,IAAI;AACb,MAAI,KAAK,aAAa,GAAG;AAGrB,SAAK,WAAW;AAChB,SAAK,gBAAgB;AACrB,SAAK,iBAAiB;AACtB,SAAK,gBAAgB;AACrB,SAAK,kBAAkB;AACvB,WAAO,cAAa;EACxB;AACA,MAAI,WAAW,KAAK,eAAe;AAE/B,SAAK,cAAc,KAAK;AACxB,SAAK,aAAa,KAAK;AACvB,SAAK,eAAe,KAAK;AACzB,SAAK,gBAAgB;AACrB,SAAK,iBAAiB;AACtB,SAAK,gBAAgB;AACrB,SAAK,kBAAkB;EAC3B,OAAO;AAEH,SAAK,iBAAiB,QAAQ,KAAK,gBAAgB,IAAI;AACvD,SAAK,gBAAgB,QAAQ,KAAK,eAAe,GAAG;AACpD,QAAI,OAAO,SAAS,KAAK;AAAG,WAAK,kBAAkB;EACvD;AACA,OAAK,YAAY;AACjB,SAAO,cAAc,IAAI;AAC7B;AAEA,SAASI,UACL,MACA,MACA,OACA,MACA,QAAc;AAEd,MAAI,KAAK,uBAAuB,GAAG;AAC/B,WAAO,cAAa;EACxB;AAGA,QAAM,SAAS,KAAK,MAAM,OAAOJ,WAAU;AAC3C,QAAM,UAAU,KAAK;AACrB,QAAM,eAAe,KAAK;AAC1B,QAAM,cAAc,KAAK;AACzB,QAAM,gBAAgB,KAAK;AAC3B,MAAI,WAAW,SAAS;AAIpB,WAAO,kBACH,KAAK,0BACL,KAAK,yBACL,KAAK,2BACL,KAAK,MAAM;EAEnB;AAEA,SAAO,kBAAkB,cAAc,aAAa,eAAe,KAAK,MAAM;AAClF;AA6CM,SAAU,eAAe,QAAgB,MAAyB;AACpE,QAAM,MAAMC,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,UAAM,SAAS,MAAM,UAAU;AAC/B,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,UAAU,MAAM;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,IAAI,OAAO;AACvB,MAAI,IAAI,QAAQ;AACZ,UAAM,SAASE,UAAS,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK;AACpE,eAAW,MAAM,QAAQ,IAAI;EACjC,OAAO;AACH,UAAM,SAASD,WAAU,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK;AACrE,eAAW,MAAM,QAAQ,KAAK;EAClC;AACA,SAAO,KAAK;AAChB;;;ACpYA,IAAM,gBAAgB;AACtB,IAAM,iBAAiB;AACvB,IAAME,kBAAiB;AAiBvB,SAAS,iBAAiB,QAAc;AACpC,SAAO;IACH,OAAO,IAAI;IACX;IACA,SAAS;IACT,WAAW;IACX,eAAe,OAAO;;AAE9B;AAEA,SAAS,aAAaC,QAAwB,KAAW;AACrD,MAAI,CAAC,OAAO,SAAS,GAAG,GAAG;AAGvB,WAAOA,OAAM;EACjB;AACA,MAAIA,OAAM,YAAYA,OAAM,QAAQ;AAChC,IAAAA,OAAM,WAAW;AACjB,IAAAA,OAAM,aAAa;AACnB,QAAIA,OAAM,YAAYA,OAAM,QAAQ;AAChC,MAAAA,OAAM,gBAAgB,OAAO;AAC7B,aAAO,OAAO;IAClB;AACA,UAAM,YAAYA,OAAM,UAAUA,OAAM;AACxC,IAAAA,OAAM,gBAAgB;AACtB,WAAO;EACX;AACA,QAAM,OAAOA,OAAM;AACnB,QAAM,OAAO,MAAMA,OAAM,QAAQ,QAAQ,IAAIA,OAAM;AACnD,EAAAA,OAAM,gBAAgB;AACtB,SAAO;AACX;AAEA,SAAS,YAAYA,QAAwB,KAAW;AACpD,MAAI,CAAC,OAAO,SAAS,GAAG;AAAG,WAAOA,OAAM;AACxC,MAAIA,OAAM,YAAYA,OAAM,QAAQ;AAChC,UAAM,UAAUA,OAAM,UAAU;AAChC,UAAM,YAAYA,OAAM,YAAY;AAOpC,QAAI,YAAYA,OAAM;AAAQ,aAAO,OAAO;AAC5C,WAAO,UAAUA,OAAM;EAC3B;AACA,SAAO,MAAMA,OAAM,QAAQA,OAAM,iBAAiB,IAAIA,OAAM;AAChE;AAaA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,iBAAgB,MAAe,QAAc;AAClD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,SAAS,KAAK,eAAe,IAAI,MAAM;AAC3C,MAAI,WAAW,QAAW;AACtB,aAAS,OAAO,OAAO;MACnB,KAAK,sBAA8B,KAAK,QAAQ,MAAM;MACtD,QAAQ,sBAA8B,KAAK,WAAW,MAAM;KAC/D;AACD,SAAK,eAAe,IAAI,QAAQ,MAAM;EAC1C;AACA,SAAO;AACX;AAEA,SAAS,YAAY,KAAa,SAAe;AAC7C,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,OAAO,KAAK,YAAY,GAAG;AACrE,WAAO,OAAO;EAClB;AACA,UAAQ,MAAM,UAAU,KAAK;AACjC;AA6BM,SAAU,IAAI,QAAgB,QAAwB,MAAc;AACtE,QAAM,MAAMD,SAAM;AAClB,QAAM,iBAAiB,MAAM,kBAAkB;AAC/C,QAAM,kBAAkB,MAAM,mBAAmB;AACjD,QAAM,eAAe,MAAM,gBAAgBF;AAC3C,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,eAAe,GAAG,MAAM;AAC9B,QAAM,SAAS,IAAI;AACnB,QAAM,MAAM,gBAAgB,MAAM;AAElC,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AAOxC,QAAM,aAAa;;IACS,MAAM,iBAAiB,OAAO;MACnD,MAAM,WAAW,OAAO;AAC/B,QAAM,OAAO,YAAY,KAAK,UAAU;AAIxC,MAAI,SAAS,QAAW;AACpB,UAAM,SAAS,IAAI,kBAAkB,IAAI,OAAO,MAAM,MAAM,QAAQ;AACpE,UAAM,SAAS,iBAAiB,cAAc;AAC9C,UAAM,SAAS,iBAAiB,eAAe;AAC/C,UAAMI,eAAc,aAAa,QAAQ,IAAI;AAK7C,UAAMC,UAAS,OAAO,SAASD,YAAW,IAAIA,eAAc,KAAK,OAAO;AACxE,UAAM,cAAc,aAAa,QAAQC,OAAM;AAC/C,WAAO,OAAO,WAAW;AACzB,UAAM,eAAe,IAAI,cAAc,aAAa,YAAY;AAChE,UAAM,UAAU,IAAI,OAAO,QAAQ,IAAI,YAAY;AAGnD,WAAO;MACH,QAAQ,OAAO,OAAO;QAClB,KAAK,eAAuB,MAAM;QAClC,QAAQ;OACX;MACD;MACA,WAAW,QAAQ;MACnB,gBAAgB,oBAAI,IAAG;MACvB;MACA;MACA,SAAS;MACT,eAAe,OAAO;;AAE1B,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;AACnC,WAAOF,iBAAgB,MAAM,MAAM;EACvC;AAGA,QAAM,cAAc,SAAS,YAAY,KAAK,QAAQ,IAAI,IAAI,aAAa,KAAK,QAAQ,IAAI;AAC5F,QAAM,SAAS,OAAO,SAAS,WAAW,IAAI,cAAc,KAAK,OAAO;AACxE,QAAM,WAAW,SAAS,YAAY,KAAK,QAAQ,MAAM,IAAI,aAAa,KAAK,QAAQ,MAAM;AAG7F,OAAK,IAAI,cAAc,UAAU,YAAY;AAE7C,MAAI,QAAQ;AACR,SAAK,OAAO,YAAY,QAAQ;EACpC,OAAO;AACH,SAAK,OAAO,OAAO,QAAQ;AAC3B,SAAK,gBAAgB,KAAK;AAC1B,SAAK,UAAU;EACnB;AAEA,SAAOA,iBAAgB,MAAM,MAAM;AACvC;;;AC3MA,IAAMG,gBAAe;AACrB,IAAMC,gBAAe;AACrB,IAAMC,kBAAiB;AAkBvB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WACL,UACA,cACA,WAA4B;AAE5B,QAAM,SAAS,IAAI,kBAAkB,QAAQ;AAC7C,QAAM,UAAU,IAAI,kBAAkB,QAAQ;AAC9C,SAAO;IACH,QAAQ,OAAO,OAAO;MAClB,KAAK,eAAuB,MAAM;MAClC,QAAQ;MACR,MAAM,eAAuB,OAAO;KACvC;IACD;IACA;IACA;IACA,gBAAgB,oBAAI,IAAG;;AAE/B;AAEA,SAASC,iBAAgB,MAAe,QAAc;AAClD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,SAAS,KAAK,eAAe,IAAI,MAAM;AAC3C,MAAI,WAAW,QAAW;AACtB,aAAS,OAAO,OAAO;MACnB,KAAK,sBAA8B,KAAK,QAAQ,MAAM;MACtD,QAAQ,sBAA8B,KAAK,WAAW,MAAM;MAC5D,MAAM,sBAA8B,KAAK,SAAS,MAAM;KAC3D;AACD,SAAK,eAAe,IAAI,QAAQ,MAAM;EAC1C;AACA,SAAO;AACX;AAEA,SAAS,SAAS,MAAc,MAAY;AACxC,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,IAAI,KAAK,SAAS;AAAG,WAAO,OAAO;AAClF,SAAQ,OAAO,OAAO,QAAS;AACnC;AAmCM,SAAU,IAAI,QAAgB,QAAwB,MAAc;AACtE,QAAM,MAAMF,SAAM;AAClB,QAAM,aAAa,MAAM,cAAcH;AACvC,QAAM,aAAa,MAAM,cAAcC;AACvC,QAAM,eAAe,MAAM,gBAAgBC;AAC3C,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,eAAe,GAAG,MAAM;AAC9B,QAAM,MAAM,gBAAgB,MAAM;AAClC,QAAM,aAAa,IAAI,GAAG,MAAM,SAAS,KAAK,UAAU;AACxD,QAAM,aAAa,IAAI,GAAG,MAAM,SAAS,KAAK,UAAU;AACxD,QAAM,KAAK,SAAS,WAAW,SAAS,WAAW,OAAO;AAK1D,QAAM,eAAe,IAAI,cAAc,IAAI,YAAY;AAEvD,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,UAAM,UAAU,IAAI,OAAO,QAAQ,IAAI,YAAY;AACnD,WAAOE,WAAS,IAAI,OAAO,MAAM,MAAM,UAAU,cAAc,QAAQ,SAAS;AAChF,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,aAAa;AACzB,QAAM,YAAY,OAAO,SAAS,EAAE,KAAK,OAAO,SAAS,GAAG,IAAI,KAAK,MAAM,OAAO;AAClF,MAAI,IAAI,QAAQ;AACZ,SAAK,OAAO,YAAY,EAAE;AAC1B,SAAK,QAAQ,YAAY,SAAS;EACtC,OAAO;AACH,SAAK,OAAO,OAAO,EAAE;AACrB,SAAK,QAAQ,OAAO,SAAS;EACjC;AACA,SAAOC,iBAAgB,MAAM,MAAM;AACvC;;;ACrIA,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AAExB,IAAM,WAAW;AACjB,IAAM,aAAa;AA8CnB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,8CAA8C;EAClE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAkB,UAAkB,SAAiB,QAAc;AACjF,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,QAAM,kBAAkB,IAAI,kBAAkB,QAAQ;AACtD,SAAO;IACH,SAAS,OAAO,OAAO;MACnB,KAAK,eAAuB,SAAS;MACrC,WAAW,eAAuB,eAAe;KACpD;IACD;IACA;IACA;IACA;IACA;IACA,UAAU;IACV,OAAO;IACP,IAAI,OAAO;IACX,IAAI;IACJ,KAAK,OAAO;IACZ,UAAU,OAAO;IACjB,SAAS,OAAO;IAChB,WAAW,OAAO;IAClB,UAAU,OAAO;IACjB,WAAW,OAAO;IAClB,iBAAiB;IACjB,cAAc,OAAO;IACrB,cAAc;IACd,eAAe,OAAO;IACtB,oBAAoB,OAAO;IAC3B,mBAAmB,OAAO;IAC1B,qBAAqB,OAAO;IAC5B,oBAAoB,OAAO;IAC3B,qBAAqB,OAAO;IAC5B,oBAAoB;;AAE5B;AAEA,SAASC,UAAS,MAAc;AAC5B,OAAK,kBAAkB,KAAK;AAC5B,OAAK,eAAe,KAAK;AACzB,OAAK,eAAe,KAAK;AACzB,OAAK,gBAAgB,KAAK;AAC1B,OAAK,qBAAqB,KAAK;AAC/B,OAAK,oBAAoB,KAAK;AAC9B,OAAK,sBAAsB,KAAK;AAChC,OAAK,qBAAqB,KAAK;AAC/B,OAAK,sBAAsB,KAAK;AAChC,OAAK,qBAAqB,KAAK;AACnC;AASA,SAAS,eACL,WACA,QACA,QACA,SACA,UACA,SACA,WACA,UACA,MACA,KACA,UACA,SACA,QAAc;AAEd,MAAI,eAAe,UAAU,UAAU,SAAS;AAEhD,MAAI,cAAc,UAAU;AACxB,UAAM,aAAa,KAAK,IAAI,SAAS,QAAQ;AAC7C,QAAI,eAAe;AAAY,qBAAe;AAE9C,QAAI,OAAO,cAAc;AAGrB,aAAO,EAAE,OAAO,YAAY,IAAI,KAAK,IAAI,UAAU,KAAK,OAAM;IAClE;AACA,QAAIC,MAAK;AACT,QAAIC,MAAK;AACT,QAAI,OAAO,QAAQ;AACf,MAAAD,MAAK;AACL,MAAAC,MAAK,KAAK,IAAI,SAAS,SAAS,MAAM;IAC1C;AACA,WAAO,EAAE,OAAO,UAAU,IAAAD,KAAI,IAAAC,KAAI,KAAK,aAAY;EACvD;AAGA,QAAM,aAAa,KAAK,IAAI,UAAU,SAAS;AAC/C,MAAI,eAAe;AAAY,mBAAe;AAE9C,MAAI,QAAQ,cAAc;AACtB,WAAO,EAAE,OAAO,UAAU,IAAI,MAAM,IAAI,UAAU,KAAK,OAAM;EACjE;AACA,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI,MAAM,QAAQ;AACd,SAAK;AACL,SAAK,KAAK,IAAI,SAAS,SAAS,MAAM;EAC1C;AACA,SAAO,EAAE,OAAO,YAAY,IAAI,IAAI,KAAK,aAAY;AACzD;AAEA,SAASC,WACL,MACA,MACA,KACA,OAAa;AAMb,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AAC5E,WAAO,EAAE,KAAK,OAAO,KAAK,WAAW,OAAO,IAAG;EACnD;AAKA,EAAAH,UAAS,IAAI;AACb,OAAK,YAAY;AAOjB,MAAI,KAAK,uBAAuB,GAAG;AAC/B,SAAK,QAAQ;AACb,SAAK,MAAM;AACX,SAAK,KAAK;AACV,SAAK,KAAK,KAAK;AACf,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,YAAY;AACjB,SAAK,WAAW;AAChB,SAAK,YAAY;AACjB,WAAO,EAAE,KAAK,KAAK,WAAW,SAAQ;EAC1C;AAKA,MAAI,KAAK,uBAAuB,GAAG;AAC/B,UAAM,YAAmB,SAAS,KAAK,YAAY,WAAW;AAC9D,SAAK,QAAQ;AACb,QAAI,cAAc,UAAU;AACxB,WAAK,KAAK;AACV,WAAK,MAAM,KAAK;IACpB,OAAO;AACH,WAAK,KAAK;AACV,WAAK,MAAM,KAAK;IACpB;AACA,SAAK,KAAK,KAAK;AAIf,UAAMI,QAAO,eACT,KAAK,OACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,UACL,KAAK,SACL,KAAK,UACL,KAAK,SACL,MACA,KACA,KAAK,UACL,KAAK,SACL,KAAK,MAAM;AAEf,SAAK,QAAQA,MAAK;AAClB,SAAK,KAAKA,MAAK;AACf,SAAK,KAAKA,MAAK;AACf,SAAK,MAAMA,MAAK;AAEhB,SAAK,YAAY,KAAK;AACtB,SAAK,WAAW,KAAK;AACrB,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,YAAY;AACjB,WAAO,EAAE,KAAKA,MAAK,KAAK,WAAWA,MAAK,MAAK;EACjD;AAGA,QAAMA,QAAO,eACT,KAAK,OACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,UACL,KAAK,SACL,KAAK,WACL,KAAK,UACL,MACA,KACA,KAAK,UACL,KAAK,SACL,KAAK,MAAM;AAEf,OAAK,QAAQA,MAAK;AAClB,OAAK,KAAKA,MAAK;AACf,OAAK,KAAKA,MAAK;AACf,OAAK,MAAMA,MAAK;AAChB,OAAK,YAAY,KAAK;AACtB,OAAK,WAAW,KAAK;AACrB,OAAK,WAAW;AAChB,OAAK,UAAU;AACf,OAAK,YAAY;AACjB,SAAO,EAAE,KAAKA,MAAK,KAAK,WAAWA,MAAK,MAAK;AACjD;AAEA,SAASC,UACL,MACA,MACA,KACA,OAAa;AAEb,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AAC5E,WAAO,EAAE,KAAK,OAAO,KAAK,WAAW,OAAO,IAAG;EACnD;AAIA,QAAM,eAAe,KAAK;AAC1B,MAAI,iBAAiB,GAAG;AAGpB,WAAO,EAAE,KAAK,KAAK,WAAW,SAAQ;EAC1C;AACA,MAAI,iBAAiB,GAAG;AACpB,UAAM,YAAmB,SAAS,KAAK,sBAAsB,WAAW;AACxE,QAAI;AACJ,QAAI;AACJ,QAAI,cAAc,UAAU;AACxB,WAAK;AACL,YAAM,KAAK;IACf,OAAO;AACH,WAAK;AACL,YAAM,KAAK;IACf;AACA,UAAM,KAAK,KAAK;AAChB,UAAMD,QAAO,eACT,WACA,IACA,IACA,KACA,KAAK,oBACL,KAAK,mBACL,KAAK,oBACL,KAAK,mBACL,MACA,KACA,KAAK,UACL,KAAK,SACL,KAAK,MAAM;AAEf,WAAO,EAAE,KAAKA,MAAK,KAAK,WAAWA,MAAK,MAAK;EACjD;AACA,QAAMA,QAAO,eACT,KAAK,iBACL,KAAK,cACL,KAAK,cACL,KAAK,eACL,KAAK,oBACL,KAAK,mBACL,KAAK,qBACL,KAAK,oBACL,MACA,KACA,KAAK,UACL,KAAK,SACL,KAAK,MAAM;AAEf,SAAO,EAAE,KAAKA,MAAK,KAAK,WAAWA,MAAK,MAAK;AACjD;AAmCM,SAAU,KAAK,QAAgB,MAAe;AAChD,QAAM,MAAMN,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,UAAM,WAAW,MAAM,qBAAqB;AAC5C,UAAM,UAAU,MAAM,oBAAoB;AAC1C,UAAM,SAAS,MAAM,mBAAmB;AACxC,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,UAAU,UAAU,SAAS,MAAM;AAC1E,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,OAAO,IAAI,OAAO,IAAI;AAC5B,QAAM,MAAM,IAAI,OAAO,IAAI;AAC3B,QAAM,QAAQ,IAAI,OAAO,IAAI;AAC7B,MAAI,IAAI,QAAQ;AACZ,UAAM,EAAE,KAAK,UAAS,IAAKM,UAAS,MAAM,MAAM,KAAK,KAAK;AAC1D,SAAK,UAAU,YAAY,GAAG;AAC9B,SAAK,gBAAgB,YAAY,SAAS;EAC9C,OAAO;AACH,UAAM,EAAE,KAAK,UAAS,IAAKF,WAAU,MAAM,MAAM,KAAK,KAAK;AAC3D,SAAK,UAAU,OAAO,GAAG;AACzB,SAAK,gBAAgB,OAAO,SAAS;EACzC;AACA,SAAO,KAAK;AAChB;;;AC1YA,IAAMG,cAAa;AAcnB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAgB;AAC9B,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC,cAAc,oBAAI,IAAG;IACrB,OAAOF;IACP,WAAW,OAAO;IAClB,YAAY,OAAO;IACnB,iBAAiBA;IACjB,qBAAqB,OAAO;IAC5B,sBAAsB,OAAO;;AAErC;AAEA,SAASG,gBAAc,MAAe,QAAc;AAChD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA8B,KAAK,WAAW,MAAM;AAC3D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAEA,SAASC,SAAQ,QAAc;AAC3B,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC9C;AAEA,SAASC,MACL,SACA,aACA,cACA,OACA,QAAc;AAEd,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AACzB,WAAO,EAAE,OAAO,SAAS,WAAW,aAAa,YAAY,aAAY;EAC7E;AACA,QAAM,IAAID,SAAQ,MAAM;AACxB,MAAI,CAAC,OAAO,SAAS,WAAW,GAAG;AAC/B,WAAO,EAAE,OAAO,SAAS,WAAW,OAAO,YAAY,EAAC;EAC5D;AACA,QAAM,KAAKA,SAAQ,YAAY;AAC/B,QAAM,eAAe,IAAI;AACzB,MAAI,CAAC,gBAAgB,gBAAgB,GAAG;AACpC,WAAO,EAAE,OAAO,SAAS,WAAW,OAAO,YAAY,EAAC;EAC5D;AACA,QAAM,OAAO,WAAW,KAAK,QAAQ,eAAe;AACpD,SAAO,EAAE,OAAO,MAAM,WAAW,OAAO,YAAY,EAAC;AACzD;AA+BM,SAAU,IAAI,QAAgB,MAAc;AAC9C,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/C,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,EAAE,OAAO,OAAM,IAAK,IAAI,OAAO;AAErC,MAAI,IAAI,QAAQ;AACZ,UAAMI,QAAOD,MACT,KAAK,iBACL,KAAK,qBACL,KAAK,sBACL,OACA,MAAM;AAEV,SAAK,UAAU,YAAYC,MAAK,KAAK;AACrC,WAAOH,gBAAc,MAAM,MAAM;EACrC;AAEA,OAAK,kBAAkB,KAAK;AAC5B,OAAK,sBAAsB,KAAK;AAChC,OAAK,uBAAuB,KAAK;AACjC,QAAM,OAAOE,MAAK,KAAK,OAAO,KAAK,WAAW,KAAK,YAAY,OAAO,MAAM;AAC5E,OAAK,QAAQ,KAAK;AAClB,OAAK,YAAY,KAAK;AACtB,OAAK,aAAa,KAAK;AACvB,OAAK,UAAU,OAAO,KAAK,KAAK;AAChC,SAAOF,gBAAc,MAAM,MAAM;AACrC;;;AC3IA,IAAMI,gBAAe;AACrB,IAAMC,gBAAe;AACrB,IAAMC,kBAAiB;AAgBvB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WACL,UACA,cACA,WAA4B;AAE5B,QAAM,SAAS,IAAI,kBAAkB,QAAQ;AAC7C,QAAM,UAAU,IAAI,kBAAkB,QAAQ;AAC9C,SAAO;IACH,QAAQ,OAAO,OAAO;MAClB,KAAK,eAAuB,MAAM;MAClC,QAAQ;MACR,MAAM,eAAuB,OAAO;KACvC;IACD;IACA;IACA;IACA,gBAAgB,oBAAI,IAAG;;AAE/B;AAEA,SAASC,iBAAgB,MAAe,QAAc;AAClD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,SAAS,KAAK,eAAe,IAAI,MAAM;AAC3C,MAAI,WAAW,QAAW;AACtB,aAAS,OAAO,OAAO;MACnB,KAAK,sBAA8B,KAAK,QAAQ,MAAM;MACtD,QAAQ,sBAA8B,KAAK,WAAW,MAAM;MAC5D,MAAM,sBAA8B,KAAK,SAAS,MAAM;KAC3D;AACD,SAAK,eAAe,IAAI,QAAQ,MAAM;EAC1C;AACA,SAAO;AACX;AAEA,SAAS,SAAS,MAAc,MAAY;AACxC,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,IAAI,KAAK,SAAS;AAAG,WAAO,OAAO;AAClF,SAAQ,OAAO,OAAO,QAAS;AACnC;AAiCM,SAAU,IAAI,QAAgB,MAAc;AAC9C,QAAM,MAAMF,SAAM;AAClB,QAAM,aAAa,MAAM,cAAcH;AACvC,QAAM,aAAa,MAAM,cAAcC;AACvC,QAAM,eAAe,MAAM,gBAAgBC;AAC3C,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,eAAe,GAAG,MAAM;AAC9B,QAAM,SAAS,IAAI,OAAO,IAAI;AAC9B,QAAM,aAAa,IAAI,GAAG,MAAM,SAAS,QAAQ,UAAU;AAC3D,QAAM,aAAa,IAAI,GAAG,MAAM,SAAS,QAAQ,UAAU;AAC3D,QAAM,KAAK,SAAS,WAAW,SAAS,WAAW,OAAO;AAC1D,QAAM,eAAe,IAAI,cAAc,IAAI,YAAY;AAEvD,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,UAAM,UAAU,IAAI,OAAO,QAAQ,IAAI,YAAY;AACnD,WAAOE,WAAS,IAAI,OAAO,MAAM,MAAM,UAAU,cAAc,QAAQ,SAAS;AAChF,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,aAAa;AACzB,QAAM,YAAY,OAAO,SAAS,EAAE,KAAK,OAAO,SAAS,GAAG,IAAI,KAAK,MAAM,OAAO;AAClF,MAAI,IAAI,QAAQ;AACZ,SAAK,OAAO,YAAY,EAAE;AAC1B,SAAK,QAAQ,YAAY,SAAS;EACtC,OAAO;AACH,SAAK,OAAO,OAAO,EAAE;AACrB,SAAK,QAAQ,OAAO,SAAS;EACjC;AACA,SAAOC,iBAAgB,MAAM,MAAM;AACvC;;;ACjHA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAgB;AAC9B,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC,cAAc,oBAAI,IAAG;IACrB,QAAQ;IACR,WAAW,OAAO;IAClB,kBAAkB;IAClB,qBAAqB,OAAO;;AAEpC;AAEA,SAASC,gBAAc,MAAe,QAAc;AAChD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA8B,KAAK,WAAW,MAAM;AAC3D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AASA,SAAS,aAAa,WAAmB,OAAe,QAAc;AAClE,MAAI,cAAc;AAAG,WAAO,OAAO;AACnC,QAAM,IAAI,OAAO,SAAS,MAAM,IAAI,SAAS;AAC7C,SAAQ,KAAK,QAAQ,aAAc;AACvC;AAUA,SAASC,MACL,OACA,aACA,OACA,QAAc;AAEd,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AACzB,WAAO,EAAE,KAAK,OAAO,WAAW,aAAa,MAAM,MAAK;EAC5D;AACA,MAAI,CAAC,OAAO,SAAS,WAAW,GAAG;AAE/B,WAAO,EAAE,KAAK,OAAO,WAAW,OAAO,MAAM,MAAK;EACtD;AACA,QAAM,IAAI,aAAa,aAAa,OAAO,MAAM;AACjD,MAAI,OAAO,MAAM,CAAC,GAAG;AAGjB,WAAO,EAAE,KAAK,OAAO,WAAW,OAAO,MAAM,OAAO,IAAG;EAC3D;AACA,QAAM,OAAO,QAAQ;AACrB,SAAO,EAAE,KAAK,MAAM,WAAW,OAAO,MAAM,KAAI;AACpD;AAyBM,SAAU,IAAI,QAAgB,MAAc;AAC9C,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/C,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,EAAE,OAAO,OAAM,IAAK,IAAI,OAAO;AAErC,MAAI,IAAI,QAAQ;AACZ,UAAMG,QAAOD,MAAK,KAAK,kBAAkB,KAAK,qBAAqB,OAAO,MAAM;AAChF,SAAK,UAAU,YAAYC,MAAK,IAAI;AACpC,WAAOF,gBAAc,MAAM,MAAM;EACrC;AAEA,OAAK,mBAAmB,KAAK;AAC7B,OAAK,sBAAsB,KAAK;AAChC,QAAM,OAAOC,MAAK,KAAK,QAAQ,KAAK,WAAW,OAAO,MAAM;AAC5D,OAAK,SAAS,KAAK;AACnB,OAAK,YAAY,KAAK;AACtB,OAAK,UAAU,OAAO,KAAK,IAAI;AAC/B,SAAOD,gBAAc,MAAM,MAAM;AACrC;;;ACpIA,SAASG,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,cAAc,IAAI,kBAAkB,SAAS,CAAC;;AAEtD;AAEA,SAAS,SAAS,MAAc,KAAW;AACvC,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,QAAQ;AAAG,WAAO,OAAO;AAChF,SAAQ,OAAO,OAAO,OAAQ;AAClC;AAEA,SAASC,aAAW,MAAe,KAAW;AAC1C,OAAK,aAAa,OAAO,GAAG;AAC5B,MAAI,KAAK,aAAa,UAAU,KAAK;AAAQ,WAAO,OAAO;AAC3D,QAAM,OAAO,KAAK,aAAa,GAAG,CAAC;AACnC,QAAM,MAAM,KAAK,aAAa,GAAG,KAAK,MAAM;AAC5C,SAAO,SAAS,MAAM,GAAG;AAC7B;AAEA,SAASC,YAAU,MAAe,KAAW;AAGzC,MAAI,KAAK,aAAa,UAAU,KAAK;AAAQ,WAAO,OAAO;AAC3D,QAAM,MAAM,KAAK,aAAa,GAAG,KAAK,MAAM;AAC5C,SAAO,SAAS,KAAK,GAAG;AAC5B;AAiBM,SAAU,IACZ,QACA,QACA,QACA,OAAe;AAEf,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYE,YAAU,MAAM,GAAG,CAAC;EACnD,OAAO;AACH,SAAK,UAAU,OAAOD,aAAW,MAAM,GAAG,CAAC;EAC/C;AACA,SAAO,KAAK;AAChB;;;ACzEA,IAAME,kBAAiB;AAiBvB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,8CAA8C;EAClE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,UAAU,IAAI,kBAAkB,QAAQ;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH,QAAQ;IACR;IACA;IACA,YAAY,eAAuB,OAAO;IAC1C,cAAc,eAAuB,SAAS;IAC9C;IACA,UAAU,IAAI,kBAAkB,CAAC;IACjC,UAAU,IAAI,kBAAkB,CAAC;IACjC,YAAY,IAAI,kBAAkB,CAAC;;AAE3C;AAOA,SAAS,UAAU,MAAuB;AACtC,MAAI,KAAK,SAAS;AAAG,WAAO,OAAO;AACnC,QAAM,KAAK,KAAK,GAAG,CAAC;AACpB,QAAM,KAAK,KAAK,GAAG,CAAC;AACpB,QAAM,KAAK,KAAK,GAAG,CAAC;AACpB,QAAM,KAAK,KAAK,GAAG,CAAC;AACpB,MACI,CAAC,OAAO,SAAS,EAAE,KACnB,CAAC,OAAO,SAAS,EAAE,KACnB,CAAC,OAAO,SAAS,EAAE,KACnB,CAAC,OAAO,SAAS,EAAE,GACrB;AACE,WAAO,OAAO;EAClB;AACA,UAAQ,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM;AACzC;AA0BM,SAAU,KAAK,QAAgB,MAAe;AAChD,QAAM,MAAMD,SAAM;AAClB,QAAM,SAAS,MAAM,UAAUD;AAE/B,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOE,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AAEA,QAAM,EAAE,MAAM,MAAM,KAAK,MAAK,IAAK,IAAI,OAAO;AAC9C,QAAM,KAAK,OAAO,SAAS,KAAK,KAAK,OAAO,SAAS,IAAI,IAAI,QAAQ,OAAO,OAAO;AACnF,QAAM,KAAK,OAAO,SAAS,IAAI,KAAK,OAAO,SAAS,GAAG,IAAI,OAAO,MAAM,OAAO;AAE/E,MAAI,IAAI,QAAQ;AACZ,SAAK,SAAS,YAAY,EAAE;AAC5B,SAAK,SAAS,YAAY,EAAE;EAChC,OAAO;AACH,SAAK,SAAS,OAAO,EAAE;AACvB,SAAK,SAAS,OAAO,EAAE;EAC3B;AAEA,QAAM,YAAY,UAAU,KAAK,QAAQ;AACzC,QAAMC,eAAc,UAAU,KAAK,QAAQ;AAE3C,QAAM,YAAY,IAAI,GAAG,MAAM,WAAW,WAAW,MAAM;AAC3D,QAAM,YAAY,IAAI,GAAG,MAAM,WAAWA,cAAa,MAAM;AAC7D,QAAM,SAAS,UAAU;AACzB,QAAM,SAAS,UAAU;AACzB,MAAI;AACJ,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,CAAC,OAAO,SAAS,MAAM,KAAK,WAAW,GAAG;AACtE,gBAAY,OAAO;EACvB,OAAO;AACH,gBAAY,SAAS;EACzB;AAEA,MAAI,IAAI,QAAQ;AACZ,SAAK,WAAW,YAAY,SAAS;AACrC,SAAK,QAAQ,YAAY,SAAS;EACtC,OAAO;AACH,SAAK,WAAW,OAAO,SAAS;AAChC,SAAK,QAAQ,OAAO,SAAS;EACjC;AAEA,QAAM,cAAc,UAAU,KAAK,UAAU;AAE7C,MAAI,IAAI;AAAQ,SAAK,UAAU,YAAY,WAAW;;AACjD,SAAK,UAAU,OAAO,WAAW;AAEtC,MAAI,KAAK,WAAW,MAAM;AACtB,SAAK,SAAS,OAAO,OAAO;MACxB,MAAM,KAAK;MACX,QAAQ,KAAK;KAChB;EACL;AACA,SAAO,KAAK;AAChB;;;ACnIA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,aAAa,IAAI,kBAAkB,MAAM;IACzC,MAAM;IACN,OAAO;IACP,SAAS,OAAO;IAChB,cAAc,oBAAI,IAAG;;AAE7B;AAEA,SAASC,gBAAc,MAAe,QAAc;AAChD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA8B,KAAK,WAAW,MAAM;AAC3D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAEA,SAASC,cAAa,GAAW,MAAc,OAAa;AACxD,QAAM,OAAO,OAAO;AACpB,QAAM,WAAW,QAAQ,IAAI,OAAO;AACpC,SAAO,KAAK,KAAK,KAAK,IAAI,GAAG,QAAQ,CAAC;AAC1C;AAGA,SAAS,oBAAoB,MAAe,KAAW;AACnD,MAAI,KAAK,YAAY,SAAS,KAAK,YAAY,UAAU;AACrD,SAAK,YAAY,OAAO,GAAG;AAC3B,QAAI,OAAO,SAAS,GAAG,GAAG;AACtB,WAAK,QAAQ;AACb,WAAK,SAAS,MAAM;IACxB,OAAO;AACH,WAAK,OAAO,OAAO;AACnB,WAAK,QAAQ,OAAO;IACxB;AACA,QAAI,KAAK,YAAY,SAAS,KAAK,YAAY;AAAU,aAAO,OAAO;AACvE,QAAI,CAAC,OAAO,SAAS,KAAK,IAAI;AAAG,aAAO,OAAO;AAC/C,WAAOA,cAAa,KAAK,YAAY,QAAQ,KAAK,MAAM,KAAK,KAAK;EACtE;AACA,QAAM,WAAW,KAAK,YAAY,GAAG,KAAK,YAAY,SAAS,CAAC;AAChE,OAAK,YAAY,OAAO,GAAG;AAC3B,MAAI,CAAC,OAAO,SAAS,GAAG,GAAG;AACvB,SAAK,OAAO,OAAO;AACnB,SAAK,QAAQ,OAAO;AACpB,WAAO,OAAO;EAClB;AACA,MAAI,CAAC,OAAO,SAAS,KAAK,IAAI,KAAK,CAAC,OAAO,SAAS,QAAQ,GAAG;AAG3D,QAAI,OAAO;AACX,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,IAAI,KAAK,YAAY,QAAQ,KAAK,GAAG;AACjD,YAAM,IAAI,KAAK,YAAY,GAAG,CAAC;AAC/B,UAAI,CAAC,OAAO,SAAS,CAAC,GAAG;AACrB,aAAK,OAAO,OAAO;AACnB,aAAK,QAAQ,OAAO;AACpB,eAAO,OAAO;MAClB;AACA,cAAQ;AACR,eAAS,IAAI;IACjB;AACA,SAAK,OAAO;AACZ,SAAK,QAAQ;EACjB,OAAO;AACH,SAAK,OAAO,KAAK,OAAO,WAAW;AACnC,SAAK,QAAQ,KAAK,QAAQ,WAAW,WAAW,MAAM;EAC1D;AACA,SAAOA,cAAa,KAAK,YAAY,QAAQ,KAAK,MAAM,KAAK,KAAK;AACtE;AAGA,SAAS,UAAU,MAAe,KAAW;AACzC,MAAI,KAAK,YAAY,SAAS,KAAK,YAAY;AAAU,WAAO,OAAO;AACvE,MAAI,CAAC,OAAO,SAAS,GAAG;AAAG,WAAO,OAAO;AACzC,QAAM,eAAe,KAAK,YAAY,GAAG,CAAC;AAC1C,QAAM,OAAO,KAAK,OAAO,eAAe;AACxC,QAAM,QAAQ,KAAK,QAAQ,eAAe,eAAe,MAAM;AAC/D,SAAOA,cAAa,KAAK,YAAY,QAAQ,MAAM,KAAK;AAC5D;AAEA,SAAS,SAAS,OAAeC,OAAY;AACzC,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,SAASA,KAAI,GAAG;AACnD,WAAO,EAAE,IAAI,OAAO,KAAK,MAAM,OAAO,IAAG;EAC7C;AACA,SAAO;IACH,IAAIA,QAAO,IAAI,QAAQ;IACvB,MAAMA,QAAO,IAAI,QAAQ;;AAEjC;AAEA,SAAS,SAAS,OAAe,SAAe;AAC5C,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,SAAS,OAAO;AAAG,WAAO,OAAO;AACxE,QAAM,QAAQ,QAAQ;AACtB,MAAI,UAAU;AAAG,WAAO,OAAO;AAC/B,SAAQ,MAAM,QAAS;AAC3B;AA6BM,SAAU,IACZ,QACA,QACA,QACA,MAAc;AAEd,QAAM,MAAMJ,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AACZ,UAAM,QAAQ,UAAU,MAAM,GAAG;AACjC,UAAMG,QAAO,MAAM,KAAK;AACxB,UAAM,EAAE,IAAI,KAAI,IAAK,SAAS,OAAOA,KAAI;AAGzC,UAAM,WAAW,IAAI,GAAG,MAAM,UAAU,IAAI,KAAK,MAAM;AACvD,UAAM,aAAa,IAAI,GAAG,MAAM,YAAY,MAAM,KAAK,MAAM;AAI7D,UAAM,QAAQ,OAAO,SAAS,GAAG,IAC3B,SAAS,SAAS,SAAS,WAAW,OAAO,IAC7C,OAAO;AACb,SAAK,UAAU,YAAY,KAAK;EACpC,OAAO;AACH,UAAM,QAAQ,oBAAoB,MAAM,GAAG;AAC3C,UAAMA,QAAO,MAAM,KAAK;AACxB,UAAM,EAAE,IAAI,KAAI,IAAK,SAAS,OAAOA,KAAI;AACzC,UAAM,WAAW,IAAI,GAAG,MAAM,UAAU,IAAI,KAAK,MAAM;AACvD,UAAM,aAAa,IAAI,GAAG,MAAM,YAAY,MAAM,KAAK,MAAM;AAC7D,UAAM,QAAQ,OAAO,SAAS,GAAG,IAC3B,SAAS,SAAS,SAAS,WAAW,OAAO,IAC7C,OAAO;AACb,SAAK,UAAU,OAAO,KAAK;AAC3B,SAAK,UAAU;EACnB;AACA,SAAOF,gBAAc,MAAM,MAAM,UAAU,CAAC;AAChD;;;AC7LA,IAAM,SAAS;AAWf,SAASG,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,8DAA8D;EAClF;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAgB;AAC9B,QAAM,OAAO,wBAAwB,QAAQ;AAC7C,QAAM,OAAwC;IAC1C,GAAG;IACH,QAAQ,OAAO,OAAO;MAClB,IAAI,UAAO;AACP,eAAO,KAAK;MAChB;MACA,KAAK,eAAuB,KAAK,SAAS;MAC1C,SAAS,eAAuB,KAAK,aAAa;MAClD,QAAQ,eAAuB,KAAK,YAAY;KACnD;IACD,gBAAgB,oBAAI,IAAG;;AAE3B,SAAO;AACX;AAEA,SAASC,kBACL,MACA,QAAc;AAEd,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,SAAS,KAAK,eAAe,IAAI,MAAM;AAC3C,MAAI,WAAW,QAAW;AACtB,aAAS,OAAO,OAAO;MACnB,IAAI,UAAO;AACP,eAAO,KAAK;MAChB;MACA,KAAK,sBAA8B,KAAK,WAAW,MAAM;MACzD,SAAS,sBAA8B,KAAK,eAAe,MAAM;MACjE,QAAQ,sBAA8B,KAAK,cAAc,MAAM;KAClE;AACD,SAAK,eAAe,IAAI,QAAQ,MAAM;EAC1C;AACA,SAAO;AACX;AAEA,SAAS,YAAY,MAAY;AAC7B,SAAO,KAAK,MAAM,OAAO,MAAM,IAAI;AACvC;AAEA,SAAS,0BACL,SAAe;AAEf,QAAM,QAAQ,0DAA0D,KAAK,QAAQ,KAAI,CAAE;AAC3F,MAAI,UAAU;AAAM,WAAO;AAC3B,QAAM,YAAY,OAAO,MAAM,CAAC,CAAC;AACjC,QAAM,cAAc,MAAM,CAAC,MAAM,SAAY,IAAI,OAAO,MAAM,CAAC,CAAC;AAChE,QAAM,UAAU,OAAO,MAAM,CAAC,CAAC;AAC/B,QAAM,YAAY,MAAM,CAAC,MAAM,SAAY,IAAI,OAAO,MAAM,CAAC,CAAC;AAC9D,MAAI,YAAY,KAAK,YAAY,MAAM,cAAc,KAAK,cAAc;AAAI,WAAO;AACnF,MAAI,UAAU,KAAK,UAAU,MAAM,YAAY,KAAK,YAAY;AAAI,WAAO;AAC3E,SAAO;IACH,cAAc,YAAY,KAAK;IAC/B,YAAY,UAAU,KAAK;;AAEnC;AAEA,SAAS,8BAA8B,MAAc,SAAe;AAChE,QAAM,SAAS,0BAA0B,OAAO;AAChD,MAAI,WAAW;AAAM,WAAO;AAC5B,QAAM,WAAW,YAAY,IAAI;AACjC,QAAM,WAAW,WAAW,OAAO,eAAe;AAClD,SAAO,QAAQ,WAAW,WAAW,WAAW;AACpD;AAEA,SAAS,uBAAuB,KAAqB,QAAc;AAC/D,QAAM,MAAM,wBAAwB,MAAM;AAC1C,MAAI,IAAI,qBAAqB,IAAI,GAAG;AAAG;AACvC,MAAI,qBAAqB,IAAI,GAAG;AAChC,iBAAe,IAAI,WAAW;IAC1B,MAAM;IACN,UAAU;IACV,MAAM;IACN,SACI;IACJ;IACA,KAAK,IAAI,SAAQ;GACpB;AACL;AAEA,SAAS,oBACL,KACA,QACA,MAA0C;AAE1C,MAAI,MAAM,iBAAiB;AAAW,WAAO,KAAK;AAClD,QAAM,UAAU,IAAI,MAAM,QAAQ;AAClC,MAAI,CAAC,IAAI,aAAa,cAAc,IAAI,SAAS,KAAK,YAAY,IAAI;AAClE,2BAAuB,KAAK,MAAM;AAClC,WAAO,YAAY,IAAI,OAAO,IAAI,IAAI;EAC1C;AACA,QAAM,WAAW,8BAA8B,IAAI,OAAO,IAAI,MAAM,OAAO;AAC3E,MAAI,aAAa,MAAM;AACnB,2BAAuB,KAAK,MAAM;AAClC,WAAO,YAAY,IAAI,OAAO,IAAI,IAAI;EAC1C;AACA,SAAO;AACX;AAEA,SAASC,aAAY,KAAqB,cAAoB;AAC1D,QAAM,EAAE,MAAK,IAAK,IAAI;AACtB,QAAM,OAA2B,CAAA;AACjC,WAAS,WAAW,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,YAAY,GAAG;AACtE,UAAM,OAAO,MAAM,KAAK,GAAG,QAAQ;AACnC,QAAI,QAAQ;AAAc;AAC1B,SAAK,KAAK;MACN,OAAO,MAAM,MAAM,GAAG,QAAQ;MAC9B,MAAM,MAAM,KAAK,GAAG,QAAQ;MAC5B,KAAK,MAAM,IAAI,GAAG,QAAQ;MAC1B,MAAM,MAAM,KAAK,GAAG,QAAQ;MAC5B;MACA,QAAQ,MAAM,OAAO,GAAG,QAAQ;KACnC;EACL;AACA,SAAO;AACX;AAsBM,SAAU,qBACZ,QACA,MAA+B;AAE/B,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/C,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AAEA,QAAM,eAAe,oBAAoB,KAAK,QAAQ,IAAI;AAC1D,QAAM,OAAO,IAAI,OAAO,IAAI,QAAQ,eAAe,CAAA,IAAKE,aAAY,KAAK,YAAY;AACrF,QAAMC,YAAW,6BAA6B;IAC1C;IACA,aAAa,MAAM;IACnB,QAAQ,4BAA4B,QAAQ,CAAA,CAAE;GACjD;AACD,8BAA4B,MAAM,IAAI,QAAQA,SAAQ;AACtD,6BACI,KACA,QACA,0BACAA,UAAS,KACTA,UAAS,OAAO;AAEpB,SAAOF,kBAAgB,MAAM,MAAM,UAAU,CAAC;AAClD;;;AC/LA,IAAM,mBAAmB;AACzB,IAAMG,iBAAgB;AACtB,IAAMC,kBAAiB;AACvB,IAAM,mBAAmB;AASzB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,kBAAgB,MAAe,QAAc;AAClD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,SAAS,KAAK,eAAe,IAAI,MAAM;AAC3C,MAAI,WAAW,QAAW;AACtB,aAAS,OAAO,OAAO;MACnB,KAAK,sBAA8B,KAAK,QAAQ,MAAM;MACtD,QAAQ,sBAA8B,KAAK,WAAW,MAAM;KAC/D;AACD,SAAK,eAAe,IAAI,QAAQ,MAAM;EAC1C;AACA,SAAO;AACX;AAEA,SAAS,SAAS,aAAqB,aAAmB;AACtD,MAAI,CAAC,OAAO,SAAS,WAAW,KAAK,CAAC,OAAO,SAAS,WAAW,KAAK,gBAAgB,GAAG;AACrF,WAAO,OAAO;EAClB;AACA,SAAQ,MAAM,cAAe;AACjC;AAwCM,SAAU,IAAI,QAAgB,MAAc;AAC9C,QAAM,MAAMD,SAAM;AAClB,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,iBAAiB,MAAM,kBAAkBF;AAC/C,QAAM,kBAAkB,MAAM,mBAAmBC;AACjD,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,SAAS,IAAI;AACnB,QAAM,MAAM,IAAI,OAAO;AAEvB,QAAM,KAAK,QAAQ,GAAG,MAAM,OAAO,IAAI,MAAM,OAAO,EAAE;AACtD,QAAM,KAAK,OAAO,GAAG,MAAM,OAAO,IAAI,KAAK,OAAO,EAAE;AACpD,MAAI;AACJ,MAAI;AACJ,MAAI,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,OAAO,SAAS,EAAE,GAAG;AAC9C,UAAM,OAAO;AACb,UAAM,OAAO;EACjB,OAAO;AACH,UAAM,MAAM,KAAK,MAAM;AACvB,UAAM,IAAI,QAAQ;AAClB,WAAO,KAAK,MAAM;EACtB;AAEA,QAAM,WAAW,IAAI,GAAG,MAAM,WAAW,KAAK,cAAc,EAAE;AAC9D,QAAM,cAAc,IAAI,GAAG,MAAM,YAAY,UAAU,eAAe,EAAE;AACxE,QAAM,WAAW,IAAI,GAAG,MAAM,WAAW,KAAK,cAAc,EAAE;AAC9D,QAAM,cAAc,IAAI,GAAG,MAAM,YAAY,UAAU,eAAe,EAAE;AACxE,QAAM,SAAS,SAAS,aAAa,WAAW;AAEhD,QAAM,eAAe,GAAG,MAAM;AAC9B,QAAM,eAAe,IAAI,cAAc,QAAQ,OAAO;AAEtD,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,UAAM,SAAS,IAAI,kBAAkB,IAAI,OAAO,MAAM,MAAM,QAAQ;AACpE,UAAM,UAAU,IAAI,OAAO,QAAQ,IAAI,YAAY;AAGnD,WAAO;MACH,QAAQ,OAAO,OAAO;QAClB,KAAK,eAAuB,MAAM;QAClC,QAAQ;OACX;MACD;MACA,WAAW,QAAQ;MACnB,gBAAgB,oBAAI,IAAG;;AAE3B,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AAEA,MAAI,QAAQ;AACR,SAAK,OAAO,YAAY,MAAM;EAClC,OAAO;AACH,SAAK,OAAO,OAAO,MAAM;EAC7B;AAEA,SAAOE,kBAAgB,MAAM,MAAM;AACvC;;;AChIA,IAAMC,oBAAmB;AACzB,IAAM,sBAAsB;AAC5B,IAAMC,oBAAmB;AAMzB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,+CAA+C;EACnE;AACA,SAAO;AACX;AA+BM,SAAU,MAAM,QAAgB,MAAgB;AAClD,QAAM,MAAMA,SAAM;AAClB,QAAM,UAAU,MAAM,WAAWF;AACjC,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,UAAU,MAAM,WAAWC;AACjC,QAAM,MAAM,IAAI,OAAO;AAEvB,QAAM,WAAW,QAAQ,GAAG,MAAM,OAAO,IAAI,MAAM,OAAO;AAC1D,QAAM,WAAW,OAAO,GAAG,MAAM,OAAO,IAAI,KAAK,OAAO;AACxD,QAAM,KAAK,SAAS;AACpB,QAAM,KAAK,SAAS;AACpB,MAAI;AACJ,MAAI,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,OAAO,SAAS,EAAE,GAAG;AAC9C,WAAO,OAAO;EAClB,WAAW,OAAO,IAAI;AAClB,WAAO,OAAO;EAClB,OAAO;AACH,WAAQ,OAAO,IAAI,QAAQ,OAAQ,KAAK;EAC5C;AAEA,QAAM,UAAU,IAAI,GAAG,MAAM,YAAY,MAAM,UAAU;AACzD,QAAM,UAAU,IAAI,GAAG,MAAM,MAAM,QAAQ,SAAS,OAAO;AAE3D,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAO;MACH,QAAQ,OAAO,OAAO,EAAE,GAAG,SAAS,GAAG,QAAO,CAAE;;AAEpD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,SAAO,KAAK;AAChB;;;AC3EA,IAAME,sBAAqB;AAC3B,IAAM,uBAAuB;AAC7B,IAAMC,uBAAsB;AAC5B,IAAM,sBAAsB;AAM5B,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,kDAAkD;EACtE;AACA,SAAO;AACX;AAiCM,SAAU,SACZ,QACA,QACA,MAAmB;AAEnB,QAAM,MAAMA,SAAM;AAClB,QAAM,YAAY,MAAM,aAAaF;AACrC,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,aAAa,MAAM,cAAcC;AACvC,QAAM,aAAa,MAAM,cAAc;AAEvC,QAAM,MAAM,gBAAgB,MAAM;AAClC,QAAM,YAAY,IAAI,GAAG,MAAM,QAAQ,KAAK,SAAS;AACrD,QAAM,aAAa,UAAU;AAC7B,QAAM,WAAW,QAAQ,GAAG,MAAM,OAAO,YAAY,WAAW;AAChE,QAAM,WAAW,OAAO,GAAG,MAAM,OAAO,YAAY,WAAW;AAC/D,QAAM,KAAK,SAAS;AACpB,QAAM,KAAK,SAAS;AACpB,MAAI;AACJ,MAAI,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,OAAO,SAAS,UAAU,GAAG;AAC9E,WAAO,OAAO;EAClB,WAAW,OAAO,IAAI;AAClB,WAAO,OAAO;EAClB,OAAO;AACH,WAAQ,OAAO,aAAa,OAAQ,KAAK;EAC7C;AAEA,QAAM,UAAU,IAAI,GAAG,MAAM,YAAY,MAAM,UAAU;AACzD,QAAM,UAAU,IAAI,GAAG,MAAM,MAAM,QAAQ,SAAS,UAAU;AAE9D,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAO;MACH,QAAQ,OAAO,OAAO,EAAE,GAAG,SAAS,GAAG,QAAO,CAG7C;;AAEL,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,SAAO,KAAK;AAChB;;;AC7FA,IAAME,kBAAiB;AACvB,IAAMC,sBAAqB;AAE3B,IAAMC,YAAW;AACjB,IAAMC,cAAa;AA+BnB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,oDAAoD;EACxE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAkB,QAAgB,YAAkB;AAClE,QAAM,aAAa,IAAI,kBAAkB,QAAQ;AACjD,QAAM,kBAAkB,IAAI,kBAAkB,QAAQ;AACtD,SAAO;IACH,SAAS,OAAO,OAAO;MACnB,MAAM,eAAuB,UAAU;MACvC,WAAW,eAAuB,eAAe;KACpD;IACD;IACA;IACA;IACA;IACA,cAAc;IACd,gBAAgB,OAAO;IACvB,gBAAgB,OAAO;IACvB,eAAeH;IACf,WAAW,OAAO;IAClB,sBAAsB,OAAO;IAC7B,sBAAsB,OAAO;IAC7B,qBAAqBA;IACrB,qBAAqB,OAAO;IAC5B,wBAAwB;;AAEhC;AAEA,SAASI,UAAS,MAAoB;AAClC,OAAK,uBAAuB,KAAK;AACjC,OAAK,uBAAuB,KAAK;AACjC,OAAK,sBAAsB,KAAK;AAChC,OAAK,sBAAsB,KAAK;AAChC,OAAK,yBAAyB,KAAK;AACvC;AAUA,SAASC,gBACL,KACA,UACA,OACA,YACA,gBACA,gBACA,eACA,WAAiB;AAEjB,QAAM,aAAa,MAAM,aAAa;AACtC,QAAM,aAAa,MAAM,aAAa;AACtC,QAAM,aACF,aAAa,kBAAkB,YAAY,iBAAiB,aAAa;AAC7E,QAAM,aACF,aAAa,kBAAkB,YAAY,iBAAiB,aAAa;AAC7E,MAAI,YAAmB;AACvB,MAAI,QAAQ,gBAAgB;AACxB,gBAAYL;EAChB,WAAW,QAAQ,gBAAgB;AAC/B,gBAAYC;EAChB;AACA,QAAMK,QAAO,cAAcN,YAAW,aAAa;AACnD,SAAO,EAAE,YAAY,YAAY,WAAW,MAAAM,MAAI;AACpD;AAEA,SAASC,WACL,MACA,KACA,UACA,OAAa;AAGb,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,QAAQ,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AAChF,WAAO,EAAE,MAAM,OAAO,KAAK,WAAW,OAAO,IAAG;EACpD;AACA,EAAAH,UAAS,IAAI;AACb,OAAK,gBAAgB;AAKrB,MAAI,KAAK,2BAA2B,GAAG;AACnC,UAAM,aAAa,MAAM,KAAK,aAAa;AAC3C,UAAM,aAAa,MAAM,KAAK,aAAa;AAC3C,SAAK,iBAAiB;AACtB,SAAK,iBAAiB;AACtB,SAAK,gBAAgBJ;AACrB,SAAK,YAAY;AACjB,WAAO,EAAE,MAAM,YAAY,WAAWA,UAAQ;EAClD;AAEA,QAAMQ,QAAOH,gBACT,KACA,UACA,OACA,KAAK,YACL,KAAK,gBACL,KAAK,gBACL,KAAK,eACL,KAAK,SAAS;AAElB,OAAK,iBAAiBG,MAAK;AAC3B,OAAK,iBAAiBA,MAAK;AAC3B,OAAK,gBAAgBA,MAAK;AAC1B,OAAK,YAAY;AACjB,SAAO,EAAE,MAAMA,MAAK,MAAM,WAAWA,MAAK,UAAS;AACvD;AAEA,SAASC,UACL,MACA,KACA,UACA,OAAa;AAEb,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,QAAQ,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AAChF,WAAO,EAAE,MAAM,OAAO,KAAK,WAAW,OAAO,IAAG;EACpD;AAEA,MAAI,KAAK,2BAA2B,GAAG;AAGnC,UAAM,aAAa,MAAM,KAAK,aAAa;AAC3C,WAAO,EAAE,MAAM,YAAY,WAAWT,UAAQ;EAClD;AACA,QAAMQ,QAAOH,gBACT,KACA,UACA,OACA,KAAK,YACL,KAAK,sBACL,KAAK,sBACL,KAAK,qBACL,KAAK,mBAAmB;AAE5B,SAAO,EAAE,MAAMG,MAAK,MAAM,WAAWA,MAAK,UAAS;AACvD;AAiCM,SAAU,WAAW,QAAgB,MAAqB;AAC5D,QAAM,MAAMN,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,UAAM,SAAS,MAAM,UAAUJ;AAC/B,UAAM,aAAa,MAAM,cAAcC;AACvC,WAAOI,WAAS,IAAI,OAAO,MAAM,MAAM,UAAU,QAAQ,UAAU;AACnE,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AAGA,QAAM,YAA4B,IAAI,GAAG,MAAM,QAAQ,KAAK,MAAM;AAClE,QAAM,MAAM,IAAI,OAAO,IAAI;AAC3B,QAAM,WAAW,UAAU;AAC3B,QAAM,QAAQ,IAAI,OAAO,IAAI;AAC7B,MAAI,IAAI,QAAQ;AACZ,UAAM,EAAE,MAAAG,OAAM,UAAS,IAAKG,UAAS,MAAM,KAAK,UAAU,KAAK;AAC/D,SAAK,WAAW,YAAYH,KAAI;AAChC,SAAK,gBAAgB,YAAY,SAAS;EAC9C,OAAO;AACH,UAAM,EAAE,MAAAA,OAAM,UAAS,IAAKC,WAAU,MAAM,KAAK,UAAU,KAAK;AAChE,SAAK,WAAW,OAAOD,KAAI;AAC3B,SAAK,gBAAgB,OAAO,SAAS;EACzC;AACA,SAAO,KAAK;AAChB;;;ACzOA,SAASI,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,8CAA8C;EAClE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;;AAER;AAyBM,SAAU,KACZ,QACA,QACA,QACA,OAAgB;AAEhB,QAAM,MAAMD,SAAM;AAClB,QAAM,MAAM,gBAAgB,MAAM;AAClC,QAAM,KAAK,IAAI,GAAG,MAAM,SAAS,KAAK,MAAM,EAAE;AAC9C,QAAM,KAAK,IAAI,GAAG,MAAM,SAAS,IAAI,MAAM,EAAE;AAC7C,QAAM,KAAK,IAAI,GAAG,MAAM,SAAS,IAAI,MAAM,EAAE;AAC7C,QAAM,QACF,OAAO,SAAS,EAAE,KAAK,OAAO,SAAS,EAAE,KAAK,OAAO,SAAS,EAAE,IAC1D,IAAI,KAAK,IAAI,KAAK,KAClB,OAAO;AAEjB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,MAAI,IAAI;AAAQ,SAAK,UAAU,YAAY,KAAK;;AAC3C,SAAK,UAAU,OAAO,KAAK;AAChC,SAAO,KAAK;AAChB;;;AC/CA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,4DAA4D;EAChF;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,cAAc,IAAI,kBAAkB,MAAM;IAC1C,UAAU;IACV,UAAU;IACV,eAAe,OAAO;IACtB,oBAAoB;IACpB,cAAc,oBAAI,IAAG;;AAE7B;AAEA,SAASC,gBAAc,MAA8B,QAAc;AAC/D,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,OAAO,KAAK,aAAa,IAAI,MAAM;AACvC,MAAI,SAAS,QAAW;AACpB,WAAO,sBAA8B,KAAK,WAAW,MAAM;AAC3D,SAAK,aAAa,IAAI,QAAQ,IAAI;EACtC;AACA,SAAO;AACX;AAWA,SAAS,YAAY,QAA2B,QAAgB,YAAkB;AAC9E,MAAI,OAAO;AACX,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;AAChC,UAAM,IAAI,MAAM,SAAS,IAAI,aAAa,OAAO,GAAG,SAAS,IAAI,CAAC;AAKlE,QAAI,CAAC,OAAO,SAAS,CAAC;AAAG,aAAO,OAAO;AACvC,YAAQ;AACR,YAAQ;EACZ;AACA,QAAM,QAAQ,OAAO;AACrB,QAAM,QAAQ,OAAO;AACrB,MAAI,QAAQ;AACZ,MAAI,QAAQ;AACZ,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;AAChC,UAAM,IAAI,MAAM,SAAS,IAAI,aAAa,OAAO,GAAG,SAAS,IAAI,CAAC;AAClE,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,IAAI;AACf,aAAS,KAAK;AACd,aAAS,KAAK;AACd,aAAS,KAAK;EAClB;AACA,MAAI,UAAU,KAAK,UAAU;AAAG,WAAO,OAAO;AAC9C,QAAM,IAAI,QAAQ,KAAK,KAAK,QAAQ,KAAK;AACzC,MAAI,IAAI;AAAI,WAAO;AACnB,MAAI,IAAI;AAAG,WAAO;AAClB,SAAO;AACX;AAEA,SAASC,WAAU,MAA8B,KAAW;AACxD,OAAK,qBAAqB,KAAK;AAK/B,MAAI,KAAK,aAAa,UAAU,KAAK,QAAQ;AACzC,SAAK,gBAAgB,KAAK,aAAa,GAAG,KAAK,SAAS,CAAC;AACzD,QAAI,OAAO,MAAM,KAAK,aAAa;AAAG,WAAK,YAAY;EAC3D,OAAO;AACH,SAAK,gBAAgB,OAAO;EAChC;AACA,OAAK,aAAa,OAAO,GAAG;AAC5B,MAAI,CAAC,OAAO,SAAS,GAAG;AAAG,SAAK,YAAY;AAE5C,OAAK,YAAY;AAEjB,MAAI,KAAK,WAAW,KAAK;AAAQ,WAAO,OAAO;AAC/C,MAAI,KAAK,WAAW;AAAG,WAAO,OAAO;AACrC,SAAO,YAAY,KAAK,cAAc,KAAK,QAAQ,GAAG;AAC1D;AAEA,SAASC,UAAS,MAA8B,KAAW;AACvD,MAAI,KAAK,WAAW,KAAK;AAAQ,WAAO,OAAO;AAI/C,MAAI,WAAW,KAAK;AAKpB,MAAI,OAAO,MAAM,KAAK,aAAa;AAAG,gBAAY;AAClD,MAAI,CAAC,OAAO,SAAS,GAAG;AAAG,gBAAY;AACvC,MAAI,WAAW;AAAG,WAAO,OAAO;AAChC,SAAO,YAAY,KAAK,cAAc,KAAK,QAAQ,GAAG;AAC1D;AAiCM,SAAU,mBACZ,QACA,QACA,QACA,MAA6B;AAE7B,QAAM,MAAMJ,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYG,UAAS,MAAM,GAAG,CAAC;EAClD,OAAO;AACH,SAAK,UAAU,OAAOD,WAAU,MAAM,GAAG,CAAC;EAC9C;AACA,SAAOD,gBAAc,MAAM,MAAM,UAAU,CAAC;AAChD;;;ACxLA,IAAMG,kBAAiB;AAqBvB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,8CAA8C;EAClE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAkB,cAA4B;AAC5D,QAAM,aAAa,IAAI,kBAAkB,QAAQ;AACjD,SAAO;IACH,QAAQ,OAAO,OAAO;MAClB,MAAM,eAAuB,UAAU;MACvC,QAAQ;KACX;IACD;IACA,gBAAgB,OAAO;IACvB,oBAAoB,OAAO;IAC3B,gBAAgB,oBAAI,IAAG;;AAE/B;AAEA,SAASC,kBAAgB,MAAgB,QAAgB,WAA4B;AACjF,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,SAAS,KAAK,eAAe,IAAI,MAAM;AAC3C,MAAI,WAAW,QAAW;AACtB,aAAS,OAAO,OAAO;MACnB,MAAM,sBAA8B,KAAK,YAAY,MAAM;MAC3D,QAAQ,sBAA8B,WAAW,MAAM;KAC1D;AACD,SAAK,eAAe,IAAI,QAAQ,MAAM;EAC1C;AACA,SAAO;AACX;AAgCM,SAAU,KACZ,QACA,QACA,QACA,MAAe;AAEf,QAAM,MAAMF,SAAM;AAClB,QAAM,eAAe,MAAM,gBAAgBD;AAC3C,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,MAAM,gBAAgB,MAAM;AAIlC,QAAM,KAAK,IAAI,GAAG,MAAM,SAAS,KAAK,MAAM,EAAE;AAC9C,QAAM,KAAK,IAAI,GAAG,MAAM,SAAS,IAAI,MAAM,EAAE;AAC7C,QAAM,KAAK,IAAI,GAAG,MAAM,SAAS,IAAI,MAAM,EAAE;AAE7C,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AAOxC,MAAI;AACJ,MAAI,SAAS;AAAW,aAAS,OAAO;WAC/B,IAAI;AAAQ,aAAS,KAAK;;AAC9B,aAAS,KAAK;AACnB,QAAM,YACF,OAAO,SAAS,EAAE,KAAK,OAAO,SAAS,MAAM,KAAK,WAAW,IACtD,OAAO,KAAK,UAAW,SACxB,OAAO;AAIjB,QAAM,eAAe,IAAI,GAAG,MAAM,WAAW,WAAW,YAAY;AACpE,MAAI,SAAS,QAAW;AACpB,WAAOE,WAAS,IAAI,OAAO,MAAM,MAAM,UAAU,YAAY;AAC7D,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,gBAAgB,IAAI,OAAO,QAAQ,IAAI,GAAG,MAAM,SAAS;AAI/D,MAAI,IAAI,QAAQ;AACZ,SAAK,WAAW,YAAY,SAAS;EAEzC,OAAO;AACH,SAAK,WAAW,OAAO,SAAS;AAIhC,SAAK,qBAAqB,KAAK;AAC/B,QAAI,OAAO,SAAS,EAAE,GAAG;AACrB,WAAK,iBAAiB;IAC1B;EACJ;AACA,SAAOC,kBAAgB,MAAM,QAAQ,cAAc,SAAS;AAChE;;;ACtJA,IAAMC,iBAAgB;AACtB,IAAMC,kBAAiB;AACvB,IAAMC,kBAAiB;AAWvB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,kBAAgB,MAAe,QAAc;AAClD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,SAAS,KAAK,eAAe,IAAI,MAAM;AAC3C,MAAI,WAAW,QAAW;AACtB,aAAS,OAAO,OAAO;MACnB,KAAK,sBAA8B,KAAK,QAAQ,MAAM;MACtD,QAAQ,sBAA8B,KAAK,WAAW,MAAM;KAC/D;AACD,SAAK,eAAe,IAAI,QAAQ,MAAM;EAC1C;AACA,SAAO;AACX;AAEA,SAAS,SAAS,KAAa,KAAW;AACtC,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,QAAQ;AAAG,WAAO,OAAO;AAC/E,SAAQ,MAAM,MAAO;AACzB;AAmCM,SAAU,IAAI,QAAgB,QAAwB,MAAc;AACtE,QAAM,MAAMD,SAAM;AAClB,QAAM,iBAAiB,MAAM,kBAAkBH;AAC/C,QAAM,kBAAkB,MAAM,mBAAmBC;AACjD,QAAM,eAAe,MAAM,gBAAgBC;AAC3C,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,eAAe,GAAG,MAAM;AAC9B,QAAM,SAAS,IAAI;AACnB,QAAM,MAAM,gBAAgB,MAAM;AAElC,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AAKxC,QAAM,cAAc;;IACQ,MAAM,iBAAiB,OAAO;MACnD,MAAM,WAAW,OAAO;AAC/B,QAAM,MACF,OAAO,SAAS,GAAG,KAAK,OAAO,SAAS,WAAW,IAAI,MAAM,cAAc,OAAO;AACtF,QAAM,SAAS,OAAO,SAAS,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,OAAO;AAE7D,QAAM,UAAU,IAAI,GAAG,MAAM,YAAY,KAAK,cAAc,EAAE;AAC9D,QAAM,UAAU,IAAI,GAAG,MAAM,YAAY,SAAS,eAAe,EAAE;AACnE,QAAM,UAAU,IAAI,GAAG,MAAM,eAAe,QAAQ,cAAc,EAAE;AACpE,QAAM,UAAU,IAAI,GAAG,MAAM,eAAe,SAAS,eAAe,EAAE;AACtE,QAAM,SAAS,SAAS,SAAS,OAAO;AAExC,QAAM,eAAe,IAAI,cAAc,QAAQ,YAAY;AAE3D,MAAI,SAAS,QAAW;AACpB,UAAM,SAAS,IAAI,kBAAkB,IAAI,OAAO,MAAM,MAAM,QAAQ;AACpE,UAAM,UAAU,IAAI,OAAO,QAAQ,IAAI,YAAY;AAGnD,WAAO;MACH,QAAQ,OAAO,OAAO;QAClB,KAAK,eAAuB,MAAM;QAClC,QAAQ;OACX;MACD;MACA,WAAW,QAAQ;MACnB,gBAAgB,oBAAI,IAAG;MACvB,SAAS;MACT,eAAe,OAAO;;AAE1B,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;AACnC,SAAK,OAAO,OAAO,MAAM;AACzB,WAAOE,kBAAgB,MAAM,MAAM;EACvC;AAEA,MAAI,QAAQ;AACR,SAAK,OAAO,YAAY,MAAM;EAClC,OAAO;AACH,SAAK,OAAO,OAAO,MAAM;AACzB,SAAK,gBAAgB,KAAK;AAC1B,SAAK,UAAU;EACnB;AAEA,SAAOA,kBAAgB,MAAM,MAAM;AACvC;;;ACjHA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,oDAAoD;EACxE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,QAAgB,UAAgB;AAC9D,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,YAAY,GAAG,MAAM;IACrB,kBAAkB,IAAI,kBAAkB,MAAM;IAC9C,eAAe;;AAEvB;AAEA,SAAS,gBAAgB,KAAa,QAAc;AAChD,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,MAAM,KAAK,WAAW,GAAG;AACnE,WAAO,OAAO;EAClB;AACA,QAAM,KAAM,OAAO,MAAM,UAAW;AACpC,SAAO,KAAK;AAChB;AAEA,SAASC,aAAW,MAAsB,KAAa,QAAc;AACjE,QAAM,OAAO,gBAAgB,KAAK,MAAM;AACxC,MAAI,CAAC,OAAO,SAAS,IAAI,GAAG;AAIxB,WAAO,OAAO;EAClB;AACA,MAAI,KAAK,iBAAiB,WAAW,KAAK,QAAQ;AAE9C,SAAK,iBAAiB,KAAK,iBAAiB,GAAG,KAAK,SAAS,CAAC;EAClE;AACA,OAAK,iBAAiB,OAAO,IAAI;AACjC,OAAK,iBAAiB;AACtB,SAAO,KAAK,KAAK,KAAK,gBAAgB,KAAK,iBAAiB,MAAM;AACtE;AAEA,SAASC,YAAU,MAAsB,KAAa,QAAc;AAChE,MAAI,KAAK,iBAAiB,WAAW;AAAG,WAAO,OAAO;AACtD,QAAM,OAAO,gBAAgB,KAAK,MAAM;AACxC,MAAI,CAAC,OAAO,SAAS,IAAI;AAAG,WAAO,OAAO;AAG1C,QAAM,SAAS,KAAK,iBAAiB,GAAG,CAAC;AACzC,QAAM,SAAS,KAAK,gBAAgB,SAAS;AAC7C,SAAO,KAAK,KAAK,SAAS,KAAK,iBAAiB,MAAM;AAC1D;AAgCM,SAAU,WACZ,QACA,QACA,QACA,OAAsB;AAEtB,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/D,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAGlC,QAAM,YAAY,QAAQ,KAAK,YAAY,QAAQ,MAAM;AACzD,QAAM,SAAS,UAAU;AACzB,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYE,YAAU,MAAM,KAAK,MAAM,CAAC;EAC3D,OAAO;AACH,SAAK,UAAU,OAAOD,aAAW,MAAM,KAAK,MAAM,CAAC;EACvD;AACA,SAAO,KAAK;AAChB;;;AC3HA,IAAM,uBAAuB;AAC7B,IAAM,wBAAwB;AAC9B,IAAM,sBAAsB;AAmC5B,SAASE,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,qDAAqD;EACzE;AACA,SAAO;AACX;AAEA,SAASC,WACL,aACA,cACA,YACA,UAAgB;AAEhB,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA;IACA;IACA,SAAS,IAAI,kBAAkB,WAAW;IAC1C,UAAU,IAAI,kBAAkB,YAAY;IAC5C,QAAQ,IAAI,kBAAkB,UAAU;IACxC,SAAS,IAAI,kBAAkB,WAAW;IAC1C,UAAU,IAAI,kBAAkB,YAAY;IAC5C,QAAQ,IAAI,kBAAkB,UAAU;IACxC,YAAY;IACZ,aAAa;IACb,WAAW;IACX,YAAY;IACZ,aAAa;IACb,WAAW;IACX,UAAU;IACV,WAAW,OAAO;IAClB,eAAe,OAAO;IACtB,aAAa;IACb,cAAc;IACd,YAAY;IACZ,aAAa;IACb,cAAc;IACd,YAAY;;AAEpB;AAEA,SAAS,YACL,MACA,KACA,OACA,WAAiB;AAIjB,MAAI,CAAC,OAAO,SAAS,SAAS;AAAG,WAAO,CAAC,GAAG,CAAC;AAC7C,QAAM,UAAU,KAAK,IAAI,KAAK,SAAS;AACvC,QAAM,WAAW,KAAK,IAAI,MAAM,SAAS;AACzC,SAAO,CAAC,QAAQ,SAAS,WAAW,OAAO;AAC/C;AAEA,SAAS,aACL,MACA,KACA,UACA,UAAgB;AAEhB,MAAI,WAAW;AACf,MAAI,KAAK,UAAU,UAAU;AACzB,eAAW,KAAK,GAAG,WAAW,CAAC;EACnC;AACA,OAAK,OAAO,QAAQ;AACpB,SAAO,EAAE,QAAQ,MAAM,WAAW,UAAU,SAAQ;AACxD;AAEA,SAAS,WACL,YACA,YACA,aACA,aACA,WACA,WAAiB;AAEjB,MAAI,eAAe,KAAK,gBAAgB,KAAK,cAAc;AAAG,WAAO,OAAO;AAC5E,QAAM,WAAW,aAAa;AAC9B,QAAM,YAAY,cAAc;AAChC,QAAM,UAAU,YAAY;AAC5B,SAAQ,OAAO,IAAI,WAAW,IAAI,YAAY,WAAY;AAC9D;AAEA,SAASC,aAAW,MAAuB,MAAc,KAAa,OAAa;AAC/E,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AAG5E,QAAI,KAAK,WAAW,KAAK;AAAY,aAAO,OAAO;AACnD,WAAO,WACH,KAAK,YACL,KAAK,YACL,KAAK,aACL,KAAK,aACL,KAAK,WACL,KAAK,SAAS;EAEtB;AACA,QAAM,CAAC,IAAI,EAAE,IAAI,YAAY,MAAM,KAAK,OAAO,KAAK,SAAS;AAC7D,QAAM,QAAQ,aAAa,KAAK,SAAS,KAAK,YAAY,IAAI,KAAK,WAAW;AAC9E,OAAK,aAAa,MAAM;AACxB,QAAM,SAAS,aAAa,KAAK,UAAU,KAAK,aAAa,IAAI,KAAK,YAAY;AAClF,OAAK,cAAc,OAAO;AAC1B,QAAM,OAAO,aAAa,KAAK,QAAQ,KAAK,WAAW,IAAI,KAAK,UAAU;AAC1E,OAAK,YAAY,KAAK;AACtB,QAAM,UAAU,aAAa,KAAK,SAAS,KAAK,YAAY,IAAI,KAAK,WAAW;AAChF,OAAK,aAAa,QAAQ;AAC1B,QAAM,WAAW,aAAa,KAAK,UAAU,KAAK,aAAa,IAAI,KAAK,YAAY;AACpF,OAAK,cAAc,SAAS;AAC5B,QAAM,SAAS,aAAa,KAAK,QAAQ,KAAK,WAAW,IAAI,KAAK,UAAU;AAC5E,OAAK,YAAY,OAAO;AAExB,OAAK,gBAAgB,KAAK;AAC1B,OAAK,YAAY;AACjB,OAAK,YAAY;AAGjB,OAAK,cAAc;AACnB,OAAK,eAAe;AACpB,OAAK,aAAa;AAClB,OAAK,cAAc;AACnB,OAAK,eAAe;AACpB,OAAK,aAAa;AAElB,MAAI,KAAK,WAAW,KAAK;AAAY,WAAO,OAAO;AACnD,SAAO,WACH,KAAK,YACL,KAAK,YACL,KAAK,aACL,KAAK,aACL,KAAK,WACL,KAAK,SAAS;AAEtB;AAEA,SAASC,YAAU,MAAuB,MAAc,KAAa,OAAa;AAC9E,MAAI,KAAK,WAAW,KAAK;AAAY,WAAO,OAAO;AACnD,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AAC5E,WAAO,WACH,KAAK,YACL,KAAK,YACL,KAAK,aACL,KAAK,aACL,KAAK,WACL,KAAK,SAAS;EAEtB;AAIA,QAAM,CAAC,QAAQ,MAAM,IAAI,YAAY,MAAM,KAAK,OAAO,KAAK,aAAa;AACzE,SAAO,WACH,KAAK,aAAa,KAAK,cAAc,QACrC,KAAK,aAAa,KAAK,cAAc,QACrC,KAAK,cAAc,KAAK,eAAe,QACvC,KAAK,cAAc,KAAK,eAAe,QACvC,KAAK,YAAY,KAAK,aAAa,QACnC,KAAK,YAAY,KAAK,aAAa,MAAM;AAEjD;AA0BM,SAAU,YAAY,QAAgB,MAAsB;AAC9D,QAAM,MAAMH,SAAM;AAClB,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,eAAe,MAAM,gBAAgB;AAC3C,QAAM,aAAa,MAAM,cAAc;AACvC,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,aAAa,cAAc,YAAY,IAAI,OAAO,MAAM,MAAM,QAAQ;AACtF,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,IAAI,OAAO;AACvB,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYE,YAAU,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC;EAC5E,OAAO;AACH,SAAK,UAAU,OAAOD,aAAW,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC;EACxE;AACA,SAAO,KAAK;AAChB;;;ACtOA,SAASE,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,mDAAmD;EACvE;AACA,SAAO;AACX;AAEA,SAAS,YAAY,WAA0B;AAC3C,SAAO,UAAU;AACrB;AAEA,SAASC,WAAS,YAAoB,UAAgB;AAClD,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,QAAM,eAAe,aAAa;AAClC,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC,eAAe,oBAAI,IAAG;IACtB;IACA,UAAU;IACV,MAAM,CAAA;IACN,YAAY;IACZ,UAAU,CAAA;IACV,gBAAgB;;AAExB;AAEA,SAAS,cACL,YACA,MACA,YAAkB;AAElB,MAAI,aAAa,aAAa;AAAG,WAAO,OAAO;AAI/C,SAAO,KAAK,CAAC;AACjB;AAEA,SAASC,aAAW,MAAqB,KAAa,OAAc;AAChE,OAAK,WAAW,KAAK,KAAK,MAAK;AAC/B,OAAK,iBAAiB,KAAK;AAC3B,MAAI,OAAO;AACP,SAAK,KAAK,KAAK,GAAG;AAClB,QAAI,KAAK,KAAK,SAAS,KAAK;AAAU,WAAK,KAAK,MAAK;AACrD,SAAK,cAAc;EACvB;AACA,SAAO,cAAc,KAAK,YAAY,KAAK,MAAM,KAAK,UAAU;AACpE;AAEA,SAASC,YAAU,MAAqB,KAAa,OAAc;AAE/D,QAAM,OAAO,KAAK,SAAS,MAAK;AAChC,MAAI,QAAQ,KAAK;AACjB,MAAI,OAAO;AACP,SAAK,KAAK,GAAG;AACb,QAAI,KAAK,SAAS,KAAK;AAAU,WAAK,MAAK;AAC3C,aAAS;EACb;AACA,SAAO,cAAc,KAAK,YAAY,MAAM,KAAK;AACrD;AAyBM,SAAU,UACZ,QACA,WACA,QACA,aAAa,GACb,OAAsB,CAAA,GAAE;AAExB,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,YAAY,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC3D,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,QAAQ,YAAY,SAAS;AACnC,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYE,YAAU,MAAM,KAAK,KAAK,CAAC;EAC1D,OAAO;AACH,SAAK,UAAU,OAAOD,aAAW,MAAM,KAAK,KAAK,CAAC;EACtD;AACA,QAAM,SAAS,KAAK,UAAU;AAC9B,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,QAAM,UAAU,KAAK,cAAc,IAAI,MAAM;AAC7C,MAAI,YAAY;AAAW,WAAO;AAClC,QAAM,OAAO,sBAA8B,KAAK,WAAW,MAAM;AACjE,OAAK,cAAc,IAAI,QAAQ,IAAI;AACnC,SAAO;AACX;;;ACnHA,SAASE,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,mEAAmE;EACvF;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAgB;AAC9B,QAAM,OAAO,wBAAwB,QAAQ;AAC7C,QAAM,OAA6C;IAC/C,GAAG;IACH,QAAQ,OAAO,OAAO;MAClB,IAAI,UAAO;AACP,eAAO,KAAK;MAChB;MACA,KAAK,eAAuB,KAAK,SAAS;MAC1C,SAAS,eAAuB,KAAK,aAAa;MAClD,QAAQ,eAAuB,KAAK,YAAY;KACnD;IACD,gBAAgB,oBAAI,IAAG;;AAE3B,SAAO;AACX;AAEA,SAASC,kBACL,MACA,QAAc;AAEd,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,SAAS,KAAK,eAAe,IAAI,MAAM;AAC3C,MAAI,WAAW,QAAW;AACtB,aAAS,OAAO,OAAO;MACnB,IAAI,UAAO;AACP,eAAO,KAAK;MAChB;MACA,KAAK,sBAA8B,KAAK,WAAW,MAAM;MACzD,SAAS,sBAA8B,KAAK,eAAe,MAAM;MACjE,QAAQ,sBAA8B,KAAK,cAAc,MAAM;KAClE;AACD,SAAK,eAAe,IAAI,QAAQ,MAAM;EAC1C;AACA,SAAO;AACX;AAEA,SAASC,aAAY,KAAmB;AACpC,QAAM,EAAE,MAAK,IAAK,IAAI;AACtB,QAAM,EAAE,UAAU,OAAM,IAAK,IAAI,OAAO,IAAI;AAC5C,QAAM,OAA2B,CAAA;AACjC,WAAS,WAAW,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,YAAY,GAAG;AACtE,UAAM,OAAO,MAAM,KAAK,GAAG,QAAQ;AACnC,QAAI,OAAO,YAAY,OAAO;AAAQ;AACtC,SAAK,KAAK;MACN,OAAO,MAAM,MAAM,GAAG,QAAQ;MAC9B,MAAM,MAAM,KAAK,GAAG,QAAQ;MAC5B,KAAK,MAAM,IAAI,GAAG,QAAQ;MAC1B,MAAM,MAAM,KAAK,GAAG,QAAQ;MAC5B;MACA,QAAQ,MAAM,OAAO,GAAG,QAAQ;KACnC;EACL;AACA,SAAO;AACX;AAyBM,SAAU,0BACZ,QACA,MAAoC;AAEpC,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/C,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AAEA,QAAMG,YAAW,6BAA6B;IAC1C,MAAMD,aAAY,GAAG;IACrB,aAAa,MAAM;IACnB,QAAQ,4BAA4B,QAAQ,CAAA,CAAE;GACjD;AACD,8BAA4B,MAAM,IAAI,QAAQC,SAAQ;AACtD,6BACI,KACA,QACA,gCACAA,UAAS,KACTA,UAAS,OAAO;AAEpB,SAAOF,kBAAgB,MAAM,MAAM,UAAU,CAAC;AAClD;;;AC7HA,SAASG,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,6CAA6C;EACjE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAgB;AAC9B,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO,EAAE,WAAW,QAAQ,eAAuB,SAAS,EAAC;AACjE;AAsBM,SAAU,IAAI,QAAgB,OAAe;AAC/C,QAAM,MAAMD,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/C,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,QAAQ,IAAI,OAAO,IAAI;AAC7B,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAY,KAAK;EACpC,OAAO;AACH,SAAK,UAAU,OAAO,KAAK;EAC/B;AACA,SAAO,KAAK;AAChB;;;ACzCA,IAAMC,kBAAiB;AACvB,IAAMC,sBAAqB;AAE3B,IAAMC,YAAW;AACjB,IAAMC,cAAa;AACnB,IAAM,gBAAgB;AAsBtB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,wDAAwD;EAC5E;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAkB,QAAgB,YAAkB;AAClE,QAAM,cAAc,IAAI,kBAAkB,QAAQ;AAClD,QAAM,kBAAkB,IAAI,kBAAkB,QAAQ;AACtD,SAAO;IACH,SAAS,OAAO,OAAO;MACnB,OAAO,eAAuB,WAAW;MACzC,WAAW,eAAuB,eAAe;KACpD;IACD;IACA;IACA;IACA;IACA,cAAc;IACd,WAAW;IACX,UAAU,OAAO;IACjB,SAAS,OAAO;IAChB,wBAAwB;IACxB,qBAAqB;IACrB,oBAAoB,OAAO;IAC3B,mBAAmB,OAAO;;AAElC;AAEA,SAASC,UAAS,MAAwB;AACtC,OAAK,yBAAyB,KAAK;AACnC,OAAK,sBAAsB,KAAK;AAChC,OAAK,qBAAqB,KAAK;AAC/B,OAAK,oBAAoB,KAAK;AAClC;AAQA,SAASC,gBACL,KACA,UACA,YACA,eACA,UACA,SAAe;AAEf,MAAI,kBAAkB,eAAe;AAGjC,UAAM,eAAsB,OAAO,UAAUL,YAAWC;AACxD,UAAM,OACF,iBAAiBD,YAAW,MAAM,aAAa,WAAW,MAAM,aAAa;AACjF,WAAO;MACH,OAAO;MACP,WAAW;MACX,eAAe;MACf,UAAU;;EAElB;AACA,MAAI,kBAAkBA,WAAU;AAC5B,QAAIM,QAAO,MAAM,aAAa;AAC9B,QAAIA,QAAO;AAAU,MAAAA,QAAO;AAC5B,QAAI,MAAMA,OAAM;AACZ,MAAAA,QAAO,MAAM,aAAa;AAC1B,aAAO;QACH,OAAOA;QACP,WAAWL;QACX,eAAeA;QACf,UAAUK;;IAElB;AACA,WAAO,EAAE,OAAOA,OAAM,WAAWN,WAAU,eAAeA,WAAU,UAAUM,MAAI;EACtF;AAEA,MAAI,OAAO,MAAM,aAAa;AAC9B,MAAI,OAAO;AAAU,WAAO;AAC5B,MAAI,MAAM,MAAM;AACZ,WAAO,MAAM,aAAa;AAC1B,WAAO;MACH,OAAO;MACP,WAAWN;MACX,eAAeA;MACf,UAAU;;EAElB;AACA,SAAO,EAAE,OAAO,MAAM,WAAWC,aAAY,eAAeA,aAAY,UAAU,KAAI;AAC1F;AAEA,SAASM,WACL,MACA,KACA,UAAgB;AAIhB,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,QAAQ,GAAG;AACrD,WAAO,EAAE,OAAO,OAAO,KAAK,WAAW,OAAO,IAAG;EACrD;AACA,EAAAH,UAAS,IAAI;AACb,MAAI,KAAK,iBAAiB,GAAG;AAGzB,SAAK,eAAe;AACpB,SAAK,UAAU;AACf,SAAK,YAAY;AACjB,SAAK,WAAW,OAAO;AACvB,WAAO,EAAE,OAAO,OAAO,KAAK,WAAW,OAAO,IAAG;EACrD;AACA,QAAMI,QAAOH,gBACT,KACA,UACA,KAAK,YACL,KAAK,WACL,KAAK,UACL,KAAK,OAAO;AAEhB,OAAK,gBAAgB;AACrB,OAAK,YAAYG,MAAK;AACtB,OAAK,WAAWA,MAAK;AACrB,OAAK,UAAU;AACf,SAAO,EAAE,OAAOA,MAAK,OAAO,WAAWA,MAAK,UAAS;AACzD;AAEA,SAASC,UACL,MACA,KACA,UAAgB;AAEhB,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,QAAQ,GAAG;AACrD,WAAO,EAAE,OAAO,OAAO,KAAK,WAAW,OAAO,IAAG;EACrD;AACA,MAAI,KAAK,2BAA2B,GAAG;AAGnC,WAAO,EAAE,OAAO,OAAO,KAAK,WAAW,OAAO,IAAG;EACrD;AACA,QAAMD,QAAOH,gBACT,KACA,UACA,KAAK,YACL,KAAK,qBACL,KAAK,oBACL,KAAK,iBAAiB;AAE1B,SAAO,EAAE,OAAOG,MAAK,OAAO,WAAWA,MAAK,UAAS;AACzD;AAmCM,SAAU,eAAe,QAAgB,MAAyB;AACpE,QAAM,MAAMN,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,UAAM,SAAS,MAAM,UAAUJ;AAC/B,UAAM,aAAa,MAAM,cAAcC;AACvC,WAAOI,WAAS,IAAI,OAAO,MAAM,MAAM,UAAU,QAAQ,UAAU;AACnE,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,YAAY,IAAI,GAAG,MAAM,QAAQ,KAAK,MAAM;AAClD,QAAM,MAAM,IAAI,OAAO,IAAI;AAC3B,QAAM,WAAW,UAAU;AAC3B,MAAI,IAAI,QAAQ;AACZ,UAAM,EAAE,OAAO,UAAS,IAAKM,UAAS,MAAM,KAAK,QAAQ;AACzD,SAAK,YAAY,YAAY,KAAK;AAClC,SAAK,gBAAgB,YAAY,SAAS;EAC9C,OAAO;AACH,UAAM,EAAE,OAAO,UAAS,IAAKF,WAAU,MAAM,KAAK,QAAQ;AAC1D,SAAK,YAAY,OAAO,KAAK;AAC7B,SAAK,gBAAgB,OAAO,SAAS;EACzC;AACA,SAAO,KAAK;AAChB;;;AC1MA,SAASG,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,gDAAgD;EACpE;AACA,SAAO;AACX;AAEA,SAASC,WAAU,MAAc,KAAa,WAAiB;AAC3D,MAAI,CAAC,OAAO,SAAS,SAAS;AAAG,WAAO,OAAO;AAC/C,SAAO,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,SAAS,GAAG,KAAK,IAAI,MAAM,SAAS,CAAC;AACrF;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,aAAa,IAAI,kBAAkB,QAAQ;AACjD,QAAM,cAAc,IAAI,kBAAkB,QAAQ;AAClD,SAAO;IACH,QAAQ,OAAO,OAAO;MAClB,MAAM,eAAuB,UAAU;MACvC,OAAO,eAAuB,WAAW;KAC5C;IACD;IACA;IACA;IACA,cAAc,IAAI,kBAAkB,MAAM;IAC1C,eAAe,IAAI,kBAAkB,MAAM;IAC3C,UAAU,IAAI,kBAAkB,MAAM;IACtC,aAAa;IACb,cAAc;IACd,WAAW;IACX,UAAU,OAAO;IACjB,SAAS,OAAO;IAChB,WAAW,OAAO;IAClB,cAAc,OAAO;IACrB,aAAa,OAAO;IACpB,eAAe,OAAO;IACtB,uBAAuB;IACvB,wBAAwB;IACxB,qBAAqB;IACrB,aAAa;IACb,cAAc;IACd,WAAW;IACX,UAAU;IACV,gBAAgB,oBAAI,IAAG;;AAE/B;AAEA,SAASC,kBAAgB,MAAkB,QAAc;AACrD,MAAI,WAAW;AAAG,WAAO,KAAK;AAC9B,MAAI,SAAS,KAAK,eAAe,IAAI,MAAM;AAC3C,MAAI,WAAW,QAAW;AACtB,aAAS,OAAO,OAAO;MACnB,MAAM,sBAA8B,KAAK,YAAY,MAAM;MAC3D,OAAO,sBAA8B,KAAK,aAAa,MAAM;KAChE;AACD,SAAK,eAAe,IAAI,QAAQ,MAAM;EAC1C;AACA,SAAO;AACX;AAEA,SAAS,OAAO,KAAa,KAAW;AAGpC,MAAI,QAAQ,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,GAAG;AAAG,WAAO,OAAO;AAC/E,SAAO,MAAM;AACjB;AAEA,SAASC,WACL,MACA,MACA,KACA,OAAa;AAEb,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AAE5E,WAAO,EAAE,MAAM,OAAO,KAAK,OAAO,OAAO,IAAG;EAChD;AAEA,OAAK,YAAY;AAKjB,OAAK,wBAAwB,KAAK;AAClC,OAAK,yBAAyB,KAAK;AACnC,OAAK,sBAAsB,KAAK;AAEhC,QAAM,KAAKH,WAAU,MAAM,KAAK,KAAK,SAAS;AAC9C,QAAM,SAAS,OAAO,SAAS,KAAK,OAAO,IAAI,KAAK,IAAI,OAAO,KAAK,OAAO,IAAI;AAC/E,QAAM,UAAU,OAAO,SAAS,KAAK,QAAQ,IAAI,KAAK,IAAI,MAAM,KAAK,QAAQ,IAAI;AAIjF,OAAK,eAAe,KAAK;AACzB,OAAK,cAAc,KAAK;AACxB,OAAK,gBAAgB,KAAK;AAC1B,OAAK,WAAW;AAChB,OAAK,UAAU;AACf,OAAK,YAAY;AAGjB,MAAI,KAAK,aAAa,UAAU,KAAK,QAAQ;AACzC,SAAK,cAAc,KAAK,aAAa,GAAG,KAAK,SAAS,CAAC;AACvD,SAAK,eAAe,KAAK,cAAc,GAAG,KAAK,SAAS,CAAC;AACzD,SAAK,YAAY,KAAK,SAAS,GAAG,KAAK,SAAS,CAAC;AACjD,SAAK,eAAe,KAAK;AACzB,SAAK,gBAAgB,KAAK;AAC1B,SAAK,aAAa,KAAK;EAC3B,OAAO;AACH,SAAK,cAAc;AACnB,SAAK,eAAe;AACpB,SAAK,YAAY;EACrB;AACA,OAAK,aAAa,OAAO,MAAM;AAC/B,OAAK,cAAc,OAAO,OAAO;AACjC,OAAK,SAAS,OAAO,EAAE;AACvB,OAAK,eAAe;AACpB,OAAK,gBAAgB;AACrB,OAAK,aAAa;AAKlB,MAAI,KAAK,YAAY,KAAK,QAAQ;AAC9B,WAAO,EAAE,MAAM,OAAO,KAAK,OAAO,OAAO,IAAG;EAChD;AACA,SAAO;IACH,MAAM,OAAO,KAAK,aAAa,KAAK,SAAS;IAC7C,OAAO,OAAO,KAAK,cAAc,KAAK,SAAS;;AAEvD;AAEA,SAASI,UACL,MACA,MACA,KACA,OAAa;AAEb,MAAI,KAAK,YAAY,KAAK;AAAQ,WAAO,EAAE,MAAM,OAAO,KAAK,OAAO,OAAO,IAAG;AAC9E,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AAC5E,WAAO,EAAE,MAAM,OAAO,KAAK,OAAO,OAAO,IAAG;EAChD;AAEA,QAAM,KAAKJ,WAAU,MAAM,KAAK,KAAK,aAAa;AAKlD,QAAM,SAAS,OAAO,SAAS,KAAK,WAAW,IAAI,KAAK,IAAI,OAAO,KAAK,WAAW,IAAI;AACvF,QAAM,UAAU,OAAO,SAAS,KAAK,YAAY,IAAI,KAAK,IAAI,MAAM,KAAK,YAAY,IAAI;AAIzF,QAAM,cAAc,KAAK,wBAAwB,KAAK,cAAc;AACpE,QAAM,eAAe,KAAK,yBAAyB,KAAK,eAAe;AACvE,QAAM,YAAY,KAAK,sBAAsB,KAAK,YAAY;AAC9D,SAAO;IACH,MAAM,OAAO,aAAa,SAAS;IACnC,OAAO,OAAO,cAAc,SAAS;;AAE7C;AA6BM,SAAU,OAAO,QAAgB,QAAgB,MAAiB;AACpE,QAAM,MAAMD,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOE,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,IAAI,OAAO;AACvB,MAAI,IAAI,QAAQ;AACZ,UAAM,EAAE,MAAM,MAAK,IAAKG,UAAS,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK;AACnE,SAAK,WAAW,YAAY,IAAI;AAChC,SAAK,YAAY,YAAY,KAAK;EACtC,OAAO;AACH,UAAM,EAAE,MAAM,MAAK,IAAKD,WAAU,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK;AACpE,SAAK,WAAW,OAAO,IAAI;AAC3B,SAAK,YAAY,OAAO,KAAK;EACjC;AACA,SAAOD,kBAAgB,MAAM,MAAM,UAAU,CAAC;AAClD;;;ACtPA,IAAMG,kBAA6B;AACnC,IAAMC,cAAa;AAmBnB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,8CAA8C;EAClE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAgB;AAC9B,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC,OAAO;IACP,MAAM;IACN,eAAe,OAAO;IACtB,iBAAiB;IACjB,gBAAgB;IAChB,kBAAkB,OAAO;;AAEjC;AAEA,SAASC,YAAW,KAAqB,QAAkB;AACvD,UAAQ,QAAQ;IACZ,KAAK;AACD,aAAO,IAAI,OAAO,IAAI;IAC1B,KAAK;AACD,aAAO,IAAI,OAAO,IAAI;IAC1B,KAAK;AACD,aAAO,IAAI,OAAO,IAAI;IAC1B,KAAK;AACD,aAAO,IAAI,OAAO,IAAI;IAC1B,KAAK;AACD,aAAO,IAAI,OAAO,IAAI;EAC9B;AACJ;AAEA,SAAS,SAAS,MAAY;AAC1B,SAAO,KAAK,MAAM,OAAOH,WAAU;AACvC;AAYA,SAASI,MACL,SACA,QACA,UACA,QACA,KACA,QAAc;AAEd,MAAI,QAAQ;AACZ,MAAI,OAAO;AACX,MAAI,aAAa,QAAQ;AACrB,YAAQ;AACR,WAAO;EACX;AACA,MAAI,OAAO,SAAS,GAAG,KAAK,OAAO,SAAS,MAAM,KAAK,SAAS,GAAG;AAC/D,aAAS,MAAM;AACf,YAAQ;EACZ;AACA,SAAO,EAAE,OAAO,MAAM,OAAM;AAChC;AAEA,SAASC,cAAa,OAAe,MAAY;AAC7C,MAAI,SAAS;AAAG,WAAO,OAAO;AAC9B,SAAO,QAAQ;AACnB;AAgCM,SAAU,KAAK,QAAgB,MAAe;AAChD,QAAM,MAAMJ,SAAM;AAClB,QAAM,SAAS,MAAM,UAAUF;AAC/B,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOG,WAAS,IAAI,OAAO,MAAM,MAAM,QAAQ;AAC/C,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAMC,YAAW,KAAK,MAAM;AAClC,QAAM,SAAS,IAAI,OAAO,IAAI;AAC9B,QAAM,SAAS,SAAS,IAAI,OAAO,IAAI,IAAI;AAE3C,MAAI,IAAI,QAAQ;AACZ,UAAMG,QAAOF,MACT,KAAK,iBACL,KAAK,gBACL,KAAK,kBACL,QACA,KACA,MAAM;AAEV,SAAK,UAAU,YAAYC,cAAaC,MAAK,OAAOA,MAAK,IAAI,CAAC;AAC9D,WAAO,KAAK;EAChB;AAGA,OAAK,kBAAkB,KAAK;AAC5B,OAAK,iBAAiB,KAAK;AAC3B,OAAK,mBAAmB,KAAK;AAC7B,QAAM,OAAOF,MAAK,KAAK,OAAO,KAAK,MAAM,KAAK,eAAe,QAAQ,KAAK,MAAM;AAChF,OAAK,QAAQ,KAAK;AAClB,OAAK,OAAO,KAAK;AACjB,OAAK,gBAAgB,KAAK;AAC1B,OAAK,UAAU,OAAOC,cAAa,KAAK,OAAO,KAAK,IAAI,CAAC;AACzD,SAAO,KAAK;AAChB;;;ACxJA,SAASE,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,8CAA8C;EAClE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,QAAgB,UAAgB;AAC9C,QAAM,YAAY,IAAI,kBAAkB,QAAQ;AAChD,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC;IACA,cAAc,IAAI,kBAAkB,MAAM;IAC1C,cAAc,IAAI,kBAAkB,MAAM;;AAElD;AAEA,SAAS,oBAAoB,MAAc;AACvC,MAAI,QAAQ;AACZ,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACrC,UAAM,QAAQ,KAAK,aAAa,GAAG,CAAC;AACpC,QAAI,CAAC,OAAO,SAAS,KAAK;AAAG,aAAO,OAAO;AAC3C,UAAM,SAAS,KAAK,aAAa,GAAG,CAAC;AACrC,UAAM,IAAI,OAAO,SAAS,MAAM,IAAI,SAAS;AAC7C,aAAS,QAAQ;AACjB,cAAU;EACd;AACA,SAAO,SAAS,IAAI,QAAQ,SAAS,OAAO;AAChD;AAEA,SAASC,aAAW,MAAgB,KAAaC,MAAW;AACxD,OAAK,aAAa,OAAO,GAAG;AAC5B,OAAK,aAAa,OAAOA,IAAG;AAC5B,MAAI,KAAK,aAAa,SAAS,KAAK;AAAQ,WAAO,OAAO;AAC1D,SAAO,oBAAoB,IAAI;AACnC;AAEA,SAASC,YAAU,MAAgB,KAAaD,MAAW;AACvD,MAAI,KAAK,aAAa,SAAS,KAAK;AAAQ,WAAO,OAAO;AAC1D,MAAI,CAAC,OAAO,SAAS,GAAG;AAAG,WAAO,OAAO;AAGzC,QAAM,UAAU,OAAO,SAASA,IAAG,IAAIA,OAAM;AAC7C,MAAI,QAAQ,MAAM;AAClB,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACrC,UAAM,QAAQ,KAAK,aAAa,GAAG,CAAC;AACpC,QAAI,CAAC,OAAO,SAAS,KAAK;AAAG,aAAO,OAAO;AAC3C,UAAM,SAAS,KAAK,aAAa,GAAG,CAAC;AACrC,UAAM,IAAI,OAAO,SAAS,MAAM,IAAI,SAAS;AAC7C,aAAS,QAAQ;AACjB,cAAU;EACd;AACA,SAAO,SAAS,IAAI,QAAQ,SAAS,OAAO;AAChD;AAsBM,SAAU,KACZ,QACA,QACA,QACA,OAAgB;AAEhB,QAAM,MAAMH,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,WAAOC,WAAS,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,gBAAgB,MAAM;AAClC,QAAME,OAAM,IAAI,OAAO,IAAI;AAC3B,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAYC,YAAU,MAAM,KAAKD,IAAG,CAAC;EACxD,OAAO;AACH,SAAK,UAAU,OAAOD,aAAW,MAAM,KAAKC,IAAG,CAAC;EACpD;AACA,SAAO,KAAK;AAChB;;;ACxGA,IAAME,mBAAiB;AAmBvB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,yDAAyD;EAC7E;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAkB,QAAc;AAC9C,QAAM,WAAW,IAAI,kBAAkB,QAAQ;AAC/C,QAAM,aAAa,IAAI,kBAAkB,QAAQ;AACjD,QAAM,aAAa,IAAI,SAAS;AAChC,SAAO;IACH,SAAS,OAAO,OAAO;MACnB,IAAI,eAAuB,QAAQ;MACnC,MAAM,eAAuB,UAAU;KAC1C;IACD;IACA;IACA;IACA,YAAY,IAAI,kBAAkB,UAAU;IAC5C,WAAW,IAAI,kBAAkB,UAAU;IAC3C,UAAU;;AAElB;AAUA,SAAS,cAAc,YAA+B,UAAkB,QAAc;AAClF,QAAM,aAAa,WAAW,GAAG,MAAM;AACvC,MAAI,CAAC,OAAO,SAAS,UAAU;AAAG,WAAO,OAAO;AAChD,QAAM,aAAa,IAAI,SAAS;AAChC,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK,GAAG;AACpC,QAAI,MAAM;AAAQ;AAClB,UAAM,IAAI,MAAM,IAAI,WAAW,WAAW,GAAG,CAAC;AAC9C,QAAI,CAAC,OAAO,SAAS,CAAC;AAAG,aAAO,OAAO;AACvC,QAAI,KAAK;AAAY,aAAO,OAAO;EACvC;AACA,SAAO;AACX;AAMA,SAAS,gBAAgB,WAA8B,SAAiB,QAAc;AAClF,QAAM,YAAY,UAAU,GAAG,MAAM;AACrC,MAAI,CAAC,OAAO,SAAS,SAAS;AAAG,WAAO,OAAO;AAC/C,QAAM,aAAa,IAAI,SAAS;AAChC,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK,GAAG;AACpC,QAAI,MAAM;AAAQ;AAClB,UAAM,IAAI,MAAM,IAAI,UAAU,UAAU,GAAG,CAAC;AAC5C,QAAI,CAAC,OAAO,SAAS,CAAC;AAAG,aAAO,OAAO;AACvC,QAAI,KAAK;AAAW,aAAO,OAAO;EACtC;AACA,SAAO;AACX;AA0CM,SAAU,gBAAgB,QAAgB,MAA0B;AACtE,QAAM,MAAMD,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,UAAM,SAAS,MAAM,UAAUD;AAC/B,WAAOE,WAAS,IAAI,OAAO,MAAM,MAAM,UAAU,MAAM;AACvD,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,IAAI,OAAO;AACvB,QAAM,aAAa,IAAI,KAAK,SAAS;AAErC,MAAI,IAAI,QAAQ;AAIZ,QAAI,KAAK,WAAW,YAAY;AAC5B,WAAK,SAAS,YAAY,OAAO,GAAG;AACpC,WAAK,WAAW,YAAY,OAAO,GAAG;IAC1C,OAAO;AACH,WAAK,SAAS,YAAY,cAAc,KAAK,YAAY,IAAI,MAAM,KAAK,MAAM,CAAC;AAC/E,WAAK,WAAW,YAAY,gBAAgB,KAAK,WAAW,IAAI,KAAK,KAAK,MAAM,CAAC;IACrF;EACJ,OAAO;AACH,SAAK,WAAW,OAAO,IAAI,IAAI;AAC/B,SAAK,UAAU,OAAO,IAAI,GAAG;AAC7B,SAAK,YAAY;AACjB,QAAI,KAAK,WAAW,YAAY;AAC5B,WAAK,SAAS,OAAO,OAAO,GAAG;AAC/B,WAAK,WAAW,OAAO,OAAO,GAAG;IACrC,OAAO;AAIH,WAAK,SAAS,OACV,cAAc,KAAK,YAAY,KAAK,WAAW,GAAG,CAAC,GAAG,KAAK,MAAM,CAAC;AAEtE,WAAK,WAAW,OACZ,gBAAgB,KAAK,WAAW,KAAK,UAAU,GAAG,CAAC,GAAG,KAAK,MAAM,CAAC;IAE1E;EACJ;AACA,SAAO,KAAK;AAChB;;;ACnKA,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,mDAAmD;EACvE;AACA,SAAO;AACX;AAEA,SAAS,eAAe,IAAY,IAAY,OAAa;AACzD,MAAI,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AACzE,WAAO,OAAO;EAClB;AACA,QAAM,QAAQ,KAAK;AACnB,MAAI,UAAU;AAAG,WAAO,OAAO;AAC/B,SAAQ,QAAQ,KAAK,SAAU;AACnC;AAuBM,SAAU,UAAU,QAAgB,QAAgB,OAAqB;AAC3E,QAAM,MAAMA,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,UAAM,YAAY,IAAI,kBAAkB,IAAI,OAAO,MAAM,MAAM,QAAQ;AACvE,WAAO,EAAE,WAAW,QAAQ,eAAuB,SAAS,EAAC;AAC7D,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,MAAM,IAAI,OAAO;AACvB,QAAM,KAAK,QAAQ,GAAG,MAAM,OAAO,IAAI,MAAM,MAAM,EAAE;AACrD,QAAM,KAAK,OAAO,GAAG,MAAM,OAAO,IAAI,KAAK,MAAM,EAAE;AACnD,QAAM,QAAQ,eAAe,IAAI,IAAI,IAAI,KAAK;AAC9C,MAAI,IAAI,QAAQ;AACZ,SAAK,UAAU,YAAY,KAAK;EACpC,OAAO;AACH,SAAK,UAAU,OAAO,KAAK;EAC/B;AACA,SAAO,KAAK;AAChB;;;AC3DA,IAAM,oBAAoB;AAC1B,IAAM,gBAAgB;AAEtB,IAAMC,YAAW;AACjB,IAAMC,cAAa;AACnB,IAAMC,iBAAgB;AA2BtB,SAASC,WAAM;AACX,QAAM,MAAM,uBAAuB;AACnC,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,gDAAgD;EACpE;AACA,SAAO;AACX;AAEA,SAASC,WAAS,UAAkB,WAAmB,OAAa;AAChE,QAAM,cAAc,IAAI,kBAAkB,QAAQ;AAClD,QAAM,kBAAkB,IAAI,kBAAkB,QAAQ;AACtD,SAAO;IACH,SAAS,OAAO,OAAO;MACnB,OAAO,eAAuB,WAAW;MACzC,WAAW,eAAuB,eAAe;KACpD;IACD;IACA;IACA;IACA;IACA,UAAU;IACV,WAAWF;IACX,gBAAgB,OAAO;IACvB,gBAAgB;IAChB,oBAAoB,OAAO;IAC3B,WAAW;IACX,oBAAoB;IACpB,qBAAqBA;IACrB,0BAA0B,OAAO;IACjC,0BAA0B;IAC1B,8BAA8B,OAAO;IACrC,qBAAqB;;AAE7B;AAEA,SAASG,UAAS,MAAgB;AAC9B,OAAK,qBAAqB,KAAK;AAC/B,OAAK,sBAAsB,KAAK;AAChC,OAAK,2BAA2B,KAAK;AACrC,OAAK,2BAA2B,KAAK;AACrC,OAAK,+BAA+B,KAAK;AACzC,OAAK,sBAAsB,KAAK;AACpC;AAUA,SAASC,gBACL,OACA,UACA,WACA,OACA,eACA,oBACA,oBACA,wBACA,eAAqB;AAUrB,QAAM,oBAAqB,QAAQ,sBAAsB,qBAAsB;AAC/E,QAAM,iBAAiB,WAAW;AAElC,MAAI,kBAAkBJ,gBAAe;AAGjC,QACI,KAAK,IAAI,gBAAgB,KAAK,aAC9B,kBAAkB,SAClB,uBAAuB,GACzB;AACE,YAAM,eAAsB,mBAAmB,IAAIF,YAAWC;AAC9D,aAAO;QACH,OAAO;QACP,WAAW;QACX,eAAe;QACf,oBAAoB;QACpB,oBAAoB;QACpB,wBAAwB;QACxB,eAAe;;IAEvB;AACA,WAAO;MACH,OAAO,OAAO;MACd,WAAW,OAAO;MAClB,eAAeC;MACf,oBAAoB;MACpB,oBAAoB;MACpB,wBAAwB;MACxB,eAAe;;EAEvB;AAEA,MAAI,kBAAkBF,WAAU;AAE5B,QAAI,QAAQ,wBAAwB;AAChC,aAAO;QACH,OAAO;QACP,WAAWA;QACX,eAAeA;QACf,oBAAoB;QACpB,oBAAoB;QACpB,wBAAwB;QACxB,eAAe;;IAEvB;AAMA,UAAM,mBAAoB,yBAAyB,SAAS,yBAA0B;AACtF,UAAM,gBAAgB,WAAW;AACjC,QAAI,mBAAmB,aAAa,iBAAiB,OAAO;AAIxD,aAAO;QACH,OAAO;QACP,WAAWC;QACX,eAAeA;QACf,oBAAoB;QACpB,oBAAoB;QACpB,wBAAwB;QACxB,eAAe;;IAEvB;AAEA,WAAO;MACH,OAAO;MACP,WAAWD;MACX,eAAeA;MACf,oBAAoB;MACpB,oBAAoB;MACpB,wBAAwB;MACxB,eAAe;;EAEvB;AAGA,MAAI,QAAQ,wBAAwB;AAChC,WAAO;MACH,OAAO;MACP,WAAWC;MACX,eAAeA;MACf,oBAAoB;MACpB,oBAAoB;MACpB,wBAAwB;MACxB,eAAe;;EAEvB;AAKA,QAAM,oBACF,2BAA2B,KACnB,QAAQ,0BAA0B,yBAA0B,MAC9D;AACV,QAAM,kBAAkB,WAAW;AACnC,MAAI,qBAAqB,aAAa,mBAAmB,OAAO;AAC5D,WAAO;MACH,OAAO;MACP,WAAWD;MACX,eAAeA;MACf,oBAAoB;MACpB,oBAAoB;MACpB,wBAAwB;MACxB,eAAe;;EAEvB;AACA,SAAO;IACH,OAAO;IACP,WAAWC;IACX,eAAeA;IACf,oBAAoB;IACpB,oBAAoB;IACpB,wBAAwB;IACxB,eAAe;;AAEvB;AAEA,SAASM,WACL,MACA,OACA,UAAgB;AAEhB,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAGzB,WAAO,EAAE,OAAO,OAAO,KAAK,WAAW,OAAO,IAAG;EACrD;AACA,EAAAF,UAAS,IAAI;AAEb,MAAI,KAAK,aAAa,GAAG;AAErB,SAAK,WAAW;AAChB,SAAK,iBAAiB;AACtB,SAAK,iBAAiB;AACtB,SAAK,qBAAqB;AAC1B,SAAK,YAAY;AACjB,SAAK,YAAYH;AACjB,WAAO,EAAE,OAAO,OAAO,KAAK,WAAW,OAAO,IAAG;EACrD;AAEA,QAAMM,QAAOF,gBACT,OACA,UACA,KAAK,WACL,KAAK,OACL,KAAK,WACL,KAAK,gBACL,KAAK,gBACL,KAAK,oBACL,KAAK,SAAS;AAElB,OAAK,YAAY;AACjB,OAAK,YAAYE,MAAK;AACtB,OAAK,iBAAiBA,MAAK;AAC3B,OAAK,iBAAiBA,MAAK;AAC3B,OAAK,qBAAqBA,MAAK;AAC/B,OAAK,YAAYA,MAAK;AACtB,SAAO,EAAE,OAAOA,MAAK,OAAO,WAAWA,MAAK,UAAS;AACzD;AAEA,SAASC,UACL,MACA,OACA,UAAgB;AAEhB,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AACzB,WAAO,EAAE,OAAO,OAAO,KAAK,WAAW,OAAO,IAAG;EACrD;AACA,MAAI,KAAK,uBAAuB,GAAG;AAG/B,WAAO,EAAE,OAAO,OAAO,KAAK,WAAW,OAAO,IAAG;EACrD;AACA,QAAMD,QAAOF,gBACT,OACA,UACA,KAAK,WACL,KAAK,OACL,KAAK,qBACL,KAAK,0BACL,KAAK,0BACL,KAAK,8BACL,KAAK,mBAAmB;AAE5B,SAAO,EAAE,OAAOE,MAAK,OAAO,WAAWA,MAAK,UAAS;AACzD;AAuCM,SAAU,OAAO,QAAgB,MAAiB;AACpD,QAAM,MAAML,SAAM;AAClB,MAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM;AACxC,MAAI,SAAS,QAAW;AACpB,UAAM,YAAY,MAAM,aAAa;AACrC,UAAM,QAAQ,MAAM,SAAS;AAC7B,WAAOC,WAAS,IAAI,OAAO,MAAM,MAAM,UAAU,WAAW,KAAK;AACjE,QAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACvC;AACA,QAAM,QAAQ,IAAI,OAAO,IAAI;AAC7B,MAAI,IAAI,QAAQ;AAKZ,UAAM,kBAAkB,KAAK;AAC7B,UAAM,EAAE,OAAO,UAAS,IAAKK,UAAS,MAAM,OAAO,eAAe;AAClE,SAAK,YAAY,YAAY,KAAK;AAClC,SAAK,gBAAgB,YAAY,SAAS;EAC9C,OAAO;AAIH,UAAM,kBAAkB,KAAK;AAC7B,UAAM,EAAE,OAAO,UAAS,IAAKF,WAAU,MAAM,OAAO,eAAe;AACnE,SAAK,YAAY,OAAO,KAAK;AAC7B,SAAK,gBAAgB,OAAO,SAAS;EACzC;AACA,SAAO,KAAK;AAChB;;;ACkDO,IAAM,cAAc,OAAO,OAAO;EACrC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACM;AAwDH,IAAM,uBAET,OAAO,OAAO;EACd,OAAO,OAAO,OAAO;IACjB,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,KAAK,GAAG,CAAC;IAC3C,SAAS,OAAO,OAAO,EAAE,MAAM,SAAS,KAAK,GAAG,KAAK,IAAG,CAAW;GACtE;EACD,WAAW,OAAO,OAAO;IACrB,SAAS,OAAO,OAAO,EAAE,MAAM,SAAS,KAAK,MAAM,KAAK,EAAC,CAAW;GACvE;EACD,UAAU,OAAO,OAAO;IACpB,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,KAAK,GAAG,CAAC;IAC3C,SAAS,OAAO,OAAO,EAAE,MAAM,SAAS,KAAK,GAAG,KAAK,IAAG,CAAW;GACtE;EACD,aAAa,OAAO,OAAO;IACvB,SAAS,OAAO,OAAO,EAAE,MAAM,SAAS,KAAK,GAAG,KAAK,IAAG,CAAW;GACtE;EACD,KAAK,OAAO,OAAO;IACf,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,OAAO,UAAU,MAAM,CAAC;IAC1D,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,KAAK,OAAO,OAAO;IACf,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,OAAO,UAAU,MAAM,CAAC;IAC1D,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,sBAAsB,OAAO,OAAO;IAChC,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,OAAO,WAAW,QAAQ,CAAC;IAC7D,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,yBAAyB,OAAO,OAAO;IACnC,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,OAAO,WAAW,QAAQ,CAAC;IAC7D,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,YAAY,OAAO,OAAO;IACtB,SAAS,OAAO,OAAO,EAAE,MAAM,SAAS,KAAK,GAAG,KAAK,IAAG,CAAW;GACtE;EACD,KAAK,OAAO,OAAO;IACf,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,OAAO,QAAQ,CAAC;IAClD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,KAAK,OAAO,OAAO;IACf,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,OAAO,QAAQ,CAAC;IAClD,SAAS,OAAO,OAAO,EAAE,MAAM,SAAS,KAAK,MAAM,KAAK,IAAG,CAAW;GACzE;EACD,KAAK,OAAO,OAAO;IACf,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,OAAO,QAAQ,CAAC;IAClD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,KAAK,OAAO,OAAO;IACf,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,OAAO,QAAQ,CAAC;IAClD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,QAAQ,OAAO,OAAO;IAClB,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,UAAU,SAAS,CAAC;IACtD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,SAAS,OAAO,OAAO;IACnB,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,WAAW,QAAQ,CAAC;IACtD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,MAAM,OAAO,OAAO;IAChB,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,QAAQ,QAAQ,CAAC;IACnD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,uBAAuB,OAAO,OAAO;IACjC,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,OAAO,WAAW,QAAQ,CAAC;IAC7D,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,OAAO,OAAO,OAAO;IACjB,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,MAAM,MAAM,CAAC;IAC/C,SAAS,OAAO,OAAO,EAAE,MAAM,SAAS,KAAK,GAAG,KAAK,IAAG,CAAW;GACtE;EACD,UAAU,OAAO,OAAO;IACpB,SAAS,OAAO,OAAO,EAAE,MAAM,SAAS,KAAK,MAAM,KAAK,IAAG,CAAW;GACzE;EACD,UAAU,OAAO,OAAO;IACpB,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,SAAS,UAAU,OAAO,CAAC;IAC7D,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,SAAS,OAAO,OAAO;IACnB,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,SAAS,UAAU,OAAO,CAAC;IAC7D,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,UAAU,OAAO,OAAO;IACpB,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,SAAS,UAAU,OAAO,CAAC;IAC7D,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,MAAM,OAAO,OAAO;IAChB,SAAS,OAAO,OAAO,EAAE,MAAM,SAAS,KAAK,GAAG,KAAK,IAAG,CAAW;GACtE;EACD,MAAM,OAAO,OAAO;IAChB,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,OAAO,WAAW,CAAC;IACrD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,YAAY,OAAO,OAAO;IACtB,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,QAAQ,WAAW,CAAC;IACtD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,YAAY,OAAO,OAAO;IACtB,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,QAAQ,OAAO,CAAC;IAClD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,iBAAiB,OAAO,OAAO;IAC3B,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,QAAQ,OAAO,CAAC;IAClD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,iBAAiB,OAAO,OAAO;IAC3B,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,MAAM,MAAM,CAAC;IAC/C,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,QAAQ,OAAO,OAAO;IAClB,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,SAAS,WAAW,CAAC;IACvD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,eAAe,OAAO,OAAO;IACzB,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,QAAQ,KAAK,CAAC;IAChD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,gBAAgB,OAAO,OAAO;IAC1B,kBAAkB;IAClB,mBAAmB,OAAO,OAAO;MAC7B;MACA;MACA;MACA;MACA;MACA;MACA;KACH;IACD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,gBAAgB,OAAO,OAAO;IAC1B,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,SAAS,WAAW,CAAC;IACvD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,UAAU,OAAO,OAAO;IACpB,kBAAkB;IAClB,mBAAmB,OAAO,OAAO;MAC7B;MACA;MACA;MACA;MACA;KACH;IACD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,KAAK,OAAO,OAAO;IACf,SAAS,OAAO,OAAO,EAAE,MAAM,SAAS,KAAK,GAAG,KAAK,IAAG,CAAW;GACtE;EACD,KAAK,OAAO,OAAO;IACf,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,UAAU,SAAS,CAAC;IACtD,SAAS,OAAO,OAAO,EAAE,MAAM,SAAS,KAAK,GAAG,KAAK,IAAG,CAAW;GACtE;EACD,MAAM,OAAO,OAAO;IAChB,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,QAAQ,QAAQ,CAAC;IACnD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,QAAQ,OAAO,OAAO;IAClB,kBAAkB;IAClB,mBAAmB,OAAO,OAAO,CAAC,QAAQ,OAAO,CAAC;IAClD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;EACD,oBAAoB,OAAO,OAAO;IAC9B,SAAS,OAAO,OAAO,EAAE,MAAM,SAAS,KAAK,IAAI,KAAK,EAAC,CAAW;GACrE;EACD,UAAU,OAAO,OAAO;IACpB,kBAAkB;IAClB,mBAAmB,OAAO,OAAO;MAC7B;MACA;MACA;MACA;MACA;KACH;IACD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAM,CAAW;GACnD;CACJ;;;AC3vBM,IAAMG,MAAkB;;;ACGzB,SAAU,oBAAoBC,QAAkB;AAClD,QAAM,OAAO;IACT,KAAKA,OAAM,WAAW;IACtB,QAAQA,OAAM,eAAe;IAC7B,IAAAC;IACA,MAAAC;IACA,OAAAC;IACA,OAAAC;IACA;IACA,OAAO,oBAAmB;IAC1B,UAAUJ,OAAM,eAAe,MAAM;IACrC,SAASA,OAAM,eAAe,MAAM;IACpC,WAAWA,OAAM,eAAe,MAAM;IACtC,SAAS,sBAAqB;IAC9B,SAAS,sBAAsBA,OAAM,cAAc;;AAEvD,MAAIA,OAAM,SAAS,SAAS;AAAkB,WAAO;AACrD,SAAO;IACH,GAAG;IACH,QAAQ,CAAC,aAAa,UAClB,mBAAmBA,OAAM,gBAAgB,aAAa,KAAK;;AAEvE;;;ACjBA,eAAsB,WAClBK,QACA,QACA,YAAuB,SAAO;AAE9B,oBAAkBA,OAAM,YAAY,MAAM;AAC1C,yBAAuBA,OAAM,UAAU;AAEvC,EAAAA,OAAM,UAAU,QAAQ,CAAA;AACxB,EAAAA,OAAM,UAAU,WAAW,CAAA;AAC3B,EAAAA,OAAM,UAAU,SAAS,CAAA;AACzB,EAAAA,OAAM,UAAU,kBAAkB,CAAA;AAClC,EAAAA,OAAM,UAAU,OAAO,CAAA;AACvB,EAAAA,OAAM,UAAU,cAAc,CAAA;AAC9B,EAAAA,OAAM,UAAU,UAAUA,OAAM;AAChC,EAAAA,OAAM,UAAU,QAAQA,OAAM;AAC9B,EAAAA,OAAM,eAAe,0BAA0B,MAAK;AACpD,EAAAA,OAAM,eAAe,6BAA6B,MAAK;AACvD,EAAAA,OAAM,eAAe,YAAY;AACjC,EAAAA,OAAM,eAAe,6BAA6B;AAElD,yBAAuB,UAAUA,OAAM;AACvC,EAAAA,OAAM,eAAe,SAAS;AAC9B,MAAI;AACA,uBAAmBA,OAAM,cAAc;AACvC,wBAAoBA,QAAO,SAAS;AACpC,QAAI;AACA,YAAM,QAAQ,QAAQA,OAAM,QAAQ,oBAAoBA,MAAK,CAAC,CAAC;AAC/D,uBAAiBA,OAAM,cAAc;AACrC,sBAAgBA,OAAM,cAAc;IACxC,SAAS,KAAK;AACV,UAAI,CAAC,mBAAmB,GAAG;AAAG,cAAM;AACpC,MAAAA,OAAM,UAAU,QAAQ,CAAA;AACxB,MAAAA,OAAM,UAAU,WAAW,CAAA;AAC3B,MAAAA,OAAM,UAAU,SAAS,CAAA;AACzB,MAAAA,OAAM,UAAU,kBAAkB,CAAA;AAClC,MAAAA,OAAM,UAAU,OAAO,CAAA;AACvB,qBAAeA,OAAM,WAAW;QAC5B,MAAM;QACN,UAAU;QACV,MAAM;QACN,SAAS,IAAI;QACb,QAAQ;QACR,KAAKA,OAAM;OACd;IACL;EACJ;AACI,2BAAuB,UAAU;EACrC;AAEA,EAAAA,OAAM,YAAY;AACtB;;;ACnDA,eAAsB,UAAUC,QAAoB,QAAW;AAC3D,kBAAgBA,OAAM,YAAY,MAAM;AACxC,yBAAuBA,OAAM,UAAU;AAEvC,EAAAA,OAAM,UAAU,QAAQ,CAAA;AACxB,EAAAA,OAAM,UAAU,WAAW,CAAA;AAC3B,EAAAA,OAAM,UAAU,SAAS,CAAA;AACzB,EAAAA,OAAM,UAAU,kBAAkB,CAAA;AAClC,EAAAA,OAAM,UAAU,OAAO,CAAA;AACvB,EAAAA,OAAM,UAAU,cAAc,CAAA;AAC9B,EAAAA,OAAM,UAAU,UAAUA,OAAM;AAChC,EAAAA,OAAM,UAAU,QAAQA,OAAM;AAC9B,EAAAA,OAAM,eAAe,0BAA0B,MAAK;AACpD,EAAAA,OAAM,eAAe,6BAA6B,MAAK;AACvD,EAAAA,OAAM,eAAe,YAAY;AACjC,EAAAA,OAAM,eAAe,6BAA6B;AAElD,yBAAuB,UAAUA,OAAM;AACvC,EAAAA,OAAM,eAAe,SAAS;AAC9B,MAAI;AACA,uBAAmBA,OAAM,cAAc;AACvC,6BAAyBA,OAAM,cAAc;AAC7C,wBAAoBA,QAAO,MAAM;AACjC,QAAI;AACA,YAAM,QAAQ,QAAQA,OAAM,QAAQ,oBAAoBA,MAAK,CAAC,CAAC;IACnE,SAAS,KAAK;AACV,UAAI,CAAC,mBAAmB,GAAG;AAAG,cAAM;AACpC,MAAAA,OAAM,UAAU,QAAQ,CAAA;AACxB,MAAAA,OAAM,UAAU,WAAW,CAAA;AAC3B,MAAAA,OAAM,UAAU,SAAS,CAAA;AACzB,MAAAA,OAAM,UAAU,kBAAkB,CAAA;AAClC,MAAAA,OAAM,UAAU,OAAO,CAAA;AACvB,qBAAeA,OAAM,WAAW;QAC5B,MAAM;QACN,UAAU;QACV,MAAM;QACN,SAAS,IAAI;QACb,QAAQ;QACR,KAAKA,OAAM;OACd;IACL;EACJ;AACI,IAAAA,OAAM,eAAe,SAAS;AAC9B,2BAAuB,UAAU;EACrC;AACJ;;;AC5CA,eAAsB,UAAUC,QAAoB,MAAwB;AACxE,MAAI,KAAK,WAAW;AAAG;AACvB,QAAM,UAAUA,OAAM;AACtB,QAAM,QAAQA,OAAM,UAAU;AAC9B,QAAM,WAAWA,OAAM,UAAU;AACjC,QAAM,SAASA,OAAM,UAAU;AAC/B,QAAM,kBAAkBA,OAAM,UAAU,mBAAmB,CAAA;AAC3D,QAAM,OAAOA,OAAM,UAAU;AAC7B,QAAM,cAAcA,OAAM,UAAU;AACpC,aAAW,OAAO,MAAM;AACpB,UAAM,WAAWA,QAAO,KAAK,SAAS;AACtC,UAAM,KAAK,GAAGA,OAAM,UAAU,KAAK;AACnC,aAAS,KAAK,GAAGA,OAAM,UAAU,QAAQ;AACzC,WAAO,KAAK,GAAGA,OAAM,UAAU,MAAM;AACrC,oBAAgB,KAAK,GAAIA,OAAM,UAAU,mBAAmB,CAAA,CAAG;AAC/D,SAAK,KAAK,GAAGA,OAAM,UAAU,IAAI;AACjC,gBAAY,KAAK,GAAGA,OAAM,UAAU,WAAW;EACnD;AACA,EAAAA,OAAM,UAAU,QAAQ;AACxB,EAAAA,OAAM,UAAU,WAAW;AAC3B,EAAAA,OAAM,UAAU,SAAS;AACzB,EAAAA,OAAM,UAAU,kBAAkB;AAClC,EAAAA,OAAM,UAAU,OAAO;AACvB,EAAAA,OAAM,UAAU,cAAc;AAC9B,EAAAA,OAAM,UAAU,UAAU;AAE9B;;;AC5CM,SAAU,mBAAmB,QAAqB,QAAW;AAC/D,oBAAkB,QAAQ,MAAM;AACpC;AAYM,SAAU,qBAAqB,QAAqB,QAAW;AACjE,oBAAkB,QAAQ,MAAM;AACpC;AAYM,SAAU,uBAAuB,QAAqB,MAAwB;AAChF,aAAW,OAAO,MAAM;AACpB,sBAAkB,QAAQ,GAAG;EACjC;AACJ;;;AC5CA,IAAM,aAAa,CAAC,QAAQ,QAAQ,QAAQ,OAAO,SAAS,QAAQ;AAEpE,SAAS,SAAS,OAAc;AAC5B,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC9E;AAEA,SAASC,aAAY,OAAc;AAC/B,MAAI,UAAU;AAAM,WAAO;AAC3B,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU;AAAW,WAAO;AACpE,MAAI,OAAO,UAAU;AAAU,WAAO,OAAO,SAAS,KAAK;AAC3D,MAAI,MAAM,QAAQ,KAAK;AAAG,WAAO,MAAM,MAAM,CAAC,UAAUA,aAAY,KAAK,CAAC;AAC1E,MAAI,SAAS,KAAK,GAAG;AACjB,WAAO,OAAO,OAAO,KAAK,EAAE,MAAM,CAAC,UAAUA,aAAY,KAAK,CAAC;EACnE;AACA,SAAO;AACX;AAEA,SAAS,iBAAiB,OAAc;AACpC,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;AAC7D;AAEA,SAAS,cAAc,OAAc;AACjC,SACI,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,UAAU,UAAU,QAAQ,iBAAiB,KAAK,CAAC;AAEhG;AAEA,SAAS,iBAAiB,OAAc;AACpC,MAAI,CAAC,SAAS,KAAK;AAAG,WAAO;AAC7B,MAAI,OAAO,MAAM,aAAa;AAAU,WAAO;AAC/C,MAAI,CAAC,OAAO,UAAU,MAAM,SAAS,KAAK,CAAC,OAAO,UAAU,MAAM,MAAM;AAAG,WAAO;AAClF,QAAM,UAAU,MAAM;AACtB,MAAI,CAAC,SAAS,OAAO;AAAG,WAAO;AAC/B,SAAO,WAAW,MAAM,CAAC,QAAQ,cAAc,QAAQ,GAAG,CAAC,CAAC;AAChE;AAaM,SAAU,iBAAiB,MAAa;AAC1C,MAAI,CAAC,SAAS,IAAI;AAAG,WAAO;AAC5B,MAAI,KAAK,oBAAoB;AAAG,WAAO;AACvC,MAAI,CAAC,iBAAiB,KAAK,WAAW,KAAK,CAAC,iBAAiB,KAAK,OAAO;AAAG,WAAO;AACnF,MAAI,CAAC,SAAS,KAAK,OAAO,KAAK,CAAC,SAAS,KAAK,KAAK;AAAG,WAAO;AAC7D,MAAI,CAAC,OAAO,OAAO,KAAK,OAAO,EAAE,MAAM,CAAC,WAAW,iBAAiB,MAAM,CAAC;AAAG,WAAO;AACrF,SAAO,OAAO,OAAO,KAAK,KAAK,EAAE,MAAM,CAAC,SAASA,aAAY,IAAI,CAAC;AACtE;;;AClDA,IAAM,iBAAiB;AA6CvB,SAASC,UAAS,OAAc;AAC5B,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC9E;AAEA,SAAS,aAAa,OAAa;AAC/B,SAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAC5C;AAEA,SAAS,cAAc,OAAc;AACjC,MAAI,UAAU;AAAM,WAAO,OAAO;AAClC,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ;AACzE;AAUA,SAAS,eACL,QAAoC;AAEpC,QAAM,MAAM,CAAA;AACZ,aAAW,OAAO,OAAO,KAAK,MAAM,GAAU;AAC1C,UAAM,WAAW,cAAc,OAAO,GAAG,CAAC;AAC1C,QAAI,aAAa;AAAM,aAAO;AAC9B,QAAI,GAAG,IAAI;EACf;AACA,SAAO;AACX;AAEA,SAAS,UAAU,OAAc;AAC7B,SAAO,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK;AAC9D;AAEA,SAAS,iBAAiB,OAAc;AACpC,MAAI,CAACA,UAAS,KAAK;AAAG,WAAO;AAC7B,MAAI,CAAC,UAAU,MAAM,SAAS,KAAK,CAAC,UAAU,MAAM,MAAM;AAAG,WAAO;AACpE,SACI,MAAM,QAAQ,MAAM,MAAM,KAC1B,MAAM,OAAO,MACT,CAAC,UAAU,UAAU,QAAS,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,CAAE;AAG9F;AAEA,SAAS,gBAAgB,QAAyB;AAC9C,QAAMC,YAAW,OAAO,wBAAuB;AAC/C,SAAO;IACH,WAAWA,UAAS;IACpB,QAAQA,UAAS;IACjB,QAAQA,UAAS;;AAEzB;AAEA,SAAS,cAAcA,WAA0B,UAAgB;AAC7D,QAAM,SAAS,IAAI,kBAAkB,QAAQ;AAC7C,MAAI;AACA,WAAO,0BAA0BA,SAAQ;AACzC,WAAO;EACX,QAAQ;AACJ,WAAO;EACX;AACJ;AAEA,SAAS,SAAS,WAA4B;AAC1C,SAAO;IACH;IACA,QAAQ,eAAuB,SAAS;IACxC,cAAc,oBAAI,IAAG;;AAE7B;AAEA,SAAS,oBAAoB,OAAc;AACvC,SAAO,iBAAiB;AAC5B;AAEA,SAAS,aAAa,MAAuC;AACzD,MACI,KAAK,SAAS,YACd,OAAO,KAAK,WAAW,YACvB,OAAO,KAAK,QAAQ,YACpB,CAAC,oBAAoB,KAAK,SAAS,KACnC,CAAC,oBAAoB,KAAK,MAAM,GAClC;AACE,WAAO;EACX;AACA,SAAO;IACH,MAAM;IACN,QAAQ,KAAK;IACb,WAAW,gBAAgB,KAAK,SAAS;IACzC,QAAQ,gBAAgB,KAAK,MAAM;IACnC,KAAK,aAAa,KAAK,GAAG;;AAElC;AAEA,SAAS,aAAa,MAAuC;AACzD,MACI,KAAK,SAAS,YACd,OAAO,KAAK,UAAU,YACtB,OAAO,KAAK,WAAW,YACvB,OAAO,KAAK,YAAY,YACxB,OAAO,KAAK,cAAc,YAC1B,OAAO,KAAK,YAAY,YACxB,OAAO,KAAK,kBAAkB,YAC9B,CAAC,oBAAoB,KAAK,SAAS,GACrC;AACE,WAAO;EACX;AACA,SAAO;IACH,MAAM;IACN,OAAO,aAAa,KAAK,KAAK;IAC9B,QAAQ,KAAK;IACb,WAAW,gBAAgB,KAAK,SAAS;IACzC,SAAS,aAAa,KAAK,OAAO;IAClC,WAAW,KAAK;IAChB,SAAS,aAAa,KAAK,OAAO;IAClC,eAAe,aAAa,KAAK,aAAa;;AAEtD;AAEA,SAAS,aAAa,MAAuC;AACzD,MACI,KAAK,SAAS,YACd,OAAO,KAAK,WAAW,YACvB,OAAO,KAAK,gBAAgB,YAC5B,OAAO,KAAK,gBAAgB,YAC5B,OAAO,KAAK,cAAc,YAC1B,OAAO,KAAK,YAAY,YACxB,OAAO,KAAK,YAAY,YACxB,OAAO,KAAK,YAAY,YACxB,OAAO,KAAK,kBAAkB,YAC9B,CAAC,oBAAoB,KAAK,SAAS,GACrC;AACE,WAAO;EACX;AACA,SAAO;IACH,MAAM;IACN,QAAQ,KAAK;IACb,WAAW,gBAAgB,KAAK,SAAS;IACzC,aAAa,aAAa,KAAK,WAAW;IAC1C,aAAa,aAAa,KAAK,WAAW;IAC1C,WAAW,KAAK;IAChB,SAAS,aAAa,KAAK,OAAO;IAClC,SAAS,aAAa,KAAK,OAAO;IAClC,SAAS,aAAa,KAAK,OAAO;IAClC,eAAe,aAAa,KAAK,aAAa;;AAEtD;AAEA,SAAS,WAAWA,WAA2C;AAC3D,QAAM,cAAcA,UAAS;AAC7B,QAAM,iBAAiBA,UAAS;AAChC,MACIA,UAAS,SAAS,YAClB,CAAC,UAAUA,UAAS,MAAM,KAC1B,CAAC,iBAAiB,WAAW,KAC7B,CAAC,iBAAiB,cAAc,GAClC;AACE,WAAO;EACX;AACA,QAAM,MAAM,cAAcA,UAAS,GAAG;AACtC,MAAI,QAAQ;AAAM,WAAO;AACzB,QAAM,YAAY,cAAc,aAAa,YAAY,OAAO,MAAM;AACtE,QAAM,SAAS,cAAc,gBAAgBA,UAAS,MAAM;AAC5D,MAAI,cAAc,QAAQ,WAAW;AAAM,WAAO;AAClD,SAAO;IACH,MAAM;IACN,GAAG,SAAS,SAAS;IACrB,QAAQA,UAAS;IACjB;IACA;;AAER;AAEA,SAAS,WAAWA,WAA2C;AAC3D,QAAM,cAAcA,UAAS;AAC7B,MACIA,UAAS,SAAS,YAClB,CAAC,UAAUA,UAAS,MAAM,KAC1B,CAAC,UAAUA,UAAS,SAAS,KAC7B,CAAC,iBAAiB,WAAW,GAC/B;AACE,WAAO;EACX;AACA,QAAM,UAAU,eAAe;IAC3B,OAAOA,UAAS;IAChB,SAASA,UAAS;IAClB,SAASA,UAAS;IAClB,eAAeA,UAAS;GAC3B;AACD,MAAI,YAAY;AAAM,WAAO;AAC7B,QAAM,YAAY,cAAc,aAAa,YAAY,OAAO,MAAM;AACtE,MAAI,cAAc;AAAM,WAAO;AAC/B,SAAO;IACH,MAAM;IACN,GAAG,SAAS,SAAS;IACrB,OAAO,QAAQ;IACf,QAAQA,UAAS;IACjB,SAAS,QAAQ;IACjB,WAAWA,UAAS;IACpB,SAAS,QAAQ;IACjB,eAAe,QAAQ;;AAE/B;AAEA,SAAS,WAAWA,WAA2C;AAC3D,QAAM,cAAcA,UAAS;AAC7B,MACIA,UAAS,SAAS,YAClB,CAAC,UAAUA,UAAS,MAAM,KAC1B,CAAC,UAAUA,UAAS,SAAS,KAC7B,CAAC,iBAAiB,WAAW,GAC/B;AACE,WAAO;EACX;AACA,QAAM,UAAU,eAAe;IAC3B,aAAaA,UAAS;IACtB,aAAaA,UAAS;IACtB,SAASA,UAAS;IAClB,SAASA,UAAS;IAClB,SAASA,UAAS;IAClB,eAAeA,UAAS;GAC3B;AACD,MAAI,YAAY;AAAM,WAAO;AAC7B,QAAM,YAAY,cAAc,aAAa,YAAY,OAAO,MAAM;AACtE,MAAI,cAAc;AAAM,WAAO;AAC/B,SAAO;IACH,MAAM;IACN,GAAG,SAAS,SAAS;IACrB,QAAQA,UAAS;IACjB,aAAa,QAAQ;IACrB,aAAa,QAAQ;IACrB,WAAWA,UAAS;IACpB,SAAS,QAAQ;IACjB,SAAS,QAAQ;IACjB,SAAS,QAAQ;IACjB,eAAe,QAAQ;;AAE/B;AAEA,SAAS,gBAAgB,MAAa;AAClC,MAAI,CAACD,UAAS,IAAI;AAAG,WAAO;AAC5B,MAAI,KAAK,SAAS;AAAU,WAAO,aAAa,IAAI;AACpD,MAAI,KAAK,SAAS;AAAU,WAAO,aAAa,IAAI;AACpD,MAAI,KAAK,SAAS;AAAU,WAAO,aAAa,IAAI;AACpD,SAAO;AACX;AAEA,SAAS,cAAcC,WAAiB;AACpC,MAAI,CAACD,UAASC,SAAQ;AAAG,WAAO;AAChC,MAAIA,UAAS,SAAS;AAAU,WAAO,WAAWA,SAAQ;AAC1D,MAAIA,UAAS,SAAS;AAAU,WAAO,WAAWA,SAAQ;AAC1D,MAAIA,UAAS,SAAS;AAAU,WAAO,WAAWA,SAAQ;AAC1D,SAAO;AACX;AAYM,SAAU,oBAAoB,KAAW;AAC3C,SAAO,IAAI,WAAW,cAAc;AACxC;AAcM,SAAU,iBAAiB,QAAmB;AAChD,QAAM,MAAiC,CAAA;AACvC,aAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,QAAO,GAAI;AACnD,UAAMA,YAAW,gBAAgB,IAAI;AACrC,QAAIA,cAAa,MAAM;AACnB,UAAI,GAAG,cAAc,GAAG,MAAM,EAAE,IAAIA;IACxC;EACJ;AACA,SAAO,OAAO,OAAO,GAAG;AAC5B;AAcM,SAAU,eACZ,QACA,OAAwC;AAExC,SAAO,QAAQ,MAAK;AACpB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC9C,QAAI,CAAC,oBAAoB,GAAG;AAAG;AAC/B,UAAM,OAAO,cAAc,KAAK;AAChC,QAAI,SAAS,MAAM;AACf,aAAO,QAAQ,IAAI,IAAI,MAAM,eAAe,MAAM,GAAG,IAAI;IAC7D;EACJ;AACJ;;;AClWO,IAAM,0BAA0B;AAEvC,SAAS,eAAeC,WAAuB;AAC3C,QAAM,UAAU,OAAO,QAAQA,UAAS,OAAO;AAC/C,QAAM,QAAQ,QAAQ,CAAC;AACvB,SAAO,UAAU,SAAY,OAAO,MAAM,CAAC;AAC/C;AAEA,SAAS,eAAeC,QAAkB;AACtC,QAAM,OAAOA,OAAM,WAAW,kBAAiB;AAC/C,QAAM,UAA0C;IAC5C,CAAC,KAAK,aAAa,KAAK,SAAS,KAAK,QAAQ,GAAG;;AAErD,aAAW,CAAC,KAAK,MAAM,KAAKA,OAAM,eAAe,kBAAkB;AAC/D,YAAQ,GAAG,IAAI,OAAO,kBAAiB;EAC3C;AACA,SAAO,OAAO,OAAO,OAAO;AAChC;AAYM,SAAU,qBAAqBA,QAAoB,SAAe;AACpE,QAAM,UAAU,eAAeA,MAAK;AACpC,QAAM,QAAQ;IACV,GAAG,oBAAoBA,OAAM,cAAc;IAC3C,GAAG,iBAAiBA,OAAM,UAAU;;AAExC,QAAM,YAAY;IACd,aAAaA,OAAM,WAAW,IAAI;IAClC;IACA,OAAO,OAAO,OAAO,KAAK;IAC1B;IACA,iBAAiB;;AAErB,MAAI,CAAC,iBAAiB,SAAS;AAAG,WAAO;AACzC,SAAO;AACX;AAMA,SAAS,0BACLD,WACA,cAAoB;AAEpB,QAAM,SAAS,iBAAiB,KAAK,SAAYA,UAAS,QAAQ,YAAY;AAC9E,MAAI,WAAW;AAAW,WAAO;AACjC,QAAME,YAAW,eAAeF,SAAQ;AACxC,SAAOE,cAAa,OAAO,SAAYF,UAAS,QAAQE,SAAQ;AACpE;AAYM,SAAU,qBAAqBD,QAAoBD,WAAuB;AAC5E,QAAM,SAAS,0BAA0BA,WAAUC,OAAM,WAAW,IAAI,QAAQ;AAChF,MAAI,WAAW,QAAW;AACtB,IAAAA,OAAM,WAAW,oBAAoB,MAAM;AAC3C,IAAAA,OAAM,WAAW,KAAK,IAAIA,OAAM,UAAU,OAAO,MAAM;EAC3D;AACA,aAAW,CAAC,cAAc,SAAS,KAAKA,OAAM,eAAe,kBAAkB;AAC3E,UAAM,oBAAoBD,UAAS,QAAQ,YAAY;AACvD,QAAI,sBAAsB,QAAW;AACjC,gBAAU,oBAAoB,iBAAiB;IACnD;EACJ;AACA,iBAAeC,OAAM,YAAYD,UAAS,KAAK;AAG/C,QAAM,aAAsC,CAAA;AAC5C,aAAW,CAAC,SAAS,KAAK,KAAK,OAAO,QAAQA,UAAS,KAAK,GAAG;AAC3D,QAAI,CAAC,oBAAoB,OAAO,GAAG;AAC/B,iBAAW,OAAO,IAAI;IAC1B;EACJ;AACA,oBAAkBC,OAAM,gBAAgB,UAAU;AACtD;AAYA,eAAsB,kBAAkBA,QAAoB,SAAe;AACvE,QAAM,QAAQA,OAAM,eAAe;AACnC,MAAI,UAAU;AAAW,WAAO;AAChC,QAAMD,YAAW,qBAAqBC,QAAO,OAAO;AACpD,MAAID,cAAa,MAAM;AACnB,mBAAeC,OAAM,WAAW;MAC5B,MAAM;MACN,UAAU;MACV,MAAM;MACN,SAAS;MACT,QAAQ;MACR,KAAKA,OAAM;KACd;AACD,WAAO;EACX;AACA,MAAI;AACA,UAAM,MAAM,KAAKD,SAAQ;AACzB,IAAAC,OAAM,eAAe,kBAAkB;AACvC,WAAO;EACX,SAAS,KAAK;AACV,mBAAeA,OAAM,WAAW;MAC5B,MAAM;MACN,UAAU;MACV,MAAM;MACN,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;MACxD,QAAQ;MACR,KAAKA,OAAM;KACd;AACD,WAAO;EACX;AACJ;AAYA,eAAsB,uBAClBA,QACA,SACA,YAAkB;AAElB,MAAIA,OAAM,eAAe,yBAAyB;AAAW;AAC7D,MAAI,UAAUA,OAAM,eAAe,mBAAmB,YAAY;AAC9D,UAAM,kBAAkBA,QAAO,OAAO;EAC1C;AACJ;;;AChDA,SAAS,gBAAgB,UAAwB;AAC7C,QAAM,YAAY,SAAS,iBAAiB;AAC5C,QAAME,YAAW,SAAS,cAAc;AACxC,SAAO,KAAK,IAAI,GAAG,aAAaA,SAAQ;AAC5C;AAEA,SAAS,uBACL,UACA,UAAgB;AAEhB,QAAM,UAAU,oBAAI,IAAG;AACvB,aAAW,YAAY,SAAS,oBAAoB;AAChD,QAAI,QAAQ,IAAI,QAAQ;AAAG;AAC3B,YAAQ,IAAI,UAAU,kBAAkB,EAAE,UAAU,UAAU,QAAQ,GAAE,CAAE,CAAC;EAC/E;AACA,SAAO;AACX;AAEA,eAAe,cAAcC,QAAoB,OAAkB;AAC/D,UAAQ,MAAM,MAAM;IAChB,KAAK;AACD,YAAM,UAAcA,QAAO,MAAM,IAAI;AACrC;IACJ,KAAK;AACD,YAAM,WAAeA,QAAO,MAAM,GAAG;AACrC,YAAM,uBAAuBA,QAAOA,OAAM,IAAG,GAAIA,OAAM,qBAAqB;AAC5E;IACJ,KAAK;AACD,YAAM,UAAcA,QAAO,MAAM,GAAG;AACpC;EACR;AACJ;AAEA,SAAS,+BAA+BA,QAAoB,WAAiB;AACzE,iBAAeA,OAAM,WAAW;IAC5B,MAAM;IACN,UAAU;IACV,MAAM;IACN,SAAS,qBAAqB,SAAS;IACvC,QAAQ;IACR,KAAKA,OAAM;GACd;AACL;AAEA,SAAS,mBAAmBA,QAAoB,WAAmB,OAAkB;AACjF,QAAM,SAASA,OAAM,eAAe,iBAAiB,IAAI,SAAS;AAClE,MAAI,WAAW,QAAW;AACtB,mCAA+BA,QAAO,SAAS;AAC/C;EACJ;AACA,UAAQ,MAAM,MAAM;IAChB,KAAK;AACD,6BAAuB,QAAQ,MAAM,IAAI;AACzC;IACJ,KAAK;AACD,yBAAmB,QAAQ,MAAM,GAAG;AACpC;IACJ,KAAK;AACD,2BAAqB,QAAQ,MAAM,GAAG;AACtC;EACR;AACJ;AAsBM,SAAU,mBAAmB,MAA4B;AAC3D,QAAM,WAAW,gBAAgB,KAAK,SAAS,QAAQ;AACvD,QAAM,aAAa,kBAAkB,EAAE,UAAU,IAAI,UAAU,QAAQ,GAAE,CAAE;AAC3E,QAAM,mBAAmB,uBAAuB,KAAK,SAAS,UAAU,QAAQ;AAChF,QAAM,aAAa,KAAK,cAAc,mBAAkB;AACxD,QAAM,MAAM,KAAK,OAAO,KAAK;AAC7B,QAAM,QAAQ,mBAAmB;IAC7B,SAAS,gBAAgB,KAAK,WAAW,CAAA,GAAI,KAAK,aAAa,aAAa;GAC/E;AACD,QAAM,YAAoC;IACtC,OAAO,CAAA;IACP,UAAU,CAAA;IACV,QAAQ,CAAA;IACR,iBAAiB,CAAA;IACjB,MAAM,CAAA;IACN,aAAa,CAAA;IACb,SAAS;IACT,OAAO;;AAEX,QAAM,kBAAkB,IAAI,KACvB,KAAK,SAAS,SAAS,mBAAmB,CAAA,GAAI,IAAI,CAAC,cAAc;IAC9D,UAAU;IACV;GACH,CAAC;AAGN,QAAMA,SAAqB;IACvB,UAAU,KAAK,SAAS;IACxB,SAAS,KAAK,SAAS;IACvB,cAAc,KAAK;IACnB;IACA,uBAAuB,KAAK,yBAAyB;IACrD;IACA;IACA,gBAAgB;MACZ,QAAQ;MACR;MACA,GAAI,KAAK,yBAAyB,SAC5B,CAAA,IACA,EAAE,sBAAsB,KAAK,qBAAoB;MACvD,iBAAiB;MACjB,cAAc,KAAK;MACnB;MACA,UAAU,MAAMA,OAAM;MACtB,QAAQ;MACR,cAAc,oBAAI,IAAG;MACrB,sBAAsB,oBAAI,IAAG;MAC7B,uBAAuB;QACnB,OAAO;QACP,QAAQ;QACR,OAAO;QACP,WAAW;QACX,OAAO;;MAEX,mBAAmB,KAAK,SAAS,SAAS,eAAe;MACzD,YAAY,oBAAI,IAAG;MACnB;MACA,qBAAqB,oBAAI,IAAG;MAC5B,2BAA2B,oBAAI,IAAG;MAClC,8BAA8B,oBAAI,IAAG;MACrC,qBAAqB,oBAAI,IAAG;MAC5B,sBAAsB,oBAAI,IAAG;MAC7B;MACA,6BAA6B,oBAAI,IAAG;MACpC,WAAW;MACX,4BAA4B;MAC5B,gBAAgB,OAAO,OAAO,CAAA,CAAE;MAChC,oBAAoB,oBAAI,IAAG;MAC3B;;IAEJ;IACA,UAAU;;AAEd,QAAM,YACF,KAAK,kBACL,KAAK,gBAAgB,KAAK,SAAS,SAAS,IAAI,KAChD,OAAO,OAAO,CAAA,CAAE;AACpB,EAAAA,OAAM,eAAe,iBAAiB,cAClC,KAAK,SAAS,UACd,WACAA,OAAM,cAAc;AAGxB,SAAO,OAAO,OAAO;IACjB,MAAM,UAAU,MAAI;AAChB,YAAM,UAAcA,QAAO,IAAI;IACnC;IACA,MAAM,WAAW,KAAG;AAChB,YAAM,WAAeA,QAAO,GAAG;AAC/B,YAAM,uBAAuBA,QAAOA,OAAM,IAAG,GAAIA,OAAM,qBAAqB;IAChF;IACA,MAAM,UAAU,KAAG;AACf,YAAM,UAAcA,QAAO,GAAG;IAClC;IACA,MAAM,KAAK,OAAK;AACZ,UAAI,MAAM,cAAc,QAAW;AAC/B,cAAM,cAAcA,QAAO,KAAK;AAChC;MACJ;AACA,yBAAmBA,QAAO,MAAM,WAAW,KAAK;IACpD;IACA,MAAM,UAAU,oBAAkB;AAC9B,YAAM,QAAQA,OAAM,eAAe;AACnC,UAAI,UAAU;AAAW;AACzB,YAAM,OAAO,MAAM,MAAM,KAAI;AAC7B,UAAI,SAAS;AAAM;AACnB,UAAI,CAAC,iBAAiB,IAAI;AAAG;AAC7B,UAAI,KAAK,eAAe,oBAAoB;AACxC,uBAAeA,OAAM,WAAW;UAC5B,MAAM;UACN,UAAU;UACV,MAAM;UACN,SAAS;UACT,QAAQ;UACR,KAAKA,OAAM;SACd;AACD,YAAI;AACA,gBAAM,MAAM,MAAK;QACrB,SAAS,KAAK;AACV,yBAAeA,OAAM,WAAW;YAC5B,MAAM;YACN,UAAU;YACV,MAAM;YACN,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;YACxD,QAAQ;YACR,KAAKA,OAAM;WACd;QACL;AACA;MACJ;AACA,2BAAqBA,QAAO,IAAI;AAChC,MAAAA,OAAM,eAAe,kBAAkB,KAAK;AAC5C,qBAAeA,OAAM,WAAW;QAC5B,MAAM;QACN,UAAU;QACV,MAAM;QACN,SAAS,kDAAkD,KAAK,WAAW;QAC3E,QAAQ;QACR,KAAKA,OAAM;OACd;IACL;IACA,QAAK;AACD,aAAO,MAAUA,MAAK;IAC1B;IACA,MAAM,UAAO;AACT,YAAM,YAAY,kBAAkBA,QAAOA,OAAM,IAAG,CAAE;AACtD,cAAYA,MAAK;AACjB,YAAM;IACV;GACH;AACL;;;ACxUO,SAAS,gBAAgB,KAAuC;AACnE,QAAM,QAA6B,CAAC;AACpC,QAAM,WAAmC,CAAC;AAC1C,QAAM,SAA+B,CAAC;AACtC,QAAM,kBAAiD,CAAC;AACxD,QAAM,OAA2B,CAAC;AAClC,QAAM,cAAwC,CAAC,GAAG,IAAI,WAAW;AAEjE,aAAW,KAAK,IAAI,OAAO;AACvB,UAAM,IAAI,iBAAiB,CAAC;AAC5B,QAAI,EAAE,IAAI;AACN,YAAM,KAAK,CAAC;AAAA,IAChB,OAAO;AACH,kBAAY,KAAK;AAAA,QACb,MAAM;AAAA,QACN,UAAU;AAAA,QACV,MAAM,EAAE;AAAA,QACR,SAAS,EAAE;AAAA,QACX,QAAQ,EAAE;AAAA,QACV,KAAK,EAAE;AAAA,MACX,CAAC;AAAA,IACL;AAAA,EACJ;AACA,aAAW,KAAK,IAAI,QAAQ;AACxB,UAAM,IAAI,iBAAiB,CAAC;AAC5B,QAAI,EAAE,IAAI;AACN,aAAO,KAAK,CAAC;AAAA,IACjB,OAAO;AACH,kBAAY,KAAK;AAAA,QACb,MAAM;AAAA,QACN,UAAU;AAAA,QACV,MAAM,EAAE;AAAA,QACR,SAAS,EAAE;AAAA,QACX,QAAQ,EAAE;AAAA,QACV,KAAK,EAAE;AAAA,MACX,CAAC;AAAA,IACL;AAAA,EACJ;AACA,aAAW,aAAa,IAAI,iBAAiB;AACzC,UAAM,IAAI,iBAAiB,SAAS;AACpC,QAAI,EAAE,IAAI;AACN,sBAAgB,KAAK,SAAS;AAAA,IAClC,OAAO;AACH,kBAAY,KAAK;AAAA,QACb,MAAM;AAAA,QACN,UAAU;AAAA,QACV,MAAM,EAAE;AAAA,QACR,SAAS,EAAE;AAAA,QACX,QAAQ;AAAA,QACR,KAAK,UAAU;AAAA,MACnB,CAAC;AAAA,IACL;AAAA,EACJ;AACA,aAAW,OAAO,IAAI,MAAM;AACxB,UAAM,IAAI,iBAAiB,GAAG;AAC9B,QAAI,EAAE,IAAI;AACN,WAAK,KAAK,GAAG;AAAA,IACjB,OAAO;AACH,kBAAY,KAAK;AAAA,QACb,MAAM;AAAA,QACN,UAAU;AAAA,QACV,MAAM,EAAE;AAAA,QACR,SAAS,EAAE;AAAA,QACX,QAAQ;AAAA,QACR,KAAK,IAAI;AAAA,MACb,CAAC;AAAA,IACL;AAAA,EACJ;AACA,aAAW,KAAK,IAAI,UAAU;AAC1B,aAAS,KAAK,CAAC;AAAA,EACnB;AACA,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,IAAI;AAAA,IACb,OAAO,IAAI;AAAA,EACf;AACJ;;;AC5FO,IAAM,iBAA6B,OAAO,OAAO;AAAA,EACpD,cAAc,KAAK,OAAO;AAAA,EAC1B,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,kBAAkB;AACtB,CAAC;AAmBD,eAAsB,UAClB,IACA,OAC2D;AAC3D,QAAM,QAAQ,YAAY,IAAI;AAC9B,QAAM,SAAS,MAAM,GAAG;AACxB,QAAM,UAAU,YAAY,IAAI,IAAI;AACpC,SAAO,EAAE,QAAQ,WAAW,UAAU,QAAQ,UAAU,EAAE;AAC9D;;;ACxBA,eAAe,qBAAqB,cAAqD;AAKrF,QAAM,MAAM,sCAAsC,mBAAmB,YAAY,CAAC;AAClF,SAAQ,MAAM;AAAA;AAAA,IAA0B;AAAA;AAC5C;AAEA,SAAS,QAAQ,OAAuC;AACpD,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,QAAM,IAAK,MAAsC;AACjD,SAAO,OAAO,MAAM;AACxB;AA0BO,SAAS,iBAAiB,OAA8B;AAC3D,MAAI,SAAoC;AACxC,MAAI,SAA4B;AAEhC,QAAM,iBAAiB,WAAW,OAAO,OAAmC;AACxE,UAAM,MAAM,GAAG;AACf,QAAI,CAAC,QAAQ,GAAG,GAAG;AACf,YAAM,YAAY;AAAA,QACd,MAAM;AAAA,QACN,SAAS;AAAA,MACb,CAAC;AACD;AAAA,IACJ;AACA,QAAI,IAAI,SAAS,QAAQ;AACrB,UAAI;AACA,cAAM,MAAM,MAAM,qBAAqB,IAAI,SAAS,YAAY;AAChE,iBAAS,mBAAmB;AAAA,UACxB,UAAU,IAAI;AAAA,UACd,cAAc,IAAI;AAAA,UAClB,GAAI,IAAI,YAAY,SAAY,EAAE,SAAS,IAAI,QAAQ,IAAI,CAAC;AAAA,UAC5D,GAAI,IAAI,mBAAmB,SACrB,EAAE,gBAAgB,IAAI,eAAe,IACrC,CAAC;AAAA,QACX,CAAC;AACD,iBAAS,IAAI;AACb,cAAM,YAAY,EAAE,MAAM,SAAS,CAAC;AAAA,MACxC,SAAS,KAAK;AACV,cAAM,YAAY;AAAA,UACd,MAAM;AAAA,UACN,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QAC5D,CAAC;AAAA,MACL;AACA;AAAA,IACJ;AAEA,QAAI;AACA,cAAQ,IAAI,MAAM;AAAA,QACd,KAAK,eAAe;AAChB,cAAI,WAAW,QAAQ,WAAW,MAAM;AACpC,kBAAM,IAAI,MAAM,yBAAyB;AAAA,UAC7C;AACA,gBAAM,IAAI;AACV,gBAAM,EAAE,UAAU,IAAI,MAAM;AAAA,YACxB,MAAM,EAAE,KAAK,IAAI,KAAK;AAAA,YACtB,OAAO;AAAA,UACX;AACA,cAAI,YAAY,GAAG;AACf,kBAAM,YAAY,EAAE,MAAM,kBAAkB,YAAY,UAAU,CAAC;AAAA,UACvE;AACA;AAAA,QACJ;AAAA,QACA,KAAK,SAAS;AACV,cAAI,WAAW,MAAM;AACjB,kBAAM,IAAI,MAAM,mBAAmB;AAAA,UACvC;AACA,gBAAM,UAAU,gBAAgB,OAAO,MAAM,CAAC;AAC9C,gBAAM,YAAY;AAAA,YACd,MAAM;AAAA,YACN,OAAO,IAAI;AAAA,YACX,WAAW;AAAA,UACf,CAAC;AACD;AAAA,QACJ;AAAA,QACA,KAAK,WAAW;AACZ,gBAAM,QAAQ,QAAQ;AACtB,mBAAS;AACT,mBAAS;AACT;AAAA,QACJ;AAAA,QACA,SAAS;AACL,gBAAM,IAAI;AAAA,YACN,uBAAwB,IAAkC,IAAI;AAAA,UAClE;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,SAAS,KAAK;AACV,YAAM,YAAY;AAAA,QACd,MAAM;AAAA,QACN,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC5D,CAAC;AAAA,IACL;AAAA,EACJ,CAAC;AACL;;;ACnIA,iBAAiB,IAAkC;",
|
|
6
|
+
"names": ["snapshot", "fallback", "CACHE", "getCtx", "group", "state", "sentinel", "clampUnit", "clampByte", "path", "text", "color", "state", "alert", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "text", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "OUTSIDE_CTX_MESSAGE", "state", "table", "table", "OUTSIDE_CTX_MESSAGE", "hline", "isPlainObject", "snapshotMeta", "OUTSIDE_CTX_MESSAGE", "plot", "state", "state", "getCtx", "getCtx", "initSlot", "emit", "plusDi", "minusDi", "getCtx", "initSlot", "getCtx", "initSlot", "closeValue", "tickValue", "count", "edges", "vol", "lowerBoundTime", "snapshot", "getCtx", "initSlot", "snapshot", "getCtx", "initSlot", "next", "getCtx", "initSlot", "viewForOffset", "tickValue", "closeValue", "getCtx", "initSlot", "getCtx", "initSlot", "closeStep", "getCtx", "initSlot", "getCtx", "initSlot", "viewForOffset", "trueRange", "closeValue", "tickValue", "getCtx", "initSlot", "closeValue", "tickValue", "getCtx", "initSlot", "viewForOffset", "closeValue", "tickValue", "getCtx", "initSlot", "resultForOffset", "DEFAULT_MULTIPLIER", "getCtx", "initSlot", "DEFAULT_MULTIPLIER", "getCtx", "initSlot", "getCtx", "initSlot", "getCtx", "initSlot", "closeValue", "center", "md", "tickValue", "getCtx", "initSlot", "viewForOffset", "getCtx", "initSlot", "viewForOffset", "getCtx", "initSlot", "closeValue", "tickValue", "getCtx", "initSlot", "closeValue", "tickValue", "DEFAULT_LENGTH", "DEFAULT_MULTIPLIER", "DEFAULT_SMOOTHING", "getCtx", "initSlot", "DEFAULT_LENGTH", "DEFAULT_MULTIPLIER", "getCtx", "initSlot", "compute", "getCtx", "initSlot", "closeValue", "tickValue", "getCtx", "initSlot", "trueRange", "closeValue", "tickValue", "getCtx", "initSlot", "mfvAt", "emit", "vol", "getCtx", "initSlot", "closeValue", "diff", "tickValue", "getCtx", "initSlot", "viewForOffset", "closeValue", "diff", "tickValue", "gain", "loss", "provGain", "provLoss", "getCtx", "initSlot", "viewForOffset", "diff", "roc", "getCtx", "initSlot", "closeValue", "tickValue", "getCtx", "initSlot", "viewForOffset", "getCtx", "initSlot", "viewForOffset", "detect", "getCtx", "initSlot", "getCtx", "initSlot", "resultForOffset", "getCtx", "initSlot", "getCtx", "initSlot", "viewForOffset", "getCtx", "initSlot", "compute", "getCtx", "initSlot", "weightedFromWindow", "closeValue", "tickValue", "DEFAULT_LENGTH", "getCtx", "initSlot", "getCtx", "initSlot", "viewForOffset", "safeVol", "emit", "midpoint", "getCtx", "initSlot", "step", "getCtx", "initSlot", "resultForOffset", "collectBars", "snapshot", "getCtx", "initSlot", "viewForOffset", "closeValue", "tickValue", "getCtx", "diff", "getCtx", "initSlot", "resultForOffset", "DEFAULT_LENGTH", "DEFAULT_FAST", "DEFAULT_SLOW", "getCtx", "initSlot", "change", "DEFAULT_LENGTH", "DEFAULT_MULTIPLIER", "DEFAULT_MA_TYPE", "getCtx", "initSlot", "dispatchMa", "DEFAULT_FAST_LENGTH", "DEFAULT_SLOW_LENGTH", "getCtx", "initSlot", "step", "DEFAULT_ROC1_LENGTH", "DEFAULT_ROC2_LENGTH", "DEFAULT_SIGNAL_LENGTH", "getCtx", "pctRoc", "getCtx", "initSlot", "closeValue", "tickValue", "DEFAULT_MA_TYPE", "getCtx", "dispatchMa", "getCtx", "DEFAULT_MA_TYPE", "dispatchMa", "DEFAULT_FAST", "DEFAULT_SLOW", "getCtx", "initSlot", "resultForOffset", "getCtx", "initSlot", "viewForOffset", "closeValue", "tickValue", "getCtx", "initSlot", "compute", "getCtx", "initSlot", "closeValue", "tickValue", "getCtx", "initSlot", "viewForOffset", "getCtx", "getCtx", "initSlot", "viewForOffset", "fold", "next", "getCtx", "initSlot", "viewForOffset", "safeVol", "fold", "next", "getCtx", "initSlot", "signOfDelta", "fold", "next", "getCtx", "initSlot", "MS_PER_DAY", "getCtx", "initSlot", "closeStep", "tickStep", "DEFAULT_SIGNAL", "state", "getCtx", "resultForOffset", "stage1Value", "scaled", "DEFAULT_FAST", "DEFAULT_SLOW", "DEFAULT_SIGNAL", "getCtx", "initSlot", "resultForOffset", "getCtx", "initSlot", "snapshot", "ep", "af", "closeStep", "step", "tickStep", "SEED_VALUE", "getCtx", "initSlot", "viewForOffset", "safeVol", "fold", "next", "DEFAULT_FAST", "DEFAULT_SLOW", "DEFAULT_SIGNAL", "getCtx", "initSlot", "resultForOffset", "getCtx", "initSlot", "viewForOffset", "fold", "next", "getCtx", "initSlot", "closeValue", "tickValue", "DEFAULT_LENGTH", "getCtx", "initSlot", "denominator", "getCtx", "initSlot", "viewForOffset", "windowStdDev", "diff", "getCtx", "initSlot", "resultForOffset", "collectBars", "snapshot", "DEFAULT_FIRST", "DEFAULT_SECOND", "getCtx", "resultForOffset", "DEFAULT_K_LENGTH", "DEFAULT_D_LENGTH", "getCtx", "DEFAULT_RSI_LENGTH", "DEFAULT_K_SMOOTHING", "getCtx", "DEFAULT_LENGTH", "DEFAULT_MULTIPLIER", "TREND_UP", "TREND_DOWN", "getCtx", "initSlot", "snapshot", "recurrenceStep", "line", "closeStep", "step", "tickStep", "getCtx", "initSlot", "getCtx", "initSlot", "viewForOffset", "closeStep", "tickStep", "DEFAULT_SIGNAL", "getCtx", "initSlot", "resultForOffset", "DEFAULT_FIRST", "DEFAULT_SECOND", "DEFAULT_SIGNAL", "getCtx", "resultForOffset", "getCtx", "initSlot", "closeValue", "tickValue", "getCtx", "initSlot", "closeValue", "tickValue", "getCtx", "initSlot", "closeValue", "tickValue", "getCtx", "initSlot", "resultForOffset", "collectBars", "snapshot", "getCtx", "initSlot", "DEFAULT_LENGTH", "DEFAULT_MULTIPLIER", "TREND_UP", "TREND_DOWN", "getCtx", "initSlot", "snapshot", "recurrenceStep", "next", "closeStep", "step", "tickStep", "getCtx", "trueRange", "initSlot", "resultForOffset", "closeStep", "tickStep", "DEFAULT_SOURCE", "MS_PER_DAY", "getCtx", "initSlot", "readSource", "fold", "valueFromCum", "next", "getCtx", "initSlot", "closeValue", "vol", "tickValue", "DEFAULT_LENGTH", "getCtx", "initSlot", "getCtx", "TREND_UP", "TREND_DOWN", "TREND_UNKNOWN", "getCtx", "initSlot", "snapshot", "recurrenceStep", "closeStep", "step", "tickStep", "ta", "state", "ta", "plot", "hline", "alert", "state", "state", "state", "isJsonValue", "isRecord", "snapshot", "snapshot", "state", "fallback", "fallback", "state"]
|
|
7
|
+
}
|