@pixerate/editor 0.46.1 → 0.48.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/THIRD_PARTY_NOTICES.md +20 -0
- package/dist/agent/index.cjs +252 -34
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agent/index.d.cts +19 -7
- package/dist/agent/index.d.ts +19 -7
- package/dist/agent/index.js +228 -10
- package/dist/agent/index.js.map +1 -1
- package/dist/{builtins-CZW-aYKS.d.cts → builtins-1kqwLUnb.d.cts} +2 -2
- package/dist/{builtins-DghNQbT-.d.ts → builtins-BKYlHH1s.d.ts} +2 -2
- package/dist/chart/index.cjs +1596 -1849
- package/dist/chart/index.cjs.map +1 -1
- package/dist/chart/index.d.cts +760 -548
- package/dist/chart/index.d.ts +760 -548
- package/dist/chart/index.js +1499 -1752
- package/dist/chart/index.js.map +1 -1
- package/dist/{chunk-3RPOW4CS.js → chunk-2CJ3LPYQ.js} +12 -10
- package/dist/{chunk-3RPOW4CS.js.map → chunk-2CJ3LPYQ.js.map} +1 -1
- package/dist/{chunk-PQM5W7ZN.js → chunk-4FX5ACVG.js} +29 -2
- package/dist/{chunk-PQM5W7ZN.js.map → chunk-4FX5ACVG.js.map} +1 -1
- package/dist/{chunk-HHQ4XJWT.js → chunk-AMWXSYCI.js} +2 -2
- package/dist/chunk-EKYHKQPG.js +1895 -0
- package/dist/chunk-EKYHKQPG.js.map +1 -0
- package/dist/chunk-HXUL3LS7.js +113 -0
- package/dist/chunk-HXUL3LS7.js.map +1 -0
- package/dist/{chunk-ZRNHGAQT.js → chunk-JQ3BB3E6.js} +43 -1891
- package/dist/chunk-JQ3BB3E6.js.map +1 -0
- package/dist/chunk-LTUM52X6.js +4074 -0
- package/dist/chunk-LTUM52X6.js.map +1 -0
- package/dist/{chunk-J3R2OWOE.cjs → chunk-MUCYWI6W.cjs} +608 -15
- package/dist/chunk-MUCYWI6W.cjs.map +1 -0
- package/dist/chunk-PIMCHMZE.cjs +521 -0
- package/dist/chunk-PIMCHMZE.cjs.map +1 -0
- package/dist/{chunk-TK2XZK6Z.js → chunk-PKBWLEL7.js} +594 -1
- package/dist/chunk-PKBWLEL7.js.map +1 -0
- package/dist/chunk-PRSJJZBS.cjs +4074 -0
- package/dist/chunk-PRSJJZBS.cjs.map +1 -0
- package/dist/{chunk-EFDCLENW.cjs → chunk-RIWPYSKU.cjs} +29 -2
- package/dist/chunk-RIWPYSKU.cjs.map +1 -0
- package/dist/chunk-U6IZKC7B.cjs +113 -0
- package/dist/chunk-U6IZKC7B.cjs.map +1 -0
- package/dist/{chunk-EWCOFSCQ.cjs → chunk-UN33YOXW.cjs} +252 -2100
- package/dist/chunk-UN33YOXW.cjs.map +1 -0
- package/dist/{chunk-Q25ZS4F7.js → chunk-VKPEPWKZ.js} +72 -92
- package/dist/chunk-VKPEPWKZ.js.map +1 -0
- package/dist/{chunk-N4MLNJPO.cjs → chunk-WXEHCVJQ.cjs} +160 -180
- package/dist/chunk-WXEHCVJQ.cjs.map +1 -0
- package/dist/{chunk-K2LVZ4FA.cjs → chunk-XFYUFVAX.cjs} +3 -3
- package/dist/{chunk-K2LVZ4FA.cjs.map → chunk-XFYUFVAX.cjs.map} +1 -1
- package/dist/chunk-XP5IUZUO.cjs +1895 -0
- package/dist/chunk-XP5IUZUO.cjs.map +1 -0
- package/dist/chunk-XUUD43OV.js +521 -0
- package/dist/chunk-XUUD43OV.js.map +1 -0
- package/dist/{chunk-U7VGDSNY.cjs → chunk-YU4WQE5M.cjs} +101 -99
- package/dist/chunk-YU4WQE5M.cjs.map +1 -0
- package/dist/commands/index.cjs +93 -11
- package/dist/commands/index.cjs.map +1 -1
- package/dist/commands/index.d.cts +9 -7
- package/dist/commands/index.d.ts +9 -7
- package/dist/commands/index.js +92 -10
- package/dist/commands/index.js.map +1 -1
- package/dist/controller-ChjCCMLl.d.cts +822 -0
- package/dist/controller-DtbEo3om.d.ts +822 -0
- package/dist/extensions/index.cjs +32 -3
- package/dist/extensions/index.cjs.map +1 -1
- package/dist/extensions/index.d.cts +5 -2
- package/dist/extensions/index.d.ts +5 -2
- package/dist/extensions/index.js +31 -2
- package/dist/generation/index.cjs +2 -2
- package/dist/generation/index.js +1 -1
- package/dist/{index-CfOQf70b.d.cts → index-DoHqT1mq.d.cts} +222 -5
- package/dist/{index-jwJ_onWf.d.ts → index-YLZ0fKqE.d.ts} +222 -5
- package/dist/index.cjs +38 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -5
- package/dist/index.d.ts +13 -5
- package/dist/index.js +52 -24
- package/dist/index.js.map +1 -1
- package/dist/parameters/index.d.cts +1 -1
- package/dist/parameters/index.d.ts +1 -1
- package/dist/{registry-vz6HOiiy.d.cts → registry-CaR7LC6W.d.cts} +2 -0
- package/dist/{registry-BfVD-vVg.d.ts → registry-rVtFJjRM.d.ts} +2 -0
- package/dist/spreadsheet/index.cjs +5 -3
- package/dist/spreadsheet/index.cjs.map +1 -1
- package/dist/spreadsheet/index.js +24 -22
- package/dist/tools/index.cjs +3 -3
- package/dist/tools/index.js +2 -2
- package/dist/vector/index.d.cts +1 -1
- package/dist/vector/index.d.ts +1 -1
- package/package.json +2 -1
- package/dist/chunk-EFDCLENW.cjs.map +0 -1
- package/dist/chunk-EWCOFSCQ.cjs.map +0 -1
- package/dist/chunk-J3R2OWOE.cjs.map +0 -1
- package/dist/chunk-N4MLNJPO.cjs.map +0 -1
- package/dist/chunk-Q25ZS4F7.js.map +0 -1
- package/dist/chunk-TK2XZK6Z.js.map +0 -1
- package/dist/chunk-U7VGDSNY.cjs.map +0 -1
- package/dist/chunk-ZRNHGAQT.js.map +0 -1
- /package/dist/{chunk-HHQ4XJWT.js.map → chunk-AMWXSYCI.js.map} +0 -0
package/dist/chart/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/chart/spec.ts","../../src/chart/scale.ts","../../src/chart/layout.ts","../../src/chart/svg.ts","../../src/chart/controller.ts","../../src/chart/commands.ts","../../src/chart/interaction.ts"],"sourcesContent":["import type {\n\tChartAxis,\n\tChartCurve,\n\tChartIssue,\n\tChartLegend,\n\tChartLegendPosition,\n\tChartNumberFormat,\n\tChartOrientation,\n\tChartSeries,\n\tChartSeriesType,\n\tChartSpec,\n\tChartStacking,\n\tChartTheme,\n\tChartType,\n\tChartValue\n} from './types.js';\n\nexport const CHART_TYPES: readonly ChartType[] = ['bar', 'line', 'area', 'scatter', 'pie', 'donut'];\nexport const CHART_SERIES_TYPES: readonly ChartSeriesType[] = ['bar', 'line', 'area', 'scatter'];\nexport const CHART_STACKINGS: readonly ChartStacking[] = ['none', 'stacked', 'percent'];\nexport const CHART_CURVES: readonly ChartCurve[] = ['linear', 'smooth', 'step'];\nexport const CHART_ORIENTATIONS: readonly ChartOrientation[] = ['vertical', 'horizontal'];\nexport const CHART_LEGEND_POSITIONS: readonly ChartLegendPosition[] = ['top', 'bottom', 'left', 'right'];\nexport const CHART_NUMBER_STYLES: readonly NonNullable<ChartNumberFormat['style']>[] = ['number', 'percent', 'currency', 'compact'];\n\n/** Labels for pickers, shared by the React and Svelte components. */\nexport const CHART_TYPE_LABELS: Readonly<Record<ChartType, string>> = {\n\tbar: 'Bar',\n\tline: 'Line',\n\tarea: 'Area',\n\tscatter: 'Scatter',\n\tpie: 'Pie',\n\tdonut: 'Donut'\n};\n\n/** A colour-blind-friendly categorical palette (Okabe–Ito order, tuned for light and dark backgrounds). */\nexport const DEFAULT_CHART_PALETTE: readonly string[] = ['#4269d0', '#efb118', '#ff725c', '#6cc5b0', '#3ca951', '#ff8ab7', '#a463f2', '#97bbf5', '#9c6b4e', '#9498a0'];\n\nexport const DEFAULT_CHART_THEME: ChartTheme = {\n\tbackground: '#ffffff',\n\tsurface: '#ffffff',\n\ttext: '#0f172a',\n\tmutedText: '#64748b',\n\tgrid: '#e2e8f0',\n\taxis: '#94a3b8',\n\tselection: '#2563eb',\n\tfontFamily: 'system-ui, -apple-system, \"Segoe UI\", sans-serif',\n\tfontSize: 11,\n\ttitleSize: 15\n};\n\n/**\n * A theme that reads the page's `--background`, `--foreground`, `--muted-foreground`,\n * `--border` and `--primary` colour variables (full colours, as the other components'\n * inline styles use them), with light fallbacks. The React and Svelte canvases use it.\n */\nexport const CSS_VARIABLE_CHART_THEME: ChartTheme = {\n\t...DEFAULT_CHART_THEME,\n\tbackground: 'transparent',\n\tsurface: 'var(--background, #ffffff)',\n\ttext: 'var(--foreground, #0f172a)',\n\tmutedText: 'var(--muted-foreground, #64748b)',\n\tgrid: 'var(--border, #e2e8f0)',\n\taxis: 'var(--muted-foreground, #94a3b8)',\n\tselection: 'var(--primary, #2563eb)',\n\tfontFamily: 'inherit'\n};\n\nexport function isCartesianChart(type: ChartType): boolean {\n\treturn type !== 'pie' && type !== 'donut';\n}\n\nexport function defaultChartAxis(value: boolean): ChartAxis {\n\treturn { show: true, title: '', min: null, max: null, gridlines: value, format: {} };\n}\n\n/** A complete spec with every default filled in. */\nexport function createChartSpec(partial: Partial<ChartSpec> = {}): ChartSpec {\n\treturn normalizeChartSpec(partial).spec;\n}\n\n/** The colour a series is drawn with. */\nexport function chartSeriesColor(spec: Pick<ChartSpec, 'palette' | 'series'>, seriesIndex: number): string {\n\tconst series = spec.series[seriesIndex];\n\tif (series?.color) return series.color;\n\tconst palette = spec.palette.length ? spec.palette : DEFAULT_CHART_PALETTE;\n\treturn palette[seriesIndex % palette.length];\n}\n\n/** The colour a pie slice is drawn with (by category). */\nexport function chartSliceColor(spec: Pick<ChartSpec, 'palette'>, index: number): string {\n\tconst palette = spec.palette.length ? spec.palette : DEFAULT_CHART_PALETTE;\n\treturn palette[index % palette.length];\n}\n\n/** How a series is drawn in a cartesian chart. */\nexport function chartSeriesType(spec: Pick<ChartSpec, 'type'>, series: ChartSeries): ChartSeriesType {\n\tif (series.type) return series.type;\n\treturn isCartesianChart(spec.type) ? (spec.type as ChartSeriesType) : 'bar';\n}\n\n/** An id not used by any series (`series-1`, `series-2`, …). */\nexport function uniqueChartSeriesId(series: readonly Pick<ChartSeries, 'id'>[], base = 'series'): string {\n\tconst used = new Set(series.map((s) => s.id));\n\tfor (let i = series.length + 1; ; i++) {\n\t\tconst id = `${base}-${i}`;\n\t\tif (!used.has(id)) return id;\n\t}\n}\n\n/**\n * Reads a number the way people type it in a data grid: `1,234.5`, `12%` (→ 0.12),\n * `$40`, `(3)` (→ -3). Blank → `null`. Returns `undefined` when it is not a number.\n */\nexport function parseChartValue(input: unknown): ChartValue | undefined {\n\tif (input === null || input === undefined) return null;\n\tif (typeof input === 'number') return Number.isFinite(input) ? input : undefined;\n\tif (typeof input !== 'string') return undefined;\n\tlet text = input.trim();\n\tif (!text || text === '-' || text === '—') return null;\n\tlet negative = false;\n\tif (/^\\(.*\\)$/.test(text)) {\n\t\tnegative = true;\n\t\ttext = text.slice(1, -1).trim();\n\t}\n\tconst percent = text.endsWith('%');\n\tif (percent) text = text.slice(0, -1).trim();\n\ttext = text.replace(/^[$€£¥]/, '').replace(/,/g, '').replace(/\\s+/g, '');\n\tif (!/^[-+]?(\\d+\\.?\\d*|\\.\\d+)(e[-+]?\\d+)?$/i.test(text)) return undefined;\n\tlet value = Number(text);\n\tif (percent) value /= 100;\n\tif (negative) value = -value;\n\treturn Number.isFinite(value) ? value : undefined;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === 'object' && value !== null && !Array.isArray(value);\n\nfunction pick<T extends string>(value: unknown, options: readonly T[], fallback: T, path: string, issues: ChartIssue[]): T {\n\tif (value === undefined) return fallback;\n\tif (typeof value === 'string' && (options as readonly string[]).includes(value)) return value as T;\n\tissues.push({ path, message: `${path} must be one of ${options.map((o) => `\"${o}\"`).join(', ')}; got ${JSON.stringify(value)}.` });\n\treturn fallback;\n}\n\nfunction text(value: unknown, fallback: string, path: string, issues: ChartIssue[]): string {\n\tif (value === undefined || value === null) return fallback;\n\tif (typeof value === 'string') return value;\n\tif (typeof value === 'number' || typeof value === 'boolean') return String(value);\n\tissues.push({ path, message: `${path} must be text.` });\n\treturn fallback;\n}\n\nfunction flag(value: unknown, fallback: boolean, path: string, issues: ChartIssue[]): boolean {\n\tif (value === undefined) return fallback;\n\tif (typeof value === 'boolean') return value;\n\tissues.push({ path, message: `${path} must be true or false.` });\n\treturn fallback;\n}\n\nfunction bound(value: unknown, path: string, issues: ChartIssue[]): number | null {\n\tif (value === undefined || value === null || value === '') return null;\n\tconst n = typeof value === 'string' ? Number(value) : value;\n\tif (typeof n === 'number' && Number.isFinite(n)) return n;\n\tissues.push({ path, message: `${path} must be a number or null.` });\n\treturn null;\n}\n\nfunction normalizeFormat(value: unknown, path: string, issues: ChartIssue[]): ChartNumberFormat {\n\tif (value === undefined || value === null) return {};\n\tif (!isRecord(value)) {\n\t\tissues.push({ path, message: `${path} must be an object.` });\n\t\treturn {};\n\t}\n\tconst out: ChartNumberFormat = {};\n\tif (value.style !== undefined) out.style = pick(value.style, CHART_NUMBER_STYLES, 'number', `${path}.style`, issues);\n\tif (value.decimals !== undefined) {\n\t\tconst d = Number(value.decimals);\n\t\tif (Number.isInteger(d) && d >= 0 && d <= 10) out.decimals = d;\n\t\telse issues.push({ path: `${path}.decimals`, message: `${path}.decimals must be a whole number from 0 to 10.` });\n\t}\n\tfor (const key of ['currency', 'prefix', 'suffix'] as const) {\n\t\tif (value[key] !== undefined) out[key] = text(value[key], '', `${path}.${key}`, issues);\n\t}\n\treturn out;\n}\n\nexport function normalizeChartAxis(value: unknown, fallback: ChartAxis, path: string, issues: ChartIssue[] = []): ChartAxis {\n\tif (value === undefined) return { ...fallback, format: { ...fallback.format } };\n\tif (!isRecord(value)) {\n\t\tissues.push({ path, message: `${path} must be an object.` });\n\t\treturn { ...fallback, format: { ...fallback.format } };\n\t}\n\tlet min = 'min' in value ? bound(value.min, `${path}.min`, issues) : fallback.min;\n\tlet max = 'max' in value ? bound(value.max, `${path}.max`, issues) : fallback.max;\n\tif (min !== null && max !== null && min >= max) {\n\t\tissues.push({ path: `${path}.max`, message: `${path}.max (${max}) must be greater than ${path}.min (${min}).` });\n\t\tmin = fallback.min;\n\t\tmax = fallback.max;\n\t}\n\treturn {\n\t\tshow: flag(value.show, fallback.show, `${path}.show`, issues),\n\t\ttitle: text(value.title, fallback.title, `${path}.title`, issues),\n\t\tmin,\n\t\tmax,\n\t\tgridlines: flag(value.gridlines, fallback.gridlines, `${path}.gridlines`, issues),\n\t\tformat: 'format' in value ? normalizeFormat(value.format, `${path}.format`, issues) : { ...fallback.format }\n\t};\n}\n\nfunction normalizeLegend(value: unknown, issues: ChartIssue[]): ChartLegend {\n\tconst fallback: ChartLegend = { show: true, position: 'bottom' };\n\tif (value === undefined) return fallback;\n\tif (!isRecord(value)) {\n\t\tissues.push({ path: 'legend', message: 'legend must be an object.' });\n\t\treturn fallback;\n\t}\n\treturn {\n\t\tshow: flag(value.show, fallback.show, 'legend.show', issues),\n\t\tposition: pick(value.position, CHART_LEGEND_POSITIONS, fallback.position, 'legend.position', issues)\n\t};\n}\n\n/** Values as numbers or nulls; bad entries become null and are reported. */\nexport function normalizeChartValues(value: unknown, length: number | undefined, path: string, issues: ChartIssue[] = []): ChartValue[] {\n\tif (value === undefined) return length ? Array(length).fill(null) : [];\n\tif (!Array.isArray(value)) {\n\t\tissues.push({ path, message: `${path} must be an array of numbers.` });\n\t\treturn length ? Array(length).fill(null) : [];\n\t}\n\tconst out = value.map((v, i) => {\n\t\tconst parsed = parseChartValue(v);\n\t\tif (parsed === undefined) {\n\t\t\tissues.push({ path: `${path}[${i}]`, message: `${path}[${i}] is not a number: ${JSON.stringify(v)}.` });\n\t\t\treturn null;\n\t\t}\n\t\treturn parsed;\n\t});\n\tif (length === undefined) return out;\n\tif (out.length > length) return out.slice(0, length);\n\twhile (out.length < length) out.push(null);\n\treturn out;\n}\n\nfunction normalizeSeries(value: unknown, length: number, used: Set<string>, index: number, issues: ChartIssue[]): ChartSeries | null {\n\tconst path = `series[${index}]`;\n\tif (!isRecord(value)) {\n\t\tissues.push({ path, message: `${path} must be an object with a name and values.` });\n\t\treturn null;\n\t}\n\tlet id = typeof value.id === 'string' && value.id.trim() ? value.id.trim() : '';\n\tif (!id || used.has(id)) {\n\t\tif (id) issues.push({ path: `${path}.id`, message: `Series id \"${id}\" is used twice; the second was renamed.` });\n\t\tfor (let n = index + 1; ; n++) {\n\t\t\tid = `series-${n}`;\n\t\t\tif (!used.has(id)) break;\n\t\t}\n\t}\n\tused.add(id);\n\tconst series: ChartSeries = {\n\t\tid,\n\t\tname: text(value.name, `Series ${index + 1}`, `${path}.name`, issues),\n\t\tvalues: normalizeChartValues(value.values, length, `${path}.values`, issues)\n\t};\n\tif (typeof value.color === 'string' && value.color.trim()) series.color = value.color.trim();\n\tif (value.type !== undefined && value.type !== null) series.type = pick(value.type, CHART_SERIES_TYPES, 'bar', `${path}.type`, issues);\n\tif (value.hidden === true) series.hidden = true;\n\treturn series;\n}\n\n/**\n * Turns any input (a partial spec, saved JSON, an agent's arguments) into a complete,\n * valid `ChartSpec`. Every value is checked; problems are reported as sentences in\n * `issues` and replaced by defaults, so the result is always drawable. Series values are\n * padded or trimmed to the number of categories.\n */\nexport function normalizeChartSpec(input: unknown): { spec: ChartSpec; issues: ChartIssue[] } {\n\tconst issues: ChartIssue[] = [];\n\tconst value = isRecord(input) ? input : {};\n\tif (input !== undefined && !isRecord(input)) issues.push({ path: '', message: 'A chart must be an object.' });\n\tconst type = pick(value.type, CHART_TYPES, 'bar', 'type', issues);\n\tconst rawSeries = Array.isArray(value.series) ? value.series : [];\n\tif (value.series !== undefined && !Array.isArray(value.series)) issues.push({ path: 'series', message: 'series must be an array.' });\n\n\tlet categories: string[];\n\tif (Array.isArray(value.categories)) categories = value.categories.map((c, i) => text(c, '', `categories[${i}]`, issues));\n\telse {\n\t\tif (value.categories !== undefined) issues.push({ path: 'categories', message: 'categories must be an array of labels.' });\n\t\tconst longest = rawSeries.reduce<number>((n, s) => Math.max(n, isRecord(s) && Array.isArray(s.values) ? s.values.length : 0), 0);\n\t\tcategories = Array.from({ length: longest }, (_, i) => `${i + 1}`);\n\t}\n\n\tconst used = new Set<string>();\n\tconst series = rawSeries.map((s, i) => normalizeSeries(s, categories.length, used, i, issues)).filter((s): s is ChartSeries => s !== null);\n\n\tlet palette = [...DEFAULT_CHART_PALETTE];\n\tif (Array.isArray(value.palette)) {\n\t\tconst colors = value.palette.filter((c): c is string => typeof c === 'string' && c.trim() !== '');\n\t\tif (colors.length) palette = colors;\n\t\telse issues.push({ path: 'palette', message: 'palette must list at least one colour.' });\n\t} else if (value.palette !== undefined) issues.push({ path: 'palette', message: 'palette must be an array of colours.' });\n\n\tlet innerRadius = 0.55;\n\tif (value.innerRadius !== undefined) {\n\t\tconst r = Number(value.innerRadius);\n\t\tif (Number.isFinite(r) && r >= 0 && r <= 0.9) innerRadius = r;\n\t\telse issues.push({ path: 'innerRadius', message: 'innerRadius must be a number from 0 to 0.9.' });\n\t}\n\n\tconst spec: ChartSpec = {\n\t\tversion: 1,\n\t\ttype,\n\t\ttitle: text(value.title, '', 'title', issues),\n\t\tsubtitle: text(value.subtitle, '', 'subtitle', issues),\n\t\tcategories,\n\t\tseries,\n\t\txAxis: normalizeChartAxis(value.xAxis, defaultChartAxis(false), 'xAxis', issues),\n\t\tyAxis: normalizeChartAxis(value.yAxis, defaultChartAxis(true), 'yAxis', issues),\n\t\tlegend: normalizeLegend(value.legend, issues),\n\t\tstacking: pick(value.stacking, CHART_STACKINGS, 'none', 'stacking', issues),\n\t\torientation: pick(value.orientation, CHART_ORIENTATIONS, 'vertical', 'orientation', issues),\n\t\tcurve: pick(value.curve, CHART_CURVES, 'linear', 'curve', issues),\n\t\tpoints: flag(value.points, true, 'points', issues),\n\t\tdataLabels: flag(value.dataLabels, false, 'dataLabels', issues),\n\t\tpalette,\n\t\tinnerRadius\n\t};\n\treturn { spec, issues };\n}\n\n/** A deep copy (specs are plain JSON). */\nexport function cloneChartSpec(spec: ChartSpec): ChartSpec {\n\treturn {\n\t\t...spec,\n\t\tcategories: [...spec.categories],\n\t\tseries: spec.series.map(cloneChartSeries),\n\t\txAxis: { ...spec.xAxis, format: { ...spec.xAxis.format } },\n\t\tyAxis: { ...spec.yAxis, format: { ...spec.yAxis.format } },\n\t\tlegend: { ...spec.legend },\n\t\tpalette: [...spec.palette]\n\t};\n}\n\nexport function cloneChartSeries(series: ChartSeries): ChartSeries {\n\treturn { ...series, values: [...series.values] };\n}\n\nexport interface ChartTableOptions {\n\t/**\n\t * `columns` (default): the first column holds categories and each other column is a\n\t * series. `rows`: the first row holds categories and each other row is a series.\n\t */\n\tseriesIn?: 'columns' | 'rows';\n\t/** The first row (or column for `rows`) holds series names (default `true`). */\n\theader?: boolean;\n}\n\nexport interface ChartTableData {\n\tcategories: string[];\n\tseries: ChartSeries[];\n\tissues: ChartIssue[];\n}\n\n/**\n * Reads a grid of cells (from CSV, a spreadsheet range or the clipboard) as categories and\n * series. Cells that are not numbers become gaps and are reported.\n */\nexport function chartDataFromTable(rows: ReadonlyArray<ReadonlyArray<unknown>>, options: ChartTableOptions = {}): ChartTableData {\n\tconst header = options.header ?? true;\n\tlet grid = rows.map((r) => [...r]).filter((r) => r.some((c) => c !== null && c !== undefined && String(c).trim() !== ''));\n\tif (options.seriesIn === 'rows') {\n\t\tconst width = Math.max(0, ...grid.map((r) => r.length));\n\t\tgrid = Array.from({ length: width }, (_, c) => grid.map((r) => r[c]));\n\t}\n\tconst issues: ChartIssue[] = [];\n\tif (!grid.length) return { categories: [], series: [], issues };\n\tconst width = Math.max(...grid.map((r) => r.length));\n\tconst names = header ? grid[0] : [];\n\tconst body = header ? grid.slice(1) : grid;\n\tconst categories = body.map((r, i) => {\n\t\tconst c = r[0];\n\t\treturn c === null || c === undefined || String(c).trim() === '' ? `${i + 1}` : String(c).trim();\n\t});\n\tconst series: ChartSeries[] = [];\n\tfor (let col = 1; col < width; col++) {\n\t\tconst name = names[col] !== undefined && String(names[col]).trim() ? String(names[col]).trim() : `Series ${col}`;\n\t\tconst values = body.map((r, i) => {\n\t\t\tconst parsed = parseChartValue(r[col] ?? null);\n\t\t\tif (parsed === undefined) {\n\t\t\t\tissues.push({ path: `${name}[${i}]`, message: `\"${String(r[col])}\" in ${name} (${categories[i]}) is not a number; it was left blank.` });\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn parsed;\n\t\t});\n\t\tseries.push({ id: `series-${col}`, name, values });\n\t}\n\treturn { categories, series, issues };\n}\n\n/** The chart's data as a grid: a header row of series names, then one row per category. */\nexport function chartDataToTable(spec: Pick<ChartSpec, 'categories' | 'series'>, options: { categoryHeader?: string } = {}): (string | number | null)[][] {\n\treturn [\n\t\t[options.categoryHeader ?? '', ...spec.series.map((s) => s.name)],\n\t\t...spec.categories.map((category, i) => [category, ...spec.series.map((s) => s.values[i] ?? null)])\n\t];\n}\n\n/** A colour input value (`#rrggbb`) for a CSS colour: `#abc` expands, non-hex colours show as black. */\nexport function chartColorInputValue(color: string): string {\n\tif (/^#[0-9a-f]{6}$/i.test(color)) return color.toLowerCase();\n\tif (/^#[0-9a-f]{3}$/i.test(color)) return `#${[...color.slice(1)].map((c) => c + c).join('')}`.toLowerCase();\n\treturn '#000000';\n}\n","import type { ChartNumberFormat } from './types.js';\n\n/** A \"nice\" step (1, 2, 2.5 or 5 × 10ⁿ) for about `count` intervals over `span`. */\nexport function niceStep(span: number, count: number): number {\n\tif (!(span > 0) || !(count > 0)) return 1;\n\tconst raw = span / count;\n\tconst power = Math.pow(10, Math.floor(Math.log10(raw)));\n\tconst fraction = raw / power;\n\tconst nice = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 2.5 ? 2.5 : fraction <= 5 ? 5 : 10;\n\treturn nice * power;\n}\n\n/** Removes float noise such as 0.30000000000000004. */\nconst clean = (n: number) => (Math.abs(n) < 1e-12 ? 0 : Number(n.toPrecision(12)));\n\nexport interface NiceScale {\n\tmin: number;\n\tmax: number;\n\tstep: number;\n\tticks: number[];\n}\n\n/**\n * Extends `[min, max]` to round numbers and lists the ticks between them. Fixed ends\n * (`fixedMin` / `fixedMax`) are kept exactly; ticks then start at the first nice value\n * inside them.\n */\nexport function niceScale(min: number, max: number, count = 5, fixedMin: number | null = null, fixedMax: number | null = null): NiceScale {\n\t// Non-finite fixed ends fall back to the data range, and a non-finite data range to 0..1.\n\tif (fixedMin !== null && !Number.isFinite(fixedMin)) fixedMin = null;\n\tif (fixedMax !== null && !Number.isFinite(fixedMax)) fixedMax = null;\n\tlet lo = fixedMin ?? min;\n\tlet hi = fixedMax ?? max;\n\tif (!Number.isFinite(lo) || !Number.isFinite(hi)) {\n\t\tfixedMin = fixedMax = null;\n\t\tlo = 0;\n\t\thi = 1;\n\t}\n\tif (lo > hi) [lo, hi] = [hi, lo];\n\tif (lo === hi) {\n\t\tconst pad = lo === 0 ? 1 : Math.abs(lo) * 0.1;\n\t\t// A flat series at 0 grows upwards; anything else gets room on both free sides.\n\t\tif (fixedMin === null && lo !== 0) lo -= pad;\n\t\tif (fixedMax === null || lo === hi) hi += pad;\n\t}\n\t// Near ±Number.MAX_VALUE the span overflows to Infinity: halve it and double the step.\n\tconst span = hi - lo;\n\tconst step = Number.isFinite(span) ? niceStep(span, count) : niceStep(hi / 2 - lo / 2, count) * 2;\n\t// Rounding outwards can overflow too; keep the data end then.\n\tconst finiteOr = (n: number, fallback: number) => (Number.isFinite(n) ? n : fallback);\n\tconst niceMin = fixedMin ?? finiteOr(snap(Math.floor(lo / step + 1e-9) * step, step), lo);\n\tconst niceMax = fixedMax ?? finiteOr(snap(Math.ceil(hi / step - 1e-9) * step, step), hi);\n\t// Ticks are first + i·step (never a running sum, which stalls once step is below the\n\t// float spacing, e.g. near 1e16) and deduplicated where neighbours round to one float.\n\tconst firstIndex = Math.ceil(niceMin / step - 1e-9);\n\tconst lastIndex = Math.floor(niceMax / step + 1e-9);\n\tconst n = Math.min(999, Math.max(-1, lastIndex - firstIndex));\n\tconst ticks: number[] = [];\n\tfor (let i = 0; i <= n; i++) {\n\t\tconst t = snap((firstIndex + i) * step, step);\n\t\tif (Number.isFinite(t) && t !== ticks[ticks.length - 1]) ticks.push(t);\n\t}\n\treturn { min: niceMin, max: niceMax, step, ticks };\n}\n\n/** `clean`, unless that moves `n` by a noticeable part of `step` (large numbers such as 1e16 + 2). */\nfunction snap(n: number, step: number): number {\n\tconst c = clean(n);\n\treturn Math.abs(c - n) <= step * 1e-6 ? c : n;\n}\n\n/** Decimals needed to write ticks `step` apart exactly: 1 → 0, 2.5 → 1, 0.25 → 2 (at most 6). */\nexport function stepDecimals(step: number): number {\n\tif (!(step > 0) || !Number.isFinite(step)) return 0;\n\tfor (let d = 0; d < 6; d++) {\n\t\tconst scaled = step * Math.pow(10, d);\n\t\tif (Math.abs(scaled - Math.round(scaled)) < 1e-9) return d;\n\t}\n\treturn 6;\n}\n\n/** Decimals that show the leading digit of `value` (0.12 → 1, 0.012 → 2; at most 6). */\nfunction magnitudeDecimals(value: number): number {\n\tif (!(value > 0) || value >= 1) return 0;\n\treturn Math.min(6, Math.max(0, Math.ceil(-Math.log10(value) - 1e-9)));\n}\n\nconst COMPACT = [\n\t{ value: 1e12, suffix: 'T' },\n\t{ value: 1e9, suffix: 'B' },\n\t{ value: 1e6, suffix: 'M' },\n\t{ value: 1e3, suffix: 'K' }\n];\n\nfunction grouped(value: number, decimals: number): string {\n\tconst fixed = Math.abs(value).toFixed(decimals);\n\tconst [int, frac] = fixed.split('.');\n\tconst withCommas = int.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\treturn `${value < 0 && Number(fixed) !== 0 ? '-' : ''}${withCommas}${frac ? `.${frac}` : ''}`;\n}\n\nconst CURRENCY_SYMBOLS: Record<string, string> = { USD: '$', EUR: '€', GBP: '£', JPY: '¥', CNY: '¥', INR: '₹', AUD: 'A$', CAD: 'C$' };\n\n/**\n * Writes a number for a chart label. Locale-independent (so labels and tests are the same\n * everywhere): `,` thousands, `.` decimals. `decimals` defaults to `fallbackDecimals`\n * (e.g. from the tick step), else up to 2 trimmed.\n */\nexport function formatChartNumber(value: number | null | undefined, format: ChartNumberFormat = {}, fallbackDecimals?: number): string {\n\tif (value === null || value === undefined || !Number.isFinite(value)) return '';\n\tconst style = format.style ?? 'number';\n\tlet body: string;\n\tconst decimalsFor = (v: number) => {\n\t\tif (format.decimals !== undefined) return format.decimals;\n\t\tif (fallbackDecimals !== undefined) return fallbackDecimals;\n\t\treturn Number.isInteger(v) ? 0 : Math.abs(v) < 1 ? Math.min(4, Math.max(2, magnitudeDecimals(Math.abs(v)) + 1)) : 2;\n\t};\n\tconst trim = (s: string) => (format.decimals === undefined && fallbackDecimals === undefined && s.includes('.') ? s.replace(/\\.?0+$/, '') : s);\n\tif (style === 'percent') {\n\t\tconst v = value * 100;\n\t\tconst d = format.decimals ?? (fallbackDecimals !== undefined ? Math.max(0, fallbackDecimals - 2) : Number.isInteger(clean(v)) ? 0 : 1);\n\t\tbody = `${grouped(clean(v), d)}%`;\n\t} else if (style === 'compact') {\n\t\tconst unit = COMPACT.find((u) => Math.abs(value) >= u.value);\n\t\tif (unit) {\n\t\t\tconst v = value / unit.value;\n\t\t\tconst d = format.decimals ?? (Math.abs(v) >= 100 || Number.isInteger(clean(v)) ? 0 : 1);\n\t\t\tbody = `${trim(grouped(v, d))}${unit.suffix}`;\n\t\t} else body = trim(grouped(value, decimalsFor(value)));\n\t} else if (style === 'currency') {\n\t\tconst code = (format.currency || 'USD').toUpperCase();\n\t\tconst symbol = CURRENCY_SYMBOLS[code] ?? `${code} `;\n\t\tconst d = format.decimals ?? (fallbackDecimals !== undefined ? fallbackDecimals : Number.isInteger(value) ? 0 : 2);\n\t\tconst s = grouped(Math.abs(value), d);\n\t\tbody = `${value < 0 ? '-' : ''}${symbol}${s}`;\n\t} else body = trim(grouped(value, decimalsFor(value)));\n\treturn `${format.prefix ?? ''}${body}${format.suffix ?? ''}`;\n}\n\n/** Linear map from `domain` to `range`. */\nexport function linearMap(value: number, domain: readonly [number, number], range: readonly [number, number]): number {\n\tconst [d0, d1] = domain;\n\tconst [r0, r1] = range;\n\tif (d1 === d0) return (r0 + r1) / 2;\n\treturn r0 + ((value - d0) / (d1 - d0)) * (r1 - r0);\n}\n","import { formatChartNumber, linearMap, niceScale, stepDecimals } from './scale.js';\nimport { chartSeriesColor, chartSeriesType, chartSliceColor, DEFAULT_CHART_THEME, isCartesianChart } from './spec.js';\nimport type {\n\tChartMark,\n\tChartNumberFormat,\n\tChartRect,\n\tChartScene,\n\tChartSelection,\n\tChartSeries,\n\tChartSeriesType,\n\tChartSpec,\n\tChartTheme,\n\tChartValueScale\n} from './types.js';\n\nexport type ChartTextMeasure = (text: string, size: number, weight?: number) => number;\n\nexport interface ChartLayoutOptions {\n\twidth: number;\n\theight: number;\n\ttheme?: Partial<ChartTheme>;\n\t/** Highlighted in the scene (selection outlines, `selected` flags). */\n\tselection?: ChartSelection | null;\n\t/** Text width in pixels (default: an estimate from the character count). */\n\tmeasureText?: ChartTextMeasure;\n\t/** Shown when there is nothing to draw (default \"No data\"). */\n\temptyMessage?: string;\n\t/**\n\t * Fixes the value axis to this range (over `yAxis.min` / `yAxis.max`). Canvases pass\n\t * `ChartPointDrag.valueDomain` during a drag so the axis does not rescale under the pointer.\n\t */\n\tvalueDomain?: { min: number; max: number } | null;\n}\n\n/** A DOM-free text width estimate (average glyph ≈ 0.56 em, bold ≈ 0.6 em). */\nexport const estimateChartTextWidth: ChartTextMeasure = (text, size, weight = 400) => text.length * size * (weight >= 600 ? 0.6 : 0.56);\n\n/** Whether two selections point at the same thing. */\nexport function sameChartSelection(a: ChartSelection | null | undefined, b: ChartSelection | null | undefined): boolean {\n\tif (!a || !b || a.kind !== b.kind) return false;\n\tswitch (a.kind) {\n\t\tcase 'axis':\n\t\t\treturn a.axis === (b as typeof a).axis;\n\t\tcase 'series':\n\t\t\treturn a.seriesId === (b as typeof a).seriesId;\n\t\tcase 'point':\n\t\t\treturn a.seriesId === (b as typeof a).seriesId && a.index === (b as typeof a).index;\n\t\tcase 'category':\n\t\t\treturn a.index === (b as typeof a).index;\n\t\tdefault:\n\t\t\treturn true;\n\t}\n}\n\n/**\n * Black or white text for a label drawn on `fill` (#rgb, #rrggbb or rgb()), by perceived\n * luminance (0.299 R + 0.587 G + 0.114 B). Unparseable colours (CSS variables) get white.\n */\nexport function contrastingTextColor(fill: string): string {\n\tlet rgb: number[] | null = null;\n\tconst hex = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(fill.trim());\n\tif (hex) {\n\t\tconst h = hex[1].length === 3 ? [...hex[1]].map((c) => c + c).join('') : hex[1];\n\t\trgb = [0, 2, 4].map((i) => parseInt(h.slice(i, i + 2), 16));\n\t} else {\n\t\tconst fn = /^rgba?\\(\\s*([\\d.]+)[\\s,]+([\\d.]+)[\\s,]+([\\d.]+)/i.exec(fill.trim());\n\t\tif (fn) rgb = fn.slice(1, 4).map(Number);\n\t}\n\tif (!rgb) return '#ffffff';\n\tconst luminance = (0.299 * rgb[0] + 0.587 * rgb[1] + 0.114 * rgb[2]) / 255;\n\treturn luminance > 0.5 ? '#0f172a' : '#ffffff';\n}\n\nconst r2 = (n: number) => Math.round(n * 100) / 100;\n\ninterface Pt {\n\tc: number;\n\tv: number;\n}\n\n/** Path through points (in category/value pixel space) with the chosen curve; `map` turns them into x/y. */\nfunction curvePath(points: Pt[], curve: ChartSpec['curve'], map: (p: Pt) => [number, number], moveFirst = true): string {\n\tif (!points.length) return '';\n\tconst xy = points.map(map);\n\tlet d = `${moveFirst ? 'M' : 'L'}${r2(xy[0][0])},${r2(xy[0][1])}`;\n\tif (points.length === 1) return d;\n\tif (curve === 'step') {\n\t\tfor (let i = 1; i < points.length; i++) {\n\t\t\tconst mid = (points[i - 1].c + points[i].c) / 2;\n\t\t\tconst a = map({ c: mid, v: points[i - 1].v });\n\t\t\tconst b = map({ c: mid, v: points[i].v });\n\t\t\td += `L${r2(a[0])},${r2(a[1])}L${r2(b[0])},${r2(b[1])}L${r2(xy[i][0])},${r2(xy[i][1])}`;\n\t\t}\n\t\treturn d;\n\t}\n\tif (curve === 'smooth' && points.length > 2) {\n\t\t// Monotone cubic (Fritsch–Carlson): smooth, never overshoots the data.\n\t\tconst n = points.length;\n\t\tconst dc = points.slice(1).map((p, i) => p.c - points[i].c);\n\t\tconst slope = points.slice(1).map((p, i) => (dc[i] === 0 ? 0 : (p.v - points[i].v) / dc[i]));\n\t\tconst tangent = points.map((_, i) => {\n\t\t\tif (i === 0) return slope[0];\n\t\t\tif (i === n - 1) return slope[n - 2];\n\t\t\tconst a = slope[i - 1];\n\t\t\tconst b = slope[i];\n\t\t\tif (a * b <= 0) return 0;\n\t\t\tconst wa = 2 * dc[i] + dc[i - 1];\n\t\t\tconst wb = dc[i] + 2 * dc[i - 1];\n\t\t\treturn (wa + wb) / (wa / a + wb / b);\n\t\t});\n\t\tfor (let i = 1; i < n; i++) {\n\t\t\tconst h = dc[i - 1] / 3;\n\t\t\tconst p0 = points[i - 1];\n\t\t\tconst p1 = points[i];\n\t\t\tconst a = map({ c: p0.c + h, v: p0.v + tangent[i - 1] * h });\n\t\t\tconst b = map({ c: p1.c - h, v: p1.v - tangent[i] * h });\n\t\t\td += `C${r2(a[0])},${r2(a[1])} ${r2(b[0])},${r2(b[1])} ${r2(xy[i][0])},${r2(xy[i][1])}`;\n\t\t}\n\t\treturn d;\n\t}\n\tfor (let i = 1; i < xy.length; i++) d += `L${r2(xy[i][0])},${r2(xy[i][1])}`;\n\treturn d;\n}\n\nfunction arcPath(cx: number, cy: number, outer: number, inner: number, start: number, end: number): string {\n\tconst full = end - start >= Math.PI * 2 - 1e-9;\n\tif (full) end = start + Math.PI * 2 - 1e-4;\n\tconst p = (r: number, a: number) => `${r2(cx + r * Math.sin(a))},${r2(cy - r * Math.cos(a))}`;\n\tconst large = end - start > Math.PI ? 1 : 0;\n\tlet d = `M${p(outer, start)}A${r2(outer)},${r2(outer)} 0 ${large} 1 ${p(outer, end)}`;\n\tif (inner > 0) d += `L${p(inner, end)}A${r2(inner)},${r2(inner)} 0 ${large} 0 ${p(inner, start)}Z`;\n\telse d += `L${r2(cx)},${r2(cy)}Z`;\n\treturn d;\n}\n\ninterface LegendItem {\n\tlabel: string;\n\tcolor: string;\n\ttarget: ChartSelection;\n\tfaded: boolean;\n\tselected: boolean;\n\tshape: 'square' | 'line';\n}\n\ninterface Stack {\n\t/** Per category: [bottom, top] of this series' segment, or null for a gap. */\n\tsegments: ([number, number] | null)[];\n}\n\n/**\n * Lays a chart out as drawing primitives (rects, paths, circles, lines and text) in a\n * `width × height` box. Pure and DOM-free: the React and Svelte canvases render the marks\n * as SVG, `chartSceneToSvg` writes them as a string, and anything else (canvas, PDF) can\n * draw them too. Clickable marks carry the `target` they select.\n */\nexport function layoutChart(spec: ChartSpec, options: ChartLayoutOptions): ChartScene {\n\tconst width = Math.max(1, options.width);\n\tconst height = Math.max(1, options.height);\n\tconst theme: ChartTheme = { ...DEFAULT_CHART_THEME, ...options.theme };\n\tconst measure = options.measureText ?? estimateChartTextWidth;\n\tconst selection = options.selection ?? null;\n\tconst fs = theme.fontSize;\n\tconst marks: ChartMark[] = [];\n\tconst isSelected = (target: ChartSelection) => sameChartSelection(selection, target);\n\tconst seriesSelected = (id: string) => selection?.kind === 'series' && selection.seriesId === id;\n\tconst pad = 12;\n\n\tmarks.push({ kind: 'rect', key: 'background', role: 'background', x: 0, y: 0, width, height, fill: theme.background, target: { kind: 'chart' } });\n\n\t// Titles ----------------------------------------------------------------\n\tlet top = pad;\n\tconst outline = (key: string, box: ChartRect) =>\n\t\tmarks.push({ kind: 'rect', key, role: 'selection', ...box, fill: 'none', stroke: theme.selection, strokeWidth: 1, radius: 3 });\n\tconst titleMark = (kind: 'title' | 'subtitle', label: string, size: number, weight: number, fill: string) => {\n\t\tconst target: ChartSelection = { kind };\n\t\tconst selected = isSelected(target);\n\t\tmarks.push({ kind: 'text', key: kind, role: kind, x: width / 2, y: top, text: label, anchor: 'middle', baseline: 'top', size, weight, fill, target, selected });\n\t\tif (selected) {\n\t\t\tconst w = measure(label, size, weight);\n\t\t\toutline(`${kind}-selection`, { x: width / 2 - w / 2 - 4, y: top - 3, width: w + 8, height: size * 1.25 + 6 });\n\t\t}\n\t\ttop += size * 1.35;\n\t};\n\tif (spec.title) titleMark('title', spec.title, theme.titleSize, 600, theme.text);\n\tif (spec.subtitle) titleMark('subtitle', spec.subtitle, fs + 1, 400, theme.mutedText);\n\tif (spec.title || spec.subtitle) top += 6;\n\n\tconst cartesian = isCartesianChart(spec.type);\n\tconst visible = spec.series.filter((s) => !s.hidden);\n\n\t// Legend ----------------------------------------------------------------\n\tconst legendItems: LegendItem[] = cartesian\n\t\t? spec.series.map((s, i) => ({\n\t\t\t\tlabel: s.name,\n\t\t\t\tcolor: chartSeriesColor(spec, i),\n\t\t\t\ttarget: { kind: 'series', seriesId: s.id },\n\t\t\t\tfaded: !!s.hidden,\n\t\t\t\tselected: seriesSelected(s.id),\n\t\t\t\tshape: chartSeriesType(spec, s) === 'line' ? 'line' : 'square'\n\t\t\t}))\n\t\t: spec.categories.map((c, i) => ({\n\t\t\t\tlabel: c,\n\t\t\t\tcolor: chartSliceColor(spec, i),\n\t\t\t\ttarget: { kind: 'category', index: i },\n\t\t\t\tfaded: false,\n\t\t\t\tselected: isSelected({ kind: 'category', index: i }),\n\t\t\t\tshape: 'square'\n\t\t\t}));\n\tlet area: ChartRect = { x: pad, y: top, width: width - pad * 2, height: height - top - pad };\n\tconst showLegend = spec.legend.show && legendItems.length > 0 && (!cartesian || spec.series.length > 1 || spec.series.some((s) => s.hidden));\n\tif (showLegend) area = layoutLegend(legendItems, spec.legend.position, area, theme, measure, marks, isSelected({ kind: 'legend' }));\n\n\tconst empty = (message: string) => {\n\t\tmarks.push({ kind: 'text', key: 'empty', role: 'empty', x: area.x + area.width / 2, y: area.y + area.height / 2, text: message, anchor: 'middle', baseline: 'middle', size: fs + 1, fill: theme.mutedText });\n\t\treturn { width, height, plot: { x: area.x, y: area.y, width: 0, height: 0 }, marks, percent: false, theme };\n\t};\n\tconst hasData = visible.some((s) => s.values.some((v) => v !== null));\n\tif (!spec.categories.length || !visible.length || !hasData) return empty(options.emptyMessage ?? 'No data');\n\n\tif (!cartesian) return layoutPie(spec, visible[0], area, theme, marks, selection, width, height);\n\n\t// Cartesian -------------------------------------------------------------\n\tconst horizontal = spec.orientation === 'horizontal';\n\tconst n = spec.categories.length;\n\tconst types = new Map<string, ChartSeriesType>(visible.map((s) => [s.id, chartSeriesType(spec, s)]));\n\tconst stacked = spec.stacking !== 'none';\n\tconst percent = spec.stacking === 'percent';\n\n\t// Stack bars together and areas together (lines and scatter are never stacked).\n\tconst stacks = new Map<string, Stack>();\n\tif (stacked) {\n\t\tfor (const kind of ['bar', 'area'] as const) {\n\t\t\tconst group = visible.filter((s) => types.get(s.id) === kind);\n\t\t\tif (!group.length) continue;\n\t\t\tconst totals = Array.from({ length: n }, (_, i) => group.reduce((t, s) => t + Math.abs(s.values[i] ?? 0), 0));\n\t\t\tconst pos = Array(n).fill(0);\n\t\t\tconst neg = Array(n).fill(0);\n\t\t\tfor (const s of group) {\n\t\t\t\tconst segments = s.values.map((raw, i) => {\n\t\t\t\t\tif (raw === null && kind === 'bar') return null;\n\t\t\t\t\tlet v = raw ?? 0;\n\t\t\t\t\tif (percent) v = totals[i] ? v / totals[i] : 0;\n\t\t\t\t\tconst base = v >= 0 ? pos[i] : neg[i];\n\t\t\t\t\tconst seg: [number, number] = [base, base + v];\n\t\t\t\t\tif (v >= 0) pos[i] += v;\n\t\t\t\t\telse neg[i] += v;\n\t\t\t\t\treturn seg;\n\t\t\t\t});\n\t\t\t\tstacks.set(s.id, { segments });\n\t\t\t}\n\t\t}\n\t}\n\n\tlet lo = Infinity;\n\tlet hi = -Infinity;\n\tconst see = (v: number) => {\n\t\tlo = Math.min(lo, v);\n\t\thi = Math.max(hi, v);\n\t};\n\tfor (const s of visible) {\n\t\tconst stack = stacks.get(s.id);\n\t\tif (stack) stack.segments.forEach((seg) => seg && (see(seg[0]), see(seg[1])));\n\t\telse s.values.forEach((v) => v !== null && see(v));\n\t}\n\tif (!Number.isFinite(lo)) {\n\t\tlo = 0;\n\t\thi = 1;\n\t}\n\tif ([...types.values()].some((t) => t === 'bar' || t === 'area')) {\n\t\tlo = Math.min(lo, 0);\n\t\thi = Math.max(hi, 0);\n\t}\n\tconst valueFormat: ChartNumberFormat = percent && !spec.yAxis.format.style ? { ...spec.yAxis.format, style: 'percent' } : spec.yAxis.format;\n\n\t// Margins depend on label sizes, and the tick count on the plot length: estimate, then lay out.\n\tconst xAxis = spec.xAxis;\n\tconst yAxis = spec.yAxis;\n\tconst titleBand = fs * 1.3 + 6;\n\tconst frozen = options.valueDomain;\n\tconst fixedMin = frozen && Number.isFinite(frozen.min) ? frozen.min : yAxis.min;\n\tconst fixedMax = frozen && Number.isFinite(frozen.max) ? frozen.max : yAxis.max;\n\tconst valueLen0 = horizontal ? area.width : area.height;\n\tlet scale = niceScale(lo, hi, Math.max(2, Math.min(10, Math.round(valueLen0 / 56))), fixedMin, fixedMax);\n\tconst tickText = (t: number) => formatChartNumber(t, valueFormat, valueFormat.decimals ?? stepDecimals(scale.step));\n\tconst valueLabelWidth = Math.max(0, ...scale.ticks.map((t) => measure(tickText(t), fs)));\n\tconst catLabelWidth = Math.max(0, ...spec.categories.map((c) => measure(c, fs)));\n\n\tlet left: number;\n\tlet bottom: number;\n\tlet rotate = 0;\n\tif (horizontal) {\n\t\tleft = (xAxis.show ? Math.min(catLabelWidth, area.width * 0.35) + 8 : 2) + (xAxis.title ? titleBand : 0);\n\t\tbottom = (yAxis.show ? fs * 1.6 : 2) + (yAxis.title ? titleBand : 0);\n\t} else {\n\t\tleft = (yAxis.show ? valueLabelWidth + 8 : 2) + (yAxis.title ? titleBand : 0);\n\t\tconst band = (area.width - left - 8) / n;\n\t\tif (xAxis.show && catLabelWidth > band * 0.92) rotate = -40;\n\t\tconst catHeight = rotate ? Math.min(catLabelWidth * Math.sin(Math.PI / 4.5) + fs, area.height * 0.4) : fs * 1.6;\n\t\tbottom = (xAxis.show ? catHeight : 2) + (xAxis.title ? titleBand : 0);\n\t}\n\tconst rightPad = horizontal ? Math.max(8, valueLabelWidth / 2) : 8;\n\tconst plot: ChartRect = {\n\t\tx: area.x + left,\n\t\ty: area.y + (horizontal ? 4 : fs / 2 + 2),\n\t\twidth: Math.max(1, area.width - left - rightPad),\n\t\theight: Math.max(1, area.height - bottom - (horizontal ? 4 : fs / 2 + 2))\n\t};\n\tscale = niceScale(lo, hi, Math.max(2, Math.min(10, Math.round((horizontal ? plot.width : plot.height) / 56))), fixedMin, fixedMax);\n\n\tconst domain: [number, number] = [scale.min, scale.max];\n\tconst valueRange: [number, number] = horizontal ? [plot.x, plot.x + plot.width] : [plot.y + plot.height, plot.y];\n\tconst valuePx = (v: number) => linearMap(Math.min(scale.max, Math.max(scale.min, v)), domain, valueRange);\n\tconst catStart = horizontal ? plot.y : plot.x;\n\tconst catLen = horizontal ? plot.height : plot.width;\n\tconst band = catLen / n;\n\tconst catCenter = (i: number) => catStart + band * (i + 0.5);\n\tconst map = (p: Pt): [number, number] => (horizontal ? [p.v, p.c] : [p.c, p.v]);\n\tconst zero = valuePx(Math.min(scale.max, Math.max(scale.min, 0)));\n\n\t// Grid and axes\n\tconst axisSelected = (axis: 'x' | 'y') => isSelected({ kind: 'axis', axis });\n\tif (yAxis.gridlines) {\n\t\tscale.ticks.forEach((t, i) => {\n\t\t\tconst p = valuePx(t);\n\t\t\tconst [x1, y1] = map({ c: catStart, v: p });\n\t\t\tconst [x2, y2] = map({ c: catStart + catLen, v: p });\n\t\t\tmarks.push({ kind: 'line', key: `grid-y-${i}`, role: 'grid', x1, y1, x2, y2, stroke: theme.grid, strokeWidth: 1 });\n\t\t});\n\t}\n\tif (xAxis.gridlines) {\n\t\tfor (let i = 1; i < n; i++) {\n\t\t\tconst c = catStart + band * i;\n\t\t\tconst [x1, y1] = map({ c, v: valueRange[0] });\n\t\t\tconst [x2, y2] = map({ c, v: valueRange[1] });\n\t\t\tmarks.push({ kind: 'line', key: `grid-x-${i}`, role: 'grid', x1, y1, x2, y2, stroke: theme.grid, strokeWidth: 1 });\n\t\t}\n\t}\n\n\tconst yTarget: ChartSelection = { kind: 'axis', axis: 'y' };\n\tconst xTarget: ChartSelection = { kind: 'axis', axis: 'x' };\n\tif (yAxis.show) {\n\t\tscale.ticks.forEach((t, i) => {\n\t\t\tconst p = valuePx(t);\n\t\t\tconst label = tickText(t);\n\t\t\tif (horizontal)\n\t\t\t\tmarks.push({ kind: 'text', key: `tick-y-${i}`, role: 'tick-label', x: p, y: plot.y + plot.height + 6, text: label, anchor: 'middle', baseline: 'top', size: fs, fill: theme.mutedText, target: yTarget });\n\t\t\telse marks.push({ kind: 'text', key: `tick-y-${i}`, role: 'tick-label', x: plot.x - 8, y: p, text: label, anchor: 'end', baseline: 'middle', size: fs, fill: theme.mutedText, target: yTarget });\n\t\t});\n\t}\n\tif (xAxis.show) {\n\t\tconst [x1, y1] = map({ c: catStart, v: zero });\n\t\tconst [x2, y2] = map({ c: catStart + catLen, v: zero });\n\t\tmarks.push({ kind: 'line', key: 'axis-x', role: 'axis', x1, y1, x2, y2, stroke: theme.axis, strokeWidth: 1, target: xTarget });\n\t\tconst every = horizontal ? Math.max(1, Math.ceil((fs * 1.3) / band)) : rotate ? Math.max(1, Math.ceil((fs * 1.4) / band)) : 1;\n\t\tspec.categories.forEach((c, i) => {\n\t\t\tif (i % every) return;\n\t\t\tconst target: ChartSelection = { kind: 'category', index: i };\n\t\t\tconst selected = isSelected(target);\n\t\t\tconst fill = selected ? theme.selection : theme.mutedText;\n\t\t\tif (horizontal) {\n\t\t\t\tconst maxW = left - (xAxis.title ? titleBand : 0) - 8;\n\t\t\t\tmarks.push({ kind: 'text', key: `tick-x-${i}`, role: 'tick-label', x: plot.x - 8, y: catCenter(i), text: truncate(c, maxW, fs, measure), anchor: 'end', baseline: 'middle', size: fs, fill, target, selected });\n\t\t\t} else if (rotate)\n\t\t\t\tmarks.push({ kind: 'text', key: `tick-x-${i}`, role: 'tick-label', x: catCenter(i), y: plot.y + plot.height + 8, text: c, anchor: 'end', baseline: 'middle', size: fs, fill, rotate, target, selected });\n\t\t\telse marks.push({ kind: 'text', key: `tick-x-${i}`, role: 'tick-label', x: catCenter(i), y: plot.y + plot.height + 6, text: c, anchor: 'middle', baseline: 'top', size: fs, fill, target, selected });\n\t\t});\n\t}\n\t// Axis titles: category axis title beside the category labels, value axis title beside the ticks.\n\tconst bottomTitle = horizontal ? yAxis.title : xAxis.title;\n\tconst leftTitle = horizontal ? xAxis.title : yAxis.title;\n\tif (bottomTitle)\n\t\tmarks.push({ kind: 'text', key: `axis-title-${horizontal ? 'y' : 'x'}`, role: 'axis-title', x: plot.x + plot.width / 2, y: area.y + area.height, text: bottomTitle, anchor: 'middle', baseline: 'bottom', size: fs + 1, weight: 500, fill: theme.text, target: horizontal ? yTarget : xTarget });\n\tif (leftTitle)\n\t\tmarks.push({ kind: 'text', key: `axis-title-${horizontal ? 'x' : 'y'}`, role: 'axis-title', x: area.x, y: plot.y + plot.height / 2, text: leftTitle, anchor: 'middle', baseline: 'top', size: fs + 1, weight: 500, fill: theme.text, rotate: -90, target: horizontal ? xTarget : yTarget });\n\t// The selected axis gets an outline around its labels.\n\tfor (const axis of ['x', 'y'] as const) {\n\t\tif (!axisSelected(axis)) continue;\n\t\tconst onLeft = (axis === 'y') !== horizontal;\n\t\tconst box: ChartRect = onLeft\n\t\t\t? { x: area.x, y: plot.y - fs / 2, width: left - 2, height: plot.height + fs }\n\t\t\t: { x: plot.x - 4, y: plot.y + plot.height + 2, width: plot.width + 8, height: area.y + area.height - plot.y - plot.height - 2 };\n\t\toutline(`axis-${axis}-selection`, box);\n\t}\n\n\t// Series ----------------------------------------------------------------\n\tconst bars = visible.filter((s) => types.get(s.id) === 'bar');\n\tconst slots = stacked ? 1 : bars.length;\n\tconst groupWidth = band * (bars.length ? 0.72 : 0);\n\tconst barWidth = slots ? groupWidth / slots : 0;\n\tconst labelMarks: ChartMark[] = [];\n\tconst decimals = valueFormat.decimals ?? undefined;\n\tconst dataLabel = (v: number) => formatChartNumber(v, valueFormat, decimals);\n\n\tconst drawOrder = [...visible].sort((a, b) => order(types.get(a.id)!) - order(types.get(b.id)!));\n\tfor (const s of drawOrder) {\n\t\tconst si = spec.series.indexOf(s);\n\t\tconst color = chartSeriesColor(spec, si);\n\t\tconst type = types.get(s.id)!;\n\t\tconst stack = stacks.get(s.id);\n\t\tconst selSeries = seriesSelected(s.id);\n\t\tconst seriesTarget: ChartSelection = { kind: 'series', seriesId: s.id };\n\n\t\tif (type === 'bar') {\n\t\t\tconst slot = stacked ? 0 : bars.indexOf(s);\n\t\t\ts.values.forEach((raw, i) => {\n\t\t\t\tconst seg = stack ? stack.segments[i] : raw === null ? null : ([0, raw] as [number, number]);\n\t\t\t\tif (!seg || raw === null) return;\n\t\t\t\tconst a = valuePx(seg[0]);\n\t\t\t\tconst b = valuePx(seg[1]);\n\t\t\t\tconst c0 = catCenter(i) - groupWidth / 2 + slot * barWidth + barWidth * 0.06;\n\t\t\t\tconst cw = barWidth * 0.88;\n\t\t\t\tconst target: ChartSelection = { kind: 'point', seriesId: s.id, index: i };\n\t\t\t\tconst selected = isSelected(target);\n\t\t\t\tconst [x, y] = map({ c: c0, v: Math.min(a, b) });\n\t\t\t\tconst rect = horizontal ? { x: Math.min(a, b), y: c0, width: Math.abs(b - a), height: cw } : { x, y, width: cw, height: Math.abs(b - a) };\n\t\t\t\tmarks.push({\n\t\t\t\t\tkind: 'rect',\n\t\t\t\t\tkey: `bar-${s.id}-${i}`,\n\t\t\t\t\trole: 'bar',\n\t\t\t\t\t...rect,\n\t\t\t\t\tfill: color,\n\t\t\t\t\tradius: Math.min(2, cw / 4),\n\t\t\t\t\ttarget,\n\t\t\t\t\tselected: selected || selSeries,\n\t\t\t\t\t...(selSeries ? { stroke: theme.selection, strokeWidth: 1.5 } : {})\n\t\t\t\t});\n\t\t\t\tif (selected) outline(`bar-${s.id}-${i}-selection`, { x: rect.x - 2, y: rect.y - 2, width: rect.width + 4, height: rect.height + 4 });\n\t\t\t\tif (spec.dataLabels) {\n\t\t\t\t\tconst v = percent ? seg[1] - seg[0] : raw;\n\t\t\t\t\tconst text = dataLabel(v);\n\t\t\t\t\t// Inside a stacked segment: only when it fits along the value axis.\n\t\t\t\t\tif (stacked && Math.abs(b - a) < (horizontal ? measure(text, fs - 1) + 4 : fs + 1)) return;\n\t\t\t\t\tconst end = valuePx(seg[1]);\n\t\t\t\t\tconst outward = (seg[1] >= seg[0] ? 1 : -1) * (horizontal ? 1 : -1);\n\t\t\t\t\tconst [lx, ly] = map({ c: c0 + cw / 2, v: stacked ? (a + b) / 2 : end + outward * 4 });\n\t\t\t\t\tlabelMarks.push({\n\t\t\t\t\t\tkind: 'text',\n\t\t\t\t\t\tkey: `label-${s.id}-${i}`,\n\t\t\t\t\t\trole: 'data-label',\n\t\t\t\t\t\tx: lx,\n\t\t\t\t\t\ty: ly,\n\t\t\t\t\t\ttext,\n\t\t\t\t\t\tanchor: horizontal && !stacked ? (outward > 0 ? 'start' : 'end') : 'middle',\n\t\t\t\t\t\tbaseline: horizontal || stacked ? 'middle' : outward < 0 ? 'bottom' : 'top',\n\t\t\t\t\t\tsize: fs - 1,\n\t\t\t\t\t\tfill: stacked ? contrastingTextColor(color) : theme.text,\n\t\t\t\t\t\ttarget\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Line, area and scatter share the point positions.\n\t\tconst pointValue = (i: number): number | null => (stack ? (stack.segments[i]?.[1] ?? null) : s.values[i]);\n\t\tconst runs: Pt[][] = [];\n\t\tlet run: Pt[] = [];\n\t\tfor (let i = 0; i < n; i++) {\n\t\t\tconst v = pointValue(i);\n\t\t\tif (v === null) {\n\t\t\t\tif (run.length) runs.push(run);\n\t\t\t\trun = [];\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\trun.push({ c: catCenter(i), v: valuePx(v) });\n\t\t}\n\t\tif (run.length) runs.push(run);\n\n\t\tif (type === 'area') {\n\t\t\t// Stacked areas fill down to the series below; others down to zero.\n\t\t\tconst parts = runs.map((r) => {\n\t\t\t\tconst baseline = stack\n\t\t\t\t\t? r.map((p) => ({ c: p.c, v: valuePx(stack.segments[Math.round((p.c - catStart) / band - 0.5)]?.[0] ?? 0) })).reverse()\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t{ c: r[r.length - 1].c, v: zero },\n\t\t\t\t\t\t\t{ c: r[0].c, v: zero }\n\t\t\t\t\t\t];\n\t\t\t\treturn `${curvePath(r, spec.curve, map)}${stack ? curvePath(baseline, spec.curve, map, false) : baseline.map((p) => `L${map(p).map(r2).join(',')}`).join('')}Z`;\n\t\t\t});\n\t\t\tmarks.push({ kind: 'path', key: `area-${s.id}`, role: 'area', d: parts.join(''), fill: color, opacity: 0.22, target: seriesTarget, selected: selSeries });\n\t\t}\n\t\tif (type === 'line' || type === 'area') {\n\t\t\tmarks.push({\n\t\t\t\tkind: 'path',\n\t\t\t\tkey: `line-${s.id}`,\n\t\t\t\trole: 'line',\n\t\t\t\td: runs.map((r) => curvePath(r, spec.curve, map)).join(''),\n\t\t\t\tfill: 'none',\n\t\t\t\tstroke: color,\n\t\t\t\tstrokeWidth: selSeries ? 3.5 : 2,\n\t\t\t\ttarget: seriesTarget,\n\t\t\t\tselected: selSeries\n\t\t\t});\n\t\t}\n\t\tconst showDots = type === 'scatter' || spec.points;\n\t\tfor (let i = 0; i < n; i++) {\n\t\t\tconst v = pointValue(i);\n\t\t\tif (v === null || s.values[i] === null) continue;\n\t\t\tconst [cx, cy] = map({ c: catCenter(i), v: valuePx(v) });\n\t\t\tconst target: ChartSelection = { kind: 'point', seriesId: s.id, index: i };\n\t\t\tconst selected = isSelected(target);\n\t\t\tconst r = type === 'scatter' ? 4.5 : 3.5;\n\t\t\t// Without dots the point still gets a transparent target so it can be picked and dragged.\n\t\t\tmarks.push({\n\t\t\t\tkind: 'circle',\n\t\t\t\tkey: `point-${s.id}-${i}`,\n\t\t\t\trole: 'point',\n\t\t\t\tcx,\n\t\t\t\tcy,\n\t\t\t\tr: showDots ? r : 6,\n\t\t\t\tfill: showDots ? (type === 'scatter' ? color : theme.surface) : 'transparent',\n\t\t\t\t...(showDots ? { stroke: color, strokeWidth: 2 } : {}),\n\t\t\t\topacity: type === 'scatter' ? 0.85 : undefined,\n\t\t\t\ttarget,\n\t\t\t\tselected: selected || selSeries\n\t\t\t});\n\t\t\tif (selected) marks.push({ kind: 'circle', key: `point-${s.id}-${i}-selection`, role: 'selection', cx, cy, r: r + 3.5, fill: 'none', stroke: theme.selection, strokeWidth: 1.5 });\n\t\t\tif (spec.dataLabels) {\n\t\t\t\tconst raw = s.values[i]!;\n\t\t\t\tconst shown = percent && stack ? stack.segments[i]![1] - stack.segments[i]![0] : raw;\n\t\t\t\tlabelMarks.push({\n\t\t\t\t\tkind: 'text',\n\t\t\t\t\tkey: `label-${s.id}-${i}`,\n\t\t\t\t\trole: 'data-label',\n\t\t\t\t\tx: horizontal ? cx + 8 : cx,\n\t\t\t\t\ty: horizontal ? cy : cy - 8,\n\t\t\t\t\ttext: dataLabel(shown),\n\t\t\t\t\tanchor: horizontal ? 'start' : 'middle',\n\t\t\t\t\tbaseline: horizontal ? 'middle' : 'bottom',\n\t\t\t\t\tsize: fs - 1,\n\t\t\t\t\tfill: theme.text,\n\t\t\t\t\ttarget\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\tmarks.push(...labelMarks);\n\n\tconst valueScale: ChartValueScale = { axis: horizontal ? 'x' : 'y', domain, range: valueRange, ticks: scale.ticks };\n\treturn { width, height, plot, marks, valueScale, percent, theme };\n}\n\nconst order = (t: ChartSeriesType) => (t === 'area' ? 0 : t === 'bar' ? 1 : t === 'line' ? 2 : 3);\n\nfunction truncate(text: string, maxWidth: number, size: number, measure: ChartTextMeasure): string {\n\tif (measure(text, size) <= maxWidth) return text;\n\tlet out = text;\n\twhile (out.length > 1 && measure(`${out}…`, size) > maxWidth) out = out.slice(0, -1);\n\treturn `${out}…`;\n}\n\nfunction layoutLegend(\n\titems: LegendItem[],\n\tposition: ChartSpec['legend']['position'],\n\tarea: ChartRect,\n\ttheme: ChartTheme,\n\tmeasure: ChartTextMeasure,\n\tmarks: ChartMark[],\n\tlegendSelected: boolean\n): ChartRect {\n\tconst fs = theme.fontSize;\n\tconst swatch = 10;\n\tconst rowH = fs * 1.7;\n\tconst itemW = (item: LegendItem) => swatch + 6 + measure(item.label, fs) + 14;\n\tconst placed: { item: LegendItem; x: number; y: number }[] = [];\n\tlet box: ChartRect;\n\tlet rest: ChartRect;\n\tif (position === 'left' || position === 'right') {\n\t\tconst w = Math.min(area.width * 0.35, Math.max(...items.map(itemW)));\n\t\tconst h = Math.min(items.length * rowH, area.height);\n\t\tconst x = position === 'left' ? area.x : area.x + area.width - w;\n\t\tconst y = area.y + (area.height - h) / 2;\n\t\titems.forEach((item, i) => {\n\t\t\tif ((i + 1) * rowH <= area.height + 0.5) placed.push({ item, x, y: y + i * rowH + rowH / 2 });\n\t\t});\n\t\tbox = { x, y, width: w, height: h };\n\t\trest = position === 'left' ? { ...area, x: area.x + w + 8, width: area.width - w - 8 } : { ...area, width: area.width - w - 8 };\n\t} else {\n\t\t// Wrap into rows, each centred.\n\t\tconst rows: LegendItem[][] = [[]];\n\t\tlet used = 0;\n\t\tfor (const item of items) {\n\t\t\tconst w = itemW(item);\n\t\t\tif (used + w > area.width && rows[rows.length - 1].length) {\n\t\t\t\trows.push([]);\n\t\t\t\tused = 0;\n\t\t\t}\n\t\t\trows[rows.length - 1].push(item);\n\t\t\tused += w;\n\t\t}\n\t\tconst shown = rows.slice(0, 3);\n\t\tconst h = shown.length * rowH;\n\t\tconst y0 = position === 'top' ? area.y : area.y + area.height - h;\n\t\tshown.forEach((row, r) => {\n\t\t\tconst total = row.reduce((t, item) => t + itemW(item), 0) - 14;\n\t\t\tlet x = area.x + (area.width - total) / 2;\n\t\t\tfor (const item of row) {\n\t\t\t\tplaced.push({ item, x, y: y0 + r * rowH + rowH / 2 });\n\t\t\t\tx += itemW(item);\n\t\t\t}\n\t\t});\n\t\tbox = { x: area.x, y: y0, width: area.width, height: h };\n\t\trest = position === 'top' ? { ...area, y: area.y + h + 6, height: area.height - h - 6 } : { ...area, height: area.height - h - 6 };\n\t}\n\tplaced.forEach(({ item, x, y }, i) => {\n\t\tconst opacity = item.faded ? 0.4 : undefined;\n\t\tif (item.shape === 'line')\n\t\t\tmarks.push({ kind: 'line', key: `legend-swatch-${i}`, role: 'legend-swatch', x1: x, y1: y, x2: x + swatch, y2: y, stroke: item.color, strokeWidth: 2.5, opacity, target: item.target, selected: item.selected });\n\t\telse\n\t\t\tmarks.push({ kind: 'rect', key: `legend-swatch-${i}`, role: 'legend-swatch', x, y: y - swatch / 2, width: swatch, height: swatch, radius: 2, fill: item.color, opacity, target: item.target, selected: item.selected });\n\t\tmarks.push({\n\t\t\tkind: 'text',\n\t\t\tkey: `legend-label-${i}`,\n\t\t\trole: 'legend-label',\n\t\t\tx: x + swatch + 6,\n\t\t\ty,\n\t\t\ttext: item.label,\n\t\t\tanchor: 'start',\n\t\t\tbaseline: 'middle',\n\t\t\tsize: fs,\n\t\t\tfill: item.selected ? theme.selection : theme.text,\n\t\t\tweight: item.selected ? 600 : undefined,\n\t\t\topacity,\n\t\t\ttarget: item.target,\n\t\t\tselected: item.selected\n\t\t});\n\t});\n\tif (legendSelected) marks.push({ kind: 'rect', key: 'legend-selection', role: 'selection', x: box.x - 4, y: box.y - 2, width: box.width + 8, height: box.height + 4, fill: 'none', stroke: theme.selection, strokeWidth: 1, radius: 3 });\n\treturn rest;\n}\n\nfunction layoutPie(\n\tspec: ChartSpec,\n\tseries: ChartSeries,\n\tarea: ChartRect,\n\ttheme: ChartTheme,\n\tmarks: ChartMark[],\n\tselection: ChartSelection | null,\n\twidth: number,\n\theight: number\n): ChartScene {\n\tconst fs = theme.fontSize;\n\tconst values = spec.categories.map((_, i) => Math.max(0, series.values[i] ?? 0));\n\tconst total = values.reduce((a, b) => a + b, 0);\n\tconst labelRoom = spec.dataLabels ? fs * 2.2 : 4;\n\tconst outer = Math.max(4, Math.min(area.width, area.height) / 2 - labelRoom);\n\tconst inner = spec.type === 'donut' ? outer * spec.innerRadius : 0;\n\tconst cx = area.x + area.width / 2;\n\tconst cy = area.y + area.height / 2;\n\tconst plot = { x: cx - outer, y: cy - outer, width: outer * 2, height: outer * 2 };\n\tif (total <= 0) {\n\t\tmarks.push({ kind: 'text', key: 'empty', role: 'empty', x: cx, y: cy, text: 'No positive values', anchor: 'middle', baseline: 'middle', size: fs + 1, fill: theme.mutedText });\n\t\treturn { width, height, plot, marks, percent: false, theme };\n\t}\n\tlet angle = 0;\n\tconst format = spec.yAxis.format;\n\tvalues.forEach((v, i) => {\n\t\tif (v <= 0) return;\n\t\tconst sweep = (v / total) * Math.PI * 2;\n\t\tconst start = angle;\n\t\tconst end = angle + sweep;\n\t\tangle = end;\n\t\tconst target: ChartSelection = { kind: 'point', seriesId: series.id, index: i };\n\t\tconst selected = sameChartSelection(selection, target) || sameChartSelection(selection, { kind: 'category', index: i });\n\t\tconst seriesSel = selection?.kind === 'series' && selection.seriesId === series.id;\n\t\t// The selected slice pops out a little.\n\t\tconst mid = (start + end) / 2;\n\t\tconst off = selected ? 6 : 0;\n\t\tconst ox = cx + off * Math.sin(mid);\n\t\tconst oy = cy - off * Math.cos(mid);\n\t\tmarks.push({\n\t\t\tkind: 'path',\n\t\t\tkey: `slice-${i}`,\n\t\t\trole: 'slice',\n\t\t\td: arcPath(ox, oy, outer, inner, start, end),\n\t\t\tfill: chartSliceColor(spec, i),\n\t\t\tstroke: selected || seriesSel ? theme.selection : theme.surface,\n\t\t\tstrokeWidth: selected || seriesSel ? 2 : 1,\n\t\t\ttarget,\n\t\t\tselected: selected || seriesSel\n\t\t});\n\t\tif (spec.dataLabels && sweep > 0.12) {\n\t\t\tconst share = v / total;\n\t\t\tconst text = format.style ? formatChartNumber(v, format) : `${Math.round(share * 100)}%`;\n\t\t\tconst lr = outer + fs * 1.1;\n\t\t\tconst lx = ox + lr * Math.sin(mid);\n\t\t\tconst ly = oy - lr * Math.cos(mid);\n\t\t\tconst anchor = Math.abs(Math.sin(mid)) < 0.2 ? 'middle' : Math.sin(mid) > 0 ? 'start' : 'end';\n\t\t\tmarks.push({ kind: 'text', key: `label-slice-${i}`, role: 'data-label', x: lx, y: ly, text, anchor, baseline: 'middle', size: fs, fill: theme.text, target });\n\t\t}\n\t});\n\tif (spec.type === 'donut' && inner > fs * 2) {\n\t\tmarks.push({ kind: 'text', key: 'donut-total', role: 'data-label', x: cx, y: cy, text: formatChartNumber(total, format), anchor: 'middle', baseline: 'middle', size: Math.min(theme.titleSize + 4, inner / 2), weight: 600, fill: theme.text, target: { kind: 'series', seriesId: series.id } });\n\t}\n\treturn { width, height, plot, marks, percent: false, theme };\n}\n\n/**\n * The data value at a scene point along the value axis (for dragging a bar or point), or\n * `undefined` when the scene has no value scale or is percent-stacked.\n */\nexport function chartValueAtPoint(scene: ChartScene, point: { x: number; y: number }): number | undefined {\n\tconst scale = scene.valueScale;\n\tif (!scale || scene.percent) return undefined;\n\tconst px = scale.axis === 'y' ? point.y : point.x;\n\treturn linearMap(px, scale.range, scale.domain);\n}\n\n/** The value a drag should store: snapped to a tenth of the tick step (or `step`) and kept finite. */\nexport function snapChartValue(scene: ChartScene, value: number, step?: number): number {\n\tconst ticks = scene.valueScale?.ticks ?? [];\n\tconst unit = step ?? (ticks.length > 1 ? (ticks[1] - ticks[0]) / 10 : 1);\n\tif (!(unit > 0)) return value;\n\tconst snapped = Math.round(value / unit) * unit;\n\treturn Number(snapped.toPrecision(12));\n}\n","import { layoutChart, type ChartLayoutOptions } from './layout.js';\nimport type { ChartMark, ChartScene, ChartSpec, ChartTextMark } from './types.js';\n\n/** SVG `dominant-baseline` for a text mark's baseline (shared by every renderer). */\nexport function chartTextBaseline(baseline: ChartTextMark['baseline']): 'hanging' | 'central' | 'text-after-edge' {\n\treturn baseline === 'top' ? 'hanging' : baseline === 'middle' ? 'central' : 'text-after-edge';\n}\n\n/** SVG `transform` for a rotated text mark, if any. */\nexport function chartTextTransform(mark: ChartTextMark): string | undefined {\n\treturn mark.rotate ? `rotate(${mark.rotate} ${mark.x} ${mark.y})` : undefined;\n}\n\nconst escape = (text: string) => text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n\nfunction attrs(values: Record<string, string | number | undefined>): string {\n\treturn Object.entries(values)\n\t\t.filter(([, v]) => v !== undefined && v !== '')\n\t\t.map(([k, v]) => ` ${k}=\"${escape(String(v))}\"`)\n\t\t.join('');\n}\n\nfunction markToSvg(mark: ChartMark, fontFamily: string): string {\n\tconst common = { opacity: mark.opacity, 'data-role': mark.role };\n\tswitch (mark.kind) {\n\t\tcase 'rect':\n\t\t\treturn `<rect${attrs({ x: mark.x, y: mark.y, width: mark.width, height: mark.height, rx: mark.radius, fill: mark.fill, stroke: mark.stroke, 'stroke-width': mark.strokeWidth, ...common })}/>`;\n\t\tcase 'path':\n\t\t\treturn `<path${attrs({ d: mark.d, fill: mark.fill ?? 'none', stroke: mark.stroke, 'stroke-width': mark.strokeWidth, 'stroke-dasharray': mark.dash, 'stroke-linejoin': 'round', 'stroke-linecap': 'round', ...common })}/>`;\n\t\tcase 'circle':\n\t\t\treturn `<circle${attrs({ cx: mark.cx, cy: mark.cy, r: mark.r, fill: mark.fill, stroke: mark.stroke, 'stroke-width': mark.strokeWidth, ...common })}/>`;\n\t\tcase 'line':\n\t\t\treturn `<line${attrs({ x1: mark.x1, y1: mark.y1, x2: mark.x2, y2: mark.y2, stroke: mark.stroke, 'stroke-width': mark.strokeWidth, 'stroke-dasharray': mark.dash, ...common })}/>`;\n\t\tcase 'text':\n\t\t\treturn `<text${attrs({\n\t\t\t\tx: mark.x,\n\t\t\t\ty: mark.y,\n\t\t\t\t'text-anchor': mark.anchor,\n\t\t\t\t'dominant-baseline': chartTextBaseline(mark.baseline),\n\t\t\t\t'font-size': mark.size,\n\t\t\t\t'font-weight': mark.weight,\n\t\t\t\t'font-family': fontFamily,\n\t\t\t\tfill: mark.fill,\n\t\t\t\ttransform: chartTextTransform(mark),\n\t\t\t\t...common\n\t\t\t})}>${escape(mark.text)}</text>`;\n\t}\n}\n\nexport interface ChartSvgOptions {\n\t/** Leave out selection outlines (default `true`: exports show the chart only). */\n\thideSelection?: boolean;\n\t/** Accessible title (default: the chart title). */\n\tariaLabel?: string;\n}\n\n/** Writes a laid-out scene as a standalone SVG document string. */\nexport function chartSceneToSvg(scene: ChartScene, options: ChartSvgOptions = {}): string {\n\tconst hide = options.hideSelection ?? true;\n\tconst font = scene.theme.fontFamily;\n\tconst body = scene.marks\n\t\t.filter((m) => !(hide && m.role === 'selection'))\n\t\t.map((m) => markToSvg(m, font))\n\t\t.join('');\n\tconst label = options.ariaLabel;\n\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${scene.width}\" height=\"${scene.height}\" viewBox=\"0 0 ${scene.width} ${scene.height}\" role=\"img\"${label ? ` aria-label=\"${escape(label)}\"` : ''}>${body}</svg>`;\n}\n\n/** Lays out and writes a chart as SVG, e.g. for export or server rendering. */\nexport function chartToSvg(spec: ChartSpec, options: Omit<ChartLayoutOptions, 'selection'> & ChartSvgOptions): string {\n\tconst scene = layoutChart(spec, { ...options, selection: null });\n\treturn chartSceneToSvg(scene, { ...options, ariaLabel: options.ariaLabel ?? (spec.title || undefined) });\n}\n","import { HistoryManager } from '../history/HistoryManager.js';\nimport type { Command, HistoryMark } from '../history/types.js';\nimport { parseCsv, parseTsv } from '../spreadsheet/csv.js';\nimport { sameChartSelection } from './layout.js';\nimport {\n\tchartDataFromTable,\n\tcloneChartSeries,\n\tcloneChartSpec,\n\tnormalizeChartSpec,\n\tparseChartValue,\n\tuniqueChartSeriesId,\n\ttype ChartTableOptions\n} from './spec.js';\nimport type {\n\tChartAxis,\n\tChartIssue,\n\tChartLegend,\n\tChartSelection,\n\tChartSeries,\n\tChartSeriesType,\n\tChartSpec,\n\tChartType,\n\tChartValue\n} from './types.js';\n\n/** Structural equality of JSON-like values (specs are plain data; key order does not matter). */\nfunction sameChartJson(a: unknown, b: unknown): boolean {\n\tif (a === b) return true;\n\tif (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return Number.isNaN(a) && Number.isNaN(b);\n\tif (Array.isArray(a) !== Array.isArray(b)) return false;\n\tif (Array.isArray(a)) {\n\t\tconst bb = b as unknown[];\n\t\treturn a.length === bb.length && a.every((v, i) => sameChartJson(v, bb[i]));\n\t}\n\tconst ao = a as Record<string, unknown>;\n\tconst bo = b as Record<string, unknown>;\n\tconst keys = Object.keys(ao).filter((k) => ao[k] !== undefined);\n\tif (keys.length !== Object.keys(bo).filter((k) => bo[k] !== undefined).length) return false;\n\treturn keys.every((k) => Object.prototype.hasOwnProperty.call(bo, k) && sameChartJson(ao[k], bo[k]));\n}\n\nexport interface ChartControllerOptions {\n\t/** Starting chart (any partial or saved spec; problems are reported in `state.issues`). */\n\tspec?: Partial<ChartSpec> | unknown;\n\t/** History to record into, e.g. one shared with the rest of the app (default: a new one). */\n\thistory?: HistoryManager;\n\t/** Called after the spec changes (edit, undo, redo, load). */\n\tonChange?: (spec: Readonly<ChartSpec>) => void;\n}\n\n/** A snapshot of the controller. The same object is returned until something changes. */\nexport interface ChartState {\n\tspec: Readonly<ChartSpec>;\n\tselection: ChartSelection | null;\n\t/** The series the selection belongs to (a series or one of its points). */\n\tselectedSeries: ChartSeries | null;\n\t/** The category the selection belongs to (a category or a point). */\n\tselectedIndex: number | null;\n\t/** Problems from the last load or rejected edit, as sentences. */\n\tissues: readonly ChartIssue[];\n\t/** The gesture in progress (e.g. a bar drag), if any. */\n\tgesture: string | null;\n\tcanUndo: boolean;\n\tcanRedo: boolean;\n\tundoLabel: string;\n\tredoLabel: string;\n\t/** Bumped on every change. */\n\trevision: number;\n}\n\nexport type ChartActionResult = { ok: true } | { ok: false; message: string; issues?: ChartIssue[] };\n\n/** Top-level fields with partial axes and legend. */\nexport type ChartSpecPatch = Partial<Omit<ChartSpec, 'version' | 'xAxis' | 'yAxis' | 'legend'>> & {\n\txAxis?: Partial<ChartAxis>;\n\tyAxis?: Partial<ChartAxis>;\n\tlegend?: Partial<ChartLegend>;\n};\n\nexport interface ChartSeriesInput {\n\tid?: string;\n\tname?: string;\n\tvalues?: readonly unknown[];\n\tcolor?: string;\n\ttype?: ChartSeriesType;\n\thidden?: boolean;\n}\n\nexport interface ChartSeriesPatch {\n\tname?: string;\n\t/** `null` goes back to the palette colour. */\n\tcolor?: string | null;\n\t/** `null` follows the chart type. */\n\ttype?: ChartSeriesType | null;\n\thidden?: boolean;\n}\n\nexport interface ChartEditOptions {\n\t/** Undo step label. */\n\tlabel?: string;\n}\n\nconst fail = (message: string, issues?: ChartIssue[]): ChartActionResult => ({ ok: false, message, ...(issues ? { issues } : {}) });\n\n/**\n * Headless state for a chart editor: a validated `ChartSpec`, a selection, and undoable\n * edits to data (values, series, categories, pasted grids, CSV) and presentation (type,\n * titles, axes, legend, stacking, …). Drags merge into one undo step (`beginGesture`).\n * `getState()` returns the same object until something changes, so it works with\n * `useSyncExternalStore` and Svelte runes alike.\n */\nexport class ChartController {\n\treadonly history: HistoryManager;\n\tprivate spec: ChartSpec;\n\tprivate selection: ChartSelection | null = null;\n\tprivate issues: ChartIssue[] = [];\n\tprivate gestureKey: string | null = null;\n\tprivate gestureCount = 0;\n\tprivate gestureStart: { spec: ChartSpec; mark: HistoryMark } | null = null;\n\tprivate revision = 0;\n\tprivate applying = false;\n\tprivate readonly onChange?: ChartControllerOptions['onChange'];\n\tprivate readonly listeners = new Set<(state: ChartState) => void>();\n\tprivate unsubscribeHistory?: () => void;\n\tprivate state!: ChartState;\n\n\tconstructor(options: ChartControllerOptions = {}) {\n\t\tthis.history = options.history ?? new HistoryManager();\n\t\tthis.onChange = options.onChange;\n\t\tconst { spec, issues } = normalizeChartSpec(options.spec ?? {});\n\t\tthis.spec = spec;\n\t\tthis.issues = issues;\n\t\tthis.state = this.computeState();\n\t\tthis.connect();\n\t}\n\n\tprivate connect() {\n\t\tthis.unsubscribeHistory?.();\n\t\tthis.unsubscribeHistory = this.history.subscribe((h) => {\n\t\t\t// Edits notify as they apply; only re-notify when the undo/redo state moved on.\n\t\t\tconst s = this.state;\n\t\t\tif (this.applying || (s.canUndo === h.canUndo && s.canRedo === h.canRedo && s.undoLabel === h.undoName && s.redoLabel === h.redoName)) return;\n\t\t\tthis.notify(false);\n\t\t});\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// State\n\t// -------------------------------------------------------------------------\n\n\t/** The current snapshot (stable until the next change). */\n\tgetState = (): ChartState => this.state;\n\n\t/** Calls `listener` after every change. Returns an unsubscribe function. */\n\tsubscribe = (listener: (state: ChartState) => void): (() => void) => {\n\t\t// Reconnect after `destroy()` so a remount (React StrictMode) keeps undo working.\n\t\tif (!this.unsubscribeHistory) this.connect();\n\t\tthis.listeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener);\n\t\t};\n\t};\n\n\t/** The current spec (do not mutate; edit through the controller). */\n\tgetSpec(): Readonly<ChartSpec> {\n\t\treturn this.spec;\n\t}\n\n\tgetSeries(id: string): ChartSeries | undefined {\n\t\treturn this.spec.series.find((s) => s.id === id);\n\t}\n\n\tprivate computeState(): ChartState {\n\t\tconst h = this.history.getState();\n\t\tconst sel = this.selection;\n\t\tconst seriesId = sel?.kind === 'series' || sel?.kind === 'point' ? sel.seriesId : null;\n\t\treturn {\n\t\t\tspec: this.spec,\n\t\t\tselection: sel,\n\t\t\tselectedSeries: seriesId ? (this.spec.series.find((s) => s.id === seriesId) ?? null) : null,\n\t\t\tselectedIndex: sel?.kind === 'point' || sel?.kind === 'category' ? sel.index : null,\n\t\t\tissues: this.issues,\n\t\t\tgesture: this.gestureKey,\n\t\t\tcanUndo: h.canUndo,\n\t\t\tcanRedo: h.canRedo,\n\t\t\tundoLabel: h.undoName,\n\t\t\tredoLabel: h.redoName,\n\t\t\trevision: this.revision\n\t\t};\n\t}\n\n\tprivate notify(specChanged: boolean) {\n\t\tthis.revision++;\n\t\tthis.state = this.computeState();\n\t\tif (specChanged) this.onChange?.(this.spec);\n\t\tconst state = this.state;\n\t\tthis.listeners.forEach((listener) => {\n\t\t\ttry {\n\t\t\t\tlistener(state);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[ChartController] Error in state listener:', error);\n\t\t\t}\n\t\t});\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Changes: every edit records a before / after snapshot of the spec\n\t// -------------------------------------------------------------------------\n\n\t/** Drops a selection that no longer points at anything. */\n\tprivate validSelection(sel: ChartSelection | null, spec: ChartSpec): ChartSelection | null {\n\t\tif (!sel) return null;\n\t\tswitch (sel.kind) {\n\t\t\tcase 'series':\n\t\t\t\treturn spec.series.some((s) => s.id === sel.seriesId) ? sel : null;\n\t\t\tcase 'point':\n\t\t\t\treturn spec.series.some((s) => s.id === sel.seriesId) && sel.index < spec.categories.length ? sel : null;\n\t\t\tcase 'category':\n\t\t\t\treturn sel.index < spec.categories.length ? sel : null;\n\t\t\tcase 'title':\n\t\t\t\treturn spec.title ? sel : null;\n\t\t\tcase 'subtitle':\n\t\t\t\treturn spec.subtitle ? sel : null;\n\t\t\tdefault:\n\t\t\t\treturn sel;\n\t\t}\n\t}\n\n\tprivate applySpec(spec: ChartSpec) {\n\t\tthis.applying = true;\n\t\ttry {\n\t\t\tthis.spec = spec;\n\t\t\tthis.selection = this.validSelection(this.selection, spec);\n\t\t} finally {\n\t\t\tthis.applying = false;\n\t\t}\n\t\tthis.notify(true);\n\t}\n\n\tprivate commit(label: string, next: ChartSpec, select?: ChartSelection | null) {\n\t\tconst before = this.spec;\n\t\tconst hadIssues = this.issues.length > 0;\n\t\tthis.issues = [];\n\t\t// A no-op edit (same value, same title, …) records no undo step.\n\t\tif (sameChartJson(before, next)) {\n\t\t\tconst reselect = select !== undefined && !sameChartSelection(this.selection, select) && !(select === null && this.selection === null);\n\t\t\tif (reselect) this.selection = select;\n\t\t\tif (reselect || hadIssues) this.notify(false);\n\t\t\treturn;\n\t\t}\n\t\tconst command: Command = {\n\t\t\tname: label,\n\t\t\ttag: 'chart',\n\t\t\texecute: () => this.applySpec(next),\n\t\t\tundo: () => this.applySpec(before),\n\t\t\tredo: () => this.applySpec(next)\n\t\t};\n\t\tif (select !== undefined) this.selection = select;\n\t\tif (this.gestureKey !== null) this.history.executeMerged(command, { key: `chart.gesture:${this.gestureKey}:${this.gestureCount}` });\n\t\telse this.history.execute(command);\n\t}\n\n\tprivate reject(message: string, issues: ChartIssue[] = []): ChartActionResult {\n\t\tthis.issues = issues.length ? issues : [{ path: '', message }];\n\t\tthis.notify(false);\n\t\treturn fail(message, issues.length ? issues : undefined);\n\t}\n\n\t/** A copy of the spec with `edit` applied (series and categories copied as needed). */\n\tprivate edited(edit: (draft: ChartSpec) => void): ChartSpec {\n\t\tconst draft = cloneChartSpec(this.spec);\n\t\tedit(draft);\n\t\treturn draft;\n\t}\n\n\tprivate unknownSeries(id: string): ChartActionResult {\n\t\tconst ids = this.spec.series.map((s) => `\"${s.id}\"`);\n\t\treturn fail(`There is no series \"${id}\"; ${ids.length ? `expected one of ${ids.join(', ')}` : 'the chart has no series yet'}.`);\n\t}\n\n\tprivate badIndex(index: number): ChartActionResult {\n\t\tconst n = this.spec.categories.length;\n\t\treturn fail(n ? `Category index ${index} is out of range; expected 0 to ${n - 1}.` : 'The chart has no categories yet.');\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Presentation\n\t// -------------------------------------------------------------------------\n\n\t/**\n\t * Changes any presentation or data fields as one undo step. All-or-nothing: if anything\n\t * is invalid, nothing changes and every problem is returned (and shown in `state.issues`).\n\t */\n\tupdate(patch: ChartSpecPatch, options: ChartEditOptions = {}): ChartActionResult {\n\t\tconst s = this.spec;\n\t\tconst merged = {\n\t\t\t...s,\n\t\t\t...patch,\n\t\t\txAxis: patch.xAxis ? { ...s.xAxis, ...patch.xAxis } : s.xAxis,\n\t\t\tyAxis: patch.yAxis ? { ...s.yAxis, ...patch.yAxis } : s.yAxis,\n\t\t\tlegend: patch.legend ? { ...s.legend, ...patch.legend } : s.legend,\n\t\t\tversion: 1\n\t\t};\n\t\tconst { spec, issues } = normalizeChartSpec(merged);\n\t\tif (issues.length) return this.reject(issues.map((i) => i.message).join(' '), issues);\n\t\tif (JSON.stringify(spec) === JSON.stringify(s)) return { ok: true };\n\t\tthis.commit(options.label ?? updateLabel(patch), spec);\n\t\treturn { ok: true };\n\t}\n\n\tsetType(type: ChartType): ChartActionResult {\n\t\treturn this.update({ type }, { label: `Change chart type` });\n\t}\n\n\tsetTitle(title: string): ChartActionResult {\n\t\treturn this.update({ title }, { label: 'Edit title' });\n\t}\n\n\tsetSubtitle(subtitle: string): ChartActionResult {\n\t\treturn this.update({ subtitle }, { label: 'Edit subtitle' });\n\t}\n\n\t/** Changes the category (`x`) or value (`y`) axis. */\n\tsetAxis(axis: 'x' | 'y', patch: Partial<ChartAxis>): ChartActionResult {\n\t\treturn this.update(axis === 'x' ? { xAxis: patch } : { yAxis: patch }, { label: `Change ${axis === 'x' ? 'category' : 'value'} axis` });\n\t}\n\n\tsetLegend(patch: Partial<ChartLegend>): ChartActionResult {\n\t\treturn this.update({ legend: patch }, { label: 'Change legend' });\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Data\n\t// -------------------------------------------------------------------------\n\n\t/**\n\t * Replaces categories and / or series as one undo step. Values are validated and padded\n\t * to the categories; all-or-nothing like `update`.\n\t */\n\tsetData(data: { categories?: readonly unknown[]; series?: readonly ChartSeriesInput[] }, options: ChartEditOptions = {}): ChartActionResult {\n\t\treturn this.update({ ...(data.categories ? { categories: data.categories as string[] } : {}), ...(data.series ? { series: data.series as ChartSeries[] } : {}) }, { label: options.label ?? 'Edit chart data' });\n\t}\n\n\t/**\n\t * Sets one value (numbers, numeric text such as `1,200` or `12%`, or blank for a gap).\n\t * One undo step, or part of the current gesture.\n\t */\n\tsetValue(seriesId: string, index: number, value: unknown, options: ChartEditOptions = {}): ChartActionResult {\n\t\tconst series = this.getSeries(seriesId);\n\t\tif (!series) return this.unknownSeries(seriesId);\n\t\tif (!Number.isInteger(index) || index < 0 || index >= this.spec.categories.length) return this.badIndex(index);\n\t\tconst parsed = parseChartValue(value);\n\t\tif (parsed === undefined) return this.reject(`\"${String(value)}\" is not a number; enter a number or leave the cell blank.`, [{ path: `${seriesId}[${index}]`, message: `\"${String(value)}\" is not a number.` }]);\n\t\tif (series.values[index] === parsed) {\n\t\t\tif (this.issues.length) {\n\t\t\t\tthis.issues = [];\n\t\t\t\tthis.notify(false);\n\t\t\t}\n\t\t\treturn { ok: true };\n\t\t}\n\t\tconst next = this.edited((d) => {\n\t\t\td.series.find((s) => s.id === seriesId)!.values[index] = parsed;\n\t\t});\n\t\tthis.commit(options.label ?? `Edit ${series.name} · ${this.spec.categories[index]}`, next);\n\t\treturn { ok: true };\n\t}\n\n\t/** Several values as one undo step (all-or-nothing). */\n\tsetValues(cells: readonly { seriesId: string; index: number; value: unknown }[], options: ChartEditOptions = {}): ChartActionResult {\n\t\tconst issues: ChartIssue[] = [];\n\t\tconst parsed: { seriesId: string; index: number; value: ChartValue }[] = [];\n\t\tfor (const cell of cells) {\n\t\t\tif (!this.getSeries(cell.seriesId)) issues.push({ path: cell.seriesId, message: (this.unknownSeries(cell.seriesId) as { message: string }).message });\n\t\t\telse if (!Number.isInteger(cell.index) || cell.index < 0 || cell.index >= this.spec.categories.length) issues.push({ path: `${cell.seriesId}[${cell.index}]`, message: (this.badIndex(cell.index) as { message: string }).message });\n\t\t\telse {\n\t\t\t\tconst value = parseChartValue(cell.value);\n\t\t\t\tif (value === undefined) issues.push({ path: `${cell.seriesId}[${cell.index}]`, message: `\"${String(cell.value)}\" is not a number.` });\n\t\t\t\telse parsed.push({ seriesId: cell.seriesId, index: cell.index, value });\n\t\t\t}\n\t\t}\n\t\tif (issues.length) return this.reject(issues.map((i) => i.message).join(' '), issues);\n\t\tconst next = this.edited((d) => {\n\t\t\tfor (const cell of parsed) d.series.find((s) => s.id === cell.seriesId)!.values[cell.index] = cell.value;\n\t\t});\n\t\tif (JSON.stringify(next.series) !== JSON.stringify(this.spec.series)) this.commit(options.label ?? 'Edit values', next);\n\t\treturn { ok: true };\n\t}\n\n\t/** Adds a series (values padded to the categories) and selects it. Returns its id. */\n\taddSeries(input: ChartSeriesInput = {}, options: { at?: number } = {}): { ok: true; id: string } | { ok: false; message: string; issues?: ChartIssue[] } {\n\t\tconst id = input.id && !this.getSeries(input.id) ? input.id : uniqueChartSeriesId(this.spec.series);\n\t\tconst name = input.name ?? `Series ${this.spec.series.length + 1}`;\n\t\tconst at = Math.max(0, Math.min(this.spec.series.length, options.at ?? this.spec.series.length));\n\t\tconst series = [...this.spec.series];\n\t\tseries.splice(at, 0, { ...input, id, name, values: (input.values ?? []) as ChartValue[] });\n\t\tconst { spec, issues } = normalizeChartSpec({ ...this.spec, series });\n\t\tif (issues.length) return this.reject(issues.map((i) => i.message).join(' '), issues) as { ok: false; message: string };\n\t\tthis.commit(`Add series \"${name}\"`, spec, { kind: 'series', seriesId: id });\n\t\treturn { ok: true, id };\n\t}\n\n\tremoveSeries(id: string): ChartActionResult {\n\t\tconst series = this.getSeries(id);\n\t\tif (!series) return this.unknownSeries(id);\n\t\tthis.commit(\n\t\t\t`Delete series \"${series.name}\"`,\n\t\t\tthis.edited((d) => {\n\t\t\t\td.series = d.series.filter((s) => s.id !== id);\n\t\t\t})\n\t\t);\n\t\treturn { ok: true };\n\t}\n\n\tupdateSeries(id: string, patch: ChartSeriesPatch): ChartActionResult {\n\t\tconst series = this.getSeries(id);\n\t\tif (!series) return this.unknownSeries(id);\n\t\tconst next = cloneChartSeries(series);\n\t\tif (patch.name !== undefined) next.name = String(patch.name);\n\t\tif (patch.color === null || patch.color === '') delete next.color;\n\t\telse if (patch.color !== undefined) next.color = patch.color;\n\t\tif (patch.type === null) delete next.type;\n\t\telse if (patch.type !== undefined) next.type = patch.type;\n\t\tif (patch.hidden !== undefined) {\n\t\t\tif (patch.hidden) next.hidden = true;\n\t\t\telse delete next.hidden;\n\t\t}\n\t\tconst series2 = this.spec.series.map((s) => (s.id === id ? next : s));\n\t\tconst { spec, issues } = normalizeChartSpec({ ...this.spec, series: series2 });\n\t\tif (issues.length) return this.reject(issues.map((i) => i.message).join(' '), issues);\n\t\tif (JSON.stringify(spec.series) === JSON.stringify(this.spec.series)) return { ok: true };\n\t\tconst label =\n\t\t\tpatch.hidden !== undefined && Object.keys(patch).length === 1\n\t\t\t\t? `${patch.hidden ? 'Hide' : 'Show'} \"${series.name}\"`\n\t\t\t\t: patch.name !== undefined && Object.keys(patch).length === 1\n\t\t\t\t\t? 'Rename series'\n\t\t\t\t\t: `Change series \"${series.name}\"`;\n\t\tthis.commit(label, spec);\n\t\treturn { ok: true };\n\t}\n\n\ttoggleSeries(id: string): ChartActionResult {\n\t\tconst series = this.getSeries(id);\n\t\tif (!series) return this.unknownSeries(id);\n\t\treturn this.updateSeries(id, { hidden: !series.hidden });\n\t}\n\n\t/** Moves a series to position `to` (drawing and legend order). */\n\tmoveSeries(id: string, to: number): ChartActionResult {\n\t\tconst from = this.spec.series.findIndex((s) => s.id === id);\n\t\tif (from < 0) return this.unknownSeries(id);\n\t\tconst target = Math.max(0, Math.min(this.spec.series.length - 1, to));\n\t\tif (target === from) return { ok: true };\n\t\tthis.commit(\n\t\t\t'Reorder series',\n\t\t\tthis.edited((d) => {\n\t\t\t\tconst [s] = d.series.splice(from, 1);\n\t\t\t\td.series.splice(target, 0, s);\n\t\t\t})\n\t\t);\n\t\treturn { ok: true };\n\t}\n\n\t/** Inserts a category (with gaps in every series) at `at` (default: the end). Returns its index. */\n\taddCategory(label?: string, options: { at?: number } = {}): { ok: true; index: number } {\n\t\tconst at = Math.max(0, Math.min(this.spec.categories.length, options.at ?? this.spec.categories.length));\n\t\tconst name = label ?? `${this.spec.categories.length + 1}`;\n\t\tthis.commit(\n\t\t\t`Add category \"${name}\"`,\n\t\t\tthis.edited((d) => {\n\t\t\t\td.categories.splice(at, 0, name);\n\t\t\t\tfor (const s of d.series) s.values.splice(at, 0, null);\n\t\t\t}),\n\t\t\t{ kind: 'category', index: at }\n\t\t);\n\t\treturn { ok: true, index: at };\n\t}\n\n\tremoveCategory(index: number): ChartActionResult {\n\t\tif (!Number.isInteger(index) || index < 0 || index >= this.spec.categories.length) return this.badIndex(index);\n\t\tthis.commit(\n\t\t\t`Delete category \"${this.spec.categories[index]}\"`,\n\t\t\tthis.edited((d) => {\n\t\t\t\td.categories.splice(index, 1);\n\t\t\t\tfor (const s of d.series) s.values.splice(index, 1);\n\t\t\t})\n\t\t);\n\t\treturn { ok: true };\n\t}\n\n\trenameCategory(index: number, label: string): ChartActionResult {\n\t\tif (!Number.isInteger(index) || index < 0 || index >= this.spec.categories.length) return this.badIndex(index);\n\t\tif (this.spec.categories[index] === label) return { ok: true };\n\t\tthis.commit(\n\t\t\t'Rename category',\n\t\t\tthis.edited((d) => {\n\t\t\t\td.categories[index] = String(label);\n\t\t\t})\n\t\t);\n\t\treturn { ok: true };\n\t}\n\n\tmoveCategory(from: number, to: number): ChartActionResult {\n\t\tif (!Number.isInteger(from) || from < 0 || from >= this.spec.categories.length) return this.badIndex(from);\n\t\tconst target = Math.max(0, Math.min(this.spec.categories.length - 1, to));\n\t\tif (target === from) return { ok: true };\n\t\tconst move = <T>(list: T[]) => {\n\t\t\tconst [item] = list.splice(from, 1);\n\t\t\tlist.splice(target, 0, item);\n\t\t};\n\t\tthis.commit(\n\t\t\t'Reorder categories',\n\t\t\tthis.edited((d) => {\n\t\t\t\tmove(d.categories);\n\t\t\t\tfor (const s of d.series) move(s.values);\n\t\t\t})\n\t\t);\n\t\treturn { ok: true };\n\t}\n\n\t/**\n\t * Pastes a block of cells (TSV / CSV text or rows) into the data grid with its top-left at\n\t * `row` (category index) and `column` (series index; `-1` is the category column). The\n\t * grid grows to fit. Non-numeric value cells become gaps and are reported in `issues`.\n\t */\n\tpasteCells(row: number, column: number, cells: string | ReadonlyArray<ReadonlyArray<unknown>>): ChartActionResult & { issues?: ChartIssue[] } {\n\t\tconst rows: unknown[][] = typeof cells === 'string' ? (cells.includes('\\t') ? parseTsv(cells) : parseCsv(cells)) : cells.map((r) => [...r]);\n\t\tif (!rows.length) return { ok: true };\n\t\tconst issues: ChartIssue[] = [];\n\t\tconst next = this.edited((d) => {\n\t\t\tconst width = Math.max(...rows.map((r) => r.length));\n\t\t\tconst lastSeries = column + width - 1;\n\t\t\twhile (d.series.length <= lastSeries) {\n\t\t\t\tconst id = uniqueChartSeriesId(d.series);\n\t\t\t\td.series.push({ id, name: `Series ${d.series.length + 1}`, values: d.categories.map(() => null) });\n\t\t\t}\n\t\t\tconst lastRow = row + rows.length - 1;\n\t\t\twhile (d.categories.length <= lastRow) {\n\t\t\t\td.categories.push(`${d.categories.length + 1}`);\n\t\t\t\tfor (const s of d.series) s.values.push(null);\n\t\t\t}\n\t\t\trows.forEach((cellsInRow, r) => {\n\t\t\t\tcellsInRow.forEach((cell, c) => {\n\t\t\t\t\tconst col = column + c;\n\t\t\t\t\tconst index = row + r;\n\t\t\t\t\tif (col < 0) d.categories[index] = cell === null || cell === undefined ? '' : String(cell).trim();\n\t\t\t\t\telse {\n\t\t\t\t\t\tconst parsed = parseChartValue(cell);\n\t\t\t\t\t\tif (parsed === undefined) issues.push({ path: `${d.series[col].id}[${index}]`, message: `\"${String(cell)}\" is not a number; it was left blank.` });\n\t\t\t\t\t\td.series[col].values[index] = parsed ?? null;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t\tthis.commit('Paste cells', next);\n\t\tif (issues.length) {\n\t\t\tthis.issues = issues;\n\t\t\tthis.notify(false);\n\t\t}\n\t\treturn issues.length ? { ok: true, issues } : { ok: true };\n\t}\n\n\t/**\n\t * Replaces the data with a grid of cells (see `chartDataFromTable`): one undo step. Series\n\t * colours and types are kept by name.\n\t */\n\timportTable(rows: ReadonlyArray<ReadonlyArray<unknown>>, options: ChartTableOptions = {}): ChartActionResult & { issues?: ChartIssue[] } {\n\t\tconst data = chartDataFromTable(rows, options);\n\t\tif (!data.categories.length || !data.series.length) return this.reject('There is no data to import: expected a header row and at least one row of values.');\n\t\tconst byName = new Map(this.spec.series.map((s) => [s.name, s]));\n\t\tconst series = data.series.map((s) => {\n\t\t\tconst old = byName.get(s.name);\n\t\t\treturn { ...s, ...(old?.color ? { color: old.color } : {}), ...(old?.type ? { type: old.type } : {}), ...(old ? { id: old.id } : {}) };\n\t\t});\n\t\tconst { spec } = normalizeChartSpec({ ...this.spec, categories: data.categories, series });\n\t\tthis.commit('Import data', spec);\n\t\tif (data.issues.length) {\n\t\t\tthis.issues = data.issues;\n\t\t\tthis.notify(false);\n\t\t\treturn { ok: true, issues: data.issues };\n\t\t}\n\t\treturn { ok: true };\n\t}\n\n\t/** Imports CSV (or TSV, detected by tabs) text; see `importTable`. */\n\timportCsv(text: string, options: ChartTableOptions & { delimiter?: string } = {}): ChartActionResult & { issues?: ChartIssue[] } {\n\t\tconst delimiter = options.delimiter ?? (text.includes('\\t') ? '\\t' : ',');\n\t\treturn this.importTable(parseCsv(text, { delimiter }), options);\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Selection and gestures\n\t// -------------------------------------------------------------------------\n\n\t/** Selects a chart element (view state; not an undo step). */\n\tselect(selection: ChartSelection | null): void {\n\t\tconst next = this.validSelection(selection, this.spec);\n\t\tif (sameChartSelection(next, this.selection) || (next === null && this.selection === null)) return;\n\t\tthis.selection = next;\n\t\tthis.notify(false);\n\t}\n\n\t/**\n\t * Deletes what is selected: a series or category is removed, a point becomes a gap, a\n\t * title is cleared, the legend or an axis is hidden.\n\t */\n\tdeleteSelection(): ChartActionResult {\n\t\tconst sel = this.selection;\n\t\tif (!sel) return fail('Nothing is selected.');\n\t\tswitch (sel.kind) {\n\t\t\tcase 'series':\n\t\t\t\treturn this.removeSeries(sel.seriesId);\n\t\t\tcase 'category':\n\t\t\t\treturn this.removeCategory(sel.index);\n\t\t\tcase 'point':\n\t\t\t\treturn this.setValue(sel.seriesId, sel.index, null, { label: 'Clear value' });\n\t\t\tcase 'title':\n\t\t\t\treturn this.setTitle('');\n\t\t\tcase 'subtitle':\n\t\t\t\treturn this.setSubtitle('');\n\t\t\tcase 'legend':\n\t\t\t\treturn this.setLegend({ show: false });\n\t\t\tcase 'axis':\n\t\t\t\treturn this.setAxis(sel.axis, { show: false });\n\t\t\tdefault:\n\t\t\t\treturn fail('The chart itself cannot be deleted.');\n\t\t}\n\t}\n\n\t/** Adds `delta` to a value (a gap counts as 0). */\n\tnudgeValue(seriesId: string, index: number, delta: number): ChartActionResult {\n\t\tconst series = this.getSeries(seriesId);\n\t\tif (!series) return this.unknownSeries(seriesId);\n\t\tconst current = series.values[index] ?? 0;\n\t\treturn this.setValue(seriesId, index, Number((current + delta).toPrecision(12)), { label: `Edit ${series.name} · ${this.spec.categories[index] ?? index}` });\n\t}\n\n\t/** Starts a continuous edit (a drag): every change until `endGesture()` is one undo step. */\n\tbeginGesture(key: string): void {\n\t\tif (this.gestureKey === key) return;\n\t\tthis.history.endGesture();\n\t\tthis.gestureKey = key;\n\t\tthis.gestureCount++;\n\t\tthis.gestureStart = { spec: this.spec, mark: this.history.mark() };\n\t\tthis.notify(false);\n\t}\n\n\tendGesture(): void {\n\t\tif (this.gestureKey === null) return;\n\t\tthis.gestureKey = null;\n\t\tthis.history.endGesture();\n\t\t// A drag that ends where it started leaves no undo step behind.\n\t\tconst start = this.gestureStart;\n\t\tthis.gestureStart = null;\n\t\tif (start && sameChartJson(start.spec, this.spec)) this.history.revertTo(start.mark);\n\t\tthis.notify(false);\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Persistence and history\n\t// -------------------------------------------------------------------------\n\n\t/** The spec, for saving (a copy). */\n\ttoJSON(): ChartSpec {\n\t\treturn cloneChartSpec(this.spec);\n\t}\n\n\t/**\n\t * Replaces the chart without an undo step (e.g. when opening a document). Problems are\n\t * fixed with defaults and reported in `state.issues` (and returned).\n\t */\n\tload(input: unknown, options: { clearHistory?: boolean } = {}): ChartIssue[] {\n\t\tconst { spec, issues } = normalizeChartSpec(input);\n\t\tthis.spec = spec;\n\t\tthis.issues = issues;\n\t\tthis.selection = this.validSelection(this.selection, spec);\n\t\tif (options.clearHistory) {\n\t\t\tthis.applying = true;\n\t\t\ttry {\n\t\t\t\tthis.history.clear();\n\t\t\t} finally {\n\t\t\t\tthis.applying = false;\n\t\t\t}\n\t\t}\n\t\tthis.notify(true);\n\t\treturn issues;\n\t}\n\n\tundo(): boolean {\n\t\tthis.endGesture();\n\t\treturn this.history.undo();\n\t}\n\n\tredo(): boolean {\n\t\tthis.endGesture();\n\t\treturn this.history.redo();\n\t}\n\n\t/** Stops listening to the history (reconnected by the next `subscribe`). */\n\tdestroy(): void {\n\t\tthis.unsubscribeHistory?.();\n\t\tthis.unsubscribeHistory = undefined;\n\t\tthis.listeners.clear();\n\t}\n}\n\nexport function createChartController(options: ChartControllerOptions = {}): ChartController {\n\treturn new ChartController(options);\n}\n\nfunction updateLabel(patch: ChartSpecPatch): string {\n\tconst keys = Object.keys(patch);\n\tif (keys.length !== 1) return 'Change chart';\n\tconst labels: Record<string, string> = {\n\t\ttype: 'Change chart type',\n\t\ttitle: 'Edit title',\n\t\tsubtitle: 'Edit subtitle',\n\t\tcategories: 'Edit categories',\n\t\tseries: 'Edit series',\n\t\txAxis: 'Change category axis',\n\t\tyAxis: 'Change value axis',\n\t\tlegend: 'Change legend',\n\t\tstacking: 'Change stacking',\n\t\torientation: 'Change orientation',\n\t\tcurve: 'Change line style',\n\t\tpoints: 'Toggle points',\n\t\tdataLabels: 'Toggle data labels',\n\t\tpalette: 'Change colours',\n\t\tinnerRadius: 'Change donut hole'\n\t};\n\treturn labels[keys[0]] ?? 'Change chart';\n}\n","import type { CommandSpec } from '../commands/registry.js';\nimport type { ChartController, ChartSpecPatch } from './controller.js';\nimport { CHART_CURVES, CHART_LEGEND_POSITIONS, CHART_NUMBER_STYLES, CHART_ORIENTATIONS, CHART_SERIES_TYPES, CHART_STACKINGS, CHART_TYPES, chartDataToTable } from './spec.js';\nimport { chartToSvg } from './svg.js';\n\nexport interface ChartCommandOptions {\n\t/** Id prefix (default `chart.`); use one per chart when several are registered. */\n\tprefix?: string;\n\t/** Palette group (default `Chart`). */\n\tgroup?: string;\n\t/** Command scope. Omit for global commands. */\n\tscope?: string;\n}\n\nconst fail = (message: string): never => {\n\tthrow new Error(message);\n};\n\nconst check = (result: { ok: boolean; message?: string }) => {\n\tif (!result.ok) fail(result.message ?? 'The change was rejected.');\n};\n\nconst VALUE = { type: ['number', 'string', 'null'], description: 'A number, numeric text (\"1,200\", \"12%\") or null for a gap.' } as const;\n\nconst FORMAT = {\n\ttype: 'object',\n\tproperties: {\n\t\tstyle: { type: 'string', enum: [...CHART_NUMBER_STYLES] },\n\t\tdecimals: { type: 'integer', minimum: 0, maximum: 10 },\n\t\tcurrency: { type: 'string', description: 'ISO code for style \"currency\", e.g. \"EUR\".' },\n\t\tprefix: { type: 'string' },\n\t\tsuffix: { type: 'string' }\n\t},\n\tadditionalProperties: false\n} as const;\n\nconst AXIS = {\n\ttype: 'object',\n\tproperties: {\n\t\tshow: { type: 'boolean' },\n\t\ttitle: { type: 'string' },\n\t\tmin: { type: ['number', 'null'], description: 'Fixed lower bound, or null for automatic.' },\n\t\tmax: { type: ['number', 'null'], description: 'Fixed upper bound, or null for automatic.' },\n\t\tgridlines: { type: 'boolean' },\n\t\tformat: FORMAT\n\t},\n\tadditionalProperties: false\n} as const;\n\nconst SERIES = {\n\ttype: 'object',\n\tproperties: {\n\t\tid: { type: 'string' },\n\t\tname: { type: 'string' },\n\t\tvalues: { type: 'array', items: VALUE, description: 'One value per category.' },\n\t\tcolor: { type: 'string', description: 'CSS colour.' },\n\t\ttype: { type: 'string', enum: [...CHART_SERIES_TYPES], description: 'Draw this series differently (combo charts).' },\n\t\thidden: { type: 'boolean' }\n\t},\n\trequired: ['name', 'values'],\n\tadditionalProperties: false\n} as const;\n\n/**\n * Palette and agent commands for a chart: describe, update presentation, replace data, set\n * values, add / remove series and categories, import CSV and export SVG. Register them in a\n * `CommandRegistry` and agents get them through `createCommandToolProvider`. Failures throw\n * sentences, which the registry returns as `{ ok: false, code: 'failed', message }`.\n */\nexport function createChartCommands(controller: ChartController, options: ChartCommandOptions = {}): CommandSpec[] {\n\tconst prefix = options.prefix ?? 'chart.';\n\tconst base = { group: options.group ?? 'Chart', ...(options.scope ? { scope: options.scope } : {}) };\n\tconst seriesIds = () => controller.getSpec().series.map((s) => s.id);\n\tconst resolveSeries = (ref: string) => {\n\t\tconst spec = controller.getSpec();\n\t\tconst series = spec.series.find((s) => s.id === ref) ?? spec.series.find((s) => s.name === ref);\n\t\tif (!series) fail(`There is no series \"${ref}\"; expected one of ${seriesIds().map((id) => `\"${id}\"`).join(', ') || '(none yet)'}.`);\n\t\treturn series!;\n\t};\n\tconst resolveCategory = (ref: string | number) => {\n\t\tconst categories = controller.getSpec().categories;\n\t\tconst index = typeof ref === 'number' ? ref : categories.indexOf(ref);\n\t\tif (index < 0 || index >= categories.length || !Number.isInteger(index)) fail(`There is no category ${JSON.stringify(ref)}; expected an index from 0 to ${categories.length - 1} or one of the labels.`);\n\t\treturn index;\n\t};\n\n\treturn [\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}describe`,\n\t\t\tlabel: 'Describe Chart',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'data', 'spec', 'get'],\n\t\t\tdescription: 'Returns the chart spec (type, titles, axes, legend, options) and its data as a table with series names in the header row.',\n\t\t\trun: () => {\n\t\t\t\tconst spec = controller.getSpec();\n\t\t\t\treturn { spec: controller.toJSON(), table: chartDataToTable(spec), issues: controller.getState().issues };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}update`,\n\t\t\tlabel: 'Change Chart…',\n\t\t\tkeywords: ['chart', 'title', 'axis', 'legend', 'stack', 'style', 'format'],\n\t\t\tdescription: 'Changes chart presentation as one undo step: type, titles, axes (x = categories, y = values), legend, stacking, orientation, curve, points, data labels, palette or donut hole. Invalid values change nothing and return why.',\n\t\t\tparams: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: {\n\t\t\t\t\ttype: { type: 'string', enum: [...CHART_TYPES] },\n\t\t\t\t\ttitle: { type: 'string' },\n\t\t\t\t\tsubtitle: { type: 'string' },\n\t\t\t\t\txAxis: AXIS,\n\t\t\t\t\tyAxis: AXIS,\n\t\t\t\t\tlegend: { type: 'object', properties: { show: { type: 'boolean' }, position: { type: 'string', enum: [...CHART_LEGEND_POSITIONS] } }, additionalProperties: false },\n\t\t\t\t\tstacking: { type: 'string', enum: [...CHART_STACKINGS] },\n\t\t\t\t\torientation: { type: 'string', enum: [...CHART_ORIENTATIONS] },\n\t\t\t\t\tcurve: { type: 'string', enum: [...CHART_CURVES] },\n\t\t\t\t\tpoints: { type: 'boolean' },\n\t\t\t\t\tdataLabels: { type: 'boolean' },\n\t\t\t\t\tpalette: { type: 'array', items: { type: 'string' }, minItems: 1 },\n\t\t\t\t\tinnerRadius: { type: 'number', minimum: 0, maximum: 0.9 }\n\t\t\t\t},\n\t\t\t\tadditionalProperties: false\n\t\t\t},\n\t\t\trun: (_ctx: unknown, params: ChartSpecPatch) => {\n\t\t\t\tcheck(controller.update(params));\n\t\t\t\treturn { spec: controller.toJSON() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}setData`,\n\t\t\tlabel: 'Replace Chart Data…',\n\t\t\tkeywords: ['chart', 'data', 'series', 'categories'],\n\t\t\tdescription: 'Replaces the categories and series as one undo step. Each series has one value per category (padded with gaps).',\n\t\t\tparams: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: {\n\t\t\t\t\tcategories: { type: 'array', items: { type: 'string' } },\n\t\t\t\t\tseries: { type: 'array', items: SERIES }\n\t\t\t\t},\n\t\t\t\tadditionalProperties: false\n\t\t\t},\n\t\t\trun: (_ctx: unknown, params: { categories?: string[]; series?: any[] }) => {\n\t\t\t\tcheck(controller.setData(params));\n\t\t\t\treturn { table: chartDataToTable(controller.getSpec()) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}setValues`,\n\t\t\tlabel: 'Set Chart Values…',\n\t\t\tkeywords: ['chart', 'value', 'cell', 'edit'],\n\t\t\tdescription: 'Sets individual values as one undo step. Series by id or name; category by index or label.',\n\t\t\tparams: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: {\n\t\t\t\t\tcells: {\n\t\t\t\t\t\ttype: 'array',\n\t\t\t\t\t\tminItems: 1,\n\t\t\t\t\t\titems: {\n\t\t\t\t\t\t\ttype: 'object',\n\t\t\t\t\t\t\tproperties: { series: { type: 'string' }, category: { type: ['string', 'integer'] }, value: VALUE },\n\t\t\t\t\t\t\trequired: ['series', 'category', 'value'],\n\t\t\t\t\t\t\tadditionalProperties: false\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\trequired: ['cells']\n\t\t\t},\n\t\t\trun: (_ctx: unknown, params: { cells: { series: string; category: string | number; value: unknown }[] }) => {\n\t\t\t\tcheck(controller.setValues(params.cells.map((c) => ({ seriesId: resolveSeries(c.series).id, index: resolveCategory(c.category), value: c.value }))));\n\t\t\t\treturn { table: chartDataToTable(controller.getSpec()) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}addSeries`,\n\t\t\tlabel: 'Add Series',\n\t\t\tkeywords: ['chart', 'series', 'new'],\n\t\t\tdescription: 'Adds a series (default: an empty one at the end). Returns its id.',\n\t\t\tparams: { type: 'object', properties: { ...SERIES.properties, at: { type: 'integer', minimum: 0 } }, additionalProperties: false },\n\t\t\trun: (_ctx: unknown, params: { at?: number; name?: string; values?: unknown[] } = {}) => {\n\t\t\t\tconst { at, ...input } = params ?? {};\n\t\t\t\tconst result = controller.addSeries(input as any, { at });\n\t\t\t\tcheck(result);\n\t\t\t\treturn { id: (result as { id: string }).id };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}updateSeries`,\n\t\t\tlabel: 'Change Series…',\n\t\t\tkeywords: ['chart', 'series', 'rename', 'colour', 'color', 'hide'],\n\t\t\tdescription: 'Renames, recolours, hides or changes how a series is drawn (null colour / type resets it).',\n\t\t\tparams: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: {\n\t\t\t\t\tseries: { type: 'string', description: 'Series id or name.' },\n\t\t\t\t\tname: { type: 'string' },\n\t\t\t\t\tcolor: { type: ['string', 'null'] },\n\t\t\t\t\ttype: { type: ['string', 'null'], enum: [...CHART_SERIES_TYPES, null] },\n\t\t\t\t\thidden: { type: 'boolean' }\n\t\t\t\t},\n\t\t\t\trequired: ['series'],\n\t\t\t\tadditionalProperties: false\n\t\t\t},\n\t\t\trun: (_ctx: unknown, params: { series: string; name?: string; color?: string | null; type?: any; hidden?: boolean }) => {\n\t\t\t\tconst { series, ...patch } = params;\n\t\t\t\tconst id = resolveSeries(series).id;\n\t\t\t\tcheck(controller.updateSeries(id, patch));\n\t\t\t\treturn { series: controller.getSeries(id) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}removeSeries`,\n\t\t\tlabel: 'Delete Series',\n\t\t\tkeywords: ['chart', 'series', 'remove'],\n\t\t\tdescription: 'Deletes a series by id or name.',\n\t\t\tparams: { type: 'object', properties: { series: { type: 'string' } }, required: ['series'], additionalProperties: false },\n\t\t\trun: (_ctx: unknown, params: { series: string }) => {\n\t\t\t\tcheck(controller.removeSeries(resolveSeries(params.series).id));\n\t\t\t\treturn { series: seriesIds() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}addCategory`,\n\t\t\tlabel: 'Add Category',\n\t\t\tkeywords: ['chart', 'category', 'row', 'label'],\n\t\t\tdescription: 'Inserts a category (gaps in every series) at `at` (default: the end).',\n\t\t\tparams: { type: 'object', properties: { label: { type: 'string' }, at: { type: 'integer', minimum: 0 } }, additionalProperties: false },\n\t\t\trun: (_ctx: unknown, params: { label?: string; at?: number } = {}) => controller.addCategory(params?.label, { at: params?.at })\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}removeCategory`,\n\t\t\tlabel: 'Delete Category',\n\t\t\tkeywords: ['chart', 'category', 'row', 'remove'],\n\t\t\tdescription: 'Deletes a category (and its values) by index or label.',\n\t\t\tparams: { type: 'object', properties: { category: { type: ['string', 'integer'] } }, required: ['category'], additionalProperties: false },\n\t\t\trun: (_ctx: unknown, params: { category: string | number }) => {\n\t\t\t\tcheck(controller.removeCategory(resolveCategory(params.category)));\n\t\t\t\treturn { categories: controller.getSpec().categories };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}importCsv`,\n\t\t\tlabel: 'Import Chart Data from CSV…',\n\t\t\tkeywords: ['chart', 'csv', 'tsv', 'paste', 'import'],\n\t\t\tdescription: 'Replaces the data with CSV / TSV text: by default the first column holds categories and the first row series names.',\n\t\t\tparams: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: {\n\t\t\t\t\tcsv: { type: 'string' },\n\t\t\t\t\tseriesIn: { type: 'string', enum: ['columns', 'rows'] },\n\t\t\t\t\theader: { type: 'boolean' }\n\t\t\t\t},\n\t\t\t\trequired: ['csv'],\n\t\t\t\tadditionalProperties: false\n\t\t\t},\n\t\t\trun: (_ctx: unknown, params: { csv: string; seriesIn?: 'columns' | 'rows'; header?: boolean }) => {\n\t\t\t\tconst result = controller.importCsv(params.csv, { seriesIn: params.seriesIn, header: params.header });\n\t\t\t\tcheck(result);\n\t\t\t\treturn { table: chartDataToTable(controller.getSpec()), issues: result.issues ?? [] };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}exportSvg`,\n\t\t\tlabel: 'Export Chart as SVG',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'svg', 'export', 'image'],\n\t\t\tdescription: 'Returns the chart drawn as a standalone SVG string.',\n\t\t\tparams: { type: 'object', properties: { width: { type: 'number', minimum: 50 }, height: { type: 'number', minimum: 50 } }, additionalProperties: false },\n\t\t\trun: (_ctx: unknown, params: { width?: number; height?: number } = {}) => ({\n\t\t\t\tsvg: chartToSvg(controller.getSpec() as any, { width: params?.width ?? 640, height: params?.height ?? 400 })\n\t\t\t})\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}undo`,\n\t\t\tlabel: 'Undo Chart Edit',\n\t\t\tkeywords: ['chart', 'undo'],\n\t\t\tenabled: () => controller.getState().canUndo || 'Nothing to undo',\n\t\t\trun: () => ({ undone: controller.undo() })\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}redo`,\n\t\t\tlabel: 'Redo Chart Edit',\n\t\t\tkeywords: ['chart', 'redo'],\n\t\t\tenabled: () => controller.getState().canRedo || 'Nothing to redo',\n\t\t\trun: () => ({ redone: controller.redo() })\n\t\t}\n\t];\n}\n","import type { ChartController } from './controller.js';\nimport { chartValueAtPoint, snapChartValue } from './layout.js';\nimport { isCartesianChart } from './spec.js';\nimport type { ChartScene, ChartSelection } from './types.js';\n\n/** Scene coordinates of a pointer, given the rendered element's box (the scene is scaled to fit it). */\nexport function chartClientToScene(scene: Pick<ChartScene, 'width' | 'height'>, box: { left: number; top: number; width: number; height: number }, clientX: number, clientY: number): { x: number; y: number } {\n\tconst sx = box.width ? scene.width / box.width : 1;\n\tconst sy = box.height ? scene.height / box.height : 1;\n\treturn { x: (clientX - box.left) * sx, y: (clientY - box.top) * sy };\n}\n\n/** Whether a point can be dragged to a new value in this scene (cartesian, not percent-stacked, not hidden). */\nexport function canDragChartPoint(controller: ChartController, scene: ChartScene, target: ChartSelection | undefined): target is Extract<ChartSelection, { kind: 'point' }> {\n\tif (target?.kind !== 'point' || !scene.valueScale || scene.percent) return false;\n\tconst spec = controller.getSpec();\n\tif (!isCartesianChart(spec.type)) return false;\n\tconst series = controller.getSeries(target.seriesId);\n\treturn !!series && !series.hidden && series.values[target.index] !== null;\n}\n\nexport interface ChartPointDrag {\n\t/**\n\t * The value axis range when the drag started. Pass it to `layoutChart` (`valueDomain`)\n\t * until `end()` so the axis does not rescale under the pointer.\n\t */\n\treadonly valueDomain: { min: number; max: number };\n\t/** Moves the value with the pointer (scene coordinates). */\n\tmove(point: { x: number; y: number }): void;\n\t/** Ends the drag (one undo step for the whole drag). */\n\tend(): void;\n}\n\n/**\n * Starts dragging a bar or point: the value follows the pointer along the value axis,\n * snapped to a tenth of the tick step (`step` overrides), and the whole drag is one undo\n * step. Works for stacked bars too (the drag changes the segment by the distance moved).\n * Returns `null` when the target cannot be dragged.\n */\nexport function startChartPointDrag(controller: ChartController, scene: ChartScene, target: ChartSelection | undefined, start: { x: number; y: number }, options: { step?: number } = {}): ChartPointDrag | null {\n\tif (!canDragChartPoint(controller, scene, target)) return null;\n\tconst { seriesId, index } = target;\n\tconst startValue = controller.getSeries(seriesId)!.values[index] ?? 0;\n\tconst startAt = chartValueAtPoint(scene, start);\n\tif (startAt === undefined) return null;\n\tcontroller.beginGesture(`drag:${seriesId}:${index}`);\n\tlet ended = false;\n\tconst [min, max] = scene.valueScale!.domain;\n\treturn {\n\t\tvalueDomain: { min, max },\n\t\tmove(point) {\n\t\t\tif (ended) return;\n\t\t\tconst at = chartValueAtPoint(scene, point);\n\t\t\tif (at === undefined) return;\n\t\t\tcontroller.setValue(seriesId, index, snapChartValue(scene, startValue + (at - startAt), options.step), { label: `Drag ${controller.getSeries(seriesId)?.name ?? 'value'}` });\n\t\t},\n\t\tend() {\n\t\t\tif (ended) return;\n\t\t\tended = true;\n\t\t\tcontroller.endGesture();\n\t\t}\n\t};\n}\n\nexport interface ChartKeyInput {\n\tkey: string;\n\tshiftKey?: boolean;\n\taltKey?: boolean;\n\tmetaKey?: boolean;\n\tctrlKey?: boolean;\n}\n\n/**\n * Keyboard editing on a focused chart: arrows move a point selection between categories\n * (← →) and change its value (↑ ↓, a tenth of the tick step; Shift: a whole step), Delete /\n * Backspace deletes the selection, Escape clears it. Returns `true` when the key was used\n * (call `preventDefault`).\n */\nexport function handleChartKey(controller: ChartController, scene: ChartScene | null, event: ChartKeyInput): boolean {\n\tif (event.metaKey || event.ctrlKey || event.altKey) return false;\n\tconst { selection, spec } = controller.getState();\n\tswitch (event.key) {\n\t\tcase 'Escape':\n\t\t\tif (!selection) return false;\n\t\t\tcontroller.select(null);\n\t\t\treturn true;\n\t\tcase 'Delete':\n\t\tcase 'Backspace':\n\t\t\tif (!selection || selection.kind === 'chart') return false;\n\t\t\tcontroller.deleteSelection();\n\t\t\treturn true;\n\t\tcase 'ArrowLeft':\n\t\tcase 'ArrowRight': {\n\t\t\tif (selection?.kind !== 'point' && selection?.kind !== 'category') return false;\n\t\t\tconst n = spec.categories.length;\n\t\t\tconst index = Math.max(0, Math.min(n - 1, selection.index + (event.key === 'ArrowRight' ? 1 : -1)));\n\t\t\tcontroller.select({ ...selection, index });\n\t\t\treturn true;\n\t\t}\n\t\tcase 'ArrowUp':\n\t\tcase 'ArrowDown': {\n\t\t\tif (selection?.kind !== 'point' || scene?.percent) return false;\n\t\t\tconst ticks = scene?.valueScale?.ticks ?? [];\n\t\t\tconst step = ticks.length > 1 ? ticks[1] - ticks[0] : 1;\n\t\t\tconst delta = (event.shiftKey ? step : step / 10) * (event.key === 'ArrowUp' ? 1 : -1);\n\t\t\tcontroller.nudgeValue(selection.seriesId, selection.index, delta);\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n/** A short description of the selection for an inspector heading or a screen reader. */\nexport function describeChartSelection(controller: ChartController, selection: ChartSelection | null = controller.getState().selection): string {\n\tif (!selection) return 'Nothing selected';\n\tconst spec = controller.getSpec();\n\tswitch (selection.kind) {\n\t\tcase 'chart':\n\t\t\treturn 'Chart';\n\t\tcase 'title':\n\t\t\treturn 'Title';\n\t\tcase 'subtitle':\n\t\t\treturn 'Subtitle';\n\t\tcase 'legend':\n\t\t\treturn 'Legend';\n\t\tcase 'axis':\n\t\t\treturn selection.axis === 'x' ? 'Category axis' : 'Value axis';\n\t\tcase 'series':\n\t\t\treturn `Series \"${controller.getSeries(selection.seriesId)?.name ?? selection.seriesId}\"`;\n\t\tcase 'category':\n\t\t\treturn `Category \"${spec.categories[selection.index] ?? selection.index}\"`;\n\t\tcase 'point': {\n\t\t\tconst series = controller.getSeries(selection.seriesId);\n\t\t\tconst value = series?.values[selection.index];\n\t\t\treturn `${series?.name ?? selection.seriesId} · ${spec.categories[selection.index] ?? selection.index}: ${value ?? 'blank'}`;\n\t\t}\n\t}\n}\n"],"mappings":";;;;;;;;;AAiBO,IAAM,cAAoC,CAAC,OAAO,QAAQ,QAAQ,WAAW,OAAO,OAAO;AAC3F,IAAM,qBAAiD,CAAC,OAAO,QAAQ,QAAQ,SAAS;AACxF,IAAM,kBAA4C,CAAC,QAAQ,WAAW,SAAS;AAC/E,IAAM,eAAsC,CAAC,UAAU,UAAU,MAAM;AACvE,IAAM,qBAAkD,CAAC,YAAY,YAAY;AACjF,IAAM,yBAAyD,CAAC,OAAO,UAAU,QAAQ,OAAO;AAChG,IAAM,sBAA0E,CAAC,UAAU,WAAW,YAAY,SAAS;AAG3H,IAAM,oBAAyD;AAAA,EACrE,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,KAAK;AAAA,EACL,OAAO;AACR;AAGO,IAAM,wBAA2C,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AAE9J,IAAM,sBAAkC;AAAA,EAC9C,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AACZ;AAOO,IAAM,2BAAuC;AAAA,EACnD,GAAG;AAAA,EACH,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WAAW;AAAA,EACX,YAAY;AACb;AAEO,SAAS,iBAAiB,MAA0B;AAC1D,SAAO,SAAS,SAAS,SAAS;AACnC;AAEO,SAAS,iBAAiB,OAA2B;AAC3D,SAAO,EAAE,MAAM,MAAM,OAAO,IAAI,KAAK,MAAM,KAAK,MAAM,WAAW,OAAO,QAAQ,CAAC,EAAE;AACpF;AAGO,SAAS,gBAAgB,UAA8B,CAAC,GAAc;AAC5E,SAAO,mBAAmB,OAAO,EAAE;AACpC;AAGO,SAAS,iBAAiB,MAA6C,aAA6B;AAC1G,QAAM,SAAS,KAAK,OAAO,WAAW;AACtC,MAAI,QAAQ,MAAO,QAAO,OAAO;AACjC,QAAM,UAAU,KAAK,QAAQ,SAAS,KAAK,UAAU;AACrD,SAAO,QAAQ,cAAc,QAAQ,MAAM;AAC5C;AAGO,SAAS,gBAAgB,MAAkC,OAAuB;AACxF,QAAM,UAAU,KAAK,QAAQ,SAAS,KAAK,UAAU;AACrD,SAAO,QAAQ,QAAQ,QAAQ,MAAM;AACtC;AAGO,SAAS,gBAAgB,MAA+B,QAAsC;AACpG,MAAI,OAAO,KAAM,QAAO,OAAO;AAC/B,SAAO,iBAAiB,KAAK,IAAI,IAAK,KAAK,OAA2B;AACvE;AAGO,SAAS,oBAAoB,QAA4C,OAAO,UAAkB;AACxG,QAAM,OAAO,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC5C,WAAS,IAAI,OAAO,SAAS,KAAK,KAAK;AACtC,UAAM,KAAK,GAAG,IAAI,IAAI,CAAC;AACvB,QAAI,CAAC,KAAK,IAAI,EAAE,EAAG,QAAO;AAAA,EAC3B;AACD;AAMO,SAAS,gBAAgB,OAAwC;AACvE,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AACvE,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAIA,QAAO,MAAM,KAAK;AACtB,MAAI,CAACA,SAAQA,UAAS,OAAOA,UAAS,SAAK,QAAO;AAClD,MAAI,WAAW;AACf,MAAI,WAAW,KAAKA,KAAI,GAAG;AAC1B,eAAW;AACX,IAAAA,QAAOA,MAAK,MAAM,GAAG,EAAE,EAAE,KAAK;AAAA,EAC/B;AACA,QAAM,UAAUA,MAAK,SAAS,GAAG;AACjC,MAAI,QAAS,CAAAA,QAAOA,MAAK,MAAM,GAAG,EAAE,EAAE,KAAK;AAC3C,EAAAA,QAAOA,MAAK,QAAQ,WAAW,EAAE,EAAE,QAAQ,MAAM,EAAE,EAAE,QAAQ,QAAQ,EAAE;AACvE,MAAI,CAAC,wCAAwC,KAAKA,KAAI,EAAG,QAAO;AAChE,MAAI,QAAQ,OAAOA,KAAI;AACvB,MAAI,QAAS,UAAS;AACtB,MAAI,SAAU,SAAQ,CAAC;AACvB,SAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AACzC;AAEA,IAAM,WAAW,CAAC,UAAqD,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAE1I,SAAS,KAAuB,OAAgB,SAAuB,UAAa,MAAc,QAAyB;AAC1H,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,OAAO,UAAU,YAAa,QAA8B,SAAS,KAAK,EAAG,QAAO;AACxF,SAAO,KAAK,EAAE,MAAM,SAAS,GAAG,IAAI,mBAAmB,QAAQ,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,UAAU,KAAK,CAAC,IAAI,CAAC;AACjI,SAAO;AACR;AAEA,SAAS,KAAK,OAAgB,UAAkB,MAAc,QAA8B;AAC3F,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAW,QAAO,OAAO,KAAK;AAChF,SAAO,KAAK,EAAE,MAAM,SAAS,GAAG,IAAI,iBAAiB,CAAC;AACtD,SAAO;AACR;AAEA,SAAS,KAAK,OAAgB,UAAmB,MAAc,QAA+B;AAC7F,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,OAAO,UAAU,UAAW,QAAO;AACvC,SAAO,KAAK,EAAE,MAAM,SAAS,GAAG,IAAI,0BAA0B,CAAC;AAC/D,SAAO;AACR;AAEA,SAAS,MAAM,OAAgB,MAAc,QAAqC;AACjF,MAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,GAAI,QAAO;AAClE,QAAM,IAAI,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI;AACtD,MAAI,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,EAAG,QAAO;AACxD,SAAO,KAAK,EAAE,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;AAClE,SAAO;AACR;AAEA,SAAS,gBAAgB,OAAgB,MAAc,QAAyC;AAC/F,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO,CAAC;AACnD,MAAI,CAAC,SAAS,KAAK,GAAG;AACrB,WAAO,KAAK,EAAE,MAAM,SAAS,GAAG,IAAI,sBAAsB,CAAC;AAC3D,WAAO,CAAC;AAAA,EACT;AACA,QAAM,MAAyB,CAAC;AAChC,MAAI,MAAM,UAAU,OAAW,KAAI,QAAQ,KAAK,MAAM,OAAO,qBAAqB,UAAU,GAAG,IAAI,UAAU,MAAM;AACnH,MAAI,MAAM,aAAa,QAAW;AACjC,UAAM,IAAI,OAAO,MAAM,QAAQ;AAC/B,QAAI,OAAO,UAAU,CAAC,KAAK,KAAK,KAAK,KAAK,GAAI,KAAI,WAAW;AAAA,QACxD,QAAO,KAAK,EAAE,MAAM,GAAG,IAAI,aAAa,SAAS,GAAG,IAAI,iDAAiD,CAAC;AAAA,EAChH;AACA,aAAW,OAAO,CAAC,YAAY,UAAU,QAAQ,GAAY;AAC5D,QAAI,MAAM,GAAG,MAAM,OAAW,KAAI,GAAG,IAAI,KAAK,MAAM,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,MAAM;AAAA,EACvF;AACA,SAAO;AACR;AAEO,SAAS,mBAAmB,OAAgB,UAAqB,MAAc,SAAuB,CAAC,GAAc;AAC3H,MAAI,UAAU,OAAW,QAAO,EAAE,GAAG,UAAU,QAAQ,EAAE,GAAG,SAAS,OAAO,EAAE;AAC9E,MAAI,CAAC,SAAS,KAAK,GAAG;AACrB,WAAO,KAAK,EAAE,MAAM,SAAS,GAAG,IAAI,sBAAsB,CAAC;AAC3D,WAAO,EAAE,GAAG,UAAU,QAAQ,EAAE,GAAG,SAAS,OAAO,EAAE;AAAA,EACtD;AACA,MAAI,MAAM,SAAS,QAAQ,MAAM,MAAM,KAAK,GAAG,IAAI,QAAQ,MAAM,IAAI,SAAS;AAC9E,MAAI,MAAM,SAAS,QAAQ,MAAM,MAAM,KAAK,GAAG,IAAI,QAAQ,MAAM,IAAI,SAAS;AAC9E,MAAI,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,KAAK;AAC/C,WAAO,KAAK,EAAE,MAAM,GAAG,IAAI,QAAQ,SAAS,GAAG,IAAI,SAAS,GAAG,0BAA0B,IAAI,SAAS,GAAG,KAAK,CAAC;AAC/G,UAAM,SAAS;AACf,UAAM,SAAS;AAAA,EAChB;AACA,SAAO;AAAA,IACN,MAAM,KAAK,MAAM,MAAM,SAAS,MAAM,GAAG,IAAI,SAAS,MAAM;AAAA,IAC5D,OAAO,KAAK,MAAM,OAAO,SAAS,OAAO,GAAG,IAAI,UAAU,MAAM;AAAA,IAChE;AAAA,IACA;AAAA,IACA,WAAW,KAAK,MAAM,WAAW,SAAS,WAAW,GAAG,IAAI,cAAc,MAAM;AAAA,IAChF,QAAQ,YAAY,QAAQ,gBAAgB,MAAM,QAAQ,GAAG,IAAI,WAAW,MAAM,IAAI,EAAE,GAAG,SAAS,OAAO;AAAA,EAC5G;AACD;AAEA,SAAS,gBAAgB,OAAgB,QAAmC;AAC3E,QAAM,WAAwB,EAAE,MAAM,MAAM,UAAU,SAAS;AAC/D,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,CAAC,SAAS,KAAK,GAAG;AACrB,WAAO,KAAK,EAAE,MAAM,UAAU,SAAS,4BAA4B,CAAC;AACpE,WAAO;AAAA,EACR;AACA,SAAO;AAAA,IACN,MAAM,KAAK,MAAM,MAAM,SAAS,MAAM,eAAe,MAAM;AAAA,IAC3D,UAAU,KAAK,MAAM,UAAU,wBAAwB,SAAS,UAAU,mBAAmB,MAAM;AAAA,EACpG;AACD;AAGO,SAAS,qBAAqB,OAAgB,QAA4B,MAAc,SAAuB,CAAC,GAAiB;AACvI,MAAI,UAAU,OAAW,QAAO,SAAS,MAAM,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC;AACrE,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC1B,WAAO,KAAK,EAAE,MAAM,SAAS,GAAG,IAAI,gCAAgC,CAAC;AACrE,WAAO,SAAS,MAAM,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC;AAAA,EAC7C;AACA,QAAM,MAAM,MAAM,IAAI,CAAC,GAAG,MAAM;AAC/B,UAAM,SAAS,gBAAgB,CAAC;AAChC,QAAI,WAAW,QAAW;AACzB,aAAO,KAAK,EAAE,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,SAAS,GAAG,IAAI,IAAI,CAAC,sBAAsB,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC;AACtG,aAAO;AAAA,IACR;AACA,WAAO;AAAA,EACR,CAAC;AACD,MAAI,WAAW,OAAW,QAAO;AACjC,MAAI,IAAI,SAAS,OAAQ,QAAO,IAAI,MAAM,GAAG,MAAM;AACnD,SAAO,IAAI,SAAS,OAAQ,KAAI,KAAK,IAAI;AACzC,SAAO;AACR;AAEA,SAAS,gBAAgB,OAAgB,QAAgB,MAAmB,OAAe,QAA0C;AACpI,QAAM,OAAO,UAAU,KAAK;AAC5B,MAAI,CAAC,SAAS,KAAK,GAAG;AACrB,WAAO,KAAK,EAAE,MAAM,SAAS,GAAG,IAAI,6CAA6C,CAAC;AAClF,WAAO;AAAA,EACR;AACA,MAAI,KAAK,OAAO,MAAM,OAAO,YAAY,MAAM,GAAG,KAAK,IAAI,MAAM,GAAG,KAAK,IAAI;AAC7E,MAAI,CAAC,MAAM,KAAK,IAAI,EAAE,GAAG;AACxB,QAAI,GAAI,QAAO,KAAK,EAAE,MAAM,GAAG,IAAI,OAAO,SAAS,cAAc,EAAE,2CAA2C,CAAC;AAC/G,aAAS,IAAI,QAAQ,KAAK,KAAK;AAC9B,WAAK,UAAU,CAAC;AAChB,UAAI,CAAC,KAAK,IAAI,EAAE,EAAG;AAAA,IACpB;AAAA,EACD;AACA,OAAK,IAAI,EAAE;AACX,QAAM,SAAsB;AAAA,IAC3B;AAAA,IACA,MAAM,KAAK,MAAM,MAAM,UAAU,QAAQ,CAAC,IAAI,GAAG,IAAI,SAAS,MAAM;AAAA,IACpE,QAAQ,qBAAqB,MAAM,QAAQ,QAAQ,GAAG,IAAI,WAAW,MAAM;AAAA,EAC5E;AACA,MAAI,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,KAAK,EAAG,QAAO,QAAQ,MAAM,MAAM,KAAK;AAC3F,MAAI,MAAM,SAAS,UAAa,MAAM,SAAS,KAAM,QAAO,OAAO,KAAK,MAAM,MAAM,oBAAoB,OAAO,GAAG,IAAI,SAAS,MAAM;AACrI,MAAI,MAAM,WAAW,KAAM,QAAO,SAAS;AAC3C,SAAO;AACR;AAQO,SAAS,mBAAmB,OAA2D;AAC7F,QAAM,SAAuB,CAAC;AAC9B,QAAM,QAAQ,SAAS,KAAK,IAAI,QAAQ,CAAC;AACzC,MAAI,UAAU,UAAa,CAAC,SAAS,KAAK,EAAG,QAAO,KAAK,EAAE,MAAM,IAAI,SAAS,6BAA6B,CAAC;AAC5G,QAAM,OAAO,KAAK,MAAM,MAAM,aAAa,OAAO,QAAQ,MAAM;AAChE,QAAM,YAAY,MAAM,QAAQ,MAAM,MAAM,IAAI,MAAM,SAAS,CAAC;AAChE,MAAI,MAAM,WAAW,UAAa,CAAC,MAAM,QAAQ,MAAM,MAAM,EAAG,QAAO,KAAK,EAAE,MAAM,UAAU,SAAS,2BAA2B,CAAC;AAEnI,MAAI;AACJ,MAAI,MAAM,QAAQ,MAAM,UAAU,EAAG,cAAa,MAAM,WAAW,IAAI,CAAC,GAAG,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,KAAK,MAAM,CAAC;AAAA,OACnH;AACJ,QAAI,MAAM,eAAe,OAAW,QAAO,KAAK,EAAE,MAAM,cAAc,SAAS,yCAAyC,CAAC;AACzH,UAAM,UAAU,UAAU,OAAe,CAAC,GAAG,MAAM,KAAK,IAAI,GAAG,SAAS,CAAC,KAAK,MAAM,QAAQ,EAAE,MAAM,IAAI,EAAE,OAAO,SAAS,CAAC,GAAG,CAAC;AAC/H,iBAAa,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,EAAE;AAAA,EAClE;AAEA,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAAS,UAAU,IAAI,CAAC,GAAG,MAAM,gBAAgB,GAAG,WAAW,QAAQ,MAAM,GAAG,MAAM,CAAC,EAAE,OAAO,CAAC,MAAwB,MAAM,IAAI;AAEzI,MAAI,UAAU,CAAC,GAAG,qBAAqB;AACvC,MAAI,MAAM,QAAQ,MAAM,OAAO,GAAG;AACjC,UAAM,SAAS,MAAM,QAAQ,OAAO,CAAC,MAAmB,OAAO,MAAM,YAAY,EAAE,KAAK,MAAM,EAAE;AAChG,QAAI,OAAO,OAAQ,WAAU;AAAA,QACxB,QAAO,KAAK,EAAE,MAAM,WAAW,SAAS,yCAAyC,CAAC;AAAA,EACxF,WAAW,MAAM,YAAY,OAAW,QAAO,KAAK,EAAE,MAAM,WAAW,SAAS,uCAAuC,CAAC;AAExH,MAAI,cAAc;AAClB,MAAI,MAAM,gBAAgB,QAAW;AACpC,UAAM,IAAI,OAAO,MAAM,WAAW;AAClC,QAAI,OAAO,SAAS,CAAC,KAAK,KAAK,KAAK,KAAK,IAAK,eAAc;AAAA,QACvD,QAAO,KAAK,EAAE,MAAM,eAAe,SAAS,8CAA8C,CAAC;AAAA,EACjG;AAEA,QAAM,OAAkB;AAAA,IACvB,SAAS;AAAA,IACT;AAAA,IACA,OAAO,KAAK,MAAM,OAAO,IAAI,SAAS,MAAM;AAAA,IAC5C,UAAU,KAAK,MAAM,UAAU,IAAI,YAAY,MAAM;AAAA,IACrD;AAAA,IACA;AAAA,IACA,OAAO,mBAAmB,MAAM,OAAO,iBAAiB,KAAK,GAAG,SAAS,MAAM;AAAA,IAC/E,OAAO,mBAAmB,MAAM,OAAO,iBAAiB,IAAI,GAAG,SAAS,MAAM;AAAA,IAC9E,QAAQ,gBAAgB,MAAM,QAAQ,MAAM;AAAA,IAC5C,UAAU,KAAK,MAAM,UAAU,iBAAiB,QAAQ,YAAY,MAAM;AAAA,IAC1E,aAAa,KAAK,MAAM,aAAa,oBAAoB,YAAY,eAAe,MAAM;AAAA,IAC1F,OAAO,KAAK,MAAM,OAAO,cAAc,UAAU,SAAS,MAAM;AAAA,IAChE,QAAQ,KAAK,MAAM,QAAQ,MAAM,UAAU,MAAM;AAAA,IACjD,YAAY,KAAK,MAAM,YAAY,OAAO,cAAc,MAAM;AAAA,IAC9D;AAAA,IACA;AAAA,EACD;AACA,SAAO,EAAE,MAAM,OAAO;AACvB;AAGO,SAAS,eAAe,MAA4B;AAC1D,SAAO;AAAA,IACN,GAAG;AAAA,IACH,YAAY,CAAC,GAAG,KAAK,UAAU;AAAA,IAC/B,QAAQ,KAAK,OAAO,IAAI,gBAAgB;AAAA,IACxC,OAAO,EAAE,GAAG,KAAK,OAAO,QAAQ,EAAE,GAAG,KAAK,MAAM,OAAO,EAAE;AAAA,IACzD,OAAO,EAAE,GAAG,KAAK,OAAO,QAAQ,EAAE,GAAG,KAAK,MAAM,OAAO,EAAE;AAAA,IACzD,QAAQ,EAAE,GAAG,KAAK,OAAO;AAAA,IACzB,SAAS,CAAC,GAAG,KAAK,OAAO;AAAA,EAC1B;AACD;AAEO,SAAS,iBAAiB,QAAkC;AAClE,SAAO,EAAE,GAAG,QAAQ,QAAQ,CAAC,GAAG,OAAO,MAAM,EAAE;AAChD;AAsBO,SAAS,mBAAmB,MAA6C,UAA6B,CAAC,GAAmB;AAChI,QAAM,SAAS,QAAQ,UAAU;AACjC,MAAI,OAAO,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,MAAM,QAAQ,MAAM,UAAa,OAAO,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;AACxH,MAAI,QAAQ,aAAa,QAAQ;AAChC,UAAMC,SAAQ,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AACtD,WAAO,MAAM,KAAK,EAAE,QAAQA,OAAM,GAAG,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAAA,EACrE;AACA,QAAM,SAAuB,CAAC;AAC9B,MAAI,CAAC,KAAK,OAAQ,QAAO,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,GAAG,OAAO;AAC9D,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AACnD,QAAM,QAAQ,SAAS,KAAK,CAAC,IAAI,CAAC;AAClC,QAAM,OAAO,SAAS,KAAK,MAAM,CAAC,IAAI;AACtC,QAAM,aAAa,KAAK,IAAI,CAAC,GAAG,MAAM;AACrC,UAAM,IAAI,EAAE,CAAC;AACb,WAAO,MAAM,QAAQ,MAAM,UAAa,OAAO,CAAC,EAAE,KAAK,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,OAAO,CAAC,EAAE,KAAK;AAAA,EAC/F,CAAC;AACD,QAAM,SAAwB,CAAC;AAC/B,WAAS,MAAM,GAAG,MAAM,OAAO,OAAO;AACrC,UAAM,OAAO,MAAM,GAAG,MAAM,UAAa,OAAO,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,OAAO,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,UAAU,GAAG;AAC9G,UAAM,SAAS,KAAK,IAAI,CAAC,GAAG,MAAM;AACjC,YAAM,SAAS,gBAAgB,EAAE,GAAG,KAAK,IAAI;AAC7C,UAAI,WAAW,QAAW;AACzB,eAAO,KAAK,EAAE,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,SAAS,IAAI,OAAO,EAAE,GAAG,CAAC,CAAC,QAAQ,IAAI,KAAK,WAAW,CAAC,CAAC,wCAAwC,CAAC;AACvI,eAAO;AAAA,MACR;AACA,aAAO;AAAA,IACR,CAAC;AACD,WAAO,KAAK,EAAE,IAAI,UAAU,GAAG,IAAI,MAAM,OAAO,CAAC;AAAA,EAClD;AACA,SAAO,EAAE,YAAY,QAAQ,OAAO;AACrC;AAGO,SAAS,iBAAiB,MAAgD,UAAuC,CAAC,GAAiC;AACzJ,SAAO;AAAA,IACN,CAAC,QAAQ,kBAAkB,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAAA,IAChE,GAAG,KAAK,WAAW,IAAI,CAAC,UAAU,MAAM,CAAC,UAAU,GAAG,KAAK,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;AAAA,EACnG;AACD;AAGO,SAAS,qBAAqB,OAAuB;AAC3D,MAAI,kBAAkB,KAAK,KAAK,EAAG,QAAO,MAAM,YAAY;AAC5D,MAAI,kBAAkB,KAAK,KAAK,EAAG,QAAO,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,YAAY;AAC3G,SAAO;AACR;;;ACxZO,SAAS,SAAS,MAAc,OAAuB;AAC7D,MAAI,EAAE,OAAO,MAAM,EAAE,QAAQ,GAAI,QAAO;AACxC,QAAM,MAAM,OAAO;AACnB,QAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,MAAM,GAAG,CAAC,CAAC;AACtD,QAAM,WAAW,MAAM;AACvB,QAAM,OAAO,YAAY,IAAI,IAAI,YAAY,IAAI,IAAI,YAAY,MAAM,MAAM,YAAY,IAAI,IAAI;AACjG,SAAO,OAAO;AACf;AAGA,IAAM,QAAQ,CAAC,MAAe,KAAK,IAAI,CAAC,IAAI,QAAQ,IAAI,OAAO,EAAE,YAAY,EAAE,CAAC;AAczE,SAAS,UAAU,KAAa,KAAa,QAAQ,GAAG,WAA0B,MAAM,WAA0B,MAAiB;AAEzI,MAAI,aAAa,QAAQ,CAAC,OAAO,SAAS,QAAQ,EAAG,YAAW;AAChE,MAAI,aAAa,QAAQ,CAAC,OAAO,SAAS,QAAQ,EAAG,YAAW;AAChE,MAAI,KAAK,YAAY;AACrB,MAAI,KAAK,YAAY;AACrB,MAAI,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,OAAO,SAAS,EAAE,GAAG;AACjD,eAAW,WAAW;AACtB,SAAK;AACL,SAAK;AAAA,EACN;AACA,MAAI,KAAK,GAAI,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AAC/B,MAAI,OAAO,IAAI;AACd,UAAM,MAAM,OAAO,IAAI,IAAI,KAAK,IAAI,EAAE,IAAI;AAE1C,QAAI,aAAa,QAAQ,OAAO,EAAG,OAAM;AACzC,QAAI,aAAa,QAAQ,OAAO,GAAI,OAAM;AAAA,EAC3C;AAEA,QAAM,OAAO,KAAK;AAClB,QAAM,OAAO,OAAO,SAAS,IAAI,IAAI,SAAS,MAAM,KAAK,IAAI,SAAS,KAAK,IAAI,KAAK,GAAG,KAAK,IAAI;AAEhG,QAAM,WAAW,CAACC,IAAW,aAAsB,OAAO,SAASA,EAAC,IAAIA,KAAI;AAC5E,QAAM,UAAU,YAAY,SAAS,KAAK,KAAK,MAAM,KAAK,OAAO,IAAI,IAAI,MAAM,IAAI,GAAG,EAAE;AACxF,QAAM,UAAU,YAAY,SAAS,KAAK,KAAK,KAAK,KAAK,OAAO,IAAI,IAAI,MAAM,IAAI,GAAG,EAAE;AAGvF,QAAM,aAAa,KAAK,KAAK,UAAU,OAAO,IAAI;AAClD,QAAM,YAAY,KAAK,MAAM,UAAU,OAAO,IAAI;AAClD,QAAM,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,YAAY,UAAU,CAAC;AAC5D,QAAM,QAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC5B,UAAM,IAAI,MAAM,aAAa,KAAK,MAAM,IAAI;AAC5C,QAAI,OAAO,SAAS,CAAC,KAAK,MAAM,MAAM,MAAM,SAAS,CAAC,EAAG,OAAM,KAAK,CAAC;AAAA,EACtE;AACA,SAAO,EAAE,KAAK,SAAS,KAAK,SAAS,MAAM,MAAM;AAClD;AAGA,SAAS,KAAK,GAAW,MAAsB;AAC9C,QAAM,IAAI,MAAM,CAAC;AACjB,SAAO,KAAK,IAAI,IAAI,CAAC,KAAK,OAAO,OAAO,IAAI;AAC7C;AAGO,SAAS,aAAa,MAAsB;AAClD,MAAI,EAAE,OAAO,MAAM,CAAC,OAAO,SAAS,IAAI,EAAG,QAAO;AAClD,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC3B,UAAM,SAAS,OAAO,KAAK,IAAI,IAAI,CAAC;AACpC,QAAI,KAAK,IAAI,SAAS,KAAK,MAAM,MAAM,CAAC,IAAI,KAAM,QAAO;AAAA,EAC1D;AACA,SAAO;AACR;AAGA,SAAS,kBAAkB,OAAuB;AACjD,MAAI,EAAE,QAAQ,MAAM,SAAS,EAAG,QAAO;AACvC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,KAAK,CAAC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC;AACrE;AAEA,IAAM,UAAU;AAAA,EACf,EAAE,OAAO,MAAM,QAAQ,IAAI;AAAA,EAC3B,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,EAC1B,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,EAC1B,EAAE,OAAO,KAAK,QAAQ,IAAI;AAC3B;AAEA,SAAS,QAAQ,OAAe,UAA0B;AACzD,QAAM,QAAQ,KAAK,IAAI,KAAK,EAAE,QAAQ,QAAQ;AAC9C,QAAM,CAAC,KAAK,IAAI,IAAI,MAAM,MAAM,GAAG;AACnC,QAAM,aAAa,IAAI,QAAQ,yBAAyB,GAAG;AAC3D,SAAO,GAAG,QAAQ,KAAK,OAAO,KAAK,MAAM,IAAI,MAAM,EAAE,GAAG,UAAU,GAAG,OAAO,IAAI,IAAI,KAAK,EAAE;AAC5F;AAEA,IAAM,mBAA2C,EAAE,KAAK,KAAK,KAAK,UAAK,KAAK,QAAK,KAAK,QAAK,KAAK,QAAK,KAAK,UAAK,KAAK,MAAM,KAAK,KAAK;AAO7H,SAAS,kBAAkB,OAAkC,SAA4B,CAAC,GAAG,kBAAmC;AACtI,MAAI,UAAU,QAAQ,UAAU,UAAa,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AAC7E,QAAM,QAAQ,OAAO,SAAS;AAC9B,MAAI;AACJ,QAAM,cAAc,CAAC,MAAc;AAClC,QAAI,OAAO,aAAa,OAAW,QAAO,OAAO;AACjD,QAAI,qBAAqB,OAAW,QAAO;AAC3C,WAAO,OAAO,UAAU,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,kBAAkB,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;AAAA,EACnH;AACA,QAAM,OAAO,CAAC,MAAe,OAAO,aAAa,UAAa,qBAAqB,UAAa,EAAE,SAAS,GAAG,IAAI,EAAE,QAAQ,UAAU,EAAE,IAAI;AAC5I,MAAI,UAAU,WAAW;AACxB,UAAM,IAAI,QAAQ;AAClB,UAAM,IAAI,OAAO,aAAa,qBAAqB,SAAY,KAAK,IAAI,GAAG,mBAAmB,CAAC,IAAI,OAAO,UAAU,MAAM,CAAC,CAAC,IAAI,IAAI;AACpI,WAAO,GAAG,QAAQ,MAAM,CAAC,GAAG,CAAC,CAAC;AAAA,EAC/B,WAAW,UAAU,WAAW;AAC/B,UAAM,OAAO,QAAQ,KAAK,CAAC,MAAM,KAAK,IAAI,KAAK,KAAK,EAAE,KAAK;AAC3D,QAAI,MAAM;AACT,YAAM,IAAI,QAAQ,KAAK;AACvB,YAAM,IAAI,OAAO,aAAa,KAAK,IAAI,CAAC,KAAK,OAAO,OAAO,UAAU,MAAM,CAAC,CAAC,IAAI,IAAI;AACrF,aAAO,GAAG,KAAK,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM;AAAA,IAC5C,MAAO,QAAO,KAAK,QAAQ,OAAO,YAAY,KAAK,CAAC,CAAC;AAAA,EACtD,WAAW,UAAU,YAAY;AAChC,UAAM,QAAQ,OAAO,YAAY,OAAO,YAAY;AACpD,UAAM,SAAS,iBAAiB,IAAI,KAAK,GAAG,IAAI;AAChD,UAAM,IAAI,OAAO,aAAa,qBAAqB,SAAY,mBAAmB,OAAO,UAAU,KAAK,IAAI,IAAI;AAChH,UAAM,IAAI,QAAQ,KAAK,IAAI,KAAK,GAAG,CAAC;AACpC,WAAO,GAAG,QAAQ,IAAI,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC;AAAA,EAC5C,MAAO,QAAO,KAAK,QAAQ,OAAO,YAAY,KAAK,CAAC,CAAC;AACrD,SAAO,GAAG,OAAO,UAAU,EAAE,GAAG,IAAI,GAAG,OAAO,UAAU,EAAE;AAC3D;AAGO,SAAS,UAAU,OAAe,QAAmC,OAA0C;AACrH,QAAM,CAAC,IAAI,EAAE,IAAI;AACjB,QAAM,CAAC,IAAI,EAAE,IAAI;AACjB,MAAI,OAAO,GAAI,SAAQ,KAAK,MAAM;AAClC,SAAO,MAAO,QAAQ,OAAO,KAAK,OAAQ,KAAK;AAChD;;;AC9GO,IAAM,yBAA2C,CAACC,OAAM,MAAM,SAAS,QAAQA,MAAK,SAAS,QAAQ,UAAU,MAAM,MAAM;AAG3H,SAAS,mBAAmB,GAAsC,GAA+C;AACvH,MAAI,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,KAAM,QAAO;AAC1C,UAAQ,EAAE,MAAM;AAAA,IACf,KAAK;AACJ,aAAO,EAAE,SAAU,EAAe;AAAA,IACnC,KAAK;AACJ,aAAO,EAAE,aAAc,EAAe;AAAA,IACvC,KAAK;AACJ,aAAO,EAAE,aAAc,EAAe,YAAY,EAAE,UAAW,EAAe;AAAA,IAC/E,KAAK;AACJ,aAAO,EAAE,UAAW,EAAe;AAAA,IACpC;AACC,aAAO;AAAA,EACT;AACD;AAMO,SAAS,qBAAqB,MAAsB;AAC1D,MAAI,MAAuB;AAC3B,QAAM,MAAM,gCAAgC,KAAK,KAAK,KAAK,CAAC;AAC5D,MAAI,KAAK;AACR,UAAM,IAAI,IAAI,CAAC,EAAE,WAAW,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC;AAC9E,UAAM,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAAA,EAC3D,OAAO;AACN,UAAM,KAAK,mDAAmD,KAAK,KAAK,KAAK,CAAC;AAC9E,QAAI,GAAI,OAAM,GAAG,MAAM,GAAG,CAAC,EAAE,IAAI,MAAM;AAAA,EACxC;AACA,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,aAAa,QAAQ,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,KAAK;AACvE,SAAO,YAAY,MAAM,YAAY;AACtC;AAEA,IAAM,KAAK,CAAC,MAAc,KAAK,MAAM,IAAI,GAAG,IAAI;AAQhD,SAAS,UAAU,QAAc,OAA2B,KAAkC,YAAY,MAAc;AACvH,MAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,QAAM,KAAK,OAAO,IAAI,GAAG;AACzB,MAAI,IAAI,GAAG,YAAY,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/D,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,MAAI,UAAU,QAAQ;AACrB,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACvC,YAAM,OAAO,OAAO,IAAI,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,KAAK;AAC9C,YAAM,IAAI,IAAI,EAAE,GAAG,KAAK,GAAG,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC;AAC5C,YAAM,IAAI,IAAI,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC;AACxC,WAAK,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,IACtF;AACA,WAAO;AAAA,EACR;AACA,MAAI,UAAU,YAAY,OAAO,SAAS,GAAG;AAE5C,UAAM,IAAI,OAAO;AACjB,UAAM,KAAK,OAAO,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM,EAAE,IAAI,OAAO,CAAC,EAAE,CAAC;AAC1D,UAAM,QAAQ,OAAO,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,MAAO,GAAG,CAAC,MAAM,IAAI,KAAK,EAAE,IAAI,OAAO,CAAC,EAAE,KAAK,GAAG,CAAC,CAAE;AAC3F,UAAM,UAAU,OAAO,IAAI,CAAC,GAAG,MAAM;AACpC,UAAI,MAAM,EAAG,QAAO,MAAM,CAAC;AAC3B,UAAI,MAAM,IAAI,EAAG,QAAO,MAAM,IAAI,CAAC;AACnC,YAAM,IAAI,MAAM,IAAI,CAAC;AACrB,YAAM,IAAI,MAAM,CAAC;AACjB,UAAI,IAAI,KAAK,EAAG,QAAO;AACvB,YAAM,KAAK,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;AAC/B,YAAM,KAAK,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC;AAC/B,cAAQ,KAAK,OAAO,KAAK,IAAI,KAAK;AAAA,IACnC,CAAC;AACD,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC3B,YAAM,IAAI,GAAG,IAAI,CAAC,IAAI;AACtB,YAAM,KAAK,OAAO,IAAI,CAAC;AACvB,YAAM,KAAK,OAAO,CAAC;AACnB,YAAM,IAAI,IAAI,EAAE,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;AAC3D,YAAM,IAAI,IAAI,EAAE,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;AACvD,WAAK,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,IACtF;AACA,WAAO;AAAA,EACR;AACA,WAAS,IAAI,GAAG,IAAI,GAAG,QAAQ,IAAK,MAAK,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACzE,SAAO;AACR;AAEA,SAAS,QAAQ,IAAY,IAAY,OAAe,OAAe,OAAe,KAAqB;AAC1G,QAAM,OAAO,MAAM,SAAS,KAAK,KAAK,IAAI;AAC1C,MAAI,KAAM,OAAM,QAAQ,KAAK,KAAK,IAAI;AACtC,QAAM,IAAI,CAAC,GAAW,MAAc,GAAG,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;AAC3F,QAAM,QAAQ,MAAM,QAAQ,KAAK,KAAK,IAAI;AAC1C,MAAI,IAAI,IAAI,EAAE,OAAO,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,OAAO,GAAG,CAAC;AACnF,MAAI,QAAQ,EAAG,MAAK,IAAI,EAAE,OAAO,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,OAAO,KAAK,CAAC;AAAA,MAC1F,MAAK,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;AAC9B,SAAO;AACR;AAsBO,SAAS,YAAY,MAAiB,SAAyC;AACrF,QAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,KAAK;AACvC,QAAM,SAAS,KAAK,IAAI,GAAG,QAAQ,MAAM;AACzC,QAAM,QAAoB,EAAE,GAAG,qBAAqB,GAAG,QAAQ,MAAM;AACrE,QAAM,UAAU,QAAQ,eAAe;AACvC,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,KAAK,MAAM;AACjB,QAAM,QAAqB,CAAC;AAC5B,QAAM,aAAa,CAAC,WAA2B,mBAAmB,WAAW,MAAM;AACnF,QAAM,iBAAiB,CAAC,OAAe,WAAW,SAAS,YAAY,UAAU,aAAa;AAC9F,QAAM,MAAM;AAEZ,QAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,cAAc,MAAM,cAAc,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,MAAM,MAAM,YAAY,QAAQ,EAAE,MAAM,QAAQ,EAAE,CAAC;AAGhJ,MAAI,MAAM;AACV,QAAM,UAAU,CAAC,KAAa,QAC7B,MAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,MAAM,aAAa,GAAG,KAAK,MAAM,QAAQ,QAAQ,MAAM,WAAW,aAAa,GAAG,QAAQ,EAAE,CAAC;AAC9H,QAAM,YAAY,CAAC,MAA4B,OAAe,MAAc,QAAgB,SAAiB;AAC5G,UAAM,SAAyB,EAAE,KAAK;AACtC,UAAM,WAAW,WAAW,MAAM;AAClC,UAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,GAAG,KAAK,MAAM,OAAO,QAAQ,UAAU,UAAU,OAAO,MAAM,QAAQ,MAAM,QAAQ,SAAS,CAAC;AAC9J,QAAI,UAAU;AACb,YAAM,IAAI,QAAQ,OAAO,MAAM,MAAM;AACrC,cAAQ,GAAG,IAAI,cAAc,EAAE,GAAG,QAAQ,IAAI,IAAI,IAAI,GAAG,GAAG,MAAM,GAAG,OAAO,IAAI,GAAG,QAAQ,OAAO,OAAO,EAAE,CAAC;AAAA,IAC7G;AACA,WAAO,OAAO;AAAA,EACf;AACA,MAAI,KAAK,MAAO,WAAU,SAAS,KAAK,OAAO,MAAM,WAAW,KAAK,MAAM,IAAI;AAC/E,MAAI,KAAK,SAAU,WAAU,YAAY,KAAK,UAAU,KAAK,GAAG,KAAK,MAAM,SAAS;AACpF,MAAI,KAAK,SAAS,KAAK,SAAU,QAAO;AAExC,QAAM,YAAY,iBAAiB,KAAK,IAAI;AAC5C,QAAM,UAAU,KAAK,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM;AAGnD,QAAM,cAA4B,YAC/B,KAAK,OAAO,IAAI,CAAC,GAAG,OAAO;AAAA,IAC3B,OAAO,EAAE;AAAA,IACT,OAAO,iBAAiB,MAAM,CAAC;AAAA,IAC/B,QAAQ,EAAE,MAAM,UAAU,UAAU,EAAE,GAAG;AAAA,IACzC,OAAO,CAAC,CAAC,EAAE;AAAA,IACX,UAAU,eAAe,EAAE,EAAE;AAAA,IAC7B,OAAO,gBAAgB,MAAM,CAAC,MAAM,SAAS,SAAS;AAAA,EACvD,EAAE,IACD,KAAK,WAAW,IAAI,CAAC,GAAG,OAAO;AAAA,IAC/B,OAAO;AAAA,IACP,OAAO,gBAAgB,MAAM,CAAC;AAAA,IAC9B,QAAQ,EAAE,MAAM,YAAY,OAAO,EAAE;AAAA,IACrC,OAAO;AAAA,IACP,UAAU,WAAW,EAAE,MAAM,YAAY,OAAO,EAAE,CAAC;AAAA,IACnD,OAAO;AAAA,EACR,EAAE;AACJ,MAAI,OAAkB,EAAE,GAAG,KAAK,GAAG,KAAK,OAAO,QAAQ,MAAM,GAAG,QAAQ,SAAS,MAAM,IAAI;AAC3F,QAAM,aAAa,KAAK,OAAO,QAAQ,YAAY,SAAS,MAAM,CAAC,aAAa,KAAK,OAAO,SAAS,KAAK,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,MAAM;AAC1I,MAAI,WAAY,QAAO,aAAa,aAAa,KAAK,OAAO,UAAU,MAAM,OAAO,SAAS,OAAO,WAAW,EAAE,MAAM,SAAS,CAAC,CAAC;AAElI,QAAM,QAAQ,CAAC,YAAoB;AAClC,UAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,SAAS,MAAM,SAAS,GAAG,KAAK,IAAI,KAAK,QAAQ,GAAG,GAAG,KAAK,IAAI,KAAK,SAAS,GAAG,MAAM,SAAS,QAAQ,UAAU,UAAU,UAAU,MAAM,KAAK,GAAG,MAAM,MAAM,UAAU,CAAC;AAC3M,WAAO,EAAE,OAAO,QAAQ,MAAM,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,EAAE,GAAG,OAAO,SAAS,OAAO,MAAM;AAAA,EAC3G;AACA,QAAM,UAAU,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,CAAC,MAAM,MAAM,IAAI,CAAC;AACpE,MAAI,CAAC,KAAK,WAAW,UAAU,CAAC,QAAQ,UAAU,CAAC,QAAS,QAAO,MAAM,QAAQ,gBAAgB,SAAS;AAE1G,MAAI,CAAC,UAAW,QAAO,UAAU,MAAM,QAAQ,CAAC,GAAG,MAAM,OAAO,OAAO,WAAW,OAAO,MAAM;AAG/F,QAAM,aAAa,KAAK,gBAAgB;AACxC,QAAM,IAAI,KAAK,WAAW;AAC1B,QAAM,QAAQ,IAAI,IAA6B,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,gBAAgB,MAAM,CAAC,CAAC,CAAC,CAAC;AACnG,QAAM,UAAU,KAAK,aAAa;AAClC,QAAM,UAAU,KAAK,aAAa;AAGlC,QAAM,SAAS,oBAAI,IAAmB;AACtC,MAAI,SAAS;AACZ,eAAW,QAAQ,CAAC,OAAO,MAAM,GAAY;AAC5C,YAAM,QAAQ,QAAQ,OAAO,CAAC,MAAM,MAAM,IAAI,EAAE,EAAE,MAAM,IAAI;AAC5D,UAAI,CAAC,MAAM,OAAQ;AACnB,YAAM,SAAS,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,KAAK,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC5G,YAAM,MAAM,MAAM,CAAC,EAAE,KAAK,CAAC;AAC3B,YAAM,MAAM,MAAM,CAAC,EAAE,KAAK,CAAC;AAC3B,iBAAW,KAAK,OAAO;AACtB,cAAM,WAAW,EAAE,OAAO,IAAI,CAAC,KAAK,MAAM;AACzC,cAAI,QAAQ,QAAQ,SAAS,MAAO,QAAO;AAC3C,cAAI,IAAI,OAAO;AACf,cAAI,QAAS,KAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI;AAC7C,gBAAM,OAAO,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;AACpC,gBAAM,MAAwB,CAAC,MAAM,OAAO,CAAC;AAC7C,cAAI,KAAK,EAAG,KAAI,CAAC,KAAK;AAAA,cACjB,KAAI,CAAC,KAAK;AACf,iBAAO;AAAA,QACR,CAAC;AACD,eAAO,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC;AAAA,MAC9B;AAAA,IACD;AAAA,EACD;AAEA,MAAI,KAAK;AACT,MAAI,KAAK;AACT,QAAM,MAAM,CAAC,MAAc;AAC1B,SAAK,KAAK,IAAI,IAAI,CAAC;AACnB,SAAK,KAAK,IAAI,IAAI,CAAC;AAAA,EACpB;AACA,aAAW,KAAK,SAAS;AACxB,UAAM,QAAQ,OAAO,IAAI,EAAE,EAAE;AAC7B,QAAI,MAAO,OAAM,SAAS,QAAQ,CAAC,QAAQ,QAAQ,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE;AAAA,QACvE,GAAE,OAAO,QAAQ,CAAC,MAAM,MAAM,QAAQ,IAAI,CAAC,CAAC;AAAA,EAClD;AACA,MAAI,CAAC,OAAO,SAAS,EAAE,GAAG;AACzB,SAAK;AACL,SAAK;AAAA,EACN;AACA,MAAI,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,MAAM,SAAS,MAAM,MAAM,GAAG;AACjE,SAAK,KAAK,IAAI,IAAI,CAAC;AACnB,SAAK,KAAK,IAAI,IAAI,CAAC;AAAA,EACpB;AACA,QAAM,cAAiC,WAAW,CAAC,KAAK,MAAM,OAAO,QAAQ,EAAE,GAAG,KAAK,MAAM,QAAQ,OAAO,UAAU,IAAI,KAAK,MAAM;AAGrI,QAAM,QAAQ,KAAK;AACnB,QAAM,QAAQ,KAAK;AACnB,QAAM,YAAY,KAAK,MAAM;AAC7B,QAAM,SAAS,QAAQ;AACvB,QAAM,WAAW,UAAU,OAAO,SAAS,OAAO,GAAG,IAAI,OAAO,MAAM,MAAM;AAC5E,QAAM,WAAW,UAAU,OAAO,SAAS,OAAO,GAAG,IAAI,OAAO,MAAM,MAAM;AAC5E,QAAM,YAAY,aAAa,KAAK,QAAQ,KAAK;AACjD,MAAI,QAAQ,UAAU,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,YAAY,EAAE,CAAC,CAAC,GAAG,UAAU,QAAQ;AACvG,QAAM,WAAW,CAAC,MAAc,kBAAkB,GAAG,aAAa,YAAY,YAAY,aAAa,MAAM,IAAI,CAAC;AAClH,QAAM,kBAAkB,KAAK,IAAI,GAAG,GAAG,MAAM,MAAM,IAAI,CAAC,MAAM,QAAQ,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;AACvF,QAAM,gBAAgB,KAAK,IAAI,GAAG,GAAG,KAAK,WAAW,IAAI,CAAC,MAAM,QAAQ,GAAG,EAAE,CAAC,CAAC;AAE/E,MAAI;AACJ,MAAI;AACJ,MAAI,SAAS;AACb,MAAI,YAAY;AACf,YAAQ,MAAM,OAAO,KAAK,IAAI,eAAe,KAAK,QAAQ,IAAI,IAAI,IAAI,MAAM,MAAM,QAAQ,YAAY;AACtG,cAAU,MAAM,OAAO,KAAK,MAAM,MAAM,MAAM,QAAQ,YAAY;AAAA,EACnE,OAAO;AACN,YAAQ,MAAM,OAAO,kBAAkB,IAAI,MAAM,MAAM,QAAQ,YAAY;AAC3E,UAAMC,SAAQ,KAAK,QAAQ,OAAO,KAAK;AACvC,QAAI,MAAM,QAAQ,gBAAgBA,QAAO,KAAM,UAAS;AACxD,UAAM,YAAY,SAAS,KAAK,IAAI,gBAAgB,KAAK,IAAI,KAAK,KAAK,GAAG,IAAI,IAAI,KAAK,SAAS,GAAG,IAAI,KAAK;AAC5G,cAAU,MAAM,OAAO,YAAY,MAAM,MAAM,QAAQ,YAAY;AAAA,EACpE;AACA,QAAM,WAAW,aAAa,KAAK,IAAI,GAAG,kBAAkB,CAAC,IAAI;AACjE,QAAM,OAAkB;AAAA,IACvB,GAAG,KAAK,IAAI;AAAA,IACZ,GAAG,KAAK,KAAK,aAAa,IAAI,KAAK,IAAI;AAAA,IACvC,OAAO,KAAK,IAAI,GAAG,KAAK,QAAQ,OAAO,QAAQ;AAAA,IAC/C,QAAQ,KAAK,IAAI,GAAG,KAAK,SAAS,UAAU,aAAa,IAAI,KAAK,IAAI,EAAE;AAAA,EACzE;AACA,UAAQ,UAAU,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,OAAO,aAAa,KAAK,QAAQ,KAAK,UAAU,EAAE,CAAC,CAAC,GAAG,UAAU,QAAQ;AAEjI,QAAM,SAA2B,CAAC,MAAM,KAAK,MAAM,GAAG;AACtD,QAAM,aAA+B,aAAa,CAAC,KAAK,GAAG,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,KAAK,QAAQ,KAAK,CAAC;AAC/G,QAAM,UAAU,CAAC,MAAc,UAAU,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,CAAC,CAAC,GAAG,QAAQ,UAAU;AACxG,QAAM,WAAW,aAAa,KAAK,IAAI,KAAK;AAC5C,QAAM,SAAS,aAAa,KAAK,SAAS,KAAK;AAC/C,QAAM,OAAO,SAAS;AACtB,QAAM,YAAY,CAAC,MAAc,WAAW,QAAQ,IAAI;AACxD,QAAM,MAAM,CAAC,MAA6B,aAAa,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;AAC7E,QAAM,OAAO,QAAQ,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,CAAC,CAAC,CAAC;AAGhE,QAAM,eAAe,CAAC,SAAoB,WAAW,EAAE,MAAM,QAAQ,KAAK,CAAC;AAC3E,MAAI,MAAM,WAAW;AACpB,UAAM,MAAM,QAAQ,CAAC,GAAG,MAAM;AAC7B,YAAM,IAAI,QAAQ,CAAC;AACnB,YAAM,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,GAAG,UAAU,GAAG,EAAE,CAAC;AAC1C,YAAM,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,GAAG,WAAW,QAAQ,GAAG,EAAE,CAAC;AACnD,YAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,UAAU,CAAC,IAAI,MAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,QAAQ,MAAM,MAAM,aAAa,EAAE,CAAC;AAAA,IAClH,CAAC;AAAA,EACF;AACA,MAAI,MAAM,WAAW;AACpB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC3B,YAAM,IAAI,WAAW,OAAO;AAC5B,YAAM,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,GAAG,GAAG,WAAW,CAAC,EAAE,CAAC;AAC5C,YAAM,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,GAAG,GAAG,WAAW,CAAC,EAAE,CAAC;AAC5C,YAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,UAAU,CAAC,IAAI,MAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,QAAQ,MAAM,MAAM,aAAa,EAAE,CAAC;AAAA,IAClH;AAAA,EACD;AAEA,QAAM,UAA0B,EAAE,MAAM,QAAQ,MAAM,IAAI;AAC1D,QAAM,UAA0B,EAAE,MAAM,QAAQ,MAAM,IAAI;AAC1D,MAAI,MAAM,MAAM;AACf,UAAM,MAAM,QAAQ,CAAC,GAAG,MAAM;AAC7B,YAAM,IAAI,QAAQ,CAAC;AACnB,YAAM,QAAQ,SAAS,CAAC;AACxB,UAAI;AACH,cAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,UAAU,CAAC,IAAI,MAAM,cAAc,GAAG,GAAG,GAAG,KAAK,IAAI,KAAK,SAAS,GAAG,MAAM,OAAO,QAAQ,UAAU,UAAU,OAAO,MAAM,IAAI,MAAM,MAAM,WAAW,QAAQ,QAAQ,CAAC;AAAA,UACpM,OAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,UAAU,CAAC,IAAI,MAAM,cAAc,GAAG,KAAK,IAAI,GAAG,GAAG,GAAG,MAAM,OAAO,QAAQ,OAAO,UAAU,UAAU,MAAM,IAAI,MAAM,MAAM,WAAW,QAAQ,QAAQ,CAAC;AAAA,IAChM,CAAC;AAAA,EACF;AACA,MAAI,MAAM,MAAM;AACf,UAAM,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,GAAG,UAAU,GAAG,KAAK,CAAC;AAC7C,UAAM,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,GAAG,WAAW,QAAQ,GAAG,KAAK,CAAC;AACtD,UAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,UAAU,MAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,QAAQ,MAAM,MAAM,aAAa,GAAG,QAAQ,QAAQ,CAAC;AAC7H,UAAM,QAAQ,aAAa,KAAK,IAAI,GAAG,KAAK,KAAM,KAAK,MAAO,IAAI,CAAC,IAAI,SAAS,KAAK,IAAI,GAAG,KAAK,KAAM,KAAK,MAAO,IAAI,CAAC,IAAI;AAC5H,SAAK,WAAW,QAAQ,CAAC,GAAG,MAAM;AACjC,UAAI,IAAI,MAAO;AACf,YAAM,SAAyB,EAAE,MAAM,YAAY,OAAO,EAAE;AAC5D,YAAM,WAAW,WAAW,MAAM;AAClC,YAAM,OAAO,WAAW,MAAM,YAAY,MAAM;AAChD,UAAI,YAAY;AACf,cAAM,OAAO,QAAQ,MAAM,QAAQ,YAAY,KAAK;AACpD,cAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,UAAU,CAAC,IAAI,MAAM,cAAc,GAAG,KAAK,IAAI,GAAG,GAAG,UAAU,CAAC,GAAG,MAAM,SAAS,GAAG,MAAM,IAAI,OAAO,GAAG,QAAQ,OAAO,UAAU,UAAU,MAAM,IAAI,MAAM,QAAQ,SAAS,CAAC;AAAA,MAC/M,WAAW;AACV,cAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,UAAU,CAAC,IAAI,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,GAAG,KAAK,IAAI,KAAK,SAAS,GAAG,MAAM,GAAG,QAAQ,OAAO,UAAU,UAAU,MAAM,IAAI,MAAM,QAAQ,QAAQ,SAAS,CAAC;AAAA,UACnM,OAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,UAAU,CAAC,IAAI,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,GAAG,KAAK,IAAI,KAAK,SAAS,GAAG,MAAM,GAAG,QAAQ,UAAU,UAAU,OAAO,MAAM,IAAI,MAAM,QAAQ,SAAS,CAAC;AAAA,IACrM,CAAC;AAAA,EACF;AAEA,QAAM,cAAc,aAAa,MAAM,QAAQ,MAAM;AACrD,QAAM,YAAY,aAAa,MAAM,QAAQ,MAAM;AACnD,MAAI;AACH,UAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,cAAc,aAAa,MAAM,GAAG,IAAI,MAAM,cAAc,GAAG,KAAK,IAAI,KAAK,QAAQ,GAAG,GAAG,KAAK,IAAI,KAAK,QAAQ,MAAM,aAAa,QAAQ,UAAU,UAAU,UAAU,MAAM,KAAK,GAAG,QAAQ,KAAK,MAAM,MAAM,MAAM,QAAQ,aAAa,UAAU,QAAQ,CAAC;AAChS,MAAI;AACH,UAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,cAAc,aAAa,MAAM,GAAG,IAAI,MAAM,cAAc,GAAG,KAAK,GAAG,GAAG,KAAK,IAAI,KAAK,SAAS,GAAG,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO,MAAM,KAAK,GAAG,QAAQ,KAAK,MAAM,MAAM,MAAM,QAAQ,KAAK,QAAQ,aAAa,UAAU,QAAQ,CAAC;AAE3R,aAAW,QAAQ,CAAC,KAAK,GAAG,GAAY;AACvC,QAAI,CAAC,aAAa,IAAI,EAAG;AACzB,UAAM,SAAU,SAAS,QAAS;AAClC,UAAM,MAAiB,SACpB,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,IAAI,KAAK,GAAG,OAAO,OAAO,GAAG,QAAQ,KAAK,SAAS,GAAG,IAC3E,EAAE,GAAG,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,KAAK,SAAS,GAAG,OAAO,KAAK,QAAQ,GAAG,QAAQ,KAAK,IAAI,KAAK,SAAS,KAAK,IAAI,KAAK,SAAS,EAAE;AAChI,YAAQ,QAAQ,IAAI,cAAc,GAAG;AAAA,EACtC;AAGA,QAAM,OAAO,QAAQ,OAAO,CAAC,MAAM,MAAM,IAAI,EAAE,EAAE,MAAM,KAAK;AAC5D,QAAM,QAAQ,UAAU,IAAI,KAAK;AACjC,QAAM,aAAa,QAAQ,KAAK,SAAS,OAAO;AAChD,QAAM,WAAW,QAAQ,aAAa,QAAQ;AAC9C,QAAM,aAA0B,CAAC;AACjC,QAAM,WAAW,YAAY,YAAY;AACzC,QAAM,YAAY,CAAC,MAAc,kBAAkB,GAAG,aAAa,QAAQ;AAE3E,QAAM,YAAY,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,MAAM,MAAM,IAAI,EAAE,EAAE,CAAE,IAAI,MAAM,MAAM,IAAI,EAAE,EAAE,CAAE,CAAC;AAC/F,aAAW,KAAK,WAAW;AAC1B,UAAM,KAAK,KAAK,OAAO,QAAQ,CAAC;AAChC,UAAM,QAAQ,iBAAiB,MAAM,EAAE;AACvC,UAAM,OAAO,MAAM,IAAI,EAAE,EAAE;AAC3B,UAAM,QAAQ,OAAO,IAAI,EAAE,EAAE;AAC7B,UAAM,YAAY,eAAe,EAAE,EAAE;AACrC,UAAM,eAA+B,EAAE,MAAM,UAAU,UAAU,EAAE,GAAG;AAEtE,QAAI,SAAS,OAAO;AACnB,YAAM,OAAO,UAAU,IAAI,KAAK,QAAQ,CAAC;AACzC,QAAE,OAAO,QAAQ,CAAC,KAAK,MAAM;AAC5B,cAAM,MAAM,QAAQ,MAAM,SAAS,CAAC,IAAI,QAAQ,OAAO,OAAQ,CAAC,GAAG,GAAG;AACtE,YAAI,CAAC,OAAO,QAAQ,KAAM;AAC1B,cAAM,IAAI,QAAQ,IAAI,CAAC,CAAC;AACxB,cAAM,IAAI,QAAQ,IAAI,CAAC,CAAC;AACxB,cAAM,KAAK,UAAU,CAAC,IAAI,aAAa,IAAI,OAAO,WAAW,WAAW;AACxE,cAAM,KAAK,WAAW;AACtB,cAAM,SAAyB,EAAE,MAAM,SAAS,UAAU,EAAE,IAAI,OAAO,EAAE;AACzE,cAAM,WAAW,WAAW,MAAM;AAClC,cAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,EAAE,CAAC;AAC/C,cAAM,OAAO,aAAa,EAAE,GAAG,KAAK,IAAI,GAAG,CAAC,GAAG,GAAG,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,GAAG,QAAQ,GAAG,IAAI,EAAE,GAAG,GAAG,OAAO,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,EAAE;AACxI,cAAM,KAAK;AAAA,UACV,MAAM;AAAA,UACN,KAAK,OAAO,EAAE,EAAE,IAAI,CAAC;AAAA,UACrB,MAAM;AAAA,UACN,GAAG;AAAA,UACH,MAAM;AAAA,UACN,QAAQ,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,UAC1B;AAAA,UACA,UAAU,YAAY;AAAA,UACtB,GAAI,YAAY,EAAE,QAAQ,MAAM,WAAW,aAAa,IAAI,IAAI,CAAC;AAAA,QAClE,CAAC;AACD,YAAI,SAAU,SAAQ,OAAO,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,GAAG,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,GAAG,OAAO,KAAK,QAAQ,GAAG,QAAQ,KAAK,SAAS,EAAE,CAAC;AACpI,YAAI,KAAK,YAAY;AACpB,gBAAM,IAAI,UAAU,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;AACtC,gBAAMD,QAAO,UAAU,CAAC;AAExB,cAAI,WAAW,KAAK,IAAI,IAAI,CAAC,KAAK,aAAa,QAAQA,OAAM,KAAK,CAAC,IAAI,IAAI,KAAK,GAAI;AACpF,gBAAM,MAAM,QAAQ,IAAI,CAAC,CAAC;AAC1B,gBAAM,WAAW,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,OAAO,aAAa,IAAI;AAChE,gBAAM,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,GAAG,KAAK,KAAK,GAAG,GAAG,WAAW,IAAI,KAAK,IAAI,MAAM,UAAU,EAAE,CAAC;AACrF,qBAAW,KAAK;AAAA,YACf,MAAM;AAAA,YACN,KAAK,SAAS,EAAE,EAAE,IAAI,CAAC;AAAA,YACvB,MAAM;AAAA,YACN,GAAG;AAAA,YACH,GAAG;AAAA,YACH,MAAAA;AAAA,YACA,QAAQ,cAAc,CAAC,UAAW,UAAU,IAAI,UAAU,QAAS;AAAA,YACnE,UAAU,cAAc,UAAU,WAAW,UAAU,IAAI,WAAW;AAAA,YACtE,MAAM,KAAK;AAAA,YACX,MAAM,UAAU,qBAAqB,KAAK,IAAI,MAAM;AAAA,YACpD;AAAA,UACD,CAAC;AAAA,QACF;AAAA,MACD,CAAC;AACD;AAAA,IACD;AAGA,UAAM,aAAa,CAAC,MAA8B,QAAS,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,OAAQ,EAAE,OAAO,CAAC;AACvG,UAAM,OAAe,CAAC;AACtB,QAAI,MAAY,CAAC;AACjB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC3B,YAAM,IAAI,WAAW,CAAC;AACtB,UAAI,MAAM,MAAM;AACf,YAAI,IAAI,OAAQ,MAAK,KAAK,GAAG;AAC7B,cAAM,CAAC;AACP;AAAA,MACD;AACA,UAAI,KAAK,EAAE,GAAG,UAAU,CAAC,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC;AAAA,IAC5C;AACA,QAAI,IAAI,OAAQ,MAAK,KAAK,GAAG;AAE7B,QAAI,SAAS,QAAQ;AAEpB,YAAM,QAAQ,KAAK,IAAI,CAAC,MAAM;AAC7B,cAAM,WAAW,QACd,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,QAAQ,MAAM,SAAS,KAAK,OAAO,EAAE,IAAI,YAAY,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,IACpH;AAAA,UACA,EAAE,GAAG,EAAE,EAAE,SAAS,CAAC,EAAE,GAAG,GAAG,KAAK;AAAA,UAChC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,KAAK;AAAA,QACtB;AACF,eAAO,GAAG,UAAU,GAAG,KAAK,OAAO,GAAG,CAAC,GAAG,QAAQ,UAAU,UAAU,KAAK,OAAO,KAAK,KAAK,IAAI,SAAS,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;AAAA,MAC7J,CAAC;AACD,YAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,QAAQ,EAAE,EAAE,IAAI,MAAM,QAAQ,GAAG,MAAM,KAAK,EAAE,GAAG,MAAM,OAAO,SAAS,MAAM,QAAQ,cAAc,UAAU,UAAU,CAAC;AAAA,IACzJ;AACA,QAAI,SAAS,UAAU,SAAS,QAAQ;AACvC,YAAM,KAAK;AAAA,QACV,MAAM;AAAA,QACN,KAAK,QAAQ,EAAE,EAAE;AAAA,QACjB,MAAM;AAAA,QACN,GAAG,KAAK,IAAI,CAAC,MAAM,UAAU,GAAG,KAAK,OAAO,GAAG,CAAC,EAAE,KAAK,EAAE;AAAA,QACzD,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,aAAa,YAAY,MAAM;AAAA,QAC/B,QAAQ;AAAA,QACR,UAAU;AAAA,MACX,CAAC;AAAA,IACF;AACA,UAAM,WAAW,SAAS,aAAa,KAAK;AAC5C,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC3B,YAAM,IAAI,WAAW,CAAC;AACtB,UAAI,MAAM,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAM;AACxC,YAAM,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,GAAG,UAAU,CAAC,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC;AACvD,YAAM,SAAyB,EAAE,MAAM,SAAS,UAAU,EAAE,IAAI,OAAO,EAAE;AACzE,YAAM,WAAW,WAAW,MAAM;AAClC,YAAM,IAAI,SAAS,YAAY,MAAM;AAErC,YAAM,KAAK;AAAA,QACV,MAAM;AAAA,QACN,KAAK,SAAS,EAAE,EAAE,IAAI,CAAC;AAAA,QACvB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,GAAG,WAAW,IAAI;AAAA,QAClB,MAAM,WAAY,SAAS,YAAY,QAAQ,MAAM,UAAW;AAAA,QAChE,GAAI,WAAW,EAAE,QAAQ,OAAO,aAAa,EAAE,IAAI,CAAC;AAAA,QACpD,SAAS,SAAS,YAAY,OAAO;AAAA,QACrC;AAAA,QACA,UAAU,YAAY;AAAA,MACvB,CAAC;AACD,UAAI,SAAU,OAAM,KAAK,EAAE,MAAM,UAAU,KAAK,SAAS,EAAE,EAAE,IAAI,CAAC,cAAc,MAAM,aAAa,IAAI,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,QAAQ,MAAM,WAAW,aAAa,IAAI,CAAC;AAChL,UAAI,KAAK,YAAY;AACpB,cAAM,MAAM,EAAE,OAAO,CAAC;AACtB,cAAM,QAAQ,WAAW,QAAQ,MAAM,SAAS,CAAC,EAAG,CAAC,IAAI,MAAM,SAAS,CAAC,EAAG,CAAC,IAAI;AACjF,mBAAW,KAAK;AAAA,UACf,MAAM;AAAA,UACN,KAAK,SAAS,EAAE,EAAE,IAAI,CAAC;AAAA,UACvB,MAAM;AAAA,UACN,GAAG,aAAa,KAAK,IAAI;AAAA,UACzB,GAAG,aAAa,KAAK,KAAK;AAAA,UAC1B,MAAM,UAAU,KAAK;AAAA,UACrB,QAAQ,aAAa,UAAU;AAAA,UAC/B,UAAU,aAAa,WAAW;AAAA,UAClC,MAAM,KAAK;AAAA,UACX,MAAM,MAAM;AAAA,UACZ;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD;AAAA,EACD;AACA,QAAM,KAAK,GAAG,UAAU;AAExB,QAAM,aAA8B,EAAE,MAAM,aAAa,MAAM,KAAK,QAAQ,OAAO,YAAY,OAAO,MAAM,MAAM;AAClH,SAAO,EAAE,OAAO,QAAQ,MAAM,OAAO,YAAY,SAAS,MAAM;AACjE;AAEA,IAAM,QAAQ,CAAC,MAAwB,MAAM,SAAS,IAAI,MAAM,QAAQ,IAAI,MAAM,SAAS,IAAI;AAE/F,SAAS,SAASA,OAAc,UAAkB,MAAc,SAAmC;AAClG,MAAI,QAAQA,OAAM,IAAI,KAAK,SAAU,QAAOA;AAC5C,MAAI,MAAMA;AACV,SAAO,IAAI,SAAS,KAAK,QAAQ,GAAG,GAAG,UAAK,IAAI,IAAI,SAAU,OAAM,IAAI,MAAM,GAAG,EAAE;AACnF,SAAO,GAAG,GAAG;AACd;AAEA,SAAS,aACR,OACA,UACA,MACA,OACA,SACA,OACA,gBACY;AACZ,QAAM,KAAK,MAAM;AACjB,QAAM,SAAS;AACf,QAAM,OAAO,KAAK;AAClB,QAAM,QAAQ,CAAC,SAAqB,SAAS,IAAI,QAAQ,KAAK,OAAO,EAAE,IAAI;AAC3E,QAAM,SAAuD,CAAC;AAC9D,MAAI;AACJ,MAAI;AACJ,MAAI,aAAa,UAAU,aAAa,SAAS;AAChD,UAAM,IAAI,KAAK,IAAI,KAAK,QAAQ,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,KAAK,CAAC,CAAC;AACnE,UAAM,IAAI,KAAK,IAAI,MAAM,SAAS,MAAM,KAAK,MAAM;AACnD,UAAM,IAAI,aAAa,SAAS,KAAK,IAAI,KAAK,IAAI,KAAK,QAAQ;AAC/D,UAAM,IAAI,KAAK,KAAK,KAAK,SAAS,KAAK;AACvC,UAAM,QAAQ,CAAC,MAAM,MAAM;AAC1B,WAAK,IAAI,KAAK,QAAQ,KAAK,SAAS,IAAK,QAAO,KAAK,EAAE,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,OAAO,EAAE,CAAC;AAAA,IAC7F,CAAC;AACD,UAAM,EAAE,GAAG,GAAG,OAAO,GAAG,QAAQ,EAAE;AAClC,WAAO,aAAa,SAAS,EAAE,GAAG,MAAM,GAAG,KAAK,IAAI,IAAI,GAAG,OAAO,KAAK,QAAQ,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,KAAK,QAAQ,IAAI,EAAE;AAAA,EAC/H,OAAO;AAEN,UAAM,OAAuB,CAAC,CAAC,CAAC;AAChC,QAAI,OAAO;AACX,eAAW,QAAQ,OAAO;AACzB,YAAM,IAAI,MAAM,IAAI;AACpB,UAAI,OAAO,IAAI,KAAK,SAAS,KAAK,KAAK,SAAS,CAAC,EAAE,QAAQ;AAC1D,aAAK,KAAK,CAAC,CAAC;AACZ,eAAO;AAAA,MACR;AACA,WAAK,KAAK,SAAS,CAAC,EAAE,KAAK,IAAI;AAC/B,cAAQ;AAAA,IACT;AACA,UAAM,QAAQ,KAAK,MAAM,GAAG,CAAC;AAC7B,UAAM,IAAI,MAAM,SAAS;AACzB,UAAM,KAAK,aAAa,QAAQ,KAAK,IAAI,KAAK,IAAI,KAAK,SAAS;AAChE,UAAM,QAAQ,CAAC,KAAK,MAAM;AACzB,YAAM,QAAQ,IAAI,OAAO,CAAC,GAAG,SAAS,IAAI,MAAM,IAAI,GAAG,CAAC,IAAI;AAC5D,UAAI,IAAI,KAAK,KAAK,KAAK,QAAQ,SAAS;AACxC,iBAAW,QAAQ,KAAK;AACvB,eAAO,KAAK,EAAE,MAAM,GAAG,GAAG,KAAK,IAAI,OAAO,OAAO,EAAE,CAAC;AACpD,aAAK,MAAM,IAAI;AAAA,MAChB;AAAA,IACD,CAAC;AACD,UAAM,EAAE,GAAG,KAAK,GAAG,GAAG,IAAI,OAAO,KAAK,OAAO,QAAQ,EAAE;AACvD,WAAO,aAAa,QAAQ,EAAE,GAAG,MAAM,GAAG,KAAK,IAAI,IAAI,GAAG,QAAQ,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,KAAK,SAAS,IAAI,EAAE;AAAA,EAClI;AACA,SAAO,QAAQ,CAAC,EAAE,MAAM,GAAG,EAAE,GAAG,MAAM;AACrC,UAAM,UAAU,KAAK,QAAQ,MAAM;AACnC,QAAI,KAAK,UAAU;AAClB,YAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,iBAAiB,CAAC,IAAI,MAAM,iBAAiB,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,QAAQ,IAAI,GAAG,QAAQ,KAAK,OAAO,aAAa,KAAK,SAAS,QAAQ,KAAK,QAAQ,UAAU,KAAK,SAAS,CAAC;AAAA;AAE/M,YAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,iBAAiB,CAAC,IAAI,MAAM,iBAAiB,GAAG,GAAG,IAAI,SAAS,GAAG,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,GAAG,MAAM,KAAK,OAAO,SAAS,QAAQ,KAAK,QAAQ,UAAU,KAAK,SAAS,CAAC;AACvN,UAAM,KAAK;AAAA,MACV,MAAM;AAAA,MACN,KAAK,gBAAgB,CAAC;AAAA,MACtB,MAAM;AAAA,MACN,GAAG,IAAI,SAAS;AAAA,MAChB;AAAA,MACA,MAAM,KAAK;AAAA,MACX,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM;AAAA,MACN,MAAM,KAAK,WAAW,MAAM,YAAY,MAAM;AAAA,MAC9C,QAAQ,KAAK,WAAW,MAAM;AAAA,MAC9B;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK;AAAA,IAChB,CAAC;AAAA,EACF,CAAC;AACD,MAAI,eAAgB,OAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,oBAAoB,MAAM,aAAa,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,OAAO,IAAI,QAAQ,GAAG,QAAQ,IAAI,SAAS,GAAG,MAAM,QAAQ,QAAQ,MAAM,WAAW,aAAa,GAAG,QAAQ,EAAE,CAAC;AACvO,SAAO;AACR;AAEA,SAAS,UACR,MACA,QACA,MACA,OACA,OACA,WACA,OACA,QACa;AACb,QAAM,KAAK,MAAM;AACjB,QAAM,SAAS,KAAK,WAAW,IAAI,CAAC,GAAG,MAAM,KAAK,IAAI,GAAG,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;AAC/E,QAAM,QAAQ,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAC9C,QAAM,YAAY,KAAK,aAAa,KAAK,MAAM;AAC/C,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,OAAO,KAAK,MAAM,IAAI,IAAI,SAAS;AAC3E,QAAM,QAAQ,KAAK,SAAS,UAAU,QAAQ,KAAK,cAAc;AACjE,QAAM,KAAK,KAAK,IAAI,KAAK,QAAQ;AACjC,QAAM,KAAK,KAAK,IAAI,KAAK,SAAS;AAClC,QAAM,OAAO,EAAE,GAAG,KAAK,OAAO,GAAG,KAAK,OAAO,OAAO,QAAQ,GAAG,QAAQ,QAAQ,EAAE;AACjF,MAAI,SAAS,GAAG;AACf,UAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,SAAS,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,MAAM,sBAAsB,QAAQ,UAAU,UAAU,UAAU,MAAM,KAAK,GAAG,MAAM,MAAM,UAAU,CAAC;AAC7K,WAAO,EAAE,OAAO,QAAQ,MAAM,OAAO,SAAS,OAAO,MAAM;AAAA,EAC5D;AACA,MAAI,QAAQ;AACZ,QAAM,SAAS,KAAK,MAAM;AAC1B,SAAO,QAAQ,CAAC,GAAG,MAAM;AACxB,QAAI,KAAK,EAAG;AACZ,UAAM,QAAS,IAAI,QAAS,KAAK,KAAK;AACtC,UAAM,QAAQ;AACd,UAAM,MAAM,QAAQ;AACpB,YAAQ;AACR,UAAM,SAAyB,EAAE,MAAM,SAAS,UAAU,OAAO,IAAI,OAAO,EAAE;AAC9E,UAAM,WAAW,mBAAmB,WAAW,MAAM,KAAK,mBAAmB,WAAW,EAAE,MAAM,YAAY,OAAO,EAAE,CAAC;AACtH,UAAM,YAAY,WAAW,SAAS,YAAY,UAAU,aAAa,OAAO;AAEhF,UAAM,OAAO,QAAQ,OAAO;AAC5B,UAAM,MAAM,WAAW,IAAI;AAC3B,UAAM,KAAK,KAAK,MAAM,KAAK,IAAI,GAAG;AAClC,UAAM,KAAK,KAAK,MAAM,KAAK,IAAI,GAAG;AAClC,UAAM,KAAK;AAAA,MACV,MAAM;AAAA,MACN,KAAK,SAAS,CAAC;AAAA,MACf,MAAM;AAAA,MACN,GAAG,QAAQ,IAAI,IAAI,OAAO,OAAO,OAAO,GAAG;AAAA,MAC3C,MAAM,gBAAgB,MAAM,CAAC;AAAA,MAC7B,QAAQ,YAAY,YAAY,MAAM,YAAY,MAAM;AAAA,MACxD,aAAa,YAAY,YAAY,IAAI;AAAA,MACzC;AAAA,MACA,UAAU,YAAY;AAAA,IACvB,CAAC;AACD,QAAI,KAAK,cAAc,QAAQ,MAAM;AACpC,YAAM,QAAQ,IAAI;AAClB,YAAMA,QAAO,OAAO,QAAQ,kBAAkB,GAAG,MAAM,IAAI,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC;AACrF,YAAM,KAAK,QAAQ,KAAK;AACxB,YAAM,KAAK,KAAK,KAAK,KAAK,IAAI,GAAG;AACjC,YAAM,KAAK,KAAK,KAAK,KAAK,IAAI,GAAG;AACjC,YAAM,SAAS,KAAK,IAAI,KAAK,IAAI,GAAG,CAAC,IAAI,MAAM,WAAW,KAAK,IAAI,GAAG,IAAI,IAAI,UAAU;AACxF,YAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,eAAe,CAAC,IAAI,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,MAAAA,OAAM,QAAQ,UAAU,UAAU,MAAM,IAAI,MAAM,MAAM,MAAM,OAAO,CAAC;AAAA,IAC7J;AAAA,EACD,CAAC;AACD,MAAI,KAAK,SAAS,WAAW,QAAQ,KAAK,GAAG;AAC5C,UAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,eAAe,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,MAAM,kBAAkB,OAAO,MAAM,GAAG,QAAQ,UAAU,UAAU,UAAU,MAAM,KAAK,IAAI,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,QAAQ,KAAK,MAAM,MAAM,MAAM,QAAQ,EAAE,MAAM,UAAU,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,EAChS;AACA,SAAO,EAAE,OAAO,QAAQ,MAAM,OAAO,SAAS,OAAO,MAAM;AAC5D;AAMO,SAAS,kBAAkB,OAAmB,OAAqD;AACzG,QAAM,QAAQ,MAAM;AACpB,MAAI,CAAC,SAAS,MAAM,QAAS,QAAO;AACpC,QAAM,KAAK,MAAM,SAAS,MAAM,MAAM,IAAI,MAAM;AAChD,SAAO,UAAU,IAAI,MAAM,OAAO,MAAM,MAAM;AAC/C;AAGO,SAAS,eAAe,OAAmB,OAAe,MAAuB;AACvF,QAAM,QAAQ,MAAM,YAAY,SAAS,CAAC;AAC1C,QAAM,OAAO,SAAS,MAAM,SAAS,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,KAAK;AACtE,MAAI,EAAE,OAAO,GAAI,QAAO;AACxB,QAAM,UAAU,KAAK,MAAM,QAAQ,IAAI,IAAI;AAC3C,SAAO,OAAO,QAAQ,YAAY,EAAE,CAAC;AACtC;;;ACvsBO,SAAS,kBAAkB,UAAgF;AACjH,SAAO,aAAa,QAAQ,YAAY,aAAa,WAAW,YAAY;AAC7E;AAGO,SAAS,mBAAmB,MAAyC;AAC3E,SAAO,KAAK,SAAS,UAAU,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM;AACrE;AAEA,IAAM,SAAS,CAACE,UAAiBA,MAAK,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,QAAQ;AAE/H,SAAS,MAAM,QAA6D;AAC3E,SAAO,OAAO,QAAQ,MAAM,EAC1B,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,UAAa,MAAM,EAAE,EAC7C,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,EAC9C,KAAK,EAAE;AACV;AAEA,SAAS,UAAU,MAAiB,YAA4B;AAC/D,QAAM,SAAS,EAAE,SAAS,KAAK,SAAS,aAAa,KAAK,KAAK;AAC/D,UAAQ,KAAK,MAAM;AAAA,IAClB,KAAK;AACJ,aAAO,QAAQ,MAAM,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,OAAO,KAAK,OAAO,QAAQ,KAAK,QAAQ,IAAI,KAAK,QAAQ,MAAM,KAAK,MAAM,QAAQ,KAAK,QAAQ,gBAAgB,KAAK,aAAa,GAAG,OAAO,CAAC,CAAC;AAAA,IAC3L,KAAK;AACJ,aAAO,QAAQ,MAAM,EAAE,GAAG,KAAK,GAAG,MAAM,KAAK,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,gBAAgB,KAAK,aAAa,oBAAoB,KAAK,MAAM,mBAAmB,SAAS,kBAAkB,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,IACvN,KAAK;AACJ,aAAO,UAAU,MAAM,EAAE,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,GAAG,MAAM,KAAK,MAAM,QAAQ,KAAK,QAAQ,gBAAgB,KAAK,aAAa,GAAG,OAAO,CAAC,CAAC;AAAA,IACnJ,KAAK;AACJ,aAAO,QAAQ,MAAM,EAAE,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,QAAQ,KAAK,QAAQ,gBAAgB,KAAK,aAAa,oBAAoB,KAAK,MAAM,GAAG,OAAO,CAAC,CAAC;AAAA,IAC9K,KAAK;AACJ,aAAO,QAAQ,MAAM;AAAA,QACpB,GAAG,KAAK;AAAA,QACR,GAAG,KAAK;AAAA,QACR,eAAe,KAAK;AAAA,QACpB,qBAAqB,kBAAkB,KAAK,QAAQ;AAAA,QACpD,aAAa,KAAK;AAAA,QAClB,eAAe,KAAK;AAAA,QACpB,eAAe;AAAA,QACf,MAAM,KAAK;AAAA,QACX,WAAW,mBAAmB,IAAI;AAAA,QAClC,GAAG;AAAA,MACJ,CAAC,CAAC,IAAI,OAAO,KAAK,IAAI,CAAC;AAAA,EACzB;AACD;AAUO,SAAS,gBAAgB,OAAmB,UAA2B,CAAC,GAAW;AACzF,QAAM,OAAO,QAAQ,iBAAiB;AACtC,QAAM,OAAO,MAAM,MAAM;AACzB,QAAM,OAAO,MAAM,MACjB,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,YAAY,EAC/C,IAAI,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,EAC7B,KAAK,EAAE;AACT,QAAM,QAAQ,QAAQ;AACtB,SAAO,kDAAkD,MAAM,KAAK,aAAa,MAAM,MAAM,kBAAkB,MAAM,KAAK,IAAI,MAAM,MAAM,eAAe,QAAQ,gBAAgB,OAAO,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI;AAC/M;AAGO,SAAS,WAAW,MAAiB,SAA0E;AACrH,QAAM,QAAQ,YAAY,MAAM,EAAE,GAAG,SAAS,WAAW,KAAK,CAAC;AAC/D,SAAO,gBAAgB,OAAO,EAAE,GAAG,SAAS,WAAW,QAAQ,cAAc,KAAK,SAAS,QAAW,CAAC;AACxG;;;AC9CA,SAAS,cAAc,GAAY,GAAqB;AACvD,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,OAAO,MAAM,YAAY,OAAO,MAAM,YAAY,MAAM,QAAQ,MAAM,KAAM,QAAO,OAAO,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC;AACxH,MAAI,MAAM,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,EAAG,QAAO;AAClD,MAAI,MAAM,QAAQ,CAAC,GAAG;AACrB,UAAM,KAAK;AACX,WAAO,EAAE,WAAW,GAAG,UAAU,EAAE,MAAM,CAAC,GAAG,MAAM,cAAc,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,EAC3E;AACA,QAAM,KAAK;AACX,QAAM,KAAK;AACX,QAAM,OAAO,OAAO,KAAK,EAAE,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,MAAM,MAAS;AAC9D,MAAI,KAAK,WAAW,OAAO,KAAK,EAAE,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,MAAM,MAAS,EAAE,OAAQ,QAAO;AACtF,SAAO,KAAK,MAAM,CAAC,MAAM,OAAO,UAAU,eAAe,KAAK,IAAI,CAAC,KAAK,cAAc,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACpG;AA+DA,IAAM,OAAO,CAAC,SAAiB,YAA8C,EAAE,IAAI,OAAO,SAAS,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC,EAAG;AAS1H,IAAM,kBAAN,MAAsB;AAAA,EACnB;AAAA,EACD;AAAA,EACA,YAAmC;AAAA,EACnC,SAAuB,CAAC;AAAA,EACxB,aAA4B;AAAA,EAC5B,eAAe;AAAA,EACf,eAA8D;AAAA,EAC9D,WAAW;AAAA,EACX,WAAW;AAAA,EACF;AAAA,EACA,YAAY,oBAAI,IAAiC;AAAA,EAC1D;AAAA,EACA;AAAA,EAER,YAAY,UAAkC,CAAC,GAAG;AACjD,SAAK,UAAU,QAAQ,WAAW,IAAI,eAAe;AACrD,SAAK,WAAW,QAAQ;AACxB,UAAM,EAAE,MAAM,OAAO,IAAI,mBAAmB,QAAQ,QAAQ,CAAC,CAAC;AAC9D,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,QAAQ,KAAK,aAAa;AAC/B,SAAK,QAAQ;AAAA,EACd;AAAA,EAEQ,UAAU;AACjB,SAAK,qBAAqB;AAC1B,SAAK,qBAAqB,KAAK,QAAQ,UAAU,CAAC,MAAM;AAEvD,YAAM,IAAI,KAAK;AACf,UAAI,KAAK,YAAa,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,SAAW;AACvI,WAAK,OAAO,KAAK;AAAA,IAClB,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,MAAkB,KAAK;AAAA;AAAA,EAGlC,YAAY,CAAC,aAAwD;AAEpE,QAAI,CAAC,KAAK,mBAAoB,MAAK,QAAQ;AAC3C,SAAK,UAAU,IAAI,QAAQ;AAC3B,WAAO,MAAM;AACZ,WAAK,UAAU,OAAO,QAAQ;AAAA,IAC/B;AAAA,EACD;AAAA;AAAA,EAGA,UAA+B;AAC9B,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,UAAU,IAAqC;AAC9C,WAAO,KAAK,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,EAChD;AAAA,EAEQ,eAA2B;AAClC,UAAM,IAAI,KAAK,QAAQ,SAAS;AAChC,UAAM,MAAM,KAAK;AACjB,UAAM,WAAW,KAAK,SAAS,YAAY,KAAK,SAAS,UAAU,IAAI,WAAW;AAClF,WAAO;AAAA,MACN,MAAM,KAAK;AAAA,MACX,WAAW;AAAA,MACX,gBAAgB,WAAY,KAAK,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,KAAK,OAAQ;AAAA,MACvF,eAAe,KAAK,SAAS,WAAW,KAAK,SAAS,aAAa,IAAI,QAAQ;AAAA,MAC/E,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,SAAS,EAAE;AAAA,MACX,SAAS,EAAE;AAAA,MACX,WAAW,EAAE;AAAA,MACb,WAAW,EAAE;AAAA,MACb,UAAU,KAAK;AAAA,IAChB;AAAA,EACD;AAAA,EAEQ,OAAO,aAAsB;AACpC,SAAK;AACL,SAAK,QAAQ,KAAK,aAAa;AAC/B,QAAI,YAAa,MAAK,WAAW,KAAK,IAAI;AAC1C,UAAM,QAAQ,KAAK;AACnB,SAAK,UAAU,QAAQ,CAAC,aAAa;AACpC,UAAI;AACH,iBAAS,KAAK;AAAA,MACf,SAAS,OAAO;AACf,gBAAQ,MAAM,8CAA8C,KAAK;AAAA,MAClE;AAAA,IACD,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,eAAe,KAA4B,MAAwC;AAC1F,QAAI,CAAC,IAAK,QAAO;AACjB,YAAQ,IAAI,MAAM;AAAA,MACjB,KAAK;AACJ,eAAO,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,QAAQ,IAAI,MAAM;AAAA,MAC/D,KAAK;AACJ,eAAO,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,QAAQ,KAAK,IAAI,QAAQ,KAAK,WAAW,SAAS,MAAM;AAAA,MACrG,KAAK;AACJ,eAAO,IAAI,QAAQ,KAAK,WAAW,SAAS,MAAM;AAAA,MACnD,KAAK;AACJ,eAAO,KAAK,QAAQ,MAAM;AAAA,MAC3B,KAAK;AACJ,eAAO,KAAK,WAAW,MAAM;AAAA,MAC9B;AACC,eAAO;AAAA,IACT;AAAA,EACD;AAAA,EAEQ,UAAU,MAAiB;AAClC,SAAK,WAAW;AAChB,QAAI;AACH,WAAK,OAAO;AACZ,WAAK,YAAY,KAAK,eAAe,KAAK,WAAW,IAAI;AAAA,IAC1D,UAAE;AACD,WAAK,WAAW;AAAA,IACjB;AACA,SAAK,OAAO,IAAI;AAAA,EACjB;AAAA,EAEQ,OAAO,OAAe,MAAiB,QAAgC;AAC9E,UAAM,SAAS,KAAK;AACpB,UAAM,YAAY,KAAK,OAAO,SAAS;AACvC,SAAK,SAAS,CAAC;AAEf,QAAI,cAAc,QAAQ,IAAI,GAAG;AAChC,YAAM,WAAW,WAAW,UAAa,CAAC,mBAAmB,KAAK,WAAW,MAAM,KAAK,EAAE,WAAW,QAAQ,KAAK,cAAc;AAChI,UAAI,SAAU,MAAK,YAAY;AAC/B,UAAI,YAAY,UAAW,MAAK,OAAO,KAAK;AAC5C;AAAA,IACD;AACA,UAAM,UAAmB;AAAA,MACxB,MAAM;AAAA,MACN,KAAK;AAAA,MACL,SAAS,MAAM,KAAK,UAAU,IAAI;AAAA,MAClC,MAAM,MAAM,KAAK,UAAU,MAAM;AAAA,MACjC,MAAM,MAAM,KAAK,UAAU,IAAI;AAAA,IAChC;AACA,QAAI,WAAW,OAAW,MAAK,YAAY;AAC3C,QAAI,KAAK,eAAe,KAAM,MAAK,QAAQ,cAAc,SAAS,EAAE,KAAK,iBAAiB,KAAK,UAAU,IAAI,KAAK,YAAY,GAAG,CAAC;AAAA,QAC7H,MAAK,QAAQ,QAAQ,OAAO;AAAA,EAClC;AAAA,EAEQ,OAAO,SAAiB,SAAuB,CAAC,GAAsB;AAC7E,SAAK,SAAS,OAAO,SAAS,SAAS,CAAC,EAAE,MAAM,IAAI,QAAQ,CAAC;AAC7D,SAAK,OAAO,KAAK;AACjB,WAAO,KAAK,SAAS,OAAO,SAAS,SAAS,MAAS;AAAA,EACxD;AAAA;AAAA,EAGQ,OAAO,MAA6C;AAC3D,UAAM,QAAQ,eAAe,KAAK,IAAI;AACtC,SAAK,KAAK;AACV,WAAO;AAAA,EACR;AAAA,EAEQ,cAAc,IAA+B;AACpD,UAAM,MAAM,KAAK,KAAK,OAAO,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG;AACnD,WAAO,KAAK,uBAAuB,EAAE,MAAM,IAAI,SAAS,mBAAmB,IAAI,KAAK,IAAI,CAAC,KAAK,6BAA6B,GAAG;AAAA,EAC/H;AAAA,EAEQ,SAAS,OAAkC;AAClD,UAAM,IAAI,KAAK,KAAK,WAAW;AAC/B,WAAO,KAAK,IAAI,kBAAkB,KAAK,mCAAmC,IAAI,CAAC,MAAM,kCAAkC;AAAA,EACxH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,OAAuB,UAA4B,CAAC,GAAsB;AAChF,UAAM,IAAI,KAAK;AACf,UAAM,SAAS;AAAA,MACd,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO,MAAM,QAAQ,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,MAAM,IAAI,EAAE;AAAA,MACxD,OAAO,MAAM,QAAQ,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,MAAM,IAAI,EAAE;AAAA,MACxD,QAAQ,MAAM,SAAS,EAAE,GAAG,EAAE,QAAQ,GAAG,MAAM,OAAO,IAAI,EAAE;AAAA,MAC5D,SAAS;AAAA,IACV;AACA,UAAM,EAAE,MAAM,OAAO,IAAI,mBAAmB,MAAM;AAClD,QAAI,OAAO,OAAQ,QAAO,KAAK,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,GAAG,GAAG,MAAM;AACpF,QAAI,KAAK,UAAU,IAAI,MAAM,KAAK,UAAU,CAAC,EAAG,QAAO,EAAE,IAAI,KAAK;AAClE,SAAK,OAAO,QAAQ,SAAS,YAAY,KAAK,GAAG,IAAI;AACrD,WAAO,EAAE,IAAI,KAAK;AAAA,EACnB;AAAA,EAEA,QAAQ,MAAoC;AAC3C,WAAO,KAAK,OAAO,EAAE,KAAK,GAAG,EAAE,OAAO,oBAAoB,CAAC;AAAA,EAC5D;AAAA,EAEA,SAAS,OAAkC;AAC1C,WAAO,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE,OAAO,aAAa,CAAC;AAAA,EACtD;AAAA,EAEA,YAAY,UAAqC;AAChD,WAAO,KAAK,OAAO,EAAE,SAAS,GAAG,EAAE,OAAO,gBAAgB,CAAC;AAAA,EAC5D;AAAA;AAAA,EAGA,QAAQ,MAAiB,OAA8C;AACtE,WAAO,KAAK,OAAO,SAAS,MAAM,EAAE,OAAO,MAAM,IAAI,EAAE,OAAO,MAAM,GAAG,EAAE,OAAO,UAAU,SAAS,MAAM,aAAa,OAAO,QAAQ,CAAC;AAAA,EACvI;AAAA,EAEA,UAAU,OAAgD;AACzD,WAAO,KAAK,OAAO,EAAE,QAAQ,MAAM,GAAG,EAAE,OAAO,gBAAgB,CAAC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,QAAQ,MAAiF,UAA4B,CAAC,GAAsB;AAC3I,WAAO,KAAK,OAAO,EAAE,GAAI,KAAK,aAAa,EAAE,YAAY,KAAK,WAAuB,IAAI,CAAC,GAAI,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAwB,IAAI,CAAC,EAAG,GAAG,EAAE,OAAO,QAAQ,SAAS,kBAAkB,CAAC;AAAA,EAChN;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,UAAkB,OAAe,OAAgB,UAA4B,CAAC,GAAsB;AAC5G,UAAM,SAAS,KAAK,UAAU,QAAQ;AACtC,QAAI,CAAC,OAAQ,QAAO,KAAK,cAAc,QAAQ;AAC/C,QAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,SAAS,KAAK,KAAK,WAAW,OAAQ,QAAO,KAAK,SAAS,KAAK;AAC7G,UAAM,SAAS,gBAAgB,KAAK;AACpC,QAAI,WAAW,OAAW,QAAO,KAAK,OAAO,IAAI,OAAO,KAAK,CAAC,8DAA8D,CAAC,EAAE,MAAM,GAAG,QAAQ,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAC/M,QAAI,OAAO,OAAO,KAAK,MAAM,QAAQ;AACpC,UAAI,KAAK,OAAO,QAAQ;AACvB,aAAK,SAAS,CAAC;AACf,aAAK,OAAO,KAAK;AAAA,MAClB;AACA,aAAO,EAAE,IAAI,KAAK;AAAA,IACnB;AACA,UAAM,OAAO,KAAK,OAAO,CAAC,MAAM;AAC/B,QAAE,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,EAAG,OAAO,KAAK,IAAI;AAAA,IAC1D,CAAC;AACD,SAAK,OAAO,QAAQ,SAAS,QAAQ,OAAO,IAAI,SAAM,KAAK,KAAK,WAAW,KAAK,CAAC,IAAI,IAAI;AACzF,WAAO,EAAE,IAAI,KAAK;AAAA,EACnB;AAAA;AAAA,EAGA,UAAU,OAAuE,UAA4B,CAAC,GAAsB;AACnI,UAAM,SAAuB,CAAC;AAC9B,UAAM,SAAmE,CAAC;AAC1E,eAAW,QAAQ,OAAO;AACzB,UAAI,CAAC,KAAK,UAAU,KAAK,QAAQ,EAAG,QAAO,KAAK,EAAE,MAAM,KAAK,UAAU,SAAU,KAAK,cAAc,KAAK,QAAQ,EAA0B,QAAQ,CAAC;AAAA,eAC3I,CAAC,OAAO,UAAU,KAAK,KAAK,KAAK,KAAK,QAAQ,KAAK,KAAK,SAAS,KAAK,KAAK,WAAW,OAAQ,QAAO,KAAK,EAAE,MAAM,GAAG,KAAK,QAAQ,IAAI,KAAK,KAAK,KAAK,SAAU,KAAK,SAAS,KAAK,KAAK,EAA0B,QAAQ,CAAC;AAAA,WAC9N;AACJ,cAAM,QAAQ,gBAAgB,KAAK,KAAK;AACxC,YAAI,UAAU,OAAW,QAAO,KAAK,EAAE,MAAM,GAAG,KAAK,QAAQ,IAAI,KAAK,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,CAAC,qBAAqB,CAAC;AAAA,YAChI,QAAO,KAAK,EAAE,UAAU,KAAK,UAAU,OAAO,KAAK,OAAO,MAAM,CAAC;AAAA,MACvE;AAAA,IACD;AACA,QAAI,OAAO,OAAQ,QAAO,KAAK,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,GAAG,GAAG,MAAM;AACpF,UAAM,OAAO,KAAK,OAAO,CAAC,MAAM;AAC/B,iBAAW,QAAQ,OAAQ,GAAE,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,QAAQ,EAAG,OAAO,KAAK,KAAK,IAAI,KAAK;AAAA,IACpG,CAAC;AACD,QAAI,KAAK,UAAU,KAAK,MAAM,MAAM,KAAK,UAAU,KAAK,KAAK,MAAM,EAAG,MAAK,OAAO,QAAQ,SAAS,eAAe,IAAI;AACtH,WAAO,EAAE,IAAI,KAAK;AAAA,EACnB;AAAA;AAAA,EAGA,UAAU,QAA0B,CAAC,GAAG,UAA2B,CAAC,GAAqF;AACxJ,UAAM,KAAK,MAAM,MAAM,CAAC,KAAK,UAAU,MAAM,EAAE,IAAI,MAAM,KAAK,oBAAoB,KAAK,KAAK,MAAM;AAClG,UAAM,OAAO,MAAM,QAAQ,UAAU,KAAK,KAAK,OAAO,SAAS,CAAC;AAChE,UAAM,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,OAAO,QAAQ,QAAQ,MAAM,KAAK,KAAK,OAAO,MAAM,CAAC;AAC/F,UAAM,SAAS,CAAC,GAAG,KAAK,KAAK,MAAM;AACnC,WAAO,OAAO,IAAI,GAAG,EAAE,GAAG,OAAO,IAAI,MAAM,QAAS,MAAM,UAAU,CAAC,EAAmB,CAAC;AACzF,UAAM,EAAE,MAAM,OAAO,IAAI,mBAAmB,EAAE,GAAG,KAAK,MAAM,OAAO,CAAC;AACpE,QAAI,OAAO,OAAQ,QAAO,KAAK,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,GAAG,GAAG,MAAM;AACpF,SAAK,OAAO,eAAe,IAAI,KAAK,MAAM,EAAE,MAAM,UAAU,UAAU,GAAG,CAAC;AAC1E,WAAO,EAAE,IAAI,MAAM,GAAG;AAAA,EACvB;AAAA,EAEA,aAAa,IAA+B;AAC3C,UAAM,SAAS,KAAK,UAAU,EAAE;AAChC,QAAI,CAAC,OAAQ,QAAO,KAAK,cAAc,EAAE;AACzC,SAAK;AAAA,MACJ,kBAAkB,OAAO,IAAI;AAAA,MAC7B,KAAK,OAAO,CAAC,MAAM;AAClB,UAAE,SAAS,EAAE,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,MAC9C,CAAC;AAAA,IACF;AACA,WAAO,EAAE,IAAI,KAAK;AAAA,EACnB;AAAA,EAEA,aAAa,IAAY,OAA4C;AACpE,UAAM,SAAS,KAAK,UAAU,EAAE;AAChC,QAAI,CAAC,OAAQ,QAAO,KAAK,cAAc,EAAE;AACzC,UAAM,OAAO,iBAAiB,MAAM;AACpC,QAAI,MAAM,SAAS,OAAW,MAAK,OAAO,OAAO,MAAM,IAAI;AAC3D,QAAI,MAAM,UAAU,QAAQ,MAAM,UAAU,GAAI,QAAO,KAAK;AAAA,aACnD,MAAM,UAAU,OAAW,MAAK,QAAQ,MAAM;AACvD,QAAI,MAAM,SAAS,KAAM,QAAO,KAAK;AAAA,aAC5B,MAAM,SAAS,OAAW,MAAK,OAAO,MAAM;AACrD,QAAI,MAAM,WAAW,QAAW;AAC/B,UAAI,MAAM,OAAQ,MAAK,SAAS;AAAA,UAC3B,QAAO,KAAK;AAAA,IAClB;AACA,UAAM,UAAU,KAAK,KAAK,OAAO,IAAI,CAAC,MAAO,EAAE,OAAO,KAAK,OAAO,CAAE;AACpE,UAAM,EAAE,MAAM,OAAO,IAAI,mBAAmB,EAAE,GAAG,KAAK,MAAM,QAAQ,QAAQ,CAAC;AAC7E,QAAI,OAAO,OAAQ,QAAO,KAAK,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,GAAG,GAAG,MAAM;AACpF,QAAI,KAAK,UAAU,KAAK,MAAM,MAAM,KAAK,UAAU,KAAK,KAAK,MAAM,EAAG,QAAO,EAAE,IAAI,KAAK;AACxF,UAAM,QACL,MAAM,WAAW,UAAa,OAAO,KAAK,KAAK,EAAE,WAAW,IACzD,GAAG,MAAM,SAAS,SAAS,MAAM,KAAK,OAAO,IAAI,MACjD,MAAM,SAAS,UAAa,OAAO,KAAK,KAAK,EAAE,WAAW,IACzD,kBACA,kBAAkB,OAAO,IAAI;AAClC,SAAK,OAAO,OAAO,IAAI;AACvB,WAAO,EAAE,IAAI,KAAK;AAAA,EACnB;AAAA,EAEA,aAAa,IAA+B;AAC3C,UAAM,SAAS,KAAK,UAAU,EAAE;AAChC,QAAI,CAAC,OAAQ,QAAO,KAAK,cAAc,EAAE;AACzC,WAAO,KAAK,aAAa,IAAI,EAAE,QAAQ,CAAC,OAAO,OAAO,CAAC;AAAA,EACxD;AAAA;AAAA,EAGA,WAAW,IAAY,IAA+B;AACrD,UAAM,OAAO,KAAK,KAAK,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;AAC1D,QAAI,OAAO,EAAG,QAAO,KAAK,cAAc,EAAE;AAC1C,UAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,OAAO,SAAS,GAAG,EAAE,CAAC;AACpE,QAAI,WAAW,KAAM,QAAO,EAAE,IAAI,KAAK;AACvC,SAAK;AAAA,MACJ;AAAA,MACA,KAAK,OAAO,CAAC,MAAM;AAClB,cAAM,CAAC,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM,CAAC;AACnC,UAAE,OAAO,OAAO,QAAQ,GAAG,CAAC;AAAA,MAC7B,CAAC;AAAA,IACF;AACA,WAAO,EAAE,IAAI,KAAK;AAAA,EACnB;AAAA;AAAA,EAGA,YAAY,OAAgB,UAA2B,CAAC,GAAgC;AACvF,UAAM,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,WAAW,QAAQ,QAAQ,MAAM,KAAK,KAAK,WAAW,MAAM,CAAC;AACvG,UAAM,OAAO,SAAS,GAAG,KAAK,KAAK,WAAW,SAAS,CAAC;AACxD,SAAK;AAAA,MACJ,iBAAiB,IAAI;AAAA,MACrB,KAAK,OAAO,CAAC,MAAM;AAClB,UAAE,WAAW,OAAO,IAAI,GAAG,IAAI;AAC/B,mBAAW,KAAK,EAAE,OAAQ,GAAE,OAAO,OAAO,IAAI,GAAG,IAAI;AAAA,MACtD,CAAC;AAAA,MACD,EAAE,MAAM,YAAY,OAAO,GAAG;AAAA,IAC/B;AACA,WAAO,EAAE,IAAI,MAAM,OAAO,GAAG;AAAA,EAC9B;AAAA,EAEA,eAAe,OAAkC;AAChD,QAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,SAAS,KAAK,KAAK,WAAW,OAAQ,QAAO,KAAK,SAAS,KAAK;AAC7G,SAAK;AAAA,MACJ,oBAAoB,KAAK,KAAK,WAAW,KAAK,CAAC;AAAA,MAC/C,KAAK,OAAO,CAAC,MAAM;AAClB,UAAE,WAAW,OAAO,OAAO,CAAC;AAC5B,mBAAW,KAAK,EAAE,OAAQ,GAAE,OAAO,OAAO,OAAO,CAAC;AAAA,MACnD,CAAC;AAAA,IACF;AACA,WAAO,EAAE,IAAI,KAAK;AAAA,EACnB;AAAA,EAEA,eAAe,OAAe,OAAkC;AAC/D,QAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,SAAS,KAAK,KAAK,WAAW,OAAQ,QAAO,KAAK,SAAS,KAAK;AAC7G,QAAI,KAAK,KAAK,WAAW,KAAK,MAAM,MAAO,QAAO,EAAE,IAAI,KAAK;AAC7D,SAAK;AAAA,MACJ;AAAA,MACA,KAAK,OAAO,CAAC,MAAM;AAClB,UAAE,WAAW,KAAK,IAAI,OAAO,KAAK;AAAA,MACnC,CAAC;AAAA,IACF;AACA,WAAO,EAAE,IAAI,KAAK;AAAA,EACnB;AAAA,EAEA,aAAa,MAAc,IAA+B;AACzD,QAAI,CAAC,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,QAAQ,KAAK,KAAK,WAAW,OAAQ,QAAO,KAAK,SAAS,IAAI;AACzG,UAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,WAAW,SAAS,GAAG,EAAE,CAAC;AACxE,QAAI,WAAW,KAAM,QAAO,EAAE,IAAI,KAAK;AACvC,UAAM,OAAO,CAAI,SAAc;AAC9B,YAAM,CAAC,IAAI,IAAI,KAAK,OAAO,MAAM,CAAC;AAClC,WAAK,OAAO,QAAQ,GAAG,IAAI;AAAA,IAC5B;AACA,SAAK;AAAA,MACJ;AAAA,MACA,KAAK,OAAO,CAAC,MAAM;AAClB,aAAK,EAAE,UAAU;AACjB,mBAAW,KAAK,EAAE,OAAQ,MAAK,EAAE,MAAM;AAAA,MACxC,CAAC;AAAA,IACF;AACA,WAAO,EAAE,IAAI,KAAK;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,KAAa,QAAgB,OAAsG;AAC7I,UAAM,OAAoB,OAAO,UAAU,WAAY,MAAM,SAAS,GAAI,IAAI,SAAS,KAAK,IAAI,SAAS,KAAK,IAAK,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1I,QAAI,CAAC,KAAK,OAAQ,QAAO,EAAE,IAAI,KAAK;AACpC,UAAM,SAAuB,CAAC;AAC9B,UAAM,OAAO,KAAK,OAAO,CAAC,MAAM;AAC/B,YAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AACnD,YAAM,aAAa,SAAS,QAAQ;AACpC,aAAO,EAAE,OAAO,UAAU,YAAY;AACrC,cAAM,KAAK,oBAAoB,EAAE,MAAM;AACvC,UAAE,OAAO,KAAK,EAAE,IAAI,MAAM,UAAU,EAAE,OAAO,SAAS,CAAC,IAAI,QAAQ,EAAE,WAAW,IAAI,MAAM,IAAI,EAAE,CAAC;AAAA,MAClG;AACA,YAAM,UAAU,MAAM,KAAK,SAAS;AACpC,aAAO,EAAE,WAAW,UAAU,SAAS;AACtC,UAAE,WAAW,KAAK,GAAG,EAAE,WAAW,SAAS,CAAC,EAAE;AAC9C,mBAAW,KAAK,EAAE,OAAQ,GAAE,OAAO,KAAK,IAAI;AAAA,MAC7C;AACA,WAAK,QAAQ,CAAC,YAAY,MAAM;AAC/B,mBAAW,QAAQ,CAAC,MAAM,MAAM;AAC/B,gBAAM,MAAM,SAAS;AACrB,gBAAM,QAAQ,MAAM;AACpB,cAAI,MAAM,EAAG,GAAE,WAAW,KAAK,IAAI,SAAS,QAAQ,SAAS,SAAY,KAAK,OAAO,IAAI,EAAE,KAAK;AAAA,eAC3F;AACJ,kBAAM,SAAS,gBAAgB,IAAI;AACnC,gBAAI,WAAW,OAAW,QAAO,KAAK,EAAE,MAAM,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,wCAAwC,CAAC;AACjJ,cAAE,OAAO,GAAG,EAAE,OAAO,KAAK,IAAI,UAAU;AAAA,UACzC;AAAA,QACD,CAAC;AAAA,MACF,CAAC;AAAA,IACF,CAAC;AACD,SAAK,OAAO,eAAe,IAAI;AAC/B,QAAI,OAAO,QAAQ;AAClB,WAAK,SAAS;AACd,WAAK,OAAO,KAAK;AAAA,IAClB;AACA,WAAO,OAAO,SAAS,EAAE,IAAI,MAAM,OAAO,IAAI,EAAE,IAAI,KAAK;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,MAA6C,UAA6B,CAAC,GAAkD;AACxI,UAAM,OAAO,mBAAmB,MAAM,OAAO;AAC7C,QAAI,CAAC,KAAK,WAAW,UAAU,CAAC,KAAK,OAAO,OAAQ,QAAO,KAAK,OAAO,mFAAmF;AAC1J,UAAM,SAAS,IAAI,IAAI,KAAK,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC/D,UAAM,SAAS,KAAK,OAAO,IAAI,CAAC,MAAM;AACrC,YAAM,MAAM,OAAO,IAAI,EAAE,IAAI;AAC7B,aAAO,EAAE,GAAG,GAAG,GAAI,KAAK,QAAQ,EAAE,OAAO,IAAI,MAAM,IAAI,CAAC,GAAI,GAAI,KAAK,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC,GAAI,GAAI,MAAM,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,EAAG;AAAA,IACtI,CAAC;AACD,UAAM,EAAE,KAAK,IAAI,mBAAmB,EAAE,GAAG,KAAK,MAAM,YAAY,KAAK,YAAY,OAAO,CAAC;AACzF,SAAK,OAAO,eAAe,IAAI;AAC/B,QAAI,KAAK,OAAO,QAAQ;AACvB,WAAK,SAAS,KAAK;AACnB,WAAK,OAAO,KAAK;AACjB,aAAO,EAAE,IAAI,MAAM,QAAQ,KAAK,OAAO;AAAA,IACxC;AACA,WAAO,EAAE,IAAI,KAAK;AAAA,EACnB;AAAA;AAAA,EAGA,UAAUC,OAAc,UAAsD,CAAC,GAAkD;AAChI,UAAM,YAAY,QAAQ,cAAcA,MAAK,SAAS,GAAI,IAAI,MAAO;AACrE,WAAO,KAAK,YAAY,SAASA,OAAM,EAAE,UAAU,CAAC,GAAG,OAAO;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,WAAwC;AAC9C,UAAM,OAAO,KAAK,eAAe,WAAW,KAAK,IAAI;AACrD,QAAI,mBAAmB,MAAM,KAAK,SAAS,KAAM,SAAS,QAAQ,KAAK,cAAc,KAAO;AAC5F,SAAK,YAAY;AACjB,SAAK,OAAO,KAAK;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAqC;AACpC,UAAM,MAAM,KAAK;AACjB,QAAI,CAAC,IAAK,QAAO,KAAK,sBAAsB;AAC5C,YAAQ,IAAI,MAAM;AAAA,MACjB,KAAK;AACJ,eAAO,KAAK,aAAa,IAAI,QAAQ;AAAA,MACtC,KAAK;AACJ,eAAO,KAAK,eAAe,IAAI,KAAK;AAAA,MACrC,KAAK;AACJ,eAAO,KAAK,SAAS,IAAI,UAAU,IAAI,OAAO,MAAM,EAAE,OAAO,cAAc,CAAC;AAAA,MAC7E,KAAK;AACJ,eAAO,KAAK,SAAS,EAAE;AAAA,MACxB,KAAK;AACJ,eAAO,KAAK,YAAY,EAAE;AAAA,MAC3B,KAAK;AACJ,eAAO,KAAK,UAAU,EAAE,MAAM,MAAM,CAAC;AAAA,MACtC,KAAK;AACJ,eAAO,KAAK,QAAQ,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAAA,MAC9C;AACC,eAAO,KAAK,qCAAqC;AAAA,IACnD;AAAA,EACD;AAAA;AAAA,EAGA,WAAW,UAAkB,OAAe,OAAkC;AAC7E,UAAM,SAAS,KAAK,UAAU,QAAQ;AACtC,QAAI,CAAC,OAAQ,QAAO,KAAK,cAAc,QAAQ;AAC/C,UAAM,UAAU,OAAO,OAAO,KAAK,KAAK;AACxC,WAAO,KAAK,SAAS,UAAU,OAAO,QAAQ,UAAU,OAAO,YAAY,EAAE,CAAC,GAAG,EAAE,OAAO,QAAQ,OAAO,IAAI,SAAM,KAAK,KAAK,WAAW,KAAK,KAAK,KAAK,GAAG,CAAC;AAAA,EAC5J;AAAA;AAAA,EAGA,aAAa,KAAmB;AAC/B,QAAI,KAAK,eAAe,IAAK;AAC7B,SAAK,QAAQ,WAAW;AACxB,SAAK,aAAa;AAClB,SAAK;AACL,SAAK,eAAe,EAAE,MAAM,KAAK,MAAM,MAAM,KAAK,QAAQ,KAAK,EAAE;AACjE,SAAK,OAAO,KAAK;AAAA,EAClB;AAAA,EAEA,aAAmB;AAClB,QAAI,KAAK,eAAe,KAAM;AAC9B,SAAK,aAAa;AAClB,SAAK,QAAQ,WAAW;AAExB,UAAM,QAAQ,KAAK;AACnB,SAAK,eAAe;AACpB,QAAI,SAAS,cAAc,MAAM,MAAM,KAAK,IAAI,EAAG,MAAK,QAAQ,SAAS,MAAM,IAAI;AACnF,SAAK,OAAO,KAAK;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAoB;AACnB,WAAO,eAAe,KAAK,IAAI;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,OAAgB,UAAsC,CAAC,GAAiB;AAC5E,UAAM,EAAE,MAAM,OAAO,IAAI,mBAAmB,KAAK;AACjD,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,YAAY,KAAK,eAAe,KAAK,WAAW,IAAI;AACzD,QAAI,QAAQ,cAAc;AACzB,WAAK,WAAW;AAChB,UAAI;AACH,aAAK,QAAQ,MAAM;AAAA,MACpB,UAAE;AACD,aAAK,WAAW;AAAA,MACjB;AAAA,IACD;AACA,SAAK,OAAO,IAAI;AAChB,WAAO;AAAA,EACR;AAAA,EAEA,OAAgB;AACf,SAAK,WAAW;AAChB,WAAO,KAAK,QAAQ,KAAK;AAAA,EAC1B;AAAA,EAEA,OAAgB;AACf,SAAK,WAAW;AAChB,WAAO,KAAK,QAAQ,KAAK;AAAA,EAC1B;AAAA;AAAA,EAGA,UAAgB;AACf,SAAK,qBAAqB;AAC1B,SAAK,qBAAqB;AAC1B,SAAK,UAAU,MAAM;AAAA,EACtB;AACD;AAEO,SAAS,sBAAsB,UAAkC,CAAC,GAAoB;AAC5F,SAAO,IAAI,gBAAgB,OAAO;AACnC;AAEA,SAAS,YAAY,OAA+B;AACnD,QAAM,OAAO,OAAO,KAAK,KAAK;AAC9B,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,QAAM,SAAiC;AAAA,IACtC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,IACb,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,aAAa;AAAA,EACd;AACA,SAAO,OAAO,KAAK,CAAC,CAAC,KAAK;AAC3B;;;AC5sBA,IAAMC,QAAO,CAAC,YAA2B;AACxC,QAAM,IAAI,MAAM,OAAO;AACxB;AAEA,IAAM,QAAQ,CAAC,WAA8C;AAC5D,MAAI,CAAC,OAAO,GAAI,CAAAA,MAAK,OAAO,WAAW,0BAA0B;AAClE;AAEA,IAAM,QAAQ,EAAE,MAAM,CAAC,UAAU,UAAU,MAAM,GAAG,aAAa,6DAA6D;AAE9H,IAAM,SAAS;AAAA,EACd,MAAM;AAAA,EACN,YAAY;AAAA,IACX,OAAO,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,mBAAmB,EAAE;AAAA,IACxD,UAAU,EAAE,MAAM,WAAW,SAAS,GAAG,SAAS,GAAG;AAAA,IACrD,UAAU,EAAE,MAAM,UAAU,aAAa,6CAA6C;AAAA,IACtF,QAAQ,EAAE,MAAM,SAAS;AAAA,IACzB,QAAQ,EAAE,MAAM,SAAS;AAAA,EAC1B;AAAA,EACA,sBAAsB;AACvB;AAEA,IAAM,OAAO;AAAA,EACZ,MAAM;AAAA,EACN,YAAY;AAAA,IACX,MAAM,EAAE,MAAM,UAAU;AAAA,IACxB,OAAO,EAAE,MAAM,SAAS;AAAA,IACxB,KAAK,EAAE,MAAM,CAAC,UAAU,MAAM,GAAG,aAAa,4CAA4C;AAAA,IAC1F,KAAK,EAAE,MAAM,CAAC,UAAU,MAAM,GAAG,aAAa,4CAA4C;AAAA,IAC1F,WAAW,EAAE,MAAM,UAAU;AAAA,IAC7B,QAAQ;AAAA,EACT;AAAA,EACA,sBAAsB;AACvB;AAEA,IAAM,SAAS;AAAA,EACd,MAAM;AAAA,EACN,YAAY;AAAA,IACX,IAAI,EAAE,MAAM,SAAS;AAAA,IACrB,MAAM,EAAE,MAAM,SAAS;AAAA,IACvB,QAAQ,EAAE,MAAM,SAAS,OAAO,OAAO,aAAa,0BAA0B;AAAA,IAC9E,OAAO,EAAE,MAAM,UAAU,aAAa,cAAc;AAAA,IACpD,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,kBAAkB,GAAG,aAAa,+CAA+C;AAAA,IACnH,QAAQ,EAAE,MAAM,UAAU;AAAA,EAC3B;AAAA,EACA,UAAU,CAAC,QAAQ,QAAQ;AAAA,EAC3B,sBAAsB;AACvB;AAQO,SAAS,oBAAoB,YAA6B,UAA+B,CAAC,GAAkB;AAClH,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,OAAO,EAAE,OAAO,QAAQ,SAAS,SAAS,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC,EAAG;AACnG,QAAM,YAAY,MAAM,WAAW,QAAQ,EAAE,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE;AACnE,QAAM,gBAAgB,CAAC,QAAgB;AACtC,UAAM,OAAO,WAAW,QAAQ;AAChC,UAAM,SAAS,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,KAAK,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG;AAC9F,QAAI,CAAC,OAAQ,CAAAA,MAAK,uBAAuB,GAAG,sBAAsB,UAAU,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,YAAY,GAAG;AAClI,WAAO;AAAA,EACR;AACA,QAAM,kBAAkB,CAAC,QAAyB;AACjD,UAAM,aAAa,WAAW,QAAQ,EAAE;AACxC,UAAM,QAAQ,OAAO,QAAQ,WAAW,MAAM,WAAW,QAAQ,GAAG;AACpE,QAAI,QAAQ,KAAK,SAAS,WAAW,UAAU,CAAC,OAAO,UAAU,KAAK,EAAG,CAAAA,MAAK,wBAAwB,KAAK,UAAU,GAAG,CAAC,iCAAiC,WAAW,SAAS,CAAC,wBAAwB;AACvM,WAAO;AAAA,EACR;AAEA,SAAO;AAAA,IACN;AAAA,MACC,GAAG;AAAA,MACH,IAAI,GAAG,MAAM;AAAA,MACb,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU,CAAC,SAAS,QAAQ,QAAQ,KAAK;AAAA,MACzC,aAAa;AAAA,MACb,KAAK,MAAM;AACV,cAAM,OAAO,WAAW,QAAQ;AAChC,eAAO,EAAE,MAAM,WAAW,OAAO,GAAG,OAAO,iBAAiB,IAAI,GAAG,QAAQ,WAAW,SAAS,EAAE,OAAO;AAAA,MACzG;AAAA,IACD;AAAA,IACA;AAAA,MACC,GAAG;AAAA,MACH,IAAI,GAAG,MAAM;AAAA,MACb,OAAO;AAAA,MACP,UAAU,CAAC,SAAS,SAAS,QAAQ,UAAU,SAAS,SAAS,QAAQ;AAAA,MACzE,aAAa;AAAA,MACb,QAAQ;AAAA,QACP,MAAM;AAAA,QACN,YAAY;AAAA,UACX,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,WAAW,EAAE;AAAA,UAC/C,OAAO,EAAE,MAAM,SAAS;AAAA,UACxB,UAAU,EAAE,MAAM,SAAS;AAAA,UAC3B,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ,EAAE,MAAM,UAAU,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,GAAG,UAAU,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,sBAAsB,EAAE,EAAE,GAAG,sBAAsB,MAAM;AAAA,UAClK,UAAU,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,eAAe,EAAE;AAAA,UACvD,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,kBAAkB,EAAE;AAAA,UAC7D,OAAO,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,YAAY,EAAE;AAAA,UACjD,QAAQ,EAAE,MAAM,UAAU;AAAA,UAC1B,YAAY,EAAE,MAAM,UAAU;AAAA,UAC9B,SAAS,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,GAAG,UAAU,EAAE;AAAA,UACjE,aAAa,EAAE,MAAM,UAAU,SAAS,GAAG,SAAS,IAAI;AAAA,QACzD;AAAA,QACA,sBAAsB;AAAA,MACvB;AAAA,MACA,KAAK,CAAC,MAAe,WAA2B;AAC/C,cAAM,WAAW,OAAO,MAAM,CAAC;AAC/B,eAAO,EAAE,MAAM,WAAW,OAAO,EAAE;AAAA,MACpC;AAAA,IACD;AAAA,IACA;AAAA,MACC,GAAG;AAAA,MACH,IAAI,GAAG,MAAM;AAAA,MACb,OAAO;AAAA,MACP,UAAU,CAAC,SAAS,QAAQ,UAAU,YAAY;AAAA,MAClD,aAAa;AAAA,MACb,QAAQ;AAAA,QACP,MAAM;AAAA,QACN,YAAY;AAAA,UACX,YAAY,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,UACvD,QAAQ,EAAE,MAAM,SAAS,OAAO,OAAO;AAAA,QACxC;AAAA,QACA,sBAAsB;AAAA,MACvB;AAAA,MACA,KAAK,CAAC,MAAe,WAAsD;AAC1E,cAAM,WAAW,QAAQ,MAAM,CAAC;AAChC,eAAO,EAAE,OAAO,iBAAiB,WAAW,QAAQ,CAAC,EAAE;AAAA,MACxD;AAAA,IACD;AAAA,IACA;AAAA,MACC,GAAG;AAAA,MACH,IAAI,GAAG,MAAM;AAAA,MACb,OAAO;AAAA,MACP,UAAU,CAAC,SAAS,SAAS,QAAQ,MAAM;AAAA,MAC3C,aAAa;AAAA,MACb,QAAQ;AAAA,QACP,MAAM;AAAA,QACN,YAAY;AAAA,UACX,OAAO;AAAA,YACN,MAAM;AAAA,YACN,UAAU;AAAA,YACV,OAAO;AAAA,cACN,MAAM;AAAA,cACN,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,GAAG,UAAU,EAAE,MAAM,CAAC,UAAU,SAAS,EAAE,GAAG,OAAO,MAAM;AAAA,cAClG,UAAU,CAAC,UAAU,YAAY,OAAO;AAAA,cACxC,sBAAsB;AAAA,YACvB;AAAA,UACD;AAAA,QACD;AAAA,QACA,UAAU,CAAC,OAAO;AAAA,MACnB;AAAA,MACA,KAAK,CAAC,MAAe,WAAuF;AAC3G,cAAM,WAAW,UAAU,OAAO,MAAM,IAAI,CAAC,OAAO,EAAE,UAAU,cAAc,EAAE,MAAM,EAAE,IAAI,OAAO,gBAAgB,EAAE,QAAQ,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;AACnJ,eAAO,EAAE,OAAO,iBAAiB,WAAW,QAAQ,CAAC,EAAE;AAAA,MACxD;AAAA,IACD;AAAA,IACA;AAAA,MACC,GAAG;AAAA,MACH,IAAI,GAAG,MAAM;AAAA,MACb,OAAO;AAAA,MACP,UAAU,CAAC,SAAS,UAAU,KAAK;AAAA,MACnC,aAAa;AAAA,MACb,QAAQ,EAAE,MAAM,UAAU,YAAY,EAAE,GAAG,OAAO,YAAY,IAAI,EAAE,MAAM,WAAW,SAAS,EAAE,EAAE,GAAG,sBAAsB,MAAM;AAAA,MACjI,KAAK,CAAC,MAAe,SAA6D,CAAC,MAAM;AACxF,cAAM,EAAE,IAAI,GAAG,MAAM,IAAI,UAAU,CAAC;AACpC,cAAM,SAAS,WAAW,UAAU,OAAc,EAAE,GAAG,CAAC;AACxD,cAAM,MAAM;AACZ,eAAO,EAAE,IAAK,OAA0B,GAAG;AAAA,MAC5C;AAAA,IACD;AAAA,IACA;AAAA,MACC,GAAG;AAAA,MACH,IAAI,GAAG,MAAM;AAAA,MACb,OAAO;AAAA,MACP,UAAU,CAAC,SAAS,UAAU,UAAU,UAAU,SAAS,MAAM;AAAA,MACjE,aAAa;AAAA,MACb,QAAQ;AAAA,QACP,MAAM;AAAA,QACN,YAAY;AAAA,UACX,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,UAC5D,MAAM,EAAE,MAAM,SAAS;AAAA,UACvB,OAAO,EAAE,MAAM,CAAC,UAAU,MAAM,EAAE;AAAA,UAClC,MAAM,EAAE,MAAM,CAAC,UAAU,MAAM,GAAG,MAAM,CAAC,GAAG,oBAAoB,IAAI,EAAE;AAAA,UACtE,QAAQ,EAAE,MAAM,UAAU;AAAA,QAC3B;AAAA,QACA,UAAU,CAAC,QAAQ;AAAA,QACnB,sBAAsB;AAAA,MACvB;AAAA,MACA,KAAK,CAAC,MAAe,WAAmG;AACvH,cAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,cAAM,KAAK,cAAc,MAAM,EAAE;AACjC,cAAM,WAAW,aAAa,IAAI,KAAK,CAAC;AACxC,eAAO,EAAE,QAAQ,WAAW,UAAU,EAAE,EAAE;AAAA,MAC3C;AAAA,IACD;AAAA,IACA;AAAA,MACC,GAAG;AAAA,MACH,IAAI,GAAG,MAAM;AAAA,MACb,OAAO;AAAA,MACP,UAAU,CAAC,SAAS,UAAU,QAAQ;AAAA,MACtC,aAAa;AAAA,MACb,QAAQ,EAAE,MAAM,UAAU,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,EAAE,GAAG,UAAU,CAAC,QAAQ,GAAG,sBAAsB,MAAM;AAAA,MACxH,KAAK,CAAC,MAAe,WAA+B;AACnD,cAAM,WAAW,aAAa,cAAc,OAAO,MAAM,EAAE,EAAE,CAAC;AAC9D,eAAO,EAAE,QAAQ,UAAU,EAAE;AAAA,MAC9B;AAAA,IACD;AAAA,IACA;AAAA,MACC,GAAG;AAAA,MACH,IAAI,GAAG,MAAM;AAAA,MACb,OAAO;AAAA,MACP,UAAU,CAAC,SAAS,YAAY,OAAO,OAAO;AAAA,MAC9C,aAAa;AAAA,MACb,QAAQ,EAAE,MAAM,UAAU,YAAY,EAAE,OAAO,EAAE,MAAM,SAAS,GAAG,IAAI,EAAE,MAAM,WAAW,SAAS,EAAE,EAAE,GAAG,sBAAsB,MAAM;AAAA,MACtI,KAAK,CAAC,MAAe,SAA0C,CAAC,MAAM,WAAW,YAAY,QAAQ,OAAO,EAAE,IAAI,QAAQ,GAAG,CAAC;AAAA,IAC/H;AAAA,IACA;AAAA,MACC,GAAG;AAAA,MACH,IAAI,GAAG,MAAM;AAAA,MACb,OAAO;AAAA,MACP,UAAU,CAAC,SAAS,YAAY,OAAO,QAAQ;AAAA,MAC/C,aAAa;AAAA,MACb,QAAQ,EAAE,MAAM,UAAU,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,SAAS,EAAE,EAAE,GAAG,UAAU,CAAC,UAAU,GAAG,sBAAsB,MAAM;AAAA,MACzI,KAAK,CAAC,MAAe,WAA0C;AAC9D,cAAM,WAAW,eAAe,gBAAgB,OAAO,QAAQ,CAAC,CAAC;AACjE,eAAO,EAAE,YAAY,WAAW,QAAQ,EAAE,WAAW;AAAA,MACtD;AAAA,IACD;AAAA,IACA;AAAA,MACC,GAAG;AAAA,MACH,IAAI,GAAG,MAAM;AAAA,MACb,OAAO;AAAA,MACP,UAAU,CAAC,SAAS,OAAO,OAAO,SAAS,QAAQ;AAAA,MACnD,aAAa;AAAA,MACb,QAAQ;AAAA,QACP,MAAM;AAAA,QACN,YAAY;AAAA,UACX,KAAK,EAAE,MAAM,SAAS;AAAA,UACtB,UAAU,EAAE,MAAM,UAAU,MAAM,CAAC,WAAW,MAAM,EAAE;AAAA,UACtD,QAAQ,EAAE,MAAM,UAAU;AAAA,QAC3B;AAAA,QACA,UAAU,CAAC,KAAK;AAAA,QAChB,sBAAsB;AAAA,MACvB;AAAA,MACA,KAAK,CAAC,MAAe,WAA6E;AACjG,cAAM,SAAS,WAAW,UAAU,OAAO,KAAK,EAAE,UAAU,OAAO,UAAU,QAAQ,OAAO,OAAO,CAAC;AACpG,cAAM,MAAM;AACZ,eAAO,EAAE,OAAO,iBAAiB,WAAW,QAAQ,CAAC,GAAG,QAAQ,OAAO,UAAU,CAAC,EAAE;AAAA,MACrF;AAAA,IACD;AAAA,IACA;AAAA,MACC,GAAG;AAAA,MACH,IAAI,GAAG,MAAM;AAAA,MACb,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU,CAAC,SAAS,OAAO,UAAU,OAAO;AAAA,MAC5C,aAAa;AAAA,MACb,QAAQ,EAAE,MAAM,UAAU,YAAY,EAAE,OAAO,EAAE,MAAM,UAAU,SAAS,GAAG,GAAG,QAAQ,EAAE,MAAM,UAAU,SAAS,GAAG,EAAE,GAAG,sBAAsB,MAAM;AAAA,MACvJ,KAAK,CAAC,MAAe,SAA8C,CAAC,OAAO;AAAA,QAC1E,KAAK,WAAW,WAAW,QAAQ,GAAU,EAAE,OAAO,QAAQ,SAAS,KAAK,QAAQ,QAAQ,UAAU,IAAI,CAAC;AAAA,MAC5G;AAAA,IACD;AAAA,IACA;AAAA,MACC,GAAG;AAAA,MACH,IAAI,GAAG,MAAM;AAAA,MACb,OAAO;AAAA,MACP,UAAU,CAAC,SAAS,MAAM;AAAA,MAC1B,SAAS,MAAM,WAAW,SAAS,EAAE,WAAW;AAAA,MAChD,KAAK,OAAO,EAAE,QAAQ,WAAW,KAAK,EAAE;AAAA,IACzC;AAAA,IACA;AAAA,MACC,GAAG;AAAA,MACH,IAAI,GAAG,MAAM;AAAA,MACb,OAAO;AAAA,MACP,UAAU,CAAC,SAAS,MAAM;AAAA,MAC1B,SAAS,MAAM,WAAW,SAAS,EAAE,WAAW;AAAA,MAChD,KAAK,OAAO,EAAE,QAAQ,WAAW,KAAK,EAAE;AAAA,IACzC;AAAA,EACD;AACD;;;ACpSO,SAAS,mBAAmB,OAA6C,KAAmE,SAAiB,SAA2C;AAC9M,QAAM,KAAK,IAAI,QAAQ,MAAM,QAAQ,IAAI,QAAQ;AACjD,QAAM,KAAK,IAAI,SAAS,MAAM,SAAS,IAAI,SAAS;AACpD,SAAO,EAAE,IAAI,UAAU,IAAI,QAAQ,IAAI,IAAI,UAAU,IAAI,OAAO,GAAG;AACpE;AAGO,SAAS,kBAAkB,YAA6B,OAAmB,QAA0F;AAC3K,MAAI,QAAQ,SAAS,WAAW,CAAC,MAAM,cAAc,MAAM,QAAS,QAAO;AAC3E,QAAM,OAAO,WAAW,QAAQ;AAChC,MAAI,CAAC,iBAAiB,KAAK,IAAI,EAAG,QAAO;AACzC,QAAM,SAAS,WAAW,UAAU,OAAO,QAAQ;AACnD,SAAO,CAAC,CAAC,UAAU,CAAC,OAAO,UAAU,OAAO,OAAO,OAAO,KAAK,MAAM;AACtE;AAoBO,SAAS,oBAAoB,YAA6B,OAAmB,QAAoC,OAAiC,UAA6B,CAAC,GAA0B;AAChN,MAAI,CAAC,kBAAkB,YAAY,OAAO,MAAM,EAAG,QAAO;AAC1D,QAAM,EAAE,UAAU,MAAM,IAAI;AAC5B,QAAM,aAAa,WAAW,UAAU,QAAQ,EAAG,OAAO,KAAK,KAAK;AACpE,QAAM,UAAU,kBAAkB,OAAO,KAAK;AAC9C,MAAI,YAAY,OAAW,QAAO;AAClC,aAAW,aAAa,QAAQ,QAAQ,IAAI,KAAK,EAAE;AACnD,MAAI,QAAQ;AACZ,QAAM,CAAC,KAAK,GAAG,IAAI,MAAM,WAAY;AACrC,SAAO;AAAA,IACN,aAAa,EAAE,KAAK,IAAI;AAAA,IACxB,KAAK,OAAO;AACX,UAAI,MAAO;AACX,YAAM,KAAK,kBAAkB,OAAO,KAAK;AACzC,UAAI,OAAO,OAAW;AACtB,iBAAW,SAAS,UAAU,OAAO,eAAe,OAAO,cAAc,KAAK,UAAU,QAAQ,IAAI,GAAG,EAAE,OAAO,QAAQ,WAAW,UAAU,QAAQ,GAAG,QAAQ,OAAO,GAAG,CAAC;AAAA,IAC5K;AAAA,IACA,MAAM;AACL,UAAI,MAAO;AACX,cAAQ;AACR,iBAAW,WAAW;AAAA,IACvB;AAAA,EACD;AACD;AAgBO,SAAS,eAAe,YAA6B,OAA0B,OAA+B;AACpH,MAAI,MAAM,WAAW,MAAM,WAAW,MAAM,OAAQ,QAAO;AAC3D,QAAM,EAAE,WAAW,KAAK,IAAI,WAAW,SAAS;AAChD,UAAQ,MAAM,KAAK;AAAA,IAClB,KAAK;AACJ,UAAI,CAAC,UAAW,QAAO;AACvB,iBAAW,OAAO,IAAI;AACtB,aAAO;AAAA,IACR,KAAK;AAAA,IACL,KAAK;AACJ,UAAI,CAAC,aAAa,UAAU,SAAS,QAAS,QAAO;AACrD,iBAAW,gBAAgB;AAC3B,aAAO;AAAA,IACR,KAAK;AAAA,IACL,KAAK,cAAc;AAClB,UAAI,WAAW,SAAS,WAAW,WAAW,SAAS,WAAY,QAAO;AAC1E,YAAM,IAAI,KAAK,WAAW;AAC1B,YAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,UAAU,SAAS,MAAM,QAAQ,eAAe,IAAI,GAAG,CAAC;AAClG,iBAAW,OAAO,EAAE,GAAG,WAAW,MAAM,CAAC;AACzC,aAAO;AAAA,IACR;AAAA,IACA,KAAK;AAAA,IACL,KAAK,aAAa;AACjB,UAAI,WAAW,SAAS,WAAW,OAAO,QAAS,QAAO;AAC1D,YAAM,QAAQ,OAAO,YAAY,SAAS,CAAC;AAC3C,YAAM,OAAO,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI;AACtD,YAAM,SAAS,MAAM,WAAW,OAAO,OAAO,OAAO,MAAM,QAAQ,YAAY,IAAI;AACnF,iBAAW,WAAW,UAAU,UAAU,UAAU,OAAO,KAAK;AAChE,aAAO;AAAA,IACR;AAAA,IACA;AACC,aAAO;AAAA,EACT;AACD;AAGO,SAAS,uBAAuB,YAA6B,YAAmC,WAAW,SAAS,EAAE,WAAmB;AAC/I,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,OAAO,WAAW,QAAQ;AAChC,UAAQ,UAAU,MAAM;AAAA,IACvB,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO,UAAU,SAAS,MAAM,kBAAkB;AAAA,IACnD,KAAK;AACJ,aAAO,WAAW,WAAW,UAAU,UAAU,QAAQ,GAAG,QAAQ,UAAU,QAAQ;AAAA,IACvF,KAAK;AACJ,aAAO,aAAa,KAAK,WAAW,UAAU,KAAK,KAAK,UAAU,KAAK;AAAA,IACxE,KAAK,SAAS;AACb,YAAM,SAAS,WAAW,UAAU,UAAU,QAAQ;AACtD,YAAM,QAAQ,QAAQ,OAAO,UAAU,KAAK;AAC5C,aAAO,GAAG,QAAQ,QAAQ,UAAU,QAAQ,SAAM,KAAK,WAAW,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,SAAS,OAAO;AAAA,IAC3H;AAAA,EACD;AACD;","names":["text","width","n","text","band","text","text","fail"]}
|
|
1
|
+
{"version":3,"sources":["../../src/chart/recommend.ts","../../src/chart/commands.ts","../../src/chart/interaction.ts","../../src/chart/tools.ts","../../src/chart/stream.ts","../../src/chart/presence.ts"],"sourcesContent":["// Ported from gridcraft-main/crates/engine/src/cmd/insert.rs (`series_from_range`, `scatter_x_from_first`,\n// `recommend_charts`) (MIT OR Apache-2.0, © ArtCraft Team and contributors), extended for the chart types\n// this editor adds. See THIRD_PARTY_NOTICES.md.\nimport { parseChartDate } from './date.js';\nimport { chartDataFromTable, parseChartValue } from './spec.js';\nimport type { ChartIssue, ChartSeries, ChartStacking, ChartType } from './types.js';\n\nexport interface ChartTableShape {\n\t/** The first row holds series names (some text, every value cell text or blank). */\n\theaderRow: boolean;\n\t/** The first column holds category labels (all text, or a blank top-left cell above a header row). */\n\tlabelColumn: boolean;\n\t/** Series run along rows (the block is much wider than tall). */\n\tbyRows: boolean;\n\tseries: number;\n\t/** Points per series. */\n\tpoints: number;\n\tanyNumber: boolean;\n\tnonNegative: boolean;\n\tmixedSigns: boolean;\n\t/** The category labels read as dates. */\n\tdates: boolean;\n}\n\nconst blank = (c: unknown) => c === null || c === undefined || String(c).trim() === '';\nconst isText = (c: unknown) => blank(c) || parseChartValue(c) === undefined;\n\n/**\n * Reads the shape of a block of cells the way spreadsheets do: a header row when the first\n * row is text, a label column when the first column is text (or the top-left cell is blank\n * above a header row, the convention for years and x values), and series along the longer side.\n */\nexport function analyzeChartTable(rows: ReadonlyArray<ReadonlyArray<unknown>>): ChartTableShape {\n\tconst grid = rows.filter((r) => r.some((c) => !blank(c)));\n\tconst height = grid.length;\n\tconst width = Math.max(0, ...grid.map((r) => r.length));\n\tconst cell = (r: number, c: number) => grid[r]?.[c];\n\tconst headerRow = height > 1 && grid[0].some((c) => !blank(c) && isText(c)) && Array.from({ length: width - 1 }, (_, i) => i + 1).every((c) => isText(cell(0, c)));\n\tconst blankCorner = headerRow && blank(cell(0, 0));\n\tconst labelColumn = width > 1 && (blankCorner || Array.from({ length: height - (headerRow ? 1 : 0) }, (_, i) => i + (headerRow ? 1 : 0)).every((r) => isText(cell(r, 0))));\n\tconst byRows = width > height + 1;\n\tconst dataRows = height - (headerRow ? 1 : 0);\n\tconst dataCols = width - (labelColumn ? 1 : 0);\n\tlet anyNumber = false;\n\tlet nonNegative = true;\n\tlet anyNegative = false;\n\tlet anyPositive = false;\n\tfor (let r = headerRow ? 1 : 0; r < height; r++)\n\t\tfor (let c = labelColumn ? 1 : 0; c < width; c++) {\n\t\t\tconst v = parseChartValue(cell(r, c));\n\t\t\tif (typeof v !== 'number') continue;\n\t\t\tanyNumber = true;\n\t\t\tif (v < 0) {\n\t\t\t\tnonNegative = false;\n\t\t\t\tanyNegative = true;\n\t\t\t} else if (v > 0) anyPositive = true;\n\t\t}\n\tconst labels = byRows ? grid[0]?.slice(labelColumn ? 1 : 0) ?? [] : grid.slice(headerRow ? 1 : 0).map((r) => r[0]);\n\tconst dates = (byRows ? headerRow : labelColumn) && labels.length > 1 && labels.filter((l) => !blank(l) && parseChartDate(String(l)) !== null).length >= labels.length * 0.8;\n\treturn {\n\t\theaderRow,\n\t\tlabelColumn,\n\t\tbyRows,\n\t\tseries: Math.max(0, byRows ? dataRows : dataCols),\n\t\tpoints: Math.max(0, byRows ? dataCols : dataRows),\n\t\tanyNumber,\n\t\tnonNegative,\n\t\tmixedSigns: anyNegative && anyPositive,\n\t\tdates\n\t};\n}\n\nexport interface ChartRecommendation {\n\ttype: ChartType;\n\tstacking?: ChartStacking;\n\tlabel: string;\n\t/** Why it suits the data, as a sentence. */\n\treason: string;\n}\n\n/**\n * Chart types that suit the shape of a block of cells, best first. A heuristic from the shape\n * (series count, points per series, text or date categories, negative values), not a copy of\n * any spreadsheet's ranking.\n */\nexport function recommendChartTypes(rows: ReadonlyArray<ReadonlyArray<unknown>>): ChartRecommendation[] {\n\tconst shape = analyzeChartTable(rows);\n\tif (!shape.anyNumber || !shape.series) return [];\n\treturn recommendForShape(shape);\n}\n\nexport function recommendForShape(shape: Omit<ChartTableShape, 'headerRow' | 'byRows'> & Partial<ChartTableShape>): ChartRecommendation[] {\n\tconst out: ChartRecommendation[] = [];\n\tconst add = (type: ChartType, label: string, reason: string, stacking?: ChartStacking) => out.push({ type, label, reason, ...(stacking ? { stacking } : {}) });\n\tif (shape.series === 2 && !shape.labelColumn && !shape.byRows) {\n\t\tadd('scatter', 'Scatter', 'Two numeric columns without labels: the first is x, the second y.');\n\t\tadd('line', 'Line', 'Shows the second column in order.');\n\t\tadd('bar', 'Column', 'Compares the values side by side.');\n\t\treturn out;\n\t}\n\tif (shape.series === 1 && !shape.labelColumn && shape.points > 20) {\n\t\tadd('histogram', 'Histogram', 'Many unlabelled values: shows how they are distributed.');\n\t\tadd('box', 'Box plot', 'Summarises the spread: quartiles, median and outliers.');\n\t\tadd('line', 'Line', 'Shows the values in order.');\n\t\treturn out;\n\t}\n\tif (shape.dates) {\n\t\tadd('line', 'Line', 'The categories are dates: a line shows change over time.');\n\t\tadd('area', 'Area', 'Shows change over time with volume.');\n\t\tadd('bar', 'Column', 'Compares each period.');\n\t\tif (shape.series > 1) add('area', 'Stacked area', 'Shows how the parts add up over time.', 'stacked');\n\t\treturn out;\n\t}\n\tif (shape.series === 1) {\n\t\tif (shape.points > 12) {\n\t\t\tadd('line', 'Line', 'One long series: a line shows its shape.');\n\t\t\tadd('bar', 'Column', 'Compares every value.');\n\t\t\tadd('area', 'Area', 'Emphasises the volume under the series.');\n\t\t} else {\n\t\t\tadd('bar', 'Column', 'One short series: columns compare the values.');\n\t\t\tif (shape.mixedSigns) add('waterfall', 'Waterfall', 'Positive and negative values: shows how they add up to a total.');\n\t\t\tadd('bar', 'Bar', 'Horizontal bars fit long category names.');\n\t\t\tif (shape.nonNegative && shape.points >= 2) {\n\t\t\t\tadd('pie', 'Pie', 'Shares of a whole (all values are positive).');\n\t\t\t\tadd('donut', 'Donut', 'Shares of a whole with the total in the middle.');\n\t\t\t\tif (shape.points >= 5) add('treemap', 'Treemap', 'Compares many shares by area.');\n\t\t\t\tadd('funnel', 'Funnel', 'Shows stages that narrow down.');\n\t\t\t}\n\t\t\tadd('line', 'Line', 'Shows the values in order.');\n\t\t}\n\t\treturn out;\n\t}\n\tif (shape.points > 12) {\n\t\tadd('line', 'Line', 'Several long series: lines keep them readable.');\n\t\tadd('bar', 'Column', 'Compares the series at each category.');\n\t\tadd('area', 'Area', 'Emphasises volume.');\n\t\tadd('bar', 'Stacked column', 'Shows how the series add up.', 'stacked');\n\t} else {\n\t\tadd('bar', 'Column', 'Several series: clustered columns compare them per category.');\n\t\tadd('bar', 'Bar', 'Horizontal bars fit long category names.');\n\t\tadd('bar', 'Stacked column', 'Shows how the series add up.', 'stacked');\n\t\tadd('line', 'Line', 'Shows the series in order.');\n\t\tif (shape.points >= 3 && shape.series <= 6) add('radar', 'Radar', 'Compares several measures across the series.');\n\t}\n\treturn out;\n}\n\nexport interface ChartFromTable {\n\ttype: ChartType;\n\tstacking: ChartStacking;\n\tcategories: string[];\n\tseries: ChartSeries[];\n\tissues: ChartIssue[];\n\tshape: ChartTableShape;\n}\n\n/**\n * Builds chart data from a block of cells (CSV, a clipboard grid or a spreadsheet range) using\n * the spreadsheet conventions of `analyzeChartTable`. `type: 'auto'` (the default) takes the\n * first recommendation. A scatter chart of a block without labels takes the first column as\n * the x values of the others.\n */\nexport function chartFromTable(rows: ReadonlyArray<ReadonlyArray<unknown>>, options: { type?: ChartType | 'auto' } = {}): ChartFromTable {\n\tconst shape = analyzeChartTable(rows);\n\tconst rec = (options.type ?? 'auto') === 'auto' ? recommendForShape(shape)[0] : undefined;\n\tconst type = rec?.type ?? (options.type === 'auto' || !options.type ? 'bar' : options.type);\n\tconst stacking = rec?.stacking ?? 'none';\n\tconst grid = rows.filter((r) => r.some((c) => !blank(c))).map((r) => [...r]);\n\t// Without a header row, invent one so chartDataFromTable reads every row as data.\n\tconst width = Math.max(0, ...grid.map((r) => r.length));\n\tlet table = grid;\n\tif (!shape.labelColumn) table = table.map((r, i) => [shape.headerRow && i === 0 ? '' : String(i + (shape.headerRow ? 0 : 1)), ...r]);\n\tif (!shape.headerRow) table = [['', ...Array.from({ length: width }, (_, i) => `Series ${i + 1}`)], ...table];\n\tconst xFromFirst = type === 'scatter' && !shape.labelColumn && !shape.byRows && shape.series > 1;\n\tif (xFromFirst) {\n\t\t// The first data column becomes x: move it into the label column.\n\t\ttable = table.map((r) => [r[1], ...r.slice(2)]);\n\t}\n\tconst data = chartDataFromTable(table, { seriesIn: shape.byRows ? 'rows' : 'columns', header: true, xFromFirstColumn: xFromFirst });\n\treturn { type, stacking, categories: data.categories, series: data.series, issues: data.issues, shape };\n}\n","import type { CommandSpec } from '../commands/registry.js';\nimport { parseCsv } from '../spreadsheet/csv.js';\nimport { checkChartColors } from './color.js';\nimport type { ChartController, ChartSpecPatch } from './controller.js';\nimport { chartFromMermaid, chartToMermaid } from './mermaid.js';\nimport { chartToOoxml } from './ooxml.js';\nimport { CHART_COLOR_SCHEMES, CHART_LAYOUT_PRESETS } from './presets.js';\nimport { recommendChartTypes } from './recommend.js';\nimport { CATEGORY_REF, CHART_UPDATE_PROPERTIES, HEIGHT, SERIES_PROPS, SERIES_REF, TRENDLINE_PROPS, VALUE, WIDTH } from './schemas.js';\nimport { chartColorsByCategory, chartDataToTable, chartSeriesColor, chartSliceColor } from './spec.js';\nimport { summarizeChart } from './summary.js';\nimport { chartToSvg } from './svg.js';\nimport type { ChartTrendline } from './types.js';\n\nexport interface ChartCommandOptions {\n\t/** Id prefix (default `chart.`); use one per chart when several are registered. */\n\tprefix?: string;\n\t/** Palette group (default `Chart`). */\n\tgroup?: string;\n\t/** Command scope. Omit for global commands. */\n\tscope?: string;\n}\n\nconst fail = (message: string): never => {\n\tthrow new Error(message);\n};\n\nconst check = (result: { ok: boolean; message?: string }) => {\n\tif (!result.ok) fail(result.message ?? 'The change was rejected.');\n};\n\n/**\n * Palette and agent commands for a chart: describe, update presentation, replace data, set\n * values, add / remove series, categories and trendlines, apply presets, switch rows and\n * columns, import CSV or Mermaid, export SVG, Mermaid or Office XML, recommend types and\n * check colours. Register them in a `CommandRegistry` and agents get them through\n * `createCommandToolProvider`; `createChartToolProvider` offers the same operations as\n * individual tools. Failures throw sentences, which the registry returns as\n * `{ ok: false, code: 'failed', message }`.\n */\nexport function createChartCommands(controller: ChartController, options: ChartCommandOptions = {}): CommandSpec[] {\n\tconst prefix = options.prefix ?? 'chart.';\n\tconst base = { group: options.group ?? 'Chart', ...(options.scope ? { scope: options.scope } : {}) };\n\tconst seriesIds = () => controller.getSpec().series.map((s) => s.id);\n\tconst resolveSeries = (ref: string) => {\n\t\tconst spec = controller.getSpec();\n\t\tconst series = spec.series.find((s) => s.id === ref) ?? spec.series.find((s) => s.name === ref);\n\t\tif (!series) fail(`There is no series \"${ref}\"; expected one of ${seriesIds().map((id) => `\"${id}\"`).join(', ') || '(none yet)'}.`);\n\t\treturn series!;\n\t};\n\tconst resolveCategory = (ref: string | number) => {\n\t\tconst categories = controller.getSpec().categories;\n\t\tconst index = typeof ref === 'number' ? ref : categories.indexOf(ref);\n\t\tif (index < 0 || index >= categories.length || !Number.isInteger(index)) fail(`There is no category ${JSON.stringify(ref)}; expected an index from 0 to ${categories.length - 1} or one of the labels.`);\n\t\treturn index;\n\t};\n\tconst object = (properties: Record<string, unknown>, required?: string[]) => ({ type: 'object' as const, properties, ...(required ? { required } : {}), additionalProperties: false }) as any;\n\n\treturn [\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}describe`,\n\t\t\tlabel: 'Describe Chart',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'data', 'spec', 'get', 'summary'],\n\t\t\tdescription: 'Returns the chart spec, its data as a table (series names in the header row) and a summary: per-series min / max / mean / trend, axes as drawn, layout warnings and a colour check.',\n\t\t\tparams: object({ width: WIDTH, height: HEIGHT }),\n\t\t\trun: (_ctx: unknown, params: { width?: number; height?: number } = {}) => {\n\t\t\t\tconst spec = controller.getSpec();\n\t\t\t\treturn { spec: controller.toJSON(), table: chartDataToTable(spec), summary: summarizeChart(controller.toJSON(), { width: params?.width ?? 640, height: params?.height ?? 400 }), issues: controller.getState().issues };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}update`,\n\t\t\tlabel: 'Change Chart…',\n\t\t\tkeywords: ['chart', 'title', 'axis', 'legend', 'stack', 'style', 'format', 'type'],\n\t\t\tdescription:\n\t\t\t\t'Changes chart presentation as one undo step: type, titles, axes (xAxis = categories, yAxis = values, yAxis2 = secondary values), legend, stacking, orientation, curve, points, data labels, palette, donut hole, bar spacing, histogram bins or waterfall total. Invalid values change nothing and return why.',\n\t\t\tparams: object(CHART_UPDATE_PROPERTIES),\n\t\t\trun: (_ctx: unknown, params: ChartSpecPatch) => {\n\t\t\t\tcheck(controller.update(params));\n\t\t\t\treturn { spec: controller.toJSON() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}setData`,\n\t\t\tlabel: 'Replace Chart Data…',\n\t\t\tkeywords: ['chart', 'data', 'series', 'categories'],\n\t\t\tdescription: 'Replaces the categories and series as one undo step. Each series has one value per category (padded with gaps).',\n\t\t\tparams: object({\n\t\t\t\tcategories: { type: 'array', items: { type: 'string' }, description: 'Category labels in order.' },\n\t\t\t\tseries: { type: 'array', description: 'The new series.', items: object({ id: { type: 'string', description: 'Stable id (optional).' }, ...SERIES_PROPS }, ['name', 'values']) }\n\t\t\t}),\n\t\t\trun: (_ctx: unknown, params: { categories?: string[]; series?: any[] }) => {\n\t\t\t\tcheck(controller.setData(params));\n\t\t\t\treturn { table: chartDataToTable(controller.getSpec()) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}setValues`,\n\t\t\tlabel: 'Set Chart Values…',\n\t\t\tkeywords: ['chart', 'value', 'cell', 'edit'],\n\t\t\tdescription: 'Sets individual values as one undo step. Series by id or name; category by index or label.',\n\t\t\tparams: object({ cells: { type: 'array', minItems: 1, description: 'Values to set.', items: object({ series: SERIES_REF, category: CATEGORY_REF, value: VALUE }, ['series', 'category', 'value']) } }, ['cells']),\n\t\t\trun: (_ctx: unknown, params: { cells: { series: string; category: string | number; value: unknown }[] }) => {\n\t\t\t\tcheck(controller.setValues(params.cells.map((c) => ({ seriesId: resolveSeries(c.series).id, index: resolveCategory(c.category), value: c.value }))));\n\t\t\t\treturn { table: chartDataToTable(controller.getSpec()) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}addSeries`,\n\t\t\tlabel: 'Add Series',\n\t\t\tkeywords: ['chart', 'series', 'new'],\n\t\t\tdescription: 'Adds a series (default: an empty one at the end). Returns its id.',\n\t\t\tparams: object({ ...SERIES_PROPS, id: { type: 'string', description: 'Id to use (default series-N).' }, at: { type: 'integer', minimum: 0, description: 'Position (default: last).' } }),\n\t\t\trun: (_ctx: unknown, params: { at?: number; name?: string; values?: unknown[] } = {}) => {\n\t\t\t\tconst { at, ...input } = params ?? {};\n\t\t\t\tconst clean = Object.fromEntries(Object.entries(input).filter(([, v]) => v !== null));\n\t\t\t\tconst result = controller.addSeries(clean as any, { at });\n\t\t\t\tcheck(result);\n\t\t\t\treturn { id: (result as { id: string }).id };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}updateSeries`,\n\t\t\tlabel: 'Change Series…',\n\t\t\tkeywords: ['chart', 'series', 'rename', 'colour', 'color', 'hide', 'axis', 'marker'],\n\t\t\tdescription: 'Renames, recolours, hides, moves to the secondary axis or changes how a series is drawn (null resets a field).',\n\t\t\tparams: object({ series: SERIES_REF, ...Object.fromEntries(Object.entries(SERIES_PROPS).filter(([k]) => k !== 'values')) }, ['series']),\n\t\t\trun: (_ctx: unknown, params: { series: string } & Record<string, unknown>) => {\n\t\t\t\tconst { series, ...patch } = params;\n\t\t\t\tconst id = resolveSeries(series).id;\n\t\t\t\tcheck(controller.updateSeries(id, patch as any));\n\t\t\t\treturn { series: controller.getSeries(id) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}removeSeries`,\n\t\t\tlabel: 'Delete Series',\n\t\t\tkeywords: ['chart', 'series', 'remove'],\n\t\t\tdescription: 'Deletes a series by id or name.',\n\t\t\tparams: object({ series: SERIES_REF }, ['series']),\n\t\t\trun: (_ctx: unknown, params: { series: string }) => {\n\t\t\t\tcheck(controller.removeSeries(resolveSeries(params.series).id));\n\t\t\t\treturn { series: seriesIds() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}addCategory`,\n\t\t\tlabel: 'Add Category',\n\t\t\tkeywords: ['chart', 'category', 'row', 'label'],\n\t\t\tdescription: 'Inserts a category (gaps in every series) at `at` (default: the end).',\n\t\t\tparams: object({ label: { type: 'string', description: 'Category label (default: its number).' }, at: { type: 'integer', minimum: 0, description: 'Index to insert at (default: the end).' } }),\n\t\t\trun: (_ctx: unknown, params: { label?: string; at?: number } = {}) => controller.addCategory(params?.label, { at: params?.at })\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}removeCategory`,\n\t\t\tlabel: 'Delete Category',\n\t\t\tkeywords: ['chart', 'category', 'row', 'remove'],\n\t\t\tdescription: 'Deletes a category (and its values) by index or label.',\n\t\t\tparams: object({ category: CATEGORY_REF }, ['category']),\n\t\t\trun: (_ctx: unknown, params: { category: string | number }) => {\n\t\t\t\tcheck(controller.removeCategory(resolveCategory(params.category)));\n\t\t\t\treturn { categories: controller.getSpec().categories };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}addTrendline`,\n\t\t\tlabel: 'Add Trendline…',\n\t\t\tkeywords: ['chart', 'trend', 'regression', 'fit', 'forecast', 'moving average'],\n\t\t\tdescription: 'Fits a trendline to a series (linear, exponential, logarithmic, power, polynomial or moving average). Returns its index and the fit.',\n\t\t\tparams: object({ series: SERIES_REF, ...TRENDLINE_PROPS }, ['series', 'type']),\n\t\t\trun: (_ctx: unknown, params: { series: string } & ChartTrendline) => {\n\t\t\t\tconst { series, ...line } = params;\n\t\t\t\tconst result = controller.addTrendline(resolveSeries(series).id, line);\n\t\t\t\tcheck(result);\n\t\t\t\tconst ok = result as { index: number; fit: { coefficients: number[]; r2: number | null; equation: string } | null };\n\t\t\t\treturn { index: ok.index, ...(ok.fit ? { coefficients: ok.fit.coefficients, r2: ok.fit.r2, equation: ok.fit.equation } : {}) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}removeTrendline`,\n\t\t\tlabel: 'Delete Trendline',\n\t\t\tkeywords: ['chart', 'trend', 'remove'],\n\t\t\tdescription: 'Deletes a trendline from a series.',\n\t\t\tparams: object({ series: SERIES_REF, index: { type: 'integer', minimum: 0, description: 'Trendline index (0 = first).' } }, ['series', 'index']),\n\t\t\trun: (_ctx: unknown, params: { series: string; index: number }) => {\n\t\t\t\tcheck(controller.removeTrendline(resolveSeries(params.series).id, params.index));\n\t\t\t\treturn { trendlines: controller.getSeries(resolveSeries(params.series).id)?.trendlines ?? [] };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}applyPreset`,\n\t\t\tlabel: 'Apply Chart Style…',\n\t\t\tkeywords: ['chart', 'quick layout', 'style', 'colours', 'colors', 'monochrome', 'theme'],\n\t\t\tdescription: 'Applies a quick layout and / or colour scheme as one undo step.',\n\t\t\tparams: object({\n\t\t\t\tlayout: { type: 'string', enum: CHART_LAYOUT_PRESETS.map((p) => p.id), description: 'Quick layout id.' },\n\t\t\t\tcolors: { type: 'string', enum: CHART_COLOR_SCHEMES.map((p) => p.id), description: 'Colour scheme id.' }\n\t\t\t}),\n\t\t\trun: (_ctx: unknown, params: { layout?: string; colors?: string } = {}) => {\n\t\t\t\tcheck(controller.applyPreset(params ?? {}));\n\t\t\t\treturn { spec: controller.toJSON() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}transpose`,\n\t\t\tlabel: 'Switch Rows and Columns',\n\t\t\tkeywords: ['chart', 'transpose', 'swap', 'rows', 'columns', 'series'],\n\t\t\tdescription: 'Swaps series and categories as one undo step.',\n\t\t\trun: () => {\n\t\t\t\tcheck(controller.transpose());\n\t\t\t\treturn { table: chartDataToTable(controller.getSpec()) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}importCsv`,\n\t\t\tlabel: 'Import Chart Data from CSV…',\n\t\t\tkeywords: ['chart', 'csv', 'tsv', 'paste', 'import'],\n\t\t\tdescription: 'Replaces the data with CSV / TSV text: by default the first column holds categories and the first row series names.',\n\t\t\tparams: object(\n\t\t\t\t{\n\t\t\t\t\tcsv: { type: 'string', description: 'CSV or TSV text.' },\n\t\t\t\t\tseriesIn: { type: 'string', enum: ['columns', 'rows'], description: 'Series run down columns (default) or along rows.' },\n\t\t\t\t\theader: { type: ['boolean', 'string'], enum: [true, false, 'auto'], description: 'The first row holds series names (default true).' }\n\t\t\t\t},\n\t\t\t\t['csv']\n\t\t\t),\n\t\t\trun: (_ctx: unknown, params: { csv: string; seriesIn?: 'columns' | 'rows'; header?: boolean | 'auto' }) => {\n\t\t\t\tconst result = controller.importCsv(params.csv, { seriesIn: params.seriesIn, header: params.header });\n\t\t\t\tcheck(result);\n\t\t\t\treturn { table: chartDataToTable(controller.getSpec()), issues: result.issues ?? [] };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}importMermaid`,\n\t\t\tlabel: 'Import Mermaid Chart…',\n\t\t\tkeywords: ['chart', 'mermaid', 'markdown', 'xychart', 'pie', 'radar', 'import'],\n\t\t\tdescription: 'Replaces the chart with Mermaid xychart-beta, pie or radar-beta text (one undo step). Unreadable lines are listed with line numbers.',\n\t\t\tparams: object({ mermaid: { type: 'string', description: 'Mermaid text.' } }, ['mermaid']),\n\t\t\trun: (_ctx: unknown, params: { mermaid: string }) => {\n\t\t\t\tconst read = chartFromMermaid(params.mermaid);\n\t\t\t\tif (!read.family) fail(read.issues.map((i) => i.message).join(' ') || 'Expected Mermaid starting with xychart-beta, pie or radar-beta.');\n\t\t\t\tcheck(controller.update({ ...read.spec } as ChartSpecPatch, { label: 'Import Mermaid chart' }));\n\t\t\t\treturn { spec: controller.toJSON(), issues: read.issues };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}exportMermaid`,\n\t\t\tlabel: 'Copy Chart as Mermaid',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'mermaid', 'markdown', 'export'],\n\t\t\tdescription: 'Returns the chart as Mermaid text (with a round-trip comment unless meta is false).',\n\t\t\tparams: object({ meta: { type: 'boolean', description: 'Include the %% @pixerate round-trip comment (default true).' } }),\n\t\t\trun: (_ctx: unknown, params: { meta?: boolean } = {}) => ({ mermaid: chartToMermaid(controller.toJSON(), { meta: params?.meta }) })\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}exportOoxml`,\n\t\t\tlabel: 'Export Chart as Office XML',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'office', 'word', 'powerpoint', 'docx', 'pptx', 'xml', 'export'],\n\t\t\tdescription: 'Returns the chart as a DrawingML chart part (c:chartSpace) and what could not be written.',\n\t\t\trun: () => chartToOoxml(controller.toJSON())\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}exportSvg`,\n\t\t\tlabel: 'Export Chart as SVG',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'svg', 'export', 'image'],\n\t\t\tdescription: 'Returns the chart drawn as a standalone, accessible SVG string (with <title> and <desc>).',\n\t\t\tparams: object({ width: WIDTH, height: HEIGHT }),\n\t\t\trun: (_ctx: unknown, params: { width?: number; height?: number } = {}) => ({\n\t\t\t\tsvg: chartToSvg(controller.toJSON(), { width: params?.width ?? 640, height: params?.height ?? 400 })\n\t\t\t})\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}recommend`,\n\t\t\tlabel: 'Recommend Chart Types',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'recommend', 'suggest', 'type'],\n\t\t\tdescription: 'Suggests chart types for the current data (or CSV), best first, each with a reason.',\n\t\t\tparams: object({ csv: { type: 'string', description: 'CSV text to analyse instead of the current data.' } }),\n\t\t\trun: (_ctx: unknown, params: { csv?: string } = {}) => ({\n\t\t\t\trecommendations: recommendChartTypes(params?.csv !== undefined ? parseCsv(params.csv) : chartDataToTable(controller.getSpec()))\n\t\t\t})\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}checkColors`,\n\t\t\tlabel: 'Check Chart Colours',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'colour', 'color', 'accessibility', 'colour-blind', 'contrast'],\n\t\t\tdescription: 'Checks that the series colours can be told apart (including with colour-blindness) and stand out from the background.',\n\t\t\trun: () => {\n\t\t\t\tconst s = controller.getSpec();\n\t\t\t\tconst visible = s.series.filter((x) => !x.hidden);\n\t\t\t\tconst colors = chartColorsByCategory(s.type) ? s.categories.map((_, i) => visible[0]?.pointColors?.[i] || chartSliceColor(s, i)) : visible.map((x) => chartSeriesColor(s, s.series.indexOf(x)));\n\t\t\t\treturn { colors, ...checkChartColors(colors) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}undo`,\n\t\t\tlabel: 'Undo Chart Edit',\n\t\t\tkeywords: ['chart', 'undo'],\n\t\t\tenabled: () => controller.getState().canUndo || 'Nothing to undo',\n\t\t\trun: () => ({ undone: controller.undo() })\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}redo`,\n\t\t\tlabel: 'Redo Chart Edit',\n\t\t\tkeywords: ['chart', 'redo'],\n\t\t\tenabled: () => controller.getState().canRedo || 'Nothing to redo',\n\t\t\trun: () => ({ redone: controller.redo() })\n\t\t}\n\t];\n}\n","// Drag behaviour follows effectcraft-main/crates/ui-egui/src/panels/graph.rs and graph_tools.rs (the value axis\n// is frozen while a key is dragged, Shift locks to the axis that moved most, `snap_px` picks the nearest\n// candidate within a few screen pixels) and lightcraft-main's curve tests (Alt moves a tenth as far)\n// (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\nimport type { ChartController } from './controller.js';\nimport { chartValueAtPoint, chartXAtPoint, snapChartValue } from './layout.js';\nimport { linearMap } from './scale.js';\nimport { chartFamily } from './spec.js';\nimport type { ChartScene, ChartSelection, ChartValueScale } from './types.js';\n\n/** Scene coordinates of a pointer, given the rendered element's box (the scene is scaled to fit it). */\nexport function chartClientToScene(scene: Pick<ChartScene, 'width' | 'height'>, box: { left: number; top: number; width: number; height: number }, clientX: number, clientY: number): { x: number; y: number } {\n\tconst sx = box.width ? scene.width / box.width : 1;\n\tconst sy = box.height ? scene.height / box.height : 1;\n\treturn { x: (clientX - box.left) * sx, y: (clientY - box.top) * sy };\n}\n\n/**\n * Whether a point can be dragged to a new value in this scene: bar, line, area and scatter\n * charts (not percent-stacked), scatter and bubble charts with x values (x and y), and\n * waterfall steps. Hidden series and gaps cannot be dragged.\n */\nexport function canDragChartPoint(controller: ChartController, scene: ChartScene, target: ChartSelection | undefined): target is Extract<ChartSelection, { kind: 'point' }> {\n\tif (target?.kind !== 'point' || !scene.valueScale || scene.percent) return false;\n\tconst spec = controller.getSpec();\n\tconst family = chartFamily(spec);\n\tif (family !== 'cartesian' && family !== 'xy' && family !== 'waterfall') return false;\n\tconst series = controller.getSeries(target.seriesId);\n\treturn !!series && !series.hidden && series.values[target.index] !== null;\n}\n\nexport interface ChartDragMoveOptions {\n\t/** Move a tenth as far as the pointer (fine adjustment; Alt). */\n\tfine?: boolean;\n\t/** Only change the axis the pointer has moved along most (scatter charts; Shift). */\n\tlockAxis?: boolean;\n\t/** Skip snapping to nearby values and ticks (e.g. while Ctrl / Cmd is held). */\n\tnoSnap?: boolean;\n}\n\nexport interface ChartPointDrag {\n\t/**\n\t * The value axis range when the drag started. Pass it to `layoutChart` (`valueDomain`)\n\t * until `end()` so the axis does not rescale under the pointer.\n\t */\n\treadonly valueDomain: { min: number; max: number };\n\t/** The secondary value axis range when the drag started (`layoutChart`'s `valueDomain2`). */\n\treadonly valueDomain2?: { min: number; max: number };\n\t/** The numeric x range of a scatter or bubble chart when the drag started (`xDomain`). */\n\treadonly xDomain?: { min: number; max: number };\n\t/** The point being dragged, for `layoutChart`'s `readout`. */\n\treadonly target: { seriesId: string; index: number };\n\t/** Moves the value with the pointer (scene coordinates). */\n\tmove(point: { x: number; y: number }, options?: ChartDragMoveOptions): void;\n\t/** Ends the drag (one undo step for the whole drag). */\n\tend(): void;\n\t/** Cancels the drag: the value goes back and no undo step is left (Escape). */\n\tcancel(): void;\n}\n\nexport interface ChartSnapOptions {\n\t/** Values to snap to when the pointer is within `tolerancePx` of them. */\n\tcandidates?: readonly number[];\n\t/** Screen distance that snaps (default 6). */\n\ttolerancePx?: number;\n\t/** Fallback step when no candidate is close (default: a tenth of the tick step). */\n\tstep?: number;\n\t/** The scale the value is on (default: the scene's value scale). */\n\tscale?: ChartValueScale;\n}\n\n/**\n * Snaps a dragged value: to the nearest candidate (other series at the same category, the\n * neighbouring values, zero, the start value, ticks) within `tolerancePx` screen pixels, or\n * else to a tenth of the tick step.\n */\nexport function snapChartDragValue(scene: ChartScene, value: number, options: ChartSnapOptions = {}): number {\n\tconst scale = options.scale ?? scene.valueScale;\n\tconst tolerance = options.tolerancePx ?? 6;\n\tif (scale) {\n\t\tconst px = (v: number) => linearMap(v, scale.domain, scale.range);\n\t\tconst at = px(value);\n\t\tlet best: number | null = null;\n\t\tlet bestDist = tolerance;\n\t\tfor (const c of [...(options.candidates ?? []), ...scale.ticks]) {\n\t\t\tif (!Number.isFinite(c)) continue;\n\t\t\tconst d = Math.abs(px(c) - at);\n\t\t\tif (d <= bestDist) {\n\t\t\t\tbest = c;\n\t\t\t\tbestDist = d;\n\t\t\t}\n\t\t}\n\t\tif (best !== null) return best;\n\t}\n\treturn snapChartValue(scene, value, options.step, scale?.ticks);\n}\n\n/**\n * Starts dragging a bar or point: the value follows the pointer along its value axis (and\n * along x on scatter and bubble charts), snapped to nearby values and then to a tenth of the\n * tick step (`step` overrides), and the whole drag is one undo step. Works for stacked bars\n * too (the drag changes the segment by the distance moved). Returns `null` when the target\n * cannot be dragged.\n */\nexport function startChartPointDrag(controller: ChartController, scene: ChartScene, target: ChartSelection | undefined, start: { x: number; y: number }, options: { step?: number; tolerancePx?: number } = {}): ChartPointDrag | null {\n\tif (!canDragChartPoint(controller, scene, target)) return null;\n\tconst { seriesId, index } = target;\n\tconst spec = controller.getSpec();\n\tconst series = controller.getSeries(seriesId)!;\n\tconst secondary = series.axis === 'secondary' && !!scene.valueScale2;\n\tconst scale = secondary ? scene.valueScale2! : scene.valueScale!;\n\tconst xy = chartFamily(spec) === 'xy' && !!scene.xScale;\n\tconst startValue = series.values[index] ?? 0;\n\tconst startX = series.x?.[index] ?? null;\n\tconst startAt = chartValueAtPoint(scene, start, secondary);\n\tconst startAtX = xy ? chartXAtPoint(scene, start) : undefined;\n\tif (startAt === undefined) return null;\n\t// Nearby values worth snapping to: zero, where the drag started, other series at this\n\t// category and this series' neighbours.\n\tconst candidates = [0, startValue];\n\tif (!xy) {\n\t\tfor (const s of spec.series) if (s.id !== seriesId && !s.hidden && (s.axis === 'secondary') === secondary) candidates.push(s.values[index] ?? NaN);\n\t\tcandidates.push(series.values[index - 1] ?? NaN, series.values[index + 1] ?? NaN);\n\t}\n\tcontroller.beginGesture(`drag:${seriesId}:${index}`);\n\tlet ended = false;\n\tconst [min, max] = scene.valueScale!.domain;\n\tconst label = `Drag ${series.name}`;\n\treturn {\n\t\tvalueDomain: { min, max },\n\t\t...(scene.valueScale2 ? { valueDomain2: { min: scene.valueScale2.domain[0], max: scene.valueScale2.domain[1] } } : {}),\n\t\t...(xy ? { xDomain: { min: scene.xScale!.domain[0], max: scene.xScale!.domain[1] } } : {}),\n\t\ttarget: { seriesId, index },\n\t\tmove(point, moveOptions = {}) {\n\t\t\tif (ended) return;\n\t\t\tconst at = chartValueAtPoint(scene, point, secondary);\n\t\t\tif (at === undefined) return;\n\t\t\tconst factor = moveOptions.fine ? 0.1 : 1;\n\t\t\tlet dy = (at - startAt) * factor;\n\t\t\tlet dx = 0;\n\t\t\tif (xy && startX !== null && startAtX !== undefined) {\n\t\t\t\tconst atX = chartXAtPoint(scene, point);\n\t\t\t\tif (atX !== undefined) dx = (atX - startAtX) * factor;\n\t\t\t\tif (moveOptions.lockAxis) {\n\t\t\t\t\t// Keep the axis the pointer moved further along (in pixels).\n\t\t\t\t\tif (Math.abs(point.x - start.x) >= Math.abs(point.y - start.y)) dy = 0;\n\t\t\t\t\telse dx = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst snap = (v: number, s: ChartValueScale, c: readonly number[]) => {\n\t\t\t\tif (moveOptions.noSnap) return Number(v.toPrecision(12));\n\t\t\t\tif (moveOptions.fine) {\n\t\t\t\t\tconst unit = options.step ? options.step / 10 : s.ticks.length > 1 ? (s.ticks[1] - s.ticks[0]) / 100 : undefined;\n\t\t\t\t\treturn snapChartValue(scene, v, unit, s.ticks);\n\t\t\t\t}\n\t\t\t\treturn snapChartDragValue(scene, v, { candidates: c, tolerancePx: options.tolerancePx, step: options.step, scale: s });\n\t\t\t};\n\t\t\tconst y = snap(startValue + dy, scale, candidates);\n\t\t\tif (xy && startX !== null) {\n\t\t\t\tconst x = dx !== 0 ? snap(startX + dx, scene.xScale!, [0, startX]) : startX;\n\t\t\t\tconst xs = [...(series.x ?? [])];\n\t\t\t\txs[index] = x;\n\t\t\t\tcontroller.setValue(seriesId, index, y, { label });\n\t\t\t\tif (x !== controller.getSeries(seriesId)?.x?.[index]) controller.updateSeries(seriesId, { x: xs });\n\t\t\t} else controller.setValue(seriesId, index, y, { label });\n\t\t},\n\t\tend() {\n\t\t\tif (ended) return;\n\t\t\tended = true;\n\t\t\tcontroller.endGesture();\n\t\t},\n\t\tcancel() {\n\t\t\tif (ended) return;\n\t\t\tended = true;\n\t\t\tcontroller.cancelGesture();\n\t\t}\n\t};\n}\n\nexport interface ChartKeyInput {\n\tkey: string;\n\tshiftKey?: boolean;\n\taltKey?: boolean;\n\tmetaKey?: boolean;\n\tctrlKey?: boolean;\n}\n\n/**\n * Keyboard editing on a focused chart: arrows move a point selection between categories\n * (← →) and change its value (↑ ↓, a tenth of the tick step; Shift: a whole step; Alt: a\n * hundredth), Delete / Backspace deletes the selection, Escape cancels a drag or clears the\n * selection. Returns `true` when the key was used (call `preventDefault`).\n */\nexport function handleChartKey(controller: ChartController, scene: ChartScene | null, event: ChartKeyInput): boolean {\n\tif (event.metaKey || event.ctrlKey) return false;\n\tconst { selection, spec, gesture } = controller.getState();\n\tswitch (event.key) {\n\t\tcase 'Escape':\n\t\t\tif (gesture) {\n\t\t\t\tcontroller.cancelGesture();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (!selection) return false;\n\t\t\tcontroller.select(null);\n\t\t\treturn true;\n\t\tcase 'Delete':\n\t\tcase 'Backspace':\n\t\t\tif (event.altKey || !selection || selection.kind === 'chart') return false;\n\t\t\tcontroller.deleteSelection();\n\t\t\treturn true;\n\t\tcase 'ArrowLeft':\n\t\tcase 'ArrowRight': {\n\t\t\tif (event.altKey || (selection?.kind !== 'point' && selection?.kind !== 'category')) return false;\n\t\t\tconst n = spec.categories.length;\n\t\t\tconst index = Math.max(0, Math.min(n - 1, selection.index + (event.key === 'ArrowRight' ? 1 : -1)));\n\t\t\tcontroller.select({ ...selection, index });\n\t\t\treturn true;\n\t\t}\n\t\tcase 'ArrowUp':\n\t\tcase 'ArrowDown': {\n\t\t\tif (selection?.kind !== 'point' || scene?.percent) return false;\n\t\t\tconst secondary = controller.getSeries(selection.seriesId)?.axis === 'secondary';\n\t\t\tconst ticks = (secondary ? scene?.valueScale2 : null)?.ticks ?? scene?.valueScale?.ticks ?? [];\n\t\t\tconst step = ticks.length > 1 ? ticks[1] - ticks[0] : 1;\n\t\t\tconst amount = event.shiftKey ? step : event.altKey ? step / 100 : step / 10;\n\t\t\tcontroller.nudgeValue(selection.seriesId, selection.index, amount * (event.key === 'ArrowUp' ? 1 : -1));\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n/** A short description of the selection for an inspector heading or a screen reader. */\nexport function describeChartSelection(controller: ChartController, selection: ChartSelection | null = controller.getState().selection): string {\n\tif (!selection) return 'Nothing selected';\n\tconst spec = controller.getSpec();\n\tswitch (selection.kind) {\n\t\tcase 'chart':\n\t\t\treturn 'Chart';\n\t\tcase 'title':\n\t\t\treturn 'Title';\n\t\tcase 'subtitle':\n\t\t\treturn 'Subtitle';\n\t\tcase 'legend':\n\t\t\treturn 'Legend';\n\t\tcase 'axis':\n\t\t\treturn selection.axis === 'x' ? (chartFamily(spec) === 'xy' ? 'X axis' : 'Category axis') : selection.axis === 'y' ? 'Value axis' : 'Secondary value axis';\n\t\tcase 'series':\n\t\t\treturn `Series \"${controller.getSeries(selection.seriesId)?.name ?? selection.seriesId}\"`;\n\t\tcase 'category':\n\t\t\treturn `Category \"${spec.categories[selection.index] ?? selection.index}\"`;\n\t\tcase 'trendline': {\n\t\t\tconst series = controller.getSeries(selection.seriesId);\n\t\t\tconst line = series?.trendlines?.[selection.index];\n\t\t\treturn `${line ? line.type.replace('-', ' ') : 'Trendline'} trendline on \"${series?.name ?? selection.seriesId}\"`;\n\t\t}\n\t\tcase 'point': {\n\t\t\tconst series = controller.getSeries(selection.seriesId);\n\t\t\tconst value = series?.values[selection.index];\n\t\t\tconst x = series?.x?.[selection.index];\n\t\t\tif (x !== undefined && x !== null && chartFamily(spec) === 'xy') return `${series?.name ?? selection.seriesId}: (${x}, ${value ?? 'blank'})`;\n\t\t\treturn `${series?.name ?? selection.seriesId} · ${spec.categories[selection.index] ?? selection.index}: ${value ?? 'blank'}`;\n\t\t}\n\t}\n}\n\n/**\n * The mark under a scene point (topmost first), for hosts without DOM events and for agents\n * that drive the pointer: rects, circles, lines (within 4 px) and text boxes. Returns the\n * mark's `target`, or `{ kind: 'chart' }` over the background, or `null` outside.\n */\nexport function chartHitTest(scene: ChartScene, point: { x: number; y: number }, measure: (text: string, size: number, weight?: number) => number = (t, s, w = 400) => t.length * s * (w >= 600 ? 0.6 : 0.56)): ChartSelection | null {\n\tfor (let i = scene.marks.length - 1; i >= 0; i--) {\n\t\tconst m = scene.marks[i];\n\t\tif (!m.target || m.role === 'selection' || m.role === 'background') continue;\n\t\tlet hit = false;\n\t\tswitch (m.kind) {\n\t\t\tcase 'rect':\n\t\t\t\thit = point.x >= m.x && point.x <= m.x + m.width && point.y >= m.y && point.y <= m.y + m.height;\n\t\t\t\tbreak;\n\t\t\tcase 'circle':\n\t\t\t\thit = Math.hypot(point.x - m.cx, point.y - m.cy) <= Math.max(m.r, 4) + 2;\n\t\t\t\tbreak;\n\t\t\tcase 'line': {\n\t\t\t\tconst dx = m.x2 - m.x1;\n\t\t\t\tconst dy = m.y2 - m.y1;\n\t\t\t\tconst len2 = dx * dx + dy * dy;\n\t\t\t\tconst t = len2 ? Math.max(0, Math.min(1, ((point.x - m.x1) * dx + (point.y - m.y1) * dy) / len2)) : 0;\n\t\t\t\thit = Math.hypot(point.x - (m.x1 + t * dx), point.y - (m.y1 + t * dy)) <= 4;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'text': {\n\t\t\t\tif (m.rotate) break;\n\t\t\t\tconst w = measure(m.text, m.size, m.weight);\n\t\t\t\tconst x0 = m.anchor === 'start' ? m.x : m.anchor === 'end' ? m.x - w : m.x - w / 2;\n\t\t\t\tconst y0 = m.baseline === 'top' ? m.y : m.baseline === 'bottom' ? m.y - m.size : m.y - m.size / 2;\n\t\t\t\thit = point.x >= x0 - 2 && point.x <= x0 + w + 2 && point.y >= y0 - 2 && point.y <= y0 + m.size + 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tif (hit) return m.target;\n\t}\n\treturn point.x >= 0 && point.y >= 0 && point.x <= scene.width && point.y <= scene.height ? { kind: 'chart' } : null;\n}\n","// The render-preview, pointer-gesture and key tools follow the conventions of the craft apps' MCP servers\n// (vectorcraft-main/crates/mcp/src/tools.rs `render_preview`, lightcraft-main `pointer_gesture`,\n// designcraft-main `key`) (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\nimport type { AgentTool, AgentToolProvider } from '../tools/registry.js';\nimport type { JsonSchema } from '../tools/schema.js';\nimport { parseCsv } from '../spreadsheet/csv.js';\nimport { checkChartColors } from './color.js';\nimport type { ChartController, ChartSeriesPatch, ChartSpecPatch } from './controller.js';\nimport { chartHitTest, handleChartKey, startChartPointDrag } from './interaction.js';\nimport { layoutChart } from './layout.js';\nimport { chartFromMermaid, chartToMermaid } from './mermaid.js';\nimport { chartFromOoxml, chartToOoxml } from './ooxml.js';\nimport type { ChartDirector, ChartDirectorActor } from './presence.js';\nimport { CHART_COLOR_SCHEMES, CHART_LAYOUT_PRESETS } from './presets.js';\nimport { chartFromTable, recommendChartTypes } from './recommend.js';\nimport {\n\tparseChartValue,\n\tCHART_AXIS_KINDS,\n\tCHART_CURVES,\n\tCHART_LABEL_POSITIONS,\n\tCHART_LEGEND_POSITIONS,\n\tCHART_MARKERS,\n\tCHART_NUMBER_STYLES,\n\tCHART_ORIENTATIONS,\n\tCHART_SERIES_TYPES,\n\tCHART_STACKINGS,\n\tCHART_TRENDLINE_TYPES,\n\tCHART_TYPES,\n\tchartColorsByCategory,\n\tchartDataToTable,\n\tchartSeriesColor,\n\tchartSliceColor\n} from './spec.js';\nimport { AXIS, CATEGORY_REF, CHART_UPDATE_PROPERTIES, FORMAT, HEIGHT, SERIES_PROPS, SERIES_REF, TRENDLINE_PROPS, VALUE, WIDTH } from './schemas.js';\nimport { summarizeChart } from './summary.js';\nimport { chartToSvg } from './svg.js';\nimport type { ChartSelection, ChartTrendline } from './types.js';\n\ntype ParserCtor = { new (): DOMParser };\n\nexport interface ChartToolProviderOptions {\n\t/** Provider id (unique per registry). Default `chart`. */\n\tid?: string;\n\t/** Always prefix tool names with `<namespace>__`. */\n\tnamespace?: string;\n\t/**\n\t * The chart cannot be edited: write tools are hidden and `get_chart` says why. A string\n\t * is the reason (\"The report is locked\").\n\t */\n\treadOnly?: boolean | string | (() => boolean | string);\n\t/** Size used for summaries, previews and pointer gestures (default 640 × 400). */\n\tsize?: { width: number; height: number };\n\t/** Enables `import_chart_ooxml` (reading Office chart XML needs a DOMParser). Default: the global one, if any. */\n\tDOMParser?: ParserCtor;\n\t/**\n\t * Acts out `set_chart_values` and `select_chart_element` with a visible cursor (see\n\t * `ChartDirector`); each call is still one undo step. Without it, edits apply at once.\n\t */\n\tdirector?: ChartDirector;\n\t/** Who the cursor belongs to (default `{ id: 'agent', name: 'Agent' }`). */\n\tactor?: ChartDirectorActor;\n\t/** Turns SVG into an image so `render_chart` can return PNG (e.g. through a canvas). */\n\trasterize?: (svg: string, size: { width: number; height: number }) => Promise<{ data: string; mimeType: string }> | { data: string; mimeType: string };\n}\n\nconst READ = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false } as const;\nconst WRITE = { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false } as const;\nconst WRITE_IDEMPOTENT = { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false } as const;\nconst DESTRUCTIVE = { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false } as const;\n\nconst fail = (message: string): never => {\n\tthrow new Error(message);\n};\n\nfunction resolve<T>(result: { ok: boolean; message?: string } & T): T {\n\tif (!result.ok) fail(result.message ?? 'The change was rejected.');\n\treturn result;\n}\n\n/**\n * Agent tools for a chart editor, for a `ToolRegistry`: one tool per operation with strict\n * schemas. Reads (`get_chart`, `render_chart`, `check_chart_colors`, `recommend_chart`,\n * `get_chart_trendline`, `list_chart_presets`, `export_chart_mermaid`, `export_chart_ooxml`)\n * are always there; writes (data, series, categories, presentation, trendlines, presets,\n * imports, selection, pointer and key input, undo / redo) are hidden while the chart is\n * read-only. Every write is one undo step and returns what it changed.\n */\nexport function createChartToolProvider(controller: ChartController, options: ChartToolProviderOptions = {}): AgentToolProvider {\n\tconst size = options.size ?? { width: 640, height: 400 };\n\tconst readOnlyReason = (): string | null => {\n\t\tconst r = typeof options.readOnly === 'function' ? options.readOnly() : options.readOnly;\n\t\tif (!r) return null;\n\t\treturn typeof r === 'string' ? r : 'This chart is read-only.';\n\t};\n\tconst spec = () => controller.getSpec();\n\tconst seriesById = (ref: string) => {\n\t\tconst s = spec().series.find((x) => x.id === ref) ?? spec().series.find((x) => x.name === ref);\n\t\tif (!s) fail(`There is no series \"${ref}\"; expected one of ${spec().series.map((x) => `\"${x.id}\" (${x.name})`).join(', ') || '(none yet; add one with add_chart_series)'}.`);\n\t\treturn s!;\n\t};\n\tconst categoryIndex = (ref: string | number) => {\n\t\tconst categories = spec().categories;\n\t\tconst index = typeof ref === 'number' ? ref : categories.indexOf(ref);\n\t\tif (!Number.isInteger(index) || index < 0 || index >= categories.length)\n\t\t\tfail(`There is no category ${JSON.stringify(ref)}; expected an index from 0 to ${categories.length - 1} or one of ${categories.slice(0, 20).map((c) => JSON.stringify(c)).join(', ')}.`);\n\t\treturn index;\n\t};\n\tconst table = () => chartDataToTable(spec());\n\tconst Parser = (): ParserCtor | undefined => options.DOMParser ?? (globalThis as { DOMParser?: ParserCtor }).DOMParser;\n\n\tconst getChart: AgentTool = {\n\t\tname: 'get_chart',\n\t\ttitle: 'Read the chart',\n\t\tdescription:\n\t\t\t'Returns the chart spec (type, titles, axes, legend, series with ids and settings), its data as a table (header row of series names, then one row per category), the current selection, and a summary at the given size: per-series min / max / mean / trend, the axes as drawn, layout warnings (hidden labels, thinned lines), a colour check and a plain-language description. Use the series ids and category indexes it returns with the write tools.',\n\t\tinputSchema: { type: 'object', properties: { width: WIDTH, height: HEIGHT }, additionalProperties: false },\n\t\tannotations: { title: 'Read the chart', ...READ },\n\t\thandler: ({ width = size.width, height = size.height }) => {\n\t\t\tconst reason = readOnlyReason();\n\t\t\treturn {\n\t\t\t\tspec: controller.toJSON(),\n\t\t\t\ttable: table(),\n\t\t\t\tselection: controller.getState().selection,\n\t\t\t\tsummary: summarizeChart(controller.toJSON(), { width, height }),\n\t\t\t\tissues: controller.getState().issues,\n\t\t\t\t...(reason ? { readOnly: reason } : {})\n\t\t\t};\n\t\t}\n\t};\n\n\tconst renderChart: AgentTool = {\n\t\tname: 'render_chart',\n\t\ttitle: 'Render the chart',\n\t\tdescription:\n\t\t\t'Draws the chart without changing it, to check it visually: SVG text by default, or a PNG image (format \"png\") when the host can rasterize. Look for overlapping or hidden labels; get_chart lists layout warnings without a render.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: { width: WIDTH, height: HEIGHT, format: { type: 'string', enum: ['svg', 'png'], description: 'svg (default) or png (only when the host supports it).' } },\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Render the chart', ...READ },\n\t\thandler: async ({ width = size.width, height = size.height, format = 'svg' }) => {\n\t\t\tconst svg = chartToSvg(controller.toJSON(), { width, height });\n\t\t\tif (format === 'png') {\n\t\t\t\tif (!options.rasterize) fail('This host cannot rasterize charts; call render_chart with format \"svg\".');\n\t\t\t\tconst image = await options.rasterize!(svg, { width, height });\n\t\t\t\treturn { content: [{ type: 'image', data: image.data, mimeType: image.mimeType }], structuredContent: { width, height, mimeType: image.mimeType } };\n\t\t\t}\n\t\t\treturn { svg, width, height };\n\t\t}\n\t};\n\n\tconst checkColors: AgentTool = {\n\t\tname: 'check_chart_colors',\n\t\ttitle: 'Check chart colours',\n\t\tdescription:\n\t\t\t'Checks that colours can be told apart with normal vision and with protanopia, deuteranopia and tritanopia (OKLab distance after simulation), and that they stand out from the background. Checks the chart\\'s own series (or slice) colours unless colours are given. Returns the closest pair per vision, contrast ratios and problems as sentences.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tcolors: { type: 'array', items: { type: 'string' }, minItems: 1, description: 'Colours to check instead of the chart\\'s (hex or rgb()).' },\n\t\t\t\tsurface: { type: 'string', description: 'Background colour (default white).' }\n\t\t\t},\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Check chart colours', ...READ },\n\t\thandler: ({ colors, surface }) => {\n\t\t\tconst s = spec();\n\t\t\tconst visible = s.series.filter((x) => !x.hidden);\n\t\t\tconst own = chartColorsByCategory(s.type) ? s.categories.map((_, i) => visible[0]?.pointColors?.[i] || chartSliceColor(s, i)) : visible.map((x) => chartSeriesColor(s, s.series.indexOf(x)));\n\t\t\treturn { colors: colors ?? own, ...checkChartColors(colors ?? own, { surface }) };\n\t\t}\n\t};\n\n\tconst recommend: AgentTool = {\n\t\tname: 'recommend_chart',\n\t\ttitle: 'Recommend chart types',\n\t\tdescription:\n\t\t\t'Suggests chart types for data, best first, each with a reason: from CSV text when given, else from the chart\\'s current data. Uses the shape of the data (series count, points, dates, negative values).',\n\t\tinputSchema: { type: 'object', properties: { csv: { type: 'string', description: 'CSV or TSV text to analyse instead of the current data (first row may be series names, first column categories).' } }, additionalProperties: false },\n\t\tannotations: { title: 'Recommend chart types', ...READ },\n\t\thandler: ({ csv }) => {\n\t\t\tconst rows = csv !== undefined ? parseCsv(csv, { delimiter: csv.includes('\\t') ? '\\t' : ',' }) : table();\n\t\t\tconst recommendations = recommendChartTypes(rows);\n\t\t\tif (!recommendations.length) fail('There are no numbers to chart: give CSV with at least one numeric column.');\n\t\t\treturn { recommendations };\n\t\t}\n\t};\n\n\tconst getTrendline: AgentTool = {\n\t\tname: 'get_chart_trendline',\n\t\ttitle: 'Read a trendline fit',\n\t\tdescription: 'Returns a trendline\\'s fitted coefficients (in x for category charts, x = 1, 2, 3, …), R², equation and the number of points, or the moving-average points.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: { series: SERIES_REF, index: { type: 'integer', minimum: 0, description: 'Trendline index on the series (0 = first).' } },\n\t\t\trequired: ['series', 'index'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Read a trendline fit', ...READ },\n\t\thandler: ({ series, index }) => {\n\t\t\tconst s = seriesById(series);\n\t\t\tconst line = s.trendlines?.[index];\n\t\t\tif (!line) fail(`\"${s.name}\" has no trendline ${index}; it has ${s.trendlines?.length ?? 0}.`);\n\t\t\tif (line!.type === 'moving-average') return { trendline: line, points: controller.trendlineMovingAverage(s.id, index) };\n\t\t\tconst fit = controller.trendlineFit(s.id, index);\n\t\t\tif (!fit) fail(`The ${line!.type} trendline on \"${s.name}\" cannot be fitted: it needs more points (and positive values for log, exponential and power fits).`);\n\t\t\treturn { trendline: line, coefficients: fit!.coefficients, r2: fit!.r2, equation: fit!.equation, points: fit!.points };\n\t\t}\n\t};\n\n\tconst listPresets: AgentTool = {\n\t\tname: 'list_chart_presets',\n\t\ttitle: 'List chart presets',\n\t\tdescription: 'Lists the quick layouts and colour schemes apply_chart_preset accepts, with what each changes.',\n\t\tinputSchema: { type: 'object', properties: {}, additionalProperties: false },\n\t\tannotations: { title: 'List chart presets', ...READ },\n\t\thandler: () => ({\n\t\t\tlayouts: CHART_LAYOUT_PRESETS.map(({ id, label, description }) => ({ id, label, description })),\n\t\t\tcolorSchemes: CHART_COLOR_SCHEMES.map(({ id, label, description, palette }) => ({ id, label, description, palette }))\n\t\t})\n\t};\n\n\tconst exportMermaid: AgentTool = {\n\t\tname: 'export_chart_mermaid',\n\t\ttitle: 'Export chart as Mermaid',\n\t\tdescription:\n\t\t\t'Returns the chart as Mermaid text (xychart-beta, pie or radar-beta) for Markdown or chat. With meta (default true) one \"%% @pixerate {…}\" comment keeps what Mermaid cannot express, so import_chart_mermaid gets the chart back exactly.',\n\t\tinputSchema: { type: 'object', properties: { meta: { type: 'boolean', description: 'Include the round-trip comment (default true).' } }, additionalProperties: false },\n\t\tannotations: { title: 'Export chart as Mermaid', ...READ },\n\t\thandler: ({ meta = true }) => ({ mermaid: chartToMermaid(controller.toJSON(), { meta }) })\n\t};\n\n\tconst exportOoxml: AgentTool = {\n\t\tname: 'export_chart_ooxml',\n\t\ttitle: 'Export chart as Office XML',\n\t\tdescription: 'Returns the chart as a DrawingML chart part (c:chartSpace) for Word or PowerPoint files, with what could not be written as sentences.',\n\t\tinputSchema: { type: 'object', properties: {}, additionalProperties: false },\n\t\tannotations: { title: 'Export chart as Office XML', ...READ },\n\t\thandler: () => chartToOoxml(controller.toJSON())\n\t};\n\n\t// ---------------------------------------------------------------- writes\n\n\tconst updateChart: AgentTool = {\n\t\tname: 'update_chart',\n\t\ttitle: 'Change chart presentation',\n\t\tdescription:\n\t\t\t'Changes how the chart looks, as one undo step: type, titles, axes (xAxis = categories or numeric x, yAxis = values, yAxis2 = secondary values), legend, stacking, orientation, curve, points, data labels and their position, palette, donut hole, bar spacing, histogram bins, waterfall total. All-or-nothing: invalid values change nothing and come back as sentences. Returns the new spec.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: CHART_UPDATE_PROPERTIES,\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Change chart presentation', ...WRITE_IDEMPOTENT },\n\t\thandler: (args) => {\n\t\t\tif (!Object.keys(args).length) fail('Nothing to change: pass at least one field, e.g. {\"type\": \"line\"}.');\n\t\t\tresolve(controller.update(args as ChartSpecPatch));\n\t\t\treturn { spec: controller.toJSON() };\n\t\t}\n\t};\n\n\tconst setData: AgentTool = {\n\t\tname: 'set_chart_data',\n\t\ttitle: 'Replace chart data',\n\t\tdescription: 'Replaces the categories and / or the series as one undo step. Each series has one value per category (padded with gaps). Returns the data table and the series ids.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tcategories: { type: 'array', items: { type: 'string' }, description: 'Category labels in order.' },\n\t\t\t\tseries: {\n\t\t\t\t\ttype: 'array',\n\t\t\t\t\tdescription: 'The new series (replaces all).',\n\t\t\t\t\titems: { type: 'object', properties: { id: { type: 'string', description: 'Stable id (optional).' }, ...SERIES_PROPS }, required: ['name', 'values'], additionalProperties: false }\n\t\t\t\t}\n\t\t\t},\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Replace chart data', ...DESTRUCTIVE },\n\t\thandler: (args) => {\n\t\t\tif (!args.categories && !args.series) fail('Pass categories, series or both.');\n\t\t\tresolve(controller.setData(args as any));\n\t\t\treturn { table: table(), series: spec().series.map((s) => ({ id: s.id, name: s.name })) };\n\t\t}\n\t};\n\n\tconst setValues: AgentTool = {\n\t\tname: 'set_chart_values',\n\t\ttitle: 'Set chart values',\n\t\tdescription: 'Sets individual values as one undo step (all-or-nothing). Series by id or name, category by index or label. Returns the values as stored.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tcells: {\n\t\t\t\t\ttype: 'array',\n\t\t\t\t\tminItems: 1,\n\t\t\t\t\tdescription: 'Values to set.',\n\t\t\t\t\titems: { type: 'object', properties: { series: SERIES_REF, category: CATEGORY_REF, value: VALUE }, required: ['series', 'category', 'value'], additionalProperties: false }\n\t\t\t\t}\n\t\t\t},\n\t\t\trequired: ['cells'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Set chart values', ...WRITE_IDEMPOTENT },\n\t\thandler: async ({ cells }) => {\n\t\t\tconst resolved = (cells as { series: string; category: string | number; value: unknown }[]).map((c) => ({ seriesId: seriesById(c.series).id, index: categoryIndex(c.category), value: c.value }));\n\t\t\tconst parsed = resolved.map((c) => parseChartValue(c.value));\n\t\t\tconst bad = resolved.find((_, i) => parsed[i] === undefined);\n\t\t\tif (bad) fail(`\"${String(bad.value)}\" is not a number; pass a number, numeric text or null for a gap. Nothing was changed.`);\n\t\t\tif (options.director && parsed.every((v) => typeof v === 'number')) {\n\t\t\t\tconst results = await options.director.perform(options.actor ?? { id: 'agent', name: 'Agent' }, resolved.map((c, i) => ({ kind: 'setValue' as const, seriesId: c.seriesId, index: c.index, value: parsed[i] as number })));\n\t\t\t\tconst failed = results.find((r) => !r.ok);\n\t\t\t\tif (failed && !failed.ok) fail(failed.message);\n\t\t\t} else resolve(controller.setValues(resolved));\n\t\t\treturn { cells: resolved.map((c) => ({ series: c.seriesId, category: spec().categories[c.index], index: c.index, value: controller.getSeries(c.seriesId)!.values[c.index] })) };\n\t\t}\n\t};\n\n\tconst addSeries: AgentTool = {\n\t\tname: 'add_chart_series',\n\t\ttitle: 'Add a series',\n\t\tdescription: 'Adds a series (values padded to the categories) and selects it. Returns its id and stored values.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: { ...SERIES_PROPS, id: { type: 'string', description: 'Id to use (default: series-N).' }, at: { type: 'integer', minimum: 0, description: 'Position (default: last).' } },\n\t\t\trequired: ['name'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Add a series', ...WRITE },\n\t\thandler: ({ at, ...input }) => {\n\t\t\tconst clean = Object.fromEntries(Object.entries(input).filter(([, v]) => v !== null));\n\t\t\tconst result = resolve(controller.addSeries(clean as any, { at })) as { id: string };\n\t\t\tconst s = controller.getSeries(result.id)!;\n\t\t\treturn { id: s.id, name: s.name, values: s.values };\n\t\t}\n\t};\n\n\tconst updateSeries: AgentTool = {\n\t\tname: 'update_chart_series',\n\t\ttitle: 'Change a series',\n\t\tdescription: 'Renames, recolours, hides, moves to the secondary axis or changes how a series is drawn (marker, curve, labels, format, x values, bubble sizes, point colours). null resets a field. Values change with set_chart_values. Returns the series.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: { series: SERIES_REF, ...Object.fromEntries(Object.entries(SERIES_PROPS).filter(([k]) => k !== 'values')) },\n\t\t\trequired: ['series'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Change a series', ...WRITE_IDEMPOTENT },\n\t\thandler: ({ series, ...patch }) => {\n\t\t\tconst id = seriesById(series).id;\n\t\t\tif (!Object.keys(patch).length) fail('Nothing to change: pass a field such as {\"color\": \"#e8710a\"} or {\"axis\": \"secondary\"}.');\n\t\t\tresolve(controller.updateSeries(id, patch as ChartSeriesPatch));\n\t\t\treturn { series: controller.getSeries(id) };\n\t\t}\n\t};\n\n\tconst removeSeries: AgentTool = {\n\t\tname: 'remove_chart_series',\n\t\ttitle: 'Delete a series',\n\t\tdescription: 'Deletes a series and its values. Returns the remaining series ids.',\n\t\tinputSchema: { type: 'object', properties: { series: SERIES_REF }, required: ['series'], additionalProperties: false },\n\t\tannotations: { title: 'Delete a series', ...DESTRUCTIVE },\n\t\thandler: ({ series }) => {\n\t\t\tresolve(controller.removeSeries(seriesById(series).id));\n\t\t\treturn { series: spec().series.map((s) => ({ id: s.id, name: s.name })) };\n\t\t}\n\t};\n\n\tconst addCategory: AgentTool = {\n\t\tname: 'add_chart_category',\n\t\ttitle: 'Add a category',\n\t\tdescription: 'Inserts a category (a gap in every series) and returns its index.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: { label: { type: 'string', description: 'Category label (default: its number).' }, at: { type: 'integer', minimum: 0, description: 'Index to insert at (default: the end).' } },\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Add a category', ...WRITE },\n\t\thandler: ({ label, at }) => {\n\t\t\tconst result = controller.addCategory(label, { at });\n\t\t\treturn { index: result.index, categories: spec().categories };\n\t\t}\n\t};\n\n\tconst removeCategory: AgentTool = {\n\t\tname: 'remove_chart_category',\n\t\ttitle: 'Delete a category',\n\t\tdescription: 'Deletes a category and its value in every series. Returns the remaining categories.',\n\t\tinputSchema: { type: 'object', properties: { category: CATEGORY_REF }, required: ['category'], additionalProperties: false },\n\t\tannotations: { title: 'Delete a category', ...DESTRUCTIVE },\n\t\thandler: ({ category }) => {\n\t\t\tresolve(controller.removeCategory(categoryIndex(category)));\n\t\t\treturn { categories: spec().categories };\n\t\t}\n\t};\n\n\tconst importCsv: AgentTool = {\n\t\tname: 'import_chart_csv',\n\t\ttitle: 'Import chart data from CSV',\n\t\tdescription:\n\t\t\t'Replaces the data with CSV or TSV text as one undo step. By default the first row holds series names and the first column categories (detected when \"auto\"). chartType \"auto\" also picks the recommended chart type (two unlabelled numeric columns become a scatter of x against y). Returns the data table, the chart type and cells that were not numbers.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tcsv: { type: 'string', description: 'CSV or TSV text (tabs are detected).' },\n\t\t\t\tseriesIn: { type: 'string', enum: ['columns', 'rows'], description: 'Series run down columns (default) or along rows. Ignored with chartType \"auto\".' },\n\t\t\t\theader: { type: ['boolean', 'string'], enum: [true, false, 'auto'], description: 'The first row holds series names: true (default), false or \"auto\". Ignored with chartType \"auto\".' },\n\t\t\t\tchartType: { type: 'string', enum: ['keep', 'auto'], description: '\"keep\" (default) keeps the chart type; \"auto\" reads the table shape and picks a type.' }\n\t\t\t},\n\t\t\trequired: ['csv'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Import chart data from CSV', ...DESTRUCTIVE },\n\t\thandler: ({ csv, seriesIn, header, chartType = 'keep' }) => {\n\t\t\tif (chartType === 'auto') {\n\t\t\t\tconst rows = parseCsv(csv, { delimiter: csv.includes('\\t') ? '\\t' : ',' });\n\t\t\t\tconst built = chartFromTable(rows);\n\t\t\t\tif (!built.series.length || !built.categories.length) fail('There is no data to import: expected at least one row of numbers.');\n\t\t\t\tresolve(controller.update({ type: built.type, stacking: built.stacking, categories: built.categories, series: built.series }, { label: 'Import data' }));\n\t\t\t\treturn { type: built.type, table: table(), issues: built.issues };\n\t\t\t}\n\t\t\tconst result = resolve(controller.importCsv(csv, { seriesIn, header })) as { issues?: unknown[] };\n\t\t\treturn { type: spec().type, table: table(), issues: result.issues ?? [] };\n\t\t}\n\t};\n\n\tconst importMermaid: AgentTool = {\n\t\tname: 'import_chart_mermaid',\n\t\ttitle: 'Import a Mermaid chart',\n\t\tdescription:\n\t\t\t'Replaces the chart with Mermaid xychart-beta, pie or radar-beta text as one undo step (a \"%% @pixerate\" comment from export_chart_mermaid restores everything else). Lines that cannot be read are skipped and listed with their line numbers. Returns the spec.',\n\t\tinputSchema: { type: 'object', properties: { mermaid: { type: 'string', description: 'Mermaid text, optionally inside a ```mermaid fence.' } }, required: ['mermaid'], additionalProperties: false },\n\t\tannotations: { title: 'Import a Mermaid chart', ...DESTRUCTIVE },\n\t\thandler: ({ mermaid }) => {\n\t\t\tconst fenced = /```(?:mermaid)?\\s*\\n([\\s\\S]*?)```/.exec(mermaid);\n\t\t\tconst read = chartFromMermaid(fenced ? fenced[1] : mermaid);\n\t\t\tif (!read.family) fail(read.issues.map((i) => i.message).join(' ') || 'Expected Mermaid starting with xychart-beta, pie or radar-beta.');\n\t\t\tresolve(controller.update({ ...read.spec } as ChartSpecPatch, { label: 'Import Mermaid chart' }));\n\t\t\treturn { spec: controller.toJSON(), issues: read.issues };\n\t\t}\n\t};\n\n\tconst importOoxml: AgentTool = {\n\t\tname: 'import_chart_ooxml',\n\t\ttitle: 'Import an Office chart',\n\t\tdescription:\n\t\t\t'Replaces the chart with an Office chart part (DrawingML c:chartSpace, or chartex for waterfall, funnel, treemap, histogram and box charts) as one undo step. Returns the spec, problems, and the features the editor cannot hold.',\n\t\tinputSchema: { type: 'object', properties: { xml: { type: 'string', description: 'The chart part XML, e.g. word/charts/chart1.xml.' } }, required: ['xml'], additionalProperties: false },\n\t\tannotations: { title: 'Import an Office chart', ...DESTRUCTIVE },\n\t\thandler: ({ xml }) => {\n\t\t\tconst read = chartFromOoxml(xml, { DOMParser: Parser() });\n\t\t\tif (read.issues.some((i) => i.path === '' || i.path === 'plotArea')) fail(read.issues.map((i) => i.message).join(' '));\n\t\t\tresolve(controller.update({ ...read.spec } as ChartSpecPatch, { label: 'Import Office chart' }));\n\t\t\treturn { spec: controller.toJSON(), issues: read.issues.map((i) => i.message), unsupported: read.unsupported, lossless: read.lossless };\n\t\t}\n\t};\n\n\tconst addTrendline: AgentTool = {\n\t\tname: 'add_chart_trendline',\n\t\ttitle: 'Add a trendline',\n\t\tdescription: 'Fits a trendline to a series and draws it (unstacked bar, line, area, scatter and bubble charts). Returns its index and the fit: coefficients, R² and equation.',\n\t\tinputSchema: { type: 'object', properties: { series: SERIES_REF, ...TRENDLINE_PROPS }, required: ['series', 'type'], additionalProperties: false },\n\t\tannotations: { title: 'Add a trendline', ...WRITE },\n\t\thandler: ({ series, ...line }) => {\n\t\t\tconst s = seriesById(series);\n\t\t\tconst result = resolve(controller.addTrendline(s.id, line as ChartTrendline)) as { index: number; fit: ReturnType<ChartController['trendlineFit']> };\n\t\t\treturn { series: s.id, index: result.index, ...(result.fit ? { coefficients: result.fit.coefficients, r2: result.fit.r2, equation: result.fit.equation } : {}) };\n\t\t}\n\t};\n\n\tconst removeTrendline: AgentTool = {\n\t\tname: 'remove_chart_trendline',\n\t\ttitle: 'Delete a trendline',\n\t\tdescription: 'Deletes a trendline from a series. Returns the series\\' remaining trendlines.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: { series: SERIES_REF, index: { type: 'integer', minimum: 0, description: 'Trendline index on the series (0 = first).' } },\n\t\t\trequired: ['series', 'index'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Delete a trendline', ...DESTRUCTIVE },\n\t\thandler: ({ series, index }) => {\n\t\t\tconst s = seriesById(series);\n\t\t\tresolve(controller.removeTrendline(s.id, index));\n\t\t\treturn { series: s.id, trendlines: controller.getSeries(s.id)?.trendlines ?? [] };\n\t\t}\n\t};\n\n\tconst applyPreset: AgentTool = {\n\t\tname: 'apply_chart_preset',\n\t\ttitle: 'Apply a chart style',\n\t\tdescription: 'Applies a quick layout (legend, labels and grid lines together) and / or a colour scheme as one undo step. See list_chart_presets for the names. Returns the new spec.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tlayout: { type: 'string', enum: CHART_LAYOUT_PRESETS.map((p) => p.id), description: 'Quick layout id.' },\n\t\t\t\tcolors: { type: 'string', enum: CHART_COLOR_SCHEMES.map((p) => p.id), description: 'Colour scheme id.' }\n\t\t\t},\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Apply a chart style', ...WRITE_IDEMPOTENT },\n\t\thandler: ({ layout, colors }) => {\n\t\t\tresolve(controller.applyPreset({ layout, colors }));\n\t\t\treturn { spec: controller.toJSON() };\n\t\t}\n\t};\n\n\tconst transpose: AgentTool = {\n\t\tname: 'transpose_chart',\n\t\ttitle: 'Switch rows and columns',\n\t\tdescription: 'Swaps series and categories (each category becomes a series) as one undo step. Per-series colours and settings are dropped. Returns the data table.',\n\t\tinputSchema: { type: 'object', properties: {}, additionalProperties: false },\n\t\tannotations: { title: 'Switch rows and columns', ...WRITE },\n\t\thandler: () => {\n\t\t\tresolve(controller.transpose());\n\t\t\treturn { table: table(), series: spec().series.map((s) => ({ id: s.id, name: s.name })) };\n\t\t}\n\t};\n\n\tconst select: AgentTool = {\n\t\tname: 'select_chart_element',\n\t\ttitle: 'Select a chart element',\n\t\tdescription: 'Selects part of the chart (as a click would), for press_chart_key and for the user to see. kind \"none\" clears the selection. Returns the selection.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tkind: { type: 'string', enum: ['none', 'chart', 'title', 'subtitle', 'legend', 'axis', 'series', 'point', 'category', 'trendline'], description: 'What to select.' },\n\t\t\t\tseries: { ...SERIES_REF, description: 'Series id or name (series, point, trendline).' },\n\t\t\t\tcategory: { ...CATEGORY_REF, description: 'Category index or label (point, category).' },\n\t\t\t\taxis: { type: 'string', enum: ['x', 'y', 'y2'], description: 'Axis (axis).' },\n\t\t\t\tindex: { type: 'integer', minimum: 0, description: 'Trendline index (trendline).' }\n\t\t\t},\n\t\t\trequired: ['kind'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Select a chart element', ...WRITE_IDEMPOTENT },\n\t\thandler: async ({ kind, series, category, axis, index }) => {\n\t\t\tlet sel: ChartSelection | null;\n\t\t\tconst need = (v: unknown, what: string) => v === undefined && fail(`kind \"${kind}\" needs ${what}.`);\n\t\t\tswitch (kind) {\n\t\t\t\tcase 'none':\n\t\t\t\t\tsel = null;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'axis':\n\t\t\t\t\tneed(axis, 'axis');\n\t\t\t\t\tsel = { kind, axis };\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'series':\n\t\t\t\t\tneed(series, 'series');\n\t\t\t\t\tsel = { kind, seriesId: seriesById(series).id };\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'point':\n\t\t\t\t\tneed(series, 'series');\n\t\t\t\t\tneed(category, 'category');\n\t\t\t\t\tsel = { kind, seriesId: seriesById(series).id, index: categoryIndex(category) };\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'category':\n\t\t\t\t\tneed(category, 'category');\n\t\t\t\t\tsel = { kind, index: categoryIndex(category) };\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'trendline':\n\t\t\t\t\tneed(series, 'series');\n\t\t\t\t\tneed(index, 'index');\n\t\t\t\t\tsel = { kind, seriesId: seriesById(series).id, index };\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tsel = { kind } as ChartSelection;\n\t\t\t}\n\t\t\tif (options.director) await options.director.perform(options.actor ?? { id: 'agent', name: 'Agent' }, [{ kind: 'select', selection: sel }]);\n\t\t\telse controller.select(sel);\n\t\t\tconst now = controller.getState().selection;\n\t\t\tif (sel && !now) fail(`Nothing to select there (e.g. the chart has no ${kind} of that kind).`);\n\t\t\treturn { selection: now };\n\t\t}\n\t};\n\n\tconst drag: AgentTool = {\n\t\tname: 'drag_chart_point',\n\t\ttitle: 'Drag a chart point',\n\t\tdescription:\n\t\t\t'Drags on the chart as a pointer would, through the same code as the mouse: from a bar or point to a new position, with the same snapping (to other values, zero and ticks), fine adjustment (fine: Alt) and axis lock on scatter charts (lockAxis: Shift). Positions are 0–1 fractions of the chart\\'s width and height at the given size (use render_chart to see where marks are). One undo step. Returns what was dragged and the value before and after.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tfrom: { type: 'object', description: 'Start, as fractions of the chart (0,0 top-left).', properties: { x: { type: 'number', minimum: 0, maximum: 1, description: 'Fraction of the width.' }, y: { type: 'number', minimum: 0, maximum: 1, description: 'Fraction of the height.' } }, required: ['x', 'y'], additionalProperties: false },\n\t\t\t\tto: { type: 'object', description: 'End, as fractions of the chart.', properties: { x: { type: 'number', minimum: 0, maximum: 1, description: 'Fraction of the width.' }, y: { type: 'number', minimum: 0, maximum: 1, description: 'Fraction of the height.' } }, required: ['x', 'y'], additionalProperties: false },\n\t\t\t\tfine: { type: 'boolean', description: 'Move a tenth as far (Alt).' },\n\t\t\t\tlockAxis: { type: 'boolean', description: 'Scatter charts: change only the axis moved along most (Shift).' },\n\t\t\t\twidth: WIDTH,\n\t\t\t\theight: HEIGHT\n\t\t\t},\n\t\t\trequired: ['from', 'to'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Drag a chart point', ...WRITE },\n\t\thandler: ({ from, to, fine, lockAxis, width = size.width, height = size.height }) => {\n\t\t\tconst scene = layoutChart(controller.toJSON(), { width, height });\n\t\t\tconst start = { x: from.x * width, y: from.y * height };\n\t\t\tconst target = chartHitTest(scene, start);\n\t\t\tif (target?.kind !== 'point') fail(`There is no bar or point at (${from.x}, ${from.y}); ${target ? `that is the ${target.kind}` : 'that is outside the chart'}. Use render_chart to find marks.`);\n\t\t\tconst t = target as Extract<ChartSelection, { kind: 'point' }>;\n\t\t\tconst before = controller.getSeries(t.seriesId)?.values[t.index] ?? null;\n\t\t\tconst session = startChartPointDrag(controller, scene, t, start);\n\t\t\tif (!session) fail('That point cannot be dragged here (percent-stacked charts, pies and gaps cannot be dragged).');\n\t\t\tsession!.move({ x: to.x * width, y: to.y * height }, { fine, lockAxis });\n\t\t\tsession!.end();\n\t\t\tconst s = controller.getSeries(t.seriesId)!;\n\t\t\treturn { series: s.id, category: spec().categories[t.index], index: t.index, before, after: s.values[t.index], ...(s.x ? { x: s.x[t.index] } : {}) };\n\t\t}\n\t};\n\n\tconst key: AgentTool = {\n\t\tname: 'press_chart_key',\n\t\ttitle: 'Press a key on the chart',\n\t\tdescription:\n\t\t\t'Sends a key to the chart as the keyboard would, acting on the selection (select_chart_element first): ← → move between categories, ↑ ↓ change the selected value by a tenth of a tick (shift: a whole tick, alt: a hundredth), Delete removes the selection, Escape clears it. Returns whether the key did anything and the new selection.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tkey: { type: 'string', enum: ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Delete', 'Backspace', 'Escape'], description: 'Key name.' },\n\t\t\t\tshift: { type: 'boolean', description: 'Hold Shift.' },\n\t\t\t\talt: { type: 'boolean', description: 'Hold Alt / Option.' }\n\t\t\t},\n\t\t\trequired: ['key'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Press a key on the chart', ...DESTRUCTIVE },\n\t\thandler: ({ key: k, shift, alt }) => {\n\t\t\tconst scene = layoutChart(controller.toJSON(), size);\n\t\t\tconst used = handleChartKey(controller, scene, { key: k, shiftKey: shift, altKey: alt });\n\t\t\tconst sel = controller.getState().selection;\n\t\t\tconst value = sel?.kind === 'point' ? (controller.getSeries(sel.seriesId)?.values[sel.index] ?? null) : undefined;\n\t\t\treturn { used, selection: sel, ...(value !== undefined ? { value } : {}) };\n\t\t}\n\t};\n\n\tconst undo: AgentTool = {\n\t\tname: 'undo_chart',\n\t\ttitle: 'Undo a chart edit',\n\t\tdescription: 'Undoes the last chart edit. Returns whether something was undone and what the next undo would be.',\n\t\tinputSchema: { type: 'object', properties: {}, additionalProperties: false },\n\t\tannotations: { title: 'Undo a chart edit', ...WRITE },\n\t\thandler: () => {\n\t\t\tconst label = controller.getState().undoLabel;\n\t\t\tconst undone = controller.undo();\n\t\t\treturn { undone, ...(undone ? { label } : {}), next: controller.getState().undoLabel || null };\n\t\t}\n\t};\n\n\tconst redo: AgentTool = {\n\t\tname: 'redo_chart',\n\t\ttitle: 'Redo a chart edit',\n\t\tdescription: 'Redoes the last undone chart edit. Returns whether something was redone.',\n\t\tinputSchema: { type: 'object', properties: {}, additionalProperties: false },\n\t\tannotations: { title: 'Redo a chart edit', ...WRITE },\n\t\thandler: () => {\n\t\t\tconst label = controller.getState().redoLabel;\n\t\t\tconst redone = controller.redo();\n\t\t\treturn { redone, ...(redone ? { label } : {}) };\n\t\t}\n\t};\n\n\tconst reads = [getChart, renderChart, checkColors, recommend, getTrendline, listPresets, exportMermaid, exportOoxml];\n\tconst writes = [updateChart, setData, setValues, addSeries, updateSeries, removeSeries, addCategory, removeCategory, importCsv, importMermaid, addTrendline, removeTrendline, applyPreset, transpose, select, drag, key, undo, redo];\n\n\treturn {\n\t\tid: options.id ?? 'chart',\n\t\tnamespace: options.namespace,\n\t\ttools: () => {\n\t\t\tif (readOnlyReason()) return reads;\n\t\t\treturn [...reads, ...writes.slice(0, 10), ...(Parser() ? [importOoxml] : []), ...writes.slice(10)];\n\t\t},\n\t\tsubscribe: (notify) => {\n\t\t\t// Re-announce when read-only state may have changed.\n\t\t\tlet last = readOnlyReason();\n\t\t\treturn controller.subscribe(() => {\n\t\t\t\tconst now = readOnlyReason();\n\t\t\t\tif (now !== last) {\n\t\t\t\t\tlast = now;\n\t\t\t\t\tnotify();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n}\n","// Streaming follows Ursula's MermaidStreamingView and src/graph/view.ts (`blendLayout`: marks are matched by id,\n// new ones appear at their target, missing ones drop out; layouts are adopted on a throttle and the scale is held\n// steady until the source is complete).\nimport { chartFromMermaid } from './mermaid.js';\nimport { normalizeChartSpec } from './spec.js';\nimport type { ChartIssue, ChartMark, ChartScene, ChartSpec } from './types.js';\n\n/**\n * Reads JSON that is still arriving: closes open strings, arrays and objects and drops a\n * dangling key or comma, so `{\"type\":\"bar\",\"series\":[{\"name\":\"A\",\"values\":[1,2` reads as far\n * as it goes. Returns `undefined` when nothing usable has arrived yet.\n */\nexport function parsePartialChartJson(text: string): unknown {\n\tconst src = text.trim();\n\tif (!src) return undefined;\n\ttry {\n\t\treturn JSON.parse(src);\n\t} catch {\n\t\t// fall through\n\t}\n\tconst stack: string[] = [];\n\tlet inString = false;\n\tlet escaped = false;\n\tlet out = '';\n\tfor (const ch of src) {\n\t\tout += ch;\n\t\tif (inString) {\n\t\t\tif (escaped) escaped = false;\n\t\t\telse if (ch === '\\\\') escaped = true;\n\t\t\telse if (ch === '\"') inString = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === '\"') inString = true;\n\t\telse if (ch === '{' || ch === '[') stack.push(ch === '{' ? '}' : ']');\n\t\telse if (ch === '}' || ch === ']') stack.pop();\n\t}\n\tif (inString) out += '\"';\n\t// Drop what cannot end a value: a trailing comma, colon, key without value or partial literal.\n\tfor (let attempt = 0; attempt < 6; attempt++) {\n\t\tconst trimmed = out.replace(/\\s+$/, '');\n\t\tconst candidate = trimmed + [...stack].reverse().join('');\n\t\ttry {\n\t\t\treturn JSON.parse(candidate);\n\t\t} catch {\n\t\t\tconst next = trimmed\n\t\t\t\t.replace(/,\\s*$/, '')\n\t\t\t\t.replace(/(?:,|\\{)\\s*\"[^\"]*\"\\s*:?\\s*$/, (m) => (m.trim().startsWith('{') ? '{' : ''))\n\t\t\t\t.replace(/:\\s*$/, ': null')\n\t\t\t\t.replace(/(?<=[\\[,:]\\s*)(-|tr?u?|fa?l?s?|nu?l?)$/, '')\n\t\t\t\t.replace(/(?<=[\\[,:]\\s*)(-?\\d+\\.)$/, (m) => m.slice(0, -1));\n\t\t\tif (next === trimmed) break;\n\t\t\tout = next;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport type ChartStreamFormat = 'auto' | 'mermaid' | 'json';\n\nexport interface ChartStreamResult {\n\t/** The chart as far as it has arrived, or `null` before anything can be drawn. */\n\tspec: ChartSpec | null;\n\tissues: ChartIssue[];\n\t/**\n\t * The value range to lay out with while incomplete: it only grows, so the axis does not\n\t * jump as values arrive. `null` once complete (the chart's own scale takes over).\n\t */\n\tvalueDomain: { min: number; max: number } | null;\n}\n\n/**\n * Turns a chart source that is still being written (Mermaid or a JSON spec, e.g. streamed\n * from a model) into drawable specs. Series appear once their values start, axis bounds only\n * grow until `complete`, and parse problems are reported only once the source is complete.\n */\nexport class ChartStream {\n\tprivate lo = Infinity;\n\tprivate hi = -Infinity;\n\tprivate last: ChartSpec | null = null;\n\n\tconstructor(private readonly format: ChartStreamFormat = 'auto') {}\n\n\t/** Reads the source so far. `complete` when nothing more will arrive. */\n\tupdate(source: string, complete = false): ChartStreamResult {\n\t\tconst text = source.replace(/^\\s*```(?:mermaid|json)?\\s*\\n?/, '').replace(/```\\s*$/, '');\n\t\tconst format = this.format === 'auto' ? (/^\\s*[[{]/.test(text) ? 'json' : 'mermaid') : this.format;\n\t\tlet spec: ChartSpec | null = null;\n\t\tlet issues: ChartIssue[] = [];\n\t\tif (format === 'json') {\n\t\t\tconst value = complete ? safeParse(text) : parsePartialChartJson(text);\n\t\t\tif (value !== undefined) {\n\t\t\t\tconst read = normalizeChartSpec(value);\n\t\t\t\tspec = read.spec;\n\t\t\t\tissues = complete ? read.issues : [];\n\t\t\t}\n\t\t} else {\n\t\t\tconst read = chartFromMermaid(text, { partial: !complete });\n\t\t\tif (read.family) {\n\t\t\t\tspec = read.spec;\n\t\t\t\tissues = complete ? read.issues : [];\n\t\t\t}\n\t\t}\n\t\tif (spec && !spec.series.some((s) => s.values.some((v) => v !== null))) spec = complete ? spec : this.last;\n\t\tif (spec) this.last = spec;\n\t\tif (spec) {\n\t\t\tfor (const s of spec.series) for (const v of s.values) if (v !== null && Number.isFinite(v)) (this.lo = Math.min(this.lo, v)), (this.hi = Math.max(this.hi, v));\n\t\t}\n\t\tconst valueDomain = !complete && Number.isFinite(this.lo) && this.hi > this.lo ? { min: Math.min(0, this.lo), max: this.hi } : null;\n\t\treturn { spec, issues, valueDomain };\n\t}\n\n\t/** Forgets the axis bounds (a new source). */\n\treset(): void {\n\t\tthis.lo = Infinity;\n\t\tthis.hi = -Infinity;\n\t\tthis.last = null;\n\t}\n}\n\nfunction safeParse(text: string): unknown {\n\ttry {\n\t\treturn JSON.parse(text);\n\t} catch {\n\t\treturn parsePartialChartJson(text);\n\t}\n}\n\nconst mix = (a: number, b: number, t: number) => a + (b - a) * t;\n\n/** Paths with the same commands blend number by number; others switch at the end. */\nfunction blendPath(a: string, b: string, t: number): string {\n\tconst na = a.match(/-?\\d*\\.?\\d+(?:e-?\\d+)?/g);\n\tconst nb = b.match(/-?\\d*\\.?\\d+(?:e-?\\d+)?/g);\n\tif (!na || !nb || na.length !== nb.length || a.replace(/-?\\d*\\.?\\d+(?:e-?\\d+)?/g, '#') !== b.replace(/-?\\d*\\.?\\d+(?:e-?\\d+)?/g, '#')) return t < 1 ? a : b;\n\tlet i = 0;\n\treturn b.replace(/-?\\d*\\.?\\d+(?:e-?\\d+)?/g, () => {\n\t\tconst v = mix(Number(na[i]), Number(nb[i]), t);\n\t\ti++;\n\t\treturn String(Math.round(v * 100) / 100);\n\t});\n}\n\n/**\n * A scene between two scenes, for animating changes (streamed data arriving, an agent's\n * edit): marks are matched by `key`; numbers and same-shaped paths move from `from` to `to`;\n * new marks fade in and marks that are gone are dropped. `t` runs from 0 to 1.\n */\nexport function blendChartScenes(from: ChartScene | null, to: ChartScene, t: number): ChartScene {\n\tif (!from || t >= 1) return to;\n\tconst k = Math.max(0, Math.min(1, t));\n\tconst before = new Map(from.marks.map((m) => [m.key, m]));\n\tconst marks: ChartMark[] = to.marks.map((m) => {\n\t\tconst a = before.get(m.key);\n\t\tif (!a || a.kind !== m.kind) return { ...m, opacity: (m.opacity ?? 1) * k };\n\t\tswitch (m.kind) {\n\t\t\tcase 'rect': {\n\t\t\t\tconst p = a as typeof m;\n\t\t\t\treturn { ...m, x: mix(p.x, m.x, k), y: mix(p.y, m.y, k), width: mix(p.width, m.width, k), height: mix(p.height, m.height, k) };\n\t\t\t}\n\t\t\tcase 'circle': {\n\t\t\t\tconst p = a as typeof m;\n\t\t\t\treturn { ...m, cx: mix(p.cx, m.cx, k), cy: mix(p.cy, m.cy, k), r: mix(p.r, m.r, k) };\n\t\t\t}\n\t\t\tcase 'line': {\n\t\t\t\tconst p = a as typeof m;\n\t\t\t\treturn { ...m, x1: mix(p.x1, m.x1, k), y1: mix(p.y1, m.y1, k), x2: mix(p.x2, m.x2, k), y2: mix(p.y2, m.y2, k) };\n\t\t\t}\n\t\t\tcase 'text': {\n\t\t\t\tconst p = a as typeof m;\n\t\t\t\treturn { ...m, x: mix(p.x, m.x, k), y: mix(p.y, m.y, k) };\n\t\t\t}\n\t\t\tcase 'path':\n\t\t\t\treturn { ...m, d: blendPath((a as typeof m).d, m.d, k) };\n\t\t}\n\t});\n\treturn { ...to, marks };\n}\n\n/** Ease-out cubic, for tweens. */\nexport const easeChartTween = (t: number) => 1 - Math.pow(1 - Math.max(0, Math.min(1, t)), 3);\n","// Agent \"performances\" follow Ursula's remote control (src/remote/commands.ts `planCommand`, src/react/remote/director.ts,\n// presence.ts, clock.ts): a pure planner turns a command into cursor steps, a director acts them out per actor and\n// commits each command as one undo step, and the clock is injectable so performances are repeatable in tests.\nimport type { ChartController, ChartSpecPatch } from './controller.js';\nimport { linearMap } from './scale.js';\nimport type { ChartScene, ChartSelection, ChartSpec } from './types.js';\n\nexport interface ChartPresenceActor {\n\tid: string;\n\tname: string;\n\tcolor: string;\n\t/** Cursor position in scene coordinates. */\n\tx: number;\n\ty: number;\n\t/** The button is down (dragging). */\n\tpressed: boolean;\n\t/** A short note shown next to the cursor (what the agent is doing). */\n\tmessage?: string;\n}\n\nexport interface ChartPresenceState {\n\tactors: readonly ChartPresenceActor[];\n}\n\n/** Cursor positions and notes of agents acting on a chart, for an overlay. */\nexport class ChartPresence {\n\tprivate state: ChartPresenceState = { actors: [] };\n\tprivate readonly listeners = new Set<(state: ChartPresenceState) => void>();\n\n\tgetState = (): ChartPresenceState => this.state;\n\n\tsubscribe = (listener: (state: ChartPresenceState) => void): (() => void) => {\n\t\tthis.listeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener);\n\t\t};\n\t};\n\n\t/** Adds or changes an actor. */\n\tset(actor: Pick<ChartPresenceActor, 'id'> & Partial<ChartPresenceActor>): void {\n\t\tconst current = this.state.actors.find((a) => a.id === actor.id);\n\t\tconst next: ChartPresenceActor = { name: actor.id, color: CHART_PRESENCE_COLORS[this.state.actors.length % CHART_PRESENCE_COLORS.length], x: 0, y: 0, pressed: false, ...current, ...actor };\n\t\tthis.state = { actors: current ? this.state.actors.map((a) => (a.id === actor.id ? next : a)) : [...this.state.actors, next] };\n\t\tthis.listeners.forEach((l) => l(this.state));\n\t}\n\n\tremove(id: string): void {\n\t\tif (!this.state.actors.some((a) => a.id === id)) return;\n\t\tthis.state = { actors: this.state.actors.filter((a) => a.id !== id) };\n\t\tthis.listeners.forEach((l) => l(this.state));\n\t}\n}\n\nexport const CHART_PRESENCE_COLORS: readonly string[] = ['#7c3aed', '#db2777', '#0891b2', '#ea580c', '#16a34a'];\n\n/** Time for performances: real timers, or an instant clock for tests and recordings. */\nexport interface ChartClock {\n\tnow(): number;\n\twait(ms: number): Promise<void>;\n}\n\nexport const realChartClock: ChartClock = {\n\tnow: () => Date.now(),\n\twait: (ms) => new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)))\n};\n\n/** A clock whose waits finish at once while its time still advances (repeatable performances). */\nexport function createInstantChartClock(start = 0): ChartClock & { elapsed(): number } {\n\tlet t = start;\n\treturn {\n\t\tnow: () => t,\n\t\twait: async (ms) => {\n\t\t\tt += Math.max(0, ms);\n\t\t},\n\t\telapsed: () => t - start\n\t};\n}\n\n/** What an agent asks for. Each command commits as one undo step. */\nexport type ChartAgentCommand =\n\t| { kind: 'setValue'; seriesId: string; index: number; value: number; note?: string }\n\t| { kind: 'select'; selection: ChartSelection | null; note?: string }\n\t| { kind: 'update'; patch: ChartSpecPatch; label?: string; note?: string }\n\t| { kind: 'say'; text: string };\n\nexport type ChartPerformanceStep =\n\t| { type: 'move'; to: { x: number; y: number }; ms: number }\n\t| { type: 'say'; text: string; ms: number }\n\t| { type: 'press' }\n\t| { type: 'drag'; to: { x: number; y: number }; ms: number; from: number; value: number }\n\t| { type: 'release' }\n\t| { type: 'commit' };\n\n/** Where a point or bar sits in the scene (its top for bars), or null when it is not drawn. */\nexport function chartPointAnchor(scene: ChartScene, seriesId: string, index: number): { x: number; y: number } | null {\n\tconst mark = scene.marks.find((m) => (m.role === 'bar' || m.role === 'point') && m.target?.kind === 'point' && m.target.seriesId === seriesId && m.target.index === index);\n\tif (!mark) return null;\n\tif (mark.kind === 'rect') return { x: mark.x + mark.width / 2, y: mark.y };\n\tif (mark.kind === 'circle') return { x: mark.cx, y: mark.cy };\n\treturn null;\n}\n\nconst anchorFor = (scene: ChartScene, role: string) => {\n\tconst m = scene.marks.find((x) => x.role === role);\n\tif (!m) return null;\n\tif (m.kind === 'text') return { x: m.x, y: m.y };\n\tif (m.kind === 'rect') return { x: m.x + m.width / 2, y: m.y + m.height / 2 };\n\tif (m.kind === 'line') return { x: (m.x1 + m.x2) / 2, y: (m.y1 + m.y2) / 2 };\n\treturn null;\n};\n\n/**\n * Plans how an agent acts out a command on the chart: cursor moves, a drag along the value\n * axis for a value change (its end at the new value), a note, then a commit. Pure: the same\n * scene and command give the same steps.\n */\nexport function planChartCommand(spec: ChartSpec, scene: ChartScene, command: ChartAgentCommand, speed = 1): ChartPerformanceStep[] {\n\tconst ms = (n: number) => Math.round(n / Math.max(0.1, speed));\n\tconst steps: ChartPerformanceStep[] = [];\n\tconst note = 'note' in command && command.note ? command.note : undefined;\n\tif (note) steps.push({ type: 'say', text: note, ms: ms(500) });\n\tswitch (command.kind) {\n\t\tcase 'say':\n\t\t\tsteps.push({ type: 'say', text: command.text, ms: ms(900) });\n\t\t\treturn steps;\n\t\tcase 'setValue': {\n\t\t\tconst at = chartPointAnchor(scene, command.seriesId, command.index);\n\t\t\tconst series = spec.series.find((s) => s.id === command.seriesId);\n\t\t\tconst from = series?.values[command.index] ?? 0;\n\t\t\tconst scale = series?.axis === 'secondary' ? (scene.valueScale2 ?? scene.valueScale) : scene.valueScale;\n\t\t\tif (at && scale) {\n\t\t\t\tconst px = linearMap(command.value, scale.domain, scale.range);\n\t\t\t\tconst to = scale.axis === 'y' ? { x: at.x, y: px } : { x: px, y: at.y };\n\t\t\t\tsteps.push({ type: 'move', to: at, ms: ms(380) }, { type: 'press' }, { type: 'drag', to, ms: ms(520), from, value: command.value }, { type: 'release' });\n\t\t\t} else steps.push({ type: 'drag', to: { x: scene.plot.x + scene.plot.width / 2, y: scene.plot.y + scene.plot.height / 2 }, ms: ms(200), from, value: command.value });\n\t\t\tsteps.push({ type: 'commit' });\n\t\t\treturn steps;\n\t\t}\n\t\tcase 'select': {\n\t\t\tconst sel = command.selection;\n\t\t\tlet to: { x: number; y: number } | null = null;\n\t\t\tif (sel?.kind === 'point') to = chartPointAnchor(scene, sel.seriesId, sel.index);\n\t\t\telse if (sel) {\n\t\t\t\tconst m = scene.marks.find((x) => x.target && JSON.stringify(x.target) === JSON.stringify(sel));\n\t\t\t\tif (m?.kind === 'text') to = { x: m.x, y: m.y };\n\t\t\t\telse if (m?.kind === 'rect') to = { x: m.x + m.width / 2, y: m.y + m.height / 2 };\n\t\t\t\telse if (m?.kind === 'circle') to = { x: m.cx, y: m.cy };\n\t\t\t}\n\t\t\tif (to) steps.push({ type: 'move', to, ms: ms(380) }, { type: 'press' }, { type: 'release' });\n\t\t\tsteps.push({ type: 'commit' });\n\t\t\treturn steps;\n\t\t}\n\t\tcase 'update': {\n\t\t\tconst keys = Object.keys(command.patch);\n\t\t\tconst role = keys.includes('title') ? 'title' : keys.includes('legend') ? 'legend-label' : keys.some((k) => k === 'xAxis') ? 'axis' : keys.some((k) => k === 'yAxis' || k === 'yAxis2') ? 'tick-label' : null;\n\t\t\tconst to = (role && anchorFor(scene, role)) || { x: scene.plot.x + scene.plot.width / 2, y: scene.plot.y + 12 };\n\t\t\tsteps.push({ type: 'move', to, ms: ms(380) }, { type: 'press' }, { type: 'release' }, { type: 'commit' });\n\t\t\treturn steps;\n\t\t}\n\t}\n}\n\nexport interface ChartDirectorOptions {\n\t/** The scene as currently drawn (for cursor targets), e.g. the canvas' last layout. */\n\tscene: () => ChartScene;\n\tclock?: ChartClock;\n\t/** 1 = natural speed; 2 = twice as fast. */\n\tspeed?: number;\n\t/** Hide each actor's cursor this long after its last command (ms, default 1500; 0 keeps it). */\n\tlinger?: number;\n}\n\nexport interface ChartDirectorActor {\n\tid: string;\n\tname?: string;\n\tcolor?: string;\n}\n\nexport type ChartPerformanceResult = { ok: true; command: ChartAgentCommand } | { ok: false; command: ChartAgentCommand; message: string };\n\n/**\n * Acts out agent commands on a chart: each actor's cursor moves to the target, drags values\n * into place (the chart updates live) and the command commits as one undo step, while the\n * user keeps editing. Commands queue per actor; a command whose target was deleted meanwhile\n * fails with a sentence instead of editing something else.\n */\nexport class ChartDirector {\n\tprivate readonly queues = new Map<string, Promise<unknown>>();\n\tprivate readonly clock: ChartClock;\n\tprivate calls = 0;\n\n\tconstructor(\n\t\tprivate readonly controller: ChartController,\n\t\treadonly presence: ChartPresence,\n\t\tprivate readonly options: ChartDirectorOptions\n\t) {\n\t\tthis.clock = options.clock ?? realChartClock;\n\t}\n\n\t/** Acts out `commands` in order for `actor`. Resolves with one result per command. */\n\tperform(actor: ChartDirectorActor, commands: readonly ChartAgentCommand[]): Promise<ChartPerformanceResult[]> {\n\t\tconst prev = this.queues.get(actor.id) ?? Promise.resolve();\n\t\tconst run = prev.then(async () => {\n\t\t\tconst results: ChartPerformanceResult[] = [];\n\t\t\tthis.presence.set({ id: actor.id, ...(actor.name ? { name: actor.name } : {}), ...(actor.color ? { color: actor.color } : {}) });\n\t\t\t// Everything one call changes is one undo step.\n\t\t\tthis.controller.beginGesture(`agent:${actor.id}:${++this.calls}`);\n\t\t\ttry {\n\t\t\t\tfor (const command of commands) results.push(await this.performOne(actor.id, command));\n\t\t\t} finally {\n\t\t\t\tthis.controller.endGesture();\n\t\t\t\tthis.presence.set({ id: actor.id, message: undefined, pressed: false });\n\t\t\t}\n\t\t\tconst linger = this.options.linger ?? 1500;\n\t\t\tif (linger > 0) {\n\t\t\t\tawait this.clock.wait(linger);\n\t\t\t\tif (this.queues.get(actor.id) === run) this.presence.remove(actor.id);\n\t\t\t}\n\t\t\treturn results;\n\t\t});\n\t\tthis.queues.set(actor.id, run.catch(() => undefined));\n\t\treturn run;\n\t}\n\n\tprivate stale(command: ChartAgentCommand): string | null {\n\t\tconst spec = this.controller.getSpec();\n\t\tif (command.kind === 'setValue') {\n\t\t\tconst s = spec.series.find((x) => x.id === command.seriesId);\n\t\t\tif (!s) return `The series \"${command.seriesId}\" no longer exists.`;\n\t\t\tif (command.index < 0 || command.index >= spec.categories.length) return `Category ${command.index} no longer exists.`;\n\t\t\tif (!Number.isFinite(command.value)) return 'The value must be a finite number.';\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate async move(id: string, from: { x: number; y: number }, to: { x: number; y: number }, ms: number, each?: (t: number) => void) {\n\t\tconst frames = Math.max(1, Math.round(ms / 16));\n\t\tfor (let f = 1; f <= frames; f++) {\n\t\t\tconst t = f / frames;\n\t\t\tconst e = 1 - Math.pow(1 - t, 3);\n\t\t\tthis.presence.set({ id, x: from.x + (to.x - from.x) * e, y: from.y + (to.y - from.y) * e });\n\t\t\teach?.(e);\n\t\t\tawait this.clock.wait(ms / frames);\n\t\t}\n\t}\n\n\tprivate async performOne(id: string, command: ChartAgentCommand): Promise<ChartPerformanceResult> {\n\t\tconst stale = this.stale(command);\n\t\tif (stale) return { ok: false, command, message: stale };\n\t\tconst steps = planChartCommand(this.controller.getSpec(), this.options.scene(), command, this.options.speed);\n\t\tconst where = () => {\n\t\t\tconst a = this.presence.getState().actors.find((x) => x.id === id)!;\n\t\t\treturn { x: a.x, y: a.y };\n\t\t};\n\t\t{\n\t\t\tfor (const step of steps) {\n\t\t\t\tswitch (step.type) {\n\t\t\t\t\tcase 'say':\n\t\t\t\t\t\tthis.presence.set({ id, message: step.text });\n\t\t\t\t\t\tawait this.clock.wait(step.ms);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'move':\n\t\t\t\t\t\tawait this.move(id, where(), step.to, step.ms);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'press':\n\t\t\t\t\t\tthis.presence.set({ id, pressed: true });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'release':\n\t\t\t\t\t\tthis.presence.set({ id, pressed: false });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'drag': {\n\t\t\t\t\t\tif (command.kind !== 'setValue') break;\n\t\t\t\t\t\t// The value follows the cursor; the whole drag is one undo step.\n\t\t\t\t\t\tconst stale2 = this.stale(command);\n\t\t\t\t\t\tif (stale2) return { ok: false, command, message: stale2 };\n\t\t\t\t\t\tconst label = `${this.presence.getState().actors.find((a) => a.id === id)?.name ?? 'Agent'}: edit value`;\n\t\t\t\t\t\tawait this.move(id, where(), step.to, step.ms, (e) => {\n\t\t\t\t\t\t\tconst v = step.from + (step.value - step.from) * e;\n\t\t\t\t\t\t\tthis.controller.setValue(command.seriesId, command.index, Number(v.toPrecision(12)), { label });\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.controller.setValue(command.seriesId, command.index, step.value, { label });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'commit': {\n\t\t\t\t\t\tif (command.kind === 'select') this.controller.select(command.selection);\n\t\t\t\t\t\telse if (command.kind === 'update') {\n\t\t\t\t\t\t\tconst result = this.controller.update(command.patch, command.label ? { label: command.label } : {});\n\t\t\t\t\t\t\tif (!result.ok) return { ok: false, command, message: result.message };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { ok: true, command };\n\t\t}\n\t}\n}\n"],"mappings":"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","names":["fail","resolve"]}
|