aliencharts 0.1.4 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +117 -95
- package/THIRD_PARTY_NOTICES.md +7 -0
- package/dist/aliencharts.css +1 -1
- package/dist/index.js +1 -4723
- package/dist/index.js.map +4 -4
- package/dist/react.js +2533 -0
- package/dist/react.js.map +7 -0
- package/dist/vanilla.js +2475 -0
- package/dist/vanilla.js.map +7 -0
- package/index.d.ts +3 -9
- package/package.json +26 -10
- package/react.d.ts +22 -0
- package/vanilla.d.ts +17 -0
- package/dist/index.cjs +0 -5005
- package/dist/index.cjs.map +0 -7
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/react/ChartGridAdapter.jsx", "../src/icons.js", "../src/core/drawingUtils.js", "../src/core/lodSeries.js", "../src/core/chartRenderer.js", "../src/vanilla/createChartGrid.js", "../src/core/mockData.js"],
|
|
4
|
+
"sourcesContent": ["import React, {\n forwardRef,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n} from \"react\";\nimport { createChartGrid } from \"../vanilla/createChartGrid.js\";\n\nexport const ChartGrid = forwardRef(function ChartGrid({\n className = \"\",\n dataRevision = 0,\n ...options\n}, ref) {\n const hostRef = useRef(null);\n const controllerRef = useRef(null);\n const previousOptionsRef = useRef(null);\n const previousRevisionRef = useRef(dataRevision);\n\n useLayoutEffect(() => {\n const controller = createChartGrid(hostRef.current, options);\n controllerRef.current = controller;\n previousOptionsRef.current = options;\n return () => {\n controller.destroy();\n controllerRef.current = null;\n previousOptionsRef.current = null;\n };\n }, []);\n\n useLayoutEffect(() => {\n const controller = controllerRef.current;\n const previous = previousOptionsRef.current;\n if (!controller || !previous) return;\n const changed = {};\n let hasChanges = false;\n const keys = new Set([...Object.keys(previous), ...Object.keys(options)]);\n keys.forEach((key) => {\n if (Object.is(previous[key], options[key])) return;\n changed[key] = options[key];\n hasChanges = true;\n });\n if (hasChanges) controller.setOptions(changed);\n previousOptionsRef.current = options;\n });\n\n useLayoutEffect(() => {\n if (previousRevisionRef.current !== dataRevision) {\n previousRevisionRef.current = dataRevision;\n controllerRef.current?.invalidate();\n }\n }, [dataRevision]);\n\n useImperativeHandle(ref, () => ({\n invalidate: () => controllerRef.current?.invalidate(),\n jumpToLatest: (chartId) => controllerRef.current?.jumpToLatest(chartId),\n scrollToTop: (scrollOptions) => controllerRef.current?.scrollToTop(scrollOptions),\n }), []);\n\n return <div ref={hostRef} className={className} />;\n});\n", "// Icons downloaded from https://phosphoricons.com/\nconst icons = {\n arrowLineRight: '<line x1=\"32\" y1=\"128\" x2=\"176\" y2=\"128\"/><polyline points=\"104 56 176 128 104 200\"/><line x1=\"216\" y1=\"40\" x2=\"216\" y2=\"216\"/>',\n pushPinSimple: '<path d=\"M224,176a8,8,0,0,1-8,8H136v56a8,8,0,0,1-16,0V184H40a8,8,0,0,1,0-16h9.29L70.46,48H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16h-6.46l21.17,120H216A8,8,0,0,1,224,176Z\"/>',\n arrowCounterClockwise: '<polyline points=\"24 56 24 104 72 104\"/><path d=\"M67.59,192A88,88,0,1,0,65.77,65.77L24,104\"/>',\n arrowsIn: '<polyline points=\"192 104 152 104 152 64\"/><line x1=\"208\" y1=\"48\" x2=\"152\" y2=\"104\"/><polyline points=\"64 152 104 152 104 192\"/><line x1=\"48\" y1=\"208\" x2=\"104\" y2=\"152\"/><polyline points=\"152 192 152 152 192 152\"/><line x1=\"208\" y1=\"208\" x2=\"152\" y2=\"152\"/><polyline points=\"104 64 104 104 64 104\"/><line x1=\"48\" y1=\"48\" x2=\"104\" y2=\"104\"/>',\n arrowsOut: '<polyline points=\"160 48 208 48 208 96\"/><line x1=\"152\" y1=\"104\" x2=\"208\" y2=\"48\"/><polyline points=\"96 208 48 208 48 160\"/><line x1=\"104\" y1=\"152\" x2=\"48\" y2=\"208\"/><polyline points=\"208 160 208 208 160 208\"/><line x1=\"152\" y1=\"152\" x2=\"208\" y2=\"208\"/><polyline points=\"48 96 48 48 96 48\"/><line x1=\"104\" y1=\"104\" x2=\"48\" y2=\"48\"/>',\n broom: '<path d=\"M112,224a95.2,95.2,0,0,1-29-48\"/><path d=\"M192,152c0,31.67,13.31,59,40,72H61A103.65,103.65,0,0,1,32,152c0-28.21,11.23-50.89,29.47-69.64a8,8,0,0,1,8.67-1.81L95.52,90.83a16,16,0,0,0,20.82-9l21-53.11c4.15-10,15.47-15.32,25.63-11.53a20,20,0,0,1,11.51,26.4L153.13,96.69a16,16,0,0,0,8.93,20.76L187,127.29a8,8,0,0,1,5,7.43Z\"/><line x1=\"40.54\" y1=\"112.21\" x2=\"194.26\" y2=\"173.7\"/>',\n waveSine: '<path d=\"M24,128c104-221.7,104,221.7,208,0\"/>',\n magnifyingGlassPlus: '<line x1=\"80\" y1=\"112\" x2=\"144\" y2=\"112\"/><circle cx=\"112\" cy=\"112\" r=\"80\"/><line x1=\"168.57\" y1=\"168.57\" x2=\"224\" y2=\"224\"/><line x1=\"112\" y1=\"80\" x2=\"112\" y2=\"144\"/>',\n mapPin: '<circle cx=\"128\" cy=\"104\" r=\"32\"/><path d=\"M208,104c0,72-80,128-80,128S48,176,48,104a80,80,0,0,1,160,0Z\"/>',\n minus: '<line x1=\"40\" y1=\"128\" x2=\"216\" y2=\"128\"/>',\n eye: '<path d=\"M128,56C48,56,16,128,16,128s32,72,112,72,112-72,112-72S208,56,128,56Z\"/><circle cx=\"128\" cy=\"128\" r=\"32\"/>',\n};\n\nconst filledIcons = new Set([\"pushPinSimple\"]);\n\nexport const iconSvg = (name, { size = 16, className = \"\" } = {}) => {\n const body = icons[name];\n if (!body) throw new Error(`Unknown AlienCharts icon: ${name}`);\n const paint = filledIcons.has(name)\n ? 'fill=\"currentColor\"'\n : 'fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"24\"';\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" width=\"${size}\" height=\"${size}\" class=\"${className}\" aria-hidden=\"true\" ${paint}>${body}</svg>`;\n};\n\nexport const createIconElement = (documentRef, name, options) => {\n const template = documentRef.createElement(\"template\");\n template.innerHTML = iconSvg(name, options).trim();\n return template.content.firstElementChild;\n};\n", "export const DEFAULT_DRAWING_COLOR = \"#60a5fa\";\nexport const DRAWING_HIT_DISTANCE = 8;\nexport const DRAWING_HANDLE_RADIUS = 4;\nexport const DRAWING_HANDLE_HIT_DISTANCE = 10;\nexport const PIN_HIT_DISTANCE = 14;\nexport const DRAWING_TOOLS = new Set([\"trendline\", \"hline\", \"vline\", \"pin\"]);\n\nexport const getDrawingStyle = (drawing) => ({\n color: drawing?.style?.color || DEFAULT_DRAWING_COLOR,\n lineWidth: Number.isFinite(drawing?.style?.lineWidth)\n ? drawing.style.lineWidth\n : 2,\n dashPattern: Array.isArray(drawing?.style?.dashPattern)\n ? drawing.style.dashPattern\n : [],\n extendLeft: Boolean(drawing?.style?.extendLeft),\n extendRight: drawing?.style?.extendRight !== false,\n text: typeof drawing?.style?.text === \"string\" ? drawing.style.text : \"\",\n});\n\nexport const getDrawingsForChart = (drawings, chartId) =>\n Array.isArray(drawings)\n ? drawings.filter((drawing) => drawing?.chartId === chartId)\n : [];\n\nexport const getDefaultDrawingStyle = (type) => ({\n color: DEFAULT_DRAWING_COLOR,\n lineWidth: 2,\n dashPattern: [],\n extendLeft: false,\n extendRight: type !== \"vline\",\n text: \"\",\n});\n\nexport const createDrawing = ({\n chartId,\n type,\n start,\n end,\n createDrawingId,\n}) => {\n const id =\n createDrawingId?.({ chartId, type }) ||\n `${chartId}-drawing-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n return {\n id,\n chartId,\n type,\n start,\n end,\n createdAt: Date.now(),\n style: getDefaultDrawingStyle(type),\n };\n};\n\nexport const createDraftDrawing = ({ chartId, type, start, end }) => ({\n id: \"__draft__\",\n chartId,\n type,\n start,\n end,\n createdAt: Date.now(),\n style: getDefaultDrawingStyle(type),\n});\n\nconst extendRayToPlotBoundary = (origin, through, plot) => {\n const dx = through.x - origin.x;\n const dy = through.y - origin.y;\n if (Math.abs(dx) <= 0.000001 && Math.abs(dy) <= 0.000001) return through;\n\n const candidates = [];\n if (dx > 0.000001) candidates.push((plot.x + plot.width - origin.x) / dx);\n else if (dx < -0.000001) candidates.push((plot.x - origin.x) / dx);\n if (dy > 0.000001) candidates.push((plot.y + plot.height - origin.y) / dy);\n else if (dy < -0.000001) candidates.push((plot.y - origin.y) / dy);\n\n const boundaryScale = Math.min(\n ...candidates.filter((scale) => Number.isFinite(scale) && scale >= 0),\n );\n const scale = Number.isFinite(boundaryScale) ? Math.max(1, boundaryScale) : 1;\n return {\n x: origin.x + dx * scale,\n y: origin.y + dy * scale,\n };\n};\n\nexport const getDrawingGeometry = ({ drawing, layout, projectPoint }) => {\n if (!drawing?.start || !drawing?.end) return null;\n const start = projectPoint(drawing.start, layout);\n const end = projectPoint(drawing.end, layout);\n const style = getDrawingStyle(drawing);\n let lineStart = start;\n let lineEnd = end;\n\n if (drawing.type === \"pin\") {\n return { start, end: start, lineStart: start, lineEnd: start, style };\n }\n\n if (drawing.type === \"hline\") {\n const lineEndX =\n Math.abs(end.x - start.x) > 0.000001 ? end.x : layout.plot.x + layout.plot.width;\n lineStart = {\n x: style.extendRight ? layout.plot.x : start.x,\n y: start.y,\n };\n lineEnd = {\n x: style.extendRight ? layout.plot.x + layout.plot.width : lineEndX,\n y: start.y,\n };\n } else if (drawing.type === \"vline\") {\n lineStart = {\n x: start.x,\n y: layout.plot.y,\n };\n lineEnd = {\n x: start.x,\n y: layout.plot.y + layout.plot.height,\n };\n } else if (drawing.type === \"trendline\") {\n if (style.extendLeft) lineStart = extendRayToPlotBoundary(end, start, layout.plot);\n if (style.extendRight) lineEnd = extendRayToPlotBoundary(start, end, layout.plot);\n }\n\n return { start, end, lineStart, lineEnd, style };\n};\n\nexport const distanceToSegment = (point, start, end) => {\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n if (dx === 0 && dy === 0) {\n return Math.hypot(point.x - start.x, point.y - start.y);\n }\n const t = Math.max(\n 0,\n Math.min(\n 1,\n ((point.x - start.x) * dx + (point.y - start.y) * dy) / (dx * dx + dy * dy),\n ),\n );\n return Math.hypot(point.x - (start.x + t * dx), point.y - (start.y + t * dy));\n};\n\nexport const hitTestDrawing = ({ point, drawing, layout, projectPoint }) => {\n const geometry = getDrawingGeometry({\n drawing,\n layout,\n projectPoint,\n });\n if (!geometry) return null;\n if (\n drawing.type !== \"pin\" &&\n Math.hypot(point.x - geometry.start.x, point.y - geometry.start.y) <=\n DRAWING_HANDLE_HIT_DISTANCE\n ) {\n return { drawing, endpoint: \"start\" };\n }\n if (\n drawing.type === \"pin\" &&\n Math.hypot(point.x - geometry.start.x, point.y - geometry.start.y) <=\n PIN_HIT_DISTANCE\n ) {\n return { drawing, endpoint: \"move\" };\n }\n if (\n drawing.type === \"trendline\" &&\n Math.hypot(point.x - geometry.end.x, point.y - geometry.end.y) <=\n DRAWING_HANDLE_HIT_DISTANCE\n ) {\n return { drawing, endpoint: \"end\" };\n }\n const distance = distanceToSegment(point, geometry.lineStart, geometry.lineEnd);\n return distance <= DRAWING_HIT_DISTANCE ? { drawing, endpoint: null } : null;\n};\n\nexport const updateDrawingById = (drawings, drawingId, updater) =>\n (Array.isArray(drawings) ? drawings : []).map((drawing) =>\n drawing?.id === drawingId ? updater(drawing) : drawing,\n );\n\nexport const removeDrawingById = (drawings, drawingId) =>\n (Array.isArray(drawings) ? drawings : []).filter(\n (drawing) => drawing?.id !== drawingId,\n );\n", "const DEFAULT_MAX_LEVELS = 18;\n\nconst toTypedArray = (value, Type) => {\n if (value instanceof Type) return value;\n if (ArrayBuffer.isView(value)) return new Type(value);\n if (Array.isArray(value)) return new Type(value);\n return new Type(0);\n};\n\nconst lowerBound = (array, value) => {\n let lo = 0;\n let hi = array.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (array[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\nconst upperBound = (array, value) => {\n let lo = 0;\n let hi = array.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (array[mid] <= value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\nconst pushUniqueSorted = (indices, index) => {\n if (index < 0) return;\n if (indices.includes(index)) return;\n indices.push(index);\n};\n\nconst buildLod = (rawX, rawY, bucketSize, startIndex = 0, endIndex = rawX.length) => {\n if (bucketSize <= 1 || rawX.length <= bucketSize) {\n return { x: rawX, y: rawY, bucketSize: 1 };\n }\n\n const alignedStart = Math.max(0, Math.floor(startIndex / bucketSize) * bucketSize);\n const alignedEnd = Math.min(rawX.length, endIndex);\n const estimated = Math.ceil((alignedEnd - alignedStart) / bucketSize) * 4;\n const x = new Float64Array(estimated);\n const y = new Float32Array(estimated);\n let out = 0;\n\n for (let start = alignedStart; start < alignedEnd; start += bucketSize) {\n const end = Math.min(alignedEnd, start + bucketSize);\n let minIndex = start;\n let maxIndex = start;\n for (let i = start + 1; i < end; i += 1) {\n if (rawY[i] < rawY[minIndex]) minIndex = i;\n if (rawY[i] > rawY[maxIndex]) maxIndex = i;\n }\n\n const indices = [];\n pushUniqueSorted(indices, start);\n pushUniqueSorted(indices, minIndex);\n pushUniqueSorted(indices, maxIndex);\n pushUniqueSorted(indices, end - 1);\n indices.sort((a, b) => a - b);\n\n for (let i = 0; i < indices.length; i += 1) {\n const sourceIndex = indices[i];\n x[out] = rawX[sourceIndex];\n y[out] = rawY[sourceIndex];\n out += 1;\n }\n }\n\n return {\n x: x.subarray(0, out),\n y: y.subarray(0, out),\n bucketSize,\n };\n};\n\nconst concatTyped = (Type, left, right) => {\n if (!left?.length) return right;\n if (!right?.length) return left;\n const out = new Type(left.length + right.length);\n out.set(left, 0);\n out.set(right, left.length);\n return out;\n};\n\nexport class LineSeries {\n constructor({ id, name, color, x, y, maxLevels = DEFAULT_MAX_LEVELS }) {\n this.id = id;\n this.name = name || id;\n this.color = color || \"#38bdf8\";\n this.maxLevels = maxLevels;\n const initialX = toTypedArray(x, Float64Array);\n const initialY = toTypedArray(y, Float32Array);\n this._length = Math.min(initialX.length, initialY.length);\n const capacity = Math.max(1, this._length);\n this.rawX = new Float64Array(capacity);\n this.rawY = new Float32Array(capacity);\n this.rawX.set(initialX.subarray(0, this._length));\n this.rawY.set(initialY.subarray(0, this._length));\n this.levels = [];\n this.rebuildLevels();\n }\n\n get length() {\n return this._length;\n }\n\n append(xValues, yValues) {\n const nextX = toTypedArray(xValues, Float64Array);\n const nextY = toTypedArray(yValues, Float32Array);\n const appendLength = Math.min(nextX.length, nextY.length);\n if (appendLength === 0) return;\n\n const currentLength = this.length;\n this.ensureRawCapacity(currentLength + appendLength);\n this.rawX.set(nextX.subarray(0, appendLength), currentLength);\n this.rawY.set(nextY.subarray(0, appendLength), currentLength);\n this._length = currentLength + appendLength;\n this.markLevelsDirty(currentLength);\n }\n\n rebuildLevels() {\n const rawX = this.rawX.subarray(0, this.length);\n const rawY = this.rawY.subarray(0, this.length);\n this.levels = [{ x: rawX, y: rawY, bucketSize: 1 }];\n\n let bucketSize = 4;\n while (\n this.levels.length < this.maxLevels &&\n bucketSize < Math.max(8, rawX.length)\n ) {\n this.levels.push(buildLod(rawX, rawY, bucketSize));\n bucketSize *= 4;\n }\n }\n\n ensureRawCapacity(requiredLength) {\n if (requiredLength <= this.rawX.length && requiredLength <= this.rawY.length) {\n return;\n }\n const nextCapacity = Math.max(requiredLength, Math.ceil(this.rawX.length * 1.5));\n const rawX = new Float64Array(nextCapacity);\n const rawY = new Float32Array(nextCapacity);\n rawX.set(this.rawX.subarray(0, this.length));\n rawY.set(this.rawY.subarray(0, this.length));\n this.rawX = rawX;\n this.rawY = rawY;\n }\n\n markLevelsDirty(previousLength) {\n const rawX = this.rawX.subarray(0, this.length);\n const rawY = this.rawY.subarray(0, this.length);\n this.levels[0] = { x: rawX, y: rawY, bucketSize: 1 };\n\n let bucketSize =\n this.levels.length > 0\n ? this.levels[this.levels.length - 1].bucketSize * 4\n : 4;\n while (\n this.levels.length < this.maxLevels &&\n bucketSize < Math.max(8, rawX.length)\n ) {\n this.levels.push(buildLod(rawX, rawY, bucketSize));\n bucketSize *= 4;\n }\n\n for (let i = 1; i < this.levels.length; i += 1) {\n const level = this.levels[i];\n const dirtyRawStart =\n Math.floor(previousLength / level.bucketSize) * level.bucketSize;\n level.dirtyFrom = Math.min(level.dirtyFrom ?? dirtyRawStart, dirtyRawStart);\n }\n }\n\n ensureLevel(index) {\n const level = this.levels[index];\n if (!level || index === 0 || level.dirtyFrom == null) return level;\n\n const rawX = this.rawX.subarray(0, this.length);\n const rawY = this.rawY.subarray(0, this.length);\n const dirtyRawStart =\n Math.floor(level.dirtyFrom / level.bucketSize) * level.bucketSize;\n const cutoffX = rawX[dirtyRawStart] ?? rawX[0] ?? 0;\n const keepCount = lowerBound(level.x, cutoffX);\n const tail = buildLod(rawX, rawY, level.bucketSize, dirtyRawStart, rawX.length);\n this.levels[index] = {\n x: concatTyped(Float64Array, level.x.subarray(0, keepCount), tail.x),\n y: concatTyped(Float32Array, level.y.subarray(0, keepCount), tail.y),\n bucketSize: level.bucketSize,\n };\n return this.levels[index];\n }\n\n selectLevel(xMin, xMax, pixelWidth, targetPointsPerPixel = 2.5) {\n const rawX = this.levels[0].x;\n if (rawX.length === 0) return this.levels[0];\n\n const from = lowerBound(rawX, xMin);\n const to = upperBound(rawX, xMax);\n const visibleRawPoints = Math.max(0, to - from);\n const targetPoints = Math.max(32, pixelWidth * targetPointsPerPixel);\n const desiredBucket = Math.max(1, visibleRawPoints / targetPoints);\n\n let selectedIndex = 0;\n for (let i = 1; i < this.levels.length; i += 1) {\n if (this.levels[i].bucketSize <= desiredBucket) {\n selectedIndex = i;\n } else {\n break;\n }\n }\n return this.ensureLevel(selectedIndex);\n }\n\n getVisiblePoints(xMin, xMax, pixelWidth) {\n const level = this.selectLevel(xMin, xMax, pixelWidth);\n const start = Math.max(0, lowerBound(level.x, xMin) - 1);\n const end = Math.min(level.x.length, upperBound(level.x, xMax) + 1);\n return {\n x: level.x.subarray(start, end),\n y: level.y.subarray(start, end),\n bucketSize: level.bucketSize,\n pointCount: Math.max(0, end - start),\n };\n }\n}\n\nexport const createSeries = (options) => new LineSeries(options);\n", "import { createSeries } from \"./lodSeries.js\";\n\nconst CHART_HEIGHT = 360;\nconst RIGHT_AXIS_WIDTH = 58;\nconst PLOT_PADDING = {\n left: 38,\n right: RIGHT_AXIS_WIDTH,\n top: 34,\n bottom: 28,\n};\nconst Y_SCALE_MIN = 0.05;\nconst Y_SCALE_MAX = 40;\nconst Y_AXIS_TICK_COUNT = 5;\nconst X_AXIS_TICK_COUNT = 5;\nconst X_SCALE_MIN_SPAN = 10;\nconst X_SCALE_MAX_SPAN = 1000000000;\nconst JUMP_LATEST_RIGHT_PADDING_RATIO = 0.1;\nconst INITIAL_GPU_VERTEX_CAPACITY = 4096;\nconst AA_VERTEX_FLOAT_STRIDE = 6;\nconst AA_LINE_WIDTH_PX = 1.5;\nconst AA_EDGE_WIDTH_PX = 1;\nconst DASH_LENGTH_PX = 7;\nconst DASH_GAP_PX = 5;\nconst DEFAULT_GRID_X_SPACING = 80;\nconst DEFAULT_GRID_Y_SPACING = 48;\nconst DEFAULT_CHART_BACKGROUND = \"#f5f9ff\";\nconst EMPTY_ARRAY = [];\nconst EMPTY_OBJECT = {};\n\nconst hexToRgb = (color) => {\n const value = String(color || \"#38bdf8\").replace(\"#\", \"\");\n const normalized =\n value.length === 3\n ? value\n .split(\"\")\n .map((char) => char + char)\n .join(\"\")\n : value.padEnd(6, \"0\").slice(0, 6);\n const number = Number.parseInt(normalized, 16);\n return [\n ((number >> 16) & 255) / 255,\n ((number >> 8) & 255) / 255,\n (number & 255) / 255,\n ];\n};\n\nconst getReadableTextColor = (backgroundColor) => {\n const [r, g, b] = hexToRgb(backgroundColor);\n const toLinear = (value) =>\n value <= 0.03928 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;\n const luminance =\n 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n return luminance > 0.45 ? \"#111827\" : \"#ffffff\";\n};\n\nconst getSeriesLabelTextColor = (series) => {\n if (series.__labelTextColorFor !== series.color) {\n series.__labelTextColorFor = series.color;\n series.__labelTextColor = getReadableTextColor(series.color);\n }\n return series.__labelTextColor;\n};\n\nconst createProgram = (gl) => {\n const vertexSource = `#version 300 es\n in vec2 a_xy;\n uniform vec2 u_resolution;\n uniform vec4 u_rect;\n uniform vec2 u_xRange;\n uniform vec2 u_yRange;\n\n void main() {\n float xDenom = max(0.000000000001, abs(u_xRange.y - u_xRange.x));\n float yDenom = max(0.000000000001, abs(u_yRange.y - u_yRange.x));\n float nx = (a_xy.x - u_xRange.x) / xDenom;\n float ny = (a_xy.y - u_yRange.x) / yDenom;\n float px = u_rect.x + nx * u_rect.z;\n float py = u_rect.y + (1.0 - ny) * u_rect.w;\n vec2 zeroToOne = vec2(px, py) / u_resolution;\n vec2 clip = zeroToOne * 2.0 - 1.0;\n gl_Position = vec4(clip.x, -clip.y, 0.0, 1.0);\n }\n `;\n const fragmentSource = `#version 300 es\n precision highp float;\n uniform vec3 u_color;\n out vec4 outColor;\n\n void main() {\n outColor = vec4(u_color, 1.0);\n }\n `;\n\n const compile = (type, source) => {\n const shader = gl.createShader(type);\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n throw new Error(gl.getShaderInfoLog(shader) || \"Shader compile failed\");\n }\n return shader;\n };\n\n const program = gl.createProgram();\n gl.attachShader(program, compile(gl.VERTEX_SHADER, vertexSource));\n gl.attachShader(program, compile(gl.FRAGMENT_SHADER, fragmentSource));\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new Error(gl.getProgramInfoLog(program) || \"Program link failed\");\n }\n return program;\n};\n\nconst createAntialiasProgram = (gl) => {\n const vertexSource = `#version 300 es\n in vec2 a_start;\n in vec2 a_end;\n in float a_side;\n in float a_along;\n uniform vec2 u_resolution;\n uniform vec4 u_rect;\n uniform vec2 u_xRange;\n uniform vec2 u_yRange;\n uniform float u_lineHalfWidth;\n uniform float u_edgeWidth;\n out float v_side;\n\n vec2 toPixel(vec2 value) {\n float xDenom = max(0.000000000001, abs(u_xRange.y - u_xRange.x));\n float yDenom = max(0.000000000001, abs(u_yRange.y - u_yRange.x));\n float nx = (value.x - u_xRange.x) / xDenom;\n float ny = (value.y - u_yRange.x) / yDenom;\n return vec2(\n u_rect.x + nx * u_rect.z,\n u_rect.y + (1.0 - ny) * u_rect.w\n );\n }\n\n void main() {\n vec2 startPx = toPixel(a_start);\n vec2 endPx = toPixel(a_end);\n vec2 delta = endPx - startPx;\n float segmentLength = max(0.000001, length(delta));\n vec2 direction = delta / segmentLength;\n vec2 normal = vec2(-direction.y, direction.x);\n float expand = u_lineHalfWidth + u_edgeWidth;\n float cap = min(expand, segmentLength * 0.5);\n vec2 px = mix(startPx, endPx, a_along)\n + direction * ((a_along * 2.0 - 1.0) * cap)\n + normal * a_side * expand;\n vec2 zeroToOne = px / u_resolution;\n vec2 clip = zeroToOne * 2.0 - 1.0;\n v_side = a_side;\n gl_Position = vec4(clip.x, -clip.y, 0.0, 1.0);\n }\n `;\n const fragmentSource = `#version 300 es\n precision highp float;\n uniform vec3 u_color;\n uniform float u_lineHalfWidth;\n uniform float u_edgeWidth;\n in float v_side;\n out vec4 outColor;\n\n void main() {\n float expand = u_lineHalfWidth + u_edgeWidth;\n float distanceFromCenter = abs(v_side) * expand;\n float alpha = 1.0 - smoothstep(u_lineHalfWidth, expand, distanceFromCenter);\n outColor = vec4(u_color, alpha);\n }\n `;\n\n const compile = (type, source) => {\n const shader = gl.createShader(type);\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n throw new Error(gl.getShaderInfoLog(shader) || \"Shader compile failed\");\n }\n return shader;\n };\n\n const program = gl.createProgram();\n gl.attachShader(program, compile(gl.VERTEX_SHADER, vertexSource));\n gl.attachShader(program, compile(gl.FRAGMENT_SHADER, fragmentSource));\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new Error(gl.getProgramInfoLog(program) || \"Program link failed\");\n }\n return program;\n};\n\nconst createSeriesBufferCache = () => new Map();\n\nconst getNextVertexCapacity = (currentCapacity, requiredCapacity) => {\n let nextCapacity = Math.max(\n INITIAL_GPU_VERTEX_CAPACITY,\n currentCapacity || 0,\n );\n while (nextCapacity < requiredCapacity) {\n nextCapacity *= 2;\n }\n return nextCapacity;\n};\n\nconst getSeriesBuffer = (gl, cache, seriesId, pointCount) => {\n const requiredVertexFloats = pointCount * 2;\n let entry = cache.get(seriesId);\n if (!entry) {\n entry = {\n buffer: gl.createBuffer(),\n gpuCapacity: 0,\n vertices: new Float32Array(\n getNextVertexCapacity(0, requiredVertexFloats),\n ),\n };\n cache.set(seriesId, entry);\n }\n\n if (entry.vertices.length < requiredVertexFloats) {\n entry.vertices = new Float32Array(\n getNextVertexCapacity(entry.vertices.length, requiredVertexFloats),\n );\n }\n\n if (entry.gpuCapacity < entry.vertices.length) {\n entry.gpuCapacity = entry.vertices.length;\n gl.bindBuffer(gl.ARRAY_BUFFER, entry.buffer);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n entry.gpuCapacity * Float32Array.BYTES_PER_ELEMENT,\n gl.DYNAMIC_DRAW,\n );\n }\n\n return entry;\n};\n\nconst getAntialiasSeriesBuffer = (gl, cache, seriesId, pointCount) => {\n const segmentCount = Math.max(0, pointCount - 1);\n const requiredVertexFloats = segmentCount * 6 * AA_VERTEX_FLOAT_STRIDE;\n let entry = cache.get(seriesId);\n if (!entry) {\n entry = {\n buffer: gl.createBuffer(),\n gpuCapacity: 0,\n vertices: new Float32Array(\n getNextVertexCapacity(0, requiredVertexFloats),\n ),\n };\n cache.set(seriesId, entry);\n }\n\n if (entry.vertices.length < requiredVertexFloats) {\n entry.vertices = new Float32Array(\n getNextVertexCapacity(entry.vertices.length, requiredVertexFloats),\n );\n }\n\n if (entry.gpuCapacity < entry.vertices.length) {\n entry.gpuCapacity = entry.vertices.length;\n gl.bindBuffer(gl.ARRAY_BUFFER, entry.buffer);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n entry.gpuCapacity * Float32Array.BYTES_PER_ELEMENT,\n gl.DYNAMIC_DRAW,\n );\n }\n\n return entry;\n};\n\nconst deleteSeriesBuffers = (gl, cache) => {\n cache.forEach((entry) => {\n if (entry.buffer) gl.deleteBuffer(entry.buffer);\n });\n cache.clear();\n};\n\nconst fillSeriesPoints = ({ vertices, visiblePoints, pointCount, animatedPoint }) => {\n for (let i = 0; i < pointCount; i += 1) {\n if (animatedPoint && i === animatedPoint.index) {\n vertices[i * 2] = animatedPoint.x;\n vertices[i * 2 + 1] = animatedPoint.y;\n continue;\n }\n vertices[i * 2] = visiblePoints.x[i];\n vertices[i * 2 + 1] = visiblePoints.y[i];\n }\n};\n\nconst projectDataToPixel = ({ x, y, state, yRange, plot }) => ({\n x: plot.x + ((x - state.xMin) / (state.xMax - state.xMin)) * plot.width,\n y: plot.y + ((yRange.maxY - y) / (yRange.maxY - yRange.minY)) * plot.height,\n});\n\nconst toViewportLayout = (layout, scrollLeft, scrollTop) => ({\n ...layout,\n rect: {\n ...layout.rect,\n x: layout.rect.x - scrollLeft,\n y: layout.rect.y - scrollTop,\n },\n plot: {\n ...layout.plot,\n x: layout.plot.x - scrollLeft,\n y: layout.plot.y - scrollTop,\n },\n});\n\nconst writeLineVertex = (vertices, offset, x, y) => {\n vertices[offset] = x;\n vertices[offset + 1] = y;\n};\n\nconst fillDashedSeriesSegments = ({\n vertices,\n visiblePoints,\n pointCount,\n state,\n yRange,\n plot,\n}) => {\n let offset = 0;\n let distance = 0;\n const dashTotal = DASH_LENGTH_PX + DASH_GAP_PX;\n\n for (let i = 0; i < pointCount - 1; i += 1) {\n const start = {\n x: visiblePoints.x[i],\n y: visiblePoints.y[i],\n };\n const end = {\n x: visiblePoints.x[i + 1],\n y: visiblePoints.y[i + 1],\n };\n const startPx = projectDataToPixel({ ...start, state, yRange, plot });\n const endPx = projectDataToPixel({ ...end, state, yRange, plot });\n const pixelLength = Math.hypot(endPx.x - startPx.x, endPx.y - startPx.y);\n if (!Number.isFinite(pixelLength) || pixelLength <= 0) continue;\n\n let consumed = 0;\n while (consumed < pixelLength) {\n const phase = distance % dashTotal;\n const boundary =\n phase < DASH_LENGTH_PX ? DASH_LENGTH_PX - phase : dashTotal - phase;\n const step = Math.min(boundary, pixelLength - consumed);\n if (phase < DASH_LENGTH_PX) {\n if (offset + 4 > vertices.length) {\n return offset / 2;\n }\n const t0 = consumed / pixelLength;\n const t1 = (consumed + step) / pixelLength;\n writeLineVertex(\n vertices,\n offset,\n start.x + (end.x - start.x) * t0,\n start.y + (end.y - start.y) * t0,\n );\n offset += 2;\n writeLineVertex(\n vertices,\n offset,\n start.x + (end.x - start.x) * t1,\n start.y + (end.y - start.y) * t1,\n );\n offset += 2;\n }\n consumed += step;\n distance += step;\n }\n }\n\n return offset / 2;\n};\n\nconst getSeriesPoint = (visiblePoints, animatedPoint, index) => {\n if (animatedPoint && index === animatedPoint.index) {\n return { x: animatedPoint.x, y: animatedPoint.y };\n }\n return { x: visiblePoints.x[index], y: visiblePoints.y[index] };\n};\n\nconst getSinglePointSegment = ({ series, state, yRange, plot }) => {\n if (series.length !== 1) return null;\n const x = series.rawX[0];\n const y = series.rawY[0];\n if (x < state.xMin || x > state.xMax || y < yRange.minY || y > yRange.maxY) {\n return null;\n }\n // WebGL line strips need two vertices; true one-point series render as a tiny segment.\n const halfWidth = ((state.xMax - state.xMin) / Math.max(1, plot.width)) * 3;\n return {\n x: new Float64Array([x - halfWidth, x + halfWidth]),\n y: new Float32Array([y, y]),\n bucketSize: 1,\n pointCount: 2,\n endpoint: { x, y },\n };\n};\n\nconst writeAntialiasVertex = (\n vertices,\n offset,\n start,\n end,\n side,\n along,\n) => {\n vertices[offset] = start.x;\n vertices[offset + 1] = start.y;\n vertices[offset + 2] = end.x;\n vertices[offset + 3] = end.y;\n vertices[offset + 4] = side;\n vertices[offset + 5] = along;\n};\n\nconst fillAntialiasSeriesSegments = ({\n vertices,\n visiblePoints,\n pointCount,\n animatedPoint,\n}) => {\n let offset = 0;\n for (let i = 0; i < pointCount - 1; i += 1) {\n const start = getSeriesPoint(visiblePoints, animatedPoint, i);\n const end = getSeriesPoint(visiblePoints, animatedPoint, i + 1);\n writeAntialiasVertex(vertices, offset, start, end, -1, 0);\n offset += AA_VERTEX_FLOAT_STRIDE;\n writeAntialiasVertex(vertices, offset, start, end, 1, 0);\n offset += AA_VERTEX_FLOAT_STRIDE;\n writeAntialiasVertex(vertices, offset, start, end, -1, 1);\n offset += AA_VERTEX_FLOAT_STRIDE;\n writeAntialiasVertex(vertices, offset, start, end, -1, 1);\n offset += AA_VERTEX_FLOAT_STRIDE;\n writeAntialiasVertex(vertices, offset, start, end, 1, 0);\n offset += AA_VERTEX_FLOAT_STRIDE;\n writeAntialiasVertex(vertices, offset, start, end, 1, 1);\n offset += AA_VERTEX_FLOAT_STRIDE;\n }\n return offset / AA_VERTEX_FLOAT_STRIDE;\n};\n\nconst lowerBound = (array, value) => {\n let lo = 0;\n let hi = array.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (array[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\nconst getNearestPointIndex = (xValues, xValue) => {\n if (!xValues.length) return -1;\n const nextIndex = lowerBound(xValues, xValue);\n if (nextIndex <= 0) return 0;\n if (nextIndex >= xValues.length) return xValues.length - 1;\n const previousIndex = nextIndex - 1;\n return Math.abs(xValues[nextIndex] - xValue) <\n Math.abs(xValue - xValues[previousIndex])\n ? nextIndex\n : previousIndex;\n};\n\nconst getChartXBounds = (chart) => {\n let minX = Infinity;\n let maxX = -Infinity;\n chart.series.forEach((series) => {\n if (series.length === 0) return;\n minX = Math.min(minX, series.rawX[0]);\n maxX = Math.max(maxX, series.rawX[series.length - 1]);\n });\n return { minX, maxX };\n};\n\nconst getOrderedSeries = (chart, seriesOrderByChart) => {\n const series = Array.isArray(chart?.series) ? chart.series : [];\n const order = seriesOrderByChart?.[chart?.id];\n if (!Array.isArray(order) || order.length !== series.length) {\n return series;\n }\n const used = new Set();\n const ordered = [];\n order.forEach((seriesIndex) => {\n if (!Number.isInteger(seriesIndex)) return;\n if (seriesIndex < 0 || seriesIndex >= series.length) return;\n if (used.has(seriesIndex)) return;\n used.add(seriesIndex);\n ordered.push(series[seriesIndex]);\n });\n if (ordered.length !== series.length) return series;\n return ordered;\n};\n\nconst normalizeMovingAverage = (movingAverage) => {\n if (!movingAverage?.enabled) return null;\n return {\n enabled: true,\n period: Number.isFinite(Number(movingAverage.period))\n ? Math.max(1, Math.round(Number(movingAverage.period)))\n : 21,\n type: movingAverage.type === \"sma\" ? \"sma\" : \"ema\",\n };\n};\n\nconst getMovingAverageCacheKey = (series, movingAverage) =>\n `${series.id}::ma:${movingAverage.type}:${movingAverage.period}`;\n\nconst calculateMovingAverageChunk = ({\n sourceY,\n startIndex,\n period,\n type,\n previousAverage,\n}) => {\n const out = new Float32Array(Math.max(0, sourceY.length - startIndex));\n if (out.length === 0) return out;\n\n if (type === \"sma\") {\n let sum = 0;\n const firstWindowStart = Math.max(0, startIndex - period + 1);\n for (let i = firstWindowStart; i < startIndex; i += 1) {\n sum += sourceY[i];\n }\n for (let sourceIndex = startIndex; sourceIndex < sourceY.length; sourceIndex += 1) {\n sum += sourceY[sourceIndex];\n const removeIndex = sourceIndex - period;\n if (removeIndex >= firstWindowStart) {\n sum -= sourceY[removeIndex];\n }\n const safePeriod = Math.min(period, sourceIndex + 1);\n out[sourceIndex - startIndex] = sum / safePeriod;\n }\n return out;\n }\n\n const multiplier = 2 / (period + 1);\n let prev = Number.isFinite(previousAverage)\n ? previousAverage\n : sourceY[startIndex];\n for (let sourceIndex = startIndex; sourceIndex < sourceY.length; sourceIndex += 1) {\n prev = sourceY[sourceIndex] * multiplier + prev * (1 - multiplier);\n out[sourceIndex - startIndex] = prev;\n }\n return out;\n};\n\nconst getMovingAverageSeriesForChart = ({\n chart,\n movingAverage,\n cache,\n}) => {\n const normalized = normalizeMovingAverage(movingAverage);\n if (!normalized || !cache) return [];\n\n return chart.series\n .map((series) => {\n if (series.length === 0) return null;\n const cacheKey = getMovingAverageCacheKey(series, normalized);\n const cached = cache.get(cacheKey);\n if (\n cached &&\n cached.sourceSeries === series &&\n cached.sourceLength <= series.length\n ) {\n const appendStart = cached.sourceLength;\n if (appendStart < series.length) {\n const appendedY = calculateMovingAverageChunk({\n sourceY: series.rawY.subarray(0, series.length),\n startIndex: appendStart,\n period: normalized.period,\n type: normalized.type,\n previousAverage:\n appendStart > 0 ? cached.series.rawY[appendStart - 1] : undefined,\n });\n cached.series.append(\n series.rawX.subarray(appendStart, series.length),\n appendedY,\n );\n cached.sourceLength = series.length;\n }\n cached.series.color = series.color;\n cached.series.name = `${series.name} ${normalized.type.toUpperCase()} ${normalized.period}`;\n return cached.series;\n }\n\n const y = calculateMovingAverageChunk({\n sourceY: series.rawY.subarray(0, series.length),\n startIndex: 0,\n period: normalized.period,\n type: normalized.type,\n });\n const maSeries = createSeries({\n id: cacheKey,\n name: `${series.name} ${normalized.type.toUpperCase()} ${normalized.period}`,\n color: series.color,\n x: series.rawX.subarray(0, series.length),\n y,\n });\n cache.set(cacheKey, {\n sourceSeries: series,\n sourceLength: series.length,\n series: maSeries,\n });\n return maSeries;\n })\n .filter(Boolean);\n};\n\nconst getInitialView = (chart, initialVisiblePoints = null) => {\n const { minX, maxX } = getChartXBounds(chart);\n if (!Number.isFinite(minX) || !Number.isFinite(maxX)) {\n return { xMin: 0, xMax: 1 };\n }\n if (minX === maxX) {\n const span =\n Number.isFinite(initialVisiblePoints) && initialVisiblePoints > 0\n ? Math.max(10, initialVisiblePoints)\n : 10;\n const rightPadding = span * JUMP_LATEST_RIGHT_PADDING_RATIO;\n const nextMax = maxX + rightPadding;\n return { xMin: nextMax - span, xMax: nextMax };\n }\n let span = maxX - minX;\n if (Number.isFinite(initialVisiblePoints) && initialVisiblePoints > 0) {\n span = Math.min(span, initialVisiblePoints);\n const rightPadding = span * JUMP_LATEST_RIGHT_PADDING_RATIO;\n const nextMax = maxX + rightPadding;\n return { xMin: nextMax - span, xMax: nextMax };\n }\n const rightPadding = span * JUMP_LATEST_RIGHT_PADDING_RATIO;\n return { xMin: minX, xMax: maxX + rightPadding };\n};\n\nconst getYRange = (chart, xMin, xMax, width) => {\n let minY = Infinity;\n let maxY = -Infinity;\n let renderedPoints = 0;\n let bucketSize = 1;\n\n chart.series.forEach((series) => {\n const visible = series.getVisiblePoints(xMin, xMax, width);\n renderedPoints += visible.pointCount;\n bucketSize = Math.max(bucketSize, visible.bucketSize);\n for (let i = 0; i < visible.y.length; i += 1) {\n const value = visible.y[i];\n if (value < minY) minY = value;\n if (value > maxY) maxY = value;\n }\n });\n\n if (!Number.isFinite(minY) || !Number.isFinite(maxY)) {\n return { minY: 0, maxY: 1, renderedPoints, bucketSize };\n }\n const fixedMinY = Number(chart.yRange?.min);\n const fixedMaxY = Number(chart.yRange?.max);\n if (Number.isFinite(fixedMinY) && Number.isFinite(fixedMaxY) && fixedMinY < fixedMaxY) {\n return { minY: fixedMinY, maxY: fixedMaxY, renderedPoints, bucketSize };\n }\n if (minY === maxY) {\n minY -= 1;\n maxY += 1;\n }\n const pad = (maxY - minY) * 0.08;\n return { minY: minY - pad, maxY: maxY + pad, renderedPoints, bucketSize };\n};\n\nconst applyYScale = (yRange, scale = 1, centerOffset = 0) => {\n const clampedScale = Math.min(Y_SCALE_MAX, Math.max(Y_SCALE_MIN, scale));\n const center = (yRange.minY + yRange.maxY) / 2 + centerOffset;\n const halfRange = ((yRange.maxY - yRange.minY) * clampedScale) / 2;\n return {\n ...yRange,\n minY: center - halfRange,\n maxY: center + halfRange,\n };\n};\n\nconst trimFormattedNumber = (value) =>\n value.replace(/(\\.\\d*?)0+$/, \"$1\").replace(/\\.$/, \"\");\n\nconst formatNumber = (value) => {\n if (!Number.isFinite(value)) return \"\";\n const abs = Math.abs(value);\n if (abs !== 0 && abs < 0.0001) return value.toExponential(2);\n if (abs < 1) return trimFormattedNumber(value.toPrecision(5));\n if (abs >= 100000) return value.toFixed(0);\n if (abs >= 1000) return trimFormattedNumber(value.toFixed(1));\n if (abs >= 10) return trimFormattedNumber(value.toFixed(2));\n return trimFormattedNumber(value.toFixed(4));\n};\n\nconst formatCompactNumber = (value) => {\n if (!Number.isFinite(value)) return \"\";\n const abs = Math.abs(value);\n if (abs >= 1000000000) return `${(value / 1000000000).toFixed(abs >= 10000000000 ? 0 : 1)}B`;\n if (abs >= 1000000) return `${(value / 1000000).toFixed(abs >= 10000000 ? 0 : 1)}M`;\n if (abs >= 1000) return `${(value / 1000).toFixed(abs >= 10000 ? 0 : 1)}k`;\n return formatNumber(value);\n};\n\nconst normalizeRect = (start, end) => {\n if (!start || !end) return null;\n const left = Math.min(start.x, end.x);\n const top = Math.min(start.y, end.y);\n return {\n left,\n top,\n width: Math.abs(end.x - start.x),\n height: Math.abs(end.y - start.y),\n };\n};\n\nconst clampPointToPlot = (point, plot) => ({\n x: Math.min(plot.x + plot.width, Math.max(plot.x, point.x)),\n y: Math.min(plot.y + plot.height, Math.max(plot.y, point.y)),\n});\n\nconst applyRectangleZoom = ({\n chart,\n plot,\n start,\n end,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n yManualScaleRef,\n}) => {\n const clampedStart = clampPointToPlot(start, plot);\n const clampedEnd = clampPointToPlot(end, plot);\n const rect = normalizeRect(clampedStart, clampedEnd);\n if (!rect || rect.width < 6 || rect.height < 6) return false;\n\n const state =\n viewStateRef.current.get(chart.id) ||\n getInitialView(chart, initialVisiblePoints);\n const currentYRange = applyYScale(\n getYRange(chart, state.xMin, state.xMax, plot.width),\n yScaleRef.current.get(chart.id) ?? 1,\n yCenterOffsetRef.current.get(chart.id) ?? 0,\n );\n\n const leftRatio = (rect.left - plot.x) / plot.width;\n const rightRatio = (rect.left + rect.width - plot.x) / plot.width;\n const topRatio = (rect.top - plot.y) / plot.height;\n const bottomRatio = (rect.top + rect.height - plot.y) / plot.height;\n const nextMin = state.xMin + leftRatio * (state.xMax - state.xMin);\n const nextMax = state.xMin + rightRatio * (state.xMax - state.xMin);\n if (nextMax - nextMin < X_SCALE_MIN_SPAN) return false;\n\n const selectedMaxY =\n currentYRange.maxY - topRatio * (currentYRange.maxY - currentYRange.minY);\n const selectedMinY =\n currentYRange.maxY -\n bottomRatio * (currentYRange.maxY - currentYRange.minY);\n const selectedSpan = selectedMaxY - selectedMinY;\n if (!Number.isFinite(selectedSpan) || selectedSpan <= 0) return false;\n\n viewStateRef.current.set(chart.id, { xMin: nextMin, xMax: nextMax });\n\n const baseYRange = getYRange(chart, nextMin, nextMax, plot.width);\n const baseSpan = baseYRange.maxY - baseYRange.minY;\n if (Number.isFinite(baseSpan) && baseSpan > 0) {\n const selectedCenter = (selectedMinY + selectedMaxY) / 2;\n const baseCenter = (baseYRange.minY + baseYRange.maxY) / 2;\n const nextScale = Math.min(\n Y_SCALE_MAX,\n Math.max(Y_SCALE_MIN, selectedSpan / baseSpan),\n );\n yScaleRef.current.set(chart.id, nextScale);\n yCenterOffsetRef.current.set(chart.id, selectedCenter - baseCenter);\n yManualScaleRef.current.add(chart.id);\n }\n\n return true;\n};\n\nconst getChartState = (chart, initialVisiblePoints, viewStateRef) =>\n viewStateRef.current.get(chart.id) ||\n getInitialView(chart, initialVisiblePoints);\n\nconst getScaledYRangeForLayout = ({\n chart,\n state,\n plot,\n yScaleRef,\n yCenterOffsetRef,\n}) =>\n applyYScale(\n getYRange(chart, state.xMin, state.xMax, plot.width),\n yScaleRef.current.get(chart.id) ?? 1,\n yCenterOffsetRef.current.get(chart.id) ?? 0,\n );\n\nconst screenPointToDataPoint = ({\n point,\n chart,\n plot,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n}) => {\n const state = getChartState(chart, initialVisiblePoints, viewStateRef);\n const yRange = getScaledYRangeForLayout({\n chart,\n state,\n plot,\n yScaleRef,\n yCenterOffsetRef,\n });\n const xRatio = (point.x - plot.x) / plot.width;\n const yRatio = (point.y - plot.y) / plot.height;\n return {\n x: state.xMin + xRatio * (state.xMax - state.xMin),\n y: yRange.maxY - yRatio * (yRange.maxY - yRange.minY),\n };\n};\n\nconst dataPointToScreenPoint = ({ point, state, yRange, plot }) => {\n const xRatio = (point.x - state.xMin) / (state.xMax - state.xMin);\n const yRatio = (yRange.maxY - point.y) / (yRange.maxY - yRange.minY);\n return {\n x: plot.x + xRatio * plot.width,\n y: plot.y + yRatio * plot.height,\n };\n};\n\nconst createAxisOverlay = ({\n chart,\n plot,\n state,\n yRange,\n seriesEndpoints,\n seriesOrderByChart = {},\n}) => {\n const { maxX } = getChartXBounds(chart);\n const ticks = Array.from({ length: Y_AXIS_TICK_COUNT }, (_, index) => {\n const ratio = Y_AXIS_TICK_COUNT === 1 ? 0 : index / (Y_AXIS_TICK_COUNT - 1);\n const value = yRange.maxY - ratio * (yRange.maxY - yRange.minY);\n return {\n id: `${chart.id}-tick-${index}`,\n value,\n top: ratio * plot.height,\n };\n });\n\n const xTicks = Array.from({ length: X_AXIS_TICK_COUNT }, (_, index) => {\n const ratio = X_AXIS_TICK_COUNT === 1 ? 0 : index / (X_AXIS_TICK_COUNT - 1);\n return {\n id: `${chart.id}-x-tick-${index}`,\n value: state.xMin + ratio * (state.xMax - state.xMin),\n left: 18 + ratio * Math.max(1, plot.width - 36),\n };\n });\n\n const latestValues = getOrderedSeries(chart, seriesOrderByChart)\n .map((series) => {\n if (series.length === 0) return null;\n const value = series.rawY[series.length - 1];\n const x = series.rawX[series.length - 1];\n const endpoint = seriesEndpoints.get(series.id) || { x, y: value };\n const ratio = (yRange.maxY - endpoint.y) / (yRange.maxY - yRange.minY);\n const xRatio = (endpoint.x - state.xMin) / (state.xMax - state.xMin);\n return {\n id: series.id,\n color: series.color,\n textColor: getSeriesLabelTextColor(series),\n value: endpoint.y,\n rawValue: value,\n x,\n left: xRatio * plot.width,\n top: ratio * plot.height,\n };\n })\n .filter(\n (value) =>\n value &&\n Number.isFinite(value.top) &&\n value.top >= -10 &&\n value.top <= plot.height + 10,\n );\n\n return {\n ticks,\n xTicks,\n latestValues,\n plotWidth: plot.width,\n showJumpLatest:\n Number.isFinite(maxX) && (maxX < state.xMin || maxX > state.xMax),\n };\n};\n\nconst drawChartLayouts = ({\n canvas,\n width,\n height,\n gl,\n program,\n antialiasProgram,\n antialiasLines = false,\n layouts,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n seriesBufferCache,\n antialiasSeriesBufferCache,\n initialVisiblePoints,\n getAppendAnimatedPoint,\n movingAverageByChart = EMPTY_OBJECT,\n movingAverageCache,\n seriesOrderByChart = EMPTY_OBJECT,\n}) => {\n const dpr = Math.min(2, window.devicePixelRatio || 1);\n const pixelWidth = Math.max(1, Math.floor(width * dpr));\n const pixelHeight = Math.max(1, Math.floor(height * dpr));\n if (canvas.width !== pixelWidth || canvas.height !== pixelHeight) {\n canvas.width = pixelWidth;\n canvas.height = pixelHeight;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n }\n\n gl.viewport(0, 0, pixelWidth, pixelHeight);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n const activeAntialiasLines = antialiasLines && antialiasProgram;\n const activeProgram = activeAntialiasLines ? antialiasProgram : program;\n gl.useProgram(activeProgram);\n\n const uResolution = gl.getUniformLocation(activeProgram, \"u_resolution\");\n const uRect = gl.getUniformLocation(activeProgram, \"u_rect\");\n const uXRange = gl.getUniformLocation(activeProgram, \"u_xRange\");\n const uYRange = gl.getUniformLocation(activeProgram, \"u_yRange\");\n const uColor = gl.getUniformLocation(activeProgram, \"u_color\");\n\n let aXy = -1;\n let aStart = -1;\n let aEnd = -1;\n let aSide = -1;\n let aAlong = -1;\n let uLineHalfWidth = null;\n let uEdgeWidth = null;\n\n if (activeAntialiasLines) {\n aStart = gl.getAttribLocation(activeProgram, \"a_start\");\n aEnd = gl.getAttribLocation(activeProgram, \"a_end\");\n aSide = gl.getAttribLocation(activeProgram, \"a_side\");\n aAlong = gl.getAttribLocation(activeProgram, \"a_along\");\n uLineHalfWidth = gl.getUniformLocation(activeProgram, \"u_lineHalfWidth\");\n uEdgeWidth = gl.getUniformLocation(activeProgram, \"u_edgeWidth\");\n gl.enableVertexAttribArray(aStart);\n gl.enableVertexAttribArray(aEnd);\n gl.enableVertexAttribArray(aSide);\n gl.enableVertexAttribArray(aAlong);\n gl.uniform1f(uLineHalfWidth, (AA_LINE_WIDTH_PX * dpr) / 2);\n gl.uniform1f(uEdgeWidth, AA_EDGE_WIDTH_PX * dpr);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n } else {\n aXy = gl.getAttribLocation(activeProgram, \"a_xy\");\n gl.enableVertexAttribArray(aXy);\n gl.disable(gl.BLEND);\n }\n\n gl.uniform2f(uResolution, pixelWidth, pixelHeight);\n\n const now = performance.now();\n const nextAxisOverlays = {};\n\n layouts.forEach(({ chart, plot, visible }) => {\n if (!visible) return;\n if (activeAntialiasLines) {\n gl.useProgram(activeProgram);\n gl.uniform2f(uResolution, pixelWidth, pixelHeight);\n }\n const state =\n viewStateRef.current.get(chart.id) ||\n getInitialView(chart, initialVisiblePoints);\n const scaledPlot = {\n x: plot.x * dpr,\n y: plot.y * dpr,\n width: plot.width * dpr,\n height: plot.height * dpr,\n };\n const yRange = applyYScale(\n getYRange(chart, state.xMin, state.xMax, plot.width),\n yScaleRef.current.get(chart.id) ?? 1,\n yCenterOffsetRef.current.get(chart.id) ?? 0,\n );\n const seriesEndpoints = new Map();\n const chartMovingAverage = movingAverageByChart?.[chart.id];\n const hideBaseSeries =\n Boolean(chartMovingAverage?.enabled) && Boolean(chartMovingAverage?.hideBase);\n\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(\n Math.floor(scaledPlot.x),\n Math.floor(pixelHeight - scaledPlot.y - scaledPlot.height),\n Math.ceil(scaledPlot.width),\n Math.ceil(scaledPlot.height),\n );\n gl.uniform4f(\n uRect,\n scaledPlot.x,\n scaledPlot.y,\n scaledPlot.width,\n scaledPlot.height,\n );\n gl.uniform2f(uXRange, state.xMin, state.xMax);\n gl.uniform2f(uYRange, yRange.minY, yRange.maxY);\n\n if (!hideBaseSeries) getOrderedSeries(chart, seriesOrderByChart).forEach((series) => {\n let visiblePoints = series.getVisiblePoints(\n state.xMin,\n state.xMax,\n plot.width,\n );\n let singlePointEndpoint = null;\n if (visiblePoints.pointCount < 2) {\n const singlePointSegment = getSinglePointSegment({\n series,\n state,\n yRange,\n plot,\n });\n if (!singlePointSegment) return;\n visiblePoints = singlePointSegment;\n singlePointEndpoint = singlePointSegment.endpoint;\n }\n const animatedPoint = singlePointEndpoint\n ? null\n : getAppendAnimatedPoint({\n seriesId: series.id,\n visiblePoints,\n now,\n });\n const pointCount = animatedPoint?.pointCount ?? visiblePoints.pointCount;\n if (animatedPoint) {\n seriesEndpoints.set(series.id, {\n x: animatedPoint.x,\n y: animatedPoint.y,\n });\n } else if (singlePointEndpoint) {\n seriesEndpoints.set(series.id, singlePointEndpoint);\n }\n\n const [r, g, b] = hexToRgb(series.color);\n gl.uniform3f(uColor, r, g, b);\n\n if (activeAntialiasLines) {\n const bufferEntry = getAntialiasSeriesBuffer(\n gl,\n antialiasSeriesBufferCache,\n series.id,\n pointCount,\n );\n const drawVertexCount = fillAntialiasSeriesSegments({\n vertices: bufferEntry.vertices,\n visiblePoints,\n pointCount,\n animatedPoint,\n });\n const stride = AA_VERTEX_FLOAT_STRIDE * Float32Array.BYTES_PER_ELEMENT;\n gl.bindBuffer(gl.ARRAY_BUFFER, bufferEntry.buffer);\n gl.vertexAttribPointer(aStart, 2, gl.FLOAT, false, stride, 0);\n gl.vertexAttribPointer(\n aEnd,\n 2,\n gl.FLOAT,\n false,\n stride,\n 2 * Float32Array.BYTES_PER_ELEMENT,\n );\n gl.vertexAttribPointer(\n aSide,\n 1,\n gl.FLOAT,\n false,\n stride,\n 4 * Float32Array.BYTES_PER_ELEMENT,\n );\n gl.vertexAttribPointer(\n aAlong,\n 1,\n gl.FLOAT,\n false,\n stride,\n 5 * Float32Array.BYTES_PER_ELEMENT,\n );\n gl.bufferSubData(\n gl.ARRAY_BUFFER,\n 0,\n bufferEntry.vertices,\n 0,\n drawVertexCount * AA_VERTEX_FLOAT_STRIDE,\n );\n gl.drawArrays(gl.TRIANGLES, 0, drawVertexCount);\n return;\n }\n\n const bufferEntry = getSeriesBuffer(\n gl,\n seriesBufferCache,\n series.id,\n pointCount,\n );\n fillSeriesPoints({\n vertices: bufferEntry.vertices,\n visiblePoints,\n pointCount,\n animatedPoint,\n });\n gl.bindBuffer(gl.ARRAY_BUFFER, bufferEntry.buffer);\n gl.vertexAttribPointer(aXy, 2, gl.FLOAT, false, 0, 0);\n gl.bufferSubData(\n gl.ARRAY_BUFFER,\n 0,\n bufferEntry.vertices,\n 0,\n pointCount * 2,\n );\n gl.drawArrays(gl.LINE_STRIP, 0, pointCount);\n });\n const movingAverageSeries = getMovingAverageSeriesForChart({\n chart,\n movingAverage: chartMovingAverage,\n cache: movingAverageCache,\n });\n const orderedMovingAverageSeries = getOrderedSeries(\n { ...chart, series: movingAverageSeries },\n seriesOrderByChart,\n );\n let maAXy = aXy;\n let maUColor = uColor;\n if (movingAverageSeries.length > 0 && activeAntialiasLines) {\n gl.useProgram(program);\n const maUResolution = gl.getUniformLocation(program, \"u_resolution\");\n const maURect = gl.getUniformLocation(program, \"u_rect\");\n const maUXRange = gl.getUniformLocation(program, \"u_xRange\");\n const maUYRange = gl.getUniformLocation(program, \"u_yRange\");\n maUColor = gl.getUniformLocation(program, \"u_color\");\n maAXy = gl.getAttribLocation(program, \"a_xy\");\n gl.enableVertexAttribArray(maAXy);\n gl.uniform2f(maUResolution, pixelWidth, pixelHeight);\n gl.uniform4f(\n maURect,\n scaledPlot.x,\n scaledPlot.y,\n scaledPlot.width,\n scaledPlot.height,\n );\n gl.uniform2f(maUXRange, state.xMin, state.xMax);\n gl.uniform2f(maUYRange, yRange.minY, yRange.maxY);\n }\n orderedMovingAverageSeries.forEach((series) => {\n const visiblePoints = series.getVisiblePoints(\n state.xMin,\n state.xMax,\n plot.width,\n );\n if (visiblePoints.pointCount < 2) return;\n const pointCount = visiblePoints.pointCount;\n const [r, g, b] = hexToRgb(series.color);\n gl.uniform3f(maUColor, r, g, b);\n\n const bufferEntry = getSeriesBuffer(\n gl,\n seriesBufferCache,\n series.id,\n pointCount * 8,\n );\n const drawVertexCount = fillDashedSeriesSegments({\n vertices: bufferEntry.vertices,\n visiblePoints,\n pointCount,\n state,\n yRange,\n plot,\n });\n if (drawVertexCount < 2) return;\n gl.bindBuffer(gl.ARRAY_BUFFER, bufferEntry.buffer);\n gl.vertexAttribPointer(maAXy, 2, gl.FLOAT, false, 0, 0);\n gl.bufferSubData(\n gl.ARRAY_BUFFER,\n 0,\n bufferEntry.vertices,\n 0,\n drawVertexCount * 2,\n );\n gl.drawArrays(gl.LINES, 0, drawVertexCount);\n });\n nextAxisOverlays[chart.id] = createAxisOverlay({\n chart,\n plot,\n state,\n yRange,\n seriesEndpoints,\n seriesOrderByChart,\n });\n gl.disable(gl.SCISSOR_TEST);\n });\n\n if (activeAntialiasLines) {\n gl.disable(gl.BLEND);\n }\n\n return nextAxisOverlays;\n};\n\nexport {\n CHART_HEIGHT,\n RIGHT_AXIS_WIDTH,\n PLOT_PADDING,\n Y_SCALE_MIN,\n Y_SCALE_MAX,\n X_SCALE_MIN_SPAN,\n X_SCALE_MAX_SPAN,\n DEFAULT_CHART_BACKGROUND,\n createProgram,\n createAntialiasProgram,\n createSeriesBufferCache,\n deleteSeriesBuffers,\n drawChartLayouts,\n getChartXBounds,\n getInitialView,\n getYRange,\n applyYScale,\n getNearestPointIndex,\n screenPointToDataPoint,\n dataPointToScreenPoint,\n normalizeRect,\n applyRectangleZoom,\n formatNumber,\n formatCompactNumber,\n};\n", "import { iconSvg } from \"../icons.js\";\nimport {\n DRAWING_TOOLS,\n createDraftDrawing,\n createDrawing,\n getDrawingGeometry,\n getDrawingsForChart,\n hitTestDrawing,\n removeDrawingById,\n updateDrawingById,\n} from \"../core/drawingUtils.js\";\nimport {\n CHART_HEIGHT,\n RIGHT_AXIS_WIDTH,\n PLOT_PADDING,\n Y_SCALE_MIN,\n Y_SCALE_MAX,\n X_SCALE_MIN_SPAN,\n X_SCALE_MAX_SPAN,\n DEFAULT_CHART_BACKGROUND,\n createProgram,\n createAntialiasProgram,\n createSeriesBufferCache,\n deleteSeriesBuffers,\n drawChartLayouts,\n getChartXBounds,\n getInitialView,\n getYRange,\n applyYScale,\n getNearestPointIndex,\n screenPointToDataPoint,\n dataPointToScreenPoint,\n normalizeRect,\n applyRectangleZoom,\n formatNumber,\n formatCompactNumber,\n} from \"../core/chartRenderer.js\";\n\nconst BASE_ROOT_CLASSES = [\"aliencharts-root\", \"relative\", \"h-full\", \"overflow-y-auto\"];\nconst EMPTY_OBJECT = Object.freeze({});\nconst DEFAULT_OPTIONS = Object.freeze({\n charts: [],\n columns: 2,\n initialVisiblePoints: null,\n backgroundColor: DEFAULT_CHART_BACKGROUND,\n antialiasLines: false,\n gridLines: false,\n showToolbar: true,\n showLatestValueLine: true,\n showTooltips: true,\n followLatest: false,\n followVisibleLatest: true,\n xAxisLabel: \"STEP\",\n disableDrawings: false,\n seriesOrderByChart: EMPTY_OBJECT,\n topMarkers: [],\n formatXTick: formatCompactNumber,\n formatXValue: formatNumber,\n formatYValue: formatNumber,\n});\n\nconst APPEND_ANIMATION = Object.freeze({\n durationMs: 300,\n maxBucketSize: 64,\n maxRevealPoints: 100,\n});\n\nconst escapeHtml = (value) => String(value ?? \"\")\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n\nconst withAlpha = (color, alpha) => {\n const value = String(color || DEFAULT_CHART_BACKGROUND).trim();\n const match = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(value);\n if (!match) return value;\n return `rgba(${Number.parseInt(match[1], 16)}, ${Number.parseInt(match[2], 16)}, ${Number.parseInt(match[3], 16)}, ${alpha})`;\n};\n\nconst getTextColor = (color) => {\n const value = String(color || \"#38bdf8\").replace(\"#\", \"\");\n const normalized = value.length === 3\n ? value.split(\"\").map((part) => part + part).join(\"\")\n : value.padEnd(6, \"0\").slice(0, 6);\n const number = Number.parseInt(normalized, 16);\n const rgb = [16, 8, 0].map((shift) => ((number >> shift) & 255) / 255);\n const linear = rgb.map((part) => part <= 0.03928 ? part / 12.92 : ((part + 0.055) / 1.055) ** 2.4);\n return 0.2126 * linear[0] + 0.7152 * linear[1] + 0.0722 * linear[2] > 0.45\n ? \"#111827\"\n : \"#ffffff\";\n};\n\nconst hasOwn = (object, key) => Object.prototype.hasOwnProperty.call(object, key);\nconst clamp = (value, min, max) => Math.min(max, Math.max(min, value));\n\nconst toolbarButton = ({ action, title, icon, hotkey = \"\", active = false, className = \"\" }) => `\n <button type=\"button\" data-action=\"${action}\" title=\"${escapeHtml(title)}\" aria-label=\"${escapeHtml(title)}\"\n class=\"relative inline-flex size-6 items-center justify-center rounded-sm text-foreground hover:bg-accent hover:text-accent-foreground ${active ? \"bg-primary/15 text-primary ring-1 ring-primary/40\" : \"\"} ${className}\">\n ${icon}\n ${hotkey ? `<span class=\"pointer-events-none absolute left-full top-1/2 -translate-y-1/2 text-[10px] font-semibold leading-none text-foreground/50\">${hotkey}</span>` : \"\"}\n </button>`;\n\nconst chartCellHtml = (chart, index, backgroundColor) => `\n <div data-chart-index=\"${index}\" class=\"relative select-none overflow-hidden rounded-sm\" style=\"height:${CHART_HEIGHT}px;background-color:${escapeHtml(backgroundColor)}\">\n <div class=\"pointer-events-none absolute inset-x-0 top-0 z-10 flex h-8 items-center px-2 backdrop-blur\" data-header>\n <div class=\"flex min-w-0 items-center gap-1 rounded-sm px-1 text-sm font-semibold text-foreground\" data-title-wrap>\n ${chart.pinned ? iconSvg(\"pushPinSimple\", { size: 14, className: \"shrink-0 text-foreground/80\" }) : \"\"}\n <span class=\"truncate\">${escapeHtml(chart.title)}</span>\n </div>\n </div>\n <div data-grid-lines class=\"pointer-events-none absolute text-border/40\"></div>\n <div data-latest-lines></div>\n <div data-y-axis class=\"absolute right-0 z-20\" style=\"top:${PLOT_PADDING.top}px;bottom:${PLOT_PADDING.bottom}px;width:${RIGHT_AXIS_WIDTH}px;cursor:ns-resize\"></div>\n <div data-x-axis class=\"absolute bottom-0 z-20\" style=\"left:${PLOT_PADDING.left}px;right:${RIGHT_AXIS_WIDTH}px;height:${PLOT_PADDING.bottom}px;cursor:ew-resize\"></div>\n <div data-toolbar></div>\n </div>`;\n\nconst makeSurface = (canvas, gl) => ({\n canvas,\n gl,\n program: createProgram(gl),\n antialiasProgram: createAntialiasProgram(gl),\n seriesBuffers: createSeriesBufferCache(),\n antialiasBuffers: createSeriesBufferCache(),\n movingAverageCache: new Map(),\n});\n\nconst destroySurface = (surface) => {\n if (!surface) return;\n deleteSeriesBuffers(surface.gl, surface.seriesBuffers);\n deleteSeriesBuffers(surface.gl, surface.antialiasBuffers);\n surface.gl.deleteProgram(surface.program);\n surface.gl.deleteProgram(surface.antialiasProgram);\n surface.gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n};\n\nclass AppendAnimator {\n constructor(requestRender) {\n this.requestRender = requestRender;\n this.latest = new Map();\n this.animations = new Map();\n this.frame = null;\n }\n\n scan(charts) {\n const now = performance.now();\n charts.forEach((chart) => chart.series.forEach((series) => {\n if (!series.length) return;\n const next = {\n x: series.rawX[series.length - 1],\n y: series.rawY[series.length - 1],\n length: series.length,\n };\n const previous = this.latest.get(series.id);\n if (previous && next.x > previous.x) {\n this.animations.set(series.id, {\n fromX: previous.x,\n fromY: previous.y,\n toX: next.x,\n toY: next.y,\n appendedCount: next.length - previous.length,\n startedAt: now,\n duration: APPEND_ANIMATION.durationMs,\n });\n }\n this.latest.set(series.id, next);\n }));\n if (this.animations.size) this.start();\n }\n\n start() {\n if (this.frame != null) return;\n const tick = () => {\n const now = performance.now();\n this.animations.forEach((animation, id) => {\n if (now - animation.startedAt >= animation.duration) this.animations.delete(id);\n });\n this.requestRender();\n this.frame = this.animations.size ? requestAnimationFrame(tick) : null;\n };\n this.frame = requestAnimationFrame(tick);\n }\n\n getPoint({ seriesId, visiblePoints, now }) {\n if (visiblePoints.bucketSize > APPEND_ANIMATION.maxBucketSize) return null;\n const animation = this.animations.get(seriesId);\n if (!animation || visiblePoints.x[0] > animation.fromX || visiblePoints.x[visiblePoints.pointCount - 1] < animation.toX) return null;\n let stableCount = 0;\n while (stableCount < visiblePoints.pointCount && visiblePoints.x[stableCount] <= animation.fromX) stableCount += 1;\n if (!stableCount) return null;\n const rawProgress = clamp((now - animation.startedAt) / animation.duration, 0, 1);\n const progress = 1 - (1 - rawProgress) ** 2;\n if (animation.appendedCount > APPEND_ANIMATION.maxRevealPoints) {\n return {\n index: stableCount,\n pointCount: stableCount + 1,\n x: animation.fromX + (animation.toX - animation.fromX) * progress,\n y: animation.fromY + (animation.toY - animation.fromY) * progress,\n };\n }\n const appendedCount = visiblePoints.pointCount - stableCount;\n const position = progress * appendedCount;\n const revealed = Math.min(appendedCount, Math.floor(position));\n const nextIndex = Math.min(visiblePoints.pointCount - 1, stableCount + revealed);\n const previousIndex = Math.max(stableCount - 1, nextIndex - 1);\n const partial = position - revealed;\n const partialPoint = revealed < appendedCount;\n return {\n index: nextIndex,\n pointCount: Math.min(visiblePoints.pointCount, nextIndex + 1),\n x: partialPoint ? visiblePoints.x[previousIndex] + (visiblePoints.x[nextIndex] - visiblePoints.x[previousIndex]) * partial : visiblePoints.x[nextIndex],\n y: partialPoint ? visiblePoints.y[previousIndex] + (visiblePoints.y[nextIndex] - visiblePoints.y[previousIndex]) * partial : visiblePoints.y[nextIndex],\n };\n }\n\n destroy() {\n if (this.frame != null) cancelAnimationFrame(this.frame);\n this.frame = null;\n this.animations.clear();\n }\n}\n\nclass ChartGridController {\n constructor(container, options) {\n if (!(container instanceof HTMLElement)) throw new TypeError(\"createChartGrid requires an HTMLElement target\");\n this.container = container;\n this.options = { ...DEFAULT_OPTIONS, ...options };\n if (!Array.isArray(this.options.charts)) throw new TypeError(\"charts must be an array\");\n this.destroyed = false;\n this.frame = null;\n this.structureDirty = true;\n this.focusedChartId = null;\n this.fullscreenChartId = null;\n this.rectangleZoomChartId = null;\n this.rectangleZoomRect = null;\n this.crosshair = null;\n this.drag = null;\n this.draftDrawing = null;\n this.drawingSession = null;\n this.drawings = Array.isArray(options.drawings) ? [...options.drawings] : [];\n this.activeDrawingTool = options.activeDrawingTool ?? null;\n this.selectedDrawingId = options.selectedDrawingId ?? null;\n this.movingAverageByChart = { ...(options.movingAverageByChart || {}) };\n this.viewStates = new Map();\n this.yScales = new Map();\n this.yOffsets = new Map();\n this.latestX = new Map();\n this.axisOverlays = {};\n this.layouts = [];\n this.fullscreenLayouts = [];\n this.addedClasses = BASE_ROOT_CLASSES.filter((name) => !container.classList.contains(name));\n BASE_ROOT_CLASSES.forEach((name) => container.classList.add(name));\n\n this.canvas = document.createElement(\"canvas\");\n this.canvas.className = \"pointer-events-none absolute left-0 top-0 z-10 block\";\n this.grid = document.createElement(\"div\");\n this.grid.className = \"relative z-0 grid gap-1 pt-1\";\n this.overlays = document.createElement(\"div\");\n this.overlays.className = \"pointer-events-none absolute left-0 top-0 z-20\";\n this.overlays.style.width = \"100%\";\n container.append(this.canvas, this.grid, this.overlays);\n\n const gl = this.canvas.getContext(\"webgl2\", { antialias: true, alpha: true, depth: false, stencil: false });\n if (!gl) {\n this.cleanupDom();\n throw new Error(\"AlienCharts requires WebGL2 support\");\n }\n this.surface = makeSurface(this.canvas, gl);\n this.fullscreenSurface = null;\n this.animator = new AppendAnimator(() => this.requestRender());\n this.animator.scan(this.options.charts);\n this.bound = {\n click: (event) => this.handleClick(event),\n input: (event) => this.handleInput(event),\n change: (event) => this.handleInput(event),\n pointerdown: (event) => this.handlePointerDown(event),\n pointermove: (event) => this.handlePointerMove(event),\n pointerup: (event) => this.handlePointerUp(event),\n pointerleave: () => this.clearCrosshair(),\n contextmenu: (event) => this.handleContextMenu(event),\n wheel: (event) => this.handleWheel(event),\n scroll: () => this.requestRender(),\n keydown: (event) => this.handleKeyDown(event),\n };\n Object.entries(this.bound).forEach(([name, handler]) => {\n const target = name === \"keydown\" ? window : container;\n target.addEventListener(name, handler, name === \"wheel\" ? { passive: false } : undefined);\n });\n this.resizeObserver = new ResizeObserver(() => this.requestRender());\n this.resizeObserver.observe(container);\n this.initializeChartState();\n this.requestRender();\n }\n\n assertAlive() {\n if (this.destroyed) throw new Error(\"AlienCharts controller has been destroyed\");\n }\n\n initializeChartState() {\n const ids = new Set(this.options.charts.map((chart) => chart.id));\n [this.viewStates, this.yScales, this.yOffsets, this.latestX].forEach((map) => {\n [...map.keys()].forEach((id) => { if (!ids.has(id)) map.delete(id); });\n });\n this.options.charts.forEach((chart) => {\n if (!this.viewStates.has(chart.id)) this.viewStates.set(chart.id, getInitialView(chart, this.options.initialVisiblePoints));\n if (!this.yScales.has(chart.id)) this.yScales.set(chart.id, 1);\n if (!this.yOffsets.has(chart.id)) this.yOffsets.set(chart.id, 0);\n if (!this.latestX.has(chart.id)) this.latestX.set(chart.id, getChartXBounds(chart).maxX);\n });\n if (this.focusedChartId && !ids.has(this.focusedChartId)) this.focusedChartId = null;\n if (this.fullscreenChartId && !ids.has(this.fullscreenChartId)) this.closeFullscreen();\n }\n\n requestRender() {\n if (this.destroyed || this.frame != null) return;\n this.frame = requestAnimationFrame(() => {\n this.frame = null;\n this.render();\n });\n }\n\n setOptions(next) {\n this.assertAlive();\n if (!next || typeof next !== \"object\") return;\n const previousCharts = this.options.charts;\n const previousActiveDrawingTool = this.activeDrawingTool;\n this.options = { ...this.options, ...next };\n if (!Array.isArray(this.options.charts)) throw new TypeError(\"charts must be an array\");\n if (hasOwn(next, \"drawings\")) this.drawings = Array.isArray(next.drawings) ? [...next.drawings] : [];\n if (hasOwn(next, \"activeDrawingTool\")) {\n this.activeDrawingTool = next.activeDrawingTool ?? null;\n if (this.activeDrawingTool !== previousActiveDrawingTool) {\n this.draftDrawing = null;\n this.drawingSession = null;\n }\n }\n if (hasOwn(next, \"selectedDrawingId\")) this.selectedDrawingId = next.selectedDrawingId ?? null;\n if (hasOwn(next, \"movingAverageByChart\")) this.movingAverageByChart = { ...(next.movingAverageByChart || {}) };\n if (previousCharts !== this.options.charts || hasOwn(next, \"columns\") || hasOwn(next, \"backgroundColor\") || hasOwn(next, \"gridLines\")) this.structureDirty = true;\n this.initializeChartState();\n this.requestRender();\n }\n\n setCharts(charts) {\n this.setOptions({ charts });\n }\n\n invalidate() {\n this.assertAlive();\n this.followAppendedData();\n this.animator.scan(this.options.charts);\n this.requestRender();\n }\n\n followAppendedData() {\n this.options.charts.forEach((chart) => {\n const previous = this.latestX.get(chart.id);\n const next = getChartXBounds(chart).maxX;\n if (Number.isFinite(previous) && Number.isFinite(next) && next !== previous) {\n const state = this.viewStates.get(chart.id) || getInitialView(chart, this.options.initialVisiblePoints);\n const span = state.xMax - state.xMin;\n const nearEdge = previous >= state.xMax - span * 0.15 && previous >= state.xMin && previous <= state.xMax;\n if (this.options.followLatest || (this.options.followVisibleLatest && nearEdge)) {\n const delta = next - previous;\n this.viewStates.set(chart.id, { xMin: state.xMin + delta, xMax: state.xMax + delta });\n }\n }\n this.latestX.set(chart.id, next);\n });\n }\n\n jumpToLatest(chartId) {\n this.assertAlive();\n this.options.charts.forEach((chart) => {\n if (chartId != null && chart.id !== chartId) return;\n const maxX = getChartXBounds(chart).maxX;\n if (!Number.isFinite(maxX)) return;\n const state = this.viewStates.get(chart.id) || getInitialView(chart, this.options.initialVisiblePoints);\n const span = Math.max(10, state.xMax - state.xMin);\n const nextMax = maxX + span * 0.1;\n this.viewStates.set(chart.id, { xMin: nextMax - span, xMax: nextMax });\n });\n this.requestRender();\n }\n\n scrollToTop(options = {}) {\n this.assertAlive();\n this.container.scrollTo({ ...options, top: 0 });\n }\n\n renderStructure() {\n this.grid.style.gridTemplateColumns = `repeat(${Math.max(1, Number(this.options.columns) || 1)}, minmax(18rem, 1fr))`;\n this.grid.innerHTML = this.options.charts.map((chart, index) => chartCellHtml(chart, index, this.options.backgroundColor)).join(\"\");\n this.chartNodes = [...this.grid.querySelectorAll(\"[data-chart-index]\")];\n this.chartNodes.forEach((node) => {\n node.querySelector(\"[data-header]\").style.backgroundColor = withAlpha(this.options.backgroundColor, 0.82);\n });\n this.structureDirty = false;\n }\n\n getLayouts(fullscreen = false) {\n const nodes = fullscreen ? (this.fullscreenNode ? [this.fullscreenNode] : []) : this.chartNodes || [];\n const charts = fullscreen\n ? this.options.charts.filter((chart) => chart.id === this.fullscreenChartId)\n : this.options.charts;\n const host = fullscreen ? this.fullscreenOverlay : this.container;\n const hostRect = host.getBoundingClientRect();\n return nodes.map((node, index) => {\n const rect = node.getBoundingClientRect();\n const x = rect.left - hostRect.left + host.scrollLeft;\n const y = rect.top - hostRect.top + host.scrollTop;\n const chart = charts[index];\n const layout = {\n chart,\n rect: { x, y, width: rect.width, height: rect.height },\n plot: {\n x: x + PLOT_PADDING.left,\n y: y + PLOT_PADDING.top,\n width: Math.max(1, rect.width - PLOT_PADDING.left - PLOT_PADDING.right),\n height: Math.max(1, rect.height - PLOT_PADDING.top - PLOT_PADDING.bottom),\n },\n visible: fullscreen || (rect.bottom >= hostRect.top && rect.top <= hostRect.bottom),\n node,\n fullscreen,\n };\n return layout;\n });\n }\n\n render() {\n const focusState = this.captureControlFocus();\n if (this.structureDirty) this.renderStructure();\n this.layouts = this.getLayouts(false);\n this.axisOverlays = this.drawSurface(this.surface, this.layouts, this.container.scrollWidth, this.container.scrollHeight);\n this.updateCells(this.layouts, this.axisOverlays, false);\n if (this.fullscreenChartId) {\n this.fullscreenLayouts = this.getLayouts(true);\n const axes = this.drawSurface(this.fullscreenSurface, this.fullscreenLayouts, this.fullscreenOverlay.clientWidth, this.fullscreenOverlay.clientHeight);\n this.updateCells(this.fullscreenLayouts, axes, true);\n }\n this.renderOverlays();\n this.restoreControlFocus(focusState);\n }\n\n captureControlFocus() {\n const active = document.activeElement;\n if (!(active instanceof HTMLInputElement)) return null;\n const selector = active.matches(\"[data-moving-period]\")\n ? \"[data-moving-period]\"\n : active.matches(\"[data-pin-text]\")\n ? \"[data-pin-text]\"\n : active.matches(\"[data-drawing-color]\")\n ? \"[data-drawing-color]\"\n : null;\n if (!selector) return null;\n const fullscreen = Boolean(active.closest(\"[data-aliencharts-fullscreen]\"));\n let selectionStart = null;\n let selectionEnd = null;\n if (active.type === \"text\") {\n selectionStart = active.selectionStart;\n selectionEnd = active.selectionEnd;\n }\n return { selector, fullscreen, selectionStart, selectionEnd };\n }\n\n restoreControlFocus(state) {\n if (!state) return;\n const host = state.fullscreen ? this.fullscreenOverlay : this.container;\n const input = host?.querySelector(state.selector);\n if (!(input instanceof HTMLInputElement)) return;\n input.focus({ preventScroll: true });\n if (input.type === \"text\" && state.selectionStart != null) {\n input.setSelectionRange(state.selectionStart, state.selectionEnd);\n }\n }\n\n drawSurface(surface, layouts, width, height) {\n if (!surface) return {};\n return drawChartLayouts({\n canvas: surface.canvas,\n width: Math.max(1, width),\n height: Math.max(1, height),\n gl: surface.gl,\n program: surface.program,\n antialiasProgram: surface.antialiasProgram,\n antialiasLines: this.options.antialiasLines,\n layouts,\n viewStateRef: { current: this.viewStates },\n yScaleRef: { current: this.yScales },\n yCenterOffsetRef: { current: this.yOffsets },\n seriesBufferCache: surface.seriesBuffers,\n antialiasSeriesBufferCache: surface.antialiasBuffers,\n initialVisiblePoints: this.options.initialVisiblePoints,\n getAppendAnimatedPoint: (payload) => this.animator.getPoint(payload),\n movingAverageByChart: this.movingAverageByChart,\n movingAverageCache: surface.movingAverageCache,\n seriesOrderByChart: this.options.seriesOrderByChart,\n });\n }\n\n updateCells(layouts, axes, fullscreen) {\n layouts.forEach(({ chart, node }) => {\n const axis = axes[chart.id];\n node.querySelector(\"[data-title-wrap]\").classList.toggle(\"ring-1\", this.focusedChartId === chart.id);\n node.querySelector(\"[data-title-wrap]\").classList.toggle(\"ring-primary/70\", this.focusedChartId === chart.id);\n const grid = node.querySelector(\"[data-grid-lines]\");\n const gridOptions = this.options.gridLines === true ? {} : this.options.gridLines || {};\n grid.style.display = this.options.gridLines ? \"block\" : \"none\";\n Object.assign(grid.style, {\n left: `${PLOT_PADDING.left}px`, right: `${PLOT_PADDING.right}px`, top: `${PLOT_PADDING.top}px`, bottom: `${PLOT_PADDING.bottom}px`,\n backgroundImage: \"linear-gradient(to right, transparent calc(100% - 1px), currentColor calc(100% - 1px)), linear-gradient(to bottom, transparent calc(100% - 1px), currentColor calc(100% - 1px))\",\n backgroundSize: `${Math.max(8, Number(gridOptions.xSpacing) || 80)}px 100%, 100% ${Math.max(8, Number(gridOptions.ySpacing) || 48)}px`,\n });\n const yAxis = node.querySelector(\"[data-y-axis]\");\n yAxis.style.backgroundColor = withAlpha(this.options.backgroundColor, 0.78);\n yAxis.innerHTML = (axis?.ticks || []).map((tick) => `<div class=\"pointer-events-none absolute left-1/2 -translate-x-1/2 -translate-y-1/2 text-center text-[11px] font-medium tabular-nums text-foreground/70\" style=\"top:${tick.top}px\">${escapeHtml(this.options.formatYValue(tick.value))}</div>`).join(\"\") +\n (axis?.latestValues || []).map((latest) => `<div class=\"pointer-events-none absolute left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-sm px-1.5 py-0.5 text-center text-[10px] font-bold tabular-nums shadow-sm\" style=\"top:${latest.top}px;background:${latest.color};color:${getTextColor(latest.color)}\">${escapeHtml(this.options.formatYValue(latest.value))}</div>`).join(\"\");\n const xAxis = node.querySelector(\"[data-x-axis]\");\n xAxis.style.backgroundColor = withAlpha(this.options.backgroundColor, 0.7);\n xAxis.innerHTML = (axis?.xTicks || []).map((tick) => `<div class=\"pointer-events-none absolute top-1/2 -translate-x-1/2 -translate-y-1/2 text-center text-[11px] font-medium tabular-nums text-foreground/70\" style=\"left:${tick.left}px\">${escapeHtml(this.options.formatXTick(tick.value))}</div>`).join(\"\");\n const latestLayer = node.querySelector(\"[data-latest-lines]\");\n latestLayer.innerHTML = this.options.showLatestValueLine ? (axis?.latestValues || []).filter((item) => item.left >= 0 && item.left <= axis.plotWidth).map((item) => `<div class=\"pointer-events-none absolute z-10 opacity-70\" style=\"left:${PLOT_PADDING.left + item.left}px;top:${PLOT_PADDING.top + item.top}px;height:1px;width:${Math.max(0, axis.plotWidth - item.left)}px;background-image:repeating-linear-gradient(to right,${item.color} 0 4px,transparent 4px 8px)\"></div>`).join(\"\") : \"\";\n this.updateToolbar(node, chart, axis, fullscreen);\n });\n }\n\n updateToolbar(node, chart, axis, fullscreen) {\n const target = node.querySelector(\"[data-toolbar]\");\n const focused = fullscreen || this.focusedChartId === chart.id;\n let html = \"\";\n if (axis?.showJumpLatest) html += `<button type=\"button\" data-action=\"jump-latest\" aria-label=\"Jump to latest\" class=\"absolute z-30 inline-flex size-7 items-center justify-center rounded-sm text-foreground hover:bg-accent\" style=\"right:${RIGHT_AXIS_WIDTH + 6}px;bottom:${PLOT_PADDING.bottom + 6}px;background:${withAlpha(this.options.backgroundColor, 0.7)}\">${iconSvg(\"arrowLineRight\")}</button>`;\n if (focused && this.options.showToolbar) {\n const moving = Boolean(this.movingAverageByChart[chart.id]?.enabled);\n const hasDrawings = getDrawingsForChart(this.drawings, chart.id).length > 0;\n html += `<div class=\"absolute left-2 top-12 z-30 flex flex-col gap-0.5 rounded-sm bg-background/80 pr-3 text-foreground shadow-sm backdrop-blur\">`;\n html += toolbarButton({ action: \"fullscreen\", title: fullscreen ? \"Exit fullscreen\" : \"Maximize chart\", hotkey: \"F\", icon: iconSvg(fullscreen ? \"arrowsIn\" : \"arrowsOut\") });\n html += toolbarButton({ action: \"reset\", title: \"Reset chart\", hotkey: \"R\", icon: iconSvg(\"arrowCounterClockwise\") });\n html += toolbarButton({ action: \"rectangle-zoom\", title: \"Rectangle zoom\", hotkey: \"Z\", active: this.rectangleZoomChartId === chart.id, icon: iconSvg(\"magnifyingGlassPlus\") });\n if (!this.options.disableDrawings && hasDrawings) html += toolbarButton({ action: \"clear-drawings\", title: \"Clear drawings\", className: \"text-orange-500\", icon: iconSvg(\"broom\") });\n if (!this.options.disableDrawings) {\n html += '<div class=\"my-1 h-px w-full\"></div>';\n html += toolbarButton({ action: \"tool-trendline\", title: \"Draw trendline\", hotkey: \"T\", active: this.activeDrawingTool === \"trendline\", icon: iconSvg(\"minus\", { className: \"-rotate-45\" }) });\n html += toolbarButton({ action: \"tool-hline\", title: \"Draw horizontal line\", hotkey: \"H\", active: this.activeDrawingTool === \"hline\", icon: iconSvg(\"minus\") });\n html += toolbarButton({ action: \"tool-vline\", title: \"Draw vertical line\", hotkey: \"V\", active: this.activeDrawingTool === \"vline\", icon: iconSvg(\"minus\", { className: \"rotate-90\" }) });\n html += toolbarButton({ action: \"tool-pin\", title: \"Place pin\", hotkey: \"P\", active: this.activeDrawingTool === \"pin\", icon: iconSvg(\"mapPin\") });\n html += toolbarButton({ action: \"moving-average\", title: \"Toggle moving average\", hotkey: \"M\", active: moving, icon: iconSvg(\"waveSine\") });\n }\n html += \"</div>\";\n if (!this.options.disableDrawings && moving) html += this.movingAverageOptionsHtml(chart);\n }\n target.innerHTML = html;\n }\n\n movingAverageOptionsHtml(chart) {\n const moving = this.movingAverageByChart[chart.id] || { enabled: true, period: 21, type: \"ema\", hideBase: false };\n return `<div data-moving-options class=\"absolute right-16 top-2 z-40 flex items-center gap-1 rounded-sm bg-background/85 p-1 text-xs text-foreground shadow-sm\">\n <button type=\"button\" data-action=\"toggle-base\" title=\"${moving.hideBase ? \"Show\" : \"Hide\"} base series\" aria-label=\"${moving.hideBase ? \"Show\" : \"Hide\"} base series\" class=\"inline-flex size-6 items-center justify-center rounded-sm ${moving.hideBase ? \"bg-primary/15 text-primary ring-1 ring-primary/40\" : \"\"}\">${iconSvg(\"eye\", { size: 14 })}</button>\n <button type=\"button\" data-action=\"moving-type\" title=\"Toggle moving average type\" class=\"h-6 rounded-sm px-2 text-[11px] font-semibold uppercase\">${moving.type === \"sma\" ? \"sma\" : \"ema\"}</button>\n <input data-moving-period type=\"number\" min=\"1\" step=\"1\" value=\"${Math.max(1, Number(moving.period) || 21)}\" title=\"Moving average period\" class=\"h-6 w-14 rounded-sm border border-border/50 px-1 text-xs\" />\n </div>`;\n }\n\n renderOverlays() {\n const surface = this.fullscreenChartId ? this.fullscreenOverlay : this.container;\n const overlay = this.fullscreenChartId ? this.fullscreenOverlays : this.overlays;\n const layouts = this.fullscreenChartId ? this.fullscreenLayouts : this.layouts;\n if (!overlay) return;\n overlay.style.height = `${surface.scrollHeight}px`;\n let html = this.drawingOverlayHtml(layouts);\n html += this.topMarkersHtml(layouts);\n html += this.crosshairHtml();\n html += this.rectangleOverlayHtml();\n html += this.drawingOptionsHtml(layouts);\n overlay.innerHTML = html;\n }\n\n drawingOverlayHtml(layouts) {\n const drawings = this.draftDrawing ? [...this.drawings, this.draftDrawing] : this.drawings;\n if (!drawings.length) return \"\";\n const body = layouts.flatMap((layout) => getDrawingsForChart(drawings, layout.chart.id).map((drawing) => {\n const geometry = getDrawingGeometry({ drawing, layout, projectPoint: (point) => this.projectPoint(point, layout) });\n if (!geometry) return \"\";\n const selected = drawing.id === this.selectedDrawingId || drawing.id === \"__draft__\";\n if (drawing.type === \"pin\") {\n const text = escapeHtml(geometry.style.text?.trim() || \"\");\n return `<g opacity=\"${drawing.id === \"__draft__\" ? 0.72 : 1}\"><g transform=\"translate(${geometry.start.x} ${geometry.start.y})\"><path d=\"M0 -11 C-6 -11 -10 -6 -10 -1 C-10 6 -2 12 0 15 C2 12 10 6 10 -1 C10 -6 6 -11 0 -11 Z\" fill=\"${geometry.style.color}\" stroke=\"var(--background,#fff)\" stroke-width=\"1.5\"/><circle cy=\"-2\" r=\"3\" fill=\"var(--background,#fff)\"/></g>${text ? `<text x=\"${geometry.start.x + 14}\" y=\"${geometry.start.y}\" fill=\"${geometry.style.color}\" stroke=\"var(--background,#fff)\" stroke-width=\"3\" paint-order=\"stroke\" font-size=\"12\" font-weight=\"600\">${text}</text>` : \"\"}${selected ? `<circle cx=\"${geometry.start.x}\" cy=\"${geometry.start.y}\" r=\"4\" fill=\"${geometry.style.color}\" stroke=\"var(--background,#fff)\"/>` : \"\"}</g>`;\n }\n return `<g><line data-drawing-line x1=\"${geometry.lineStart.x}\" y1=\"${geometry.lineStart.y}\" x2=\"${geometry.lineEnd.x}\" y2=\"${geometry.lineEnd.y}\" stroke=\"${geometry.style.color}\" stroke-width=\"${geometry.style.lineWidth}\" stroke-dasharray=\"${geometry.style.dashPattern.join(\" \")}\" opacity=\"${drawing.id === \"__draft__\" ? 0.72 : 1}\"/>${selected ? `<circle data-drawing-anchor=\"start\" cx=\"${geometry.start.x}\" cy=\"${geometry.start.y}\" r=\"4\" fill=\"${geometry.style.color}\" stroke=\"var(--background,#fff)\"/>${drawing.type === \"trendline\" ? `<circle data-drawing-anchor=\"end\" cx=\"${geometry.end.x}\" cy=\"${geometry.end.y}\" r=\"4\" fill=\"${geometry.style.color}\" stroke=\"var(--background,#fff)\"/>` : \"\"}` : \"\"}</g>`;\n })).join(\"\");\n return `<svg class=\"pointer-events-none absolute left-0 top-0 z-20 block overflow-visible\" style=\"width:100%;height:100%\">${body}</svg>`;\n }\n\n topMarkersHtml(layouts) {\n if (!this.options.topMarkers?.length) return \"\";\n return layouts.flatMap((layout) => this.options.topMarkers.map((marker, markerIndex) => {\n const value = Number(marker.x ?? marker.step);\n const state = this.viewStates.get(layout.chart.id);\n const ratio = (value - state.xMin) / (state.xMax - state.xMin);\n if (!Number.isFinite(value) || ratio < 0 || ratio > 1) return \"\";\n return `<button type=\"button\" data-marker-index=\"${markerIndex}\" class=\"pointer-events-auto absolute z-30 -translate-x-1/2 rounded-full\" style=\"left:${layout.plot.x + ratio * layout.plot.width}px;top:${layout.plot.y + 4}px\" title=\"${escapeHtml(marker.title || \"\")}\" aria-label=\"${escapeHtml(marker.ariaLabel || marker.title || \"Chart marker\")}\"><span class=\"block size-2.5 rounded-full border border-background shadow-sm\" style=\"background:${marker.color || \"#f97316\"}\"></span></button>`;\n })).join(\"\");\n }\n\n crosshairHtml() {\n const crosshair = this.options.showTooltips ? this.crosshair : null;\n if (!crosshair) return \"\";\n return `<div class=\"pointer-events-none absolute z-20 border-l border-foreground/40\" style=\"left:${crosshair.x}px;top:0;height:100%\"></div><div class=\"pointer-events-none absolute z-20 border-t border-foreground/40\" style=\"top:${crosshair.y}px;left:0;width:100%\"></div>\n ${crosshair.points.map((point) => `<div class=\"pointer-events-none absolute z-30 size-2.5 -translate-x-1/2 -translate-y-1/2 rounded-full border border-background\" style=\"left:${point.x}px;top:${point.y}px;background:${point.color}\"></div>`).join(\"\")}\n <div data-crosshair-tooltip class=\"pointer-events-none absolute z-30 w-[220px] rounded-sm border border-border/70 bg-popover/80 px-2 py-1.5 text-xs text-popover-foreground shadow-sm backdrop-blur-sm\" style=\"left:${crosshair.tooltipX}px;top:${crosshair.tooltipY}px\"><div class=\"mb-1 font-medium\">${escapeHtml(this.options.xAxisLabel)}: ${escapeHtml(this.options.formatXValue(crosshair.xValue))}</div>${crosshair.points.map((point) => `<div class=\"grid grid-cols-[auto_1fr] gap-x-2\"><span class=\"mt-1 size-2 rounded-full\" style=\"background:${point.color}\"></span><div class=\"min-w-0\"><div class=\"truncate text-muted-foreground\">${escapeHtml(point.name)}</div><div class=\"tabular-nums\">${escapeHtml(this.options.formatYValue(point.yValue))}</div></div></div>`).join(\"\")}</div>`;\n }\n\n rectangleOverlayHtml() {\n const rect = this.rectangleZoomRect && normalizeRect(this.rectangleZoomRect.start, this.rectangleZoomRect.end);\n return rect ? `<div class=\"pointer-events-none absolute z-40 rounded-sm border border-primary/70 bg-primary/10\" style=\"left:${rect.left}px;top:${rect.top}px;width:${rect.width}px;height:${rect.height}px\"></div>` : \"\";\n }\n\n drawingOptionsHtml(layouts) {\n const drawing = this.drawings.find((item) => item.id === this.selectedDrawingId);\n if (!drawing) return \"\";\n const layout = layouts.find((item) => item.chart.id === drawing.chartId);\n if (!layout) return \"\";\n const style = drawing.style || {};\n const canExtend = drawing.type === \"trendline\" || drawing.type === \"hline\";\n const canText = drawing.type === \"pin\";\n const left = Math.max(\n layout.rect.x + 42,\n layout.rect.x + layout.rect.width - PLOT_PADDING.right - 8,\n );\n return `<div data-drawing-options class=\"pointer-events-auto absolute z-40 flex items-center gap-1 rounded-sm bg-background/85 p-1 text-xs text-foreground shadow-sm backdrop-blur\" style=\"left:${left}px;top:${layout.plot.y + 6}px;transform:translateX(-100%)\">\n ${canExtend ? `<button type=\"button\" data-action=\"extend-drawing\" class=\"h-6 rounded-sm px-2 text-[11px] font-semibold ${style.extendRight ? \"bg-primary/15 text-primary ring-1 ring-primary/40\" : \"\"}\">Ext</button>` : \"\"}\n ${canText ? `<input data-pin-text type=\"text\" value=\"${escapeHtml(style.text || \"\")}\" placeholder=\"Text\" class=\"h-6 w-24 rounded-sm border border-border/50 px-1.5 text-xs\"/>` : \"\"}\n <input data-drawing-color type=\"color\" value=\"${/^#[0-9a-f]{6}$/i.test(style.color || \"\") ? style.color : \"#60a5fa\"}\" title=\"Line color\" class=\"size-6 rounded-sm border border-border/70\"/>\n </div>`;\n }\n\n projectPoint(point, layout) {\n const state = this.viewStates.get(layout.chart.id);\n const range = applyYScale(getYRange(layout.chart, state.xMin, state.xMax, layout.plot.width), this.yScales.get(layout.chart.id), this.yOffsets.get(layout.chart.id));\n return dataPointToScreenPoint({ point, state, yRange: range, plot: layout.plot });\n }\n\n pointForEvent(event, host) {\n const rect = host.getBoundingClientRect();\n return { x: event.clientX - rect.left + host.scrollLeft, y: event.clientY - rect.top + host.scrollTop };\n }\n\n eventContext(event) {\n const cell = event.target.closest?.(\"[data-chart-index]\");\n if (!cell) return null;\n const fullscreen = Boolean(cell.closest(\"[data-aliencharts-fullscreen]\"));\n const layouts = fullscreen ? this.fullscreenLayouts : this.layouts;\n const index = Number(cell.dataset.chartIndex);\n const layout = fullscreen ? layouts[0] : layouts[index];\n const host = fullscreen ? this.fullscreenOverlay : this.container;\n return layout ? { layout, host, point: this.pointForEvent(event, host), fullscreen } : null;\n }\n\n handleClick(event) {\n const marker = event.target.closest?.(\"[data-marker-index]\");\n if (marker) {\n event.stopPropagation();\n this.options.onTopMarkerClick?.(this.options.topMarkers[Number(marker.dataset.markerIndex)]);\n return;\n }\n const button = event.target.closest?.(\"[data-action]\");\n if (!button) return;\n event.preventDefault();\n event.stopPropagation();\n const context = this.eventContext(event);\n const chartId = context?.layout.chart.id || this.focusedChartId || this.fullscreenChartId;\n switch (button.dataset.action) {\n case \"fullscreen\": this.fullscreenChartId ? this.closeFullscreen() : this.openFullscreen(chartId); break;\n case \"reset\": this.resetChart(chartId); break;\n case \"jump-latest\": this.jumpToLatest(chartId); break;\n case \"rectangle-zoom\": this.rectangleZoomChartId = this.rectangleZoomChartId === chartId ? null : chartId; this.activeDrawingTool = null; this.emit(\"onActiveDrawingToolChange\", null); this.requestRender(); break;\n case \"clear-drawings\": this.options.onClearDrawingsRequest ? this.emit(\"onClearDrawingsRequest\", chartId) : this.setDrawings(this.drawings.filter((item) => item.chartId !== chartId)); break;\n case \"moving-average\": this.toggleMovingAverage(chartId); break;\n case \"tool-trendline\": this.toggleDrawingTool(\"trendline\"); break;\n case \"tool-hline\": this.toggleDrawingTool(\"hline\"); break;\n case \"tool-vline\": this.toggleDrawingTool(\"vline\"); break;\n case \"tool-pin\": this.toggleDrawingTool(\"pin\"); break;\n case \"toggle-base\": this.updateMovingAverage(chartId, { hideBase: !this.movingAverageByChart[chartId]?.hideBase }); break;\n case \"moving-type\": this.updateMovingAverage(chartId, { type: this.movingAverageByChart[chartId]?.type === \"sma\" ? \"ema\" : \"sma\" }); break;\n case \"extend-drawing\": this.updateSelectedDrawing((drawing) => ({ ...drawing, style: { ...drawing.style, extendRight: drawing.style?.extendRight === false } })); break;\n default: break;\n }\n }\n\n handleInput(event) {\n if (event.target.matches(\"[data-moving-period]\")) {\n const context = this.eventContext(event);\n this.updateMovingAverage(context?.layout.chart.id, { period: Math.max(1, Math.round(Number(event.target.value) || 1)) });\n } else if (event.target.matches(\"[data-pin-text]\")) {\n this.updateSelectedDrawing((drawing) => ({ ...drawing, style: { ...drawing.style, text: event.target.value } }));\n } else if (event.target.matches(\"[data-drawing-color]\")) {\n this.updateSelectedDrawing((drawing) => ({ ...drawing, style: { ...drawing.style, color: event.target.value } }));\n }\n }\n\n handlePointerDown(event) {\n if (event.target.closest?.(\"button,input\")) return;\n if (event.button !== 0) return;\n const context = this.eventContext(event);\n if (!context) return;\n const { layout, point } = context;\n this.activePointerContext = context;\n this.focusedChartId = layout.chart.id;\n const inPlot = point.x >= layout.plot.x && point.x <= layout.plot.x + layout.plot.width && point.y >= layout.plot.y && point.y <= layout.plot.y + layout.plot.height;\n if (inPlot && this.activeDrawingTool && !this.options.disableDrawings) {\n const dataPoint = screenPointToDataPoint({ point, chart: layout.chart, plot: layout.plot, initialVisiblePoints: this.options.initialVisiblePoints, viewStateRef: { current: this.viewStates }, yScaleRef: { current: this.yScales }, yCenterOffsetRef: { current: this.yOffsets } });\n if ([\"hline\", \"vline\", \"pin\"].includes(this.activeDrawingTool)) {\n this.commitDrawing(layout.chart.id, this.activeDrawingTool, dataPoint, dataPoint);\n } else if (this.drawingSession?.chartId === layout.chart.id) {\n this.commitDrawing(layout.chart.id, \"trendline\", this.drawingSession.start, dataPoint);\n } else {\n this.drawingSession = { chartId: layout.chart.id, type: \"trendline\", start: dataPoint };\n this.draftDrawing = createDraftDrawing({ chartId: layout.chart.id, type: \"trendline\", start: dataPoint, end: dataPoint });\n }\n } else if (inPlot && this.rectangleZoomChartId === layout.chart.id) {\n this.drag = { type: \"rectangle\", layout, start: point };\n this.rectangleZoomRect = { start: point, end: point };\n } else if (inPlot) {\n const hit = this.hitDrawing(point, layout);\n if (hit) {\n this.selectedDrawingId = hit.drawing.id;\n this.emit(\"onSelectedDrawingIdChange\", hit.drawing.id);\n if (hit.endpoint != null || [\"hline\", \"vline\", \"pin\"].includes(hit.drawing.type)) {\n this.drag = { type: \"drawing-edit\", layout, drawingId: hit.drawing.id, endpoint: hit.endpoint };\n }\n } else {\n this.selectedDrawingId = null;\n this.emit(\"onSelectedDrawingIdChange\", null);\n this.drag = { type: \"pan\", layout, start: point, state: { ...this.viewStates.get(layout.chart.id) }, yOffset: this.yOffsets.get(layout.chart.id) || 0 };\n }\n } else if (point.x >= layout.plot.x + layout.plot.width) {\n this.drag = { type: \"y-scale\", layout, start: point, scale: this.yScales.get(layout.chart.id) || 1 };\n } else if (point.y >= layout.plot.y + layout.plot.height) {\n this.drag = { type: \"x-scale\", layout, start: point, state: { ...this.viewStates.get(layout.chart.id) } };\n }\n context.host.setPointerCapture?.(event.pointerId);\n this.pointerCaptureTarget = context.host;\n this.requestRender();\n }\n\n handlePointerMove(event) {\n if (event.target.closest?.(\"button,input\") && !this.drag && !this.drawingSession) return;\n const context = this.eventContext(event) || (this.activePointerContext && (this.drag || this.drawingSession)\n ? { ...this.activePointerContext, point: this.pointForEvent(event, this.activePointerContext.host) }\n : null);\n if (!context) return this.clearCrosshair();\n const { layout, point } = context;\n if (this.drawingSession) {\n if (layout.chart.id !== this.drawingSession.chartId) return;\n const end = screenPointToDataPoint({ point, chart: layout.chart, plot: layout.plot, initialVisiblePoints: this.options.initialVisiblePoints, viewStateRef: { current: this.viewStates }, yScaleRef: { current: this.yScales }, yCenterOffsetRef: { current: this.yOffsets } });\n this.draftDrawing = createDraftDrawing({ ...this.drawingSession, end });\n this.requestRender();\n return;\n }\n if (this.drag) {\n const { chart, plot } = this.drag.layout;\n if (this.drag.type === \"drawing-edit\") {\n const dataPoint = screenPointToDataPoint({ point, chart, plot, initialVisiblePoints: this.options.initialVisiblePoints, viewStateRef: { current: this.viewStates }, yScaleRef: { current: this.yScales }, yCenterOffsetRef: { current: this.yOffsets } });\n const next = updateDrawingById(this.drawings, this.drag.drawingId, (drawing) => {\n if (drawing.type === \"hline\") {\n const deltaX = (drawing.end?.x ?? drawing.start.x) - drawing.start.x;\n return { ...drawing, start: { x: dataPoint.x, y: dataPoint.y }, end: { x: dataPoint.x + deltaX, y: dataPoint.y } };\n }\n if (drawing.type === \"vline\") return { ...drawing, start: { ...drawing.start, x: dataPoint.x }, end: { ...drawing.end, x: dataPoint.x } };\n if (drawing.type === \"pin\") return { ...drawing, start: dataPoint, end: dataPoint };\n if (this.drag.endpoint === \"start\" || this.drag.endpoint === \"end\") return { ...drawing, [this.drag.endpoint]: dataPoint };\n return drawing;\n });\n this.drawings = next;\n this.emit(\"onDrawingsChange\", [...next]);\n this.requestRender();\n return;\n }\n if (this.drag.type === \"rectangle\") this.rectangleZoomRect = { start: this.drag.start, end: point };\n if (this.drag.type === \"pan\") {\n const span = this.drag.state.xMax - this.drag.state.xMin;\n const deltaX = (point.x - this.drag.start.x) / plot.width * span;\n const baseRange = getYRange(chart, this.drag.state.xMin, this.drag.state.xMax, plot.width);\n const rangeSpan = (baseRange.maxY - baseRange.minY) * (this.yScales.get(chart.id) || 1);\n const deltaY = (point.y - this.drag.start.y) / plot.height * rangeSpan;\n this.viewStates.set(chart.id, { xMin: this.drag.state.xMin - deltaX, xMax: this.drag.state.xMax - deltaX });\n this.yOffsets.set(chart.id, this.drag.yOffset + deltaY);\n }\n if (this.drag.type === \"y-scale\") this.yScales.set(chart.id, clamp(this.drag.scale * Math.exp((point.y - this.drag.start.y) * 0.01), Y_SCALE_MIN, Y_SCALE_MAX));\n if (this.drag.type === \"x-scale\") {\n const center = (this.drag.state.xMin + this.drag.state.xMax) / 2;\n const span = clamp((this.drag.state.xMax - this.drag.state.xMin) * Math.exp((point.x - this.drag.start.x) * 0.01), X_SCALE_MIN_SPAN, X_SCALE_MAX_SPAN);\n this.viewStates.set(chart.id, { xMin: center - span / 2, xMax: center + span / 2 });\n }\n if (this.drag.type === \"pan\") this.updateCrosshair(point, layout);\n else this.requestRender();\n return;\n }\n this.updateCrosshair(point, layout, context.fullscreen);\n }\n\n handlePointerUp(event) {\n if (event.target.closest?.(\"button,input\") && !this.drag && !this.drawingSession) return;\n const context = this.eventContext(event) || (this.activePointerContext\n ? { ...this.activePointerContext, point: this.pointForEvent(event, this.activePointerContext.host) }\n : null);\n if (this.drag?.type === \"rectangle\" && this.rectangleZoomRect) {\n const normalized = normalizeRect(this.rectangleZoomRect.start, this.rectangleZoomRect.end);\n if (normalized?.width >= 4 && normalized?.height >= 4) {\n const layout = this.drag.layout;\n applyRectangleZoom({\n chart: layout.chart,\n plot: layout.plot,\n start: this.rectangleZoomRect.start,\n end: this.rectangleZoomRect.end,\n initialVisiblePoints: this.options.initialVisiblePoints,\n viewStateRef: { current: this.viewStates },\n yScaleRef: { current: this.yScales },\n yCenterOffsetRef: { current: this.yOffsets },\n yManualScaleRef: { current: new Set() },\n });\n }\n this.rectangleZoomChartId = null;\n this.rectangleZoomRect = null;\n }\n this.drag = null;\n this.pointerCaptureTarget?.releasePointerCapture?.(event.pointerId);\n this.pointerCaptureTarget = null;\n this.activePointerContext = null;\n this.requestRender();\n }\n\n handleWheel(event) {\n const context = this.eventContext(event);\n if (!context) return;\n const { layout, point } = context;\n const inPlot = point.x >= layout.plot.x && point.x <= layout.plot.x + layout.plot.width && point.y >= layout.plot.y && point.y <= layout.plot.y + layout.plot.height;\n if (!inPlot) return;\n event.preventDefault();\n const state = this.viewStates.get(layout.chart.id);\n const ratio = clamp((point.x - layout.plot.x) / layout.plot.width, 0, 1);\n const anchor = state.xMin + ratio * (state.xMax - state.xMin);\n const zoom = Math.exp(event.deltaY * 0.001);\n const span = clamp((state.xMax - state.xMin) * zoom, X_SCALE_MIN_SPAN, X_SCALE_MAX_SPAN);\n this.viewStates.set(layout.chart.id, { xMin: anchor - ratio * span, xMax: anchor + (1 - ratio) * span });\n this.requestRender();\n }\n\n handleContextMenu(event) {\n const context = this.eventContext(event);\n if (!context || !this.options.onChartContextMenu) return;\n event.preventDefault();\n const { layout, point } = context;\n const inPlot = point.x >= layout.plot.x && point.x <= layout.plot.x + layout.plot.width && point.y >= layout.plot.y && point.y <= layout.plot.y + layout.plot.height;\n const data = inPlot ? screenPointToDataPoint({ point, chart: layout.chart, plot: layout.plot, initialVisiblePoints: this.options.initialVisiblePoints, viewStateRef: { current: this.viewStates }, yScaleRef: { current: this.yScales }, yCenterOffsetRef: { current: this.yOffsets } }) : null;\n this.options.onChartContextMenu({ chart: layout.chart, event, point: data });\n }\n\n updateCrosshair(point, layout) {\n const inPlot = point.x >= layout.plot.x && point.x <= layout.plot.x + layout.plot.width && point.y >= layout.plot.y && point.y <= layout.plot.y + layout.plot.height;\n if (!inPlot || !this.options.showTooltips) return this.clearCrosshair();\n const state = this.viewStates.get(layout.chart.id);\n const xValue = state.xMin + ((point.x - layout.plot.x) / layout.plot.width) * (state.xMax - state.xMin);\n const range = applyYScale(getYRange(layout.chart, state.xMin, state.xMax, layout.plot.width), this.yScales.get(layout.chart.id), this.yOffsets.get(layout.chart.id));\n const points = layout.chart.series.map((series) => {\n const visible = series.getVisiblePoints(state.xMin, state.xMax, layout.plot.width);\n if (!visible.pointCount) return null;\n const index = getNearestPointIndex(visible.x, xValue);\n const data = { x: visible.x[index], y: visible.y[index] };\n const screen = dataPointToScreenPoint({ point: data, state, yRange: range, plot: layout.plot });\n return { id: series.id, name: series.name, color: series.color, x: screen.x, y: screen.y, xValue: data.x, yValue: data.y };\n }).filter(Boolean);\n if (!points.length) return this.clearCrosshair();\n const nearest = points.reduce((best, item) => Math.abs(item.x - point.x) < Math.abs(best.x - point.x) ? item : best);\n this.crosshair = {\n x: point.x,\n y: point.y,\n xValue: nearest.xValue,\n points,\n tooltipX: point.x + 232 > layout.rect.x + layout.rect.width ? point.x - 232 : point.x + 12,\n tooltipY: clamp(point.y + 12, layout.rect.y + PLOT_PADDING.top, layout.rect.y + layout.rect.height - 96),\n };\n this.requestRender();\n }\n\n clearCrosshair() {\n if (!this.crosshair) return;\n this.crosshair = null;\n this.requestRender();\n }\n\n hitDrawing(point, layout) {\n for (const drawing of getDrawingsForChart(this.drawings, layout.chart.id)) {\n const hit = hitTestDrawing({ point, drawing, layout, projectPoint: (data) => this.projectPoint(data, layout) });\n if (hit) return hit;\n }\n return null;\n }\n\n commitDrawing(chartId, type, start, end) {\n const drawing = createDrawing({ chartId, type, start, end, createDrawingId: this.options.createDrawingId });\n this.setDrawings([...this.drawings, drawing]);\n this.selectedDrawingId = drawing.id;\n this.activeDrawingTool = null;\n this.draftDrawing = null;\n this.drawingSession = null;\n this.emit(\"onSelectedDrawingIdChange\", drawing.id);\n this.emit(\"onActiveDrawingToolChange\", null);\n }\n\n setDrawings(drawings) {\n this.drawings = drawings;\n this.emit(\"onDrawingsChange\", [...drawings]);\n this.requestRender();\n }\n\n updateSelectedDrawing(updater) {\n if (!this.selectedDrawingId) return;\n this.setDrawings(updateDrawingById(this.drawings, this.selectedDrawingId, updater));\n }\n\n toggleDrawingTool(tool) {\n if (!DRAWING_TOOLS.has(tool) || this.options.disableDrawings) return;\n this.activeDrawingTool = this.activeDrawingTool === tool ? null : tool;\n this.rectangleZoomChartId = null;\n this.draftDrawing = null;\n this.drawingSession = null;\n this.emit(\"onActiveDrawingToolChange\", this.activeDrawingTool);\n this.requestRender();\n }\n\n toggleMovingAverage(chartId) {\n if (!chartId || this.options.disableDrawings) return;\n const current = this.movingAverageByChart[chartId] || { period: 21, type: \"ema\", hideBase: false };\n this.movingAverageByChart = { ...this.movingAverageByChart, [chartId]: { ...current, enabled: !current.enabled } };\n this.emit(\"onMovingAverageToggle\", chartId);\n this.requestRender();\n }\n\n updateMovingAverage(chartId, changes) {\n if (!chartId) return;\n const next = { enabled: true, period: 21, type: \"ema\", hideBase: false, ...(this.movingAverageByChart[chartId] || {}), ...changes };\n this.movingAverageByChart = { ...this.movingAverageByChart, [chartId]: next };\n this.emit(\"onMovingAverageChange\", chartId, { ...next });\n this.requestRender();\n }\n\n resetChart(chartId) {\n const chart = this.options.charts.find((item) => item.id === chartId);\n if (!chart) return;\n this.viewStates.set(chartId, getInitialView(chart, this.options.initialVisiblePoints));\n this.yScales.set(chartId, 1);\n this.yOffsets.set(chartId, 0);\n this.requestRender();\n }\n\n openFullscreen(chartId) {\n const chart = this.options.charts.find((item) => item.id === chartId);\n if (!chart || this.fullscreenChartId) return;\n this.fullscreenChartId = chartId;\n const overlay = document.createElement(\"div\");\n overlay.dataset.alienchartsFullscreen = \"\";\n overlay.className = \"aliencharts-root fixed inset-0 z-[60] bg-background p-2\";\n overlay.innerHTML = `<canvas class=\"pointer-events-none absolute left-0 top-0 z-10 block\"></canvas><div data-fullscreen-cell>${chartCellHtml(chart, 0, this.options.backgroundColor)}</div><div data-fullscreen-overlays class=\"pointer-events-none absolute left-0 top-0 z-20\" style=\"width:100%;height:100%\"></div>`;\n document.body.append(overlay);\n this.fullscreenOverlay = overlay;\n this.fullscreenNode = overlay.querySelector(\"[data-chart-index]\");\n this.fullscreenNode.style.height = \"calc(100vh - 16px)\";\n this.fullscreenOverlays = overlay.querySelector(\"[data-fullscreen-overlays]\");\n const canvas = overlay.querySelector(\"canvas\");\n const gl = canvas.getContext(\"webgl2\", { antialias: true, alpha: true, depth: false, stencil: false });\n if (!gl) { overlay.remove(); this.fullscreenChartId = null; return; }\n this.fullscreenSurface = makeSurface(canvas, gl);\n this.fullscreenListeners = Object.entries(this.bound).filter(([name]) => name !== \"keydown\" && name !== \"scroll\");\n this.fullscreenListeners.forEach(([name, handler]) => overlay.addEventListener(name, handler, name === \"wheel\" ? { passive: false } : undefined));\n this.resizeObserver.observe(overlay);\n this.requestRender();\n }\n\n closeFullscreen() {\n if (!this.fullscreenChartId) return;\n if (this.fullscreenOverlay) this.resizeObserver?.unobserve(this.fullscreenOverlay);\n this.fullscreenListeners?.forEach(([name, handler]) => this.fullscreenOverlay?.removeEventListener(name, handler));\n this.fullscreenListeners = null;\n destroySurface(this.fullscreenSurface);\n this.fullscreenOverlay?.remove();\n this.fullscreenSurface = null;\n this.fullscreenOverlay = null;\n this.fullscreenNode = null;\n this.fullscreenOverlays = null;\n this.fullscreenLayouts = [];\n this.fullscreenChartId = null;\n this.requestRender();\n }\n\n handleKeyDown(event) {\n const editable = event.target instanceof HTMLElement && (event.target.isContentEditable || [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(event.target.tagName));\n if (editable) return;\n const chartId = this.fullscreenChartId || this.focusedChartId;\n const key = event.key.toLowerCase();\n if ([\"arrowleft\", \"arrowright\", \"arrowup\", \"arrowdown\"].includes(key) && !this.fullscreenChartId) {\n this.moveFocus(key.replace(\"arrow\", \"\")); event.preventDefault(); return;\n }\n if (key === \"r\") { this.resetChart(chartId); event.preventDefault(); }\n else if (key === \"z\") { this.rectangleZoomChartId = this.rectangleZoomChartId === chartId ? null : chartId; event.preventDefault(); this.requestRender(); }\n else if (key === \"m\") { this.toggleMovingAverage(chartId); event.preventDefault(); }\n else if ([\"t\", \"h\", \"v\", \"p\"].includes(key)) { this.toggleDrawingTool({ t: \"trendline\", h: \"hline\", v: \"vline\", p: \"pin\" }[key]); event.preventDefault(); }\n else if ((key === \"delete\" || key === \"backspace\") && this.selectedDrawingId) { this.setDrawings(removeDrawingById(this.drawings, this.selectedDrawingId)); this.selectedDrawingId = null; this.emit(\"onSelectedDrawingIdChange\", null); event.preventDefault(); }\n else if (key === \"escape\" && (this.activeDrawingTool || this.draftDrawing || this.rectangleZoomChartId)) { this.activeDrawingTool = null; this.draftDrawing = null; this.drawingSession = null; this.rectangleZoomChartId = null; this.rectangleZoomRect = null; this.emit(\"onActiveDrawingToolChange\", null); this.requestRender(); event.preventDefault(); }\n else if (key === \"f\" || (key === \"escape\" && this.fullscreenChartId)) { this.fullscreenChartId ? this.closeFullscreen() : this.openFullscreen(chartId); event.preventDefault(); }\n }\n\n moveFocus(direction) {\n const charts = this.options.charts;\n if (!charts.length) return;\n let index = Math.max(0, charts.findIndex((chart) => chart.id === this.focusedChartId));\n const columns = Math.max(1, Number(this.options.columns) || 1);\n if (direction === \"left\") index = Math.max(Math.floor(index / columns) * columns, index - 1);\n if (direction === \"right\") index = Math.min(charts.length - 1, index + 1);\n if (direction === \"up\") index = Math.max(0, index - columns);\n if (direction === \"down\") index = Math.min(charts.length - 1, index + columns);\n this.focusedChartId = charts[index].id;\n this.chartNodes[index]?.scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n this.requestRender();\n }\n\n emit(name, ...args) {\n this.options[name]?.(...args);\n }\n\n cleanupDom() {\n this.canvas?.remove();\n this.grid?.remove();\n this.overlays?.remove();\n this.addedClasses?.forEach((name) => this.container.classList.remove(name));\n }\n\n destroy() {\n if (this.destroyed) return;\n this.closeFullscreen();\n this.destroyed = true;\n if (this.frame != null) cancelAnimationFrame(this.frame);\n this.animator.destroy();\n this.resizeObserver.disconnect();\n Object.entries(this.bound).forEach(([name, handler]) => {\n const target = name === \"keydown\" ? window : this.container;\n target.removeEventListener(name, handler);\n });\n destroySurface(this.surface);\n this.cleanupDom();\n }\n}\n\nexport const createChartGrid = (container, options = {}) => new ChartGridController(container, options);\n", "import { createSeries } from \"./lodSeries.js\";\n\nconst palette = [\n \"#38bdf8\",\n \"#22c55e\",\n \"#f59e0b\",\n \"#ef4444\",\n \"#a855f7\",\n \"#14b8a6\",\n];\n\nconst createRandom = (seed) => {\n let value = seed >>> 0;\n return () => {\n value = (value * 1664525 + 1013904223) >>> 0;\n return value / 4294967296;\n };\n};\n\nconst makeSeries = ({ chartIndex, seriesIndex, pointCount }) => {\n const x = new Float64Array(pointCount);\n const y = new Float32Array(pointCount);\n const random = createRandom((chartIndex + 1) * 1009 + seriesIndex * 9176);\n const baseline = 15 + random() * 45 + seriesIndex * 4;\n const waveA = 0.0008 + random() * 0.004;\n const waveB = 0.006 + random() * 0.03;\n const waveC = 0.00005 + random() * 0.0006;\n const amplitudeA = 0.015 + random() * 0.09;\n const amplitudeB = 0.005 + random() * 0.04;\n const trend = (random() - 0.5) * 0.004;\n const noise = 0.004 + random() * 0.025;\n const spikeInterval = 180 + Math.floor(random() * 900);\n const spikeMagnitude = 0.12 + random() * 0.7;\n let value = baseline;\n\n for (let i = 0; i < pointCount; i += 1) {\n x[i] = i;\n const spike =\n (i + chartIndex * 13 + seriesIndex * 31) % spikeInterval === 0\n ? spikeMagnitude * (random() > 0.45 ? 1 : -1)\n : 0;\n value +=\n Math.sin(i * waveA + chartIndex) * amplitudeA +\n Math.cos(i * waveB + seriesIndex) * amplitudeB +\n Math.sin(i * waveC) * amplitudeA * 0.35 +\n trend +\n (random() - 0.5) * noise +\n spike;\n y[i] = value;\n }\n\n return createSeries({\n id: `chart-${chartIndex}-series-${seriesIndex}`,\n name: `Run ${seriesIndex + 1}`,\n color: palette[(chartIndex + seriesIndex) % palette.length],\n x,\n y,\n });\n};\n\nexport const createMockCharts = ({\n chartCount = 50,\n seriesPerChart = 2,\n pointCount = 500000,\n} = {}) => {\n return Array.from({ length: chartCount }, (_, chartIndex) => ({\n id: `metric-${chartIndex + 1}`,\n title: `metric_${String(chartIndex + 1).padStart(2, \"0\")}`,\n series: Array.from({ length: seriesPerChart }, (_, seriesIndex) =>\n makeSeries({ chartIndex, seriesIndex, pointCount }),\n ),\n }));\n};\n"],
|
|
5
|
+
"mappings": ";AAAA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACJP,IAAM,QAAQ;AAAA,EACZ,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,uBAAuB;AAAA,EACvB,UAAU;AAAA,EACV,WAAW;AAAA,EACX,OAAO;AAAA,EACP,UAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AACP;AAEA,IAAM,cAAc,oBAAI,IAAI,CAAC,eAAe,CAAC;AAEtC,IAAM,UAAU,CAAC,MAAM,EAAE,OAAO,IAAI,YAAY,GAAG,IAAI,CAAC,MAAM;AACnE,QAAM,OAAO,MAAM,IAAI;AACvB,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,6BAA6B,IAAI,EAAE;AAC9D,QAAM,QAAQ,YAAY,IAAI,IAAI,IAC9B,wBACA;AACJ,SAAO,wEAAwE,IAAI,aAAa,IAAI,YAAY,SAAS,wBAAwB,KAAK,IAAI,IAAI;AAChK;;;ACxBO,IAAM,wBAAwB;AAC9B,IAAM,uBAAuB;AAE7B,IAAM,8BAA8B;AACpC,IAAM,mBAAmB;AACzB,IAAM,gBAAgB,oBAAI,IAAI,CAAC,aAAa,SAAS,SAAS,KAAK,CAAC;AAEpE,IAAM,kBAAkB,CAAC,aAAa;AAAA,EAC3C,OAAO,SAAS,OAAO,SAAS;AAAA,EAChC,WAAW,OAAO,SAAS,SAAS,OAAO,SAAS,IAChD,QAAQ,MAAM,YACd;AAAA,EACJ,aAAa,MAAM,QAAQ,SAAS,OAAO,WAAW,IAClD,QAAQ,MAAM,cACd,CAAC;AAAA,EACL,YAAY,QAAQ,SAAS,OAAO,UAAU;AAAA,EAC9C,aAAa,SAAS,OAAO,gBAAgB;AAAA,EAC7C,MAAM,OAAO,SAAS,OAAO,SAAS,WAAW,QAAQ,MAAM,OAAO;AACxE;AAEO,IAAM,sBAAsB,CAAC,UAAU,YAC5C,MAAM,QAAQ,QAAQ,IAClB,SAAS,OAAO,CAAC,YAAY,SAAS,YAAY,OAAO,IACzD,CAAC;AAEA,IAAM,yBAAyB,CAAC,UAAU;AAAA,EAC/C,OAAO;AAAA,EACP,WAAW;AAAA,EACX,aAAa,CAAC;AAAA,EACd,YAAY;AAAA,EACZ,aAAa,SAAS;AAAA,EACtB,MAAM;AACR;AAEO,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,KACJ,kBAAkB,EAAE,SAAS,KAAK,CAAC,KACnC,GAAG,OAAO,YAAY,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC5E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,KAAK,IAAI;AAAA,IACpB,OAAO,uBAAuB,IAAI;AAAA,EACpC;AACF;AAEO,IAAM,qBAAqB,CAAC,EAAE,SAAS,MAAM,OAAO,IAAI,OAAO;AAAA,EACpE,IAAI;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW,KAAK,IAAI;AAAA,EACpB,OAAO,uBAAuB,IAAI;AACpC;AAEA,IAAM,0BAA0B,CAAC,QAAQ,SAAS,SAAS;AACzD,QAAM,KAAK,QAAQ,IAAI,OAAO;AAC9B,QAAM,KAAK,QAAQ,IAAI,OAAO;AAC9B,MAAI,KAAK,IAAI,EAAE,KAAK,QAAY,KAAK,IAAI,EAAE,KAAK,KAAU,QAAO;AAEjE,QAAM,aAAa,CAAC;AACpB,MAAI,KAAK,KAAU,YAAW,MAAM,KAAK,IAAI,KAAK,QAAQ,OAAO,KAAK,EAAE;AAAA,WAC/D,KAAK,MAAW,YAAW,MAAM,KAAK,IAAI,OAAO,KAAK,EAAE;AACjE,MAAI,KAAK,KAAU,YAAW,MAAM,KAAK,IAAI,KAAK,SAAS,OAAO,KAAK,EAAE;AAAA,WAChE,KAAK,MAAW,YAAW,MAAM,KAAK,IAAI,OAAO,KAAK,EAAE;AAEjE,QAAM,gBAAgB,KAAK;AAAA,IACzB,GAAG,WAAW,OAAO,CAACA,WAAU,OAAO,SAASA,MAAK,KAAKA,UAAS,CAAC;AAAA,EACtE;AACA,QAAM,QAAQ,OAAO,SAAS,aAAa,IAAI,KAAK,IAAI,GAAG,aAAa,IAAI;AAC5E,SAAO;AAAA,IACL,GAAG,OAAO,IAAI,KAAK;AAAA,IACnB,GAAG,OAAO,IAAI,KAAK;AAAA,EACrB;AACF;AAEO,IAAM,qBAAqB,CAAC,EAAE,SAAS,QAAQ,aAAa,MAAM;AACvE,MAAI,CAAC,SAAS,SAAS,CAAC,SAAS,IAAK,QAAO;AAC7C,QAAM,QAAQ,aAAa,QAAQ,OAAO,MAAM;AAChD,QAAM,MAAM,aAAa,QAAQ,KAAK,MAAM;AAC5C,QAAM,QAAQ,gBAAgB,OAAO;AACrC,MAAI,YAAY;AAChB,MAAI,UAAU;AAEd,MAAI,QAAQ,SAAS,OAAO;AAC1B,WAAO,EAAE,OAAO,KAAK,OAAO,WAAW,OAAO,SAAS,OAAO,MAAM;AAAA,EACtE;AAEA,MAAI,QAAQ,SAAS,SAAS;AAC5B,UAAM,WACJ,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,OAAW,IAAI,IAAI,OAAO,KAAK,IAAI,OAAO,KAAK;AAC7E,gBAAY;AAAA,MACV,GAAG,MAAM,cAAc,OAAO,KAAK,IAAI,MAAM;AAAA,MAC7C,GAAG,MAAM;AAAA,IACX;AACA,cAAU;AAAA,MACR,GAAG,MAAM,cAAc,OAAO,KAAK,IAAI,OAAO,KAAK,QAAQ;AAAA,MAC3D,GAAG,MAAM;AAAA,IACX;AAAA,EACF,WAAW,QAAQ,SAAS,SAAS;AACnC,gBAAY;AAAA,MACV,GAAG,MAAM;AAAA,MACT,GAAG,OAAO,KAAK;AAAA,IACjB;AACA,cAAU;AAAA,MACR,GAAG,MAAM;AAAA,MACT,GAAG,OAAO,KAAK,IAAI,OAAO,KAAK;AAAA,IACjC;AAAA,EACF,WAAW,QAAQ,SAAS,aAAa;AACvC,QAAI,MAAM,WAAY,aAAY,wBAAwB,KAAK,OAAO,OAAO,IAAI;AACjF,QAAI,MAAM,YAAa,WAAU,wBAAwB,OAAO,KAAK,OAAO,IAAI;AAAA,EAClF;AAEA,SAAO,EAAE,OAAO,KAAK,WAAW,SAAS,MAAM;AACjD;AAEO,IAAM,oBAAoB,CAAC,OAAO,OAAO,QAAQ;AACtD,QAAM,KAAK,IAAI,IAAI,MAAM;AACzB,QAAM,KAAK,IAAI,IAAI,MAAM;AACzB,MAAI,OAAO,KAAK,OAAO,GAAG;AACxB,WAAO,KAAK,MAAM,MAAM,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC;AAAA,EACxD;AACA,QAAM,IAAI,KAAK;AAAA,IACb;AAAA,IACA,KAAK;AAAA,MACH;AAAA,QACE,MAAM,IAAI,MAAM,KAAK,MAAM,MAAM,IAAI,MAAM,KAAK,OAAO,KAAK,KAAK,KAAK;AAAA,IAC1E;AAAA,EACF;AACA,SAAO,KAAK,MAAM,MAAM,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,KAAK,MAAM,IAAI,IAAI,GAAG;AAC9E;AAEO,IAAM,iBAAiB,CAAC,EAAE,OAAO,SAAS,QAAQ,aAAa,MAAM;AAC1E,QAAM,WAAW,mBAAmB;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,CAAC,SAAU,QAAO;AACtB,MACE,QAAQ,SAAS,SACjB,KAAK,MAAM,MAAM,IAAI,SAAS,MAAM,GAAG,MAAM,IAAI,SAAS,MAAM,CAAC,KACjE,6BACA;AACA,WAAO,EAAE,SAAS,UAAU,QAAQ;AAAA,EACtC;AACA,MACE,QAAQ,SAAS,SACjB,KAAK,MAAM,MAAM,IAAI,SAAS,MAAM,GAAG,MAAM,IAAI,SAAS,MAAM,CAAC,KAC/D,kBACF;AACA,WAAO,EAAE,SAAS,UAAU,OAAO;AAAA,EACrC;AACA,MACE,QAAQ,SAAS,eACjB,KAAK,MAAM,MAAM,IAAI,SAAS,IAAI,GAAG,MAAM,IAAI,SAAS,IAAI,CAAC,KAC3D,6BACF;AACA,WAAO,EAAE,SAAS,UAAU,MAAM;AAAA,EACpC;AACA,QAAM,WAAW,kBAAkB,OAAO,SAAS,WAAW,SAAS,OAAO;AAC9E,SAAO,YAAY,uBAAuB,EAAE,SAAS,UAAU,KAAK,IAAI;AAC1E;AAEO,IAAM,oBAAoB,CAAC,UAAU,WAAW,aACpD,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,GAAG;AAAA,EAAI,CAAC,YAC7C,SAAS,OAAO,YAAY,QAAQ,OAAO,IAAI;AACjD;AAEK,IAAM,oBAAoB,CAAC,UAAU,eACzC,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,GAAG;AAAA,EACxC,CAAC,YAAY,SAAS,OAAO;AAC/B;;;ACtLF,IAAM,qBAAqB;AAE3B,IAAM,eAAe,CAAC,OAAO,SAAS;AACpC,MAAI,iBAAiB,KAAM,QAAO;AAClC,MAAI,YAAY,OAAO,KAAK,EAAG,QAAO,IAAI,KAAK,KAAK;AACpD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,IAAI,KAAK,KAAK;AAC/C,SAAO,IAAI,KAAK,CAAC;AACnB;AAEA,IAAM,aAAa,CAAC,OAAO,UAAU;AACnC,MAAI,KAAK;AACT,MAAI,KAAK,MAAM;AACf,SAAO,KAAK,IAAI;AACd,UAAM,MAAO,KAAK,MAAO;AACzB,QAAI,MAAM,GAAG,IAAI,MAAO,MAAK,MAAM;AAAA,QAC9B,MAAK;AAAA,EACZ;AACA,SAAO;AACT;AAEA,IAAM,aAAa,CAAC,OAAO,UAAU;AACnC,MAAI,KAAK;AACT,MAAI,KAAK,MAAM;AACf,SAAO,KAAK,IAAI;AACd,UAAM,MAAO,KAAK,MAAO;AACzB,QAAI,MAAM,GAAG,KAAK,MAAO,MAAK,MAAM;AAAA,QAC/B,MAAK;AAAA,EACZ;AACA,SAAO;AACT;AAEA,IAAM,mBAAmB,CAAC,SAAS,UAAU;AAC3C,MAAI,QAAQ,EAAG;AACf,MAAI,QAAQ,SAAS,KAAK,EAAG;AAC7B,UAAQ,KAAK,KAAK;AACpB;AAEA,IAAM,WAAW,CAAC,MAAM,MAAM,YAAY,aAAa,GAAG,WAAW,KAAK,WAAW;AACnF,MAAI,cAAc,KAAK,KAAK,UAAU,YAAY;AAChD,WAAO,EAAE,GAAG,MAAM,GAAG,MAAM,YAAY,EAAE;AAAA,EAC3C;AAEA,QAAM,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,aAAa,UAAU,IAAI,UAAU;AACjF,QAAM,aAAa,KAAK,IAAI,KAAK,QAAQ,QAAQ;AACjD,QAAM,YAAY,KAAK,MAAM,aAAa,gBAAgB,UAAU,IAAI;AACxE,QAAM,IAAI,IAAI,aAAa,SAAS;AACpC,QAAM,IAAI,IAAI,aAAa,SAAS;AACpC,MAAI,MAAM;AAEV,WAAS,QAAQ,cAAc,QAAQ,YAAY,SAAS,YAAY;AACtE,UAAM,MAAM,KAAK,IAAI,YAAY,QAAQ,UAAU;AACnD,QAAI,WAAW;AACf,QAAI,WAAW;AACf,aAAS,IAAI,QAAQ,GAAG,IAAI,KAAK,KAAK,GAAG;AACvC,UAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAG,YAAW;AACzC,UAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAG,YAAW;AAAA,IAC3C;AAEA,UAAM,UAAU,CAAC;AACjB,qBAAiB,SAAS,KAAK;AAC/B,qBAAiB,SAAS,QAAQ;AAClC,qBAAiB,SAAS,QAAQ;AAClC,qBAAiB,SAAS,MAAM,CAAC;AACjC,YAAQ,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAE5B,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;AAC1C,YAAM,cAAc,QAAQ,CAAC;AAC7B,QAAE,GAAG,IAAI,KAAK,WAAW;AACzB,QAAE,GAAG,IAAI,KAAK,WAAW;AACzB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG,EAAE,SAAS,GAAG,GAAG;AAAA,IACpB,GAAG,EAAE,SAAS,GAAG,GAAG;AAAA,IACpB;AAAA,EACF;AACF;AAEA,IAAM,cAAc,CAAC,MAAM,MAAM,UAAU;AACzC,MAAI,CAAC,MAAM,OAAQ,QAAO;AAC1B,MAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,QAAM,MAAM,IAAI,KAAK,KAAK,SAAS,MAAM,MAAM;AAC/C,MAAI,IAAI,MAAM,CAAC;AACf,MAAI,IAAI,OAAO,KAAK,MAAM;AAC1B,SAAO;AACT;AAEO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAY,EAAE,IAAI,MAAM,OAAO,GAAG,GAAG,YAAY,mBAAmB,GAAG;AACrE,SAAK,KAAK;AACV,SAAK,OAAO,QAAQ;AACpB,SAAK,QAAQ,SAAS;AACtB,SAAK,YAAY;AACjB,UAAM,WAAW,aAAa,GAAG,YAAY;AAC7C,UAAM,WAAW,aAAa,GAAG,YAAY;AAC7C,SAAK,UAAU,KAAK,IAAI,SAAS,QAAQ,SAAS,MAAM;AACxD,UAAM,WAAW,KAAK,IAAI,GAAG,KAAK,OAAO;AACzC,SAAK,OAAO,IAAI,aAAa,QAAQ;AACrC,SAAK,OAAO,IAAI,aAAa,QAAQ;AACrC,SAAK,KAAK,IAAI,SAAS,SAAS,GAAG,KAAK,OAAO,CAAC;AAChD,SAAK,KAAK,IAAI,SAAS,SAAS,GAAG,KAAK,OAAO,CAAC;AAChD,SAAK,SAAS,CAAC;AACf,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAO,SAAS,SAAS;AACvB,UAAM,QAAQ,aAAa,SAAS,YAAY;AAChD,UAAM,QAAQ,aAAa,SAAS,YAAY;AAChD,UAAM,eAAe,KAAK,IAAI,MAAM,QAAQ,MAAM,MAAM;AACxD,QAAI,iBAAiB,EAAG;AAExB,UAAM,gBAAgB,KAAK;AAC3B,SAAK,kBAAkB,gBAAgB,YAAY;AACnD,SAAK,KAAK,IAAI,MAAM,SAAS,GAAG,YAAY,GAAG,aAAa;AAC5D,SAAK,KAAK,IAAI,MAAM,SAAS,GAAG,YAAY,GAAG,aAAa;AAC5D,SAAK,UAAU,gBAAgB;AAC/B,SAAK,gBAAgB,aAAa;AAAA,EACpC;AAAA,EAEA,gBAAgB;AACd,UAAM,OAAO,KAAK,KAAK,SAAS,GAAG,KAAK,MAAM;AAC9C,UAAM,OAAO,KAAK,KAAK,SAAS,GAAG,KAAK,MAAM;AAC9C,SAAK,SAAS,CAAC,EAAE,GAAG,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;AAElD,QAAI,aAAa;AACjB,WACE,KAAK,OAAO,SAAS,KAAK,aAC1B,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,GACpC;AACA,WAAK,OAAO,KAAK,SAAS,MAAM,MAAM,UAAU,CAAC;AACjD,oBAAc;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,kBAAkB,gBAAgB;AAChC,QAAI,kBAAkB,KAAK,KAAK,UAAU,kBAAkB,KAAK,KAAK,QAAQ;AAC5E;AAAA,IACF;AACA,UAAM,eAAe,KAAK,IAAI,gBAAgB,KAAK,KAAK,KAAK,KAAK,SAAS,GAAG,CAAC;AAC/E,UAAM,OAAO,IAAI,aAAa,YAAY;AAC1C,UAAM,OAAO,IAAI,aAAa,YAAY;AAC1C,SAAK,IAAI,KAAK,KAAK,SAAS,GAAG,KAAK,MAAM,CAAC;AAC3C,SAAK,IAAI,KAAK,KAAK,SAAS,GAAG,KAAK,MAAM,CAAC;AAC3C,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,gBAAgB,gBAAgB;AAC9B,UAAM,OAAO,KAAK,KAAK,SAAS,GAAG,KAAK,MAAM;AAC9C,UAAM,OAAO,KAAK,KAAK,SAAS,GAAG,KAAK,MAAM;AAC9C,SAAK,OAAO,CAAC,IAAI,EAAE,GAAG,MAAM,GAAG,MAAM,YAAY,EAAE;AAEnD,QAAI,aACF,KAAK,OAAO,SAAS,IACjB,KAAK,OAAO,KAAK,OAAO,SAAS,CAAC,EAAE,aAAa,IACjD;AACN,WACE,KAAK,OAAO,SAAS,KAAK,aAC1B,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,GACpC;AACA,WAAK,OAAO,KAAK,SAAS,MAAM,MAAM,UAAU,CAAC;AACjD,oBAAc;AAAA,IAChB;AAEA,aAAS,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC9C,YAAM,QAAQ,KAAK,OAAO,CAAC;AAC3B,YAAM,gBACJ,KAAK,MAAM,iBAAiB,MAAM,UAAU,IAAI,MAAM;AACxD,YAAM,YAAY,KAAK,IAAI,MAAM,aAAa,eAAe,aAAa;AAAA,IAC5E;AAAA,EACF;AAAA,EAEA,YAAY,OAAO;AACjB,UAAM,QAAQ,KAAK,OAAO,KAAK;AAC/B,QAAI,CAAC,SAAS,UAAU,KAAK,MAAM,aAAa,KAAM,QAAO;AAE7D,UAAM,OAAO,KAAK,KAAK,SAAS,GAAG,KAAK,MAAM;AAC9C,UAAM,OAAO,KAAK,KAAK,SAAS,GAAG,KAAK,MAAM;AAC9C,UAAM,gBACJ,KAAK,MAAM,MAAM,YAAY,MAAM,UAAU,IAAI,MAAM;AACzD,UAAM,UAAU,KAAK,aAAa,KAAK,KAAK,CAAC,KAAK;AAClD,UAAM,YAAY,WAAW,MAAM,GAAG,OAAO;AAC7C,UAAM,OAAO,SAAS,MAAM,MAAM,MAAM,YAAY,eAAe,KAAK,MAAM;AAC9E,SAAK,OAAO,KAAK,IAAI;AAAA,MACnB,GAAG,YAAY,cAAc,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,KAAK,CAAC;AAAA,MACnE,GAAG,YAAY,cAAc,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,KAAK,CAAC;AAAA,MACnE,YAAY,MAAM;AAAA,IACpB;AACA,WAAO,KAAK,OAAO,KAAK;AAAA,EAC1B;AAAA,EAEA,YAAY,MAAM,MAAM,YAAY,uBAAuB,KAAK;AAC9D,UAAM,OAAO,KAAK,OAAO,CAAC,EAAE;AAC5B,QAAI,KAAK,WAAW,EAAG,QAAO,KAAK,OAAO,CAAC;AAE3C,UAAM,OAAO,WAAW,MAAM,IAAI;AAClC,UAAM,KAAK,WAAW,MAAM,IAAI;AAChC,UAAM,mBAAmB,KAAK,IAAI,GAAG,KAAK,IAAI;AAC9C,UAAM,eAAe,KAAK,IAAI,IAAI,aAAa,oBAAoB;AACnE,UAAM,gBAAgB,KAAK,IAAI,GAAG,mBAAmB,YAAY;AAEjE,QAAI,gBAAgB;AACpB,aAAS,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC9C,UAAI,KAAK,OAAO,CAAC,EAAE,cAAc,eAAe;AAC9C,wBAAgB;AAAA,MAClB,OAAO;AACL;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK,YAAY,aAAa;AAAA,EACvC;AAAA,EAEA,iBAAiB,MAAM,MAAM,YAAY;AACvC,UAAM,QAAQ,KAAK,YAAY,MAAM,MAAM,UAAU;AACrD,UAAM,QAAQ,KAAK,IAAI,GAAG,WAAW,MAAM,GAAG,IAAI,IAAI,CAAC;AACvD,UAAM,MAAM,KAAK,IAAI,MAAM,EAAE,QAAQ,WAAW,MAAM,GAAG,IAAI,IAAI,CAAC;AAClE,WAAO;AAAA,MACL,GAAG,MAAM,EAAE,SAAS,OAAO,GAAG;AAAA,MAC9B,GAAG,MAAM,EAAE,SAAS,OAAO,GAAG;AAAA,MAC9B,YAAY,MAAM;AAAA,MAClB,YAAY,KAAK,IAAI,GAAG,MAAM,KAAK;AAAA,IACrC;AAAA,EACF;AACF;AAEO,IAAM,eAAe,CAAC,YAAY,IAAI,WAAW,OAAO;;;ACrO/D,IAAM,eAAe;AACrB,IAAM,mBAAmB;AACzB,IAAM,eAAe;AAAA,EACnB,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AACV;AACA,IAAM,cAAc;AACpB,IAAM,cAAc;AACpB,IAAM,oBAAoB;AAC1B,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AACzB,IAAM,kCAAkC;AACxC,IAAM,8BAA8B;AACpC,IAAM,yBAAyB;AAC/B,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AACzB,IAAM,iBAAiB;AACvB,IAAM,cAAc;AAGpB,IAAM,2BAA2B;AAEjC,IAAM,eAAe,CAAC;AAEtB,IAAM,WAAW,CAAC,UAAU;AAC1B,QAAM,QAAQ,OAAO,SAAS,SAAS,EAAE,QAAQ,KAAK,EAAE;AACxD,QAAM,aACJ,MAAM,WAAW,IACb,MACG,MAAM,EAAE,EACR,IAAI,CAAC,SAAS,OAAO,IAAI,EACzB,KAAK,EAAE,IACV,MAAM,OAAO,GAAG,GAAG,EAAE,MAAM,GAAG,CAAC;AACrC,QAAM,SAAS,OAAO,SAAS,YAAY,EAAE;AAC7C,SAAO;AAAA,KACH,UAAU,KAAM,OAAO;AAAA,KACvB,UAAU,IAAK,OAAO;AAAA,KACvB,SAAS,OAAO;AAAA,EACnB;AACF;AAEA,IAAM,uBAAuB,CAAC,oBAAoB;AAChD,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI,SAAS,eAAe;AAC1C,QAAM,WAAW,CAAC,UAChB,SAAS,UAAU,QAAQ,UAAU,QAAQ,SAAS,UAAU;AAClE,QAAM,YACJ,SAAS,SAAS,CAAC,IAAI,SAAS,SAAS,CAAC,IAAI,SAAS,SAAS,CAAC;AACnE,SAAO,YAAY,OAAO,YAAY;AACxC;AAEA,IAAM,0BAA0B,CAAC,WAAW;AAC1C,MAAI,OAAO,wBAAwB,OAAO,OAAO;AAC/C,WAAO,sBAAsB,OAAO;AACpC,WAAO,mBAAmB,qBAAqB,OAAO,KAAK;AAAA,EAC7D;AACA,SAAO,OAAO;AAChB;AAEA,IAAM,gBAAgB,CAAC,OAAO;AAC5B,QAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBrB,QAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUvB,QAAM,UAAU,CAAC,MAAM,WAAW;AAChC,UAAM,SAAS,GAAG,aAAa,IAAI;AACnC,OAAG,aAAa,QAAQ,MAAM;AAC9B,OAAG,cAAc,MAAM;AACvB,QAAI,CAAC,GAAG,mBAAmB,QAAQ,GAAG,cAAc,GAAG;AACrD,YAAM,IAAI,MAAM,GAAG,iBAAiB,MAAM,KAAK,uBAAuB;AAAA,IACxE;AACA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,GAAG,cAAc;AACjC,KAAG,aAAa,SAAS,QAAQ,GAAG,eAAe,YAAY,CAAC;AAChE,KAAG,aAAa,SAAS,QAAQ,GAAG,iBAAiB,cAAc,CAAC;AACpE,KAAG,YAAY,OAAO;AACtB,MAAI,CAAC,GAAG,oBAAoB,SAAS,GAAG,WAAW,GAAG;AACpD,UAAM,IAAI,MAAM,GAAG,kBAAkB,OAAO,KAAK,qBAAqB;AAAA,EACxE;AACA,SAAO;AACT;AAEA,IAAM,yBAAyB,CAAC,OAAO;AACrC,QAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0CrB,QAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBvB,QAAM,UAAU,CAAC,MAAM,WAAW;AAChC,UAAM,SAAS,GAAG,aAAa,IAAI;AACnC,OAAG,aAAa,QAAQ,MAAM;AAC9B,OAAG,cAAc,MAAM;AACvB,QAAI,CAAC,GAAG,mBAAmB,QAAQ,GAAG,cAAc,GAAG;AACrD,YAAM,IAAI,MAAM,GAAG,iBAAiB,MAAM,KAAK,uBAAuB;AAAA,IACxE;AACA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,GAAG,cAAc;AACjC,KAAG,aAAa,SAAS,QAAQ,GAAG,eAAe,YAAY,CAAC;AAChE,KAAG,aAAa,SAAS,QAAQ,GAAG,iBAAiB,cAAc,CAAC;AACpE,KAAG,YAAY,OAAO;AACtB,MAAI,CAAC,GAAG,oBAAoB,SAAS,GAAG,WAAW,GAAG;AACpD,UAAM,IAAI,MAAM,GAAG,kBAAkB,OAAO,KAAK,qBAAqB;AAAA,EACxE;AACA,SAAO;AACT;AAEA,IAAM,0BAA0B,MAAM,oBAAI,IAAI;AAE9C,IAAM,wBAAwB,CAAC,iBAAiB,qBAAqB;AACnE,MAAI,eAAe,KAAK;AAAA,IACtB;AAAA,IACA,mBAAmB;AAAA,EACrB;AACA,SAAO,eAAe,kBAAkB;AACtC,oBAAgB;AAAA,EAClB;AACA,SAAO;AACT;AAEA,IAAM,kBAAkB,CAAC,IAAI,OAAO,UAAU,eAAe;AAC3D,QAAM,uBAAuB,aAAa;AAC1C,MAAI,QAAQ,MAAM,IAAI,QAAQ;AAC9B,MAAI,CAAC,OAAO;AACV,YAAQ;AAAA,MACN,QAAQ,GAAG,aAAa;AAAA,MACxB,aAAa;AAAA,MACb,UAAU,IAAI;AAAA,QACZ,sBAAsB,GAAG,oBAAoB;AAAA,MAC/C;AAAA,IACF;AACA,UAAM,IAAI,UAAU,KAAK;AAAA,EAC3B;AAEA,MAAI,MAAM,SAAS,SAAS,sBAAsB;AAChD,UAAM,WAAW,IAAI;AAAA,MACnB,sBAAsB,MAAM,SAAS,QAAQ,oBAAoB;AAAA,IACnE;AAAA,EACF;AAEA,MAAI,MAAM,cAAc,MAAM,SAAS,QAAQ;AAC7C,UAAM,cAAc,MAAM,SAAS;AACnC,OAAG,WAAW,GAAG,cAAc,MAAM,MAAM;AAC3C,OAAG;AAAA,MACD,GAAG;AAAA,MACH,MAAM,cAAc,aAAa;AAAA,MACjC,GAAG;AAAA,IACL;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,2BAA2B,CAAC,IAAI,OAAO,UAAU,eAAe;AACpE,QAAM,eAAe,KAAK,IAAI,GAAG,aAAa,CAAC;AAC/C,QAAM,uBAAuB,eAAe,IAAI;AAChD,MAAI,QAAQ,MAAM,IAAI,QAAQ;AAC9B,MAAI,CAAC,OAAO;AACV,YAAQ;AAAA,MACN,QAAQ,GAAG,aAAa;AAAA,MACxB,aAAa;AAAA,MACb,UAAU,IAAI;AAAA,QACZ,sBAAsB,GAAG,oBAAoB;AAAA,MAC/C;AAAA,IACF;AACA,UAAM,IAAI,UAAU,KAAK;AAAA,EAC3B;AAEA,MAAI,MAAM,SAAS,SAAS,sBAAsB;AAChD,UAAM,WAAW,IAAI;AAAA,MACnB,sBAAsB,MAAM,SAAS,QAAQ,oBAAoB;AAAA,IACnE;AAAA,EACF;AAEA,MAAI,MAAM,cAAc,MAAM,SAAS,QAAQ;AAC7C,UAAM,cAAc,MAAM,SAAS;AACnC,OAAG,WAAW,GAAG,cAAc,MAAM,MAAM;AAC3C,OAAG;AAAA,MACD,GAAG;AAAA,MACH,MAAM,cAAc,aAAa;AAAA,MACjC,GAAG;AAAA,IACL;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,sBAAsB,CAAC,IAAI,UAAU;AACzC,QAAM,QAAQ,CAAC,UAAU;AACvB,QAAI,MAAM,OAAQ,IAAG,aAAa,MAAM,MAAM;AAAA,EAChD,CAAC;AACD,QAAM,MAAM;AACd;AAEA,IAAM,mBAAmB,CAAC,EAAE,UAAU,eAAe,YAAY,cAAc,MAAM;AACnF,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK,GAAG;AACtC,QAAI,iBAAiB,MAAM,cAAc,OAAO;AAC9C,eAAS,IAAI,CAAC,IAAI,cAAc;AAChC,eAAS,IAAI,IAAI,CAAC,IAAI,cAAc;AACpC;AAAA,IACF;AACA,aAAS,IAAI,CAAC,IAAI,cAAc,EAAE,CAAC;AACnC,aAAS,IAAI,IAAI,CAAC,IAAI,cAAc,EAAE,CAAC;AAAA,EACzC;AACF;AAEA,IAAM,qBAAqB,CAAC,EAAE,GAAG,GAAG,OAAO,QAAQ,KAAK,OAAO;AAAA,EAC7D,GAAG,KAAK,KAAM,IAAI,MAAM,SAAS,MAAM,OAAO,MAAM,QAAS,KAAK;AAAA,EAClE,GAAG,KAAK,KAAM,OAAO,OAAO,MAAM,OAAO,OAAO,OAAO,QAAS,KAAK;AACvE;AAgBA,IAAM,kBAAkB,CAAC,UAAU,QAAQ,GAAG,MAAM;AAClD,WAAS,MAAM,IAAI;AACnB,WAAS,SAAS,CAAC,IAAI;AACzB;AAEA,IAAM,2BAA2B,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,SAAS;AACb,MAAI,WAAW;AACf,QAAM,YAAY,iBAAiB;AAEnC,WAAS,IAAI,GAAG,IAAI,aAAa,GAAG,KAAK,GAAG;AAC1C,UAAM,QAAQ;AAAA,MACZ,GAAG,cAAc,EAAE,CAAC;AAAA,MACpB,GAAG,cAAc,EAAE,CAAC;AAAA,IACtB;AACA,UAAM,MAAM;AAAA,MACV,GAAG,cAAc,EAAE,IAAI,CAAC;AAAA,MACxB,GAAG,cAAc,EAAE,IAAI,CAAC;AAAA,IAC1B;AACA,UAAM,UAAU,mBAAmB,EAAE,GAAG,OAAO,OAAO,QAAQ,KAAK,CAAC;AACpE,UAAM,QAAQ,mBAAmB,EAAE,GAAG,KAAK,OAAO,QAAQ,KAAK,CAAC;AAChE,UAAM,cAAc,KAAK,MAAM,MAAM,IAAI,QAAQ,GAAG,MAAM,IAAI,QAAQ,CAAC;AACvE,QAAI,CAAC,OAAO,SAAS,WAAW,KAAK,eAAe,EAAG;AAEvD,QAAI,WAAW;AACf,WAAO,WAAW,aAAa;AAC7B,YAAM,QAAQ,WAAW;AACzB,YAAM,WACJ,QAAQ,iBAAiB,iBAAiB,QAAQ,YAAY;AAChE,YAAM,OAAO,KAAK,IAAI,UAAU,cAAc,QAAQ;AACtD,UAAI,QAAQ,gBAAgB;AAC1B,YAAI,SAAS,IAAI,SAAS,QAAQ;AAChC,iBAAO,SAAS;AAAA,QAClB;AACA,cAAM,KAAK,WAAW;AACtB,cAAM,MAAM,WAAW,QAAQ;AAC/B;AAAA,UACE;AAAA,UACA;AAAA,UACA,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK;AAAA,UAC9B,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK;AAAA,QAChC;AACA,kBAAU;AACV;AAAA,UACE;AAAA,UACA;AAAA,UACA,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK;AAAA,UAC9B,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK;AAAA,QAChC;AACA,kBAAU;AAAA,MACZ;AACA,kBAAY;AACZ,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,SAAO,SAAS;AAClB;AAEA,IAAM,iBAAiB,CAAC,eAAe,eAAe,UAAU;AAC9D,MAAI,iBAAiB,UAAU,cAAc,OAAO;AAClD,WAAO,EAAE,GAAG,cAAc,GAAG,GAAG,cAAc,EAAE;AAAA,EAClD;AACA,SAAO,EAAE,GAAG,cAAc,EAAE,KAAK,GAAG,GAAG,cAAc,EAAE,KAAK,EAAE;AAChE;AAEA,IAAM,wBAAwB,CAAC,EAAE,QAAQ,OAAO,QAAQ,KAAK,MAAM;AACjE,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,IAAI,OAAO,KAAK,CAAC;AACvB,QAAM,IAAI,OAAO,KAAK,CAAC;AACvB,MAAI,IAAI,MAAM,QAAQ,IAAI,MAAM,QAAQ,IAAI,OAAO,QAAQ,IAAI,OAAO,MAAM;AAC1E,WAAO;AAAA,EACT;AAEA,QAAM,aAAc,MAAM,OAAO,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK,IAAK;AAC1E,SAAO;AAAA,IACL,GAAG,IAAI,aAAa,CAAC,IAAI,WAAW,IAAI,SAAS,CAAC;AAAA,IAClD,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;AAAA,IAC1B,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,UAAU,EAAE,GAAG,EAAE;AAAA,EACnB;AACF;AAEA,IAAM,uBAAuB,CAC3B,UACA,QACA,OACA,KACA,MACA,UACG;AACH,WAAS,MAAM,IAAI,MAAM;AACzB,WAAS,SAAS,CAAC,IAAI,MAAM;AAC7B,WAAS,SAAS,CAAC,IAAI,IAAI;AAC3B,WAAS,SAAS,CAAC,IAAI,IAAI;AAC3B,WAAS,SAAS,CAAC,IAAI;AACvB,WAAS,SAAS,CAAC,IAAI;AACzB;AAEA,IAAM,8BAA8B,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,aAAa,GAAG,KAAK,GAAG;AAC1C,UAAM,QAAQ,eAAe,eAAe,eAAe,CAAC;AAC5D,UAAM,MAAM,eAAe,eAAe,eAAe,IAAI,CAAC;AAC9D,yBAAqB,UAAU,QAAQ,OAAO,KAAK,IAAI,CAAC;AACxD,cAAU;AACV,yBAAqB,UAAU,QAAQ,OAAO,KAAK,GAAG,CAAC;AACvD,cAAU;AACV,yBAAqB,UAAU,QAAQ,OAAO,KAAK,IAAI,CAAC;AACxD,cAAU;AACV,yBAAqB,UAAU,QAAQ,OAAO,KAAK,IAAI,CAAC;AACxD,cAAU;AACV,yBAAqB,UAAU,QAAQ,OAAO,KAAK,GAAG,CAAC;AACvD,cAAU;AACV,yBAAqB,UAAU,QAAQ,OAAO,KAAK,GAAG,CAAC;AACvD,cAAU;AAAA,EACZ;AACA,SAAO,SAAS;AAClB;AAEA,IAAMC,cAAa,CAAC,OAAO,UAAU;AACnC,MAAI,KAAK;AACT,MAAI,KAAK,MAAM;AACf,SAAO,KAAK,IAAI;AACd,UAAM,MAAO,KAAK,MAAO;AACzB,QAAI,MAAM,GAAG,IAAI,MAAO,MAAK,MAAM;AAAA,QAC9B,MAAK;AAAA,EACZ;AACA,SAAO;AACT;AAEA,IAAM,uBAAuB,CAAC,SAAS,WAAW;AAChD,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,QAAM,YAAYA,YAAW,SAAS,MAAM;AAC5C,MAAI,aAAa,EAAG,QAAO;AAC3B,MAAI,aAAa,QAAQ,OAAQ,QAAO,QAAQ,SAAS;AACzD,QAAM,gBAAgB,YAAY;AAClC,SAAO,KAAK,IAAI,QAAQ,SAAS,IAAI,MAAM,IACzC,KAAK,IAAI,SAAS,QAAQ,aAAa,CAAC,IACtC,YACA;AACN;AAEA,IAAM,kBAAkB,CAAC,UAAU;AACjC,MAAI,OAAO;AACX,MAAI,OAAO;AACX,QAAM,OAAO,QAAQ,CAAC,WAAW;AAC/B,QAAI,OAAO,WAAW,EAAG;AACzB,WAAO,KAAK,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AACpC,WAAO,KAAK,IAAI,MAAM,OAAO,KAAK,OAAO,SAAS,CAAC,CAAC;AAAA,EACtD,CAAC;AACD,SAAO,EAAE,MAAM,KAAK;AACtB;AAEA,IAAM,mBAAmB,CAAC,OAAO,uBAAuB;AACtD,QAAM,SAAS,MAAM,QAAQ,OAAO,MAAM,IAAI,MAAM,SAAS,CAAC;AAC9D,QAAM,QAAQ,qBAAqB,OAAO,EAAE;AAC5C,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,OAAO,QAAQ;AAC3D,WAAO;AAAA,EACT;AACA,QAAM,OAAO,oBAAI,IAAI;AACrB,QAAM,UAAU,CAAC;AACjB,QAAM,QAAQ,CAAC,gBAAgB;AAC7B,QAAI,CAAC,OAAO,UAAU,WAAW,EAAG;AACpC,QAAI,cAAc,KAAK,eAAe,OAAO,OAAQ;AACrD,QAAI,KAAK,IAAI,WAAW,EAAG;AAC3B,SAAK,IAAI,WAAW;AACpB,YAAQ,KAAK,OAAO,WAAW,CAAC;AAAA,EAClC,CAAC;AACD,MAAI,QAAQ,WAAW,OAAO,OAAQ,QAAO;AAC7C,SAAO;AACT;AAEA,IAAM,yBAAyB,CAAC,kBAAkB;AAChD,MAAI,CAAC,eAAe,QAAS,QAAO;AACpC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ,OAAO,SAAS,OAAO,cAAc,MAAM,CAAC,IAChD,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,cAAc,MAAM,CAAC,CAAC,IACpD;AAAA,IACJ,MAAM,cAAc,SAAS,QAAQ,QAAQ;AAAA,EAC/C;AACF;AAEA,IAAM,2BAA2B,CAAC,QAAQ,kBACxC,GAAG,OAAO,EAAE,QAAQ,cAAc,IAAI,IAAI,cAAc,MAAM;AAEhE,IAAM,8BAA8B,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,MAAM,IAAI,aAAa,KAAK,IAAI,GAAG,QAAQ,SAAS,UAAU,CAAC;AACrE,MAAI,IAAI,WAAW,EAAG,QAAO;AAE7B,MAAI,SAAS,OAAO;AAClB,QAAI,MAAM;AACV,UAAM,mBAAmB,KAAK,IAAI,GAAG,aAAa,SAAS,CAAC;AAC5D,aAAS,IAAI,kBAAkB,IAAI,YAAY,KAAK,GAAG;AACrD,aAAO,QAAQ,CAAC;AAAA,IAClB;AACA,aAAS,cAAc,YAAY,cAAc,QAAQ,QAAQ,eAAe,GAAG;AACjF,aAAO,QAAQ,WAAW;AAC1B,YAAM,cAAc,cAAc;AAClC,UAAI,eAAe,kBAAkB;AACnC,eAAO,QAAQ,WAAW;AAAA,MAC5B;AACA,YAAM,aAAa,KAAK,IAAI,QAAQ,cAAc,CAAC;AACnD,UAAI,cAAc,UAAU,IAAI,MAAM;AAAA,IACxC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,KAAK,SAAS;AACjC,MAAI,OAAO,OAAO,SAAS,eAAe,IACtC,kBACA,QAAQ,UAAU;AACtB,WAAS,cAAc,YAAY,cAAc,QAAQ,QAAQ,eAAe,GAAG;AACjF,WAAO,QAAQ,WAAW,IAAI,aAAa,QAAQ,IAAI;AACvD,QAAI,cAAc,UAAU,IAAI;AAAA,EAClC;AACA,SAAO;AACT;AAEA,IAAM,iCAAiC,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,aAAa,uBAAuB,aAAa;AACvD,MAAI,CAAC,cAAc,CAAC,MAAO,QAAO,CAAC;AAEnC,SAAO,MAAM,OACV,IAAI,CAAC,WAAW;AACf,QAAI,OAAO,WAAW,EAAG,QAAO;AAChC,UAAM,WAAW,yBAAyB,QAAQ,UAAU;AAC5D,UAAM,SAAS,MAAM,IAAI,QAAQ;AACjC,QACE,UACA,OAAO,iBAAiB,UACxB,OAAO,gBAAgB,OAAO,QAC9B;AACA,YAAM,cAAc,OAAO;AAC3B,UAAI,cAAc,OAAO,QAAQ;AAC/B,cAAM,YAAY,4BAA4B;AAAA,UAC5C,SAAS,OAAO,KAAK,SAAS,GAAG,OAAO,MAAM;AAAA,UAC9C,YAAY;AAAA,UACZ,QAAQ,WAAW;AAAA,UACnB,MAAM,WAAW;AAAA,UACjB,iBACE,cAAc,IAAI,OAAO,OAAO,KAAK,cAAc,CAAC,IAAI;AAAA,QAC5D,CAAC;AACD,eAAO,OAAO;AAAA,UACZ,OAAO,KAAK,SAAS,aAAa,OAAO,MAAM;AAAA,UAC/C;AAAA,QACF;AACA,eAAO,eAAe,OAAO;AAAA,MAC/B;AACA,aAAO,OAAO,QAAQ,OAAO;AAC7B,aAAO,OAAO,OAAO,GAAG,OAAO,IAAI,IAAI,WAAW,KAAK,YAAY,CAAC,IAAI,WAAW,MAAM;AACzF,aAAO,OAAO;AAAA,IAChB;AAEA,UAAM,IAAI,4BAA4B;AAAA,MACpC,SAAS,OAAO,KAAK,SAAS,GAAG,OAAO,MAAM;AAAA,MAC9C,YAAY;AAAA,MACZ,QAAQ,WAAW;AAAA,MACnB,MAAM,WAAW;AAAA,IACnB,CAAC;AACD,UAAM,WAAW,aAAa;AAAA,MAC5B,IAAI;AAAA,MACJ,MAAM,GAAG,OAAO,IAAI,IAAI,WAAW,KAAK,YAAY,CAAC,IAAI,WAAW,MAAM;AAAA,MAC1E,OAAO,OAAO;AAAA,MACd,GAAG,OAAO,KAAK,SAAS,GAAG,OAAO,MAAM;AAAA,MACxC;AAAA,IACF,CAAC;AACD,UAAM,IAAI,UAAU;AAAA,MAClB,cAAc;AAAA,MACd,cAAc,OAAO;AAAA,MACrB,QAAQ;AAAA,IACV,CAAC;AACD,WAAO;AAAA,EACT,CAAC,EACA,OAAO,OAAO;AACnB;AAEA,IAAM,iBAAiB,CAAC,OAAO,uBAAuB,SAAS;AAC7D,QAAM,EAAE,MAAM,KAAK,IAAI,gBAAgB,KAAK;AAC5C,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,IAAI,GAAG;AACpD,WAAO,EAAE,MAAM,GAAG,MAAM,EAAE;AAAA,EAC5B;AACA,MAAI,SAAS,MAAM;AACjB,UAAMC,QACJ,OAAO,SAAS,oBAAoB,KAAK,uBAAuB,IAC5D,KAAK,IAAI,IAAI,oBAAoB,IACjC;AACN,UAAMC,gBAAeD,QAAO;AAC5B,UAAM,UAAU,OAAOC;AACvB,WAAO,EAAE,MAAM,UAAUD,OAAM,MAAM,QAAQ;AAAA,EAC/C;AACA,MAAI,OAAO,OAAO;AAClB,MAAI,OAAO,SAAS,oBAAoB,KAAK,uBAAuB,GAAG;AACrE,WAAO,KAAK,IAAI,MAAM,oBAAoB;AAC1C,UAAMC,gBAAe,OAAO;AAC5B,UAAM,UAAU,OAAOA;AACvB,WAAO,EAAE,MAAM,UAAU,MAAM,MAAM,QAAQ;AAAA,EAC/C;AACA,QAAM,eAAe,OAAO;AAC5B,SAAO,EAAE,MAAM,MAAM,MAAM,OAAO,aAAa;AACjD;AAEA,IAAM,YAAY,CAAC,OAAO,MAAM,MAAM,UAAU;AAC9C,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,iBAAiB;AACrB,MAAI,aAAa;AAEjB,QAAM,OAAO,QAAQ,CAAC,WAAW;AAC/B,UAAM,UAAU,OAAO,iBAAiB,MAAM,MAAM,KAAK;AACzD,sBAAkB,QAAQ;AAC1B,iBAAa,KAAK,IAAI,YAAY,QAAQ,UAAU;AACpD,aAAS,IAAI,GAAG,IAAI,QAAQ,EAAE,QAAQ,KAAK,GAAG;AAC5C,YAAM,QAAQ,QAAQ,EAAE,CAAC;AACzB,UAAI,QAAQ,KAAM,QAAO;AACzB,UAAI,QAAQ,KAAM,QAAO;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,IAAI,GAAG;AACpD,WAAO,EAAE,MAAM,GAAG,MAAM,GAAG,gBAAgB,WAAW;AAAA,EACxD;AACA,QAAM,YAAY,OAAO,MAAM,QAAQ,GAAG;AAC1C,QAAM,YAAY,OAAO,MAAM,QAAQ,GAAG;AAC1C,MAAI,OAAO,SAAS,SAAS,KAAK,OAAO,SAAS,SAAS,KAAK,YAAY,WAAW;AACrF,WAAO,EAAE,MAAM,WAAW,MAAM,WAAW,gBAAgB,WAAW;AAAA,EACxE;AACA,MAAI,SAAS,MAAM;AACjB,YAAQ;AACR,YAAQ;AAAA,EACV;AACA,QAAM,OAAO,OAAO,QAAQ;AAC5B,SAAO,EAAE,MAAM,OAAO,KAAK,MAAM,OAAO,KAAK,gBAAgB,WAAW;AAC1E;AAEA,IAAM,cAAc,CAAC,QAAQ,QAAQ,GAAG,eAAe,MAAM;AAC3D,QAAM,eAAe,KAAK,IAAI,aAAa,KAAK,IAAI,aAAa,KAAK,CAAC;AACvE,QAAM,UAAU,OAAO,OAAO,OAAO,QAAQ,IAAI;AACjD,QAAM,aAAc,OAAO,OAAO,OAAO,QAAQ,eAAgB;AACjE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,SAAS;AAAA,IACf,MAAM,SAAS;AAAA,EACjB;AACF;AAEA,IAAM,sBAAsB,CAAC,UAC3B,MAAM,QAAQ,eAAe,IAAI,EAAE,QAAQ,OAAO,EAAE;AAEtD,IAAM,eAAe,CAAC,UAAU;AAC9B,MAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACpC,QAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,MAAI,QAAQ,KAAK,MAAM,KAAQ,QAAO,MAAM,cAAc,CAAC;AAC3D,MAAI,MAAM,EAAG,QAAO,oBAAoB,MAAM,YAAY,CAAC,CAAC;AAC5D,MAAI,OAAO,IAAQ,QAAO,MAAM,QAAQ,CAAC;AACzC,MAAI,OAAO,IAAM,QAAO,oBAAoB,MAAM,QAAQ,CAAC,CAAC;AAC5D,MAAI,OAAO,GAAI,QAAO,oBAAoB,MAAM,QAAQ,CAAC,CAAC;AAC1D,SAAO,oBAAoB,MAAM,QAAQ,CAAC,CAAC;AAC7C;AAEA,IAAM,sBAAsB,CAAC,UAAU;AACrC,MAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACpC,QAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,MAAI,OAAO,IAAY,QAAO,IAAI,QAAQ,KAAY,QAAQ,OAAO,OAAc,IAAI,CAAC,CAAC;AACzF,MAAI,OAAO,IAAS,QAAO,IAAI,QAAQ,KAAS,QAAQ,OAAO,MAAW,IAAI,CAAC,CAAC;AAChF,MAAI,OAAO,IAAM,QAAO,IAAI,QAAQ,KAAM,QAAQ,OAAO,MAAQ,IAAI,CAAC,CAAC;AACvE,SAAO,aAAa,KAAK;AAC3B;AAEA,IAAM,gBAAgB,CAAC,OAAO,QAAQ;AACpC,MAAI,CAAC,SAAS,CAAC,IAAK,QAAO;AAC3B,QAAM,OAAO,KAAK,IAAI,MAAM,GAAG,IAAI,CAAC;AACpC,QAAM,MAAM,KAAK,IAAI,MAAM,GAAG,IAAI,CAAC;AACnC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC;AAAA,IAC/B,QAAQ,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC;AAAA,EAClC;AACF;AAEA,IAAM,mBAAmB,CAAC,OAAO,UAAU;AAAA,EACzC,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,OAAO,KAAK,IAAI,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA,EAC1D,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,QAAQ,KAAK,IAAI,KAAK,GAAG,MAAM,CAAC,CAAC;AAC7D;AAEA,IAAM,qBAAqB,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,eAAe,iBAAiB,OAAO,IAAI;AACjD,QAAM,aAAa,iBAAiB,KAAK,IAAI;AAC7C,QAAM,OAAO,cAAc,cAAc,UAAU;AACnD,MAAI,CAAC,QAAQ,KAAK,QAAQ,KAAK,KAAK,SAAS,EAAG,QAAO;AAEvD,QAAM,QACJ,aAAa,QAAQ,IAAI,MAAM,EAAE,KACjC,eAAe,OAAO,oBAAoB;AAC5C,QAAM,gBAAgB;AAAA,IACpB,UAAU,OAAO,MAAM,MAAM,MAAM,MAAM,KAAK,KAAK;AAAA,IACnD,UAAU,QAAQ,IAAI,MAAM,EAAE,KAAK;AAAA,IACnC,iBAAiB,QAAQ,IAAI,MAAM,EAAE,KAAK;AAAA,EAC5C;AAEA,QAAM,aAAa,KAAK,OAAO,KAAK,KAAK,KAAK;AAC9C,QAAM,cAAc,KAAK,OAAO,KAAK,QAAQ,KAAK,KAAK,KAAK;AAC5D,QAAM,YAAY,KAAK,MAAM,KAAK,KAAK,KAAK;AAC5C,QAAM,eAAe,KAAK,MAAM,KAAK,SAAS,KAAK,KAAK,KAAK;AAC7D,QAAM,UAAU,MAAM,OAAO,aAAa,MAAM,OAAO,MAAM;AAC7D,QAAM,UAAU,MAAM,OAAO,cAAc,MAAM,OAAO,MAAM;AAC9D,MAAI,UAAU,UAAU,iBAAkB,QAAO;AAEjD,QAAM,eACJ,cAAc,OAAO,YAAY,cAAc,OAAO,cAAc;AACtE,QAAM,eACJ,cAAc,OACd,eAAe,cAAc,OAAO,cAAc;AACpD,QAAM,eAAe,eAAe;AACpC,MAAI,CAAC,OAAO,SAAS,YAAY,KAAK,gBAAgB,EAAG,QAAO;AAEhE,eAAa,QAAQ,IAAI,MAAM,IAAI,EAAE,MAAM,SAAS,MAAM,QAAQ,CAAC;AAEnE,QAAM,aAAa,UAAU,OAAO,SAAS,SAAS,KAAK,KAAK;AAChE,QAAM,WAAW,WAAW,OAAO,WAAW;AAC9C,MAAI,OAAO,SAAS,QAAQ,KAAK,WAAW,GAAG;AAC7C,UAAM,kBAAkB,eAAe,gBAAgB;AACvD,UAAM,cAAc,WAAW,OAAO,WAAW,QAAQ;AACzD,UAAM,YAAY,KAAK;AAAA,MACrB;AAAA,MACA,KAAK,IAAI,aAAa,eAAe,QAAQ;AAAA,IAC/C;AACA,cAAU,QAAQ,IAAI,MAAM,IAAI,SAAS;AACzC,qBAAiB,QAAQ,IAAI,MAAM,IAAI,iBAAiB,UAAU;AAClE,oBAAgB,QAAQ,IAAI,MAAM,EAAE;AAAA,EACtC;AAEA,SAAO;AACT;AAEA,IAAM,gBAAgB,CAAC,OAAO,sBAAsB,iBAClD,aAAa,QAAQ,IAAI,MAAM,EAAE,KACjC,eAAe,OAAO,oBAAoB;AAE5C,IAAM,2BAA2B,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE;AAAA,EACE,UAAU,OAAO,MAAM,MAAM,MAAM,MAAM,KAAK,KAAK;AAAA,EACnD,UAAU,QAAQ,IAAI,MAAM,EAAE,KAAK;AAAA,EACnC,iBAAiB,QAAQ,IAAI,MAAM,EAAE,KAAK;AAC5C;AAEF,IAAM,yBAAyB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,cAAc,OAAO,sBAAsB,YAAY;AACrE,QAAM,SAAS,yBAAyB;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,UAAU,MAAM,IAAI,KAAK,KAAK,KAAK;AACzC,QAAM,UAAU,MAAM,IAAI,KAAK,KAAK,KAAK;AACzC,SAAO;AAAA,IACL,GAAG,MAAM,OAAO,UAAU,MAAM,OAAO,MAAM;AAAA,IAC7C,GAAG,OAAO,OAAO,UAAU,OAAO,OAAO,OAAO;AAAA,EAClD;AACF;AAEA,IAAM,yBAAyB,CAAC,EAAE,OAAO,OAAO,QAAQ,KAAK,MAAM;AACjE,QAAM,UAAU,MAAM,IAAI,MAAM,SAAS,MAAM,OAAO,MAAM;AAC5D,QAAM,UAAU,OAAO,OAAO,MAAM,MAAM,OAAO,OAAO,OAAO;AAC/D,SAAO;AAAA,IACL,GAAG,KAAK,IAAI,SAAS,KAAK;AAAA,IAC1B,GAAG,KAAK,IAAI,SAAS,KAAK;AAAA,EAC5B;AACF;AAEA,IAAM,oBAAoB,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,qBAAqB,CAAC;AACxB,MAAM;AACJ,QAAM,EAAE,KAAK,IAAI,gBAAgB,KAAK;AACtC,QAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,kBAAkB,GAAG,CAAC,GAAG,UAAU;AACpE,UAAM,QAAQ,sBAAsB,IAAI,IAAI,SAAS,oBAAoB;AACzE,UAAM,QAAQ,OAAO,OAAO,SAAS,OAAO,OAAO,OAAO;AAC1D,WAAO;AAAA,MACL,IAAI,GAAG,MAAM,EAAE,SAAS,KAAK;AAAA,MAC7B;AAAA,MACA,KAAK,QAAQ,KAAK;AAAA,IACpB;AAAA,EACF,CAAC;AAED,QAAM,SAAS,MAAM,KAAK,EAAE,QAAQ,kBAAkB,GAAG,CAAC,GAAG,UAAU;AACrE,UAAM,QAAQ,sBAAsB,IAAI,IAAI,SAAS,oBAAoB;AACzE,WAAO;AAAA,MACL,IAAI,GAAG,MAAM,EAAE,WAAW,KAAK;AAAA,MAC/B,OAAO,MAAM,OAAO,SAAS,MAAM,OAAO,MAAM;AAAA,MAChD,MAAM,KAAK,QAAQ,KAAK,IAAI,GAAG,KAAK,QAAQ,EAAE;AAAA,IAChD;AAAA,EACF,CAAC;AAED,QAAM,eAAe,iBAAiB,OAAO,kBAAkB,EAC5D,IAAI,CAAC,WAAW;AACf,QAAI,OAAO,WAAW,EAAG,QAAO;AAChC,UAAM,QAAQ,OAAO,KAAK,OAAO,SAAS,CAAC;AAC3C,UAAM,IAAI,OAAO,KAAK,OAAO,SAAS,CAAC;AACvC,UAAM,WAAW,gBAAgB,IAAI,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,MAAM;AACjE,UAAM,SAAS,OAAO,OAAO,SAAS,MAAM,OAAO,OAAO,OAAO;AACjE,UAAM,UAAU,SAAS,IAAI,MAAM,SAAS,MAAM,OAAO,MAAM;AAC/D,WAAO;AAAA,MACL,IAAI,OAAO;AAAA,MACX,OAAO,OAAO;AAAA,MACd,WAAW,wBAAwB,MAAM;AAAA,MACzC,OAAO,SAAS;AAAA,MAChB,UAAU;AAAA,MACV;AAAA,MACA,MAAM,SAAS,KAAK;AAAA,MACpB,KAAK,QAAQ,KAAK;AAAA,IACpB;AAAA,EACF,CAAC,EACA;AAAA,IACC,CAAC,UACC,SACA,OAAO,SAAS,MAAM,GAAG,KACzB,MAAM,OAAO,OACb,MAAM,OAAO,KAAK,SAAS;AAAA,EAC/B;AAEF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,KAAK;AAAA,IAChB,gBACE,OAAO,SAAS,IAAI,MAAM,OAAO,MAAM,QAAQ,OAAO,MAAM;AAAA,EAChE;AACF;AAEA,IAAM,mBAAmB,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAuB;AAAA,EACvB;AAAA,EACA,qBAAqB;AACvB,MAAM;AACJ,QAAM,MAAM,KAAK,IAAI,GAAG,OAAO,oBAAoB,CAAC;AACpD,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC;AACtD,QAAM,cAAc,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,GAAG,CAAC;AACxD,MAAI,OAAO,UAAU,cAAc,OAAO,WAAW,aAAa;AAChE,WAAO,QAAQ;AACf,WAAO,SAAS;AAChB,WAAO,MAAM,QAAQ,GAAG,KAAK;AAC7B,WAAO,MAAM,SAAS,GAAG,MAAM;AAAA,EACjC;AAEA,KAAG,SAAS,GAAG,GAAG,YAAY,WAAW;AACzC,KAAG,WAAW,GAAG,GAAG,GAAG,CAAC;AACxB,KAAG,MAAM,GAAG,gBAAgB;AAC5B,QAAM,uBAAuB,kBAAkB;AAC/C,QAAM,gBAAgB,uBAAuB,mBAAmB;AAChE,KAAG,WAAW,aAAa;AAE3B,QAAM,cAAc,GAAG,mBAAmB,eAAe,cAAc;AACvE,QAAM,QAAQ,GAAG,mBAAmB,eAAe,QAAQ;AAC3D,QAAM,UAAU,GAAG,mBAAmB,eAAe,UAAU;AAC/D,QAAM,UAAU,GAAG,mBAAmB,eAAe,UAAU;AAC/D,QAAM,SAAS,GAAG,mBAAmB,eAAe,SAAS;AAE7D,MAAI,MAAM;AACV,MAAI,SAAS;AACb,MAAI,OAAO;AACX,MAAI,QAAQ;AACZ,MAAI,SAAS;AACb,MAAI,iBAAiB;AACrB,MAAI,aAAa;AAEjB,MAAI,sBAAsB;AACxB,aAAS,GAAG,kBAAkB,eAAe,SAAS;AACtD,WAAO,GAAG,kBAAkB,eAAe,OAAO;AAClD,YAAQ,GAAG,kBAAkB,eAAe,QAAQ;AACpD,aAAS,GAAG,kBAAkB,eAAe,SAAS;AACtD,qBAAiB,GAAG,mBAAmB,eAAe,iBAAiB;AACvE,iBAAa,GAAG,mBAAmB,eAAe,aAAa;AAC/D,OAAG,wBAAwB,MAAM;AACjC,OAAG,wBAAwB,IAAI;AAC/B,OAAG,wBAAwB,KAAK;AAChC,OAAG,wBAAwB,MAAM;AACjC,OAAG,UAAU,gBAAiB,mBAAmB,MAAO,CAAC;AACzD,OAAG,UAAU,YAAY,mBAAmB,GAAG;AAC/C,OAAG,OAAO,GAAG,KAAK;AAClB,OAAG,UAAU,GAAG,WAAW,GAAG,mBAAmB;AAAA,EACnD,OAAO;AACL,UAAM,GAAG,kBAAkB,eAAe,MAAM;AAChD,OAAG,wBAAwB,GAAG;AAC9B,OAAG,QAAQ,GAAG,KAAK;AAAA,EACrB;AAEA,KAAG,UAAU,aAAa,YAAY,WAAW;AAEjD,QAAM,MAAM,YAAY,IAAI;AAC5B,QAAM,mBAAmB,CAAC;AAE1B,UAAQ,QAAQ,CAAC,EAAE,OAAO,MAAM,QAAQ,MAAM;AAC5C,QAAI,CAAC,QAAS;AACd,QAAI,sBAAsB;AACxB,SAAG,WAAW,aAAa;AAC3B,SAAG,UAAU,aAAa,YAAY,WAAW;AAAA,IACnD;AACA,UAAM,QACJ,aAAa,QAAQ,IAAI,MAAM,EAAE,KACjC,eAAe,OAAO,oBAAoB;AAC5C,UAAM,aAAa;AAAA,MACjB,GAAG,KAAK,IAAI;AAAA,MACZ,GAAG,KAAK,IAAI;AAAA,MACZ,OAAO,KAAK,QAAQ;AAAA,MACpB,QAAQ,KAAK,SAAS;AAAA,IACxB;AACA,UAAM,SAAS;AAAA,MACb,UAAU,OAAO,MAAM,MAAM,MAAM,MAAM,KAAK,KAAK;AAAA,MACnD,UAAU,QAAQ,IAAI,MAAM,EAAE,KAAK;AAAA,MACnC,iBAAiB,QAAQ,IAAI,MAAM,EAAE,KAAK;AAAA,IAC5C;AACA,UAAM,kBAAkB,oBAAI,IAAI;AAChC,UAAM,qBAAqB,uBAAuB,MAAM,EAAE;AAC1D,UAAM,iBACJ,QAAQ,oBAAoB,OAAO,KAAK,QAAQ,oBAAoB,QAAQ;AAE9E,OAAG,OAAO,GAAG,YAAY;AACzB,OAAG;AAAA,MACD,KAAK,MAAM,WAAW,CAAC;AAAA,MACvB,KAAK,MAAM,cAAc,WAAW,IAAI,WAAW,MAAM;AAAA,MACzD,KAAK,KAAK,WAAW,KAAK;AAAA,MAC1B,KAAK,KAAK,WAAW,MAAM;AAAA,IAC7B;AACA,OAAG;AAAA,MACD;AAAA,MACA,WAAW;AAAA,MACX,WAAW;AAAA,MACX,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AACA,OAAG,UAAU,SAAS,MAAM,MAAM,MAAM,IAAI;AAC5C,OAAG,UAAU,SAAS,OAAO,MAAM,OAAO,IAAI;AAE9C,QAAI,CAAC,eAAgB,kBAAiB,OAAO,kBAAkB,EAAE,QAAQ,CAAC,WAAW;AACnF,UAAI,gBAAgB,OAAO;AAAA,QACzB,MAAM;AAAA,QACN,MAAM;AAAA,QACN,KAAK;AAAA,MACP;AACA,UAAI,sBAAsB;AAC1B,UAAI,cAAc,aAAa,GAAG;AAChC,cAAM,qBAAqB,sBAAsB;AAAA,UAC/C;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,YAAI,CAAC,mBAAoB;AACzB,wBAAgB;AAChB,8BAAsB,mBAAmB;AAAA,MAC3C;AACA,YAAM,gBAAgB,sBAClB,OACA,uBAAuB;AAAA,QACrB,UAAU,OAAO;AAAA,QACjB;AAAA,QACA;AAAA,MACF,CAAC;AACL,YAAM,aAAa,eAAe,cAAc,cAAc;AAC9D,UAAI,eAAe;AACjB,wBAAgB,IAAI,OAAO,IAAI;AAAA,UAC7B,GAAG,cAAc;AAAA,UACjB,GAAG,cAAc;AAAA,QACnB,CAAC;AAAA,MACH,WAAW,qBAAqB;AAC9B,wBAAgB,IAAI,OAAO,IAAI,mBAAmB;AAAA,MACpD;AAEA,YAAM,CAAC,GAAG,GAAG,CAAC,IAAI,SAAS,OAAO,KAAK;AACvC,SAAG,UAAU,QAAQ,GAAG,GAAG,CAAC;AAE5B,UAAI,sBAAsB;AACxB,cAAMC,eAAc;AAAA,UAClB;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP;AAAA,QACF;AACA,cAAM,kBAAkB,4BAA4B;AAAA,UAClD,UAAUA,aAAY;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,cAAM,SAAS,yBAAyB,aAAa;AACrD,WAAG,WAAW,GAAG,cAAcA,aAAY,MAAM;AACjD,WAAG,oBAAoB,QAAQ,GAAG,GAAG,OAAO,OAAO,QAAQ,CAAC;AAC5D,WAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA,GAAG;AAAA,UACH;AAAA,UACA;AAAA,UACA,IAAI,aAAa;AAAA,QACnB;AACA,WAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA,GAAG;AAAA,UACH;AAAA,UACA;AAAA,UACA,IAAI,aAAa;AAAA,QACnB;AACA,WAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA,GAAG;AAAA,UACH;AAAA,UACA;AAAA,UACA,IAAI,aAAa;AAAA,QACnB;AACA,WAAG;AAAA,UACD,GAAG;AAAA,UACH;AAAA,UACAA,aAAY;AAAA,UACZ;AAAA,UACA,kBAAkB;AAAA,QACpB;AACA,WAAG,WAAW,GAAG,WAAW,GAAG,eAAe;AAC9C;AAAA,MACF;AAEA,YAAM,cAAc;AAAA,QAClB;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,MACF;AACA,uBAAiB;AAAA,QACf,UAAU,YAAY;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,SAAG,WAAW,GAAG,cAAc,YAAY,MAAM;AACjD,SAAG,oBAAoB,KAAK,GAAG,GAAG,OAAO,OAAO,GAAG,CAAC;AACpD,SAAG;AAAA,QACD,GAAG;AAAA,QACH;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,QACA,aAAa;AAAA,MACf;AACA,SAAG,WAAW,GAAG,YAAY,GAAG,UAAU;AAAA,IAC5C,CAAC;AACD,UAAM,sBAAsB,+BAA+B;AAAA,MACzD;AAAA,MACA,eAAe;AAAA,MACf,OAAO;AAAA,IACT,CAAC;AACD,UAAM,6BAA6B;AAAA,MACjC,EAAE,GAAG,OAAO,QAAQ,oBAAoB;AAAA,MACxC;AAAA,IACF;AACA,QAAI,QAAQ;AACZ,QAAI,WAAW;AACf,QAAI,oBAAoB,SAAS,KAAK,sBAAsB;AAC1D,SAAG,WAAW,OAAO;AACrB,YAAM,gBAAgB,GAAG,mBAAmB,SAAS,cAAc;AACnE,YAAM,UAAU,GAAG,mBAAmB,SAAS,QAAQ;AACvD,YAAM,YAAY,GAAG,mBAAmB,SAAS,UAAU;AAC3D,YAAM,YAAY,GAAG,mBAAmB,SAAS,UAAU;AAC3D,iBAAW,GAAG,mBAAmB,SAAS,SAAS;AACnD,cAAQ,GAAG,kBAAkB,SAAS,MAAM;AAC5C,SAAG,wBAAwB,KAAK;AAChC,SAAG,UAAU,eAAe,YAAY,WAAW;AACnD,SAAG;AAAA,QACD;AAAA,QACA,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AACA,SAAG,UAAU,WAAW,MAAM,MAAM,MAAM,IAAI;AAC9C,SAAG,UAAU,WAAW,OAAO,MAAM,OAAO,IAAI;AAAA,IAClD;AACA,+BAA2B,QAAQ,CAAC,WAAW;AAC7C,YAAM,gBAAgB,OAAO;AAAA,QAC3B,MAAM;AAAA,QACN,MAAM;AAAA,QACN,KAAK;AAAA,MACP;AACA,UAAI,cAAc,aAAa,EAAG;AAClC,YAAM,aAAa,cAAc;AACjC,YAAM,CAAC,GAAG,GAAG,CAAC,IAAI,SAAS,OAAO,KAAK;AACvC,SAAG,UAAU,UAAU,GAAG,GAAG,CAAC;AAE9B,YAAM,cAAc;AAAA,QAClB;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AACA,YAAM,kBAAkB,yBAAyB;AAAA,QAC/C,UAAU,YAAY;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,UAAI,kBAAkB,EAAG;AACzB,SAAG,WAAW,GAAG,cAAc,YAAY,MAAM;AACjD,SAAG,oBAAoB,OAAO,GAAG,GAAG,OAAO,OAAO,GAAG,CAAC;AACtD,SAAG;AAAA,QACD,GAAG;AAAA,QACH;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,QACA,kBAAkB;AAAA,MACpB;AACA,SAAG,WAAW,GAAG,OAAO,GAAG,eAAe;AAAA,IAC5C,CAAC;AACD,qBAAiB,MAAM,EAAE,IAAI,kBAAkB;AAAA,MAC7C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,OAAG,QAAQ,GAAG,YAAY;AAAA,EAC5B,CAAC;AAED,MAAI,sBAAsB;AACxB,OAAG,QAAQ,GAAG,KAAK;AAAA,EACrB;AAEA,SAAO;AACT;;;ACrpCA,IAAM,oBAAoB,CAAC,oBAAoB,YAAY,UAAU,iBAAiB;AACtF,IAAMC,gBAAe,OAAO,OAAO,CAAC,CAAC;AACrC,IAAM,kBAAkB,OAAO,OAAO;AAAA,EACpC,QAAQ,CAAC;AAAA,EACT,SAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,aAAa;AAAA,EACb,qBAAqB;AAAA,EACrB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,oBAAoBA;AAAA,EACpB,YAAY,CAAC;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAChB,CAAC;AAED,IAAM,mBAAmB,OAAO,OAAO;AAAA,EACrC,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,iBAAiB;AACnB,CAAC;AAED,IAAM,aAAa,CAAC,UAAU,OAAO,SAAS,EAAE,EAC7C,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,QAAQ,EACxB,WAAW,KAAK,QAAQ;AAE3B,IAAM,YAAY,CAAC,OAAO,UAAU;AAClC,QAAM,QAAQ,OAAO,SAAS,wBAAwB,EAAE,KAAK;AAC7D,QAAM,QAAQ,8CAA8C,KAAK,KAAK;AACtE,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,QAAQ,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,KAAK;AAC5H;AAEA,IAAM,eAAe,CAAC,UAAU;AAC9B,QAAM,QAAQ,OAAO,SAAS,SAAS,EAAE,QAAQ,KAAK,EAAE;AACxD,QAAM,aAAa,MAAM,WAAW,IAChC,MAAM,MAAM,EAAE,EAAE,IAAI,CAAC,SAAS,OAAO,IAAI,EAAE,KAAK,EAAE,IAClD,MAAM,OAAO,GAAG,GAAG,EAAE,MAAM,GAAG,CAAC;AACnC,QAAM,SAAS,OAAO,SAAS,YAAY,EAAE;AAC7C,QAAM,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,WAAY,UAAU,QAAS,OAAO,GAAG;AACrE,QAAM,SAAS,IAAI,IAAI,CAAC,SAAS,QAAQ,UAAU,OAAO,UAAU,OAAO,SAAS,UAAU,GAAG;AACjG,SAAO,SAAS,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,IAAI,OAClE,YACA;AACN;AAEA,IAAM,SAAS,CAAC,QAAQ,QAAQ,OAAO,UAAU,eAAe,KAAK,QAAQ,GAAG;AAChF,IAAM,QAAQ,CAAC,OAAO,KAAK,QAAQ,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAErE,IAAM,gBAAgB,CAAC,EAAE,QAAQ,OAAO,MAAM,SAAS,IAAI,SAAS,OAAO,YAAY,GAAG,MAAM;AAAA,uCACzD,MAAM,YAAY,WAAW,KAAK,CAAC,iBAAiB,WAAW,KAAK,CAAC;AAAA,6IACiC,SAAS,sDAAsD,EAAE,IAAI,SAAS;AAAA,MACrN,IAAI;AAAA,MACJ,SAAS,2IAA2I,MAAM,YAAY,EAAE;AAAA;AAG9K,IAAM,gBAAgB,CAAC,OAAO,OAAO,oBAAoB;AAAA,2BAC9B,KAAK,2EAA2E,YAAY,uBAAuB,WAAW,eAAe,CAAC;AAAA;AAAA;AAAA,UAG/J,MAAM,SAAS,QAAQ,iBAAiB,EAAE,MAAM,IAAI,WAAW,8BAA8B,CAAC,IAAI,EAAE;AAAA,iCAC7E,WAAW,MAAM,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,gEAKQ,aAAa,GAAG,aAAa,aAAa,MAAM,YAAY,gBAAgB;AAAA,kEAC1E,aAAa,IAAI,YAAY,gBAAgB,aAAa,aAAa,MAAM;AAAA;AAAA;AAI/I,IAAM,cAAc,CAAC,QAAQ,QAAQ;AAAA,EACnC;AAAA,EACA;AAAA,EACA,SAAS,cAAc,EAAE;AAAA,EACzB,kBAAkB,uBAAuB,EAAE;AAAA,EAC3C,eAAe,wBAAwB;AAAA,EACvC,kBAAkB,wBAAwB;AAAA,EAC1C,oBAAoB,oBAAI,IAAI;AAC9B;AAEA,IAAM,iBAAiB,CAAC,YAAY;AAClC,MAAI,CAAC,QAAS;AACd,sBAAoB,QAAQ,IAAI,QAAQ,aAAa;AACrD,sBAAoB,QAAQ,IAAI,QAAQ,gBAAgB;AACxD,UAAQ,GAAG,cAAc,QAAQ,OAAO;AACxC,UAAQ,GAAG,cAAc,QAAQ,gBAAgB;AACjD,UAAQ,GAAG,aAAa,oBAAoB,GAAG,YAAY;AAC7D;AAEA,IAAM,iBAAN,MAAqB;AAAA,EACnB,YAAY,eAAe;AACzB,SAAK,gBAAgB;AACrB,SAAK,SAAS,oBAAI,IAAI;AACtB,SAAK,aAAa,oBAAI,IAAI;AAC1B,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,KAAK,QAAQ;AACX,UAAM,MAAM,YAAY,IAAI;AAC5B,WAAO,QAAQ,CAAC,UAAU,MAAM,OAAO,QAAQ,CAAC,WAAW;AACzD,UAAI,CAAC,OAAO,OAAQ;AACpB,YAAM,OAAO;AAAA,QACX,GAAG,OAAO,KAAK,OAAO,SAAS,CAAC;AAAA,QAChC,GAAG,OAAO,KAAK,OAAO,SAAS,CAAC;AAAA,QAChC,QAAQ,OAAO;AAAA,MACjB;AACA,YAAM,WAAW,KAAK,OAAO,IAAI,OAAO,EAAE;AAC1C,UAAI,YAAY,KAAK,IAAI,SAAS,GAAG;AACnC,aAAK,WAAW,IAAI,OAAO,IAAI;AAAA,UAC7B,OAAO,SAAS;AAAA,UAChB,OAAO,SAAS;AAAA,UAChB,KAAK,KAAK;AAAA,UACV,KAAK,KAAK;AAAA,UACV,eAAe,KAAK,SAAS,SAAS;AAAA,UACtC,WAAW;AAAA,UACX,UAAU,iBAAiB;AAAA,QAC7B,CAAC;AAAA,MACH;AACA,WAAK,OAAO,IAAI,OAAO,IAAI,IAAI;AAAA,IACjC,CAAC,CAAC;AACF,QAAI,KAAK,WAAW,KAAM,MAAK,MAAM;AAAA,EACvC;AAAA,EAEA,QAAQ;AACN,QAAI,KAAK,SAAS,KAAM;AACxB,UAAM,OAAO,MAAM;AACjB,YAAM,MAAM,YAAY,IAAI;AAC5B,WAAK,WAAW,QAAQ,CAAC,WAAW,OAAO;AACzC,YAAI,MAAM,UAAU,aAAa,UAAU,SAAU,MAAK,WAAW,OAAO,EAAE;AAAA,MAChF,CAAC;AACD,WAAK,cAAc;AACnB,WAAK,QAAQ,KAAK,WAAW,OAAO,sBAAsB,IAAI,IAAI;AAAA,IACpE;AACA,SAAK,QAAQ,sBAAsB,IAAI;AAAA,EACzC;AAAA,EAEA,SAAS,EAAE,UAAU,eAAe,IAAI,GAAG;AACzC,QAAI,cAAc,aAAa,iBAAiB,cAAe,QAAO;AACtE,UAAM,YAAY,KAAK,WAAW,IAAI,QAAQ;AAC9C,QAAI,CAAC,aAAa,cAAc,EAAE,CAAC,IAAI,UAAU,SAAS,cAAc,EAAE,cAAc,aAAa,CAAC,IAAI,UAAU,IAAK,QAAO;AAChI,QAAI,cAAc;AAClB,WAAO,cAAc,cAAc,cAAc,cAAc,EAAE,WAAW,KAAK,UAAU,MAAO,gBAAe;AACjH,QAAI,CAAC,YAAa,QAAO;AACzB,UAAM,cAAc,OAAO,MAAM,UAAU,aAAa,UAAU,UAAU,GAAG,CAAC;AAChF,UAAM,WAAW,KAAK,IAAI,gBAAgB;AAC1C,QAAI,UAAU,gBAAgB,iBAAiB,iBAAiB;AAC9D,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY,cAAc;AAAA,QAC1B,GAAG,UAAU,SAAS,UAAU,MAAM,UAAU,SAAS;AAAA,QACzD,GAAG,UAAU,SAAS,UAAU,MAAM,UAAU,SAAS;AAAA,MAC3D;AAAA,IACF;AACA,UAAM,gBAAgB,cAAc,aAAa;AACjD,UAAM,WAAW,WAAW;AAC5B,UAAM,WAAW,KAAK,IAAI,eAAe,KAAK,MAAM,QAAQ,CAAC;AAC7D,UAAM,YAAY,KAAK,IAAI,cAAc,aAAa,GAAG,cAAc,QAAQ;AAC/E,UAAM,gBAAgB,KAAK,IAAI,cAAc,GAAG,YAAY,CAAC;AAC7D,UAAM,UAAU,WAAW;AAC3B,UAAM,eAAe,WAAW;AAChC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,YAAY,KAAK,IAAI,cAAc,YAAY,YAAY,CAAC;AAAA,MAC5D,GAAG,eAAe,cAAc,EAAE,aAAa,KAAK,cAAc,EAAE,SAAS,IAAI,cAAc,EAAE,aAAa,KAAK,UAAU,cAAc,EAAE,SAAS;AAAA,MACtJ,GAAG,eAAe,cAAc,EAAE,aAAa,KAAK,cAAc,EAAE,SAAS,IAAI,cAAc,EAAE,aAAa,KAAK,UAAU,cAAc,EAAE,SAAS;AAAA,IACxJ;AAAA,EACF;AAAA,EAEA,UAAU;AACR,QAAI,KAAK,SAAS,KAAM,sBAAqB,KAAK,KAAK;AACvD,SAAK,QAAQ;AACb,SAAK,WAAW,MAAM;AAAA,EACxB;AACF;AAEA,IAAM,sBAAN,MAA0B;AAAA,EACxB,YAAY,WAAW,SAAS;AAC9B,QAAI,EAAE,qBAAqB,aAAc,OAAM,IAAI,UAAU,gDAAgD;AAC7G,SAAK,YAAY;AACjB,SAAK,UAAU,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAChD,QAAI,CAAC,MAAM,QAAQ,KAAK,QAAQ,MAAM,EAAG,OAAM,IAAI,UAAU,yBAAyB;AACtF,SAAK,YAAY;AACjB,SAAK,QAAQ;AACb,SAAK,iBAAiB;AACtB,SAAK,iBAAiB;AACtB,SAAK,oBAAoB;AACzB,SAAK,uBAAuB;AAC5B,SAAK,oBAAoB;AACzB,SAAK,YAAY;AACjB,SAAK,OAAO;AACZ,SAAK,eAAe;AACpB,SAAK,iBAAiB;AACtB,SAAK,WAAW,MAAM,QAAQ,QAAQ,QAAQ,IAAI,CAAC,GAAG,QAAQ,QAAQ,IAAI,CAAC;AAC3E,SAAK,oBAAoB,QAAQ,qBAAqB;AACtD,SAAK,oBAAoB,QAAQ,qBAAqB;AACtD,SAAK,uBAAuB,EAAE,GAAI,QAAQ,wBAAwB,CAAC,EAAG;AACtE,SAAK,aAAa,oBAAI,IAAI;AAC1B,SAAK,UAAU,oBAAI,IAAI;AACvB,SAAK,WAAW,oBAAI,IAAI;AACxB,SAAK,UAAU,oBAAI,IAAI;AACvB,SAAK,eAAe,CAAC;AACrB,SAAK,UAAU,CAAC;AAChB,SAAK,oBAAoB,CAAC;AAC1B,SAAK,eAAe,kBAAkB,OAAO,CAAC,SAAS,CAAC,UAAU,UAAU,SAAS,IAAI,CAAC;AAC1F,sBAAkB,QAAQ,CAAC,SAAS,UAAU,UAAU,IAAI,IAAI,CAAC;AAEjE,SAAK,SAAS,SAAS,cAAc,QAAQ;AAC7C,SAAK,OAAO,YAAY;AACxB,SAAK,OAAO,SAAS,cAAc,KAAK;AACxC,SAAK,KAAK,YAAY;AACtB,SAAK,WAAW,SAAS,cAAc,KAAK;AAC5C,SAAK,SAAS,YAAY;AAC1B,SAAK,SAAS,MAAM,QAAQ;AAC5B,cAAU,OAAO,KAAK,QAAQ,KAAK,MAAM,KAAK,QAAQ;AAEtD,UAAM,KAAK,KAAK,OAAO,WAAW,UAAU,EAAE,WAAW,MAAM,OAAO,MAAM,OAAO,OAAO,SAAS,MAAM,CAAC;AAC1G,QAAI,CAAC,IAAI;AACP,WAAK,WAAW;AAChB,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AACA,SAAK,UAAU,YAAY,KAAK,QAAQ,EAAE;AAC1C,SAAK,oBAAoB;AACzB,SAAK,WAAW,IAAI,eAAe,MAAM,KAAK,cAAc,CAAC;AAC7D,SAAK,SAAS,KAAK,KAAK,QAAQ,MAAM;AACtC,SAAK,QAAQ;AAAA,MACX,OAAO,CAAC,UAAU,KAAK,YAAY,KAAK;AAAA,MACxC,OAAO,CAAC,UAAU,KAAK,YAAY,KAAK;AAAA,MACxC,QAAQ,CAAC,UAAU,KAAK,YAAY,KAAK;AAAA,MACzC,aAAa,CAAC,UAAU,KAAK,kBAAkB,KAAK;AAAA,MACpD,aAAa,CAAC,UAAU,KAAK,kBAAkB,KAAK;AAAA,MACpD,WAAW,CAAC,UAAU,KAAK,gBAAgB,KAAK;AAAA,MAChD,cAAc,MAAM,KAAK,eAAe;AAAA,MACxC,aAAa,CAAC,UAAU,KAAK,kBAAkB,KAAK;AAAA,MACpD,OAAO,CAAC,UAAU,KAAK,YAAY,KAAK;AAAA,MACxC,QAAQ,MAAM,KAAK,cAAc;AAAA,MACjC,SAAS,CAAC,UAAU,KAAK,cAAc,KAAK;AAAA,IAC9C;AACA,WAAO,QAAQ,KAAK,KAAK,EAAE,QAAQ,CAAC,CAAC,MAAM,OAAO,MAAM;AACtD,YAAM,SAAS,SAAS,YAAY,SAAS;AAC7C,aAAO,iBAAiB,MAAM,SAAS,SAAS,UAAU,EAAE,SAAS,MAAM,IAAI,MAAS;AAAA,IAC1F,CAAC;AACD,SAAK,iBAAiB,IAAI,eAAe,MAAM,KAAK,cAAc,CAAC;AACnE,SAAK,eAAe,QAAQ,SAAS;AACrC,SAAK,qBAAqB;AAC1B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,cAAc;AACZ,QAAI,KAAK,UAAW,OAAM,IAAI,MAAM,2CAA2C;AAAA,EACjF;AAAA,EAEA,uBAAuB;AACrB,UAAM,MAAM,IAAI,IAAI,KAAK,QAAQ,OAAO,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC;AAChE,KAAC,KAAK,YAAY,KAAK,SAAS,KAAK,UAAU,KAAK,OAAO,EAAE,QAAQ,CAAC,QAAQ;AAC5E,OAAC,GAAG,IAAI,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO;AAAE,YAAI,CAAC,IAAI,IAAI,EAAE,EAAG,KAAI,OAAO,EAAE;AAAA,MAAG,CAAC;AAAA,IACvE,CAAC;AACD,SAAK,QAAQ,OAAO,QAAQ,CAAC,UAAU;AACrC,UAAI,CAAC,KAAK,WAAW,IAAI,MAAM,EAAE,EAAG,MAAK,WAAW,IAAI,MAAM,IAAI,eAAe,OAAO,KAAK,QAAQ,oBAAoB,CAAC;AAC1H,UAAI,CAAC,KAAK,QAAQ,IAAI,MAAM,EAAE,EAAG,MAAK,QAAQ,IAAI,MAAM,IAAI,CAAC;AAC7D,UAAI,CAAC,KAAK,SAAS,IAAI,MAAM,EAAE,EAAG,MAAK,SAAS,IAAI,MAAM,IAAI,CAAC;AAC/D,UAAI,CAAC,KAAK,QAAQ,IAAI,MAAM,EAAE,EAAG,MAAK,QAAQ,IAAI,MAAM,IAAI,gBAAgB,KAAK,EAAE,IAAI;AAAA,IACzF,CAAC;AACD,QAAI,KAAK,kBAAkB,CAAC,IAAI,IAAI,KAAK,cAAc,EAAG,MAAK,iBAAiB;AAChF,QAAI,KAAK,qBAAqB,CAAC,IAAI,IAAI,KAAK,iBAAiB,EAAG,MAAK,gBAAgB;AAAA,EACvF;AAAA,EAEA,gBAAgB;AACd,QAAI,KAAK,aAAa,KAAK,SAAS,KAAM;AAC1C,SAAK,QAAQ,sBAAsB,MAAM;AACvC,WAAK,QAAQ;AACb,WAAK,OAAO;AAAA,IACd,CAAC;AAAA,EACH;AAAA,EAEA,WAAW,MAAM;AACf,SAAK,YAAY;AACjB,QAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,UAAM,iBAAiB,KAAK,QAAQ;AACpC,UAAM,4BAA4B,KAAK;AACvC,SAAK,UAAU,EAAE,GAAG,KAAK,SAAS,GAAG,KAAK;AAC1C,QAAI,CAAC,MAAM,QAAQ,KAAK,QAAQ,MAAM,EAAG,OAAM,IAAI,UAAU,yBAAyB;AACtF,QAAI,OAAO,MAAM,UAAU,EAAG,MAAK,WAAW,MAAM,QAAQ,KAAK,QAAQ,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC;AACnG,QAAI,OAAO,MAAM,mBAAmB,GAAG;AACrC,WAAK,oBAAoB,KAAK,qBAAqB;AACnD,UAAI,KAAK,sBAAsB,2BAA2B;AACxD,aAAK,eAAe;AACpB,aAAK,iBAAiB;AAAA,MACxB;AAAA,IACF;AACA,QAAI,OAAO,MAAM,mBAAmB,EAAG,MAAK,oBAAoB,KAAK,qBAAqB;AAC1F,QAAI,OAAO,MAAM,sBAAsB,EAAG,MAAK,uBAAuB,EAAE,GAAI,KAAK,wBAAwB,CAAC,EAAG;AAC7G,QAAI,mBAAmB,KAAK,QAAQ,UAAU,OAAO,MAAM,SAAS,KAAK,OAAO,MAAM,iBAAiB,KAAK,OAAO,MAAM,WAAW,EAAG,MAAK,iBAAiB;AAC7J,SAAK,qBAAqB;AAC1B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,UAAU,QAAQ;AAChB,SAAK,WAAW,EAAE,OAAO,CAAC;AAAA,EAC5B;AAAA,EAEA,aAAa;AACX,SAAK,YAAY;AACjB,SAAK,mBAAmB;AACxB,SAAK,SAAS,KAAK,KAAK,QAAQ,MAAM;AACtC,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,qBAAqB;AACnB,SAAK,QAAQ,OAAO,QAAQ,CAAC,UAAU;AACrC,YAAM,WAAW,KAAK,QAAQ,IAAI,MAAM,EAAE;AAC1C,YAAM,OAAO,gBAAgB,KAAK,EAAE;AACpC,UAAI,OAAO,SAAS,QAAQ,KAAK,OAAO,SAAS,IAAI,KAAK,SAAS,UAAU;AAC3E,cAAM,QAAQ,KAAK,WAAW,IAAI,MAAM,EAAE,KAAK,eAAe,OAAO,KAAK,QAAQ,oBAAoB;AACtG,cAAM,OAAO,MAAM,OAAO,MAAM;AAChC,cAAM,WAAW,YAAY,MAAM,OAAO,OAAO,QAAQ,YAAY,MAAM,QAAQ,YAAY,MAAM;AACrG,YAAI,KAAK,QAAQ,gBAAiB,KAAK,QAAQ,uBAAuB,UAAW;AAC/E,gBAAM,QAAQ,OAAO;AACrB,eAAK,WAAW,IAAI,MAAM,IAAI,EAAE,MAAM,MAAM,OAAO,OAAO,MAAM,MAAM,OAAO,MAAM,CAAC;AAAA,QACtF;AAAA,MACF;AACA,WAAK,QAAQ,IAAI,MAAM,IAAI,IAAI;AAAA,IACjC,CAAC;AAAA,EACH;AAAA,EAEA,aAAa,SAAS;AACpB,SAAK,YAAY;AACjB,SAAK,QAAQ,OAAO,QAAQ,CAAC,UAAU;AACrC,UAAI,WAAW,QAAQ,MAAM,OAAO,QAAS;AAC7C,YAAM,OAAO,gBAAgB,KAAK,EAAE;AACpC,UAAI,CAAC,OAAO,SAAS,IAAI,EAAG;AAC5B,YAAM,QAAQ,KAAK,WAAW,IAAI,MAAM,EAAE,KAAK,eAAe,OAAO,KAAK,QAAQ,oBAAoB;AACtG,YAAM,OAAO,KAAK,IAAI,IAAI,MAAM,OAAO,MAAM,IAAI;AACjD,YAAM,UAAU,OAAO,OAAO;AAC9B,WAAK,WAAW,IAAI,MAAM,IAAI,EAAE,MAAM,UAAU,MAAM,MAAM,QAAQ,CAAC;AAAA,IACvE,CAAC;AACD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,YAAY,UAAU,CAAC,GAAG;AACxB,SAAK,YAAY;AACjB,SAAK,UAAU,SAAS,EAAE,GAAG,SAAS,KAAK,EAAE,CAAC;AAAA,EAChD;AAAA,EAEA,kBAAkB;AAChB,SAAK,KAAK,MAAM,sBAAsB,UAAU,KAAK,IAAI,GAAG,OAAO,KAAK,QAAQ,OAAO,KAAK,CAAC,CAAC;AAC9F,SAAK,KAAK,YAAY,KAAK,QAAQ,OAAO,IAAI,CAAC,OAAO,UAAU,cAAc,OAAO,OAAO,KAAK,QAAQ,eAAe,CAAC,EAAE,KAAK,EAAE;AAClI,SAAK,aAAa,CAAC,GAAG,KAAK,KAAK,iBAAiB,oBAAoB,CAAC;AACtE,SAAK,WAAW,QAAQ,CAAC,SAAS;AAChC,WAAK,cAAc,eAAe,EAAE,MAAM,kBAAkB,UAAU,KAAK,QAAQ,iBAAiB,IAAI;AAAA,IAC1G,CAAC;AACD,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,WAAW,aAAa,OAAO;AAC7B,UAAM,QAAQ,aAAc,KAAK,iBAAiB,CAAC,KAAK,cAAc,IAAI,CAAC,IAAK,KAAK,cAAc,CAAC;AACpG,UAAM,SAAS,aACX,KAAK,QAAQ,OAAO,OAAO,CAAC,UAAU,MAAM,OAAO,KAAK,iBAAiB,IACzE,KAAK,QAAQ;AACjB,UAAM,OAAO,aAAa,KAAK,oBAAoB,KAAK;AACxD,UAAM,WAAW,KAAK,sBAAsB;AAC5C,WAAO,MAAM,IAAI,CAAC,MAAM,UAAU;AAChC,YAAM,OAAO,KAAK,sBAAsB;AACxC,YAAM,IAAI,KAAK,OAAO,SAAS,OAAO,KAAK;AAC3C,YAAM,IAAI,KAAK,MAAM,SAAS,MAAM,KAAK;AACzC,YAAM,QAAQ,OAAO,KAAK;AAC1B,YAAM,SAAS;AAAA,QACb;AAAA,QACA,MAAM,EAAE,GAAG,GAAG,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO;AAAA,QACrD,MAAM;AAAA,UACJ,GAAG,IAAI,aAAa;AAAA,UACpB,GAAG,IAAI,aAAa;AAAA,UACpB,OAAO,KAAK,IAAI,GAAG,KAAK,QAAQ,aAAa,OAAO,aAAa,KAAK;AAAA,UACtE,QAAQ,KAAK,IAAI,GAAG,KAAK,SAAS,aAAa,MAAM,aAAa,MAAM;AAAA,QAC1E;AAAA,QACA,SAAS,cAAe,KAAK,UAAU,SAAS,OAAO,KAAK,OAAO,SAAS;AAAA,QAC5E;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,SAAS;AACP,UAAM,aAAa,KAAK,oBAAoB;AAC5C,QAAI,KAAK,eAAgB,MAAK,gBAAgB;AAC9C,SAAK,UAAU,KAAK,WAAW,KAAK;AACpC,SAAK,eAAe,KAAK,YAAY,KAAK,SAAS,KAAK,SAAS,KAAK,UAAU,aAAa,KAAK,UAAU,YAAY;AACxH,SAAK,YAAY,KAAK,SAAS,KAAK,cAAc,KAAK;AACvD,QAAI,KAAK,mBAAmB;AAC1B,WAAK,oBAAoB,KAAK,WAAW,IAAI;AAC7C,YAAM,OAAO,KAAK,YAAY,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,aAAa,KAAK,kBAAkB,YAAY;AACrJ,WAAK,YAAY,KAAK,mBAAmB,MAAM,IAAI;AAAA,IACrD;AACA,SAAK,eAAe;AACpB,SAAK,oBAAoB,UAAU;AAAA,EACrC;AAAA,EAEA,sBAAsB;AACpB,UAAM,SAAS,SAAS;AACxB,QAAI,EAAE,kBAAkB,kBAAmB,QAAO;AAClD,UAAM,WAAW,OAAO,QAAQ,sBAAsB,IAClD,yBACA,OAAO,QAAQ,iBAAiB,IAC9B,oBACA,OAAO,QAAQ,sBAAsB,IACnC,yBACA;AACR,QAAI,CAAC,SAAU,QAAO;AACtB,UAAM,aAAa,QAAQ,OAAO,QAAQ,+BAA+B,CAAC;AAC1E,QAAI,iBAAiB;AACrB,QAAI,eAAe;AACnB,QAAI,OAAO,SAAS,QAAQ;AAC1B,uBAAiB,OAAO;AACxB,qBAAe,OAAO;AAAA,IACxB;AACA,WAAO,EAAE,UAAU,YAAY,gBAAgB,aAAa;AAAA,EAC9D;AAAA,EAEA,oBAAoB,OAAO;AACzB,QAAI,CAAC,MAAO;AACZ,UAAM,OAAO,MAAM,aAAa,KAAK,oBAAoB,KAAK;AAC9D,UAAM,QAAQ,MAAM,cAAc,MAAM,QAAQ;AAChD,QAAI,EAAE,iBAAiB,kBAAmB;AAC1C,UAAM,MAAM,EAAE,eAAe,KAAK,CAAC;AACnC,QAAI,MAAM,SAAS,UAAU,MAAM,kBAAkB,MAAM;AACzD,YAAM,kBAAkB,MAAM,gBAAgB,MAAM,YAAY;AAAA,IAClE;AAAA,EACF;AAAA,EAEA,YAAY,SAAS,SAAS,OAAO,QAAQ;AAC3C,QAAI,CAAC,QAAS,QAAO,CAAC;AACtB,WAAO,iBAAiB;AAAA,MACtB,QAAQ,QAAQ;AAAA,MAChB,OAAO,KAAK,IAAI,GAAG,KAAK;AAAA,MACxB,QAAQ,KAAK,IAAI,GAAG,MAAM;AAAA,MAC1B,IAAI,QAAQ;AAAA,MACZ,SAAS,QAAQ;AAAA,MACjB,kBAAkB,QAAQ;AAAA,MAC1B,gBAAgB,KAAK,QAAQ;AAAA,MAC7B;AAAA,MACA,cAAc,EAAE,SAAS,KAAK,WAAW;AAAA,MACzC,WAAW,EAAE,SAAS,KAAK,QAAQ;AAAA,MACnC,kBAAkB,EAAE,SAAS,KAAK,SAAS;AAAA,MAC3C,mBAAmB,QAAQ;AAAA,MAC3B,4BAA4B,QAAQ;AAAA,MACpC,sBAAsB,KAAK,QAAQ;AAAA,MACnC,wBAAwB,CAAC,YAAY,KAAK,SAAS,SAAS,OAAO;AAAA,MACnE,sBAAsB,KAAK;AAAA,MAC3B,oBAAoB,QAAQ;AAAA,MAC5B,oBAAoB,KAAK,QAAQ;AAAA,IACnC,CAAC;AAAA,EACH;AAAA,EAEA,YAAY,SAAS,MAAM,YAAY;AACrC,YAAQ,QAAQ,CAAC,EAAE,OAAO,KAAK,MAAM;AACnC,YAAM,OAAO,KAAK,MAAM,EAAE;AAC1B,WAAK,cAAc,mBAAmB,EAAE,UAAU,OAAO,UAAU,KAAK,mBAAmB,MAAM,EAAE;AACnG,WAAK,cAAc,mBAAmB,EAAE,UAAU,OAAO,mBAAmB,KAAK,mBAAmB,MAAM,EAAE;AAC5G,YAAM,OAAO,KAAK,cAAc,mBAAmB;AACnD,YAAM,cAAc,KAAK,QAAQ,cAAc,OAAO,CAAC,IAAI,KAAK,QAAQ,aAAa,CAAC;AACtF,WAAK,MAAM,UAAU,KAAK,QAAQ,YAAY,UAAU;AACxD,aAAO,OAAO,KAAK,OAAO;AAAA,QACxB,MAAM,GAAG,aAAa,IAAI;AAAA,QAAM,OAAO,GAAG,aAAa,KAAK;AAAA,QAAM,KAAK,GAAG,aAAa,GAAG;AAAA,QAAM,QAAQ,GAAG,aAAa,MAAM;AAAA,QAC9H,iBAAiB;AAAA,QACjB,gBAAgB,GAAG,KAAK,IAAI,GAAG,OAAO,YAAY,QAAQ,KAAK,EAAE,CAAC,iBAAiB,KAAK,IAAI,GAAG,OAAO,YAAY,QAAQ,KAAK,EAAE,CAAC;AAAA,MACpI,CAAC;AACD,YAAM,QAAQ,KAAK,cAAc,eAAe;AAChD,YAAM,MAAM,kBAAkB,UAAU,KAAK,QAAQ,iBAAiB,IAAI;AAC1E,YAAM,aAAa,MAAM,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,uKAAuK,KAAK,GAAG,OAAO,WAAW,KAAK,QAAQ,aAAa,KAAK,KAAK,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,KACzS,MAAM,gBAAgB,CAAC,GAAG,IAAI,CAAC,WAAW,qLAAqL,OAAO,GAAG,iBAAiB,OAAO,KAAK,UAAU,aAAa,OAAO,KAAK,CAAC,KAAK,WAAW,KAAK,QAAQ,aAAa,OAAO,KAAK,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE;AACtX,YAAM,QAAQ,KAAK,cAAc,eAAe;AAChD,YAAM,MAAM,kBAAkB,UAAU,KAAK,QAAQ,iBAAiB,GAAG;AACzE,YAAM,aAAa,MAAM,UAAU,CAAC,GAAG,IAAI,CAAC,SAAS,uKAAuK,KAAK,IAAI,OAAO,WAAW,KAAK,QAAQ,YAAY,KAAK,KAAK,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE;AAC7S,YAAM,cAAc,KAAK,cAAc,qBAAqB;AAC5D,kBAAY,YAAY,KAAK,QAAQ,uBAAuB,MAAM,gBAAgB,CAAC,GAAG,OAAO,CAAC,SAAS,KAAK,QAAQ,KAAK,KAAK,QAAQ,KAAK,SAAS,EAAE,IAAI,CAAC,SAAS,yEAAyE,aAAa,OAAO,KAAK,IAAI,UAAU,aAAa,MAAM,KAAK,GAAG,uBAAuB,KAAK,IAAI,GAAG,KAAK,YAAY,KAAK,IAAI,CAAC,0DAA0D,KAAK,KAAK,qCAAqC,EAAE,KAAK,EAAE,IAAI;AACne,WAAK,cAAc,MAAM,OAAO,MAAM,UAAU;AAAA,IAClD,CAAC;AAAA,EACH;AAAA,EAEA,cAAc,MAAM,OAAO,MAAM,YAAY;AAC3C,UAAM,SAAS,KAAK,cAAc,gBAAgB;AAClD,UAAM,UAAU,cAAc,KAAK,mBAAmB,MAAM;AAC5D,QAAI,OAAO;AACX,QAAI,MAAM,eAAgB,SAAQ,4MAA4M,mBAAmB,CAAC,aAAa,aAAa,SAAS,CAAC,iBAAiB,UAAU,KAAK,QAAQ,iBAAiB,GAAG,CAAC,KAAK,QAAQ,gBAAgB,CAAC;AACjY,QAAI,WAAW,KAAK,QAAQ,aAAa;AACvC,YAAM,SAAS,QAAQ,KAAK,qBAAqB,MAAM,EAAE,GAAG,OAAO;AACnE,YAAM,cAAc,oBAAoB,KAAK,UAAU,MAAM,EAAE,EAAE,SAAS;AAC1E,cAAQ;AACR,cAAQ,cAAc,EAAE,QAAQ,cAAc,OAAO,aAAa,oBAAoB,kBAAkB,QAAQ,KAAK,MAAM,QAAQ,aAAa,aAAa,WAAW,EAAE,CAAC;AAC3K,cAAQ,cAAc,EAAE,QAAQ,SAAS,OAAO,eAAe,QAAQ,KAAK,MAAM,QAAQ,uBAAuB,EAAE,CAAC;AACpH,cAAQ,cAAc,EAAE,QAAQ,kBAAkB,OAAO,kBAAkB,QAAQ,KAAK,QAAQ,KAAK,yBAAyB,MAAM,IAAI,MAAM,QAAQ,qBAAqB,EAAE,CAAC;AAC9K,UAAI,CAAC,KAAK,QAAQ,mBAAmB,YAAa,SAAQ,cAAc,EAAE,QAAQ,kBAAkB,OAAO,kBAAkB,WAAW,mBAAmB,MAAM,QAAQ,OAAO,EAAE,CAAC;AACnL,UAAI,CAAC,KAAK,QAAQ,iBAAiB;AACjC,gBAAQ;AACR,gBAAQ,cAAc,EAAE,QAAQ,kBAAkB,OAAO,kBAAkB,QAAQ,KAAK,QAAQ,KAAK,sBAAsB,aAAa,MAAM,QAAQ,SAAS,EAAE,WAAW,aAAa,CAAC,EAAE,CAAC;AAC7L,gBAAQ,cAAc,EAAE,QAAQ,cAAc,OAAO,wBAAwB,QAAQ,KAAK,QAAQ,KAAK,sBAAsB,SAAS,MAAM,QAAQ,OAAO,EAAE,CAAC;AAC9J,gBAAQ,cAAc,EAAE,QAAQ,cAAc,OAAO,sBAAsB,QAAQ,KAAK,QAAQ,KAAK,sBAAsB,SAAS,MAAM,QAAQ,SAAS,EAAE,WAAW,YAAY,CAAC,EAAE,CAAC;AACxL,gBAAQ,cAAc,EAAE,QAAQ,YAAY,OAAO,aAAa,QAAQ,KAAK,QAAQ,KAAK,sBAAsB,OAAO,MAAM,QAAQ,QAAQ,EAAE,CAAC;AAChJ,gBAAQ,cAAc,EAAE,QAAQ,kBAAkB,OAAO,yBAAyB,QAAQ,KAAK,QAAQ,QAAQ,MAAM,QAAQ,UAAU,EAAE,CAAC;AAAA,MAC5I;AACA,cAAQ;AACR,UAAI,CAAC,KAAK,QAAQ,mBAAmB,OAAQ,SAAQ,KAAK,yBAAyB,KAAK;AAAA,IAC1F;AACA,WAAO,YAAY;AAAA,EACrB;AAAA,EAEA,yBAAyB,OAAO;AAC9B,UAAM,SAAS,KAAK,qBAAqB,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,QAAQ,IAAI,MAAM,OAAO,UAAU,MAAM;AAChH,WAAO;AAAA,+DACoD,OAAO,WAAW,SAAS,MAAM,6BAA6B,OAAO,WAAW,SAAS,MAAM,kFAAkF,OAAO,WAAW,sDAAsD,EAAE,KAAK,QAAQ,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,2JAChM,OAAO,SAAS,QAAQ,QAAQ,KAAK;AAAA,wEACxH,KAAK,IAAI,GAAG,OAAO,OAAO,MAAM,KAAK,EAAE,CAAC;AAAA;AAAA,EAE9G;AAAA,EAEA,iBAAiB;AACf,UAAM,UAAU,KAAK,oBAAoB,KAAK,oBAAoB,KAAK;AACvE,UAAM,UAAU,KAAK,oBAAoB,KAAK,qBAAqB,KAAK;AACxE,UAAM,UAAU,KAAK,oBAAoB,KAAK,oBAAoB,KAAK;AACvE,QAAI,CAAC,QAAS;AACd,YAAQ,MAAM,SAAS,GAAG,QAAQ,YAAY;AAC9C,QAAI,OAAO,KAAK,mBAAmB,OAAO;AAC1C,YAAQ,KAAK,eAAe,OAAO;AACnC,YAAQ,KAAK,cAAc;AAC3B,YAAQ,KAAK,qBAAqB;AAClC,YAAQ,KAAK,mBAAmB,OAAO;AACvC,YAAQ,YAAY;AAAA,EACtB;AAAA,EAEA,mBAAmB,SAAS;AAC1B,UAAM,WAAW,KAAK,eAAe,CAAC,GAAG,KAAK,UAAU,KAAK,YAAY,IAAI,KAAK;AAClF,QAAI,CAAC,SAAS,OAAQ,QAAO;AAC7B,UAAM,OAAO,QAAQ,QAAQ,CAAC,WAAW,oBAAoB,UAAU,OAAO,MAAM,EAAE,EAAE,IAAI,CAAC,YAAY;AACvG,YAAM,WAAW,mBAAmB,EAAE,SAAS,QAAQ,cAAc,CAAC,UAAU,KAAK,aAAa,OAAO,MAAM,EAAE,CAAC;AAClH,UAAI,CAAC,SAAU,QAAO;AACtB,YAAM,WAAW,QAAQ,OAAO,KAAK,qBAAqB,QAAQ,OAAO;AACzE,UAAI,QAAQ,SAAS,OAAO;AAC1B,cAAM,OAAO,WAAW,SAAS,MAAM,MAAM,KAAK,KAAK,EAAE;AACzD,eAAO,eAAe,QAAQ,OAAO,cAAc,OAAO,CAAC,6BAA6B,SAAS,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,2GAA2G,SAAS,MAAM,KAAK,kHAAkH,OAAO,YAAY,SAAS,MAAM,IAAI,EAAE,QAAQ,SAAS,MAAM,CAAC,WAAW,SAAS,MAAM,KAAK,4GAA4G,IAAI,YAAY,EAAE,GAAG,WAAW,eAAe,SAAS,MAAM,CAAC,SAAS,SAAS,MAAM,CAAC,iBAAiB,SAAS,MAAM,KAAK,wCAAwC,EAAE;AAAA,MACjuB;AACA,aAAO,kCAAkC,SAAS,UAAU,CAAC,SAAS,SAAS,UAAU,CAAC,SAAS,SAAS,QAAQ,CAAC,SAAS,SAAS,QAAQ,CAAC,aAAa,SAAS,MAAM,KAAK,mBAAmB,SAAS,MAAM,SAAS,uBAAuB,SAAS,MAAM,YAAY,KAAK,GAAG,CAAC,cAAc,QAAQ,OAAO,cAAc,OAAO,CAAC,MAAM,WAAW,2CAA2C,SAAS,MAAM,CAAC,SAAS,SAAS,MAAM,CAAC,iBAAiB,SAAS,MAAM,KAAK,sCAAsC,QAAQ,SAAS,cAAc,yCAAyC,SAAS,IAAI,CAAC,SAAS,SAAS,IAAI,CAAC,iBAAiB,SAAS,MAAM,KAAK,wCAAwC,EAAE,KAAK,EAAE;AAAA,IAC/rB,CAAC,CAAC,EAAE,KAAK,EAAE;AACX,WAAO,qHAAqH,IAAI;AAAA,EAClI;AAAA,EAEA,eAAe,SAAS;AACtB,QAAI,CAAC,KAAK,QAAQ,YAAY,OAAQ,QAAO;AAC7C,WAAO,QAAQ,QAAQ,CAAC,WAAW,KAAK,QAAQ,WAAW,IAAI,CAAC,QAAQ,gBAAgB;AACtF,YAAM,QAAQ,OAAO,OAAO,KAAK,OAAO,IAAI;AAC5C,YAAM,QAAQ,KAAK,WAAW,IAAI,OAAO,MAAM,EAAE;AACjD,YAAM,SAAS,QAAQ,MAAM,SAAS,MAAM,OAAO,MAAM;AACzD,UAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,KAAK,QAAQ,EAAG,QAAO;AAC9D,aAAO,4CAA4C,WAAW,yFAAyF,OAAO,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK,UAAU,OAAO,KAAK,IAAI,CAAC,cAAc,WAAW,OAAO,SAAS,EAAE,CAAC,iBAAiB,WAAW,OAAO,aAAa,OAAO,SAAS,cAAc,CAAC,oGAAoG,OAAO,SAAS,SAAS;AAAA,IACrd,CAAC,CAAC,EAAE,KAAK,EAAE;AAAA,EACb;AAAA,EAEA,gBAAgB;AACd,UAAM,YAAY,KAAK,QAAQ,eAAe,KAAK,YAAY;AAC/D,QAAI,CAAC,UAAW,QAAO;AACvB,WAAO,4FAA4F,UAAU,CAAC,uHAAuH,UAAU,CAAC;AAAA,QAC5O,UAAU,OAAO,IAAI,CAAC,UAAU,+IAA+I,MAAM,CAAC,UAAU,MAAM,CAAC,iBAAiB,MAAM,KAAK,UAAU,EAAE,KAAK,EAAE,CAAC;AAAA,4NACnC,UAAU,QAAQ,UAAU,UAAU,QAAQ,qCAAqC,WAAW,KAAK,QAAQ,UAAU,CAAC,KAAK,WAAW,KAAK,QAAQ,aAAa,UAAU,MAAM,CAAC,CAAC,SAAS,UAAU,OAAO,IAAI,CAAC,UAAU,2GAA2G,MAAM,KAAK,6EAA6E,WAAW,MAAM,IAAI,CAAC,mCAAmC,WAAW,KAAK,QAAQ,aAAa,MAAM,MAAM,CAAC,CAAC,oBAAoB,EAAE,KAAK,EAAE,CAAC;AAAA,EAClwB;AAAA,EAEA,uBAAuB;AACrB,UAAM,OAAO,KAAK,qBAAqB,cAAc,KAAK,kBAAkB,OAAO,KAAK,kBAAkB,GAAG;AAC7G,WAAO,OAAO,gHAAgH,KAAK,IAAI,UAAU,KAAK,GAAG,YAAY,KAAK,KAAK,aAAa,KAAK,MAAM,eAAe;AAAA,EACxN;AAAA,EAEA,mBAAmB,SAAS;AAC1B,UAAM,UAAU,KAAK,SAAS,KAAK,CAAC,SAAS,KAAK,OAAO,KAAK,iBAAiB;AAC/E,QAAI,CAAC,QAAS,QAAO;AACrB,UAAM,SAAS,QAAQ,KAAK,CAAC,SAAS,KAAK,MAAM,OAAO,QAAQ,OAAO;AACvE,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,QAAQ,QAAQ,SAAS,CAAC;AAChC,UAAM,YAAY,QAAQ,SAAS,eAAe,QAAQ,SAAS;AACnE,UAAM,UAAU,QAAQ,SAAS;AACjC,UAAM,OAAO,KAAK;AAAA,MAChB,OAAO,KAAK,IAAI;AAAA,MAChB,OAAO,KAAK,IAAI,OAAO,KAAK,QAAQ,aAAa,QAAQ;AAAA,IAC3D;AACA,WAAO,2LAA2L,IAAI,UAAU,OAAO,KAAK,IAAI,CAAC;AAAA,QAC7N,YAAY,2GAA2G,MAAM,cAAc,sDAAsD,EAAE,mBAAmB,EAAE;AAAA,QACxN,UAAU,2CAA2C,WAAW,MAAM,QAAQ,EAAE,CAAC,8FAA8F,EAAE;AAAA,sDACnI,kBAAkB,KAAK,MAAM,SAAS,EAAE,IAAI,MAAM,QAAQ,SAAS;AAAA;AAAA,EAEvH;AAAA,EAEA,aAAa,OAAO,QAAQ;AAC1B,UAAM,QAAQ,KAAK,WAAW,IAAI,OAAO,MAAM,EAAE;AACjD,UAAM,QAAQ,YAAY,UAAU,OAAO,OAAO,MAAM,MAAM,MAAM,MAAM,OAAO,KAAK,KAAK,GAAG,KAAK,QAAQ,IAAI,OAAO,MAAM,EAAE,GAAG,KAAK,SAAS,IAAI,OAAO,MAAM,EAAE,CAAC;AACnK,WAAO,uBAAuB,EAAE,OAAO,OAAO,QAAQ,OAAO,MAAM,OAAO,KAAK,CAAC;AAAA,EAClF;AAAA,EAEA,cAAc,OAAO,MAAM;AACzB,UAAM,OAAO,KAAK,sBAAsB;AACxC,WAAO,EAAE,GAAG,MAAM,UAAU,KAAK,OAAO,KAAK,YAAY,GAAG,MAAM,UAAU,KAAK,MAAM,KAAK,UAAU;AAAA,EACxG;AAAA,EAEA,aAAa,OAAO;AAClB,UAAM,OAAO,MAAM,OAAO,UAAU,oBAAoB;AACxD,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,aAAa,QAAQ,KAAK,QAAQ,+BAA+B,CAAC;AACxE,UAAM,UAAU,aAAa,KAAK,oBAAoB,KAAK;AAC3D,UAAM,QAAQ,OAAO,KAAK,QAAQ,UAAU;AAC5C,UAAM,SAAS,aAAa,QAAQ,CAAC,IAAI,QAAQ,KAAK;AACtD,UAAM,OAAO,aAAa,KAAK,oBAAoB,KAAK;AACxD,WAAO,SAAS,EAAE,QAAQ,MAAM,OAAO,KAAK,cAAc,OAAO,IAAI,GAAG,WAAW,IAAI;AAAA,EACzF;AAAA,EAEA,YAAY,OAAO;AACjB,UAAM,SAAS,MAAM,OAAO,UAAU,qBAAqB;AAC3D,QAAI,QAAQ;AACV,YAAM,gBAAgB;AACtB,WAAK,QAAQ,mBAAmB,KAAK,QAAQ,WAAW,OAAO,OAAO,QAAQ,WAAW,CAAC,CAAC;AAC3F;AAAA,IACF;AACA,UAAM,SAAS,MAAM,OAAO,UAAU,eAAe;AACrD,QAAI,CAAC,OAAQ;AACb,UAAM,eAAe;AACrB,UAAM,gBAAgB;AACtB,UAAM,UAAU,KAAK,aAAa,KAAK;AACvC,UAAM,UAAU,SAAS,OAAO,MAAM,MAAM,KAAK,kBAAkB,KAAK;AACxE,YAAQ,OAAO,QAAQ,QAAQ;AAAA,MAC7B,KAAK;AAAc,aAAK,oBAAoB,KAAK,gBAAgB,IAAI,KAAK,eAAe,OAAO;AAAG;AAAA,MACnG,KAAK;AAAS,aAAK,WAAW,OAAO;AAAG;AAAA,MACxC,KAAK;AAAe,aAAK,aAAa,OAAO;AAAG;AAAA,MAChD,KAAK;AAAkB,aAAK,uBAAuB,KAAK,yBAAyB,UAAU,OAAO;AAAS,aAAK,oBAAoB;AAAM,aAAK,KAAK,6BAA6B,IAAI;AAAG,aAAK,cAAc;AAAG;AAAA,MAC9M,KAAK;AAAkB,aAAK,QAAQ,yBAAyB,KAAK,KAAK,0BAA0B,OAAO,IAAI,KAAK,YAAY,KAAK,SAAS,OAAO,CAAC,SAAS,KAAK,YAAY,OAAO,CAAC;AAAG;AAAA,MACxL,KAAK;AAAkB,aAAK,oBAAoB,OAAO;AAAG;AAAA,MAC1D,KAAK;AAAkB,aAAK,kBAAkB,WAAW;AAAG;AAAA,MAC5D,KAAK;AAAc,aAAK,kBAAkB,OAAO;AAAG;AAAA,MACpD,KAAK;AAAc,aAAK,kBAAkB,OAAO;AAAG;AAAA,MACpD,KAAK;AAAY,aAAK,kBAAkB,KAAK;AAAG;AAAA,MAChD,KAAK;AAAe,aAAK,oBAAoB,SAAS,EAAE,UAAU,CAAC,KAAK,qBAAqB,OAAO,GAAG,SAAS,CAAC;AAAG;AAAA,MACpH,KAAK;AAAe,aAAK,oBAAoB,SAAS,EAAE,MAAM,KAAK,qBAAqB,OAAO,GAAG,SAAS,QAAQ,QAAQ,MAAM,CAAC;AAAG;AAAA,MACrI,KAAK;AAAkB,aAAK,sBAAsB,CAAC,aAAa,EAAE,GAAG,SAAS,OAAO,EAAE,GAAG,QAAQ,OAAO,aAAa,QAAQ,OAAO,gBAAgB,MAAM,EAAE,EAAE;AAAG;AAAA,MAClK;AAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,YAAY,OAAO;AACjB,QAAI,MAAM,OAAO,QAAQ,sBAAsB,GAAG;AAChD,YAAM,UAAU,KAAK,aAAa,KAAK;AACvC,WAAK,oBAAoB,SAAS,OAAO,MAAM,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,MAAM,OAAO,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;AAAA,IACzH,WAAW,MAAM,OAAO,QAAQ,iBAAiB,GAAG;AAClD,WAAK,sBAAsB,CAAC,aAAa,EAAE,GAAG,SAAS,OAAO,EAAE,GAAG,QAAQ,OAAO,MAAM,MAAM,OAAO,MAAM,EAAE,EAAE;AAAA,IACjH,WAAW,MAAM,OAAO,QAAQ,sBAAsB,GAAG;AACvD,WAAK,sBAAsB,CAAC,aAAa,EAAE,GAAG,SAAS,OAAO,EAAE,GAAG,QAAQ,OAAO,OAAO,MAAM,OAAO,MAAM,EAAE,EAAE;AAAA,IAClH;AAAA,EACF;AAAA,EAEA,kBAAkB,OAAO;AACvB,QAAI,MAAM,OAAO,UAAU,cAAc,EAAG;AAC5C,QAAI,MAAM,WAAW,EAAG;AACxB,UAAM,UAAU,KAAK,aAAa,KAAK;AACvC,QAAI,CAAC,QAAS;AACd,UAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,SAAK,uBAAuB;AAC5B,SAAK,iBAAiB,OAAO,MAAM;AACnC,UAAM,SAAS,MAAM,KAAK,OAAO,KAAK,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,OAAO,KAAK,SAAS,MAAM,KAAK,OAAO,KAAK,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,OAAO,KAAK;AAC9J,QAAI,UAAU,KAAK,qBAAqB,CAAC,KAAK,QAAQ,iBAAiB;AACrE,YAAM,YAAY,uBAAuB,EAAE,OAAO,OAAO,OAAO,OAAO,MAAM,OAAO,MAAM,sBAAsB,KAAK,QAAQ,sBAAsB,cAAc,EAAE,SAAS,KAAK,WAAW,GAAG,WAAW,EAAE,SAAS,KAAK,QAAQ,GAAG,kBAAkB,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;AACnR,UAAI,CAAC,SAAS,SAAS,KAAK,EAAE,SAAS,KAAK,iBAAiB,GAAG;AAC9D,aAAK,cAAc,OAAO,MAAM,IAAI,KAAK,mBAAmB,WAAW,SAAS;AAAA,MAClF,WAAW,KAAK,gBAAgB,YAAY,OAAO,MAAM,IAAI;AAC3D,aAAK,cAAc,OAAO,MAAM,IAAI,aAAa,KAAK,eAAe,OAAO,SAAS;AAAA,MACvF,OAAO;AACL,aAAK,iBAAiB,EAAE,SAAS,OAAO,MAAM,IAAI,MAAM,aAAa,OAAO,UAAU;AACtF,aAAK,eAAe,mBAAmB,EAAE,SAAS,OAAO,MAAM,IAAI,MAAM,aAAa,OAAO,WAAW,KAAK,UAAU,CAAC;AAAA,MAC1H;AAAA,IACF,WAAW,UAAU,KAAK,yBAAyB,OAAO,MAAM,IAAI;AAClE,WAAK,OAAO,EAAE,MAAM,aAAa,QAAQ,OAAO,MAAM;AACtD,WAAK,oBAAoB,EAAE,OAAO,OAAO,KAAK,MAAM;AAAA,IACtD,WAAW,QAAQ;AACjB,YAAM,MAAM,KAAK,WAAW,OAAO,MAAM;AACzC,UAAI,KAAK;AACP,aAAK,oBAAoB,IAAI,QAAQ;AACrC,aAAK,KAAK,6BAA6B,IAAI,QAAQ,EAAE;AACrD,YAAI,IAAI,YAAY,QAAQ,CAAC,SAAS,SAAS,KAAK,EAAE,SAAS,IAAI,QAAQ,IAAI,GAAG;AAChF,eAAK,OAAO,EAAE,MAAM,gBAAgB,QAAQ,WAAW,IAAI,QAAQ,IAAI,UAAU,IAAI,SAAS;AAAA,QAChG;AAAA,MACF,OAAO;AACL,aAAK,oBAAoB;AACzB,aAAK,KAAK,6BAA6B,IAAI;AAC3C,aAAK,OAAO,EAAE,MAAM,OAAO,QAAQ,OAAO,OAAO,OAAO,EAAE,GAAG,KAAK,WAAW,IAAI,OAAO,MAAM,EAAE,EAAE,GAAG,SAAS,KAAK,SAAS,IAAI,OAAO,MAAM,EAAE,KAAK,EAAE;AAAA,MACxJ;AAAA,IACF,WAAW,MAAM,KAAK,OAAO,KAAK,IAAI,OAAO,KAAK,OAAO;AACvD,WAAK,OAAO,EAAE,MAAM,WAAW,QAAQ,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,MAAM,EAAE,KAAK,EAAE;AAAA,IACrG,WAAW,MAAM,KAAK,OAAO,KAAK,IAAI,OAAO,KAAK,QAAQ;AACxD,WAAK,OAAO,EAAE,MAAM,WAAW,QAAQ,OAAO,OAAO,OAAO,EAAE,GAAG,KAAK,WAAW,IAAI,OAAO,MAAM,EAAE,EAAE,EAAE;AAAA,IAC1G;AACA,YAAQ,KAAK,oBAAoB,MAAM,SAAS;AAChD,SAAK,uBAAuB,QAAQ;AACpC,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,kBAAkB,OAAO;AACvB,QAAI,MAAM,OAAO,UAAU,cAAc,KAAK,CAAC,KAAK,QAAQ,CAAC,KAAK,eAAgB;AAClF,UAAM,UAAU,KAAK,aAAa,KAAK,MAAM,KAAK,yBAAyB,KAAK,QAAQ,KAAK,kBACzF,EAAE,GAAG,KAAK,sBAAsB,OAAO,KAAK,cAAc,OAAO,KAAK,qBAAqB,IAAI,EAAE,IACjG;AACJ,QAAI,CAAC,QAAS,QAAO,KAAK,eAAe;AACzC,UAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,QAAI,KAAK,gBAAgB;AACvB,UAAI,OAAO,MAAM,OAAO,KAAK,eAAe,QAAS;AACrD,YAAM,MAAM,uBAAuB,EAAE,OAAO,OAAO,OAAO,OAAO,MAAM,OAAO,MAAM,sBAAsB,KAAK,QAAQ,sBAAsB,cAAc,EAAE,SAAS,KAAK,WAAW,GAAG,WAAW,EAAE,SAAS,KAAK,QAAQ,GAAG,kBAAkB,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;AAC7Q,WAAK,eAAe,mBAAmB,EAAE,GAAG,KAAK,gBAAgB,IAAI,CAAC;AACtE,WAAK,cAAc;AACnB;AAAA,IACF;AACA,QAAI,KAAK,MAAM;AACb,YAAM,EAAE,OAAO,KAAK,IAAI,KAAK,KAAK;AAClC,UAAI,KAAK,KAAK,SAAS,gBAAgB;AACrC,cAAM,YAAY,uBAAuB,EAAE,OAAO,OAAO,MAAM,sBAAsB,KAAK,QAAQ,sBAAsB,cAAc,EAAE,SAAS,KAAK,WAAW,GAAG,WAAW,EAAE,SAAS,KAAK,QAAQ,GAAG,kBAAkB,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;AACxP,cAAM,OAAO,kBAAkB,KAAK,UAAU,KAAK,KAAK,WAAW,CAAC,YAAY;AAC9E,cAAI,QAAQ,SAAS,SAAS;AAC5B,kBAAM,UAAU,QAAQ,KAAK,KAAK,QAAQ,MAAM,KAAK,QAAQ,MAAM;AACnE,mBAAO,EAAE,GAAG,SAAS,OAAO,EAAE,GAAG,UAAU,GAAG,GAAG,UAAU,EAAE,GAAG,KAAK,EAAE,GAAG,UAAU,IAAI,QAAQ,GAAG,UAAU,EAAE,EAAE;AAAA,UACnH;AACA,cAAI,QAAQ,SAAS,QAAS,QAAO,EAAE,GAAG,SAAS,OAAO,EAAE,GAAG,QAAQ,OAAO,GAAG,UAAU,EAAE,GAAG,KAAK,EAAE,GAAG,QAAQ,KAAK,GAAG,UAAU,EAAE,EAAE;AACxI,cAAI,QAAQ,SAAS,MAAO,QAAO,EAAE,GAAG,SAAS,OAAO,WAAW,KAAK,UAAU;AAClF,cAAI,KAAK,KAAK,aAAa,WAAW,KAAK,KAAK,aAAa,MAAO,QAAO,EAAE,GAAG,SAAS,CAAC,KAAK,KAAK,QAAQ,GAAG,UAAU;AACzH,iBAAO;AAAA,QACT,CAAC;AACD,aAAK,WAAW;AAChB,aAAK,KAAK,oBAAoB,CAAC,GAAG,IAAI,CAAC;AACvC,aAAK,cAAc;AACnB;AAAA,MACF;AACA,UAAI,KAAK,KAAK,SAAS,YAAa,MAAK,oBAAoB,EAAE,OAAO,KAAK,KAAK,OAAO,KAAK,MAAM;AAClG,UAAI,KAAK,KAAK,SAAS,OAAO;AAC5B,cAAM,OAAO,KAAK,KAAK,MAAM,OAAO,KAAK,KAAK,MAAM;AACpD,cAAM,UAAU,MAAM,IAAI,KAAK,KAAK,MAAM,KAAK,KAAK,QAAQ;AAC5D,cAAM,YAAY,UAAU,OAAO,KAAK,KAAK,MAAM,MAAM,KAAK,KAAK,MAAM,MAAM,KAAK,KAAK;AACzF,cAAM,aAAa,UAAU,OAAO,UAAU,SAAS,KAAK,QAAQ,IAAI,MAAM,EAAE,KAAK;AACrF,cAAM,UAAU,MAAM,IAAI,KAAK,KAAK,MAAM,KAAK,KAAK,SAAS;AAC7D,aAAK,WAAW,IAAI,MAAM,IAAI,EAAE,MAAM,KAAK,KAAK,MAAM,OAAO,QAAQ,MAAM,KAAK,KAAK,MAAM,OAAO,OAAO,CAAC;AAC1G,aAAK,SAAS,IAAI,MAAM,IAAI,KAAK,KAAK,UAAU,MAAM;AAAA,MACxD;AACA,UAAI,KAAK,KAAK,SAAS,UAAW,MAAK,QAAQ,IAAI,MAAM,IAAI,MAAM,KAAK,KAAK,QAAQ,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,KAAK,IAAI,GAAG,aAAa,WAAW,CAAC;AAC9J,UAAI,KAAK,KAAK,SAAS,WAAW;AAChC,cAAM,UAAU,KAAK,KAAK,MAAM,OAAO,KAAK,KAAK,MAAM,QAAQ;AAC/D,cAAM,OAAO,OAAO,KAAK,KAAK,MAAM,OAAO,KAAK,KAAK,MAAM,QAAQ,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,KAAK,IAAI,GAAG,kBAAkB,gBAAgB;AACrJ,aAAK,WAAW,IAAI,MAAM,IAAI,EAAE,MAAM,SAAS,OAAO,GAAG,MAAM,SAAS,OAAO,EAAE,CAAC;AAAA,MACpF;AACA,UAAI,KAAK,KAAK,SAAS,MAAO,MAAK,gBAAgB,OAAO,MAAM;AAAA,UAC3D,MAAK,cAAc;AACxB;AAAA,IACF;AACA,SAAK,gBAAgB,OAAO,QAAQ,QAAQ,UAAU;AAAA,EACxD;AAAA,EAEA,gBAAgB,OAAO;AACrB,QAAI,MAAM,OAAO,UAAU,cAAc,KAAK,CAAC,KAAK,QAAQ,CAAC,KAAK,eAAgB;AAClF,UAAM,UAAU,KAAK,aAAa,KAAK,MAAM,KAAK,uBAC9C,EAAE,GAAG,KAAK,sBAAsB,OAAO,KAAK,cAAc,OAAO,KAAK,qBAAqB,IAAI,EAAE,IACjG;AACJ,QAAI,KAAK,MAAM,SAAS,eAAe,KAAK,mBAAmB;AAC7D,YAAM,aAAa,cAAc,KAAK,kBAAkB,OAAO,KAAK,kBAAkB,GAAG;AACzF,UAAI,YAAY,SAAS,KAAK,YAAY,UAAU,GAAG;AACrD,cAAM,SAAS,KAAK,KAAK;AACzB,2BAAmB;AAAA,UACjB,OAAO,OAAO;AAAA,UACd,MAAM,OAAO;AAAA,UACb,OAAO,KAAK,kBAAkB;AAAA,UAC9B,KAAK,KAAK,kBAAkB;AAAA,UAC5B,sBAAsB,KAAK,QAAQ;AAAA,UACnC,cAAc,EAAE,SAAS,KAAK,WAAW;AAAA,UACzC,WAAW,EAAE,SAAS,KAAK,QAAQ;AAAA,UACnC,kBAAkB,EAAE,SAAS,KAAK,SAAS;AAAA,UAC3C,iBAAiB,EAAE,SAAS,oBAAI,IAAI,EAAE;AAAA,QACxC,CAAC;AAAA,MACH;AACA,WAAK,uBAAuB;AAC5B,WAAK,oBAAoB;AAAA,IAC3B;AACA,SAAK,OAAO;AACZ,SAAK,sBAAsB,wBAAwB,MAAM,SAAS;AAClE,SAAK,uBAAuB;AAC5B,SAAK,uBAAuB;AAC5B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,YAAY,OAAO;AACjB,UAAM,UAAU,KAAK,aAAa,KAAK;AACvC,QAAI,CAAC,QAAS;AACd,UAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,UAAM,SAAS,MAAM,KAAK,OAAO,KAAK,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,OAAO,KAAK,SAAS,MAAM,KAAK,OAAO,KAAK,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,OAAO,KAAK;AAC9J,QAAI,CAAC,OAAQ;AACb,UAAM,eAAe;AACrB,UAAM,QAAQ,KAAK,WAAW,IAAI,OAAO,MAAM,EAAE;AACjD,UAAM,QAAQ,OAAO,MAAM,IAAI,OAAO,KAAK,KAAK,OAAO,KAAK,OAAO,GAAG,CAAC;AACvE,UAAM,SAAS,MAAM,OAAO,SAAS,MAAM,OAAO,MAAM;AACxD,UAAM,OAAO,KAAK,IAAI,MAAM,SAAS,IAAK;AAC1C,UAAM,OAAO,OAAO,MAAM,OAAO,MAAM,QAAQ,MAAM,kBAAkB,gBAAgB;AACvF,SAAK,WAAW,IAAI,OAAO,MAAM,IAAI,EAAE,MAAM,SAAS,QAAQ,MAAM,MAAM,UAAU,IAAI,SAAS,KAAK,CAAC;AACvG,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,kBAAkB,OAAO;AACvB,UAAM,UAAU,KAAK,aAAa,KAAK;AACvC,QAAI,CAAC,WAAW,CAAC,KAAK,QAAQ,mBAAoB;AAClD,UAAM,eAAe;AACrB,UAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,UAAM,SAAS,MAAM,KAAK,OAAO,KAAK,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,OAAO,KAAK,SAAS,MAAM,KAAK,OAAO,KAAK,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,OAAO,KAAK;AAC9J,UAAM,OAAO,SAAS,uBAAuB,EAAE,OAAO,OAAO,OAAO,OAAO,MAAM,OAAO,MAAM,sBAAsB,KAAK,QAAQ,sBAAsB,cAAc,EAAE,SAAS,KAAK,WAAW,GAAG,WAAW,EAAE,SAAS,KAAK,QAAQ,GAAG,kBAAkB,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC,IAAI;AAC3R,SAAK,QAAQ,mBAAmB,EAAE,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,CAAC;AAAA,EAC7E;AAAA,EAEA,gBAAgB,OAAO,QAAQ;AAC7B,UAAM,SAAS,MAAM,KAAK,OAAO,KAAK,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,OAAO,KAAK,SAAS,MAAM,KAAK,OAAO,KAAK,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,OAAO,KAAK;AAC9J,QAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,aAAc,QAAO,KAAK,eAAe;AACtE,UAAM,QAAQ,KAAK,WAAW,IAAI,OAAO,MAAM,EAAE;AACjD,UAAM,SAAS,MAAM,QAAS,MAAM,IAAI,OAAO,KAAK,KAAK,OAAO,KAAK,SAAU,MAAM,OAAO,MAAM;AAClG,UAAM,QAAQ,YAAY,UAAU,OAAO,OAAO,MAAM,MAAM,MAAM,MAAM,OAAO,KAAK,KAAK,GAAG,KAAK,QAAQ,IAAI,OAAO,MAAM,EAAE,GAAG,KAAK,SAAS,IAAI,OAAO,MAAM,EAAE,CAAC;AACnK,UAAM,SAAS,OAAO,MAAM,OAAO,IAAI,CAAC,WAAW;AACjD,YAAM,UAAU,OAAO,iBAAiB,MAAM,MAAM,MAAM,MAAM,OAAO,KAAK,KAAK;AACjF,UAAI,CAAC,QAAQ,WAAY,QAAO;AAChC,YAAM,QAAQ,qBAAqB,QAAQ,GAAG,MAAM;AACpD,YAAM,OAAO,EAAE,GAAG,QAAQ,EAAE,KAAK,GAAG,GAAG,QAAQ,EAAE,KAAK,EAAE;AACxD,YAAM,SAAS,uBAAuB,EAAE,OAAO,MAAM,OAAO,QAAQ,OAAO,MAAM,OAAO,KAAK,CAAC;AAC9F,aAAO,EAAE,IAAI,OAAO,IAAI,MAAM,OAAO,MAAM,OAAO,OAAO,OAAO,GAAG,OAAO,GAAG,GAAG,OAAO,GAAG,QAAQ,KAAK,GAAG,QAAQ,KAAK,EAAE;AAAA,IAC3H,CAAC,EAAE,OAAO,OAAO;AACjB,QAAI,CAAC,OAAO,OAAQ,QAAO,KAAK,eAAe;AAC/C,UAAM,UAAU,OAAO,OAAO,CAAC,MAAM,SAAS,KAAK,IAAI,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,CAAC,IAAI,OAAO,IAAI;AACnH,SAAK,YAAY;AAAA,MACf,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA,UAAU,MAAM,IAAI,MAAM,OAAO,KAAK,IAAI,OAAO,KAAK,QAAQ,MAAM,IAAI,MAAM,MAAM,IAAI;AAAA,MACxF,UAAU,MAAM,MAAM,IAAI,IAAI,OAAO,KAAK,IAAI,aAAa,KAAK,OAAO,KAAK,IAAI,OAAO,KAAK,SAAS,EAAE;AAAA,IACzG;AACA,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,iBAAiB;AACf,QAAI,CAAC,KAAK,UAAW;AACrB,SAAK,YAAY;AACjB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,WAAW,OAAO,QAAQ;AACxB,eAAW,WAAW,oBAAoB,KAAK,UAAU,OAAO,MAAM,EAAE,GAAG;AACzE,YAAM,MAAM,eAAe,EAAE,OAAO,SAAS,QAAQ,cAAc,CAAC,SAAS,KAAK,aAAa,MAAM,MAAM,EAAE,CAAC;AAC9G,UAAI,IAAK,QAAO;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,SAAS,MAAM,OAAO,KAAK;AACvC,UAAM,UAAU,cAAc,EAAE,SAAS,MAAM,OAAO,KAAK,iBAAiB,KAAK,QAAQ,gBAAgB,CAAC;AAC1G,SAAK,YAAY,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC;AAC5C,SAAK,oBAAoB,QAAQ;AACjC,SAAK,oBAAoB;AACzB,SAAK,eAAe;AACpB,SAAK,iBAAiB;AACtB,SAAK,KAAK,6BAA6B,QAAQ,EAAE;AACjD,SAAK,KAAK,6BAA6B,IAAI;AAAA,EAC7C;AAAA,EAEA,YAAY,UAAU;AACpB,SAAK,WAAW;AAChB,SAAK,KAAK,oBAAoB,CAAC,GAAG,QAAQ,CAAC;AAC3C,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,sBAAsB,SAAS;AAC7B,QAAI,CAAC,KAAK,kBAAmB;AAC7B,SAAK,YAAY,kBAAkB,KAAK,UAAU,KAAK,mBAAmB,OAAO,CAAC;AAAA,EACpF;AAAA,EAEA,kBAAkB,MAAM;AACtB,QAAI,CAAC,cAAc,IAAI,IAAI,KAAK,KAAK,QAAQ,gBAAiB;AAC9D,SAAK,oBAAoB,KAAK,sBAAsB,OAAO,OAAO;AAClE,SAAK,uBAAuB;AAC5B,SAAK,eAAe;AACpB,SAAK,iBAAiB;AACtB,SAAK,KAAK,6BAA6B,KAAK,iBAAiB;AAC7D,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,oBAAoB,SAAS;AAC3B,QAAI,CAAC,WAAW,KAAK,QAAQ,gBAAiB;AAC9C,UAAM,UAAU,KAAK,qBAAqB,OAAO,KAAK,EAAE,QAAQ,IAAI,MAAM,OAAO,UAAU,MAAM;AACjG,SAAK,uBAAuB,EAAE,GAAG,KAAK,sBAAsB,CAAC,OAAO,GAAG,EAAE,GAAG,SAAS,SAAS,CAAC,QAAQ,QAAQ,EAAE;AACjH,SAAK,KAAK,yBAAyB,OAAO;AAC1C,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,oBAAoB,SAAS,SAAS;AACpC,QAAI,CAAC,QAAS;AACd,UAAM,OAAO,EAAE,SAAS,MAAM,QAAQ,IAAI,MAAM,OAAO,UAAU,OAAO,GAAI,KAAK,qBAAqB,OAAO,KAAK,CAAC,GAAI,GAAG,QAAQ;AAClI,SAAK,uBAAuB,EAAE,GAAG,KAAK,sBAAsB,CAAC,OAAO,GAAG,KAAK;AAC5E,SAAK,KAAK,yBAAyB,SAAS,EAAE,GAAG,KAAK,CAAC;AACvD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,WAAW,SAAS;AAClB,UAAM,QAAQ,KAAK,QAAQ,OAAO,KAAK,CAAC,SAAS,KAAK,OAAO,OAAO;AACpE,QAAI,CAAC,MAAO;AACZ,SAAK,WAAW,IAAI,SAAS,eAAe,OAAO,KAAK,QAAQ,oBAAoB,CAAC;AACrF,SAAK,QAAQ,IAAI,SAAS,CAAC;AAC3B,SAAK,SAAS,IAAI,SAAS,CAAC;AAC5B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,eAAe,SAAS;AACtB,UAAM,QAAQ,KAAK,QAAQ,OAAO,KAAK,CAAC,SAAS,KAAK,OAAO,OAAO;AACpE,QAAI,CAAC,SAAS,KAAK,kBAAmB;AACtC,SAAK,oBAAoB;AACzB,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,QAAQ,wBAAwB;AACxC,YAAQ,YAAY;AACpB,YAAQ,YAAY,2GAA2G,cAAc,OAAO,GAAG,KAAK,QAAQ,eAAe,CAAC;AACpL,aAAS,KAAK,OAAO,OAAO;AAC5B,SAAK,oBAAoB;AACzB,SAAK,iBAAiB,QAAQ,cAAc,oBAAoB;AAChE,SAAK,eAAe,MAAM,SAAS;AACnC,SAAK,qBAAqB,QAAQ,cAAc,4BAA4B;AAC5E,UAAM,SAAS,QAAQ,cAAc,QAAQ;AAC7C,UAAM,KAAK,OAAO,WAAW,UAAU,EAAE,WAAW,MAAM,OAAO,MAAM,OAAO,OAAO,SAAS,MAAM,CAAC;AACrG,QAAI,CAAC,IAAI;AAAE,cAAQ,OAAO;AAAG,WAAK,oBAAoB;AAAM;AAAA,IAAQ;AACpE,SAAK,oBAAoB,YAAY,QAAQ,EAAE;AAC/C,SAAK,sBAAsB,OAAO,QAAQ,KAAK,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,MAAM,SAAS,aAAa,SAAS,QAAQ;AAChH,SAAK,oBAAoB,QAAQ,CAAC,CAAC,MAAM,OAAO,MAAM,QAAQ,iBAAiB,MAAM,SAAS,SAAS,UAAU,EAAE,SAAS,MAAM,IAAI,MAAS,CAAC;AAChJ,SAAK,eAAe,QAAQ,OAAO;AACnC,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,kBAAkB;AAChB,QAAI,CAAC,KAAK,kBAAmB;AAC7B,QAAI,KAAK,kBAAmB,MAAK,gBAAgB,UAAU,KAAK,iBAAiB;AACjF,SAAK,qBAAqB,QAAQ,CAAC,CAAC,MAAM,OAAO,MAAM,KAAK,mBAAmB,oBAAoB,MAAM,OAAO,CAAC;AACjH,SAAK,sBAAsB;AAC3B,mBAAe,KAAK,iBAAiB;AACrC,SAAK,mBAAmB,OAAO;AAC/B,SAAK,oBAAoB;AACzB,SAAK,oBAAoB;AACzB,SAAK,iBAAiB;AACtB,SAAK,qBAAqB;AAC1B,SAAK,oBAAoB,CAAC;AAC1B,SAAK,oBAAoB;AACzB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,cAAc,OAAO;AACnB,UAAM,WAAW,MAAM,kBAAkB,gBAAgB,MAAM,OAAO,qBAAqB,CAAC,SAAS,YAAY,QAAQ,EAAE,SAAS,MAAM,OAAO,OAAO;AACxJ,QAAI,SAAU;AACd,UAAM,UAAU,KAAK,qBAAqB,KAAK;AAC/C,UAAM,MAAM,MAAM,IAAI,YAAY;AAClC,QAAI,CAAC,aAAa,cAAc,WAAW,WAAW,EAAE,SAAS,GAAG,KAAK,CAAC,KAAK,mBAAmB;AAChG,WAAK,UAAU,IAAI,QAAQ,SAAS,EAAE,CAAC;AAAG,YAAM,eAAe;AAAG;AAAA,IACpE;AACA,QAAI,QAAQ,KAAK;AAAE,WAAK,WAAW,OAAO;AAAG,YAAM,eAAe;AAAA,IAAG,WAC5D,QAAQ,KAAK;AAAE,WAAK,uBAAuB,KAAK,yBAAyB,UAAU,OAAO;AAAS,YAAM,eAAe;AAAG,WAAK,cAAc;AAAA,IAAG,WACjJ,QAAQ,KAAK;AAAE,WAAK,oBAAoB,OAAO;AAAG,YAAM,eAAe;AAAA,IAAG,WAC1E,CAAC,KAAK,KAAK,KAAK,GAAG,EAAE,SAAS,GAAG,GAAG;AAAE,WAAK,kBAAkB,EAAE,GAAG,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,EAAE,GAAG,CAAC;AAAG,YAAM,eAAe;AAAA,IAAG,YAChJ,QAAQ,YAAY,QAAQ,gBAAgB,KAAK,mBAAmB;AAAE,WAAK,YAAY,kBAAkB,KAAK,UAAU,KAAK,iBAAiB,CAAC;AAAG,WAAK,oBAAoB;AAAM,WAAK,KAAK,6BAA6B,IAAI;AAAG,YAAM,eAAe;AAAA,IAAG,WACxP,QAAQ,aAAa,KAAK,qBAAqB,KAAK,gBAAgB,KAAK,uBAAuB;AAAE,WAAK,oBAAoB;AAAM,WAAK,eAAe;AAAM,WAAK,iBAAiB;AAAM,WAAK,uBAAuB;AAAM,WAAK,oBAAoB;AAAM,WAAK,KAAK,6BAA6B,IAAI;AAAG,WAAK,cAAc;AAAG,YAAM,eAAe;AAAA,IAAG,WACpV,QAAQ,OAAQ,QAAQ,YAAY,KAAK,mBAAoB;AAAE,WAAK,oBAAoB,KAAK,gBAAgB,IAAI,KAAK,eAAe,OAAO;AAAG,YAAM,eAAe;AAAA,IAAG;AAAA,EAClL;AAAA,EAEA,UAAU,WAAW;AACnB,UAAM,SAAS,KAAK,QAAQ;AAC5B,QAAI,CAAC,OAAO,OAAQ;AACpB,QAAI,QAAQ,KAAK,IAAI,GAAG,OAAO,UAAU,CAAC,UAAU,MAAM,OAAO,KAAK,cAAc,CAAC;AACrF,UAAM,UAAU,KAAK,IAAI,GAAG,OAAO,KAAK,QAAQ,OAAO,KAAK,CAAC;AAC7D,QAAI,cAAc,OAAQ,SAAQ,KAAK,IAAI,KAAK,MAAM,QAAQ,OAAO,IAAI,SAAS,QAAQ,CAAC;AAC3F,QAAI,cAAc,QAAS,SAAQ,KAAK,IAAI,OAAO,SAAS,GAAG,QAAQ,CAAC;AACxE,QAAI,cAAc,KAAM,SAAQ,KAAK,IAAI,GAAG,QAAQ,OAAO;AAC3D,QAAI,cAAc,OAAQ,SAAQ,KAAK,IAAI,OAAO,SAAS,GAAG,QAAQ,OAAO;AAC7E,SAAK,iBAAiB,OAAO,KAAK,EAAE;AACpC,SAAK,WAAW,KAAK,GAAG,eAAe,EAAE,OAAO,WAAW,QAAQ,UAAU,CAAC;AAC9E,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,KAAK,SAAS,MAAM;AAClB,SAAK,QAAQ,IAAI,IAAI,GAAG,IAAI;AAAA,EAC9B;AAAA,EAEA,aAAa;AACX,SAAK,QAAQ,OAAO;AACpB,SAAK,MAAM,OAAO;AAClB,SAAK,UAAU,OAAO;AACtB,SAAK,cAAc,QAAQ,CAAC,SAAS,KAAK,UAAU,UAAU,OAAO,IAAI,CAAC;AAAA,EAC5E;AAAA,EAEA,UAAU;AACR,QAAI,KAAK,UAAW;AACpB,SAAK,gBAAgB;AACrB,SAAK,YAAY;AACjB,QAAI,KAAK,SAAS,KAAM,sBAAqB,KAAK,KAAK;AACvD,SAAK,SAAS,QAAQ;AACtB,SAAK,eAAe,WAAW;AAC/B,WAAO,QAAQ,KAAK,KAAK,EAAE,QAAQ,CAAC,CAAC,MAAM,OAAO,MAAM;AACtD,YAAM,SAAS,SAAS,YAAY,SAAS,KAAK;AAClD,aAAO,oBAAoB,MAAM,OAAO;AAAA,IAC1C,CAAC;AACD,mBAAe,KAAK,OAAO;AAC3B,SAAK,WAAW;AAAA,EAClB;AACF;AAEO,IAAM,kBAAkB,CAAC,WAAW,UAAU,CAAC,MAAM,IAAI,oBAAoB,WAAW,OAAO;;;ALp+B7F;AAlDF,IAAM,YAAY,WAAW,SAASC,WAAU;AAAA,EACrD,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,GAAG;AACL,GAAG,KAAK;AACN,QAAM,UAAU,OAAO,IAAI;AAC3B,QAAM,gBAAgB,OAAO,IAAI;AACjC,QAAM,qBAAqB,OAAO,IAAI;AACtC,QAAM,sBAAsB,OAAO,YAAY;AAE/C,kBAAgB,MAAM;AACpB,UAAM,aAAa,gBAAgB,QAAQ,SAAS,OAAO;AAC3D,kBAAc,UAAU;AACxB,uBAAmB,UAAU;AAC7B,WAAO,MAAM;AACX,iBAAW,QAAQ;AACnB,oBAAc,UAAU;AACxB,yBAAmB,UAAU;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,kBAAgB,MAAM;AACpB,UAAM,aAAa,cAAc;AACjC,UAAM,WAAW,mBAAmB;AACpC,QAAI,CAAC,cAAc,CAAC,SAAU;AAC9B,UAAM,UAAU,CAAC;AACjB,QAAI,aAAa;AACjB,UAAM,OAAO,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,QAAQ,GAAG,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC;AACxE,SAAK,QAAQ,CAAC,QAAQ;AACpB,UAAI,OAAO,GAAG,SAAS,GAAG,GAAG,QAAQ,GAAG,CAAC,EAAG;AAC5C,cAAQ,GAAG,IAAI,QAAQ,GAAG;AAC1B,mBAAa;AAAA,IACf,CAAC;AACD,QAAI,WAAY,YAAW,WAAW,OAAO;AAC7C,uBAAmB,UAAU;AAAA,EAC/B,CAAC;AAED,kBAAgB,MAAM;AACpB,QAAI,oBAAoB,YAAY,cAAc;AAChD,0BAAoB,UAAU;AAC9B,oBAAc,SAAS,WAAW;AAAA,IACpC;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAEjB,sBAAoB,KAAK,OAAO;AAAA,IAC9B,YAAY,MAAM,cAAc,SAAS,WAAW;AAAA,IACpD,cAAc,CAAC,YAAY,cAAc,SAAS,aAAa,OAAO;AAAA,IACtE,aAAa,CAAC,kBAAkB,cAAc,SAAS,YAAY,aAAa;AAAA,EAClF,IAAI,CAAC,CAAC;AAEN,SAAO,oBAAC,SAAI,KAAK,SAAS,WAAsB;AAClD,CAAC;;;AMzDD,IAAM,UAAU;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,eAAe,CAAC,SAAS;AAC7B,MAAI,QAAQ,SAAS;AACrB,SAAO,MAAM;AACX,YAAS,QAAQ,UAAU,eAAgB;AAC3C,WAAO,QAAQ;AAAA,EACjB;AACF;AAEA,IAAM,aAAa,CAAC,EAAE,YAAY,aAAa,WAAW,MAAM;AAC9D,QAAM,IAAI,IAAI,aAAa,UAAU;AACrC,QAAM,IAAI,IAAI,aAAa,UAAU;AACrC,QAAM,SAAS,cAAc,aAAa,KAAK,OAAO,cAAc,IAAI;AACxE,QAAM,WAAW,KAAK,OAAO,IAAI,KAAK,cAAc;AACpD,QAAM,QAAQ,OAAS,OAAO,IAAI;AAClC,QAAM,QAAQ,OAAQ,OAAO,IAAI;AACjC,QAAM,QAAQ,OAAU,OAAO,IAAI;AACnC,QAAM,aAAa,QAAQ,OAAO,IAAI;AACtC,QAAM,aAAa,OAAQ,OAAO,IAAI;AACtC,QAAM,SAAS,OAAO,IAAI,OAAO;AACjC,QAAM,QAAQ,OAAQ,OAAO,IAAI;AACjC,QAAM,gBAAgB,MAAM,KAAK,MAAM,OAAO,IAAI,GAAG;AACrD,QAAM,iBAAiB,OAAO,OAAO,IAAI;AACzC,MAAI,QAAQ;AAEZ,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK,GAAG;AACtC,MAAE,CAAC,IAAI;AACP,UAAM,SACH,IAAI,aAAa,KAAK,cAAc,MAAM,kBAAkB,IACzD,kBAAkB,OAAO,IAAI,OAAO,IAAI,MACxC;AACN,aACE,KAAK,IAAI,IAAI,QAAQ,UAAU,IAAI,aACnC,KAAK,IAAI,IAAI,QAAQ,WAAW,IAAI,aACpC,KAAK,IAAI,IAAI,KAAK,IAAI,aAAa,OACnC,SACC,OAAO,IAAI,OAAO,QACnB;AACF,MAAE,CAAC,IAAI;AAAA,EACT;AAEA,SAAO,aAAa;AAAA,IAClB,IAAI,SAAS,UAAU,WAAW,WAAW;AAAA,IAC7C,MAAM,OAAO,cAAc,CAAC;AAAA,IAC5B,OAAO,SAAS,aAAa,eAAe,QAAQ,MAAM;AAAA,IAC1D;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEO,IAAM,mBAAmB,CAAC;AAAA,EAC/B,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,aAAa;AACf,IAAI,CAAC,MAAM;AACT,SAAO,MAAM,KAAK,EAAE,QAAQ,WAAW,GAAG,CAAC,GAAG,gBAAgB;AAAA,IAC5D,IAAI,UAAU,aAAa,CAAC;AAAA,IAC5B,OAAO,UAAU,OAAO,aAAa,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,IACxD,QAAQ,MAAM;AAAA,MAAK,EAAE,QAAQ,eAAe;AAAA,MAAG,CAACC,IAAG,gBACjD,WAAW,EAAE,YAAY,aAAa,WAAW,CAAC;AAAA,IACpD;AAAA,EACF,EAAE;AACJ;",
|
|
6
|
+
"names": ["scale", "lowerBound", "span", "rightPadding", "bufferEntry", "EMPTY_OBJECT", "ChartGrid", "_"]
|
|
7
|
+
}
|