@agile-team/mach-table 0.4.1 → 0.13.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/LICENSE +110 -21
- package/README.md +46 -2
- package/dist/index.cjs +6 -8873
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +628 -55
- package/dist/index.d.ts +628 -55
- package/dist/index.js +6 -8795
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/styles/mach-table.css +410 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../package.json","../src/core/eventBus.ts","../src/core/resolveOptions.ts","../src/services/column.ts","../src/services/columnGroup.ts","../src/types/colDef.ts","../src/lib/layout.ts","../src/services/columnModel.ts","../src/services/filterService.ts","../src/lib/compare.ts","../src/services/sortService.ts","../src/lib/aggregate.ts","../src/services/rowModel.ts","../src/services/selectionService.ts","../src/lib/dom.ts","../src/services/resizeService.ts","../src/services/columnDragService.ts","../src/lib/csv.ts","../src/lib/clipboard.ts","../src/services/keyboardService.ts","../src/services/editors.ts","../src/render/runtimeState.ts","../src/render/cellContent.ts","../src/services/editingService.ts","../src/lib/locale.ts","../src/services/filterPopup.ts","../src/services/columnMenuService.ts","../src/services/contextMenuService.ts","../src/services/tooltipService.ts","../src/services/watermarkService.ts","../src/services/undoRedoService.ts","../src/types/events.ts","../src/lib/download.ts","../src/lib/path.ts","../src/services/gridApi.ts","../src/render/skeleton.ts","../src/lib/filterSummary.ts","../src/render/headerRenderer.ts","../src/services/rangeSelectionModel.ts","../src/services/rowDragController.ts","../src/render/bodyRenderer.ts","../src/render/summaryRenderer.ts","../src/render/paginationBar.ts","../src/render/pinnedRowsRenderer.ts","../src/render/statusBarService.ts","../src/lib/columnStateStore.ts","../src/lib/presetRenderers.ts","../src/lib/componentRegistry.ts","../src/lib/validateDefs.ts","../src/core/gridCore.ts","../src/core/createGrid.ts","../src/core/gridOptionMetadata.ts","../src/lib/schema.ts","../src/lib/presetColumns.ts"],"sourcesContent":["import packageJson from \"../package.json\";\n\nexport { createGrid } from \"./core/createGrid\";\nexport { GridCore } from \"./core/gridCore\";\nexport { EventBus } from \"./core/eventBus\";\nexport { defaultComparator } from \"./lib/compare\";\nexport { getByPath, setByPath, isSafePath } from \"./lib/path\";\nexport { computeColumnWidths } from \"./lib/layout\";\nexport type { WidthInput } from \"./lib/layout\";\n\nexport type {\n ColDef,\n ColDefGroup,\n ColDefOrGroup,\n ColumnState,\n ColumnFilter,\n FilterModel,\n FilterType,\n SortModel,\n SortModelItem,\n SortDirection,\n PinnedDirection,\n TextFilterMatch,\n NumberFilterMatch,\n DateFilterMatch,\n TextFilterCondition,\n NumberFilterCondition,\n DateFilterCondition,\n SetFilterCondition,\n SelectEditorParams,\n SetFilterParams,\n CellRendererFn,\n CellClassRule,\n CellEditorFactory,\n CellStyleRule,\n CellAlign\n} from \"./types/colDef\";\nexport { isColDefGroup } from \"./types/colDef\";\nexport type {\n ValueGetterParams,\n ValueFormatterParams,\n ValueSetterParams,\n CellRendererParams,\n CellClassParams,\n EditableParams,\n CellEditorParams,\n GetRowIdParams,\n GetRowHeightParams,\n HeaderComponentParams,\n ICellEditor,\n ICellRendererResult,\n CellRendererOutput\n} from \"./types/params\";\nexport type {\n GridOptions,\n ResolvedGridOptions,\n EventHandlers,\n RowSelectionMode,\n GridSize,\n ThemeMode,\n DetailRowRendererParams,\n GridComponents,\n GridFeature,\n GridFeatureContext,\n OverlayTemplate,\n ColumnStateStore,\n StatusBarPanel,\n StatusBarConfig,\n GridDatasource,\n InfiniteGetRowsParams,\n PaginationConfig,\n WatermarkConfig\n} from \"./types/options\";\nexport { GRID_SIZE_PRESETS } from \"./core/resolveOptions\";\nexport type { GridSizePreset } from \"./core/resolveOptions\";\nexport { GRID_OPTION_META, GRID_OPTION_KEYS, DIRECT_GRID_OPTION_KEYS } from \"./core/gridOptionMetadata\";\nexport type {\n GridOptionKey,\n GridOptionMetadata,\n GridOptionUpdateMode,\n GridOptionValueKind\n} from \"./core/gridOptionMetadata\";\nexport { describeFilter } from \"./lib/filterSummary\";\nexport { buildColDefsFromSchema } from \"./lib/schema\";\nexport type { GridSchema, GridSchemaField, GridSchemaGroup, GridSchemaFieldType, SchemaSelectOption } from \"./lib/schema\";\nexport { saveColumnState, loadColumnState, clearColumnState } from \"./lib/columnStateStore\";\nexport { BUILTIN_AGG_FUNCS, createAggResolver } from \"./lib/aggregate\";\nexport type { AggFunction, AggValues } from \"./lib/aggregate\";\nexport { DEFAULT_LOCALE, LOCALE_EN, matchLocaleKey, formatText, formatTwo } from \"./lib/locale\";\nexport type { RgLocale, RgLocaleKey } from \"./lib/locale\";\nexport { toTsv, parseTsv, parseCsv, parseDelimited } from \"./lib/clipboard\";\nexport { escapeHtml, downloadFile } from \"./lib/download\";\nexport { sanitizeFormulaCell } from \"./lib/csv\";\nexport {\n registerCellRenderer,\n registerCellEditor,\n getCellRenderer,\n getCellEditor,\n clearComponentRegistries\n} from \"./lib/componentRegistry\";\nexport {\n createStatusTagRenderer,\n createProgressBarRenderer,\n createActionButtonsRenderer,\n linkRenderer,\n resolveTagVariant,\n registerBuiltinRenderers\n} from \"./lib/presetRenderers\";\nexport type {\n TagVariant,\n StatusTagConfig,\n ProgressConfig,\n ActionItem,\n ActionButtonsConfig\n} from \"./lib/presetRenderers\";\nexport { selectionColumn, indexColumn, dragColumn, actionsColumn } from \"./lib/presetColumns\";\nexport type { TooltipParams, ContextMenuParams, ContextMenuItem } from \"./types/params\";\nexport type {\n GridApi,\n CsvExportParams,\n RowTransaction,\n ImportCsvOptions,\n PrintOptions\n} from \"./types/api\";\nexport type { RowNode } from \"./types/row\";\nexport type {\n GridEventMap,\n GridEventType,\n GridEventBase,\n GridReadyEvent,\n CellClickEvent,\n CellDoubleClickEvent,\n CellContextMenuEvent,\n RowClickEvent,\n SelectionChangedEvent,\n SortChangedEvent,\n FilterChangedEvent,\n ColumnResizedEvent,\n ColumnMovedEvent,\n ColumnVisibilityChangedEvent,\n CellValueChangedEvent,\n CellEditingStartedEvent,\n CellEditingStoppedEvent,\n ModelUpdatedEvent,\n DetailToggledEvent,\n RowDragEndEvent,\n RangeSelectionChangedEvent,\n GridCellRange,\n PaginationChangedEvent,\n GridErrorEvent\n} from \"./types/events\";\nexport { EVENT_TYPES } from \"./types/events\";\nexport { Column } from \"./services/column\";\nexport { evaluateColumnFilter } from \"./services/filterService\";\nexport { sortNodes } from \"./services/sortService\";\n\nexport const version: string = packageJson.version;\n","{\n \"name\": \"@agile-team/mach-table\",\n \"version\": \"0.4.1\",\n \"description\": \"Enterprise-grade, framework-agnostic TypeScript data grid with virtualization, editing, grouping and extensibility\",\n \"keywords\": [\n \"data-grid\",\n \"table\",\n \"virtualization\",\n \"typescript\",\n \"enterprise\",\n \"vue\",\n \"react\"\n ],\n \"author\": \"Agile Team\",\n \"license\": \"MIT\",\n \"homepage\": \"https://github.com/ChenyCHENYU/MachTable#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/ChenyCHENYU/MachTable/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/ChenyCHENYU/MachTable.git\",\n \"directory\": \"packages/core\"\n },\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./styles/mach-table.css\": {\n \"types\": \"./styles/mach-table.css.d.ts\",\n \"default\": \"./styles/mach-table.css\"\n }\n },\n \"files\": [\n \"dist\",\n \"styles\"\n ],\n \"sideEffects\": [\n \"**/*.css\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:coverage\": \"vitest run --coverage\"\n }\n}\n","type EventKey<TEvents extends object> = Extract<keyof TEvents, string>;\ntype Listener<TEvent> = (event: TEvent) => void;\n\nexport class EventBus<TEvents extends object = Record<string, any>> {\n private listeners = new Map<EventKey<TEvents>, Set<Listener<any>>>();\n\n constructor(private onListenerError?: (error: unknown, eventType: EventKey<TEvents>) => void) {}\n\n on<K extends EventKey<TEvents>>(type: K, listener: Listener<TEvents[K]>): () => void {\n let set = this.listeners.get(type);\n if (!set) {\n set = new Set();\n this.listeners.set(type, set);\n }\n set.add(listener as Listener<any>);\n return () => {\n set!.delete(listener);\n };\n }\n\n once<K extends EventKey<TEvents>>(type: K, listener: Listener<TEvents[K]>): () => void {\n const off = this.on(type, (event) => {\n off();\n listener(event);\n });\n return off;\n }\n\n off<K extends EventKey<TEvents>>(type: K, listener: Listener<TEvents[K]>): void {\n const set = this.listeners.get(type);\n if (set) {\n set.delete(listener as Listener<any>);\n if (set.size === 0) this.listeners.delete(type);\n }\n }\n\n emit<K extends EventKey<TEvents>>(type: K, payload?: TEvents[K]): void {\n const set = this.listeners.get(type);\n if (!set) return;\n for (const listener of [...set]) {\n try {\n listener(payload);\n } catch (err) {\n console.error(`[mach-table] error in \"${type}\" listener`, err);\n this.onListenerError?.(err, type);\n }\n }\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import type { GridOptions, GridSize, ResolvedGridOptions } from \"../types/options\";\nimport type { ColDef } from \"../types/colDef\";\n\nexport const DEFAULT_COL_DEF: Partial<ColDef> = {\n sortable: true,\n resizable: true,\n movable: true,\n filter: false,\n minWidth: 80\n};\n\nexport interface GridSizePreset {\n rowHeight: number;\n headerHeight: number;\n fontSize: number;\n cellPadding: number;\n}\n\nexport const GRID_SIZE_PRESETS: Record<GridSize, GridSizePreset> = {\n compact: { rowHeight: 30, headerHeight: 34, fontSize: 12, cellPadding: 6 },\n normal: { rowHeight: 36, headerHeight: 40, fontSize: 13, cellPadding: 9 },\n large: { rowHeight: 44, headerHeight: 48, fontSize: 14, cellPadding: 12 }\n};\n\nfunction finiteAtLeast(value: unknown, fallback: number, min: number, integer = false): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < min) return fallback;\n return integer ? Math.floor(value) : value;\n}\n\nexport function resolveOptions<TData>(userOptions: GridOptions<TData>): ResolvedGridOptions<TData> {\n const size: GridSize = userOptions.size && Object.prototype.hasOwnProperty.call(GRID_SIZE_PRESETS, userOptions.size)\n ? userOptions.size\n : \"normal\";\n const preset = GRID_SIZE_PRESETS[size];\n const pageSize = finiteAtLeast(\n typeof userOptions.pagination === \"object\" ? userOptions.pagination.pageSize : undefined,\n 20,\n 1,\n true\n );\n const requestedPageSizes = typeof userOptions.pagination === \"object\" && Array.isArray(userOptions.pagination.pageSizeOptions)\n ? userOptions.pagination.pageSizeOptions\n : undefined;\n const pageSizeOptions = requestedPageSizes\n ? [...new Set(requestedPageSizes.map((value) => finiteAtLeast(value, 0, 1, true)).filter(Boolean))]\n : [10, 20, 50, 100];\n if (!pageSizeOptions.includes(pageSize)) pageSizeOptions.push(pageSize);\n pageSizeOptions.sort((a, b) => a - b);\n\n const resolved: ResolvedGridOptions<TData> = {\n columnDefs: Array.isArray(userOptions.columnDefs) ? userOptions.columnDefs : [],\n rowData: Array.isArray(userOptions.rowData) ? userOptions.rowData : [],\n defaultColDef: { ...DEFAULT_COL_DEF, ...(userOptions.defaultColDef ?? {}) },\n rowHeight: finiteAtLeast(userOptions.rowHeight, preset.rowHeight, 1),\n headerHeight: finiteAtLeast(userOptions.headerHeight, preset.headerHeight, 1),\n rowBuffer: finiteAtLeast(userOptions.rowBuffer, 8, 0, true),\n rowSelection: userOptions.rowSelection === \"single\" || userOptions.rowSelection === \"multiple\"\n ? userOptions.rowSelection\n : \"none\",\n multiSort: userOptions.multiSort ?? true,\n size,\n stripedRows: userOptions.stripedRows ?? false,\n showCellBorders: userOptions.showCellBorders ?? false,\n theme: userOptions.theme === \"light\" || userOptions.theme === \"dark\" || userOptions.theme === \"auto\"\n ? userOptions.theme\n : (userOptions.className?.includes(\"mach-theme-dark\") ? \"dark\" : \"light\"),\n quickFilterText: userOptions.quickFilterText ?? null,\n masterDetail: userOptions.masterDetail ?? false,\n detailRowHeight: finiteAtLeast(userOptions.detailRowHeight, 240, 1),\n detailToggleColumn: userOptions.detailToggleColumn ?? true,\n columnMenu: userOptions.columnMenu ?? false,\n columnStateKey: userOptions.columnStateKey ?? null,\n locale: userOptions.locale ?? {},\n singleClickEdit: userOptions.singleClickEdit ?? false,\n manualSorting: userOptions.manualSorting ?? false,\n manualFiltering: userOptions.manualFiltering ?? false,\n showSummary: userOptions.showSummary ?? false,\n treeData: userOptions.treeData ?? false,\n childrenKey: userOptions.childrenKey ?? \"children\",\n autoCheckedChildren: userOptions.autoCheckedChildren ?? true,\n defaultExpandAll: userOptions.defaultExpandAll ?? false,\n indexOffset: userOptions.indexOffset ?? 0,\n applyRowDrag: userOptions.applyRowDrag ?? true,\n undoStackSize: finiteAtLeast(userOptions.undoStackSize, 100, 0, true),\n pinnedTopRowData: Array.isArray(userOptions.pinnedTopRowData) ? userOptions.pinnedTopRowData : [],\n pinnedBottomRowData: Array.isArray(userOptions.pinnedBottomRowData) ? userOptions.pinnedBottomRowData : [],\n paginationEnabled:\n userOptions.pagination !== false && userOptions.datasource == null ? true : false,\n paginationPageSize: pageSize,\n paginationPageSizeOptions: pageSizeOptions,\n paginationShowTotal:\n typeof userOptions.pagination === \"object\"\n ? userOptions.pagination.showTotal !== false\n : true,\n paginationShowSizeSelector:\n typeof userOptions.pagination === \"object\"\n ? userOptions.pagination.showPageSizeSelector !== false\n : true,\n watermarkEnabled: userOptions.watermark != null && userOptions.watermark !== false,\n watermarkConfig:\n userOptions.watermark == null || userOptions.watermark === false\n ? null\n : userOptions.watermark === true\n ? { text: \"MachTable\" }\n : userOptions.watermark,\n suppressWarnings: userOptions.suppressWarnings ?? false,\n enableRangeSelection: userOptions.enableRangeSelection ?? false,\n suppressClipboard: userOptions.suppressClipboard ?? false,\n contextMenu: userOptions.contextMenu ?? false,\n tooltipShowDelay: finiteAtLeast(userOptions.tooltipShowDelay, 600, 0),\n flashCells: userOptions.flashCells ?? true,\n fillHandle: userOptions.fillHandle ?? true,\n statusBarEnabled: userOptions.statusBar === true || (typeof userOptions.statusBar === \"object\" && userOptions.statusBar != null),\n statusBarPanels:\n typeof userOptions.statusBar === \"object\" && userOptions.statusBar?.panels\n ? userOptions.statusBar.panels\n : [\"rowCount\", \"selectedRowCount\", \"rangeAggregate\"],\n blockSize: finiteAtLeast(userOptions.blockSize, 100, 1, true),\n infiniteBufferRows: finiteAtLeast(userOptions.infiniteBufferRows, 40, 0, true),\n suppressCellFocus: userOptions.suppressCellFocus ?? false,\n suppressRowHoverHighlight: userOptions.suppressRowHoverHighlight ?? false,\n suppressNoRowsOverlay: userOptions.suppressNoRowsOverlay ?? false,\n suppressHeaderFocus: userOptions.suppressHeaderFocus ?? false,\n loading: userOptions.loading ?? false,\n overlayNoRowsTemplate: userOptions.overlayNoRowsTemplate ?? \"\",\n overlayLoadingTemplate: userOptions.overlayLoadingTemplate ?? \"\",\n allowUnsafeOverlayHtml: userOptions.allowUnsafeOverlayHtml ?? false,\n className: userOptions.className ?? \"\",\n features: Array.isArray(userOptions.features) ? userOptions.features : []\n };\n\n if (userOptions.getRowId) resolved.getRowId = userOptions.getRowId;\n if (userOptions.detailRowRenderer) resolved.detailRowRenderer = userOptions.detailRowRenderer;\n if (userOptions.isRowExpandable) resolved.isRowExpandable = userOptions.isRowExpandable;\n if (userOptions.columnStateStore) resolved.columnStateStore = userOptions.columnStateStore;\n if (userOptions.aggFuncs) resolved.aggFuncs = userOptions.aggFuncs;\n if (userOptions.components) resolved.components = userOptions.components;\n if (userOptions.summaryMethod) resolved.summaryMethod = userOptions.summaryMethod;\n if (userOptions.datasource) resolved.datasource = userOptions.datasource;\n if (userOptions.getRowHeight) resolved.getRowHeight = userOptions.getRowHeight;\n if (userOptions.tooltipComponent) resolved.tooltipComponent = userOptions.tooltipComponent;\n if (userOptions.getContextMenuItems) resolved.getContextMenuItems = userOptions.getContextMenuItems;\n\n for (const key of Object.keys(userOptions) as (keyof GridOptions<TData>)[]) {\n if (key.startsWith(\"on\") && typeof userOptions[key] === \"function\") {\n Object.assign(resolved, { [key]: userOptions[key] });\n }\n }\n\n return resolved;\n}\n\nexport function mergeColDef<TData>(colDef: ColDef<TData>, defaults: Partial<ColDef<TData>>): ColDef<TData> {\n return { ...defaults, ...colDef } as ColDef<TData>;\n}\n","import type { ColDef, FilterType, PinnedDirection } from \"../types/colDef\";\nimport type { ColumnGroup } from \"./columnGroup\";\n\nexport class Column<TData = any> {\n readonly id: string;\n readonly colDef: ColDef<TData>;\n hide: boolean;\n pinned: PinnedDirection | null;\n manualWidth: number | null = null;\n currentWidth = 0;\n parentGroup: ColumnGroup<TData> | null = null;\n level = 0;\n isDetailToggle = false;\n\n constructor(id: string, colDef: ColDef<TData>) {\n this.id = id;\n this.colDef = colDef;\n this.hide = colDef.hide ?? false;\n const p = colDef.pinned;\n this.pinned = p === true ? \"left\" : p === false || p == null ? null : p;\n }\n\n get sortable(): boolean {\n return this.colDef.sortable !== false;\n }\n\n get resizable(): boolean {\n return this.colDef.resizable !== false;\n }\n\n get movable(): boolean {\n return this.colDef.movable !== false;\n }\n\n get filterable(): boolean {\n return this.colDef.filter != null && this.colDef.filter !== false;\n }\n\n get filterType(): FilterType {\n const f = this.colDef.filter;\n return f === true ? \"text\" : (f as FilterType) ?? \"text\";\n }\n\n get hasCheckbox(): boolean {\n return this.colDef.checkboxSelection === true;\n }\n}\n","import type { ColDefGroup } from \"../types/colDef\";\nimport type { Column } from \"./column\";\n\nexport class ColumnGroup<TData = any> {\n readonly groupId: string;\n readonly def: ColDefGroup<TData>;\n parent: ColumnGroup<TData> | null = null;\n children: (ColumnGroup<TData> | Column<TData>)[] = [];\n\n constructor(groupId: string, def: ColDefGroup<TData>) {\n this.groupId = groupId;\n this.def = def;\n }\n\n get headerName(): string {\n return this.def.headerName ?? this.def.groupId ?? \"\";\n }\n\n getLeafColumns(out: Column<TData>[] = []): Column<TData>[] {\n for (const child of this.children) {\n if (child instanceof ColumnGroup) child.getLeafColumns(out);\n else out.push(child);\n }\n return out;\n }\n}\n","import type {\n CellClassParams,\n CellEditorParams,\n CellRendererParams,\n EditableParams,\n HeaderComponentParams,\n ICellEditor,\n ICellRendererResult,\n ValueFormatterParams,\n ValueGetterParams,\n ValueSetterParams\n} from \"./params\";\nimport type { CellClickEvent, CellDoubleClickEvent } from \"./events\";\nimport type { RowNode } from \"./row\";\n\nexport type SortDirection = \"asc\" | \"desc\";\nexport type PinnedDirection = \"left\" | \"right\";\nexport type FilterType = \"text\" | \"number\" | \"date\" | \"set\";\nexport type CellAlign = \"left\" | \"center\" | \"right\";\n\nexport type TextFilterMatch =\n | \"contains\"\n | \"notContains\"\n | \"equals\"\n | \"notEquals\"\n | \"startsWith\"\n | \"endsWith\"\n | \"blank\"\n | \"notBlank\";\n\nexport type NumberFilterMatch =\n | \"equals\"\n | \"notEquals\"\n | \"lessThan\"\n | \"lessThanOrEqual\"\n | \"greaterThan\"\n | \"greaterThanOrEqual\"\n | \"inRange\"\n | \"blank\"\n | \"notBlank\";\n\nexport type DateFilterMatch =\n | \"equals\"\n | \"notEquals\"\n | \"lessThan\"\n | \"greaterThan\"\n | \"inRange\"\n | \"blank\"\n | \"notBlank\";\n\nexport interface TextFilterCondition {\n match: TextFilterMatch;\n value?: string;\n}\n\nexport interface NumberFilterCondition {\n match: NumberFilterMatch;\n value?: number;\n value2?: number;\n}\n\nexport interface DateFilterCondition {\n match: DateFilterMatch;\n value?: string;\n value2?: string;\n}\n\nexport interface SetFilterCondition {\n values: (string | number | null)[];\n}\n\nexport interface TextColumnFilter {\n type: \"text\";\n operator?: \"and\" | \"or\";\n conditions: TextFilterCondition[];\n}\n\nexport interface NumberColumnFilter {\n type: \"number\";\n operator?: \"and\" | \"or\";\n conditions: NumberFilterCondition[];\n}\n\nexport interface DateColumnFilter {\n type: \"date\";\n operator?: \"and\" | \"or\";\n conditions: DateFilterCondition[];\n}\n\nexport interface SetColumnFilter {\n type: \"set\";\n values: (string | number | null)[];\n}\n\nexport type ColumnFilter = TextColumnFilter | NumberColumnFilter | DateColumnFilter | SetColumnFilter;\nexport type FilterModel = Record<string, ColumnFilter>;\n\nexport interface SortModelItem {\n colId: string;\n direction: SortDirection;\n}\nexport type SortModel = SortModelItem[];\n\nexport interface SelectEditorParams {\n values: (string | number)[];\n}\n\nexport interface SetFilterParams {\n values?: (string | number | null)[];\n maxValues?: number;\n}\n\nexport type CellEditorFactory = (params: CellEditorParams) => ICellEditor;\n\nexport type CellRendererFn = (params: CellRendererParams) => string | HTMLElement | ICellRendererResult | null | undefined;\n\nexport type CellClassRule = string | string[] | ((params: CellClassParams) => string | string[] | null | undefined);\n\nexport type CellStyleRule = Partial<CSSStyleDeclaration> | ((params: CellClassParams<any, any>) => Partial<CSSStyleDeclaration> | null | undefined);\n\nexport interface ColDef<TData = any, TValue = any> {\n colId?: string;\n field?: string;\n headerName?: string;\n align?: CellAlign;\n headerAlign?: CellAlign;\n headerClass?: string | string[];\n headerTooltip?: string;\n headerComponent?: (params: HeaderComponentParams<TData>) => string | HTMLElement | ICellRendererResult | null | undefined;\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n flex?: number;\n hide?: boolean;\n pinned?: PinnedDirection | boolean;\n sortable?: boolean;\n resizable?: boolean;\n movable?: boolean;\n filter?: boolean | FilterType;\n filterParams?: SetFilterParams;\n editable?: boolean | ((params: EditableParams<TData, TValue>) => boolean);\n cellEditor?: \"text\" | \"number\" | \"date\" | \"select\" | CellEditorFactory | string;\n cellEditorParams?: SelectEditorParams;\n wrapText?: boolean;\n checkboxSelection?: boolean;\n rowGroup?: boolean;\n aggFunc?: string;\n cellStyle?: CellStyleRule;\n selectable?: (params: CellClassParams<TData, TValue>) => boolean;\n singleClickEdit?: boolean;\n tooltipValueGetter?: (params: ValueFormatterParams<TData, TValue>) => string | null | undefined;\n rowSpan?: (params: CellClassParams<TData, TValue>) => number;\n autoRowSpan?: boolean;\n colSpan?: (params: CellClassParams<TData, TValue>) => number;\n autoHeight?: boolean;\n validate?: (newValue: TValue, params: ValueSetterParams<TData, TValue>) => string | true | null | undefined;\n rowDrag?: boolean;\n valueGetter?: (params: ValueGetterParams<TData, TValue>) => TValue;\n valueSetter?: (params: ValueSetterParams<TData, TValue>) => boolean;\n valueFormatter?: (params: ValueFormatterParams<TData, TValue>) => any;\n cellRenderer?: CellRendererFn | string;\n cellRendererParams?: Record<string, any>;\n cellClass?: CellClassRule;\n comparator?: (valueA: any, valueB: any, nodeA: RowNode<TData>, nodeB: RowNode<TData>) => number;\n type?: string;\n initialSort?: SortDirection;\n onCellClick?: (event: CellClickEvent<TData, TValue>) => void;\n onCellDoubleClick?: (event: CellDoubleClickEvent<TData, TValue>) => void;\n}\n\nexport interface ColDefGroup<TData = any> {\n groupId?: string;\n headerName?: string;\n headerClass?: string | string[];\n children: (ColDefGroup<TData> | ColDef<TData>)[];\n}\n\nexport type ColDefOrGroup<TData = any> = ColDefGroup<TData> | ColDef<TData>;\n\nexport function isColDefGroup<TData = any>(def: ColDefOrGroup<TData>): def is ColDefGroup<TData> {\n return Array.isArray((def as ColDefGroup<TData>).children);\n}\n\nexport interface ColumnState {\n colId: string;\n hide?: boolean;\n width?: number;\n pinned?: \"left\" | \"right\" | null;\n sort?: SortDirection | null;\n sortIndex?: number | null;\n}\n","export interface WidthInput {\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n flex?: number;\n}\n\nexport const DEFAULT_COLUMN_WIDTH = 150;\nexport const DEFAULT_MIN_WIDTH = 80;\n\nexport function clampWidth(w: number, input: WidthInput): number {\n const min = input.minWidth ?? DEFAULT_MIN_WIDTH;\n const max = input.maxWidth ?? Number.MAX_SAFE_INTEGER;\n return Math.max(min, Math.min(max, w));\n}\n\nexport function computeColumnWidths(cols: WidthInput[], availableWidth: number): number[] {\n const widths = cols.map((c) => clampWidth(c.width ?? DEFAULT_COLUMN_WIDTH, c));\n\n const flexCols: number[] = [];\n let flexTotal = 0;\n cols.forEach((c, i) => {\n const f = c.flex ?? 0;\n if (f > 0) {\n flexCols.push(i);\n flexTotal += f;\n }\n });\n\n let total = 0;\n for (const w of widths) total += w;\n\n if (flexTotal > 0 && availableWidth > total) {\n let extra = availableWidth - total;\n for (let pass = 0; pass < 4 && extra > 0.5 && flexCols.length > 0; pass++) {\n const remainingFlex: number[] = [];\n let remainingTotal = 0;\n for (const i of flexCols) {\n const f = cols[i].flex ?? 0;\n remainingFlex.push(i);\n remainingTotal += f;\n }\n const consumed: number[] = [];\n for (let k = 0; k < remainingFlex.length; k++) {\n const i = remainingFlex[k];\n const f = cols[i].flex ?? 0;\n const share = (extra * f) / remainingTotal;\n const before = widths[i];\n widths[i] = clampWidth(before + share, cols[i]);\n consumed.push(widths[i] - before);\n }\n let used = 0;\n for (const c of consumed) used += c;\n extra -= used;\n const stillFlexible = remainingFlex.filter((_index, k) => consumed[k] > 0.001);\n if (stillFlexible.length === remainingFlex.length) break;\n flexCols.length = 0;\n for (const i of stillFlexible) flexCols.push(i);\n }\n }\n\n return widths;\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport { Column } from \"./column\";\nimport { ColumnGroup } from \"./columnGroup\";\nimport type {\n ColDef,\n ColDefOrGroup,\n ColumnState,\n SortModel,\n SortModelItem,\n SortDirection,\n PinnedDirection\n} from \"../types/colDef\";\nimport { isColDefGroup } from \"../types/colDef\";\nimport { mergeColDef } from \"../core/resolveOptions\";\nimport { computeColumnWidths, clampWidth, DEFAULT_COLUMN_WIDTH } from \"../lib/layout\";\n\nexport type PaneType = \"left\" | \"center\" | \"right\";\n\nexport const DETAIL_TOGGLE_COL_ID = \"__rg_detail_toggle__\";\ntype ColumnModelContext = Pick<GridCore<any>, \"options\">;\n\nexport class ColumnModel {\n private columns: Column[] = [];\n private rootChildren: (ColumnGroup<any> | Column<any>)[] = [];\n private left: Column[] = [];\n private center: Column[] = [];\n private right: Column[] = [];\n private sortModel: SortModelItem[] = [];\n private defs: ColDefOrGroup<any>[] = [];\n private headerDepth = 1;\n private flatIndexById = new Map<string, number>();\n viewportWidth = 0;\n\n constructor(private core: ColumnModelContext) {}\n\n setColumnDefs(colDefs: ColDefOrGroup<any>[] | null | undefined): void {\n this.defs = colDefs ? [...colDefs] : [];\n const prev = new Map(this.columns.map((c) => [c.id, c]));\n const defaults = this.core.options.defaultColDef;\n const usedIds = new Set<string>(\n this.core.options.masterDetail && this.core.options.detailToggleColumn\n ? [DETAIL_TOGGLE_COL_ID]\n : []\n );\n\n const build = (list: ColDefOrGroup<any>[], parent: ColumnGroup<any> | null, level: number): (ColumnGroup<any> | Column<any>)[] =>\n list.map((def, i) => {\n if (isColDefGroup(def)) {\n const groupId = def.groupId ?? def.headerName ?? `group_${i}_${level}`;\n const group = new ColumnGroup(groupId, def);\n group.parent = parent;\n group.children = build(def.children, group, level + 1);\n return group;\n }\n const colDef = def as ColDef<any>;\n const id = colDef.colId ?? colDef.field ?? `col_${i}`;\n let uniqueId = id;\n let suffix = 2;\n while (usedIds.has(uniqueId)) uniqueId = `${id}_${suffix++}`;\n usedIds.add(uniqueId);\n const column = new Column(uniqueId, mergeColDef(colDef, defaults));\n column.parentGroup = parent;\n column.level = level;\n const p = prev.get(uniqueId);\n if (p) {\n column.manualWidth = p.manualWidth;\n column.hide = p.hide;\n column.pinned = p.pinned;\n }\n return column;\n });\n\n this.rootChildren = build(this.defs, null, 0);\n\n if (this.core.options.masterDetail && this.core.options.detailToggleColumn) {\n const toggleCol = new Column(DETAIL_TOGGLE_COL_ID, {\n colId: DETAIL_TOGGLE_COL_ID,\n headerName: \"\",\n width: 38,\n pinned: \"left\",\n sortable: false,\n resizable: false,\n movable: false,\n filter: false\n });\n toggleCol.isDetailToggle = true;\n this.rootChildren.unshift(toggleCol);\n }\n\n this.columns = this.collectLeaves(this.rootChildren);\n this.headerDepth = this.columns.reduce((max, c) => Math.max(max, c.level + 1), 1);\n\n this.sortModel = this.sortModel.filter((s) => this.columns.some((c) => c.id === s.colId));\n if (this.sortModel.length === 0) {\n const initial: SortModelItem[] = [];\n for (const c of this.columns) {\n if (c.colDef.initialSort) initial.push({ colId: c.id, direction: c.colDef.initialSort });\n }\n this.sortModel = initial;\n }\n\n this.regroup();\n }\n\n private collectLeaves(children: (ColumnGroup<any> | Column<any>)[], out: Column<any>[] = []): Column<any>[] {\n for (const child of children) {\n if (child instanceof ColumnGroup) this.collectLeaves(child.children, out);\n else out.push(child);\n }\n return out;\n }\n\n private regroup(): void {\n const visible = this.columns.filter((c) => !c.hide);\n this.left = visible.filter((c) => c.pinned === \"left\");\n this.right = visible.filter((c) => c.pinned === \"right\");\n this.center = visible.filter((c) => c.pinned === null);\n this.flatIndexById.clear();\n this.getOrderedVisible().forEach((c, i) => this.flatIndexById.set(c.id, i));\n }\n\n getFlatIndex(colId: string): number {\n return this.flatIndexById.get(colId) ?? -1;\n }\n\n getColumns(): Column[] {\n return this.columns;\n }\n\n getColumnDefs(): ColDefOrGroup<any>[] {\n return this.defs;\n }\n\n getRootChildren(): (ColumnGroup<any> | Column<any>)[] {\n return this.rootChildren;\n }\n\n getHeaderDepth(): number {\n return this.headerDepth;\n }\n\n getColumn(colId: string): Column | undefined {\n return this.columns.find((c) => c.id === colId);\n }\n\n getPaneColumns(pane: PaneType): Column[] {\n return pane === \"left\" ? this.left : pane === \"right\" ? this.right : this.center;\n }\n\n getOrderedVisible(): Column[] {\n return [...this.left, ...this.center, ...this.right];\n }\n\n getRowGroupColumns(): Column[] {\n return this.getOrderedVisible().filter((c) => c.colDef.rowGroup === true);\n }\n\n getAggColumns(): Column[] {\n return this.getOrderedVisible().filter((c) => c.colDef.aggFunc != null && c.colDef.rowGroup !== true);\n }\n\n hasColSpan(): boolean {\n return this.center.some((c) => c.colDef.colSpan != null);\n }\n\n getGroupLabelColumn(): Column | undefined {\n const ordered = this.getOrderedVisible();\n return (\n this.center.find((c) => !c.hasCheckbox && !c.isDetailToggle) ??\n ordered.find((c) => !c.hasCheckbox && !c.isDetailToggle) ??\n ordered[0]\n );\n }\n\n paneOf(column: Column): PaneType {\n return column.pinned === \"left\" ? \"left\" : column.pinned === \"right\" ? \"right\" : \"center\";\n }\n\n computeLayout(viewportWidth: number): void {\n this.viewportWidth = viewportWidth;\n\n let pinnedTotal = 0;\n for (const c of [...this.left, ...this.right]) {\n c.currentWidth = clampWidth(c.manualWidth ?? c.colDef.width ?? DEFAULT_COLUMN_WIDTH, this.widthInputOf(c));\n pinnedTotal += c.currentWidth;\n }\n\n const centerInputs = this.center.map((c) => this.widthInputOf(c));\n const available = Math.max(0, viewportWidth - pinnedTotal);\n const widths = computeColumnWidths(centerInputs, available);\n this.center.forEach((c, i) => {\n c.currentWidth = widths[i];\n });\n }\n\n private widthInputOf(c: Column): { width?: number; minWidth?: number; maxWidth?: number; flex?: number } {\n const def = c.colDef;\n if (c.manualWidth != null) {\n return { width: c.manualWidth, minWidth: def.minWidth, maxWidth: def.maxWidth };\n }\n return { width: def.width, minWidth: def.minWidth, maxWidth: def.maxWidth, flex: def.flex };\n }\n\n setColumnWidth(column: Column, width: number): void {\n column.manualWidth = clampWidth(width, this.widthInputOf(column));\n }\n\n setColumnVisibility(colId: string, visible: boolean): void {\n const column = this.getColumn(colId);\n if (!column || column.hide === !visible) return;\n column.hide = !visible;\n this.regroup();\n }\n\n moveColumn(colId: string, toIndex: number): boolean {\n const column = this.getColumn(colId);\n if (!column) return false;\n\n const pane = this.paneOf(column);\n const inScope = (child: Column<any>) =>\n column.parentGroup ? true : this.paneOf(child) === pane;\n\n const container: (ColumnGroup<any> | Column<any>)[] = column.parentGroup\n ? column.parentGroup.children\n : this.rootChildren;\n\n const siblings = container.filter(\n (child): child is Column<any> => child instanceof Column && !child.hide && inScope(child)\n );\n const from = siblings.indexOf(column);\n if (from < 0) return false;\n siblings.splice(from, 1);\n const target = Math.max(0, Math.min(toIndex, siblings.length));\n siblings.splice(target, 0, column);\n\n const leafSlots: number[] = [];\n container.forEach((child, idx) => {\n if (child instanceof Column && !child.hide && inScope(child)) leafSlots.push(idx);\n });\n if (leafSlots.length !== siblings.length) return false;\n leafSlots.forEach((slotIdx, i) => {\n container[slotIdx] = siblings[i];\n });\n\n this.columns = this.collectLeaves(this.rootChildren);\n this.regroup();\n return true;\n }\n\n setColumnPinned(colId: string, pinned: PinnedDirection | null): void {\n const column = this.getColumn(colId);\n if (!column) return;\n column.pinned = pinned;\n this.regroup();\n }\n\n getColumnState(): ColumnState[] {\n return this.columns.map((c) => {\n const sortIndex = this.sortModel.findIndex((s) => s.colId === c.id);\n const state: ColumnState = {\n colId: c.id,\n hide: c.hide,\n width: c.manualWidth ?? c.currentWidth,\n pinned: c.pinned\n };\n if (sortIndex >= 0) {\n state.sort = this.sortModel[sortIndex].direction;\n state.sortIndex = sortIndex;\n } else {\n state.sort = null;\n state.sortIndex = null;\n }\n return state;\n });\n }\n\n applyColumnState(states: ColumnState[]): void {\n const stateById = new Map(states.map((s) => [s.colId, s]));\n for (const c of this.columns) {\n const s = stateById.get(c.id);\n if (!s) continue;\n if (s.hide != null) c.hide = s.hide;\n if (s.width != null) c.manualWidth = s.width;\n if (s.pinned !== undefined) c.pinned = s.pinned;\n }\n const nextSort: { colId: string; direction: SortDirection; sortIndex: number }[] = [];\n for (const s of states) {\n if (s.sort && this.columns.some((c) => c.id === s.colId)) {\n nextSort.push({ colId: s.colId, direction: s.sort, sortIndex: s.sortIndex ?? 0 });\n }\n }\n nextSort.sort((a, b) => a.sortIndex - b.sortIndex);\n this.sortModel = nextSort.map(({ colId, direction }) => ({ colId, direction }));\n this.applyStateOrder(states);\n this.regroup();\n }\n\n private applyStateOrder(states: ColumnState[]): void {\n const orderById = new Map<string, number>();\n states.forEach((s, i) => orderById.set(s.colId, i));\n const paneOfCol = (c: Column) => (c.pinned === \"left\" ? \"left\" : c.pinned === \"right\" ? \"right\" : \"center\");\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const current = this.rootChildren.filter(\n (child): child is Column<any> =>\n child instanceof Column && !child.hide && child.parentGroup === null && paneOfCol(child) === pane\n );\n if (current.length < 2) continue;\n const sorted = current\n .slice()\n .sort((a, b) => (orderById.get(a.id) ?? Number.MAX_SAFE_INTEGER) - (orderById.get(b.id) ?? Number.MAX_SAFE_INTEGER));\n if (sorted.every((c, i) => c === current[i])) continue;\n\n const slots: number[] = [];\n this.rootChildren.forEach((child, idx) => {\n if (child instanceof Column && !child.hide && child.parentGroup === null && paneOfCol(child) === pane) {\n slots.push(idx);\n }\n });\n slots.forEach((slotIdx, i) => {\n this.rootChildren[slotIdx] = sorted[i];\n });\n }\n this.columns = this.collectLeaves(this.rootChildren);\n }\n\n resetColumnState(): void {\n for (const c of this.columns) {\n c.manualWidth = null;\n c.hide = c.colDef.hide ?? false;\n const p = c.colDef.pinned;\n c.pinned = p === true ? \"left\" : p === false || p == null ? null : p;\n }\n this.sortModel = [];\n this.regroup();\n }\n\n getSortModel(): SortModel {\n return this.sortModel.map((s) => ({ ...s }));\n }\n\n applySortModel(sortModel: SortModel | null): void {\n if (!sortModel || sortModel.length === 0) {\n this.sortModel = [];\n return;\n }\n this.sortModel = sortModel\n .filter((s) => this.columns.some((c) => c.id === s.colId) && (s.direction === \"asc\" || s.direction === \"desc\"))\n .map((s) => ({ colId: s.colId, direction: s.direction }));\n }\n\n cycleSort(column: Column, additive: boolean): void {\n const model = [...this.sortModel];\n const idx = model.findIndex((s) => s.colId === column.id);\n const current = idx >= 0 ? model[idx].direction : null;\n const next: SortDirection | null = current === null ? \"asc\" : current === \"asc\" ? \"desc\" : null;\n const multi = additive && this.core.options.multiSort;\n\n if (multi) {\n if (next === null) {\n if (idx >= 0) model.splice(idx, 1);\n } else if (idx >= 0) {\n model[idx] = { colId: column.id, direction: next };\n } else {\n model.push({ colId: column.id, direction: next });\n }\n } else {\n model.length = 0;\n if (next) model.push({ colId: column.id, direction: next });\n }\n this.sortModel = model;\n }\n}\n","import type { ColumnFilter, FilterModel, TextFilterCondition, NumberFilterCondition, DateFilterCondition } from \"../types/colDef\";\nimport type { RowNode } from \"../types/row\";\nimport type { Column } from \"./column\";\n\nfunction textOf(value: any): string {\n return value == null ? \"\" : String(value).toLowerCase();\n}\n\nexport function evaluateTextFilter(value: any, conditions: TextFilterCondition[], operator: \"and\" | \"or\"): boolean {\n const v = textOf(value);\n const results = conditions.map((c) => {\n const fv = (c.value ?? \"\").toLowerCase();\n switch (c.match) {\n case \"contains\":\n return v.includes(fv);\n case \"notContains\":\n return !v.includes(fv);\n case \"equals\":\n return v === fv;\n case \"notEquals\":\n return v !== fv;\n case \"startsWith\":\n return v.startsWith(fv);\n case \"endsWith\":\n return v.endsWith(fv);\n case \"blank\":\n return v === \"\";\n case \"notBlank\":\n return v !== \"\";\n default:\n return true;\n }\n });\n if (results.length === 0) return true;\n return operator === \"or\" ? results.some(Boolean) : results.every(Boolean);\n}\n\nexport function evaluateNumberFilter(value: any, conditions: NumberFilterCondition[], operator: \"and\" | \"or\"): boolean {\n const results = conditions.map((c) => {\n const isBlank = value == null || value === \"\";\n if (c.match === \"blank\") return isBlank;\n if (c.match === \"notBlank\") return !isBlank;\n if (isBlank) return false;\n const n = typeof value === \"number\" ? value : Number(value);\n if (isNaN(n)) return false;\n const f = c.value;\n if (f == null || isNaN(f as number)) return false;\n switch (c.match) {\n case \"equals\":\n return n === f;\n case \"notEquals\":\n return n !== f;\n case \"lessThan\":\n return n < f;\n case \"lessThanOrEqual\":\n return n <= f;\n case \"greaterThan\":\n return n > f;\n case \"greaterThanOrEqual\":\n return n >= f;\n case \"inRange\":\n return n >= f && n <= (c.value2 ?? f);\n default:\n return true;\n }\n });\n if (results.length === 0) return true;\n return operator === \"or\" ? results.some(Boolean) : results.every(Boolean);\n}\n\nfunction toTime(value: any): number | null {\n if (value == null || value === \"\") return null;\n if (value instanceof Date) return isNaN(value.getTime()) ? null : value.getTime();\n if (typeof value === \"number\") return value;\n const t = Date.parse(String(value));\n return isNaN(t) ? null : t;\n}\n\nexport function evaluateDateFilter(value: any, conditions: DateFilterCondition[], operator: \"and\" | \"or\"): boolean {\n const results = conditions.map((c) => {\n const isBlank = toTime(value) == null;\n if (c.match === \"blank\") return isBlank;\n if (c.match === \"notBlank\") return !isBlank;\n if (isBlank) return false;\n const t = toTime(value)!;\n const f = c.value != null ? toTime(c.value) : null;\n if (f == null) return false;\n switch (c.match) {\n case \"equals\":\n return t === f;\n case \"notEquals\":\n return t !== f;\n case \"lessThan\":\n return t < f;\n case \"greaterThan\":\n return t > f;\n case \"inRange\": {\n const f2 = c.value2 != null ? toTime(c.value2) : null;\n return f2 != null ? t >= f && t <= f2 : t >= f;\n }\n default:\n return true;\n }\n });\n if (results.length === 0) return true;\n return operator === \"or\" ? results.some(Boolean) : results.every(Boolean);\n}\n\nexport function evaluateSetFilter(value: any, filterValues: (string | number | null)[]): boolean {\n if (filterValues.length === 0) return true;\n return filterValues.some((v) => (v == null && value == null) || v === value);\n}\n\nexport function evaluateColumnFilter(value: any, filter: ColumnFilter): boolean {\n const operator = filter.type !== \"set\" && filter.operator === \"or\" ? \"or\" : \"and\";\n switch (filter.type) {\n case \"text\":\n return evaluateTextFilter(value, filter.conditions, operator);\n case \"number\":\n return evaluateNumberFilter(value, filter.conditions, operator);\n case \"date\":\n return evaluateDateFilter(value, filter.conditions, operator);\n case \"set\":\n return evaluateSetFilter(value, filter.values);\n default:\n return true;\n }\n}\n\nexport function doesNodePassFilters(\n node: RowNode<any>,\n columns: Column[],\n filterModel: FilterModel,\n quickFilter: string | null,\n getCellValue: (node: RowNode<any>, column: Column) => any\n): boolean {\n for (const colId of Object.keys(filterModel)) {\n const filter = filterModel[colId];\n const column = columns.find((c) => c.id === colId);\n if (!column) continue;\n const value = getCellValue(node, column);\n if (!evaluateColumnFilter(value, filter)) return false;\n }\n\n if (quickFilter && quickFilter.trim() !== \"\") {\n const tokens = quickFilter.trim().toLowerCase().split(/\\s+/);\n for (const token of tokens) {\n const hit = columns.some((column) => textOf(getCellValue(node, column)).includes(token));\n if (!hit) return false;\n }\n }\n\n return true;\n}\n","const collator = typeof Intl !== \"undefined\"\n ? new Intl.Collator(undefined, { numeric: true, sensitivity: \"base\" })\n : null;\n\nexport function defaultComparator(valueA: any, valueB: any): number {\n const aEmpty = valueA == null || valueA === \"\";\n const bEmpty = valueB == null || valueB === \"\";\n if (aEmpty && bEmpty) return 0;\n if (aEmpty) return 1;\n if (bEmpty) return -1;\n\n if (typeof valueA === \"number\" && typeof valueB === \"number\") {\n if (isNaN(valueA) && isNaN(valueB)) return 0;\n if (isNaN(valueA)) return 1;\n if (isNaN(valueB)) return -1;\n return valueA - valueB;\n }\n if (valueA instanceof Date && valueB instanceof Date) {\n return valueA.getTime() - valueB.getTime();\n }\n if (typeof valueA === \"boolean\" && typeof valueB === \"boolean\") {\n return valueA === valueB ? 0 : valueA ? 1 : -1;\n }\n const a = String(valueA);\n const b = String(valueB);\n return collator ? collator.compare(a, b) : a.localeCompare(b);\n}\n","import { defaultComparator } from \"../lib/compare\";\nimport type { SortModel } from \"../types/colDef\";\nimport type { RowNode } from \"../types/row\";\nimport type { Column } from \"./column\";\n\nexport function sortNodes<TData>(\n nodes: RowNode<TData>[],\n sortModel: SortModel,\n columns: Column[],\n getCellValue: (node: RowNode<TData>, column: Column) => any\n): RowNode<TData>[] {\n const colById = new Map<string, Column>();\n for (const c of columns) colById.set(c.id, c);\n\n const comparators: ((a: any, b: any, na: RowNode<TData>, nb: RowNode<TData>) => number)[] = [];\n const directions: (\"asc\" | \"desc\")[] = [];\n for (const item of sortModel) {\n const column = colById.get(item.colId);\n if (!column) continue;\n comparators.push(column.colDef.comparator ?? defaultComparator);\n directions.push(item.direction);\n }\n\n const decorated = nodes.map((node) => ({\n node,\n values: sortModel.map((s) => getCellValue(node, colById.get(s.colId)!))\n }));\n\n decorated.sort((a, b) => {\n for (let i = 0; i < comparators.length; i++) {\n const r = comparators[i](a.values[i], b.values[i], a.node, b.node);\n if (r !== 0) return directions[i] === \"asc\" ? r : -r;\n }\n return 0;\n });\n\n return decorated.map((d) => d.node);\n}\n","export type AggValues = Record<string, any>;\n\nexport type AggFunction = (values: any[]) => any;\n\nfunction numeric(values: any[]): number[] {\n return values.filter((v): v is number => typeof v === \"number\" && !isNaN(v));\n}\n\nexport const BUILTIN_AGG_FUNCS: Record<string, AggFunction> = {\n sum: (values) => numeric(values).reduce((acc, v) => acc + v, 0),\n avg: (values) => {\n const nums = numeric(values);\n return nums.length === 0 ? null : nums.reduce((acc, v) => acc + v, 0) / nums.length;\n },\n count: (values) => values.length,\n min: (values) => {\n const nums = numeric(values);\n return nums.length === 0 ? null : Math.min(...nums);\n },\n max: (values) => {\n const nums = numeric(values);\n return nums.length === 0 ? null : Math.max(...nums);\n },\n first: (values) => (values.length > 0 ? values[0] : null),\n last: (values) => (values.length > 0 ? values[values.length - 1] : null)\n};\n\nexport function createAggResolver(custom?: Record<string, AggFunction>): (name: string) => AggFunction | undefined {\n const merged = { ...BUILTIN_AGG_FUNCS, ...(custom ?? {}) };\n return (name: string) => merged[name];\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { RowNode } from \"../types/row\";\nimport type { FilterModel } from \"../types/colDef\";\nimport type { RowTransaction } from \"../types/api\";\nimport { doesNodePassFilters } from \"./filterService\";\nimport { sortNodes } from \"./sortService\";\nimport { createAggResolver } from \"../lib/aggregate\";\nimport { defaultComparator } from \"../lib/compare\";\n\ntype ColumnLike = import(\"./column\").Column;\ntype RowModelContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"columnModel\"\n | \"emit\"\n | \"getApi\"\n | \"getCellValue\"\n | \"getLocaleText\"\n | \"headerRenderer\"\n | \"isDestroyed\"\n | \"nextId\"\n | \"options\"\n | \"relayout\"\n | \"reportError\"\n | \"selectionService\"\n | \"skeleton\"\n | \"undoService\"\n>;\n\nfunction readChildren(data: unknown, key: string): unknown[] | undefined {\n if (data == null || typeof data !== \"object\") return undefined;\n const value = (data as Record<string, unknown>)[key];\n return Array.isArray(value) ? value : undefined;\n}\n\nexport class RowModel<TData = any> {\n private all: RowNode<TData>[] = [];\n private roots: RowNode<TData>[] = [];\n private childIds = new Map<string, string[]>();\n private displayed: RowNode<TData>[] = [];\n private nodesById = new Map<string, RowNode<TData>>();\n private filterModel: FilterModel = {};\n private quickFilter: string | null = null;\n private expandedIds = new Set<string>();\n private groupExpandedIds = new Set<string>();\n private knownGroupIds: string[] = [];\n private spanInfo = new Map<string, Int32Array>();\n private mastersBuf: RowNode<TData>[] = [];\n private infiniteLastRow: number | null = null;\n private infiniteRequested = false;\n private infiniteLoading = false;\n private infiniteSeq = 0;\n private infiniteAbort: AbortController | null = null;\n private infinitePendingResolve: (() => void) | null = null;\n private treeDepth = new WeakMap<RowNode<TData>, number>();\n private rowSequence = new WeakMap<RowNode<TData>, number>();\n\n constructor(private core: RowModelContext) {}\n\n resolveRowId(data: TData, index: number, fallback: string): string {\n const getRowId = this.core.options.getRowId;\n if (!getRowId) return fallback;\n try {\n const id = getRowId({ data, index, api: this.core.getApi() });\n if (typeof id === \"string\" && id.length > 0) return id;\n this.core.reportError(new Error(\"getRowId must return a non-empty string\"), \"getRowId\", { index });\n } catch (error) {\n this.core.reportError(error, \"getRowId\", { index });\n }\n return fallback;\n }\n\n get isTree(): boolean {\n return this.core.options.treeData;\n }\n\n get isInfinite(): boolean {\n return this.core.options.datasource != null;\n }\n\n getDisplayTotalCount(): number {\n if (this.isInfinite) {\n const detailRows = Math.max(0, this.displayed.length - this.all.length);\n return (this.infiniteLastRow ?? this.all.length) + detailRows;\n }\n return this.displayed.length;\n }\n\n isLoadingInfinite(): boolean {\n return this.infiniteLoading;\n }\n\n startInfinite(): Promise<void> {\n if (!this.isInfinite) return Promise.resolve();\n this.cancelInfiniteRequest();\n this.infiniteLastRow = null;\n this.infiniteRequested = false;\n this.all = [];\n this.roots = [];\n this.nodesById.clear();\n this.expandedIds.clear();\n this.core.undoService.clear();\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n return this.loadBlock(0);\n }\n\n reloadInfinite(): Promise<void> {\n if (!this.isInfinite) return Promise.resolve();\n return this.startInfinite();\n }\n\n private setInfiniteLoading(v: boolean): void {\n this.infiniteLoading = v;\n this.core.skeleton.setInfiniteLoading(v, this.core.getLocaleText(\"loading\"));\n }\n\n private loadBlock(start: number, end?: number): Promise<void> {\n if (!this.isInfinite || this.infiniteRequested) return Promise.resolve();\n if (this.infiniteLastRow != null && start >= this.infiniteLastRow) return Promise.resolve();\n const datasource = this.core.options.datasource!;\n const blockSize = this.core.options.blockSize;\n const stop = end ?? start + blockSize;\n if (stop <= start) return Promise.resolve();\n const seq = ++this.infiniteSeq;\n const controller = new AbortController();\n this.infiniteAbort = controller;\n this.infiniteRequested = true;\n this.setInfiniteLoading(true);\n\n return new Promise<void>((resolve) => {\n let settled = false;\n this.infinitePendingResolve = resolve;\n const done = (reason?: unknown) => {\n if (settled) return;\n settled = true;\n if (seq === this.infiniteSeq) {\n this.infiniteRequested = false;\n this.infiniteAbort = null;\n this.infinitePendingResolve = null;\n this.setInfiniteLoading(false);\n if (reason != null && (reason as { name?: string })?.name !== \"AbortError\") {\n this.core.reportError(reason, \"datasource.getRows\", { startRow: start, endRow: stop });\n }\n }\n resolve();\n };\n\n try {\n const request = datasource.getRows({\n startRow: start,\n endRow: stop,\n sortModel: this.core.columnModel.getSortModel(),\n filterModel: this.getFilterModel(),\n quickFilterText: this.quickFilter,\n signal: controller.signal,\n onSuccess: (rows, lastRow) => {\n if (settled) return;\n if (seq !== this.infiniteSeq || this.core.isDestroyed() || controller.signal.aborted) {\n done();\n return;\n }\n const received = rows ?? [];\n if (typeof lastRow === \"number\" && lastRow >= 0) {\n this.infiniteLastRow = lastRow;\n } else if (received.length < stop - start) {\n this.infiniteLastRow = start + received.length;\n }\n const wasEmpty = this.all.length === 0;\n this.appendInfiniteRows(received);\n done();\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n if (wasEmpty) this.core.relayout();\n this.core.headerRenderer.refreshSelectAllCheckbox();\n },\n fail: (reason) => done(reason ?? new Error(\"Datasource request failed\"))\n });\n if (request && typeof (request as Promise<void>).catch === \"function\") {\n void (request as Promise<void>).catch(done);\n }\n } catch (error) {\n done(error);\n }\n });\n }\n\n private cancelInfiniteRequest(): void {\n this.infiniteSeq++;\n this.infiniteAbort?.abort();\n this.infiniteAbort = null;\n this.infiniteRequested = false;\n this.setInfiniteLoading(false);\n this.infinitePendingResolve?.();\n this.infinitePendingResolve = null;\n }\n\n private appendInfiniteRows(rows: TData[]): void {\n for (const data of rows) {\n if (data == null) continue;\n const index = this.all.length;\n const id = this.resolveRowId(data, index, `inf-${this.core.nextId()}`);\n if (this.nodesById.has(id)) {\n this.core.reportError(new Error(`Duplicate row id: ${id}`), \"datasource.getRows\", { rowId: id });\n continue;\n }\n const node: RowNode<TData> = {\n id,\n data,\n rowIndex: -1,\n selected: this.core.selectionService.isSelected(id)\n };\n this.all.push(node);\n this.nodesById.set(id, node);\n this.roots.push(node);\n }\n }\n\n checkInfiniteScroll(lastVisibleIndex: number): void {\n if (!this.isInfinite || this.infiniteRequested) return;\n const loaded = this.all.length;\n if (this.infiniteLastRow != null && loaded >= this.infiniteLastRow) return;\n const buffer = this.core.options.infiniteBufferRows;\n if (lastVisibleIndex + buffer < loaded && lastVisibleIndex < loaded) return;\n const blockSize = this.core.options.blockSize;\n const stop = this.infiniteLastRow == null\n ? loaded + blockSize\n : Math.min(this.infiniteLastRow, loaded + blockSize);\n void this.loadBlock(loaded, stop);\n }\n\n onServerParamsChanged(): Promise<void> {\n return this.reloadInfinite();\n }\n\n onDatasourceChanged(): Promise<void> {\n this.cancelInfiniteRequest();\n if (this.isInfinite) return this.startInfinite();\n this.infiniteLastRow = null;\n this.setRowData(this.core.options.rowData);\n this.core.bodyRenderer.onDataChanged();\n return Promise.resolve();\n }\n\n destroy(): void {\n this.cancelInfiniteRequest();\n }\n\n setRowData(rows: TData[] | null | undefined): void {\n const getRowId = this.core.options.getRowId;\n const childrenKey = this.core.options.childrenKey;\n const next: RowNode<TData>[] = [];\n const roots: RowNode<TData>[] = [];\n const byId = new Map<string, RowNode<TData>>();\n const childIds = new Map<string, string[]>();\n let autoSeq = 0;\n\n const buildNode = (data: TData, depth: number, parentId: string | null): RowNode<TData> | null => {\n const index = autoSeq++;\n const id = this.resolveRowId(data, index, `auto-${index}`);\n if (byId.has(id)) {\n this.core.reportError(new Error(`Duplicate row id: ${id}`), \"rowData\", { rowId: id, index });\n return null;\n }\n const node: RowNode<TData> = { id, data, rowIndex: -1, selected: false };\n this.treeDepth.set(node, depth);\n next.push(node);\n byId.set(id, node);\n if (parentId != null) {\n const list = childIds.get(parentId) ?? [];\n list.push(id);\n childIds.set(parentId, list);\n } else {\n roots.push(node);\n }\n const children = this.isTree ? readChildren(data, childrenKey) : undefined;\n if (this.isTree && Array.isArray(children)) {\n for (const child of children) {\n if (child != null) buildNode(child as TData, depth + 1, id);\n }\n }\n return node;\n };\n\n (rows ?? []).forEach((data) => {\n if (data != null) buildNode(data, 0, null);\n });\n\n this.all = next;\n this.roots = roots;\n this.childIds = childIds;\n this.nodesById = byId;\n this.core.undoService.clear();\n for (const id of [...this.expandedIds]) {\n if (!byId.has(id)) this.expandedIds.delete(id);\n }\n if (this.core.options.defaultExpandAll) {\n for (const node of next) {\n if (this.getChildrenCount(node.id) > 0) this.expandedIds.add(node.id);\n }\n }\n\n this.core.selectionService.onRowsRebuilt(getRowId != null);\n this.refreshPipeline();\n }\n\n getChildrenIds(id: string): string[] {\n return this.childIds.get(id) ?? [];\n }\n\n getChildrenCount(id: string): number {\n return this.childIds.get(id)?.length ?? 0;\n }\n\n hasChildren(id: string): boolean {\n return this.getChildrenCount(id) > 0;\n }\n\n applyTransaction(transaction: RowTransaction<TData>): void {\n const getRowId = this.core.options.getRowId;\n const touched: RowNode<TData>[] = [];\n\n if (transaction.remove?.length) {\n const removeIds = new Set<string>();\n const removeRefs = new Set<TData>();\n const collect = (data: TData) => {\n if (getRowId) {\n const id = this.resolveRowId(data, -1, `__missing_remove_${this.core.nextId()}`);\n const stack = [id];\n while (stack.length > 0) {\n const cur = stack.pop()!;\n if (removeIds.has(cur)) continue;\n removeIds.add(cur);\n for (const childId of this.childIds.get(cur) ?? []) stack.push(childId);\n }\n } else {\n const stack: TData[] = [data];\n while (stack.length > 0) {\n const cur = stack.pop()!;\n removeRefs.add(cur);\n const kids = this.isTree ? readChildren(cur, this.core.options.childrenKey) : undefined;\n if (kids) {\n for (const kid of kids) stack.push(kid as TData);\n }\n }\n }\n };\n transaction.remove.forEach(collect);\n this.all = this.all.filter((node) => {\n const drop = removeIds.has(node.id) || (node.data != null && removeRefs.has(node.data));\n if (drop) {\n this.nodesById.delete(node.id);\n this.childIds.delete(node.id);\n }\n return !drop;\n });\n const remaining = new Set(this.all);\n this.roots = this.roots.filter((node) => remaining.has(node));\n }\n\n if (transaction.update?.length) {\n for (const data of transaction.update) {\n let node: RowNode<TData> | undefined;\n if (getRowId) {\n node = this.nodesById.get(this.resolveRowId(data, -1, `__missing_update_${this.core.nextId()}`));\n } else {\n node = this.all.find((n) => n.data === data);\n }\n if (node) {\n node.data = data;\n this.core.bodyRenderer.invalidateRowHeight(node);\n touched.push(node);\n }\n }\n }\n\n if (transaction.add?.length) {\n const startIndex = transaction.addIndex != null ? Math.max(0, Math.min(transaction.addIndex, this.roots.length)) : this.roots.length;\n const added: RowNode<TData>[] = [];\n transaction.add.forEach((data, i) => {\n const id = this.resolveRowId(data, startIndex + i, `add-${this.core.nextId()}`);\n if (this.nodesById.has(id)) {\n this.core.reportError(new Error(`Duplicate row id: ${id}`), \"transaction.add\", { rowId: id });\n return;\n }\n const node: RowNode<TData> = { id, data, rowIndex: -1, selected: false };\n this.nodesById.set(id, node);\n this.treeDepth.set(node, 0);\n const children = this.isTree ? readChildren(data, this.core.options.childrenKey) : undefined;\n if (children) {\n for (const child of children) {\n if (child != null) this.buildChildNodes(node, child as TData, 1);\n }\n }\n added.push(node);\n });\n this.roots.splice(startIndex, 0, ...added);\n this.reindexAll();\n }\n\n this.refreshPipeline();\n for (const node of touched) {\n if (node.rowIndex >= 0) this.core.bodyRenderer.refreshRows([node.rowIndex]);\n }\n }\n\n private buildChildNodes(parent: RowNode<TData>, data: TData, depth: number): void {\n const id = this.resolveRowId(data, -1, `add-${this.core.nextId()}`);\n if (this.nodesById.has(id)) {\n this.core.reportError(new Error(`Duplicate row id: ${id}`), \"transaction.add\", { rowId: id });\n return;\n }\n const child: RowNode<TData> = {\n id,\n data,\n rowIndex: -1,\n selected: false\n };\n this.nodesById.set(id, child);\n this.treeDepth.set(child, depth);\n const list = this.childIds.get(parent.id) ?? [];\n list.push(child.id);\n this.childIds.set(parent.id, list);\n const children = readChildren(data, this.core.options.childrenKey);\n if (!children) return;\n for (const nested of children) {\n if (nested != null) this.buildChildNodes(child, nested as TData, depth + 1);\n }\n }\n\n private reindexAll(): void {\n this.all = [];\n const walk = (node: RowNode<TData>) => {\n this.all.push(node);\n if (!this.nodesById.has(node.id)) this.nodesById.set(node.id, node);\n for (const childId of this.childIds.get(node.id) ?? []) {\n const child = this.nodesById.get(childId);\n if (child) walk(child);\n }\n };\n for (const root of this.roots) walk(root);\n }\n\n setFilterModel(filterModel: FilterModel | null): boolean {\n const before = JSON.stringify(this.filterModel);\n this.filterModel = filterModel ? { ...filterModel } : {};\n return JSON.stringify(this.filterModel) !== before;\n }\n\n getFilterModel(): FilterModel {\n return { ...this.filterModel };\n }\n\n setQuickFilter(text: string | null | undefined): boolean {\n const next = text != null && text.trim() !== \"\" ? text : null;\n if (next === this.quickFilter) return false;\n this.quickFilter = next;\n return true;\n }\n\n getQuickFilter(): string | null {\n return this.quickFilter;\n }\n\n isFilterPresent(): boolean {\n return Object.keys(this.filterModel).length > 0 || this.quickFilter != null;\n }\n\n refreshPipeline(): void {\n const columns = this.core.columnModel.getOrderedVisible();\n const getCellValue = (node: RowNode<any>, column: ColumnLike) => this.core.getCellValue(node, column);\n\n if (this.isInfinite) {\n this.all.forEach((node, index) => {\n node.rowIndex = index;\n this.rowSequence.set(node, index + 1);\n });\n this.displayed = this.all;\n this.pipelineRows = this.all;\n this.spanInfo.clear();\n this.core.emit(\"modelUpdated\", { rowCount: this.all.length });\n return;\n }\n\n let rows: RowNode<TData>[];\n\n if (this.isTree) {\n rows = this.buildTreeDisplay(columns, getCellValue);\n } else {\n rows = this.all;\n const filteringLocally = this.isFilterPresent() && !this.core.options.manualFiltering;\n if (filteringLocally) {\n rows = rows.filter((node) => doesNodePassFilters(node, columns, this.filterModel, this.quickFilter, getCellValue));\n }\n const sortModel = this.core.columnModel.getSortModel();\n if (sortModel.length > 0 && !this.core.options.manualSorting) {\n try {\n rows = sortNodes(rows, sortModel, columns, getCellValue);\n } catch (error) {\n this.core.reportError(error, \"comparator\", { sortModel });\n }\n }\n\n const groupCols = this.core.columnModel.getRowGroupColumns();\n if (groupCols.length > 0) {\n rows = this.buildGrouped(rows, groupCols);\n } else if (this.core.options.masterDetail) {\n const withDetails: RowNode<TData>[] = [];\n for (const node of rows) {\n withDetails.push(node);\n if (this.expandedIds.has(node.id) && this.isRowExpandable(node)) {\n withDetails.push({\n id: `__detail__${node.id}`,\n data: node.data,\n rowIndex: -1,\n selected: false,\n isDetail: true,\n masterId: node.id\n });\n }\n }\n rows = withDetails;\n }\n }\n\n for (const node of this.all) node.rowIndex = -1;\n\n let seq = 0;\n rows.forEach((node, index) => {\n node.rowIndex = index;\n if (!node.isDetail && !node.isGroup) {\n seq++;\n this.rowSequence.set(node, seq);\n }\n });\n this.pipelineRows = rows;\n this.applyPagination();\n\n this.computeSpans(getCellValue);\n this.core.emit(\"modelUpdated\", { rowCount: rows.length });\n }\n\n private pipelineRows: RowNode<TData>[] = [];\n private page = 1;\n private pageSize = 20;\n\n get paginationActive(): boolean {\n return this.core.options.paginationEnabled && !this.isInfinite;\n }\n\n private applyPagination(): void {\n if (!this.paginationActive) {\n this.displayed = this.pipelineRows;\n return;\n }\n const size = this.effectivePageSize();\n const pageCount = Math.max(1, Math.ceil(this.pipelineRows.length / size));\n if (this.page > pageCount) this.page = pageCount;\n if (this.page < 1) this.page = 1;\n const start = (this.page - 1) * size;\n const slice = this.pipelineRows.slice(start, start + size);\n slice.forEach((node, index) => {\n node.rowIndex = index;\n });\n this.displayed = slice;\n }\n\n private effectivePageSize(): number {\n this.pageSize = this.core.options.paginationPageSize;\n return Math.max(1, this.pageSize);\n }\n\n getCurrentPage(): number {\n return this.paginationActive ? this.page : 1;\n }\n\n getTotalRowCount(): number {\n return this.isInfinite ? this.getDisplayTotalCount() : this.pipelineRows.length;\n }\n\n getPageCount(): number {\n if (!this.paginationActive) return 1;\n return Math.max(1, Math.ceil(this.pipelineRows.length / this.effectivePageSize()));\n }\n\n getPipelineRows(): RowNode<TData>[] {\n return this.pipelineRows;\n }\n\n setPage(page: number, silent = false): void {\n if (!this.paginationActive) return;\n const pageCount = this.getPageCount();\n const next = Math.max(1, Math.min(Math.round(page) || 1, pageCount));\n if (next === this.page) return;\n this.page = next;\n this.applyPagination();\n this.core.bodyRenderer.onDataChanged();\n this.core.bodyRenderer.scrollToIndex(0, \"top\");\n if (!silent) this.emitPaginationChanged();\n }\n\n setPageSize(size: number): void {\n if (!this.paginationActive) return;\n const next = Math.max(1, Math.round(size) || this.effectivePageSize());\n const firstVisible = (this.page - 1) * this.effectivePageSize();\n this.core.options.paginationPageSize = next;\n this.pageSize = next;\n this.page = Math.floor(firstVisible / next) + 1;\n this.applyPagination();\n this.core.bodyRenderer.onDataChanged();\n this.emitPaginationChanged();\n }\n\n setPaginationEnabled(enabled: boolean): void {\n if (this.core.options.paginationEnabled === enabled) return;\n this.core.options.paginationEnabled = enabled && !this.isInfinite;\n if (this.core.options.paginationEnabled) this.page = 1;\n this.applyPagination();\n this.core.bodyRenderer.onDataChanged();\n this.emitPaginationChanged();\n }\n\n onPaginationOptionsChanged(): void {\n if (!this.paginationActive) return;\n this.page = 1;\n this.applyPagination();\n this.core.bodyRenderer.onDataChanged();\n this.emitPaginationChanged();\n }\n\n private emitPaginationChanged(): void {\n this.core.emit(\"paginationChanged\", {\n page: this.getCurrentPage(),\n pageSize: this.effectivePageSize(),\n pageCount: this.getPageCount(),\n total: this.getTotalRowCount()\n });\n }\n\n private buildTreeDisplay(\n columns: ColumnLike[],\n getCellValue: (node: RowNode<any>, column: ColumnLike) => any\n ): RowNode<TData>[] {\n const sortModel = this.core.options.manualSorting ? [] : this.core.columnModel.getSortModel();\n const passCache = new Map<string, boolean>();\n const filterPresent = this.isFilterPresent() && !this.core.options.manualFiltering;\n\n const nodePasses = (node: RowNode<TData>): boolean => {\n const cached = passCache.get(node.id);\n if (cached !== undefined) return cached;\n let pass = true;\n if (filterPresent) {\n pass = doesNodePassFilters(node, columns, this.filterModel, this.quickFilter, getCellValue);\n for (const childId of this.childIds.get(node.id) ?? []) {\n const child = this.nodesById.get(childId);\n if (child && nodePasses(child)) pass = true;\n }\n }\n passCache.set(node.id, pass);\n return pass;\n };\n\n const out: RowNode<TData>[] = [];\n const walk = (nodes: RowNode<TData>[]) => {\n let ordered = nodes;\n if (sortModel.length > 0) {\n ordered = sortNodes(nodes, sortModel, columns, getCellValue);\n }\n for (const node of ordered) {\n if (!nodePasses(node)) continue;\n out.push(node);\n if (this.expandedIds.has(node.id)) {\n const childNodes = (this.childIds.get(node.id) ?? [])\n .map((id) => this.nodesById.get(id))\n .filter((n): n is RowNode<TData> => n != null);\n walk(childNodes);\n }\n }\n };\n walk(this.roots);\n return out;\n }\n\n private computeSpans(getCellValue: (node: RowNode<any>, column: ColumnLike) => any): void {\n this.spanInfo.clear();\n if (this.isTree) return;\n if (this.core.options.masterDetail) return;\n if (this.core.columnModel.getRowGroupColumns().length > 0) return;\n\n const spanColumns = this.core.columnModel.getOrderedVisible().filter(\n (c) => c.colDef.rowSpan != null || c.colDef.autoRowSpan === true\n );\n if (spanColumns.length === 0) return;\n\n const masters = this.mastersBuf;\n let m = 0;\n for (const node of this.displayed) {\n if (!node.isDetail && !node.isGroup) masters[m++] = node;\n }\n masters.length = m;\n const n = m;\n if (n === 0) return;\n\n for (const col of spanColumns) {\n const arr = new Int32Array(n);\n let i = 0;\n while (i < n) {\n const node = masters[i];\n const value = getCellValue(node, col);\n let span = 1;\n if (col.colDef.rowSpan) {\n try {\n const out = col.colDef.rowSpan({\n api: this.core.getApi(),\n colDef: col.colDef,\n column: col,\n node,\n data: node.data,\n value,\n rowIndex: node.rowIndex\n });\n span = Math.max(1, Math.min(Math.round(out) || 1, n - i));\n } catch (error) {\n this.core.reportError(error, \"rowSpan\", { colId: col.id, rowId: node.id });\n }\n } else if (col.colDef.autoRowSpan) {\n while (\n i + span < n &&\n value != null &&\n value !== \"\" &&\n defaultComparator(value, getCellValue(masters[i + span], col)) === 0\n ) {\n span++;\n }\n }\n arr[i] = span;\n for (let k = 1; k < span; k++) arr[i + k] = -1;\n i += span;\n }\n this.spanInfo.set(col.id, arr);\n }\n }\n\n getSpanInfo(colId: string): Int32Array | undefined {\n return this.spanInfo.get(colId);\n }\n\n getRowSeq(node: RowNode<TData>): number {\n return this.rowSequence.get(node) ?? 0;\n }\n\n getTreeDepth(node: RowNode<TData>): number {\n return this.treeDepth.get(node) ?? 0;\n }\n\n private buildGrouped(rows: RowNode<TData>[], groupCols: ColumnLike[]): RowNode<TData>[] {\n const aggResolve = createAggResolver(this.core.options.aggFuncs);\n const aggCols = this.core.columnModel.getAggColumns();\n this.knownGroupIds = [];\n\n const computeAgg = (leaves: RowNode<TData>[]): Record<string, any> => {\n const values: Record<string, any> = {};\n for (const col of aggCols) {\n const fn = aggResolve(col.colDef.aggFunc!);\n if (!fn) continue;\n try {\n values[col.id] = fn(leaves.map((leaf) => this.core.getCellValue(leaf, col)));\n } catch (error) {\n this.core.reportError(error, \"aggFunc\", { colId: col.id, aggFunc: col.colDef.aggFunc });\n values[col.id] = null;\n }\n }\n return values;\n };\n\n const build = (\n nodes: RowNode<TData>[],\n level: number,\n parentPath: string\n ): { display: RowNode<TData>[]; leaves: RowNode<TData>[] } => {\n if (level >= groupCols.length) {\n return { display: nodes, leaves: nodes };\n }\n const col = groupCols[level];\n const groups = new Map<string, RowNode<TData>[]>();\n const order: string[] = [];\n for (const node of nodes) {\n const raw = this.core.getCellValue(node, col);\n const key = raw == null ? \"(空)\" : String(raw);\n let bucket = groups.get(key);\n if (!bucket) {\n bucket = [];\n groups.set(key, bucket);\n order.push(key);\n }\n bucket.push(node);\n }\n order.sort((a, b) => a.localeCompare(b, undefined, { numeric: true, sensitivity: \"base\" }));\n\n const display: RowNode<TData>[] = [];\n const leaves: RowNode<TData>[] = [];\n for (const key of order) {\n const children = groups.get(key)!;\n const groupId = `${parentPath}/g${level}:${key}`;\n this.knownGroupIds.push(groupId);\n const child = build(children, level + 1, groupId);\n const groupNode: RowNode<TData> = {\n id: groupId,\n data: null,\n rowIndex: -1,\n selected: false,\n isGroup: true,\n groupLevel: level,\n groupKey: key,\n leafNodes: child.leaves,\n aggValues: computeAgg(child.leaves)\n };\n display.push(groupNode);\n if (this.groupExpandedIds.has(groupId)) {\n display.push(...child.display);\n }\n leaves.push(...child.leaves);\n }\n return { display, leaves };\n };\n\n return build(rows, 0, \"\").display;\n }\n\n isRowExpandable(node: RowNode<TData>): boolean {\n if (this.isTree) return this.hasChildren(node.id);\n if (!this.core.options.masterDetail) return false;\n const check = this.core.options.isRowExpandable;\n if (check) {\n try {\n return check({ data: node.data, node, api: this.core.getApi() });\n } catch (error) {\n this.core.reportError(error, \"isRowExpandable\", { rowId: node.id });\n return false;\n }\n }\n return true;\n }\n\n isRowExpanded(id: string): boolean {\n return this.expandedIds.has(id);\n }\n\n expandRow(id: string): boolean {\n return this.setDetailExpanded(id, true);\n }\n\n collapseRow(id: string): boolean {\n return this.setDetailExpanded(id, false);\n }\n\n toggleDetail(id: string): boolean {\n return this.setDetailExpanded(id, !this.expandedIds.has(id));\n }\n\n private setDetailExpanded(id: string, expanded: boolean): boolean {\n const node = this.nodesById.get(id);\n if (!node || !this.isRowExpandable(node)) return expanded;\n if (expanded === this.expandedIds.has(id)) return expanded;\n if (expanded) this.expandedIds.add(id);\n else this.expandedIds.delete(id);\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n this.core.emit(\"detailToggled\", { rowId: id, rowNode: node, expanded });\n return expanded;\n }\n\n expandAllDetails(): void {\n let changed = false;\n for (const node of this.all) {\n if (!this.expandedIds.has(node.id) && this.isRowExpandable(node)) {\n this.expandedIds.add(node.id);\n changed = true;\n }\n }\n if (changed) {\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n }\n\n collapseAllDetails(): void {\n if (this.expandedIds.size === 0) return;\n this.expandedIds.clear();\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n\n toggleGroup(groupId: string): boolean {\n return this.setGroupExpanded(groupId, !this.groupExpandedIds.has(groupId));\n }\n\n isGroupExpanded(groupId: string): boolean {\n return this.groupExpandedIds.has(groupId);\n }\n\n getGroupNode(groupId: string): RowNode<TData> | undefined {\n return this.displayed.find((n) => n.isGroup && n.id === groupId);\n }\n\n expandAllGroups(): void {\n if (this.knownGroupIds.length === 0) return;\n let changed = false;\n for (const id of this.knownGroupIds) {\n if (!this.groupExpandedIds.has(id)) {\n this.groupExpandedIds.add(id);\n changed = true;\n }\n }\n if (changed) {\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n }\n\n collapseAllGroups(): void {\n if (this.groupExpandedIds.size === 0) return;\n this.groupExpandedIds.clear();\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n\n private setGroupExpanded(groupId: string, expanded: boolean): boolean {\n if (!this.knownGroupIds.includes(groupId)) return expanded;\n if (expanded === this.groupExpandedIds.has(groupId)) return expanded;\n if (expanded) this.groupExpandedIds.add(groupId);\n else this.groupExpandedIds.delete(groupId);\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n return expanded;\n }\n\n reorderRowsByDisplayed(fromIndex: number, toIndex: number): boolean {\n if (this.isTree) return false;\n const fromNode = this.getDisplayedRow(fromIndex);\n const toNode = this.getDisplayedRow(toIndex);\n if (!fromNode || !toNode || fromNode.isDetail || toNode.isDetail || fromNode.isGroup || toNode.isGroup) return false;\n\n const fromAllIdx = this.all.indexOf(fromNode);\n let toAllIdx = this.all.indexOf(toNode);\n if (fromAllIdx < 0 || toAllIdx < 0) return false;\n if (toAllIdx > fromAllIdx) {\n let idx = toAllIdx;\n while (idx + 1 < this.all.length && this.all[idx + 1].isDetail) idx++;\n toAllIdx = idx;\n }\n if (fromAllIdx === toAllIdx) return false;\n\n this.all.splice(fromAllIdx, 1);\n const insertAt = this.all.indexOf(toNode);\n this.all.splice(toAllIdx > fromAllIdx ? insertAt + 1 : insertAt, 0, fromNode);\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n return true;\n }\n\n getAllNodes(): RowNode<TData>[] {\n return this.all;\n }\n\n getRootNodes(): RowNode<TData>[] {\n return this.roots;\n }\n\n getDisplayedRows(): RowNode<TData>[] {\n return this.displayed;\n }\n\n getDisplayedRowCount(): number {\n return this.displayed.length;\n }\n\n getDisplayedRow(index: number): RowNode<TData> | undefined {\n return this.displayed[index];\n }\n\n getNodeById(id: string): RowNode<TData> | undefined {\n return this.nodesById.get(id);\n }\n\n forEachNode(callback: (node: RowNode<TData>, index: number) => void): void {\n this.all.forEach(callback);\n }\n\n forEachNodeAfterFilterAndSort(callback: (node: RowNode<TData>, index: number) => void): void {\n let index = 0;\n for (const node of this.pipelineRows) {\n if (node.isDetail || node.isGroup) continue;\n callback(node, index++);\n }\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { RowNode } from \"../types/row\";\n\ntype SelectionContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"columnModel\"\n | \"emit\"\n | \"getApi\"\n | \"getCellValue\"\n | \"headerRenderer\"\n | \"options\"\n | \"reportError\"\n | \"rowModel\"\n>;\n\nexport class SelectionService {\n private selectedIds = new Set<string>();\n private anchorId: string | null = null;\n private indeterminateIds = new Set<string>();\n\n constructor(private core: SelectionContext) {}\n\n isSelected(id: string): boolean {\n return this.selectedIds.has(id);\n }\n\n isIndeterminate(id: string): boolean {\n return this.indeterminateIds.has(id);\n }\n\n isSelectable(node: RowNode<any>): boolean {\n const column = this.findSelectableColumn(node);\n const check = column?.colDef.selectable;\n if (!column || !check) return true;\n try {\n return check({\n api: this.core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value: this.core.getCellValue(node, column),\n rowIndex: node.rowIndex\n });\n } catch (error) {\n this.core.reportError(error, \"selectable\", { rowId: node.id, colId: column?.id });\n return false;\n }\n }\n\n private findSelectableColumn(node: RowNode<any>) {\n if (node.isGroup || node.isDetail) return undefined;\n return this.core.columnModel\n .getOrderedVisible()\n .find((column) => column.hasCheckbox && column.colDef.selectable != null);\n }\n\n getSelectedNodes(): RowNode<any>[] {\n return this.core.rowModel.getAllNodes().filter((n) => this.selectedIds.has(n.id));\n }\n\n getSelectedRows(): any[] {\n return this.getSelectedNodes().filter((n) => n.data != null).map((n) => n.data);\n }\n\n getSelectedIds(): string[] {\n return [...this.selectedIds];\n }\n\n onRowsRebuilt(preserveIds: boolean): void {\n if (!preserveIds) {\n this.selectedIds.clear();\n this.anchorId = null;\n } else {\n const existing = new Set(this.core.rowModel.getAllNodes().map((n) => n.id));\n for (const id of [...this.selectedIds]) {\n if (!existing.has(id)) this.selectedIds.delete(id);\n }\n if (this.anchorId != null && !existing.has(this.anchorId)) this.anchorId = null;\n }\n for (const node of this.core.rowModel.getAllNodes()) {\n node.selected = this.selectedIds.has(node.id);\n }\n this.recomputeTriState();\n }\n\n getGroupSelectionState(groupNode: RowNode<any>): { all: boolean; some: boolean } {\n const leaves = groupNode.leafNodes ?? [];\n if (leaves.length === 0) return { all: false, some: false };\n let selectableCount = 0;\n let count = 0;\n for (const leaf of leaves) {\n if (!this.isSelectable(leaf)) continue;\n selectableCount++;\n if (this.selectedIds.has(leaf.id)) count++;\n }\n if (selectableCount === 0) return { all: false, some: false };\n return { all: count === selectableCount, some: count > 0 };\n }\n\n setGroupSelected(groupNode: RowNode<any>, selected: boolean): void {\n const leaves = (groupNode.leafNodes ?? []).filter((n) => this.isSelectable(n));\n if (leaves.length === 0) return;\n this.applySelection(leaves.map((node) => ({ node, selected })));\n }\n\n setNodeSelected(node: RowNode<any>, selected: boolean, clearOthers = false): void {\n this.applySelection([{ node, selected, clearOthers }]);\n }\n\n selectNodeById(nodeId: string, selected = true, clearOthers = true): void {\n const node = this.core.rowModel.getNodeById(nodeId);\n if (node) this.setNodeSelected(node, selected, clearOthers);\n }\n\n onRowClick(node: RowNode<any>, event: MouseEvent, fromCheckbox: boolean): void {\n const mode = this.core.options.rowSelection;\n if (mode === \"none\") return;\n if (!this.isSelectable(node)) return;\n\n if (fromCheckbox) {\n const single = mode === \"single\";\n this.applySelection([{ node, selected: single ? true : !node.selected, clearOthers: single }]);\n this.anchorId = node.id;\n return;\n }\n\n const multi = mode === \"multiple\";\n if (multi && (event.ctrlKey || event.metaKey)) {\n this.applySelection([{ node, selected: !node.selected }]);\n this.anchorId = node.id;\n return;\n }\n\n if (multi && event.shiftKey && this.anchorId != null) {\n const anchor = this.core.rowModel.getNodeById(this.anchorId);\n if (anchor && anchor.rowIndex >= 0 && node.rowIndex >= 0) {\n const start = Math.min(anchor.rowIndex, node.rowIndex);\n const end = Math.max(anchor.rowIndex, node.rowIndex);\n const changes = [];\n for (let i = start; i <= end; i++) {\n const row = this.core.rowModel.getDisplayedRow(i);\n if (row && !row.isDetail && !row.isGroup && this.isSelectable(row)) {\n changes.push({ node: row, selected: true });\n }\n }\n this.applySelection(changes);\n return;\n }\n }\n\n this.applySelection([{ node, selected: true, clearOthers: true }]);\n this.anchorId = node.id;\n }\n\n selectAll(filteredOnly = true): void {\n const mode = this.core.options.rowSelection;\n if (mode === \"none\") return;\n const candidates = filteredOnly ? this.core.rowModel.getDisplayedRows() : this.core.rowModel.getAllNodes();\n const selectable = candidates.filter((n) => !n.isDetail && !n.isGroup && this.isSelectable(n));\n if (selectable.length === 0) return;\n if (mode === \"single\") {\n this.applySelection([{ node: selectable[0], selected: true, clearOthers: true }]);\n return;\n }\n this.applySelection(selectable.map((node) => ({ node, selected: true })));\n }\n\n deselectAll(): void {\n this.applySelection([], true);\n }\n\n isSelectAllActive(): boolean {\n const rows = this.core.rowModel.getDisplayedRows().filter((n) => !n.isDetail && !n.isGroup);\n const selectable = rows.filter((n) => this.isSelectable(n));\n if (selectable.length === 0) return false;\n if (this.core.rowModel.isInfinite) {\n const total = this.core.rowModel.getDisplayTotalCount();\n if (selectable.length < total) return false;\n }\n return selectable.every((n) => this.selectedIds.has(n.id));\n }\n\n isSelectAllIndeterminate(): boolean {\n const rows = this.core.rowModel.getDisplayedRows().filter((n) => !n.isDetail && !n.isGroup);\n const selectable = rows.filter((n) => this.isSelectable(n));\n const count = selectable.reduce((acc, n) => acc + (this.selectedIds.has(n.id) ? 1 : 0), 0);\n if (count === 0) return false;\n if (this.core.rowModel.isInfinite) {\n const total = this.core.rowModel.getDisplayTotalCount();\n if (selectable.length < total) return true;\n }\n return count > 0 && count < selectable.length;\n }\n\n applySelectionPublic(\n changes: { node: RowNode<any>; selected: boolean; clearOthers?: boolean }[],\n clearOthers = false\n ): void {\n this.applySelection(changes, clearOthers);\n }\n\n private applySelection(\n changes: { node: RowNode<any>; selected: boolean; clearOthers?: boolean }[],\n clearAll = false\n ): void {\n const before = new Set(this.selectedIds);\n const clearOthers = clearAll || changes.some((c) => c.clearOthers);\n const isTree = this.core.rowModel.isTree && this.core.options.autoCheckedChildren;\n\n if (clearOthers) {\n const keep = clearAll\n ? new Set<string>()\n : new Set(changes.filter((c) => c.selected).flatMap((c) => (isTree ? this.subtreeIds(c.node) : [c.node.id])));\n this.selectedIds = keep;\n }\n\n for (const c of changes) {\n if (!this.isSelectable(c.node)) continue;\n const targets = isTree ? this.subtreeIds(c.node) : [c.node.id];\n for (const id of targets) {\n if (c.selected) this.selectedIds.add(id);\n else this.selectedIds.delete(id);\n }\n }\n\n const changedIds = new Set<string>();\n for (const id of new Set([...before, ...this.selectedIds])) {\n if (before.has(id) !== this.selectedIds.has(id)) changedIds.add(id);\n }\n\n const prevSelected = new Map<string, boolean>();\n for (const node of this.core.rowModel.getAllNodes()) {\n prevSelected.set(node.id, node.selected);\n }\n const prevIndeterminate = new Set(this.indeterminateIds);\n\n this.recomputeTriState();\n\n const refreshIndexes: number[] = [];\n const touched = new Set<string>([...changedIds, ...prevIndeterminate, ...this.indeterminateIds]);\n for (const node of this.core.rowModel.getAllNodes()) {\n const isSel = this.selectedIds.has(node.id);\n node.selected = isSel;\n if (touched.has(node.id) || prevSelected.get(node.id) !== isSel) {\n if (node.rowIndex >= 0) refreshIndexes.push(node.rowIndex);\n }\n }\n\n if (changedIds.size > 0) {\n this.core.bodyRenderer.refreshRows(refreshIndexes);\n this.core.headerRenderer.refreshSelectAllCheckbox();\n this.core.emit(\"selectionChanged\", {\n selectedNodes: this.getSelectedNodes(),\n selectedRows: this.getSelectedRows()\n });\n }\n }\n\n private subtreeIds(node: RowNode<any>): string[] {\n const out: string[] = [node.id];\n const walk = (id: string) => {\n for (const childId of this.core.rowModel.getChildrenIds(id)) {\n out.push(childId);\n walk(childId);\n }\n };\n walk(node.id);\n return out;\n }\n\n private recomputeTriState(): void {\n this.indeterminateIds.clear();\n if (!this.core.rowModel.isTree) return;\n\n const evaluate = (id: string): { all: boolean; some: boolean } => {\n const childIds = this.core.rowModel.getChildrenIds(id);\n if (childIds.length === 0) {\n return { all: this.selectedIds.has(id), some: this.selectedIds.has(id) };\n }\n let all = true;\n let some = false;\n for (const childId of childIds) {\n const state = evaluate(childId);\n if (state.all) some = true;\n else if (state.some) {\n some = true;\n all = false;\n } else {\n all = false;\n }\n }\n if (some && !all) this.indeterminateIds.add(id);\n if (all) this.selectedIds.add(id);\n else this.selectedIds.delete(id);\n return { all, some };\n };\n\n for (const root of this.core.rowModel.getRootNodes()) {\n evaluate(root.id);\n }\n for (const node of this.core.rowModel.getAllNodes()) {\n node.selected = this.selectedIds.has(node.id);\n }\n }\n}\n","export function el(tag: string, className?: string, attrs?: Record<string, string>): HTMLElement {\n const e = document.createElement(tag);\n if (className) e.className = className;\n if (attrs) {\n for (const key of Object.keys(attrs)) {\n e.setAttribute(key, attrs[key]);\n }\n }\n return e;\n}\n\nexport function setStyles(e: HTMLElement, styles: Partial<CSSStyleDeclaration>): void {\n Object.assign(e.style, styles);\n}\n\nexport function clamp(v: number, min: number, max: number): number {\n return v < min ? min : v > max ? max : v;\n}\n\nlet uidCounter = 0;\n\nexport function nextUid(prefix = \"rg\"): string {\n uidCounter++;\n return `${prefix}-${uidCounter}`;\n}\n\nexport function toPx(n: number): string {\n return `${n}px`;\n}\n\nexport const FILTER_ICON =\n '<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2 3.5h12L9.5 8v4.5L6.5 14V8L2 3.5z\"/></svg>';\n\nexport const SORT_ASC_ICON =\n '<svg viewBox=\"0 0 16 16\" width=\"12\" height=\"12\" fill=\"currentColor\"><path d=\"M8 3l4 5H4l4-5z\"/></svg>';\n\nexport const SORT_DESC_ICON =\n '<svg viewBox=\"0 0 16 16\" width=\"12\" height=\"12\" fill=\"currentColor\"><path d=\"M8 13l4-5H4l4 5z\"/></svg>';\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport { clamp } from \"../lib/dom\";\n\ntype ResizeContext = Pick<\n GridCore<any>,\n \"columnModel\" | \"emit\" | \"persistColumnState\" | \"relayoutColumns\" | \"skeleton\"\n>;\n\nexport class ResizeService {\n private active: {\n column: Column;\n startX: number;\n startWidth: number;\n pointerId: number;\n handle: HTMLElement;\n } | null = null;\n private rafId = 0;\n private pendingWidth = 0;\n\n constructor(private core: ResizeContext) {}\n\n startResize(e: PointerEvent, column: Column): void {\n const handle = e.currentTarget as HTMLElement;\n const def = column.colDef;\n const startWidth = column.manualWidth ?? column.currentWidth;\n const minWidth = def.minWidth ?? 80;\n if (startWidth < minWidth && def.width == null) {\n column.manualWidth = startWidth;\n }\n this.active = { column, startX: e.clientX, startWidth: column.manualWidth ?? startWidth, pointerId: e.pointerId, handle };\n handle.setPointerCapture(e.pointerId);\n handle.addEventListener(\"pointermove\", this.onMove);\n handle.addEventListener(\"pointerup\", this.onUp);\n handle.addEventListener(\"pointercancel\", this.onUp);\n this.core.skeleton.root.classList.add(\"mach-root--resizing\");\n }\n\n private onMove = (e: PointerEvent): void => {\n const active = this.active;\n if (!active) return;\n const def = active.column.colDef;\n const min = def.minWidth ?? 80;\n const max = def.maxWidth ?? Number.MAX_SAFE_INTEGER;\n this.pendingWidth = clamp(active.startWidth + (e.clientX - active.startX), min, max);\n if (this.rafId) return;\n this.rafId = requestAnimationFrame(() => {\n this.rafId = 0;\n const current = this.active;\n if (!current) return;\n this.core.columnModel.setColumnWidth(current.column, this.pendingWidth);\n this.core.relayoutColumns();\n this.core.emit(\"columnResized\", {\n colId: current.column.id,\n width: this.pendingWidth,\n finished: false\n });\n });\n };\n\n private onUp = (e: PointerEvent): void => {\n const active = this.active;\n if (!active) return;\n this.active = null;\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.core.columnModel.setColumnWidth(active.column, this.pendingWidth);\n this.core.relayoutColumns();\n }\n this.rafId = 0;\n active.handle.removeEventListener(\"pointermove\", this.onMove);\n active.handle.removeEventListener(\"pointerup\", this.onUp);\n active.handle.removeEventListener(\"pointercancel\", this.onUp);\n try {\n active.handle.releasePointerCapture(e.pointerId);\n } catch {\n void 0;\n }\n this.core.skeleton.root.classList.remove(\"mach-root--resizing\");\n this.core.emit(\"columnResized\", {\n colId: active.column.id,\n width: active.column.manualWidth ?? active.column.currentWidth,\n finished: true\n });\n this.core.persistColumnState();\n };\n\n destroy(): void {\n cancelAnimationFrame(this.rafId);\n this.rafId = 0;\n if (this.active) {\n const active = this.active;\n this.active = null;\n active.handle.removeEventListener(\"pointermove\", this.onMove);\n active.handle.removeEventListener(\"pointerup\", this.onUp);\n active.handle.removeEventListener(\"pointercancel\", this.onUp);\n }\n this.core.skeleton.root?.classList.remove(\"mach-root--resizing\");\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport { el } from \"../lib/dom\";\n\nconst DRAG_THRESHOLD = 6;\ntype ColumnDragContext = Pick<\n GridCore<any>,\n \"bodyRenderer\" | \"columnModel\" | \"moveColumn\" | \"skeleton\"\n>;\n\nexport class ColumnDragService {\n private pending: { column: Column; startX: number; startY: number } | null = null;\n private dragging: { column: Column; cellEl: HTMLElement; indicator: HTMLElement; targetIndex: number } | null = null;\n private suppressClick = false;\n\n constructor(private core: ColumnDragContext) {}\n\n onPointerDown(e: PointerEvent, column: Column): void {\n if (e.button !== 0) return;\n if (!column.movable) return;\n this.pending = { column, startX: e.clientX, startY: e.clientY };\n window.addEventListener(\"pointermove\", this.onMove);\n window.addEventListener(\"pointerup\", this.onUp);\n window.addEventListener(\"pointercancel\", this.onUp);\n }\n\n didDrag(): boolean {\n const value = this.suppressClick;\n this.suppressClick = false;\n return value;\n }\n\n private onMove = (e: PointerEvent): void => {\n if (this.dragging) {\n this.updateIndicator(e);\n return;\n }\n const pending = this.pending;\n if (!pending) return;\n if (Math.abs(e.clientX - pending.startX) < DRAG_THRESHOLD && Math.abs(e.clientY - pending.startY) < DRAG_THRESHOLD) {\n return;\n }\n this.startDrag(e);\n };\n\n private startDrag(e: PointerEvent): void {\n const pending = this.pending;\n if (!pending) return;\n const cellEl = this.findHeaderCell(pending.column);\n if (!cellEl || !cellEl.parentElement) {\n this.cleanup();\n return;\n }\n this.suppressClick = true;\n const indicator = el(\"div\", \"mach-drop-indicator\");\n cellEl.parentElement.appendChild(indicator);\n cellEl.classList.add(\"mach-header-cell--dragging\");\n this.core.skeleton.root.classList.add(\"mach-root--dragging\");\n this.dragging = { column: pending.column, cellEl, indicator, targetIndex: -1 };\n this.updateIndicator(e);\n }\n\n private findHeaderCell(column: Column): HTMLElement | null {\n const pane = this.core.bodyRenderer.paneForColumn(column);\n const container = this.core.skeleton.headerRowContainers[pane];\n return container.querySelector<HTMLElement>(`.mach-header-cell[data-col-id=\"${cssEscape(column.id)}\"]`);\n }\n\n private updateIndicator(e: PointerEvent): void {\n const dragging = this.dragging;\n if (!dragging) return;\n const pane = this.core.bodyRenderer.paneForColumn(dragging.column);\n const container = this.core.skeleton.headerRowContainers[pane];\n const rowRect = container.getBoundingClientRect();\n const cols = this.core.columnModel.getPaneColumns(pane);\n const fromIndex = cols.indexOf(dragging.column);\n\n const x = e.clientX - rowRect.left;\n let target = -1;\n let indicatorX = 0;\n let acc = 0;\n for (let i = 0; i < cols.length; i++) {\n const mid = acc + cols[i].currentWidth / 2;\n if (x < mid) {\n target = i;\n indicatorX = acc;\n break;\n }\n acc += cols[i].currentWidth;\n }\n if (target < 0) {\n target = cols.length;\n indicatorX = acc;\n }\n\n dragging.targetIndex = target > fromIndex ? target - 1 : target;\n dragging.indicator.style.left = `${indicatorX}px`;\n }\n\n private onUp = (): void => {\n const dragging = this.dragging;\n this.pending = null;\n this.cleanup();\n if (!dragging) return;\n this.dragging = null;\n dragging.cellEl.classList.remove(\"mach-header-cell--dragging\");\n dragging.indicator.remove();\n this.core.skeleton.root.classList.remove(\"mach-root--dragging\");\n if (dragging.targetIndex >= 0) {\n this.core.moveColumn(dragging.column.id, dragging.targetIndex);\n }\n };\n\n private cleanup(): void {\n window.removeEventListener(\"pointermove\", this.onMove);\n window.removeEventListener(\"pointerup\", this.onUp);\n window.removeEventListener(\"pointercancel\", this.onUp);\n };\n\n destroy(): void {\n this.cleanup();\n if (this.dragging) {\n this.dragging.cellEl.classList.remove(\"mach-header-cell--dragging\");\n this.dragging.indicator.remove();\n this.core.skeleton.root.classList.remove(\"mach-root--dragging\");\n this.dragging = null;\n }\n this.pending = null;\n }\n}\n\nfunction cssEscape(value: string): string {\n return typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\"\n ? CSS.escape(value)\n : value.replace(/[^a-zA-Z0-9_-]/g, \"\\\\$&\");\n}\n","import type { CsvExportParams } from \"../types/api\";\n\nexport function csvEscape(value: any, separator: string): string {\n const s = value == null ? \"\" : String(value);\n if (s.includes(separator) || s.includes('\"') || s.includes(\"\\n\") || s.includes(\"\\r\")) {\n return '\"' + s.replace(/\"/g, '\"\"') + '\"';\n }\n return s;\n}\n\nexport function sanitizeFormulaCell(value: any): any {\n if (typeof value !== \"string\" || value === \"\") return value;\n if (/^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/.test(value)) return value;\n if (/^[\\s\\u0000-\\u001f]*[=+\\-@]/.test(value)) return \"'\" + value;\n return value;\n}\n\nexport interface CsvRowAccessor<T> {\n getHeaderLabels(): string[];\n getRowValues(): T[][];\n}\n\nexport function buildCsv<T>(accessor: CsvRowAccessor<T>, params: CsvExportParams = {}): string {\n const separator = params.columnSeparator ?? \",\";\n const includeHeader = params.includeHeader ?? true;\n const protectFormulas = params.protectFormulas ?? true;\n const lines: string[] = [];\n\n if (includeHeader) {\n lines.push(accessor.getHeaderLabels().map((l) => csvEscape(l, separator)).join(separator));\n }\n for (const row of accessor.getRowValues()) {\n lines.push(\n row.map((v) => csvEscape(protectFormulas ? sanitizeFormulaCell(v) : v, separator)).join(separator)\n );\n }\n\n const body = lines.join(\"\\r\\n\");\n return params.prependBOM ? \"\\uFEFF\" + body : body;\n}\n","import { sanitizeFormulaCell } from \"./csv\";\n\nfunction escapeCell(value: any, protectFormulas: boolean): string {\n const safe = protectFormulas ? sanitizeFormulaCell(value) : value;\n const s = safe == null ? \"\" : String(safe);\n if (/[\"\\t\\n\\r]/.test(s)) {\n return '\"' + s.replace(/\"/g, '\"\"') + '\"';\n }\n return s;\n}\n\nexport function toTsv(rows: any[][], protectFormulas = true): string {\n return rows.map((row) => row.map((value) => escapeCell(value, protectFormulas)).join(\"\\t\")).join(\"\\n\");\n}\n\nexport function parseTsv(text: string): string[][] {\n return parseDelimited(text, \"\\t\");\n}\n\nexport function parseCsv(text: string, separator = \",\"): string[][] {\n return parseDelimited(text, separator);\n}\n\nexport function parseDelimited(text: string, separator: string): string[][] {\n const rows: string[][] = [];\n let row: string[] = [];\n let cell = \"\";\n let inQuotes = false;\n let i = 0;\n\n while (i < text.length) {\n const ch = text[i];\n if (inQuotes) {\n if (ch === '\"') {\n if (text[i + 1] === '\"') {\n cell += '\"';\n i += 2;\n continue;\n }\n inQuotes = false;\n i++;\n continue;\n }\n cell += ch;\n i++;\n continue;\n }\n if (ch === '\"' && cell === \"\") {\n inQuotes = true;\n i++;\n continue;\n }\n if (ch === separator) {\n row.push(cell);\n cell = \"\";\n i++;\n continue;\n }\n if (ch === \"\\n\" || ch === \"\\r\") {\n row.push(cell);\n rows.push(row);\n row = [];\n cell = \"\";\n if (ch === \"\\r\" && text[i + 1] === \"\\n\") i += 2;\n else i++;\n continue;\n }\n cell += ch;\n i++;\n }\n\n if (cell !== \"\" || row.length > 0) {\n row.push(cell);\n rows.push(row);\n }\n return rows;\n}\n\nexport function fallbackCopyText(text: string): boolean {\n let ta: HTMLTextAreaElement | null = null;\n try {\n ta = document.createElement(\"textarea\");\n ta.value = text;\n ta.style.position = \"fixed\";\n ta.style.opacity = \"0\";\n document.body.appendChild(ta);\n ta.focus();\n ta.select();\n const ok = document.execCommand(\"copy\");\n return ok;\n } catch {\n return false;\n } finally {\n ta?.remove();\n }\n}\n\nexport async function writeClipboard(text: string): Promise<boolean> {\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n void 0;\n }\n return fallbackCopyText(text);\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport { writeClipboard } from \"../lib/clipboard\";\n\ntype KeyboardContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"buildRangeTsv\"\n | \"clearRangeValues\"\n | \"columnModel\"\n | \"editingService\"\n | \"isDestroyed\"\n | \"options\"\n | \"pasteText\"\n | \"rowModel\"\n | \"selectionService\"\n | \"skeleton\"\n | \"undoService\"\n>;\n\nexport class KeyboardService {\n constructor(private core: KeyboardContext) {}\n\n init(): void {\n this.core.skeleton.root.addEventListener(\"keydown\", this.onKeyDown);\n this.core.skeleton.root.addEventListener(\"copy\", this.onCopy as EventListener);\n this.core.skeleton.root.addEventListener(\"cut\", this.onCut as EventListener);\n this.core.skeleton.root.addEventListener(\"paste\", this.onPaste as EventListener);\n }\n\n destroy(): void {\n this.core.skeleton.root.removeEventListener(\"keydown\", this.onKeyDown);\n this.core.skeleton.root.removeEventListener(\"copy\", this.onCopy as EventListener);\n this.core.skeleton.root.removeEventListener(\"cut\", this.onCut as EventListener);\n this.core.skeleton.root.removeEventListener(\"paste\", this.onPaste as EventListener);\n }\n\n nextEditable(rowIndex: number, colId: string, dir: 1 | -1): { rowIndex: number; column: Column } | null {\n const cols = this.core.columnModel.getOrderedVisible();\n const start = cols.findIndex((c) => c.id === colId);\n if (start < 0) return null;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n let i = start;\n let row = rowIndex;\n\n for (let guard = 0; guard < (cols.length + 1) * (rowCount + 1); guard++) {\n i += dir;\n if (i >= cols.length) {\n if (row >= rowCount - 1) return null;\n i = 0;\n row = this.skipDetailRows(row + 1, 1);\n } else if (i < 0) {\n if (row <= 0) return null;\n i = cols.length - 1;\n row = this.skipDetailRows(row - 1, -1);\n }\n if (row < 0 || row >= rowCount) return null;\n const node = this.core.rowModel.getDisplayedRow(row);\n if (node && !node.isDetail && this.core.editingService.isEditable(node, cols[i])) {\n return { rowIndex: row, column: cols[i] };\n }\n }\n return null;\n }\n\n private skipDetailRows(row: number, dir: 1 | -1): number {\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n let guard = 0;\n while (row >= 0 && row < rowCount) {\n const node = this.core.rowModel.getDisplayedRow(row);\n if (!node || !node.isDetail) return row;\n row += dir;\n guard++;\n if (guard > rowCount + 2) break;\n }\n return -1;\n }\n\n private onCopy = (e: ClipboardEvent): void => {\n if (this.core.options.suppressClipboard || this.core.editingService.isEditing()) return;\n const range = this.core.bodyRenderer.getNormalizedRangeOrFocus();\n if (!range) return;\n const text = this.core.buildRangeTsv(range);\n const dt = e.clipboardData;\n if (dt && typeof dt.setData === \"function\") {\n dt.setData(\"text/plain\", text);\n } else {\n void writeClipboard(text);\n }\n e.preventDefault();\n };\n\n private onCut = (e: ClipboardEvent): void => {\n if (this.core.options.suppressClipboard || this.core.editingService.isEditing()) return;\n const range = this.core.bodyRenderer.getNormalizedRangeOrFocus();\n if (!range) return;\n const text = this.core.buildRangeTsv(range);\n const dt = e.clipboardData;\n if (dt && typeof dt.setData === \"function\") {\n dt.setData(\"text/plain\", text);\n } else {\n void writeClipboard(text);\n }\n this.core.clearRangeValues(range);\n e.preventDefault();\n };\n\n private onPaste = (e: ClipboardEvent): void => {\n if (this.core.options.suppressClipboard || this.core.editingService.isEditing()) return;\n const start = this.core.bodyRenderer.getPasteStart();\n if (!start) return;\n const dt = e.clipboardData;\n const text = dt && typeof dt.getData === \"function\" ? dt.getData(\"text/plain\") : null;\n if (typeof text !== \"string\" || text === \"\") return;\n e.preventDefault();\n this.core.pasteText(text, start.row, start.colIdx);\n };\n\n private onKeyDown = (e: KeyboardEvent): void => {\n if (this.core.isDestroyed()) return;\n if (this.core.editingService.isEditing()) return;\n\n if ((e.ctrlKey || e.metaKey) && (e.key === \"a\" || e.key === \"A\")) {\n if (this.core.options.rowSelection === \"multiple\") {\n e.preventDefault();\n this.core.selectionService.selectAll(true);\n }\n return;\n }\n\n if ((e.ctrlKey || e.metaKey) && !e.altKey) {\n const key = e.key.toLowerCase();\n if (key === \"z\") {\n e.preventDefault();\n if (e.shiftKey) this.core.undoService.redo();\n else this.core.undoService.undo();\n return;\n }\n if (key === \"y\") {\n e.preventDefault();\n this.core.undoService.redo();\n return;\n }\n }\n\n const navigationKeys = [\n \"ArrowUp\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Enter\",\n \"F2\",\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\",\n \"Tab\",\n \" \",\n \"Escape\",\n \"Delete\",\n \"Backspace\"\n ];\n if (!navigationKeys.includes(e.key)) return;\n\n const body = this.core.bodyRenderer;\n const focus = body.focusedCell;\n\n if (e.key === \"Escape\") {\n if (this.core.options.enableRangeSelection && body.normalizedRange()) {\n e.preventDefault();\n body.clearRangeSelection();\n }\n return;\n }\n\n if (e.key === \"Delete\" || e.key === \"Backspace\") {\n if (this.core.options.enableRangeSelection) {\n const range = body.normalizedRange();\n if (range && !(range.r1 === range.r2 && range.c1 === range.c2)) {\n e.preventDefault();\n this.core.clearRangeValues(range);\n return;\n }\n }\n return;\n }\n\n if (!focus) {\n if (this.core.rowModel.getDisplayedRowCount() > 0) {\n const cols = this.core.columnModel.getOrderedVisible();\n if (cols.length > 0) {\n e.preventDefault();\n body.setFocusedCell(0, cols[0].id);\n }\n }\n return;\n }\n\n const cols = this.core.columnModel.getOrderedVisible();\n const colIdx = cols.findIndex((c) => c.id === focus.colId);\n if (colIdx < 0) return;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n if (rowCount === 0) return;\n\n const rangeMode = e.shiftKey && this.core.options.enableRangeSelection;\n\n let row = focus.rowIndex;\n let handled = true;\n let nextRow = row;\n let nextColIdx = colIdx;\n\n switch (e.key) {\n case \"ArrowUp\":\n nextRow = this.skipDetailRows(row - 1, -1);\n if (nextRow >= 0) row = nextRow;\n break;\n case \"ArrowDown\":\n nextRow = this.skipDetailRows(row + 1, 1);\n if (nextRow >= 0 && nextRow < rowCount) row = nextRow;\n break;\n case \"ArrowLeft\":\n nextColIdx = Math.max(0, colIdx - 1);\n break;\n case \"ArrowRight\":\n nextColIdx = Math.min(cols.length - 1, colIdx + 1);\n break;\n case \"Home\":\n nextColIdx = 0;\n if (e.ctrlKey) row = 0;\n break;\n case \"End\":\n nextColIdx = cols.length - 1;\n if (e.ctrlKey) row = Math.max(0, this.skipDetailRows(rowCount - 1, -1));\n break;\n case \"PageUp\":\n case \"PageDown\": {\n const viewport = this.core.skeleton.bodyViewports.center;\n const pageRows = Math.max(1, Math.floor(viewport.clientHeight / this.core.options.rowHeight));\n const target = e.key === \"PageUp\" ? row - pageRows : row + pageRows;\n const skipped = this.skipDetailRows(Math.max(0, Math.min(rowCount - 1, target)), e.key === \"PageUp\" ? -1 : 1);\n if (skipped >= 0) row = skipped;\n break;\n }\n case \"Enter\":\n case \"F2\": {\n const node = this.core.rowModel.getDisplayedRow(row);\n const column = cols[colIdx];\n if (node && !node.isDetail && column && this.core.editingService.isEditable(node, column)) {\n this.core.editingService.start(row, column, e.key === \"F2\" ? e.key : null);\n } else {\n const down = this.skipDetailRows(row + 1, 1);\n if (down >= 0 && down < rowCount) row = down;\n }\n break;\n }\n case \" \": {\n const node = this.core.rowModel.getDisplayedRow(row);\n if (node && !node.isDetail) {\n if (node.isGroup) {\n this.core.rowModel.toggleGroup(node.id);\n } else if (this.core.options.rowSelection !== \"none\") {\n this.core.selectionService.setNodeSelected(\n node,\n !node.selected,\n this.core.options.rowSelection === \"single\"\n );\n }\n }\n break;\n }\n case \"Tab\": {\n const next = this.nextEditable(row, focus.colId, e.shiftKey ? -1 : 1);\n if (next) {\n body.setFocusedCell(next.rowIndex, next.column.id);\n this.core.editingService.start(next.rowIndex, next.column);\n }\n break;\n }\n default:\n handled = false;\n }\n\n if (handled) e.preventDefault();\n\n if (rangeMode && (row !== focus.rowIndex || nextColIdx !== colIdx)) {\n body.moveRangeEnd(row, nextColIdx);\n return;\n }\n\n if (row !== focus.rowIndex || cols[colIdx].id !== focus.colId) {\n body.setFocusedCell(row, cols[colIdx].id);\n }\n };\n}\n","import type { ICellEditor } from \"../types/params\";\nimport type { Column } from \"./column\";\n\nfunction baseInput(type: string, value: any): HTMLInputElement {\n const input = document.createElement(\"input\");\n input.type = type;\n input.className = \"mach-editor-input\";\n if (value != null && value !== \"\") {\n input.value = type === \"date\" ? String(value).slice(0, 10) : String(value);\n }\n return input;\n}\n\nfunction inferEditorType(value: any, selectValues?: (string | number)[]): string {\n if (selectValues && selectValues.length > 0) return \"select\";\n if (typeof value === \"number\") return \"number\";\n if (value instanceof Date) return \"date\";\n if (typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}/.test(value)) return \"date\";\n return \"text\";\n}\n\nexport function createEditor(column: Column, value: any, keyPress?: string | null): ICellEditor {\n const def = column.colDef;\n const name = typeof def.cellEditor === \"string\" ? def.cellEditor : inferEditorType(value, def.cellEditorParams?.values);\n\n if (name === \"number\") {\n const input = baseInput(\"number\", value);\n return {\n el: input,\n getValue: () => (input.value === \"\" ? null : Number(input.value)),\n focus: () => {\n input.focus();\n input.select();\n }\n };\n }\n\n if (name === \"date\") {\n const input = baseInput(\"date\", value);\n const raw = value == null ? \"\" : String(value);\n const timeMatch = raw.match(/T(\\d{2}:\\d{2})/);\n return {\n el: input,\n getValue: () => {\n if (input.value === \"\") return null;\n if (timeMatch) return `${input.value}T${timeMatch[1]}`;\n return input.value;\n },\n focus: () => input.focus()\n };\n }\n\n if (name === \"select\") {\n const values = def.cellEditorParams?.values ?? [];\n const select = document.createElement(\"select\");\n select.className = \"mach-editor-select\";\n for (const v of values) {\n const option = document.createElement(\"option\");\n option.value = String(v);\n option.textContent = String(v);\n if (String(value) === String(v)) option.selected = true;\n select.appendChild(option);\n }\n return {\n el: select,\n getValue: () => {\n const match = values.find((v) => String(v) === select.value);\n return match !== undefined ? match : select.value;\n },\n focus: () => select.focus()\n };\n }\n\n const input = baseInput(\"text\", value);\n if (keyPress && keyPress.length === 1) input.value = keyPress;\n return {\n el: input,\n getValue: () => input.value,\n focus: () => {\n input.focus();\n input.select();\n }\n };\n}\n","/** Runtime-only DOM state kept out of public elements and their string keys. */\nexport interface CellRuntimeState {\n destroy?: () => void;\n flashTimer?: number;\n styleKeys?: string[];\n}\n\nconst cellStates = new WeakMap<HTMLElement, CellRuntimeState>();\nconst detailDestroyers = new WeakMap<HTMLElement, () => void>();\nconst headerDestroyers = new WeakMap<HTMLElement, () => void>();\n\nexport function getCellRuntimeState(element: HTMLElement): CellRuntimeState {\n let state = cellStates.get(element);\n if (!state) {\n state = {};\n cellStates.set(element, state);\n }\n return state;\n}\n\nexport function peekCellRuntimeState(element: HTMLElement): CellRuntimeState | undefined {\n return cellStates.get(element);\n}\n\nexport function setDetailDestroyer(element: HTMLElement, destroy: (() => void) | undefined): void {\n if (destroy) detailDestroyers.set(element, destroy);\n else detailDestroyers.delete(element);\n}\n\nexport function takeDetailDestroyer(element: HTMLElement): (() => void) | undefined {\n const destroy = detailDestroyers.get(element);\n detailDestroyers.delete(element);\n return destroy;\n}\n\nexport function setHeaderDestroyer(element: HTMLElement, destroy: (() => void) | undefined): void {\n if (destroy) headerDestroyers.set(element, destroy);\n else headerDestroyers.delete(element);\n}\n\nexport function takeHeaderDestroyer(element: HTMLElement): (() => void) | undefined {\n const destroy = headerDestroyers.get(element);\n headerDestroyers.delete(element);\n return destroy;\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { RowNode } from \"../types/row\";\nimport type { Column } from \"../services/column\";\nimport type { CellClassParams, CellRendererParams, ICellRendererResult } from \"../types/params\";\nimport { getCellRuntimeState, peekCellRuntimeState } from \"./runtimeState\";\n\ntype ErrorContext = Pick<GridCore<any>, \"reportError\">;\ntype CellValueContext = Pick<GridCore<any>, \"getApi\" | \"getCellValue\" | \"reportError\">;\ntype CellRenderContext = CellValueContext & Pick<GridCore<any>, \"options\" | \"resolveCellRenderer\">;\n\nexport function defaultFormat(value: any): string {\n if (value == null) return \"\";\n if (value instanceof Date) return value.toLocaleDateString();\n if (typeof value === \"object\") {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n }\n return String(value);\n}\n\nexport function cleanupCellContent(core: ErrorContext, cell: HTMLElement): void {\n const state = peekCellRuntimeState(cell);\n if (!state) return;\n if (state.flashTimer) clearTimeout(state.flashTimer);\n state.flashTimer = undefined;\n const destroy = state.destroy;\n state.destroy = undefined;\n if (!destroy) return;\n try {\n destroy();\n } catch (error) {\n core.reportError(error, \"cellRenderer.destroy\", { colId: cell.dataset.colId });\n }\n}\n\nexport function formatCellValue(core: CellValueContext, node: RowNode<any>, column: Column): string {\n const value = core.getCellValue(node, column);\n const formatter = column.colDef.valueFormatter;\n if (formatter) {\n try {\n const out = formatter({\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value\n });\n return out == null ? \"\" : String(out);\n } catch (error) {\n core.reportError(error, \"valueFormatter\", { colId: column.id, rowId: node.id });\n }\n }\n return defaultFormat(value);\n}\n\nexport function formatCellValueWith(core: CellValueContext, node: RowNode<any>, column: Column, value: any): string {\n const formatter = column.colDef.valueFormatter;\n if (formatter) {\n try {\n const out = formatter({\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value\n });\n return out == null ? \"\" : String(out);\n } catch (error) {\n core.reportError(error, \"valueFormatter\", { colId: column.id, rowId: node.id });\n }\n }\n return defaultFormat(value);\n}\n\nexport function applyCellStyle(core: CellValueContext, cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const rule = column.colDef.cellStyle;\n const state = getCellRuntimeState(cell);\n const prevKeys = state.styleKeys;\n if (prevKeys) {\n for (const key of prevKeys) {\n Reflect.set(cell.style, key, \"\");\n }\n }\n if (!rule) {\n state.styleKeys = undefined;\n return;\n }\n let styles: Partial<CSSStyleDeclaration> | null | undefined;\n if (typeof rule === \"function\") {\n const value = core.getCellValue(node, column);\n try {\n styles = rule({\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value,\n rowIndex: node.rowIndex\n });\n } catch (error) {\n core.reportError(error, \"cellStyle\", { colId: column.id, rowId: node.id });\n styles = null;\n }\n } else {\n styles = rule;\n }\n if (!styles) {\n state.styleKeys = undefined;\n return;\n }\n const keys = Object.keys(styles);\n for (const key of keys) {\n Reflect.set(cell.style, key, Reflect.get(styles, key));\n }\n state.styleKeys = keys;\n}\n\nexport function renderCellContent(core: CellRenderContext, cell: HTMLElement, node: RowNode<any>, column: Column): void {\n cleanupCellContent(core, cell);\n\n const value = core.getCellValue(node, column);\n const formatted = formatCellValue(core, node, column);\n const rendererDef = column.colDef.cellRenderer;\n const renderer =\n typeof rendererDef === \"string\" ? core.resolveCellRenderer(rendererDef) : rendererDef;\n\n if (renderer) {\n const params: CellRendererParams = {\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value,\n formatted,\n rowIndex: node.rowIndex,\n rendererParams: column.colDef.cellRendererParams\n };\n let out: ReturnType<typeof renderer>;\n try {\n out = renderer(params);\n } catch (error) {\n core.reportError(error, \"cellRenderer\", { colId: column.id, rowId: node.id });\n cell.textContent = formatted;\n return;\n }\n if (typeof out === \"string\") {\n cell.textContent = out;\n } else if (out instanceof HTMLElement) {\n cell.replaceChildren(out);\n } else if (out && typeof out === \"object\" && (out as ICellRendererResult).el instanceof HTMLElement) {\n const result = out as ICellRendererResult;\n cell.replaceChildren(result.el);\n if (result.destroy) getCellRuntimeState(cell).destroy = result.destroy;\n } else {\n cell.textContent = \"\";\n }\n } else {\n cell.textContent = formatted;\n }\n\n let tooltip = formatted;\n if (core.options.tooltipComponent) tooltip = \"\";\n const tooltipGetter = column.colDef.tooltipValueGetter;\n if (tooltipGetter) {\n try {\n const out = tooltipGetter({\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value\n });\n tooltip = out ?? formatted;\n } catch (error) {\n core.reportError(error, \"tooltipValueGetter\", { colId: column.id, rowId: node.id });\n }\n }\n if (tooltip) {\n if (cell.getAttribute(\"title\") !== tooltip) cell.setAttribute(\"title\", tooltip);\n } else if (cell.hasAttribute(\"title\")) {\n cell.removeAttribute(\"title\");\n }\n}\n\nexport function applyCellClasses(core: CellValueContext, cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const value = core.getCellValue(node, column);\n const classes = [\"mach-cell\"];\n const defType = column.colDef.type;\n const align = column.colDef.align;\n if (align === \"center\") {\n classes.push(\"mach-cell--center\");\n } else if (align === \"right\") {\n classes.push(\"mach-cell--right\");\n } else if (defType === \"rightAligned\" || defType === \"numericColumn\" || (typeof value === \"number\" && value != null)) {\n classes.push(\"mach-cell--num\");\n }\n\n const rule = column.colDef.cellClass;\n if (rule) {\n if (typeof rule === \"function\") {\n const params: CellClassParams = {\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value,\n rowIndex: node.rowIndex\n };\n try {\n const result = rule(params);\n if (typeof result === \"string\") classes.push(result);\n else if (Array.isArray(result)) classes.push(...result);\n } catch (error) {\n core.reportError(error, \"cellClass\", { colId: column.id, rowId: node.id });\n }\n } else if (typeof rule === \"string\") {\n classes.push(rule);\n } else if (Array.isArray(rule)) {\n classes.push(...rule);\n }\n }\n\n const hadFocus = cell.classList.contains(\"mach-cell--focus\");\n const hadEditing = cell.classList.contains(\"mach-cell--editing\");\n if (hadFocus) classes.push(\"mach-cell--focus\");\n if (hadEditing) classes.push(\"mach-cell--editing\");\n if (column.colDef.wrapText) classes.push(\"mach-cell--wrap\");\n\n const className = classes.join(\" \");\n if (cell.className !== className) cell.className = className;\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport type { RowNode } from \"../types/row\";\nimport type { ICellEditor } from \"../types/params\";\nimport { createEditor } from \"./editors\";\nimport { cleanupCellContent } from \"../render/cellContent\";\n\ntype EditingContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"emit\"\n | \"getApi\"\n | \"getCellValue\"\n | \"keyboardService\"\n | \"reportError\"\n | \"resolveCellEditor\"\n | \"rowModel\"\n | \"setCellValue\"\n>;\n\ninterface EditingState {\n node: RowNode<any>;\n column: Column;\n editor: ICellEditor;\n rowIndex: number;\n oldValue: any;\n}\n\nexport class EditingService {\n private editing: EditingState | null = null;\n\n constructor(private core: EditingContext) {}\n\n isEditing(rowIndex?: number, colId?: string): boolean {\n if (!this.editing) return false;\n if (rowIndex == null && colId == null) return true;\n return this.editing.rowIndex === rowIndex && this.editing.column.id === colId;\n }\n\n isEditable(node: RowNode<any>, column: Column): boolean {\n if (node.isDetail || node.isGroup || node.data == null) return false;\n const editable = column.colDef.editable;\n if (!editable) return false;\n if (typeof editable === \"function\") {\n try {\n return editable({\n api: this.core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value: this.core.getCellValue(node, column),\n rowIndex: node.rowIndex\n });\n } catch (error) {\n this.core.reportError(error, \"editable\", { colId: column.id, rowId: node.id });\n return false;\n }\n }\n return true;\n }\n\n start(rowIndex: number, column: Column, keyPress?: string | null): boolean {\n if (this.editing) this.stop(false);\n const node = this.core.rowModel.getDisplayedRow(rowIndex);\n if (!node || node.data == null) return false;\n if (!this.isEditable(node, column)) return false;\n const cell = this.core.bodyRenderer.getCellElement(rowIndex, column.id);\n if (!cell) return false;\n\n const value = this.core.getCellValue(node, column);\n const def = column.colDef;\n let editor: ICellEditor;\n const ce = def.cellEditor;\n try {\n if (typeof ce === \"function\") {\n editor = ce({\n api: this.core.getApi(),\n colDef: def,\n column,\n node,\n data: node.data,\n value,\n rowIndex,\n keyPress\n });\n } else if (typeof ce === \"string\" && ![\"text\", \"number\", \"date\", \"select\"].includes(ce)) {\n const factory = this.core.resolveCellEditor(ce);\n if (factory) {\n editor = factory({\n api: this.core.getApi(),\n colDef: def,\n column,\n node,\n data: node.data,\n value,\n rowIndex,\n keyPress\n });\n } else {\n editor = createEditor(column, value, keyPress);\n }\n } else {\n editor = createEditor(column, value, keyPress);\n }\n } catch (error) {\n this.core.reportError(error, \"cellEditor\", { colId: column.id, rowId: node.id });\n return false;\n }\n\n if (!editor || !(editor.el instanceof HTMLElement)) {\n this.core.reportError(new Error(\"cellEditor must return an editor with an HTMLElement el\"), \"cellEditor\", {\n colId: column.id,\n rowId: node.id\n });\n return false;\n }\n\n try {\n if (editor.isCancelBeforeStart?.()) {\n editor.destroy?.();\n return false;\n }\n } catch (error) {\n this.core.reportError(error, \"cellEditor.isCancelBeforeStart\", { colId: column.id, rowId: node.id });\n try { editor.destroy?.(); } catch { void 0; }\n return false;\n }\n\n cleanupCellContent(this.core, cell);\n\n cell.textContent = \"\";\n cell.classList.add(\"mach-cell--editing\");\n cell.appendChild(editor.el);\n this.editing = { node, column, editor, rowIndex, oldValue: value };\n\n editor.el.addEventListener(\"keydown\", this.onEditorKeyDown);\n editor.el.addEventListener(\"focusout\", this.onEditorBlur);\n try {\n editor.focus?.();\n } catch (error) {\n this.core.reportError(error, \"cellEditor.focus\", { colId: column.id, rowId: node.id });\n }\n\n this.core.emit(\"cellEditingStarted\", { rowIndex, colId: column.id, rowNode: node });\n return true;\n }\n\n stop(cancel = false): void {\n const editing = this.editing;\n if (!editing) return;\n this.editing = null;\n\n let newValue: any;\n let changed = false;\n if (!cancel) {\n try {\n newValue = editing.editor.getValue();\n } catch (error) {\n this.core.reportError(error, \"cellEditor.getValue\", { colId: editing.column.id, rowId: editing.node.id });\n cancel = true;\n }\n let cancelAfterEnd = cancel;\n if (!cancelAfterEnd) {\n try {\n cancelAfterEnd = editing.editor.isCancelAfterEnd?.(newValue) ?? false;\n } catch (error) {\n this.core.reportError(error, \"cellEditor.isCancelAfterEnd\", { colId: editing.column.id, rowId: editing.node.id });\n cancelAfterEnd = true;\n }\n }\n if (!cancelAfterEnd) {\n const validationError = this.validateValue(editing, newValue);\n if (typeof validationError === \"string\") {\n this.editing = editing;\n this.showError(editing, validationError);\n return;\n }\n changed = this.applyValue(editing, newValue);\n }\n }\n\n editing.editor.el.removeEventListener(\"keydown\", this.onEditorKeyDown);\n editing.editor.el.removeEventListener(\"focusout\", this.onEditorBlur);\n try {\n editing.editor.destroy?.();\n } catch (error) {\n this.core.reportError(error, \"cellEditor.destroy\", { colId: editing.column.id, rowId: editing.node.id });\n }\n\n const cell = this.core.bodyRenderer.getCellElement(editing.rowIndex, editing.column.id);\n if (cell) {\n cell.classList.remove(\"mach-cell--editing\");\n cell.classList.remove(\"mach-cell--error\");\n }\n\n this.core.emit(\"cellEditingStopped\", {\n rowIndex: editing.rowIndex,\n colId: editing.column.id,\n rowNode: editing.node,\n oldValue: editing.oldValue,\n newValue: changed ? newValue : editing.oldValue\n });\n\n if (editing.node.rowIndex >= 0) {\n this.core.bodyRenderer.refreshRows([editing.node.rowIndex]);\n }\n }\n\n private validateValue(editing: EditingState, newValue: any): string | true | null | undefined {\n const validate = editing.column.colDef.validate;\n if (!validate) return true;\n try {\n return validate(newValue, {\n oldValue: editing.oldValue,\n newValue,\n data: editing.node.data!,\n node: editing.node,\n colDef: editing.column.colDef,\n column: editing.column,\n api: this.core.getApi()\n });\n } catch (error) {\n this.core.reportError(error, \"validate\", { colId: editing.column.id, rowId: editing.node.id });\n return \"Validation failed\";\n }\n }\n\n private showError(editing: EditingState, message: string): void {\n const editorEl = editing.editor.el as HTMLElement;\n editorEl.classList.add(\"mach-editor-invalid\");\n editorEl.setAttribute(\"title\", message);\n editorEl.setAttribute(\"aria-invalid\", \"true\");\n const input = editorEl.querySelector(\"input, select\") ?? editorEl;\n (input as HTMLElement).focus?.();\n const clear = () => {\n editorEl.classList.remove(\"mach-editor-invalid\");\n editorEl.removeAttribute(\"title\");\n editorEl.removeAttribute(\"aria-invalid\");\n };\n editorEl.addEventListener(\"input\", clear, { once: true });\n }\n\n private applyValue(editing: EditingState, newValue: any): boolean {\n if (newValue === undefined) return false;\n return this.core.setCellValue(editing.node, editing.column, newValue, editing.oldValue);\n }\n\n private onEditorKeyDown = (e: KeyboardEvent): void => {\n if (!this.editing) return;\n if (e.key === \"Enter\") {\n e.preventDefault();\n e.stopPropagation();\n this.stop(false);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n this.stop(true);\n } else if (e.key === \"Tab\") {\n e.preventDefault();\n e.stopPropagation();\n const current = this.editing;\n const next = this.core.keyboardService.nextEditable(current.rowIndex, current.column.id, e.shiftKey ? -1 : 1);\n this.stop(false);\n if (next) {\n this.core.bodyRenderer.scrollToIndex(next.rowIndex, \"nearest\");\n this.core.bodyRenderer.setFocusedCell(next.rowIndex, next.column.id);\n this.start(next.rowIndex, next.column);\n }\n }\n };\n\n private onEditorBlur = (): void => {\n window.setTimeout(() => {\n if (this.editing) this.stop(false);\n }, 0);\n };\n\n destroy(): void {\n if (this.editing) this.stop(true);\n }\n}\n","export const DEFAULT_LOCALE = {\n matchContains: \"包含\",\n matchNotContains: \"不包含\",\n matchEquals: \"等于\",\n matchNotEquals: \"不等于\",\n matchStartsWith: \"开头是\",\n matchEndsWith: \"结尾是\",\n matchBlank: \"为空\",\n matchNotBlank: \"不为空\",\n matchLessThan: \"小于\",\n matchLessThanOrEqual: \"小于等于\",\n matchGreaterThan: \"大于\",\n matchGreaterThanOrEqual: \"大于等于\",\n matchInRange: \"在范围内\",\n apply: \"应用\",\n reset: \"重置\",\n search: \"搜索...\",\n emptySetLabel: \"(空)\",\n selectedCount: \"已选 {n} 项\",\n sortAsc: \"升序\",\n sortDesc: \"降序\",\n clearSort: \"取消排序\",\n pinLeft: \"固定左侧\",\n pinRight: \"固定右侧\",\n clearPin: \"取消固定\",\n autoSize: \"自适应列宽\",\n hideColumn: \"隐藏此列\",\n columnVisibility: \"列显示\",\n resetAll: \"重置全部\",\n autoSizeAll: \"全部自适应\",\n columnSettings: \"列设置\",\n totalLabel: \"合计\",\n totalRowsLabel: \"共 {n} 行\",\n menuCopy: \"复制\",\n menuPaste: \"粘贴\",\n menuClearContents: \"清除内容\",\n loading: \"加载中...\",\n statusSelected: \"已选 {n} 行\",\n statusSum: \"和 {n}\",\n statusAvg: \"均 {n}\",\n statusCount: \"计 {n}\",\n emptyRows: \"暂无数据\",\n emptyRowsHint: \"没有可显示的行\",\n paginationTotal: \"共 {n} 条\",\n paginationPage: \"第 {a} / {b} 页\",\n perPage: \"{n} 条/页\",\n pageFirst: \"首页\",\n pagePrev: \"上一页\",\n pageNext: \"下一页\",\n pageLast: \"末页\"\n} as const;\n\nexport type RgLocaleKey = keyof typeof DEFAULT_LOCALE;\nexport type RgLocale = Partial<Record<RgLocaleKey, string>>;\n\nexport const LOCALE_EN: RgLocale = {\n matchContains: \"Contains\",\n matchNotContains: \"Not Contains\",\n matchEquals: \"Equals\",\n matchNotEquals: \"Not Equals\",\n matchStartsWith: \"Starts With\",\n matchEndsWith: \"Ends With\",\n matchBlank: \"Blank\",\n matchNotBlank: \"Not Blank\",\n matchLessThan: \"Less Than\",\n matchLessThanOrEqual: \"≤\",\n matchGreaterThan: \"Greater Than\",\n matchGreaterThanOrEqual: \"≥\",\n matchInRange: \"In Range\",\n apply: \"Apply\",\n reset: \"Reset\",\n search: \"Search...\",\n emptySetLabel: \"(blank)\",\n selectedCount: \"{n} selected\",\n sortAsc: \"Ascending\",\n sortDesc: \"Descending\",\n clearSort: \"Clear Sort\",\n pinLeft: \"Pin Left\",\n pinRight: \"Pin Right\",\n clearPin: \"Unpin\",\n autoSize: \"Auto Fit\",\n hideColumn: \"Hide Column\",\n columnVisibility: \"Columns\",\n resetAll: \"Reset All\",\n autoSizeAll: \"Fit All\",\n columnSettings: \"Column Settings\",\n totalLabel: \"Total\",\n totalRowsLabel: \"{n} rows\",\n menuCopy: \"Copy\",\n menuPaste: \"Paste\",\n menuClearContents: \"Clear Contents\",\n loading: \"Loading...\",\n statusSelected: \"{n} selected\",\n statusSum: \"Sum {n}\",\n statusAvg: \"Avg {n}\",\n statusCount: \"Cnt {n}\",\n emptyRows: \"No Data\",\n emptyRowsHint: \"No rows to display\",\n paginationTotal: \"{n} items\",\n paginationPage: \"Page {a} / {b}\",\n perPage: \"{n} / page\",\n pageFirst: \"First\",\n pagePrev: \"Previous\",\n pageNext: \"Next\",\n pageLast: \"Last\"\n};\n\nconst MATCH_LOCALE_KEYS: Record<string, RgLocaleKey> = {\n contains: \"matchContains\",\n notContains: \"matchNotContains\",\n equals: \"matchEquals\",\n notEquals: \"matchNotEquals\",\n startsWith: \"matchStartsWith\",\n endsWith: \"matchEndsWith\",\n blank: \"matchBlank\",\n notBlank: \"matchNotBlank\",\n lessThan: \"matchLessThan\",\n lessThanOrEqual: \"matchLessThanOrEqual\",\n greaterThan: \"matchGreaterThan\",\n greaterThanOrEqual: \"matchGreaterThanOrEqual\",\n inRange: \"matchInRange\"\n};\n\nexport function matchLocaleKey(match: string): RgLocaleKey {\n return MATCH_LOCALE_KEYS[match] ?? (\"matchEquals\" as RgLocaleKey);\n}\n\nexport function formatText(template: string, n: number | string): string {\n return template.replace(\"{n}\", String(n));\n}\n\nexport function formatTwo(template: string, a: number | string, b: number | string): string {\n return template.replace(\"{a}\", String(a)).replace(\"{b}\", String(b));\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport type {\n ColumnFilter,\n DateFilterMatch,\n NumberFilterMatch,\n TextFilterMatch\n} from \"../types/colDef\";\nimport { el, clamp } from \"../lib/dom\";\nimport { matchLocaleKey } from \"../lib/locale\";\n\ntype FilterPopupContext = Pick<\n GridCore<any>,\n \"applyColumnFilter\" | \"getCellValue\" | \"getLocaleText\" | \"rowModel\"\n>;\n\nconst TEXT_MATCHES: TextFilterMatch[] = [\n \"contains\",\n \"notContains\",\n \"equals\",\n \"notEquals\",\n \"startsWith\",\n \"endsWith\",\n \"blank\",\n \"notBlank\"\n];\nconst NUMBER_MATCHES: NumberFilterMatch[] = [\n \"equals\",\n \"notEquals\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"inRange\",\n \"blank\",\n \"notBlank\"\n];\nconst DATE_MATCHES: DateFilterMatch[] = [\"equals\", \"notEquals\", \"lessThan\", \"greaterThan\", \"inRange\", \"blank\", \"notBlank\"];\n\nexport class FilterPopupService {\n private panel: HTMLElement | null = null;\n private openColId: string | null = null;\n\n constructor(private core: FilterPopupContext) {}\n\n toggle(column: Column, anchor: HTMLElement): void {\n if (this.openColId === column.id) {\n this.close();\n return;\n }\n this.close();\n this.open(column, anchor);\n }\n\n private docMouseDown = (e: MouseEvent): void => {\n if (this.panel && !this.panel.contains(e.target as Node)) this.close();\n };\n\n private docKeyDown = (e: KeyboardEvent): void => {\n if (e.key === \"Escape\") this.close();\n };\n\n private open(column: Column, anchor: HTMLElement): void {\n const filter = this.core.rowModel.getFilterModel()[column.id] ?? null;\n const type = filter?.type ?? column.filterType;\n const panel = el(\"div\", \"mach-filter-panel\");\n panel.setAttribute(\"role\", \"dialog\");\n panel.setAttribute(\"aria-label\", `${column.id} filter`);\n\n if (type === \"set\") this.buildSetBody(panel, column, filter);\n else this.buildConditionBody(panel, column, type, filter);\n\n const footer = el(\"div\", \"mach-filter-footer\");\n const resetBtn = el(\"button\", \"mach-filter-btn-reset\") as HTMLButtonElement;\n resetBtn.type = \"button\";\n resetBtn.textContent = this.core.getLocaleText(\"reset\");\n resetBtn.addEventListener(\"click\", () => {\n this.core.applyColumnFilter(column, null);\n this.close();\n });\n const applyBtn = el(\"button\", \"mach-filter-btn-apply\") as HTMLButtonElement;\n applyBtn.type = \"button\";\n applyBtn.textContent = this.core.getLocaleText(\"apply\");\n applyBtn.addEventListener(\"click\", () => {\n const next = this.readFilter(panel);\n this.core.applyColumnFilter(column, next);\n this.close();\n });\n footer.append(resetBtn, applyBtn);\n panel.appendChild(footer);\n\n document.body.appendChild(panel);\n this.panel = panel;\n this.openColId = column.id;\n\n const rect = anchor.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const left = clamp(rect.left, 8, window.innerWidth - panelRect.width - 8);\n let top = rect.bottom + 4;\n if (top + panelRect.height > window.innerHeight - 8) {\n top = Math.max(8, rect.top - panelRect.height - 4);\n }\n panel.style.left = `${left}px`;\n panel.style.top = `${top}px`;\n\n document.addEventListener(\"mousedown\", this.docMouseDown, true);\n document.addEventListener(\"keydown\", this.docKeyDown, true);\n const firstInput = panel.querySelector<HTMLInputElement>(\"input, select\");\n firstInput?.focus();\n }\n\n close(): void {\n if (!this.panel) return;\n this.panel.remove();\n this.panel = null;\n this.openColId = null;\n document.removeEventListener(\"mousedown\", this.docMouseDown, true);\n document.removeEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n destroy(): void {\n this.close();\n }\n\n private buildConditionBody(\n panel: HTMLElement,\n column: Column,\n type: \"text\" | \"number\" | \"date\",\n filter: ColumnFilter | null\n ): void {\n const matches = type === \"text\" ? TEXT_MATCHES : type === \"number\" ? NUMBER_MATCHES : DATE_MATCHES;\n const existing =\n filter && filter.type !== \"set\" && filter.conditions.length > 0 ? filter.conditions[0] : null;\n const currentMatch: TextFilterMatch | NumberFilterMatch | DateFilterMatch =\n existing?.match ?? (type === \"text\" ? \"contains\" : \"equals\");\n const isBlank = currentMatch === \"blank\" || currentMatch === \"notBlank\";\n\n const select = el(\"select\", \"mach-filter-select\") as HTMLSelectElement;\n for (const m of matches) {\n const option = document.createElement(\"option\");\n option.value = m;\n option.textContent = this.core.getLocaleText(matchLocaleKey(m));\n select.appendChild(option);\n }\n select.value = currentMatch;\n\n const valueInput = el(\"input\", \"mach-filter-input\") as HTMLInputElement;\n if (type === \"number\") valueInput.type = \"number\";\n if (type === \"date\") valueInput.type = \"date\";\n if (existing && existing.value != null && !isBlank) {\n valueInput.value = type === \"date\" ? String(existing.value).slice(0, 10) : String(existing.value);\n }\n\n const value2Input = el(\"input\", \"mach-filter-input mach-filter-input--second\") as HTMLInputElement;\n if (type === \"number\") value2Input.type = \"number\";\n if (type === \"date\") value2Input.type = \"date\";\n if (existing && \"value2\" in existing && existing.value2 != null) {\n value2Input.value = String(existing.value2).slice(0, 10);\n }\n value2Input.style.display = currentMatch === \"inRange\" ? \"\" : \"none\";\n\n select.addEventListener(\"change\", () => {\n const blank = select.value === \"blank\" || select.value === \"notBlank\";\n valueInput.style.display = blank ? \"none\" : \"\";\n value2Input.style.display = select.value === \"inRange\" ? \"\" : \"none\";\n });\n\n const enterApply = (e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n const next = this.readFilter(panel);\n this.core.applyColumnFilter(column, next);\n this.close();\n }\n };\n valueInput.addEventListener(\"keydown\", enterApply);\n value2Input.addEventListener(\"keydown\", enterApply);\n\n const body = el(\"div\", \"mach-filter-body\");\n body.append(select, valueInput, value2Input);\n panel.appendChild(body);\n panel.dataset.filterType = type;\n }\n\n private buildSetBody(panel: HTMLElement, column: Column, filter: ColumnFilter | null): void {\n const def = column.colDef;\n const params = def.filterParams;\n let values: (string | number | null)[];\n\n if (params?.values) {\n values = params.values;\n } else {\n const seen = new Set<string>();\n values = [];\n const nodes = this.core.rowModel.getAllNodes();\n const cap = Math.min(nodes.length, params?.maxValues ?? 500);\n for (let i = 0; i < cap; i++) {\n const v = this.core.getCellValue(nodes[i], column);\n const key = v == null ? \"__null__\" : String(v);\n if (seen.has(key)) continue;\n seen.add(key);\n values.push(v);\n }\n }\n\n const selected = new Set<string>(\n filter?.type === \"set\" ? filter.values.map((v) => (v == null ? \"__null__\" : String(v))) : values.map((v) => (v == null ? \"__null__\" : String(v)))\n );\n\n const search = el(\"input\", \"mach-filter-input mach-filter-input--search\") as HTMLInputElement;\n search.type = \"text\";\n search.placeholder = this.core.getLocaleText(\"search\");\n\n const list = el(\"div\", \"mach-filter-set-list\");\n const checkboxes: HTMLInputElement[] = [];\n const valueByKey = new Map<string, string | number | null>();\n\n const renderList = (query: string) => {\n list.textContent = \"\";\n checkboxes.length = 0;\n const q = query.trim().toLowerCase();\n for (const v of values) {\n const text = v == null ? this.core.getLocaleText(\"emptySetLabel\") : String(v);\n if (q && !text.toLowerCase().includes(q)) continue;\n const key = v == null ? \"__null__\" : String(v);\n valueByKey.set(key, v);\n const label = el(\"label\", \"mach-filter-set-item\");\n const cb = document.createElement(\"input\");\n cb.type = \"checkbox\";\n cb.checked = selected.has(key);\n cb.addEventListener(\"change\", () => {\n if (cb.checked) selected.add(key);\n else selected.delete(key);\n });\n const span = el(\"span\");\n span.textContent = text;\n label.append(cb, span);\n list.appendChild(label);\n checkboxes.push(cb);\n }\n };\n\n search.addEventListener(\"input\", () => renderList(search.value));\n renderList(\"\");\n panel.dataset.filterType = \"set\";\n panel.dataset.setValues = JSON.stringify([...valueByKey.entries()]);\n\n const updateSetValues = () => {\n const entries = [...valueByKey.entries()];\n panel.dataset.setValues = JSON.stringify(entries);\n };\n updateSetValues();\n\n const body = el(\"div\", \"mach-filter-body mach-filter-body--set\");\n body.append(search, list);\n panel.appendChild(body);\n }\n\n private readFilter(panel: HTMLElement): ColumnFilter | null {\n const type = panel.dataset.filterType;\n\n if (type === \"set\") {\n let entries: [string, string | number | null][] = [];\n try {\n entries = JSON.parse(panel.dataset.setValues ?? \"[]\");\n } catch {\n entries = [];\n }\n const selectedKeys = new Set<string>();\n panel.querySelectorAll<HTMLInputElement>(\".mach-filter-set-item input:checked\").forEach((cb) => {\n const item = cb.closest(\".mach-filter-set-item\")!;\n const span = item.querySelector(\"span\")!;\n const emptyLabel = this.core.getLocaleText(\"emptySetLabel\");\n const text = span.textContent === emptyLabel ? \"__null__\" : span.textContent ?? \"\";\n selectedKeys.add(text);\n });\n const picked = entries.filter(([key]) => selectedKeys.has(key)).map(([, v]) => v);\n if (picked.length === entries.length || picked.length === 0) return null;\n return { type: \"set\", values: picked };\n }\n\n const select = panel.querySelector<HTMLSelectElement>(\".mach-filter-select\");\n const inputs = panel.querySelectorAll<HTMLInputElement>(\".mach-filter-input\");\n const valueInput = inputs[0];\n const value2Input = inputs[1];\n if (!select || !valueInput) return null;\n\n const match = select.value;\n if (match === \"blank\" || match === \"notBlank\") {\n return { type, conditions: [{ match: match as \"blank\" | \"notBlank\" }] } as ColumnFilter;\n }\n const raw = valueInput.value;\n if (raw === \"\" && !(match === \"inRange\")) return null;\n\n if (type === \"number\") {\n const value = Number(raw);\n if (isNaN(value)) return null;\n if (match === \"inRange\") {\n const value2 = value2Input && value2Input.value !== \"\" ? Number(value2Input.value) : value;\n if (isNaN(value2)) return null;\n return { type: \"number\", conditions: [{ match: \"inRange\", value, value2 }] };\n }\n return { type: \"number\", conditions: [{ match: match as NumberFilterMatch, value }] };\n }\n\n if (type === \"date\") {\n const value = raw;\n if (match === \"inRange\") {\n const value2 = value2Input && value2Input.value !== \"\" ? value2Input.value : value;\n return { type: \"date\", conditions: [{ match: \"inRange\", value, value2 }] };\n }\n return { type: \"date\", conditions: [{ match: match as DateFilterMatch, value }] };\n }\n\n return { type: \"text\", conditions: [{ match: match as TextFilterMatch, value: raw }] };\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport { el, clamp } from \"../lib/dom\";\n\ntype ColumnMenuContext = Pick<\n GridCore<any>,\n \"columnModel\" | \"getApi\" | \"getLocaleText\" | \"options\" | \"skeleton\"\n>;\n\nexport class ColumnMenuService {\n private panel: HTMLElement | null = null;\n private openColId: string | null = null;\n private standaloneAnchor: HTMLElement | null = null;\n\n constructor(private core: ColumnMenuContext) {}\n\n toggle(column: Column, anchor: HTMLElement): void {\n if (this.openColId === column.id) {\n this.close();\n return;\n }\n this.close();\n this.open(column, anchor);\n }\n\n openStandalone(anchor?: HTMLElement): void {\n this.close();\n const target =\n anchor ??\n (() => {\n const root = this.core.skeleton.root;\n const rect = root.getBoundingClientRect();\n const fake = document.createElement(\"div\");\n fake.style.position = \"fixed\";\n fake.style.left = `${rect.right - 16}px`;\n fake.style.top = `${rect.top + this.core.options.headerHeight}px`;\n fake.style.width = \"1px\";\n fake.style.height = \"1px\";\n document.body.appendChild(fake);\n this.standaloneAnchor = fake;\n return fake;\n })();\n this.open(null as unknown as Column, target);\n }\n\n close(): void {\n if (this.standaloneAnchor) {\n this.standaloneAnchor.remove();\n this.standaloneAnchor = null;\n }\n this.panel?.remove();\n this.panel = null;\n this.openColId = null;\n document.removeEventListener(\"mousedown\", this.docMouseDown, true);\n document.removeEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n destroy(): void {\n this.close();\n }\n\n private docMouseDown = (e: MouseEvent): void => {\n if (this.panel && !this.panel.contains(e.target as Node)) this.close();\n };\n\n private docKeyDown = (e: KeyboardEvent): void => {\n if (e.key === \"Escape\") this.close();\n };\n\n private open(column: Column | null, anchor: HTMLElement): void {\n const api = this.core.getApi();\n const panel = el(\"div\", \"mach-filter-panel mach-column-panel\");\n panel.setAttribute(\"role\", \"menu\");\n\n const title = el(\"div\", \"mach-column-panel-title\");\n title.textContent = column\n ? column.colDef.headerName ?? column.colDef.field ?? column.id\n : this.core.getLocaleText(\"columnSettings\");\n panel.appendChild(title);\n\n if (column && column.sortable) {\n const sortRow = el(\"div\", \"mach-column-panel-actions\");\n const makeSortBtn = (labelKey: \"sortAsc\" | \"sortDesc\" | \"clearSort\", dir: \"asc\" | \"desc\" | null) => {\n const btn = el(\"button\", \"mach-column-panel-btn\") as HTMLButtonElement;\n btn.type = \"button\";\n btn.textContent = this.core.getLocaleText(labelKey);\n btn.addEventListener(\"click\", () => {\n api.setSortModel(dir ? [{ colId: column.id, direction: dir }] : []);\n this.close();\n });\n return btn;\n };\n sortRow.append(makeSortBtn(\"sortAsc\", \"asc\"), makeSortBtn(\"sortDesc\", \"desc\"), makeSortBtn(\"clearSort\", null));\n panel.appendChild(sortRow);\n }\n\n const pinRow = el(\"div\", \"mach-column-panel-actions\");\n const makePinBtn = (labelKey: \"pinLeft\" | \"pinRight\" | \"clearPin\", pinned: \"left\" | \"right\" | null) => {\n const btn = el(\"button\", \"mach-column-panel-btn\") as HTMLButtonElement;\n btn.type = \"button\";\n btn.textContent = this.core.getLocaleText(labelKey);\n btn.addEventListener(\"click\", () => {\n if (column) api.setColumnPinned(column.id, pinned);\n this.close();\n });\n return btn;\n };\n if (column) {\n pinRow.append(makePinBtn(\"pinLeft\", \"left\"), makePinBtn(\"pinRight\", \"right\"), makePinBtn(\"clearPin\", null));\n panel.appendChild(pinRow);\n }\n\n const toolRow = el(\"div\", \"mach-column-panel-actions\");\n const fitBtn = el(\"button\", \"mach-column-panel-btn\") as HTMLButtonElement;\n fitBtn.type = \"button\";\n fitBtn.textContent = this.core.getLocaleText(\"autoSize\");\n fitBtn.addEventListener(\"click\", () => {\n if (column) api.autoSizeColumn(column.id);\n else api.autoSizeAllColumns();\n this.close();\n });\n const hideBtn = el(\"button\", \"mach-column-panel-btn\") as HTMLButtonElement;\n hideBtn.type = \"button\";\n hideBtn.textContent = this.core.getLocaleText(\"hideColumn\");\n hideBtn.addEventListener(\"click\", () => {\n if (column) api.setColumnVisibility(column.id, false);\n this.close();\n });\n if (column) {\n toolRow.append(fitBtn, hideBtn);\n panel.appendChild(toolRow);\n }\n\n const divider = el(\"div\", \"mach-column-panel-divider\");\n panel.appendChild(divider);\n\n const listTitle = el(\"div\", \"mach-column-panel-subtitle\");\n listTitle.textContent = this.core.getLocaleText(\"columnVisibility\");\n panel.appendChild(listTitle);\n\n const list = el(\"div\", \"mach-column-panel-list\");\n for (const col of this.core.columnModel.getColumns()) {\n if (col.isDetailToggle) continue;\n const label = el(\"label\", \"mach-filter-set-item\");\n const cb = document.createElement(\"input\");\n cb.type = \"checkbox\";\n cb.checked = !col.hide;\n cb.disabled = col.hasCheckbox;\n cb.addEventListener(\"change\", () => {\n api.setColumnVisibility(col.id, cb.checked);\n this.rebuildListStates();\n });\n const span = el(\"span\");\n span.textContent = col.colDef.headerName ?? col.colDef.field ?? col.id;\n label.append(cb, span);\n list.appendChild(label);\n }\n panel.appendChild(list);\n\n const footer = el(\"div\", \"mach-filter-footer\");\n const resetBtn = el(\"button\", \"mach-filter-btn-reset\") as HTMLButtonElement;\n resetBtn.type = \"button\";\n resetBtn.textContent = this.core.getLocaleText(\"resetAll\");\n resetBtn.addEventListener(\"click\", () => {\n api.resetColumnState();\n this.close();\n });\n const allFitBtn = el(\"button\", \"mach-filter-btn-apply\") as HTMLButtonElement;\n allFitBtn.type = \"button\";\n allFitBtn.textContent = this.core.getLocaleText(\"autoSizeAll\");\n allFitBtn.addEventListener(\"click\", () => {\n api.autoSizeAllColumns();\n this.close();\n });\n footer.append(resetBtn, allFitBtn);\n panel.appendChild(footer);\n\n document.body.appendChild(panel);\n this.panel = panel;\n this.openColId = column ? column.id : \"__standalone__\";\n\n const rect = anchor.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const left = clamp(rect.left, 8, window.innerWidth - panelRect.width - 8);\n let top = rect.bottom + 4;\n if (top + panelRect.height > window.innerHeight - 8) {\n top = Math.max(8, rect.top - panelRect.height - 4);\n }\n panel.style.left = `${left}px`;\n panel.style.top = `${top}px`;\n\n document.addEventListener(\"mousedown\", this.docMouseDown, true);\n document.addEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n private rebuildListStates(): void {\n if (!this.panel) return;\n const items = this.panel.querySelectorAll<HTMLLabelElement>(\".mach-column-panel-list .mach-filter-set-item\");\n const cols = this.core.columnModel.getColumns().filter((c) => !c.isDetailToggle);\n items.forEach((item, i) => {\n const col = cols[i];\n if (!col) return;\n const cb = item.querySelector<HTMLInputElement>(\"input\");\n if (cb && !cb.disabled) cb.checked = !col.hide;\n });\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport { el, clamp } from \"../lib/dom\";\n\ntype ContextMenuContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"clearRangeValues\"\n | \"columnModel\"\n | \"copyActiveRange\"\n | \"getApi\"\n | \"getCellValue\"\n | \"getLocaleText\"\n | \"options\"\n | \"pasteFromSystemClipboard\"\n | \"reportError\"\n | \"rowModel\"\n>;\n\nexport class ContextMenuService {\n private panel: HTMLElement | null = null;\n\n constructor(private core: ContextMenuContext) {}\n\n open(x: number, y: number, anchor?: { rowIndex: number; colId: string }): void {\n this.close();\n const core = this.core;\n let node: import(\"../types/row\").RowNode<any> | undefined;\n let anchorCol: Column | undefined;\n\n if (anchor) {\n node = core.rowModel.getDisplayedRow(anchor.rowIndex);\n anchorCol = core.columnModel.getColumn(anchor.colId);\n } else {\n const range = core.bodyRenderer.getNormalizedRangeOrFocus();\n if (!range) return;\n const flat = core.columnModel.getOrderedVisible();\n node = core.rowModel.getDisplayedRow(range.r1);\n anchorCol = flat[range.c1];\n }\n if (!node || !anchorCol) return;\n const anchorIndex = node.rowIndex;\n\n const panel = el(\"div\", \"mach-context-menu\");\n panel.setAttribute(\"role\", \"menu\");\n\n const customGetter = core.options.getContextMenuItems;\n if (customGetter) {\n let items;\n try {\n items = customGetter({\n data: node.data,\n node,\n api: core.getApi(),\n colId: anchorCol.id,\n value: core.getCellValue(node, anchorCol),\n rowIndex: anchorIndex\n });\n } catch (error) {\n core.reportError(error, \"getContextMenuItems\", { colId: anchorCol.id, rowId: node.id });\n return;\n }\n if (items === null || items === undefined) return;\n let hasEnabled = false;\n for (const item of items) {\n if (item.separator) {\n const sep = el(\"div\", \"mach-context-menu-separator\");\n panel.appendChild(sep);\n continue;\n }\n const btn = el(\"button\", \"mach-context-menu-item\") as HTMLButtonElement;\n btn.type = \"button\";\n btn.textContent = item.label ?? \"\";\n if (item.danger) btn.classList.add(\"mach-context-menu-item--danger\");\n if (item.disabled) {\n btn.disabled = true;\n } else {\n hasEnabled = true;\n btn.addEventListener(\"click\", () => {\n this.close();\n try {\n item.action?.();\n } catch (error) {\n core.reportError(error, \"contextMenu.action\", { colId: anchorCol!.id, rowId: node!.id });\n }\n });\n }\n panel.appendChild(btn);\n }\n if (!hasEnabled) {\n panel.remove();\n return;\n }\n this.attach(panel, x, y);\n return;\n }\n\n const copyBtn = el(\"button\", \"mach-context-menu-item\") as HTMLButtonElement;\n copyBtn.type = \"button\";\n copyBtn.textContent = core.getLocaleText(\"menuCopy\");\n copyBtn.addEventListener(\"click\", () => {\n void core.copyActiveRange();\n this.close();\n });\n panel.appendChild(copyBtn);\n\n if (!core.options.suppressClipboard) {\n const pasteBtn = el(\"button\", \"mach-context-menu-item\") as HTMLButtonElement;\n pasteBtn.type = \"button\";\n pasteBtn.textContent = core.getLocaleText(\"menuPaste\");\n pasteBtn.addEventListener(\"click\", () => {\n void core.pasteFromSystemClipboard();\n this.close();\n });\n panel.appendChild(pasteBtn);\n\n const clearBtn = el(\"button\", \"mach-context-menu-item\") as HTMLButtonElement;\n clearBtn.type = \"button\";\n clearBtn.textContent = core.getLocaleText(\"menuClearContents\");\n clearBtn.addEventListener(\"click\", () => {\n const active = core.bodyRenderer.getNormalizedRangeOrFocus();\n if (active) core.clearRangeValues(active);\n this.close();\n });\n panel.appendChild(clearBtn);\n }\n\n this.attach(panel, x, y);\n }\n\n private attach(panel: HTMLElement, x: number, y: number): void {\n document.body.appendChild(panel);\n this.panel = panel;\n const rect = panel.getBoundingClientRect();\n const left = clamp(x, 8, Math.max(8, window.innerWidth - rect.width - 8));\n const top = clamp(y, 8, Math.max(8, window.innerHeight - rect.height - 8));\n panel.style.left = `${left}px`;\n panel.style.top = `${top}px`;\n document.addEventListener(\"mousedown\", this.docMouseDown, true);\n document.addEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n close(): void {\n if (!this.panel) return;\n this.panel.remove();\n this.panel = null;\n document.removeEventListener(\"mousedown\", this.docMouseDown, true);\n document.removeEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n destroy(): void {\n this.close();\n }\n\n private docMouseDown = (e: MouseEvent): void => {\n if (this.panel && !this.panel.contains(e.target as Node)) this.close();\n };\n\n private docKeyDown = (e: KeyboardEvent): void => {\n if (e.key === \"Escape\") this.close();\n };\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport type { TooltipParams } from \"../types/params\";\nimport { el, clamp } from \"../lib/dom\";\nimport { formatCellValue } from \"../render/cellContent\";\n\ntype TooltipContext = Pick<\n GridCore<any>,\n | \"columnModel\"\n | \"getApi\"\n | \"getCellValue\"\n | \"isDestroyed\"\n | \"options\"\n | \"reportError\"\n | \"rowModel\"\n | \"skeleton\"\n>;\n\nexport class TooltipService {\n private panel: HTMLElement | null = null;\n private showTimer = 0;\n private hideTimer = 0;\n private currentCell: HTMLElement | null = null;\n\n constructor(private core: TooltipContext) {}\n\n init(): void {\n const body = this.core.skeleton.bodyEl;\n body.addEventListener(\"mouseover\", this.onMouseOver);\n body.addEventListener(\"mouseleave\", this.onBodyLeave);\n }\n\n destroy(): void {\n this.clearTimers();\n this.removePanel();\n const body = this.core.skeleton.bodyEl;\n body.removeEventListener(\"mouseover\", this.onMouseOver);\n body.removeEventListener(\"mouseleave\", this.onBodyLeave);\n this.currentCell = null;\n }\n\n hide(): void {\n this.clearTimers();\n this.removePanel();\n this.currentCell = null;\n }\n\n private clearTimers(): void {\n if (this.showTimer) {\n clearTimeout(this.showTimer);\n this.showTimer = 0;\n }\n if (this.hideTimer) {\n clearTimeout(this.hideTimer);\n this.hideTimer = 0;\n }\n }\n\n private removePanel(): void {\n if (!this.panel) return;\n this.panel.remove();\n this.panel = null;\n }\n\n private onMouseOver = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n if (!this.core.options.tooltipComponent) return;\n const target = e.target as HTMLElement;\n const cell = target.closest<HTMLElement>(\".mach-cell\");\n if (!cell || cell === this.currentCell) return;\n\n this.clearTimers();\n this.removePanel();\n this.currentCell = cell;\n\n const colId = cell.dataset.colId ?? \"\";\n const rowEl = cell.closest<HTMLElement>(\".mach-row\");\n const index = Number(rowEl?.dataset.index);\n const node = Number.isNaN(index) ? undefined : this.core.rowModel.getDisplayedRow(index);\n const column: Column | undefined = colId ? this.core.columnModel.getColumn(colId) : undefined;\n if (!node || !column || node.isDetail || node.isGroup) return;\n if (cell.classList.contains(\"mach-cell--editing\")) return;\n\n const value = this.core.getCellValue(node, column);\n const params: TooltipParams<any> = {\n data: node.data,\n node,\n api: this.core.getApi(),\n colId: column.id,\n value,\n formatted: formatCellValue(this.core, node, column),\n rowIndex: index\n };\n\n const getter = column.colDef.tooltipValueGetter;\n let fallback = params.formatted;\n if (getter) {\n try {\n fallback = getter({ ...params, colDef: column.colDef, column }) ?? params.formatted;\n } catch (error) {\n this.core.reportError(error, \"tooltipValueGetter\", { colId: column.id, rowId: node.id });\n }\n }\n if (!fallback && !column.colDef.tooltipValueGetter) return;\n\n this.showTimer = setTimeout(() => {\n if (this.core.isDestroyed() || this.currentCell !== cell) return;\n this.showPanel(cell, params);\n }, Math.max(0, this.core.options.tooltipShowDelay)) as unknown as number;\n };\n\n private onBodyLeave = (): void => {\n this.hide();\n };\n\n private showPanel(cell: HTMLElement, params: TooltipParams<any>): void {\n this.removePanel();\n const component = this.core.options.tooltipComponent;\n if (!component) return;\n\n const panel = el(\"div\", \"mach-tooltip\");\n panel.setAttribute(\"role\", \"tooltip\");\n let content: string | HTMLElement;\n try {\n content = component(params);\n } catch (err) {\n this.core.reportError(err, \"tooltipComponent\", { colId: params.colId, rowIndex: params.rowIndex });\n return;\n }\n if (typeof content === \"string\") {\n panel.textContent = content;\n } else {\n panel.appendChild(content);\n }\n\n document.body.appendChild(panel);\n this.panel = panel;\n const rect = cell.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const left = clamp(rect.left, 8, Math.max(8, window.innerWidth - panelRect.width - 8));\n let top = rect.bottom + 6;\n if (top + panelRect.height > window.innerHeight - 8) {\n top = Math.max(8, rect.top - panelRect.height - 6);\n }\n panel.style.left = `${left}px`;\n panel.style.top = `${top}px`;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { WatermarkConfig } from \"../types/options\";\n\ntype WatermarkContext = Pick<GridCore<any>, \"isDestroyed\" | \"options\" | \"skeleton\">;\n\nexport class WatermarkService {\n private overlay: HTMLElement | null = null;\n\n constructor(private core: WatermarkContext) {}\n\n init(): void {\n this.overlay = document.createElement(\"div\");\n this.overlay.className = \"mach-watermark\";\n this.overlay.setAttribute(\"aria-hidden\", \"true\");\n this.overlay.style.pointerEvents = \"none\";\n this.core.skeleton.root.appendChild(this.overlay);\n this.apply();\n }\n\n apply(): void {\n if (!this.overlay || this.core.isDestroyed()) return;\n const config = this.core.options.watermarkEnabled ? this.core.options.watermarkConfig : null;\n if (!config || !config.text) {\n this.overlay.style.display = \"none\";\n this.overlay.style.backgroundImage = \"\";\n return;\n }\n const url = this.buildTile(config);\n this.overlay.style.display = \"\";\n if (url) {\n this.overlay.style.backgroundImage = `url(${url})`;\n this.overlay.style.backgroundColor = \"\";\n } else {\n this.overlay.style.backgroundImage = \"\";\n }\n }\n\n private buildTile(config: WatermarkConfig): string | null {\n try {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n const fontSize = config.fontSize ?? 14;\n const gap = config.gap ?? 160;\n const angle = config.angle ?? -22;\n const color = config.color ?? (this.isDark() ? \"rgba(255,255,255,0.9)\" : \"rgba(31,55,88,0.9)\");\n const opacity = config.opacity ?? 0.06;\n\n ctx.font = `500 ${fontSize}px sans-serif`;\n const metrics = ctx.measureText(config.text);\n const textW = Math.ceil(metrics.width);\n\n const tile = Math.max(gap, textW + 40);\n canvas.width = tile;\n canvas.height = tile;\n\n const ctx2 = canvas.getContext(\"2d\")!;\n ctx2.clearRect(0, 0, tile, tile);\n ctx2.globalAlpha = opacity;\n ctx2.fillStyle = color;\n ctx2.font = `500 ${fontSize}px sans-serif`;\n ctx2.translate(tile / 2, tile / 2);\n ctx2.rotate((angle * Math.PI) / 180);\n ctx2.textAlign = \"center\";\n ctx2.textBaseline = \"middle\";\n ctx2.fillText(config.text, 0, 0);\n\n return canvas.toDataURL(\"image/png\");\n } catch {\n return null;\n }\n }\n\n private isDark(): boolean {\n return this.core.skeleton.root.classList.contains(\"mach-theme-dark\");\n }\n\n refresh(): void {\n this.apply();\n }\n\n destroy(): void {\n this.overlay?.remove();\n this.overlay = null;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\n\ntype UndoContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"columnModel\"\n | \"emit\"\n | \"options\"\n | \"rowModel\"\n | \"statusBarService\"\n | \"summaryRenderer\"\n | \"writeValue\"\n>;\n\nexport interface UndoEntry {\n nodeId: string;\n columnId: string;\n oldValue: any;\n newValue: any;\n}\n\nexport class UndoRedoService {\n private stack: UndoEntry[][] = [];\n private pointer = -1;\n private pending: UndoEntry[] | null = null;\n\n constructor(private core: UndoContext) {}\n\n beginBatch(): void {\n if (this.pending) return;\n this.pending = [];\n }\n\n endBatch(): void {\n if (!this.pending) return;\n const batch = this.pending;\n this.pending = null;\n if (batch.length > 0) this.push(batch);\n }\n\n cancelBatch(): void {\n this.pending = null;\n }\n\n record(entry: UndoEntry): void {\n if (this.pending) {\n this.pending.push(entry);\n return;\n }\n this.push([entry]);\n }\n\n private push(batch: UndoEntry[]): void {\n const maxSize = Math.max(0, this.core.options.undoStackSize);\n if (maxSize === 0) return;\n this.stack.length = this.pointer + 1;\n this.stack.push(batch);\n while (this.stack.length > maxSize) this.stack.shift();\n this.pointer = this.stack.length - 1;\n }\n\n trimToSize(): void {\n const maxSize = Math.max(0, this.core.options.undoStackSize);\n if (maxSize === 0) {\n this.clear();\n return;\n }\n while (this.stack.length > maxSize) {\n this.stack.shift();\n this.pointer--;\n }\n if (this.pointer < -1) this.pointer = -1;\n }\n\n canUndo(): boolean {\n return this.pointer >= 0;\n }\n\n canRedo(): boolean {\n return this.pointer < this.stack.length - 1;\n }\n\n undo(): boolean {\n if (!this.canUndo()) return false;\n this.apply(this.stack[this.pointer], false);\n this.pointer--;\n return true;\n }\n\n redo(): boolean {\n if (!this.canRedo()) return false;\n this.pointer++;\n this.apply(this.stack[this.pointer], true);\n return true;\n }\n\n private apply(batch: UndoEntry[], redo: boolean): void {\n const core = this.core;\n const refreshIndexes: number[] = [];\n for (const entry of batch) {\n const node = core.rowModel.getNodeById(entry.nodeId);\n const column = core.columnModel.getColumn(entry.columnId);\n if (!node || !column || node.data == null) continue;\n const value = redo ? entry.newValue : entry.oldValue;\n const replaced = redo ? entry.oldValue : entry.newValue;\n if (core.writeValue(node, column, value, replaced)) {\n core.bodyRenderer.invalidateRowHeight(node);\n core.bodyRenderer.queueFlash([node.rowIndex], [column.id]);\n if (node.rowIndex >= 0) refreshIndexes.push(node.rowIndex);\n core.emit(\"cellValueChanged\", {\n oldValue: replaced,\n newValue: value,\n rowNode: node,\n rowIndex: node.rowIndex,\n column,\n colDef: column.colDef,\n data: node.data\n });\n }\n }\n if (refreshIndexes.length > 0) core.bodyRenderer.refreshRows(refreshIndexes);\n core.summaryRenderer.refresh();\n core.statusBarService.refresh();\n }\n\n clear(): void {\n this.stack = [];\n this.pointer = -1;\n this.pending = null;\n }\n}\n","import type { ColDef } from \"./colDef\";\nimport type { FilterModel, SortModel } from \"./colDef\";\nimport type { RowNode } from \"./row\";\nimport type { GridApi } from \"./api\";\nimport type { Column } from \"../services/column\";\n\nexport const EVENT_TYPES = [\n \"gridReady\",\n \"gridDestroyed\",\n \"modelUpdated\",\n \"cellClicked\",\n \"cellDoubleClicked\",\n \"cellContextMenu\",\n \"rowClicked\",\n \"rowDoubleClicked\",\n \"selectionChanged\",\n \"sortChanged\",\n \"filterChanged\",\n \"columnResized\",\n \"columnMoved\",\n \"columnVisibilityChanged\",\n \"cellValueChanged\",\n \"cellEditingStarted\",\n \"cellEditingStopped\",\n \"detailToggled\",\n \"rowDragEnd\",\n \"rangeSelectionChanged\",\n \"paginationChanged\",\n \"displayedColumnsChanged\",\n \"gridError\"\n] as const;\n\nexport type GridEventType = (typeof EVENT_TYPES)[number];\n\nexport interface GridEventBase {\n type: GridEventType;\n api: GridApi<any>;\n}\n\nexport interface GridReadyEvent extends GridEventBase {\n type: \"gridReady\";\n}\n\nexport interface GridDestroyedEvent extends GridEventBase {\n type: \"gridDestroyed\";\n}\n\nexport interface ModelUpdatedEvent extends GridEventBase {\n type: \"modelUpdated\";\n rowCount: number;\n}\n\nexport interface CellClickEvent<TData = any, TValue = any> extends GridEventBase {\n type: \"cellClicked\";\n event: MouseEvent;\n rowNode: RowNode<TData>;\n rowIndex: number;\n column: Column<TData>;\n colDef: ColDef<TData, TValue>;\n value: TValue;\n}\n\nexport interface CellDoubleClickEvent<TData = any, TValue = any> extends GridEventBase {\n type: \"cellDoubleClicked\";\n event: MouseEvent;\n rowNode: RowNode<TData>;\n rowIndex: number;\n column: Column<TData>;\n colDef: ColDef<TData, TValue>;\n value: TValue;\n}\n\nexport interface CellContextMenuEvent<TData = any, TValue = any> extends GridEventBase {\n type: \"cellContextMenu\";\n event: MouseEvent;\n rowNode: RowNode<TData>;\n rowIndex: number;\n column: Column<TData>;\n colDef: ColDef<TData, TValue>;\n value: TValue;\n}\n\nexport interface RowClickEvent<TData = any> extends GridEventBase {\n type: \"rowClicked\" | \"rowDoubleClicked\";\n event: MouseEvent;\n rowNode: RowNode<TData>;\n rowIndex: number;\n}\n\nexport interface SelectionChangedEvent<TData = any> extends GridEventBase {\n type: \"selectionChanged\";\n selectedNodes: RowNode<TData>[];\n selectedRows: TData[];\n}\n\nexport interface SortChangedEvent extends GridEventBase {\n type: \"sortChanged\";\n sortModel: SortModel;\n}\n\nexport interface FilterChangedEvent extends GridEventBase {\n type: \"filterChanged\";\n filterModel: FilterModel;\n}\n\nexport interface ColumnResizedEvent extends GridEventBase {\n type: \"columnResized\";\n colId: string;\n width: number;\n finished: boolean;\n}\n\nexport interface ColumnMovedEvent extends GridEventBase {\n type: \"columnMoved\";\n colId: string;\n toIndex: number;\n}\n\nexport interface ColumnVisibilityChangedEvent extends GridEventBase {\n type: \"columnVisibilityChanged\";\n colId: string;\n visible: boolean;\n}\n\nexport interface CellValueChangedEvent<TData = any, TValue = any> extends GridEventBase {\n type: \"cellValueChanged\";\n oldValue: TValue;\n newValue: TValue;\n rowNode: RowNode<TData>;\n rowIndex: number;\n column: Column<TData>;\n colDef: ColDef<TData, TValue>;\n data: TData;\n}\n\nexport interface CellEditingStartedEvent<TData = any> extends GridEventBase {\n type: \"cellEditingStarted\";\n rowIndex: number;\n colId: string;\n rowNode: RowNode<TData>;\n}\n\nexport interface CellEditingStoppedEvent<TData = any> extends GridEventBase {\n type: \"cellEditingStopped\";\n rowIndex: number;\n colId: string;\n rowNode: RowNode<TData>;\n oldValue: any;\n newValue: any;\n}\n\nexport interface DetailToggledEvent<TData = any> extends GridEventBase {\n type: \"detailToggled\";\n rowId: string;\n rowNode: RowNode<TData>;\n expanded: boolean;\n}\n\nexport interface GridCellRange {\n row1: number;\n row2: number;\n colId1: string;\n colId2: string;\n}\n\nexport interface RangeSelectionChangedEvent extends GridEventBase {\n type: \"rangeSelectionChanged\";\n range: GridCellRange | null;\n}\n\nexport interface RowDragEndEvent<TData = any> extends GridEventBase {\n type: \"rowDragEnd\";\n rowNode: RowNode<TData>;\n fromIndex: number;\n toIndex: number;\n}\n\nexport interface PaginationChangedEvent extends GridEventBase {\n type: \"paginationChanged\";\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n\nexport interface DisplayedColumnsChangedEvent extends GridEventBase {\n type: \"displayedColumnsChanged\";\n}\n\nexport interface GridErrorEvent extends GridEventBase {\n type: \"gridError\";\n error: unknown;\n source: string;\n context?: Record<string, unknown>;\n}\n\nexport interface GridEventMap<TData = any> {\n gridReady: GridReadyEvent;\n gridDestroyed: GridDestroyedEvent;\n modelUpdated: ModelUpdatedEvent;\n cellClicked: CellClickEvent<TData>;\n cellDoubleClicked: CellDoubleClickEvent<TData>;\n cellContextMenu: CellContextMenuEvent<TData>;\n rowClicked: RowClickEvent<TData>;\n rowDoubleClicked: RowClickEvent<TData>;\n selectionChanged: SelectionChangedEvent<TData>;\n sortChanged: SortChangedEvent;\n filterChanged: FilterChangedEvent;\n columnResized: ColumnResizedEvent;\n columnMoved: ColumnMovedEvent;\n columnVisibilityChanged: ColumnVisibilityChangedEvent;\n cellValueChanged: CellValueChangedEvent<TData>;\n cellEditingStarted: CellEditingStartedEvent<TData>;\n cellEditingStopped: CellEditingStoppedEvent<TData>;\n detailToggled: DetailToggledEvent<TData>;\n rowDragEnd: RowDragEndEvent<TData>;\n rangeSelectionChanged: RangeSelectionChangedEvent;\n paginationChanged: PaginationChangedEvent;\n displayedColumnsChanged: DisplayedColumnsChangedEvent;\n gridError: GridErrorEvent;\n}\n\nexport type GridEventHandler<K extends GridEventType, TData = any> = (event: GridEventMap<TData>[K]) => void;\n\nexport type EventHandlerName<K extends GridEventType> = `on${Capitalize<K>}`;\n","export function escapeHtml(value: any): string {\n const s = value == null ? \"\" : String(value);\n return s\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nexport function downloadFile(filename: string, content: string, mime = \"text/plain;charset=utf-8\"): boolean {\n try {\n if (typeof document === \"undefined\" || typeof Blob === \"undefined\") return false;\n const a = document.createElement(\"a\");\n if (typeof URL !== \"undefined\" && typeof URL.createObjectURL === \"function\") {\n const blob = new Blob([content], { type: mime });\n const url = URL.createObjectURL(blob);\n a.href = url;\n a.download = filename;\n a.click();\n const revoke = typeof URL.revokeObjectURL === \"function\" ? URL.revokeObjectURL.bind(URL) : null;\n if (revoke) setTimeout(() => {\n try {\n revoke(url);\n } catch {\n void 0;\n }\n }, 0);\n } else {\n a.href = `data:${mime},${encodeURIComponent(content)}`;\n a.download = filename;\n a.click();\n }\n return true;\n } catch {\n return false;\n }\n}\n","const UNSAFE_PATH_SEGMENTS = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\n\nexport function isSafePath(path: string): boolean {\n if (typeof path !== \"string\" || path.length === 0) return false;\n const parts = path.split(\".\");\n return parts.every((part) => part.length > 0 && !UNSAFE_PATH_SEGMENTS.has(part));\n}\n\nexport function getByPath(obj: any, path: string): any {\n if (obj == null) return undefined;\n if (!isSafePath(path)) return undefined;\n const dot = path.indexOf(\".\");\n if (dot < 0) return obj[path];\n let cur = obj;\n let start = 0;\n while (start < path.length) {\n if (cur == null) return undefined;\n const idx = path.indexOf(\".\", start);\n if (idx < 0) {\n cur = cur[path.slice(start)];\n break;\n }\n cur = cur[path.slice(start, idx)];\n start = idx + 1;\n }\n return cur;\n}\n\nexport function setByPath(obj: any, path: string, value: any): boolean {\n if (obj == null || !isSafePath(path)) return false;\n const parts = path.split(\".\");\n let cur = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n if ((typeof cur !== \"object\" && typeof cur !== \"function\") || cur === null) return false;\n if (cur[parts[i]] == null) cur[parts[i]] = {};\n cur = cur[parts[i]];\n }\n if ((typeof cur !== \"object\" && typeof cur !== \"function\") || cur === null) return false;\n cur[parts[parts.length - 1]] = value;\n return true;\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { CsvExportParams, RowTransaction } from \"../types/api\";\nimport type { GridApi, } from \"../types/api\";\nimport type { GridOptions } from \"../types/options\";\nimport type { Column } from \"./column\";\nimport { EVENT_TYPES } from \"../types/events\";\nimport type { ColDefOrGroup, ColumnState, FilterModel, SortModel } from \"../types/colDef\";\nimport { DEFAULT_COL_DEF, GRID_SIZE_PRESETS } from \"../core/resolveOptions\";\nimport { buildCsv } from \"../lib/csv\";\nimport { parseCsv, toTsv } from \"../lib/clipboard\";\nimport { escapeHtml } from \"../lib/download\";\nimport { setByPath } from \"../lib/path\";\nimport { formatCellValue } from \"../render/cellContent\";\n\nexport class GridApiImpl<TData = any> implements GridApi<TData> {\n private measureCanvas: HTMLCanvasElement | null = null;\n\n constructor(private core: GridCore<TData>) {}\n\n setRowData(rows: TData[] | null | undefined): void {\n if (this.core.isDestroyed()) return;\n this.core.options.rowData = rows ?? [];\n if (this.core.rowModel.isInfinite) return;\n this.core.rowModel.setRowData(rows);\n this.core.bodyRenderer.onDataChanged();\n }\n\n applyTransaction(transaction: RowTransaction<TData>): void {\n if (this.core.isDestroyed() || this.core.rowModel.isInfinite) return;\n this.core.rowModel.applyTransaction(transaction);\n this.core.bodyRenderer.onDataChanged();\n }\n\n getColumnDefs(): ColDefOrGroup<TData>[] | null {\n return this.core.columnModel.getColumnDefs() as ColDefOrGroup<TData>[];\n }\n\n setColumnDefs(colDefs: ColDefOrGroup<TData>[] | null | undefined): void {\n if (this.core.isDestroyed()) return;\n this.core.options.columnDefs = colDefs ?? [];\n this.core.columnModel.setColumnDefs(colDefs);\n this.core.loadPersistedColumnState();\n this.core.onColumnsStructureChanged();\n if (this.core.rowModel.isInfinite) void this.core.rowModel.onServerParamsChanged();\n else {\n this.core.rowModel.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n }\n\n getColumnState(): ColumnState[] {\n return this.core.columnModel.getColumnState();\n }\n\n setColumnState(state: ColumnState[]): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.applyColumnState(state);\n this.core.onColumnsStructureChanged();\n this.core.applySortModel();\n this.core.persistColumnState();\n }\n\n resetColumnState(): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.resetColumnState();\n this.core.onColumnsStructureChanged();\n this.core.applySortModel();\n this.core.persistColumnState();\n }\n\n setColumnVisibility(colId: string, visible: boolean): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.setColumnVisibility(colId, visible);\n this.core.onColumnsStructureChanged();\n this.core.emit(\"columnVisibilityChanged\", { colId, visible });\n this.core.persistColumnState();\n }\n\n moveColumn(colId: string, toIndex: number): void {\n if (this.core.isDestroyed()) return;\n this.core.moveColumn(colId, toIndex);\n }\n\n setColumnPinned(colId: string, pinned: \"left\" | \"right\" | null): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.setColumnPinned(colId, pinned);\n this.core.onColumnsStructureChanged();\n this.core.persistColumnState();\n }\n\n sizeColumnsToFit(width?: number): void {\n if (this.core.isDestroyed()) return;\n const cols = this.core.columnModel.getOrderedVisible();\n if (cols.length === 0) return;\n const target = width ?? this.core.skeleton.measureViewportWidth();\n if (target <= 0) return;\n const total = cols.reduce((acc, c) => acc + c.currentWidth, 0);\n if (total <= 0) return;\n for (const col of cols) {\n this.core.columnModel.setColumnWidth(col, Math.max(30, Math.floor((col.currentWidth * target) / total)));\n }\n this.core.relayoutColumns();\n this.core.persistColumnState();\n }\n\n autoSizeColumn(colId: string, skipHeader = false): void {\n if (this.core.isDestroyed()) return;\n const column = this.core.columnModel.getColumn(colId);\n if (!column) return;\n\n if (this.autoSizeColumnInternal(column, skipHeader)) {\n this.core.relayoutColumns();\n this.core.persistColumnState();\n }\n }\n\n private autoSizeColumnInternal(\n column: Column<TData>,\n skipHeader: boolean\n ): boolean {\n\n if (column.hasCheckbox || column.isDetailToggle) {\n this.core.columnModel.setColumnWidth(column, column.isDetailToggle ? 38 : 46);\n return true;\n }\n\n this.measureCanvas ??= document.createElement(\"canvas\");\n const ctx = this.measureCanvas.getContext(\"2d\");\n if (!ctx) return false;\n const style = window.getComputedStyle(this.core.skeleton.root);\n ctx.font = `${style.fontStyle} ${style.fontWeight} ${style.fontSize} ${style.fontFamily}`;\n\n let maxWidth = 0;\n const consider = (text: string) => {\n if (!text) return;\n const w = ctx.measureText(text).width;\n if (w > maxWidth) maxWidth = w;\n };\n\n if (!skipHeader) {\n consider(column.colDef.headerName ?? column.colDef.field ?? column.id);\n }\n const nodes = this.core.rowModel.getAllNodes();\n const cap = Math.min(nodes.length, 2000);\n for (let i = 0; i < cap; i++) {\n consider(formatCellValue(this.core, nodes[i], column));\n }\n\n const extra = (column.sortable ? 20 : 0) + (column.filterable ? 28 : 0) + (this.core.options.columnMenu ? 22 : 0) + 28;\n this.core.columnModel.setColumnWidth(column, Math.ceil(maxWidth) + extra);\n return true;\n }\n\n autoSizeAllColumns(skipHeader?: boolean): void {\n if (this.core.isDestroyed()) return;\n let changed = false;\n for (const col of this.core.columnModel.getOrderedVisible()) {\n changed = this.autoSizeColumnInternal(col, skipHeader ?? false) || changed;\n }\n if (changed) {\n this.core.relayoutColumns();\n this.core.persistColumnState();\n }\n }\n\n getSortModel(): SortModel {\n return this.core.columnModel.getSortModel();\n }\n\n setSortModel(sortModel: SortModel | null): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.applySortModel(sortModel);\n this.core.applySortModel();\n }\n\n getFilterModel(): FilterModel {\n return this.core.rowModel.getFilterModel();\n }\n\n setFilterModel(filterModel: FilterModel | null): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.setFilterModel(filterModel);\n this.core.headerRenderer.refreshFilterIcons();\n this.core.emit(\"filterChanged\", { filterModel: this.core.rowModel.getFilterModel() });\n if (this.core.rowModel.isInfinite) {\n void this.core.rowModel.onServerParamsChanged();\n return;\n }\n this.core.rowModel.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n\n isColumnFilterPresent(colId: string): boolean {\n return Object.prototype.hasOwnProperty.call(this.core.rowModel.getFilterModel(), colId);\n }\n\n setQuickFilter(text: string | null | undefined): void {\n if (this.core.isDestroyed()) return;\n this.core.options.quickFilterText = text != null && text.trim() !== \"\" ? text : null;\n if (this.core.rowModel.setQuickFilter(text)) {\n this.core.applyQuickFilter();\n }\n }\n\n getQuickFilter(): string | null {\n return this.core.rowModel.getQuickFilter();\n }\n\n getRowSelection(): \"none\" | \"single\" | \"multiple\" {\n return this.core.options.rowSelection;\n }\n\n setRowSelection(mode: \"none\" | \"single\" | \"multiple\"): void {\n if (this.core.isDestroyed()) return;\n if (this.core.options.rowSelection === mode) return;\n this.core.options.rowSelection = mode;\n if (mode === \"none\") this.deselectAll();\n this.core.headerRenderer.build();\n this.core.bodyRenderer.rebuildPool();\n }\n\n getSelectedNodes() {\n return this.core.selectionService.getSelectedNodes();\n }\n\n getSelectedRows(): TData[] {\n return this.core.selectionService.getSelectedRows();\n }\n\n selectNodeById(nodeId: string, selected = true, clearOthers = true): void {\n this.core.selectionService.selectNodeById(nodeId, selected, clearOthers);\n }\n\n selectAll(filteredOnly = true): void {\n this.core.selectionService.selectAll(filteredOnly);\n }\n\n deselectAll(): void {\n this.core.selectionService.deselectAll();\n }\n\n getDisplayedRowCount(): number {\n return this.core.rowModel.getDisplayedRowCount();\n }\n\n getRowNode(rowIndex: number) {\n return this.core.rowModel.getDisplayedRow(rowIndex);\n }\n\n getNodeById(id: string) {\n return this.core.rowModel.getNodeById(id);\n }\n\n forEachNode(callback: (node: any, index: number) => void): void {\n this.core.rowModel.forEachNode(callback);\n }\n\n forEachNodeAfterFilterAndSort(callback: (node: any, index: number) => void): void {\n this.core.rowModel.forEachNodeAfterFilterAndSort(callback);\n }\n\n scrollToIndex(rowIndex: number, position: \"top\" | \"bottom\" | \"middle\" | \"nearest\" = \"top\"): void {\n this.core.bodyRenderer.scrollToIndex(rowIndex, position);\n }\n\n expandRow(rowId: string): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.expandRow(rowId);\n }\n\n collapseRow(rowId: string): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.collapseRow(rowId);\n }\n\n toggleDetailRow(rowId: string): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.toggleDetail(rowId);\n }\n\n isRowExpanded(rowId: string): boolean {\n return this.core.rowModel.isRowExpanded(rowId);\n }\n\n expandAllDetails(): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.expandAllDetails();\n }\n\n collapseAllDetails(): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.collapseAllDetails();\n }\n\n toggleRowGroup(groupId: string): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.toggleGroup(groupId);\n }\n\n reorderRows(fromIndex: number, toIndex: number): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.reorderRowsByDisplayed(fromIndex, toIndex);\n }\n\n isGroupExpanded(groupId: string): boolean {\n return this.core.rowModel.isGroupExpanded(groupId);\n }\n\n expandAllGroups(): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.expandAllGroups();\n }\n\n collapseAllGroups(): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.collapseAllGroups();\n }\n\n setSelection(rows: TData[], clearOthers = true): void {\n if (this.core.isDestroyed()) return;\n const getRowId = this.core.options.getRowId;\n const changes: { node: any; selected: boolean }[] = [];\n for (const row of rows) {\n const node = getRowId\n ? this.core.rowModel.getNodeById(\n this.core.rowModel.resolveRowId(row, -1, `__missing_selection_${this.core.nextId()}`)\n )\n : this.core.rowModel.getAllNodes().find((n) => n.data === row);\n if (node) changes.push({ node, selected: true });\n }\n if (changes.length > 0) {\n this.core.selectionService.applySelectionPublic(changes, clearOthers);\n } else if (clearOthers) {\n this.deselectAll();\n }\n }\n\n getVisibleSelection(): TData[] {\n const selectedIds = new Set(this.core.selectionService.getSelectedNodes().map((n) => n.id));\n return this.core.rowModel\n .getDisplayedRows()\n .filter((n) => !n.isDetail && !n.isGroup && selectedIds.has(n.id))\n .map((n) => n.data!)\n .filter(Boolean);\n }\n\n getSelectedIds(): string[] {\n return this.core.selectionService.getSelectedIds();\n }\n\n undo(): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.undoService.undo();\n }\n\n redo(): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.undoService.redo();\n }\n\n canUndo(): boolean {\n return this.core.undoService.canUndo();\n }\n\n canRedo(): boolean {\n return this.core.undoService.canRedo();\n }\n\n setPinnedTopRowData(rows: TData[] | null): void {\n if (this.core.isDestroyed()) return;\n this.core.options.pinnedTopRowData = rows ?? [];\n this.core.pinnedRowsRenderer.setTopData(this.core.options.pinnedTopRowData);\n }\n\n getPinnedTopRowData(): TData[] {\n return this.core.pinnedRowsRenderer.getTopData();\n }\n\n setPinnedBottomRowData(rows: TData[] | null): void {\n if (this.core.isDestroyed()) return;\n this.core.options.pinnedBottomRowData = rows ?? [];\n this.core.pinnedRowsRenderer.setBottomData(this.core.options.pinnedBottomRowData);\n }\n\n getPinnedBottomRowData(): TData[] {\n return this.core.pinnedRowsRenderer.getBottomData();\n }\n\n getRangeSelection(): import(\"../types/events\").GridCellRange | null {\n return this.core.bodyRenderer.getRangeSelection();\n }\n\n clearRangeSelection(): void {\n if (this.core.isDestroyed()) return;\n this.core.bodyRenderer.clearRangeSelection();\n }\n\n copyRangeToClipboard(): Promise<boolean> {\n if (this.core.isDestroyed()) return Promise.resolve(false);\n return this.core.copyActiveRange();\n }\n\n openColumnPanel(anchor?: HTMLElement): void {\n if (this.core.isDestroyed()) return;\n this.core.columnMenu.openStandalone(anchor);\n }\n\n refreshLayout(): void {\n if (this.core.isDestroyed()) return;\n this.core.relayout();\n this.core.bodyRenderer.syncScroll();\n }\n\n isInfinite(): boolean {\n return this.core.rowModel.isInfinite;\n }\n\n reload(): Promise<void> {\n if (this.core.isDestroyed()) return Promise.resolve();\n if (this.core.rowModel.isInfinite) {\n return this.core.rowModel.reloadInfinite();\n } else {\n this.core.rowModel.setRowData(this.core.options.rowData);\n this.core.bodyRenderer.onDataChanged();\n return Promise.resolve();\n }\n }\n\n paginationEnabled(): boolean {\n return this.core.rowModel.paginationActive;\n }\n\n setPaginationEnabled(enabled: boolean): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.setPaginationEnabled(enabled);\n }\n\n getPage(): number {\n return this.core.rowModel.getCurrentPage();\n }\n\n setPage(page: number): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.setPage(page);\n }\n\n getPageSize(): number {\n return this.core.options.paginationPageSize;\n }\n\n setPageSize(size: number): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.setPageSize(size);\n }\n\n getPageCount(): number {\n return this.core.rowModel.getPageCount();\n }\n\n getTotalRowCount(): number {\n return this.core.rowModel.getTotalRowCount();\n }\n\n importCsv(text: string, options: import(\"../types/api\").ImportCsvOptions = {}): boolean {\n if (this.core.isDestroyed() || !text) return false;\n const grid = parseCsv(text, options.separator ?? \",\");\n if (grid.length === 0) return false;\n const headerRow = grid[options.headerRowIndex ?? 0] ?? [];\n const body = grid.slice((options.headerRowIndex ?? 0) + 1).filter((r) => r.some((c) => c !== \"\"));\n const mode = options.mode ?? \"replace\";\n\n if (mode === \"paste\") {\n this.core.pasteText(toTsv(body, false), 0, 0);\n return true;\n }\n\n const cols = this.core.columnModel.getOrderedVisible().filter((c) => c.colDef.field);\n const byHeader = new Map<string, string>();\n for (const col of cols) {\n byHeader.set(String(col.colDef.headerName ?? col.colDef.field ?? col.id), col.colDef.field!);\n if (col.colDef.field) byHeader.set(col.colDef.field, col.colDef.field);\n }\n if (headerRow.length > 0) headerRow[0] = headerRow[0].replace(/^\\uFEFF/, \"\");\n let fieldOrder = headerRow\n .map((header, index) => ({ field: byHeader.get(String(header).trim()) ?? null, index }))\n .filter((entry): entry is { field: string; index: number } => entry.field != null);\n\n if (fieldOrder.length === 0) {\n fieldOrder = cols.map((col, index) => ({ field: col.colDef.field!, index }));\n }\n\n const records = body.map((row, rowIndex) => {\n const record: Record<string, any> = {};\n fieldOrder.forEach(({ field, index }) => {\n const raw = row[index];\n if (raw === undefined) return;\n let value: any;\n if (options.parseValue) {\n try {\n value = options.parseValue({ value: raw, field, rowIndex, columnIndex: index });\n } catch (error) {\n this.core.reportError(error, \"csv.parseValue\", { field, rowIndex, columnIndex: index });\n value = raw;\n }\n } else if (raw === \"\") {\n value = null;\n } else if (\n options.coerceNumbers !== false &&\n /^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/.test(raw) &&\n !/^[+-]?0\\d/.test(raw)\n ) {\n value = Number(raw);\n } else {\n value = raw;\n }\n if (!setByPath(record, field, value)) {\n this.core.reportError(new Error(`Unsafe CSV field: ${field}`), \"csv.import\", { field });\n }\n });\n return record;\n });\n\n if (mode === \"append\") {\n this.core.rowModel.applyTransaction({ add: records as unknown as TData[] });\n } else {\n this.core.rowModel.setRowData(records as unknown as TData[]);\n }\n this.core.bodyRenderer.onDataChanged();\n return true;\n }\n\n print(options: import(\"../types/api\").PrintOptions = {}): boolean {\n if (this.core.isDestroyed()) return false;\n try {\n const win = window.open(\"\", \"_blank\", \"width=980,height=720\");\n if (!win) return false;\n const cols = this.core.columnModel\n .getOrderedVisible()\n .filter((c) => !c.hasCheckbox && !c.isDetailToggle && !c.colDef.rowDrag);\n const nodes = this.core.rowModel.getPipelineRows().filter((n) => !n.isDetail && !n.isGroup);\n const includeHeader = options.includeHeader !== false;\n const headerCells = includeHeader\n ? `<tr>${cols.map((c) => `<th>${escapeHtml(c.colDef.headerName ?? c.colDef.field ?? c.id)}</th>`).join(\"\")}</tr>`\n : \"\";\n const bodyRows = nodes\n .map(\n (node) =>\n `<tr>${cols\n .map((c) => {\n const v = formatCellValue(this.core, node, c);\n return `<td>${escapeHtml(v)}</td>`;\n })\n .join(\"\")}</tr>`\n )\n .join(\"\");\n const html =\n `<!doctype html><html><head><meta charset=\"utf-8\"><title>${escapeHtml(options.title ?? \"MachTable\")}</title>` +\n `<style>body{font-family:system-ui,\"PingFang SC\",\"Microsoft YaHei\",sans-serif;padding:20px}` +\n `h3{margin:0 0 12px;font-size:16px}` +\n `table{border-collapse:collapse;width:100%;font-size:12px}` +\n `th,td{border:1px solid #bbb;padding:5px 8px;text-align:left;word-break:break-all}` +\n `th{background:#f2f5f9;font-weight:600}` +\n `@page{margin:12mm}</style></head><body>` +\n `<h3>${escapeHtml(options.title ?? \"\")}</h3><table>${headerCells}${bodyRows}</table>` +\n `</body></html>`;\n win.document.write(html);\n win.document.close();\n win.focus();\n win.print();\n return true;\n } catch {\n return false;\n }\n }\n\n startEditingCell(params: { rowIndex: number; colId: string; keyPress?: string }): boolean {\n const column = this.core.columnModel.getColumn(params.colId);\n if (!column) return false;\n return this.core.editingService.start(params.rowIndex, column, params.keyPress ?? null);\n }\n\n stopEditing(cancel?: boolean): void {\n this.core.editingService.stop(cancel ?? false);\n }\n\n refreshCells(): void {\n this.core.bodyRenderer.refreshAllCells();\n this.core.pinnedRowsRenderer.refresh();\n this.core.summaryRenderer.refresh();\n }\n\n updateOptions(options: Partial<GridOptions<TData>>): void {\n if (this.core.isDestroyed()) return;\n const resolved = this.core.options;\n let needsRelayout = false;\n let needsCellRefresh = false;\n let needsHeaderRebuild = false;\n let needsPoolRebuild = false;\n let needsSummaryRefresh = false;\n let needsColumnRebuild = false;\n let needsRowRebuild = false;\n let needsStateLoad = false;\n let datasourceChanged = false;\n const prevColumnMenu = resolved.columnMenu;\n const prevUndoSize = resolved.undoStackSize;\n\n for (const eventType of EVENT_TYPES) {\n const key = `on${eventType.charAt(0).toUpperCase()}${eventType.slice(1)}` as keyof GridOptions<TData>;\n if (Object.prototype.hasOwnProperty.call(options, key)) {\n Object.assign(resolved, { [key]: options[key] });\n }\n }\n\n if (options.rowHeight != null && Number.isFinite(options.rowHeight) && options.rowHeight > 0 && options.rowHeight !== resolved.rowHeight) {\n resolved.rowHeight = options.rowHeight;\n needsRelayout = true;\n }\n if (options.headerHeight != null && Number.isFinite(options.headerHeight) && options.headerHeight > 0 && options.headerHeight !== resolved.headerHeight) {\n resolved.headerHeight = options.headerHeight;\n needsRelayout = true;\n needsHeaderRebuild = true;\n }\n if (options.rowBuffer != null && Number.isFinite(options.rowBuffer) && options.rowBuffer >= 0 && options.rowBuffer !== resolved.rowBuffer) {\n resolved.rowBuffer = Math.floor(options.rowBuffer);\n needsRelayout = true;\n }\n if (options.multiSort != null) resolved.multiSort = options.multiSort;\n if (options.detailRowHeight != null && Number.isFinite(options.detailRowHeight) && options.detailRowHeight > 0 && options.detailRowHeight !== resolved.detailRowHeight) {\n resolved.detailRowHeight = options.detailRowHeight;\n this.core.bodyRenderer.applyContainerSizes();\n this.core.bodyRenderer.updateRange(true);\n }\n if (options.singleClickEdit != null) resolved.singleClickEdit = options.singleClickEdit;\n if (options.manualSorting != null) resolved.manualSorting = options.manualSorting;\n if (options.manualFiltering != null) resolved.manualFiltering = options.manualFiltering;\n if (options.locale != null && options.locale !== resolved.locale) {\n resolved.locale = options.locale;\n needsHeaderRebuild = true;\n needsCellRefresh = true;\n this.core.paginationBar.rebuild();\n this.core.statusBarService.rebuild();\n }\n if (options.indexOffset != null && options.indexOffset !== resolved.indexOffset) {\n resolved.indexOffset = options.indexOffset;\n needsCellRefresh = true;\n }\n if (options.showSummary != null && options.showSummary !== resolved.showSummary) {\n resolved.showSummary = options.showSummary;\n needsSummaryRefresh = true;\n needsRelayout = true;\n }\n if (options.undoStackSize != null && Number.isFinite(options.undoStackSize) && options.undoStackSize >= 0 && options.undoStackSize !== prevUndoSize) {\n resolved.undoStackSize = Math.floor(options.undoStackSize);\n this.core.undoService.trimToSize();\n }\n if (Object.prototype.hasOwnProperty.call(options, \"getRowHeight\")) {\n const changed = resolved.getRowHeight !== options.getRowHeight;\n resolved.getRowHeight = options.getRowHeight;\n if (changed) this.core.bodyRenderer.invalidateAllRowHeights();\n needsRelayout = true;\n }\n if (options.enableRangeSelection != null) {\n resolved.enableRangeSelection = options.enableRangeSelection;\n if (!options.enableRangeSelection) this.clearRangeSelection();\n }\n if (Object.prototype.hasOwnProperty.call(options, \"tooltipComponent\")) resolved.tooltipComponent = options.tooltipComponent;\n if (options.tooltipShowDelay != null && Number.isFinite(options.tooltipShowDelay) && options.tooltipShowDelay >= 0) {\n resolved.tooltipShowDelay = options.tooltipShowDelay;\n }\n if (options.flashCells != null) resolved.flashCells = options.flashCells;\n if (Object.prototype.hasOwnProperty.call(options, \"getContextMenuItems\")) resolved.getContextMenuItems = options.getContextMenuItems;\n if (options.theme != null && options.theme !== resolved.theme) {\n resolved.theme = options.theme;\n this.core.skeleton.applyTheme(options.theme);\n this.core.watermarkService.refresh();\n }\n if (options.pagination !== undefined) {\n const cfg = options.pagination;\n const target = cfg !== false && resolved.datasource == null;\n if (target !== resolved.paginationEnabled) {\n this.core.rowModel.setPaginationEnabled(target);\n }\n if (typeof cfg === \"object\" && cfg) {\n if (cfg.pageSize != null) resolved.paginationPageSize = cfg.pageSize;\n if (cfg.pageSizeOptions != null) resolved.paginationPageSizeOptions = cfg.pageSizeOptions;\n if (cfg.showTotal != null) resolved.paginationShowTotal = cfg.showTotal;\n if (cfg.showPageSizeSelector != null) resolved.paginationShowSizeSelector = cfg.showPageSizeSelector;\n }\n if (resolved.paginationEnabled) {\n this.core.rowModel.onPaginationOptionsChanged();\n }\n this.core.paginationBar.rebuild();\n }\n if (options.watermark !== undefined) {\n resolved.watermarkEnabled = options.watermark != null && options.watermark !== false;\n resolved.watermarkConfig =\n options.watermark == null || options.watermark === false\n ? null\n : options.watermark === true\n ? { text: \"MachTable\" }\n : options.watermark;\n this.core.watermarkService.refresh();\n }\n if (options.suppressClipboard != null) resolved.suppressClipboard = options.suppressClipboard;\n if (options.contextMenu != null) resolved.contextMenu = options.contextMenu;\n if (options.columnMenu != null) resolved.columnMenu = options.columnMenu;\n if (options.fillHandle != null) resolved.fillHandle = options.fillHandle;\n if (options.statusBar !== undefined) {\n resolved.statusBarEnabled =\n options.statusBar === true || (typeof options.statusBar === \"object\" && options.statusBar != null);\n if (typeof options.statusBar === \"object\" && options.statusBar?.panels) {\n resolved.statusBarPanels = options.statusBar.panels;\n }\n this.core.statusBarService.rebuild();\n }\n if (Object.prototype.hasOwnProperty.call(options, \"summaryMethod\")) {\n resolved.summaryMethod = options.summaryMethod;\n needsSummaryRefresh = true;\n }\n if (options.size != null && Object.prototype.hasOwnProperty.call(GRID_SIZE_PRESETS, options.size) && options.size !== resolved.size) {\n const preset = GRID_SIZE_PRESETS[options.size];\n resolved.size = options.size;\n resolved.rowHeight = options.rowHeight ?? preset.rowHeight;\n resolved.headerHeight = options.headerHeight ?? preset.headerHeight;\n this.core.skeleton.applySize(options.size);\n needsRelayout = true;\n needsHeaderRebuild = true;\n }\n if (options.stripedRows != null && options.stripedRows !== resolved.stripedRows) {\n resolved.stripedRows = options.stripedRows;\n this.core.skeleton.setStriped(options.stripedRows);\n }\n if (options.showCellBorders != null && options.showCellBorders !== resolved.showCellBorders) {\n resolved.showCellBorders = options.showCellBorders;\n this.core.skeleton.setCellBorders(options.showCellBorders);\n }\n if (options.suppressCellFocus != null) resolved.suppressCellFocus = options.suppressCellFocus;\n if (options.suppressRowHoverHighlight != null) resolved.suppressRowHoverHighlight = options.suppressRowHoverHighlight;\n if (options.suppressNoRowsOverlay != null) resolved.suppressNoRowsOverlay = options.suppressNoRowsOverlay;\n if (options.suppressHeaderFocus != null && options.suppressHeaderFocus !== resolved.suppressHeaderFocus) {\n resolved.suppressHeaderFocus = options.suppressHeaderFocus;\n needsHeaderRebuild = true;\n }\n if (Object.prototype.hasOwnProperty.call(options, \"overlayNoRowsTemplate\")) {\n resolved.overlayNoRowsTemplate = options.overlayNoRowsTemplate ?? \"\";\n }\n if (Object.prototype.hasOwnProperty.call(options, \"overlayLoadingTemplate\")) {\n resolved.overlayLoadingTemplate = options.overlayLoadingTemplate ?? \"\";\n }\n if (options.allowUnsafeOverlayHtml != null) {\n resolved.allowUnsafeOverlayHtml = options.allowUnsafeOverlayHtml;\n }\n if (Object.prototype.hasOwnProperty.call(options, \"className\")) {\n resolved.className = options.className ?? \"\";\n this.core.skeleton.setCustomClass(resolved.className);\n }\n if (options.loading != null) resolved.loading = options.loading;\n if (options.rowSelection != null && options.rowSelection !== resolved.rowSelection) {\n resolved.rowSelection = options.rowSelection;\n if (options.rowSelection === \"none\") this.deselectAll();\n needsHeaderRebuild = true;\n needsPoolRebuild = true;\n }\n if (options.quickFilterText !== undefined) {\n this.setQuickFilter(options.quickFilterText);\n }\n if (options.defaultColDef !== undefined && options.defaultColDef !== resolved.defaultColDef) {\n resolved.defaultColDef = { ...DEFAULT_COL_DEF, ...options.defaultColDef };\n needsColumnRebuild = true;\n }\n if (Object.prototype.hasOwnProperty.call(options, \"getRowId\") && options.getRowId !== resolved.getRowId) {\n resolved.getRowId = options.getRowId;\n needsRowRebuild = true;\n }\n if (options.masterDetail != null && options.masterDetail !== resolved.masterDetail) {\n resolved.masterDetail = options.masterDetail;\n needsColumnRebuild = true;\n needsRowRebuild = true;\n }\n if (options.detailToggleColumn != null && options.detailToggleColumn !== resolved.detailToggleColumn) {\n resolved.detailToggleColumn = options.detailToggleColumn;\n needsColumnRebuild = true;\n }\n if (options.treeData != null && options.treeData !== resolved.treeData) {\n resolved.treeData = options.treeData;\n needsRowRebuild = true;\n needsColumnRebuild = true;\n }\n if (options.childrenKey != null && options.childrenKey !== resolved.childrenKey) {\n resolved.childrenKey = options.childrenKey;\n needsRowRebuild = true;\n }\n if (options.autoCheckedChildren != null) resolved.autoCheckedChildren = options.autoCheckedChildren;\n if (options.defaultExpandAll != null && options.defaultExpandAll !== resolved.defaultExpandAll) {\n resolved.defaultExpandAll = options.defaultExpandAll;\n needsRowRebuild = true;\n }\n if (options.applyRowDrag != null) resolved.applyRowDrag = options.applyRowDrag;\n if (options.suppressWarnings != null) resolved.suppressWarnings = options.suppressWarnings;\n if (Object.prototype.hasOwnProperty.call(options, \"aggFuncs\")) {\n resolved.aggFuncs = options.aggFuncs;\n needsRowRebuild = true;\n }\n if (Object.prototype.hasOwnProperty.call(options, \"components\")) {\n resolved.components = options.components;\n needsCellRefresh = true;\n }\n if (Object.prototype.hasOwnProperty.call(options, \"features\")) {\n resolved.features = Array.isArray(options.features) ? options.features : [];\n this.core.setFeatures(resolved.features);\n }\n if (Object.prototype.hasOwnProperty.call(options, \"columnStateStore\")) {\n resolved.columnStateStore = options.columnStateStore;\n needsStateLoad = true;\n }\n if (Object.prototype.hasOwnProperty.call(options, \"columnStateKey\")) {\n resolved.columnStateKey = options.columnStateKey ?? null;\n needsStateLoad = true;\n }\n if (options.blockSize != null && Number.isFinite(options.blockSize) && options.blockSize > 0) {\n resolved.blockSize = Math.floor(options.blockSize);\n }\n if (options.infiniteBufferRows != null && Number.isFinite(options.infiniteBufferRows) && options.infiniteBufferRows >= 0) {\n resolved.infiniteBufferRows = Math.floor(options.infiniteBufferRows);\n }\n if (Object.prototype.hasOwnProperty.call(options, \"datasource\") && options.datasource !== resolved.datasource) {\n resolved.datasource = options.datasource;\n resolved.paginationEnabled = options.datasource == null && resolved.paginationEnabled;\n datasourceChanged = true;\n this.core.paginationBar.rebuild();\n }\n if (Object.prototype.hasOwnProperty.call(options, \"detailRowRenderer\")) {\n resolved.detailRowRenderer = options.detailRowRenderer;\n needsCellRefresh = true;\n }\n if (Object.prototype.hasOwnProperty.call(options, \"isRowExpandable\")) {\n resolved.isRowExpandable = options.isRowExpandable;\n needsCellRefresh = true;\n }\n if (options.pinnedTopRowData !== undefined) {\n resolved.pinnedTopRowData = options.pinnedTopRowData ?? [];\n this.core.pinnedRowsRenderer.setTopData(resolved.pinnedTopRowData);\n }\n if (options.pinnedBottomRowData !== undefined) {\n resolved.pinnedBottomRowData = options.pinnedBottomRowData ?? [];\n this.core.pinnedRowsRenderer.setBottomData(resolved.pinnedBottomRowData);\n }\n\n if (needsColumnRebuild) {\n this.core.columnModel.setColumnDefs(resolved.columnDefs);\n this.core.onColumnsStructureChanged();\n needsHeaderRebuild = false;\n needsPoolRebuild = false;\n }\n if (needsStateLoad) {\n this.core.loadPersistedColumnState();\n this.core.onColumnsStructureChanged();\n }\n if (datasourceChanged) {\n void this.core.rowModel.onDatasourceChanged();\n } else if (needsRowRebuild) {\n if (this.core.rowModel.isInfinite) void this.core.rowModel.onServerParamsChanged();\n else {\n this.core.rowModel.setRowData(resolved.rowData);\n this.core.bodyRenderer.onDataChanged();\n }\n }\n\n if (needsRelayout) {\n this.core.skeleton.updateHeights(resolved.rowHeight, resolved.headerHeight);\n this.core.relayout();\n this.core.relayoutColumns(false);\n }\n if (options.columnMenu != null && options.columnMenu !== prevColumnMenu) {\n needsHeaderRebuild = true;\n }\n if (needsHeaderRebuild) this.core.headerRenderer.build();\n if (needsPoolRebuild) this.core.bodyRenderer.rebuildPool();\n else if (needsCellRefresh) this.refreshCells();\n if (needsSummaryRefresh) this.core.summaryRenderer.refresh();\n this.core.bodyRenderer.refreshOverlays();\n }\n\n getDataAsCsv(params: CsvExportParams = {}): string {\n const cols = this.core.columnModel.getOrderedVisible().filter((c) => !c.hasCheckbox && !c.isDetailToggle);\n if (params.headersOnly) {\n return buildCsv(\n {\n getHeaderLabels: () => cols.map((c) => c.colDef.headerName ?? c.colDef.field ?? c.id),\n getRowValues: () => []\n },\n params\n );\n }\n const nodes = params.onlySelected\n ? this.core.selectionService.getSelectedNodes().slice().sort((a, b) => a.rowIndex - b.rowIndex)\n : params.onlyAllDisplayed\n ? this.core.rowModel.getDisplayedRows().filter((n) => !n.isDetail && !n.isGroup)\n : this.core.rowModel.getPipelineRows().filter((n) => !n.isDetail && !n.isGroup);\n\n return buildCsv({\n getHeaderLabels: () => cols.map((c) => c.colDef.headerName ?? c.colDef.field ?? c.id),\n getRowValues: () =>\n nodes.map((node) =>\n cols.map((c) => {\n const v = this.core.getCellValue(node, c);\n if (typeof v === \"number\") return v;\n return formatCellValue(this.core, node, c);\n })\n )\n }, params);\n }\n\n setOverlay(type: \"loading\" | \"noRows\" | null): void {\n if (type === \"loading\") {\n this.core.skeleton.showOverlay(\n \"loading\",\n this.core.options.overlayLoadingTemplate,\n this.core.options.allowUnsafeOverlayHtml\n );\n } else if (type === \"noRows\") {\n const content = this.core.options.overlayNoRowsTemplate || this.core.buildDefaultEmptyState();\n this.core.skeleton.showOverlay(\"noRows\", content, this.core.options.allowUnsafeOverlayHtml);\n } else {\n this.core.skeleton.hideOverlay();\n }\n }\n\n hideOverlays(): void {\n this.core.skeleton.hideOverlay();\n }\n\n addEventListener<K extends import(\"../types/events\").GridEventType>(\n eventType: K,\n listener: (event: any) => void\n ): () => void {\n return this.core.eventBus.on(eventType, listener);\n }\n\n removeEventListener<K extends import(\"../types/events\").GridEventType>(\n eventType: K,\n listener: (event: any) => void\n ): void {\n this.core.eventBus.off(eventType, listener);\n }\n\n destroy(): void {\n this.core.destroy();\n }\n\n isDestroyed(): boolean {\n return this.core.isDestroyed();\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { GridSize, OverlayTemplate, ResolvedGridOptions, ThemeMode } from \"../types/options\";\nimport type { PaneType } from \"../services/columnModel\";\nimport { el } from \"../lib/dom\";\n\nconst SIZE_CLASSES: GridSize[] = [\"compact\", \"normal\", \"large\"];\ntype SkeletonContext = Pick<GridCore<any>, \"options\" | \"relayout\" | \"reportError\">;\n\nexport class GridSkeleton {\n root!: HTMLElement;\n headerEl!: HTMLElement;\n bodyEl!: HTMLElement;\n pinnedTopEl!: HTMLElement;\n pinnedBottomEl!: HTMLElement;\n headerRows: Record<PaneType, HTMLElement[]> = { left: [], center: [], right: [] };\n headerRowContainers: Record<PaneType, HTMLElement> = {} as Record<PaneType, HTMLElement>;\n bodyViewports!: Record<PaneType, HTMLElement>;\n rowContainers!: Record<PaneType, HTMLElement>;\n\n private headerPanes!: Record<PaneType, HTMLElement>;\n private bodyPanes!: Record<PaneType, HTMLElement>;\n private overlayWrapper!: HTMLElement;\n private overlayContent!: HTMLElement;\n private infiniteLoadingEl!: HTMLElement;\n private infiniteLoadingText!: HTMLElement;\n private currentOverlay: \"loading\" | \"noRows\" | null = null;\n private currentOverlayContent: OverlayTemplate | null = null;\n private currentOverlayAllowsHtml = false;\n private customClassTokens: string[] = [];\n private resizeObserver: ResizeObserver | null = null;\n private headerDepth = 1;\n\n constructor(private core: SkeletonContext) {}\n\n init(container: HTMLElement, options: ResolvedGridOptions): void {\n const classes = [\"mach-root\", `mach-size--${options.size}`];\n if (options.stripedRows) classes.push(\"mach-striped\");\n if (options.showCellBorders) classes.push(\"mach-cell-borders\");\n this.root = el(\"div\", classes.join(\" \"));\n this.setCustomClass(options.className);\n this.root.style.setProperty(\"--mach-row-h\", `${options.rowHeight}px`);\n this.root.style.setProperty(\"--mach-header-h\", `${options.headerHeight}px`);\n this.root.setAttribute(\"role\", \"grid\");\n this.root.tabIndex = 0;\n\n this.headerEl = el(\"div\", \"mach-header\");\n this.headerEl.setAttribute(\"role\", \"rowgroup\");\n this.headerRows = { left: [], center: [], right: [] };\n this.headerPanes = {} as Record<PaneType, HTMLElement>;\n this.headerRowContainers = {} as Record<PaneType, HTMLElement>;\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const paneEl = el(\"div\", `mach-pane mach-pane--${pane} mach-header-pane`);\n const rowsContainer = el(\"div\", \"mach-header-rows\");\n if (pane === \"center\") {\n const viewport = el(\"div\", \"mach-header-viewport\");\n viewport.appendChild(rowsContainer);\n paneEl.appendChild(viewport);\n } else {\n paneEl.appendChild(rowsContainer);\n }\n this.headerEl.appendChild(paneEl);\n this.headerPanes[pane] = paneEl;\n this.headerRowContainers[pane] = rowsContainer;\n }\n\n this.setHeaderRowCount(1);\n\n this.bodyEl = el(\"div\", \"mach-body\");\n this.pinnedTopEl = el(\"div\", \"mach-pinned-rows mach-pinned-rows--top\");\n this.pinnedTopEl.style.display = \"none\";\n this.pinnedBottomEl = el(\"div\", \"mach-pinned-rows mach-pinned-rows--bottom\");\n this.pinnedBottomEl.style.display = \"none\";\n this.bodyViewports = {} as Record<PaneType, HTMLElement>;\n this.rowContainers = {} as Record<PaneType, HTMLElement>;\n this.bodyPanes = {} as Record<PaneType, HTMLElement>;\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const paneEl = el(\"div\", `mach-pane mach-pane--${pane} mach-body-pane`);\n const viewport = el(\"div\", `mach-body-viewport${pane === \"center\" ? \" mach-body-viewport--scroll\" : \"\"}`);\n const container = el(\"div\", \"mach-row-container\");\n viewport.appendChild(container);\n paneEl.appendChild(viewport);\n this.bodyEl.appendChild(paneEl);\n this.bodyPanes[pane] = paneEl;\n this.bodyViewports[pane] = viewport;\n this.rowContainers[pane] = container;\n }\n\n this.overlayWrapper = el(\"div\", \"mach-overlay\");\n this.overlayWrapper.style.display = \"none\";\n this.overlayWrapper.setAttribute(\"role\", \"status\");\n this.overlayWrapper.setAttribute(\"aria-live\", \"polite\");\n this.overlayContent = el(\"div\", \"mach-overlay-content\");\n this.overlayWrapper.appendChild(this.overlayContent);\n\n this.infiniteLoadingEl = el(\"div\", \"mach-infinite-loading\");\n this.infiniteLoadingEl.style.display = \"none\";\n this.infiniteLoadingEl.appendChild(el(\"div\", \"mach-spinner\"));\n this.infiniteLoadingText = el(\"span\");\n this.infiniteLoadingEl.appendChild(this.infiniteLoadingText);\n\n this.root.append(\n this.headerEl,\n this.pinnedTopEl,\n this.bodyEl,\n this.pinnedBottomEl,\n this.overlayWrapper,\n this.infiniteLoadingEl\n );\n container.appendChild(this.root);\n\n if (typeof ResizeObserver !== \"undefined\") {\n this.resizeObserver = new ResizeObserver(() => this.core.relayout());\n this.resizeObserver.observe(this.root);\n }\n\n this.applyTheme(options.theme);\n }\n\n setHeaderRowCount(depth: number): void {\n this.headerDepth = depth;\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const container = this.headerRowContainers[pane];\n const rows = this.headerRows[pane];\n while (rows.length < depth) {\n const row = el(\"div\", \"mach-header-row\");\n row.setAttribute(\"role\", \"row\");\n row.setAttribute(\"aria-rowindex\", String(rows.length + 1));\n row.style.top = `${rows.length * this.core.options.headerHeight}px`;\n row.style.height = `${this.core.options.headerHeight}px`;\n container.appendChild(row);\n rows.push(row);\n }\n while (rows.length > depth) {\n rows.pop()!.remove();\n }\n }\n this.applyHeaderHeight();\n }\n\n private applyHeaderHeight(): void {\n this.headerEl.style.height = `${this.headerDepth * this.core.options.headerHeight}px`;\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const rows = this.headerRows[pane];\n rows.forEach((row, i) => {\n row.style.top = `${i * this.core.options.headerHeight}px`;\n row.style.height = `${this.core.options.headerHeight}px`;\n });\n }\n }\n\n setPaneWidths(left: number, right: number): void {\n this.applyPaneWidth(\"left\", left);\n this.applyPaneWidth(\"right\", right);\n }\n\n private applyPaneWidth(pane: PaneType, width: number): void {\n const hp = this.headerPanes[pane];\n const bp = this.bodyPanes[pane];\n hp.style.width = `${width}px`;\n bp.style.width = `${width}px`;\n const hidden = width <= 0;\n hp.classList.toggle(\"mach-pane--hidden\", hidden);\n bp.classList.toggle(\"mach-pane--hidden\", hidden);\n }\n\n measureViewportWidth(): number {\n return this.bodyViewports.center.clientWidth;\n }\n\n updateHeights(rowHeight: number, headerHeight: number): void {\n this.root.style.setProperty(\"--mach-row-h\", `${rowHeight}px`);\n this.root.style.setProperty(\"--mach-header-h\", `${headerHeight}px`);\n this.applyHeaderHeight();\n }\n\n applySize(size: GridSize): void {\n for (const s of SIZE_CLASSES) {\n this.root.classList.toggle(`mach-size--${s}`, s === size);\n }\n }\n\n private themeUnsub: (() => void) | null = null;\n\n applyTheme(theme: ThemeMode): void {\n if (!this.root) return;\n this.themeUnsub?.();\n this.themeUnsub = null;\n const dark = theme === \"dark\" || (theme === \"auto\" && this.systemPrefersDark());\n this.root.classList.toggle(\"mach-theme-dark\", dark);\n\n if (theme === \"auto\" && typeof window !== \"undefined\" && typeof window.matchMedia === \"function\") {\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handler = () => this.root.classList.toggle(\"mach-theme-dark\", mq.matches);\n if (typeof mq.addEventListener === \"function\") {\n mq.addEventListener(\"change\", handler);\n this.themeUnsub = () => mq.removeEventListener(\"change\", handler);\n } else if (typeof mq.addListener === \"function\") {\n mq.addListener(handler);\n this.themeUnsub = () => mq.removeListener(handler);\n }\n }\n }\n\n private systemPrefersDark(): boolean {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return false;\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n }\n\n setStriped(on: boolean): void {\n this.root.classList.toggle(\"mach-striped\", on);\n }\n\n setCellBorders(on: boolean): void {\n this.root.classList.toggle(\"mach-cell-borders\", on);\n }\n\n setCustomClass(className: string | null | undefined): void {\n for (const token of this.customClassTokens) this.root.classList.remove(token);\n this.customClassTokens = [];\n for (const token of String(className ?? \"\").split(/\\s+/).filter(Boolean)) {\n if (this.root.classList.contains(token)) continue;\n this.root.classList.add(token);\n this.customClassTokens.push(token);\n }\n }\n\n showOverlay(type: \"loading\" | \"noRows\", content: OverlayTemplate, allowUnsafeHtml = false): void {\n if (\n this.currentOverlay === type &&\n this.currentOverlayContent === content &&\n this.currentOverlayAllowsHtml === allowUnsafeHtml\n ) return;\n this.currentOverlay = type;\n this.currentOverlayContent = content;\n this.currentOverlayAllowsHtml = allowUnsafeHtml;\n this.overlayContent.replaceChildren();\n\n let resolved: string | HTMLElement;\n try {\n resolved = typeof content === \"function\" ? content() : content;\n } catch (error) {\n this.core.reportError(error, \"overlayTemplate\");\n resolved = \"\";\n }\n\n if (resolved instanceof HTMLElement) {\n this.overlayContent.appendChild(resolved);\n } else if (resolved && allowUnsafeHtml) {\n this.overlayContent.innerHTML = resolved;\n } else if (resolved) {\n this.overlayContent.textContent = resolved;\n } else if (type === \"loading\") {\n const spinner = el(\"div\", \"mach-spinner\");\n spinner.setAttribute(\"aria-label\", \"loading\");\n this.overlayContent.appendChild(spinner);\n }\n this.overlayWrapper.style.display = \"\";\n this.root.setAttribute(\"aria-busy\", type === \"loading\" ? \"true\" : \"false\");\n }\n\n hideOverlay(): void {\n if (!this.currentOverlay) return;\n this.currentOverlay = null;\n this.currentOverlayContent = null;\n this.currentOverlayAllowsHtml = false;\n this.overlayWrapper.style.display = \"none\";\n this.overlayContent.replaceChildren();\n this.root.setAttribute(\"aria-busy\", \"false\");\n }\n\n setInfiniteLoading(active: boolean, text: string): void {\n if (!this.infiniteLoadingEl) return;\n if (active) {\n if (this.infiniteLoadingText.textContent !== text) this.infiniteLoadingText.textContent = text;\n this.infiniteLoadingEl.style.display = \"\";\n this.root.setAttribute(\"aria-busy\", \"true\");\n } else {\n this.infiniteLoadingEl.style.display = \"none\";\n if (this.currentOverlay !== \"loading\") this.root.setAttribute(\"aria-busy\", \"false\");\n }\n }\n\n destroy(): void {\n this.themeUnsub?.();\n this.themeUnsub = null;\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.root.remove();\n }\n\n}\n","import type { ColumnFilter } from \"../types/colDef\";\n\nconst MATCH_LABELS: Record<string, string> = {\n contains: \"包含\",\n notContains: \"不包含\",\n equals: \"=\",\n notEquals: \"≠\",\n startsWith: \"开头\",\n endsWith: \"结尾\",\n blank: \"为空\",\n notBlank: \"非空\",\n lessThan: \"<\",\n lessThanOrEqual: \"≤\",\n greaterThan: \">\",\n greaterThanOrEqual: \"≥\",\n inRange: \"范围\"\n};\n\nexport function describeFilter(filter: ColumnFilter): string {\n if (!filter) return \"\";\n if (filter.type === \"set\") {\n const count = filter.values.length;\n return `已选 ${count} 项`;\n }\n const parts: string[] = [];\n for (const condition of filter.conditions) {\n const label = MATCH_LABELS[condition.match] ?? condition.match;\n const value = condition.value;\n const value2 = \"value2\" in condition ? condition.value2 : undefined;\n if (condition.match === \"blank\" || condition.match === \"notBlank\") {\n parts.push(label);\n } else if (condition.match === \"inRange\" && value != null) {\n parts.push(`${label} ${value}~${value2 ?? value}`);\n } else if (value != null && String(value) !== \"\") {\n parts.push(`${label} ${value}`);\n } else {\n parts.push(label);\n }\n }\n const operator = filter.operator === \"or\" ? \" 或 \" : \" 且 \";\n return parts.join(operator);\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"../services/column\";\nimport { ColumnGroup } from \"../services/columnGroup\";\nimport type { PaneType } from \"../services/columnModel\";\nimport { el, FILTER_ICON, SORT_ASC_ICON, SORT_DESC_ICON } from \"../lib/dom\";\nimport { describeFilter } from \"../lib/filterSummary\";\nimport { setHeaderDestroyer, takeHeaderDestroyer } from \"./runtimeState\";\n\ntype HeaderContext = Pick<\n GridCore<any>,\n | \"columnDragService\"\n | \"columnMenu\"\n | \"columnModel\"\n | \"cycleSort\"\n | \"emit\"\n | \"filterPopup\"\n | \"getApi\"\n | \"isDestroyed\"\n | \"moveColumn\"\n | \"options\"\n | \"relayoutColumns\"\n | \"reportError\"\n | \"resizeService\"\n | \"rowModel\"\n | \"selectionService\"\n | \"skeleton\"\n>;\n\ninterface HeaderCell {\n column: Column;\n el: HTMLElement;\n sortEl: HTMLElement;\n filterBtn?: HTMLButtonElement;\n filterTagEl?: HTMLElement;\n selectAllEl?: HTMLInputElement;\n}\n\ninterface GroupCell {\n group: ColumnGroup<any>;\n el: HTMLElement;\n}\n\ninterface PaneTree {\n column?: Column;\n group?: ColumnGroup<any>;\n level: number;\n children: PaneTree[];\n}\n\nexport class HeaderRenderer {\n private leafCells: HeaderCell[] = [];\n private groupCells: GroupCell[] = [];\n private paneTrees: Record<PaneType, PaneTree[]> = { left: [], center: [], right: [] };\n\n constructor(private core: HeaderContext) {}\n\n build(): void {\n for (const cell of this.leafCells) {\n const destroy = takeHeaderDestroyer(cell.el);\n if (destroy) {\n try {\n destroy();\n } catch (error) {\n this.core.reportError(error, \"headerComponent.destroy\", { colId: cell.column.id });\n }\n }\n }\n this.leafCells = [];\n this.groupCells = [];\n const depth = this.core.columnModel.getHeaderDepth();\n this.core.skeleton.setHeaderRowCount(depth);\n\n const paneOf = (col: Column): PaneType =>\n col.pinned === \"left\" ? \"left\" : col.pinned === \"right\" ? \"right\" : \"center\";\n\n const buildTree = (\n children: (ColumnGroup<any> | Column<any>)[],\n level: number,\n pane: PaneType\n ): PaneTree[] => {\n const out: PaneTree[] = [];\n for (const child of children) {\n if (child instanceof ColumnGroup) {\n const subtree = buildTree(child.children, level + 1, pane);\n if (subtree.length > 0) out.push({ group: child, level, children: subtree });\n } else {\n if (!child.hide && paneOf(child) === pane) {\n out.push({ column: child, level, children: [] });\n }\n }\n }\n return out;\n };\n\n const roots = this.core.columnModel.getRootChildren();\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n this.paneTrees[pane] = buildTree(roots, 0, pane);\n }\n\n const perRowHeight = this.core.options.headerHeight;\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const rows = this.core.skeleton.headerRows[pane];\n for (const row of rows) row.textContent = \"\";\n const appendCell = (tree: PaneTree) => {\n const row = rows[Math.min(tree.level, rows.length - 1)];\n if (tree.column) {\n const cell = this.createLeafCell(tree.column, depth - tree.level, perRowHeight);\n row.appendChild(cell.el);\n this.leafCells.push(cell);\n } else if (tree.group) {\n const cell = this.createGroupCell(tree.group);\n row.appendChild(cell);\n this.groupCells.push({ group: tree.group, el: cell });\n }\n for (const child of tree.children) appendCell(child);\n };\n for (const tree of this.paneTrees[pane]) appendCell(tree);\n }\n\n this.applyLayout();\n this.refreshSortIndicators();\n this.refreshFilterIcons();\n this.refreshSelectAllCheckbox();\n }\n\n private createLeafCell(column: Column, rowSpan: number, perRowHeight: number): HeaderCell {\n const colDef = column.colDef;\n const cellEl = el(\"div\", \"mach-header-cell mach-header-cell--leaf\");\n cellEl.dataset.colId = column.id;\n cellEl.setAttribute(\"role\", \"columnheader\");\n cellEl.style.height = `${rowSpan * perRowHeight}px`;\n\n if (typeof colDef.headerClass === \"string\") cellEl.classList.add(colDef.headerClass);\n else if (Array.isArray(colDef.headerClass)) cellEl.classList.add(...colDef.headerClass);\n if (colDef.headerTooltip) cellEl.setAttribute(\"title\", colDef.headerTooltip);\n\n const headerAlign = colDef.headerAlign ?? colDef.align;\n if (headerAlign === \"center\") cellEl.classList.add(\"mach-header-cell--center\");\n else if (headerAlign === \"right\") cellEl.classList.add(\"mach-header-cell--right\");\n\n if (!this.core.options.suppressHeaderFocus) {\n cellEl.tabIndex = 0;\n cellEl.addEventListener(\"mousedown\", () => cellEl.focus({ preventScroll: true }));\n cellEl.addEventListener(\"keydown\", (e: KeyboardEvent) => this.onHeaderKeyDown(e, column));\n }\n\n let selectAllEl: HTMLInputElement | undefined;\n if (column.hasCheckbox && this.core.options.rowSelection === \"multiple\") {\n selectAllEl = document.createElement(\"input\");\n selectAllEl.type = \"checkbox\";\n selectAllEl.className = \"mach-select-all\";\n selectAllEl.setAttribute(\"aria-label\", \"select all rows\");\n selectAllEl.addEventListener(\"click\", (e) => e.stopPropagation());\n selectAllEl.addEventListener(\"change\", () => {\n if (selectAllEl!.checked) this.core.selectionService.selectAll(true);\n else this.core.selectionService.deselectAll();\n });\n cellEl.appendChild(selectAllEl);\n }\n\n const headerComponent = colDef.headerComponent;\n if (headerComponent) {\n let out: string | HTMLElement | { el: HTMLElement; destroy?: () => void } | null | undefined;\n try {\n out = headerComponent({ colDef, column, api: this.core.getApi() });\n } catch (err) {\n this.core.reportError(err, \"headerComponent\", { colId: column.id });\n out = null;\n }\n if (typeof out === \"string\") {\n const labelEl = el(\"span\", \"mach-header-label\");\n labelEl.textContent = out;\n cellEl.appendChild(labelEl);\n } else if (out instanceof HTMLElement) {\n const wrapper = el(\"span\", \"mach-header-label mach-header-label--custom\");\n wrapper.appendChild(out);\n cellEl.appendChild(wrapper);\n } else if (out && typeof out === \"object\" && out.el instanceof HTMLElement) {\n const wrapper = el(\"span\", \"mach-header-label mach-header-label--custom\");\n wrapper.appendChild(out.el);\n cellEl.appendChild(wrapper);\n setHeaderDestroyer(cellEl, out.destroy);\n } else {\n const labelEl = el(\"span\", \"mach-header-label\");\n labelEl.textContent = colDef.headerName ?? colDef.field ?? column.id;\n cellEl.appendChild(labelEl);\n }\n } else {\n const labelEl = el(\"span\", \"mach-header-label\");\n labelEl.textContent = colDef.headerName ?? colDef.field ?? column.id;\n cellEl.appendChild(labelEl);\n }\n\n const sortEl = el(\"span\", \"mach-sort-indicator\");\n cellEl.appendChild(sortEl);\n\n let filterBtn: HTMLButtonElement | undefined;\n let filterTagEl: HTMLElement | undefined;\n if (column.filterable) {\n filterBtn = document.createElement(\"button\");\n filterBtn.type = \"button\";\n filterBtn.className = \"mach-filter-btn\";\n filterBtn.setAttribute(\"aria-label\", `filter ${column.id}`);\n filterBtn.innerHTML = FILTER_ICON;\n filterBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.core.filterPopup.toggle(column, filterBtn!);\n });\n cellEl.appendChild(filterBtn);\n filterTagEl = el(\"span\", \"mach-filter-tag\");\n cellEl.appendChild(filterTagEl);\n }\n\n if (this.core.options.columnMenu) {\n const menuBtn = document.createElement(\"button\");\n menuBtn.type = \"button\";\n menuBtn.className = \"mach-menu-btn\";\n menuBtn.setAttribute(\"aria-label\", \"column menu\");\n menuBtn.textContent = \"⋯\";\n menuBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.core.columnMenu.toggle(column, menuBtn);\n });\n cellEl.appendChild(menuBtn);\n }\n\n if (column.resizable) {\n const resizeEl = el(\"div\", \"mach-header-resize\");\n resizeEl.addEventListener(\"pointerdown\", (e) => {\n if (e.button !== 0) return;\n e.preventDefault();\n e.stopPropagation();\n this.core.resizeService.startResize(e, column);\n });\n resizeEl.addEventListener(\"dblclick\", (e) => {\n e.stopPropagation();\n this.core.getApi().autoSizeColumn(column.id);\n });\n resizeEl.addEventListener(\"click\", (e) => e.stopPropagation());\n cellEl.appendChild(resizeEl);\n }\n\n cellEl.addEventListener(\"click\", (e) => {\n if (this.core.columnDragService.didDrag()) return;\n const target = e.target as HTMLElement;\n if (target.closest(\".mach-header-resize, .mach-filter-btn, .mach-select-all\")) return;\n if (column.sortable) this.core.cycleSort(column, e.shiftKey);\n });\n\n cellEl.addEventListener(\"pointerdown\", (e) => {\n if (e.button !== 0) return;\n const target = e.target as HTMLElement;\n if (target.closest(\".mach-header-resize, .mach-filter-btn, .mach-select-all\")) return;\n this.core.columnDragService.onPointerDown(e, column);\n });\n\n return { column, el: cellEl, sortEl, filterBtn, filterTagEl, selectAllEl };\n }\n\n private createGroupCell(group: ColumnGroup<any>): HTMLElement {\n const cellEl = el(\"div\", \"mach-header-cell mach-header-cell--group\");\n if (group.groupId) cellEl.dataset.groupId = group.groupId;\n cellEl.setAttribute(\"role\", \"columnheader\");\n const def = group.def;\n if (typeof def.headerClass === \"string\") cellEl.classList.add(def.headerClass);\n else if (Array.isArray(def.headerClass)) cellEl.classList.add(...def.headerClass);\n const labelEl = el(\"span\", \"mach-header-label mach-header-label--group\");\n labelEl.textContent = group.headerName;\n cellEl.appendChild(labelEl);\n return cellEl;\n }\n\n applyLayout(): void {\n let flatIndex = 1;\n const widths: Record<PaneType, number> = { left: 0, center: 0, right: 0 };\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const rows = this.core.skeleton.headerRows[pane];\n let x = 0;\n const leafLefts = new Map<string, number>();\n for (const cell of this.leafCells) {\n if (this.core.columnModel.paneOf(cell.column) !== pane) continue;\n leafLefts.set(cell.column.id, x);\n x += cell.column.currentWidth;\n }\n const perRowHeight = this.core.options.headerHeight;\n for (const cell of this.leafCells) {\n if (this.core.columnModel.paneOf(cell.column) !== pane) continue;\n const left = leafLefts.get(cell.column.id) ?? 0;\n cell.el.style.width = `${cell.column.currentWidth}px`;\n cell.el.style.left = `${left}px`;\n cell.el.setAttribute(\"aria-colindex\", String(flatIndex++));\n }\n\n for (const gc of this.groupCells) {\n const leaves = this.visiblePaneLeaves(gc.group, pane);\n if (leaves.length === 0) continue;\n const left = leafLefts.get(leaves[0].id) ?? 0;\n let width = 0;\n for (const leaf of leaves) width += leaf.currentWidth;\n gc.el.style.left = `${left}px`;\n gc.el.style.width = `${width}px`;\n gc.el.style.height = `${perRowHeight}px`;\n gc.el.setAttribute(\"aria-colspan\", String(leaves.length));\n }\n\n for (const row of rows) row.style.width = `${x}px`;\n widths[pane] = x;\n }\n this.core.skeleton.setPaneWidths(widths.left, widths.right);\n }\n\n private visiblePaneLeaves(group: ColumnGroup<any>, pane: PaneType): Column[] {\n return group\n .getLeafColumns()\n .filter((c) => !c.hide && this.core.columnModel.paneOf(c) === pane);\n }\n\n private onHeaderKeyDown(e: KeyboardEvent, column: Column): void {\n if (this.core.isDestroyed()) return;\n const resize = (delta: number): void => {\n const next = Math.max(\n column.colDef.minWidth ?? 40,\n column.currentWidth + delta\n );\n this.core.columnModel.setColumnWidth(column, next);\n this.core.relayoutColumns();\n this.core.emit(\"columnResized\", { colId: column.id, width: column.currentWidth, finished: true });\n e.preventDefault();\n };\n\n switch (true) {\n case e.key === \"Enter\" || e.key === \" \":\n if ((e.target as HTMLElement).closest(\".mach-header-resize, .mach-filter-btn, .mach-select-all\")) return;\n e.preventDefault();\n if (column.sortable) this.core.cycleSort(column, e.shiftKey);\n return;\n case e.altKey && (e.key === \"ArrowRight\" || e.key === \"ArrowLeft\"):\n if (!column.resizable) return;\n resize(e.key === \"ArrowRight\" ? 24 : -24);\n return;\n case e.ctrlKey && (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\"):\n if (!column.movable) return;\n e.preventDefault(); {\n const pane = this.core.columnModel.paneOf(column);\n const siblings = this.core.columnModel.getPaneColumns(pane);\n const from = siblings.indexOf(column);\n const to = e.key === \"ArrowRight\" ? Math.min(siblings.length - 1, from + 1) : Math.max(0, from - 1);\n if (to !== from) this.core.moveColumn(column.id, to);\n }\n return;\n }\n }\n\n refreshSortIndicators(): void {\n const model = this.core.columnModel.getSortModel();\n const multi = model.length > 1;\n for (const hc of this.leafCells) {\n const idx = model.findIndex((s) => s.colId === hc.column.id);\n if (idx >= 0) {\n const dir = model[idx].direction;\n const badge = multi ? `<span class=\"mach-sort-badge\">${idx + 1}</span>` : \"\";\n hc.sortEl.innerHTML = (dir === \"asc\" ? SORT_ASC_ICON : SORT_DESC_ICON) + badge;\n hc.el.setAttribute(\"aria-sort\", dir === \"asc\" ? \"ascending\" : \"descending\");\n hc.el.classList.add(\"mach-header-cell--sorted\");\n } else {\n hc.sortEl.innerHTML = \"\";\n hc.el.removeAttribute(\"aria-sort\");\n hc.el.classList.remove(\"mach-header-cell--sorted\");\n }\n }\n }\n\n refreshFilterIcons(): void {\n const fm = this.core.rowModel.getFilterModel();\n for (const hc of this.leafCells) {\n if (!hc.filterBtn) continue;\n const filter = fm[hc.column.id];\n const active = filter != null;\n hc.filterBtn.classList.toggle(\"mach-filter-btn--active\", active);\n if (hc.filterTagEl) {\n const summary = active ? describeFilter(filter) : \"\";\n hc.filterTagEl.style.display = summary ? \"\" : \"none\";\n if (summary) hc.filterTagEl.textContent = summary;\n }\n }\n }\n\n refreshSelectAllCheckbox(): void {\n for (const hc of this.leafCells) {\n if (!hc.selectAllEl) continue;\n hc.selectAllEl.checked = this.core.selectionService.isSelectAllActive();\n hc.selectAllEl.indeterminate = this.core.selectionService.isSelectAllIndeterminate();\n }\n }\n\n destroy(): void {\n for (const cell of this.leafCells) {\n const destroy = takeHeaderDestroyer(cell.el);\n if (!destroy) continue;\n try {\n destroy();\n } catch (error) {\n console.error(\"[mach-table] headerComponent destroy error\", error);\n }\n }\n this.leafCells = [];\n this.groupCells = [];\n }\n}\n","export interface GridPoint {\n row: number;\n colIdx: number;\n}\n\nexport interface NormalizedRange {\n r1: number;\n c1: number;\n r2: number;\n c2: number;\n}\n\n/** Pure state model for range selection; DOM painting stays in BodyRenderer. */\nexport class RangeSelectionModel {\n private anchor: GridPoint | null = null;\n private end: GridPoint | null = null;\n private cache: NormalizedRange | null | false = false;\n private cacheRowCount = -1;\n private cacheColCount = -1;\n\n getAnchor(): GridPoint | null {\n return this.anchor;\n }\n\n getEnd(): GridPoint | null {\n return this.end;\n }\n\n hasAnchor(): boolean {\n return this.anchor != null;\n }\n\n start(point: GridPoint, extend: boolean): void {\n if (!extend || !this.anchor) this.anchor = { ...point };\n this.end = { ...point };\n this.invalidate();\n }\n\n ensureAnchor(point: GridPoint): boolean {\n if (this.anchor) return true;\n if (point.colIdx < 0) return false;\n this.anchor = { ...point };\n this.invalidate();\n return true;\n }\n\n setEnd(point: GridPoint): void {\n this.end = { ...point };\n this.invalidate();\n }\n\n clear(): void {\n this.anchor = null;\n this.end = null;\n this.invalidate();\n }\n\n invalidate(): void {\n this.cache = false;\n this.cacheRowCount = -1;\n this.cacheColCount = -1;\n }\n\n normalize(rowCount: number, colCount: number): NormalizedRange | null {\n if (\n this.cache !== false &&\n this.cacheRowCount === rowCount &&\n this.cacheColCount === colCount\n ) return this.cache;\n this.cacheRowCount = rowCount;\n this.cacheColCount = colCount;\n if (!this.anchor || !this.end || rowCount <= 0 || colCount <= 0) {\n this.cache = null;\n return null;\n }\n this.cache = {\n r1: Math.max(0, Math.min(this.anchor.row, this.end.row, rowCount - 1)),\n r2: Math.max(0, Math.min(Math.max(this.anchor.row, this.end.row), rowCount - 1)),\n c1: Math.max(0, Math.min(this.anchor.colIdx, this.end.colIdx, colCount - 1)),\n c2: Math.max(0, Math.min(Math.max(this.anchor.colIdx, this.end.colIdx), colCount - 1))\n };\n return this.cache;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport { el } from \"../lib/dom\";\nimport type { RowNode } from \"../types/row\";\n\ntype RowDragContext = Pick<GridCore<any>, \"emit\" | \"options\" | \"rowModel\" | \"skeleton\">;\n\ninterface RowDragState {\n node: RowNode<any>;\n startY: number;\n indicator: HTMLElement;\n targetIndex: number;\n active: boolean;\n}\n\n/** Owns row-drag global listeners, indicator DOM and completion semantics. */\nexport class RowDragController {\n private state: RowDragState | null = null;\n\n constructor(\n private core: RowDragContext,\n private getPositions: () => Float64Array\n ) {}\n\n start(event: PointerEvent, node: RowNode<any>): void {\n this.destroy();\n const indicator = el(\"div\", \"mach-row-drop-indicator\");\n this.core.skeleton.rowContainers.center.appendChild(indicator);\n this.state = {\n node,\n startY: event.clientY,\n indicator,\n targetIndex: -1,\n active: false\n };\n window.addEventListener(\"pointermove\", this.onMove);\n window.addEventListener(\"pointerup\", this.onUp);\n window.addEventListener(\"pointercancel\", this.onUp);\n }\n\n private onMove = (event: PointerEvent): void => {\n const drag = this.state;\n if (!drag) return;\n if (!drag.active) {\n if (Math.abs(event.clientY - drag.startY) < 5) return;\n drag.active = true;\n this.core.skeleton.root.classList.add(\"mach-root--row-dragging\");\n }\n\n const container = this.core.skeleton.rowContainers.center;\n const y = event.clientY - container.getBoundingClientRect().top;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const positions = this.getPositions();\n let targetIndex = rowCount;\n let indicatorY = positions[rowCount] ?? 0;\n for (let index = 0; index < rowCount; index++) {\n const node = this.core.rowModel.getDisplayedRow(index);\n if (!node || node.isDetail || node.isGroup) continue;\n const top = positions[index];\n const bottom = positions[index + 1];\n if (y < top + (bottom - top) / 2) {\n targetIndex = index;\n indicatorY = top;\n break;\n }\n }\n drag.targetIndex = targetIndex;\n drag.indicator.style.top = `${indicatorY}px`;\n };\n\n private onUp = (): void => {\n const drag = this.takeState();\n if (!drag || !drag.active || drag.targetIndex < 0) return;\n const from = drag.node.rowIndex;\n const to = Math.max(0, Math.min(drag.targetIndex, this.core.rowModel.getDisplayedRowCount()));\n if (from === to || from === to - 1) return;\n this.core.emit(\"rowDragEnd\", { rowNode: drag.node, fromIndex: from, toIndex: to });\n if (this.core.options.applyRowDrag && !this.core.rowModel.isTree) {\n this.core.rowModel.reorderRowsByDisplayed(from, to > from ? to - 1 : to);\n }\n };\n\n private takeState(): RowDragState | null {\n const drag = this.state;\n this.state = null;\n this.detachListeners();\n drag?.indicator.remove();\n return drag;\n }\n\n private detachListeners(): void {\n window.removeEventListener(\"pointermove\", this.onMove);\n window.removeEventListener(\"pointerup\", this.onUp);\n window.removeEventListener(\"pointercancel\", this.onUp);\n this.core.skeleton.root.classList.remove(\"mach-root--row-dragging\");\n }\n\n destroy(): void {\n this.takeState();\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { PaneType } from \"../services/columnModel\";\nimport type { Column } from \"../services/column\";\nimport type { RowNode } from \"../types/row\";\nimport { RangeSelectionModel, type NormalizedRange } from \"../services/rangeSelectionModel\";\nimport { RowDragController } from \"../services/rowDragController\";\nimport { el, clamp } from \"../lib/dom\";\nimport { renderCellContent, cleanupCellContent, applyCellClasses, applyCellStyle, formatCellValue, formatCellValueWith, defaultFormat } from \"./cellContent\";\nimport {\n getCellRuntimeState,\n setDetailDestroyer,\n takeDetailDestroyer\n} from \"./runtimeState\";\n\nconst PANES: PaneType[] = [\"left\", \"center\", \"right\"];\ntype BodyContext = Pick<\n GridCore<any>,\n | \"buildDefaultEmptyState\"\n | \"columnModel\"\n | \"contextMenuService\"\n | \"editingService\"\n | \"emit\"\n | \"getApi\"\n | \"getCellValue\"\n | \"gridId\"\n | \"isDestroyed\"\n | \"options\"\n | \"pinnedRowsRenderer\"\n | \"reportError\"\n | \"resolveCellRenderer\"\n | \"rowModel\"\n | \"selectionService\"\n | \"setCellValue\"\n | \"skeleton\"\n | \"summaryRenderer\"\n | \"toggleDetail\"\n | \"tooltipService\"\n | \"undoService\"\n>;\n\ninterface RowSlot {\n index: number;\n nodeId: string;\n kind: \"master\" | \"detail\";\n rows: Partial<Record<PaneType, HTMLElement>>;\n cells: Partial<Record<PaneType, HTMLElement[]>>;\n detailRow?: HTMLElement;\n}\n\nexport interface FocusedCell {\n rowIndex: number;\n colId: string;\n}\n\nfunction lowerBound(positions: Float64Array, y: number, count: number): number {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (positions[mid + 1] <= y) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\nexport class BodyRenderer {\n private pool: RowSlot[] = [];\n private poolSize = 0;\n private first = 0;\n private lastExcl = -1;\n private rafId = 0;\n private hoverIndex = -1;\n private positions = new Float64Array(1);\n private rangeSelection = new RangeSelectionModel();\n private rangeDragging = false;\n private colFirst = 0;\n private colLastExcl = Number.MAX_SAFE_INTEGER;\n focusedCell: FocusedCell | null = null;\n private rowDragController: RowDragController;\n\n constructor(private core: BodyContext) {\n this.rowDragController = new RowDragController(core, () => this.positions);\n }\n\n init(): void {\n const viewport = this.core.skeleton.bodyViewports.center;\n viewport.addEventListener(\"scroll\", this.onScroll, { passive: true });\n const body = this.core.skeleton.bodyEl;\n body.addEventListener(\"click\", this.onBodyClick);\n body.addEventListener(\"dblclick\", this.onBodyDblClick);\n body.addEventListener(\"contextmenu\", this.onContextMenu);\n body.addEventListener(\"mousedown\", this.onMouseDown);\n body.addEventListener(\"mouseover\", this.onMouseOver);\n body.addEventListener(\"mouseleave\", this.onMouseLeave);\n body.addEventListener(\"pointerdown\", this.onDragHandlePointerDown);\n window.addEventListener(\"mouseup\", this.onWindowMouseUp);\n }\n\n destroy(): void {\n cancelAnimationFrame(this.rafId);\n const viewport = this.core.skeleton.bodyViewports.center;\n viewport.removeEventListener(\"scroll\", this.onScroll);\n const body = this.core.skeleton.bodyEl;\n body.removeEventListener(\"click\", this.onBodyClick);\n body.removeEventListener(\"dblclick\", this.onBodyDblClick);\n body.removeEventListener(\"contextmenu\", this.onContextMenu);\n body.removeEventListener(\"mousedown\", this.onMouseDown);\n body.removeEventListener(\"mouseover\", this.onMouseOver);\n body.removeEventListener(\"mouseleave\", this.onMouseLeave);\n body.removeEventListener(\"pointerdown\", this.onDragHandlePointerDown);\n window.removeEventListener(\"mouseup\", this.onWindowMouseUp);\n this.cancelFillDrag();\n this.rowDragController.destroy();\n for (const slot of this.pool) {\n if (slot.detailRow) this.cleanupDetail(slot.detailRow);\n for (const pane of PANES) {\n for (const cell of slot.cells[pane] ?? []) cleanupCellContent(this.core, cell);\n }\n }\n this.fillHandleEl?.remove();\n this.fillDragIndicator?.remove();\n }\n\n paneForColumn(column: Column): PaneType {\n return column.pinned === \"left\" ? \"left\" : column.pinned === \"right\" ? \"right\" : \"center\";\n }\n\n private onScroll = (): void => {\n if (this.rafId) return;\n this.rafId = requestAnimationFrame(() => {\n this.rafId = 0;\n this.syncScroll();\n });\n };\n\n syncScroll(): void {\n if (this.core.isDestroyed()) return;\n const sk = this.core.skeleton;\n const viewport = sk.bodyViewports.center;\n sk.headerRowContainers.center.style.transform = `translateX(${-viewport.scrollLeft}px)`;\n sk.rowContainers.left.style.transform = `translateY(${-viewport.scrollTop}px)`;\n sk.rowContainers.right.style.transform = `translateY(${-viewport.scrollTop}px)`;\n this.core.pinnedRowsRenderer.onScrollLeft(viewport.scrollLeft);\n this.core.tooltipService.hide();\n this.updateRange();\n this.core.rowModel.checkInfiniteScroll(this.lastExcl - 1);\n }\n\n private paneWidths(): Record<PaneType, number> {\n const widths: Record<PaneType, number> = { left: 0, center: 0, right: 0 };\n for (const pane of PANES) {\n widths[pane] = this.core.columnModel.getPaneColumns(pane).reduce((a, c) => a + c.currentWidth, 0);\n }\n return widths;\n }\n\n private positionsBuf = new Float64Array(new ArrayBuffer(64 * 8));\n private lastMinRowHeight = 0;\n private rowHeightCache = new WeakMap<RowNode<any>, number>();\n private pendingFlash: Array<[number, string]> = [];\n private measureCanvas: HTMLCanvasElement | null = null;\n\n applyContainerSizes(): void {\n const sk = this.core.skeleton;\n const widths = this.paneWidths();\n const viewport = sk.bodyViewports.center;\n const displayed = this.core.rowModel.getDisplayedRows();\n const rowCount = this.core.rowModel.getDisplayTotalCount();\n const positionedCount = Math.min(rowCount, displayed.length);\n const rowHeight = this.core.options.rowHeight;\n const detailHeight = this.core.options.detailRowHeight;\n const getRowHeight = this.core.options.getRowHeight;\n const api = this.core.getApi();\n\n if (this.positionsBuf.length < positionedCount + 1) {\n let cap = this.positionsBuf.length;\n while (cap < positionedCount + 1) cap *= 2;\n this.positionsBuf = new Float64Array(new ArrayBuffer(cap * 8));\n }\n const positions = this.positionsBuf;\n const autoHeightCols = this.core.options.masterDetail ? [] : this.collectAutoHeightColumns();\n let y = 0;\n let minH = rowHeight;\n for (let i = 0; i < positionedCount; i++) {\n positions[i] = y;\n const node = i < displayed.length ? displayed[i] : undefined;\n let h: number;\n if (node?.isDetail) {\n h = detailHeight;\n } else if (node && (getRowHeight || autoHeightCols.length > 0)) {\n const cached = this.rowHeightCache.get(node);\n if (cached !== undefined) {\n h = cached;\n } else {\n h = rowHeight;\n if (getRowHeight) {\n try {\n const requested = getRowHeight({ data: node.data, node, api });\n h = Number.isFinite(requested) ? Math.max(1, requested || rowHeight) : rowHeight;\n } catch (error) {\n this.core.reportError(error, \"getRowHeight\", { rowId: node.id });\n }\n }\n if (autoHeightCols.length > 0) {\n const measured = this.measureAutoHeight(node, autoHeightCols);\n if (measured > h) h = measured;\n }\n this.rowHeightCache.set(node, h);\n }\n if (h < minH) minH = h;\n } else {\n h = rowHeight;\n }\n y += h;\n }\n positions[positionedCount] = y;\n const totalHeight = y + Math.max(0, rowCount - positionedCount) * rowHeight;\n this.lastMinRowHeight = minH;\n this.positions = positions.subarray(0, positionedCount + 1);\n\n const centerAvailable = Math.max(0, viewport.clientWidth - widths.left - widths.right);\n const centerWidth = Math.max(widths.center, centerAvailable);\n\n for (const pane of PANES) {\n const container = sk.rowContainers[pane];\n container.style.height = `${totalHeight}px`;\n if (pane === \"center\") container.style.width = `${centerWidth}px`;\n }\n\n sk.root.setAttribute(\"aria-rowcount\", String(rowCount + 1));\n }\n\n invalidateRowHeight(node: RowNode<any>): void {\n this.rowHeightCache.delete(node);\n }\n\n invalidateAllRowHeights(): void {\n this.rowHeightCache = new WeakMap();\n }\n\n private collectAutoHeightColumns(): Column[] {\n return this.core.columnModel.getOrderedVisible().filter((c) => c.colDef.autoHeight === true);\n }\n\n private get hasAnyAutoHeight(): boolean {\n return this.core.columnModel.getOrderedVisible().some((c) => c.colDef.autoHeight === true);\n }\n\n private measureAutoHeight(node: RowNode<any>, cols: Column[]): number {\n this.measureCanvas ??= document.createElement(\"canvas\");\n const ctx = this.measureCanvas.getContext(\"2d\");\n if (!ctx) return 0;\n const style = window.getComputedStyle(this.core.skeleton.root);\n const fontSize = parseFloat(style.fontSize) || 13;\n ctx.font = `${style.fontStyle} ${style.fontWeight} ${fontSize}px ${style.fontFamily}`;\n const padding = parseFloat(style.getPropertyValue(\"--mach-cell-padding\")) || 9;\n const lineHeight = Math.round(fontSize * 1.45);\n let maxLines = 1;\n\n for (const col of cols) {\n const text = formatCellValue(this.core, node, col);\n if (!text) continue;\n const availW = Math.max(10, col.currentWidth - padding * 2 - 2);\n let lines = 1;\n let w = 0;\n for (const ch of text) {\n const cw = ctx.measureText(ch).width;\n if (w > 0 && w + cw > availW) {\n lines++;\n w = cw;\n } else {\n w += cw;\n }\n if (lines >= 12) break;\n }\n if (lines > maxLines) maxLines = lines;\n }\n return maxLines * lineHeight + Math.round(padding * 0.9);\n }\n\n queueFlash(rowIndexes: number[], colIds: string[]): void {\n if (!this.core.options.flashCells) return;\n for (const rowIndex of rowIndexes) {\n for (const colId of colIds) this.pendingFlash.push([rowIndex, colId]);\n }\n }\n\n flushFlash(): void {\n if (this.pendingFlash.length === 0) return;\n const entries = this.pendingFlash;\n this.pendingFlash = [];\n for (const [rowIndex, colId] of entries) {\n const cell = this.getCellElement(rowIndex, colId);\n if (!cell) continue;\n cell.classList.remove(\"mach-cell--flash\");\n void cell.offsetWidth;\n cell.classList.add(\"mach-cell--flash\");\n const runtime = getCellRuntimeState(cell);\n const timer = runtime.flashTimer;\n if (timer) clearTimeout(timer);\n runtime.flashTimer = setTimeout(() => {\n cell.classList.remove(\"mach-cell--flash\");\n runtime.flashTimer = undefined;\n }, 800);\n }\n }\n\n relayout(): void {\n this.applyContainerSizes();\n const viewport = this.core.skeleton.bodyViewports.center;\n const rowHeight = this.core.options.rowHeight;\n let minRowHeight = rowHeight;\n if (this.core.options.masterDetail) {\n minRowHeight = Math.min(minRowHeight, this.core.options.detailRowHeight);\n }\n if (this.lastMinRowHeight > 0) {\n minRowHeight = Math.min(minRowHeight, this.lastMinRowHeight);\n }\n const visible = Math.ceil(viewport.clientHeight / Math.max(1, minRowHeight));\n const needed = visible + this.core.options.rowBuffer * 2 + 1;\n if (needed > this.poolSize) this.growPool(needed);\n this.applyCellLayout();\n this.updateRange(true);\n this.refreshOverlays();\n }\n\n private growPool(needed: number): void {\n while (this.poolSize < needed) {\n const slot: RowSlot = { index: -1, nodeId: \"\", kind: \"master\", rows: {}, cells: {} };\n const sk = this.core.skeleton;\n for (const pane of PANES) {\n const cols = this.core.columnModel.getPaneColumns(pane);\n if (cols.length === 0) continue;\n const row = el(\"div\", \"mach-row\");\n row.style.height = `${this.core.options.rowHeight}px`;\n row.setAttribute(\"role\", \"row\");\n row.style.display = \"none\";\n const cells: HTMLElement[] = [];\n for (const col of cols) {\n const cell = el(\"div\", \"mach-cell\");\n cell.dataset.colId = col.id;\n cell.setAttribute(\"role\", \"gridcell\");\n if (col.hasCheckbox) {\n const input = document.createElement(\"input\");\n input.type = this.core.options.rowSelection === \"single\" ? \"radio\" : \"checkbox\";\n input.className = \"mach-row-checkbox\";\n if (input.type === \"radio\") input.name = `mach-radio-${this.core.gridId}`;\n input.setAttribute(\"aria-label\", \"select row\");\n cell.appendChild(input);\n cell.classList.add(\"mach-cell--selection\");\n }\n row.appendChild(cell);\n cells.push(cell);\n }\n sk.rowContainers[pane].appendChild(row);\n slot.rows[pane] = row;\n slot.cells[pane] = cells;\n }\n if (this.core.options.masterDetail) {\n const detailRow = el(\"div\", \"mach-row mach-detail-row\");\n detailRow.style.height = `${this.core.options.detailRowHeight}px`;\n detailRow.setAttribute(\"role\", \"row\");\n detailRow.style.display = \"none\";\n sk.rowContainers.center.appendChild(detailRow);\n slot.detailRow = detailRow;\n }\n this.pool.push(slot);\n this.poolSize++;\n }\n }\n\n rebuildPool(): void {\n this.treeColumnCache = undefined;\n this.invalidateRangeCache();\n for (const slot of this.pool) {\n if (slot.detailRow) this.cleanupDetail(slot.detailRow);\n for (const pane of PANES) {\n for (const cell of slot.cells[pane] ?? []) cleanupCellContent(this.core, cell);\n slot.rows[pane]?.remove();\n }\n slot.detailRow?.remove();\n }\n this.pool = [];\n this.poolSize = 0;\n this.first = 0;\n this.lastExcl = -1;\n this.relayout();\n }\n\n applyCellLayout(): void {\n const variableHeights =\n this.core.options.masterDetail ||\n this.core.options.getRowHeight != null ||\n this.hasAnyAutoHeight;\n let globalColOffset = 0;\n for (const pane of PANES) {\n const cols = this.core.columnModel.getPaneColumns(pane);\n let x = 0;\n const lefts: number[] = [];\n for (const col of cols) {\n lefts.push(x);\n x += col.currentWidth;\n }\n for (const slot of this.pool) {\n const cells = slot.cells[pane];\n const row = slot.rows[pane];\n if (!cells || !row) continue;\n if (!variableHeights) {\n row.style.height = `${this.core.options.rowHeight}px`;\n }\n for (let i = 0; i < cols.length && i < cells.length; i++) {\n cells[i].style.width = `${cols[i].currentWidth}px`;\n cells[i].style.left = `${lefts[i]}px`;\n cells[i].setAttribute(\"aria-colindex\", String(globalColOffset + i + 1));\n }\n }\n if (this.core.options.masterDetail) {\n for (const slot of this.pool) {\n slot.detailRow?.style.setProperty(\"--mach-detail-h\", `${this.core.options.detailRowHeight}px`);\n }\n }\n globalColOffset += cols.length;\n }\n }\n\n private computeColWindow(): boolean {\n const viewport = this.core.skeleton.bodyViewports.center;\n const cols = this.core.columnModel.getPaneColumns(\"center\");\n const prevFirst = this.colFirst;\n const prevLast = this.colLastExcl;\n let first = 0;\n let last = cols.length;\n\n if (cols.length > 20) {\n const width = viewport.clientWidth;\n let total = 0;\n for (const col of cols) total += col.currentWidth;\n if (width > 0 && total > width) {\n const scrollLeft = viewport.scrollLeft;\n let x = 0;\n for (let i = 0; i < cols.length; i++) {\n if (x + cols[i].currentWidth <= scrollLeft) first = i + 1;\n else break;\n x += cols[i].currentWidth;\n }\n let acc = x;\n for (let i = first; i < cols.length; i++) {\n acc += cols[i].currentWidth;\n if (acc >= scrollLeft + width) {\n last = i + 1;\n break;\n }\n }\n if (last > cols.length) last = cols.length;\n first = Math.max(0, first - 2);\n last = Math.min(cols.length, last + 2);\n }\n }\n\n this.colFirst = first;\n this.colLastExcl = last;\n return first !== prevFirst || last !== prevLast;\n }\n\n updateRange(force = false): void {\n const viewport = this.core.skeleton.bodyViewports.center;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const buffer = this.core.options.rowBuffer;\n const colWindowChanged = this.computeColWindow();\n\n if (rowCount === 0) {\n for (const slot of this.pool) this.hideSlot(slot);\n this.first = 0;\n this.lastExcl = 0;\n return;\n }\n\n const scrollTop = viewport.scrollTop;\n const viewBottom = scrollTop + viewport.clientHeight;\n const firstVisible = lowerBound(this.positions, scrollTop, rowCount);\n let lastVisible = lowerBound(this.positions, viewBottom, rowCount) + 1;\n if (lastVisible > rowCount) lastVisible = rowCount;\n\n const first = clamp(firstVisible - buffer, 0, rowCount - 1);\n const lastExcl = clamp(lastVisible + buffer, 1, rowCount);\n\n if (!force && first === this.first && lastExcl === this.lastExcl) return;\n this.first = first;\n this.lastExcl = lastExcl;\n\n for (const slot of this.pool) {\n if (slot.index !== -1 && (slot.index < first || slot.index >= lastExcl)) {\n this.hideSlot(slot);\n }\n }\n\n for (let i = first; i < lastExcl; i++) {\n const node = this.core.rowModel.getDisplayedRow(i);\n const slot = this.pool[i % this.poolSize];\n if (!slot || !node) continue;\n if (!force && slot.index === i && slot.nodeId === node.id) {\n if (colWindowChanged && slot.kind === \"master\") {\n this.renderPaneCells(slot, node, \"center\");\n }\n continue;\n }\n this.assignSlot(slot, i);\n }\n }\n\n private hideSlot(slot: RowSlot): void {\n slot.index = -1;\n slot.nodeId = \"\";\n slot.kind = \"master\";\n for (const pane of PANES) {\n const row = slot.rows[pane];\n if (row) row.style.display = \"none\";\n }\n if (slot.detailRow) {\n this.cleanupDetail(slot.detailRow);\n slot.detailRow.style.display = \"none\";\n }\n }\n\n private assignSlot(slot: RowSlot, index: number): void {\n const node = this.core.rowModel.getDisplayedRow(index);\n if (!node) {\n this.hideSlot(slot);\n return;\n }\n slot.index = index;\n slot.nodeId = node.id;\n const y = this.positions[index];\n const h = this.positions[index + 1] - this.positions[index];\n\n if (node.isDetail) {\n slot.kind = \"detail\";\n for (const pane of PANES) {\n const row = slot.rows[pane];\n if (row) row.style.display = \"none\";\n }\n const detailRow = slot.detailRow;\n if (detailRow) {\n detailRow.style.display = \"\";\n detailRow.style.transform = `translateY(${y}px)`;\n detailRow.style.height = `${h}px`;\n detailRow.dataset.index = String(index);\n detailRow.setAttribute(\"aria-rowindex\", String(index + 2));\n this.renderDetailContent(detailRow, node);\n }\n return;\n }\n\n slot.kind = \"master\";\n if (slot.detailRow) slot.detailRow.style.display = \"none\";\n\n for (const pane of PANES) {\n const row = slot.rows[pane];\n if (!row) continue;\n row.style.display = \"\";\n row.style.transform = `translateY(${y}px)`;\n row.style.height = `${h}px`;\n row.dataset.index = String(index);\n row.dataset.id = node.id;\n row.setAttribute(\"aria-rowindex\", String(index + 2));\n row.classList.toggle(\"mach-row--selected\", node.selected);\n row.classList.toggle(\"mach-row--hover\", this.hoverIndex === index && !this.core.options.suppressRowHoverHighlight);\n row.classList.toggle(\"mach-row--odd\", index % 2 === 1);\n row.setAttribute(\"aria-selected\", node.selected ? \"true\" : \"false\");\n\n this.renderPaneCells(slot, node, pane);\n }\n\n if (this.focusedCell && this.focusedCell.rowIndex === index) {\n this.applyFocusClass();\n }\n }\n\n private renderPaneCells(slot: RowSlot, node: RowNode<any>, pane: PaneType): void {\n const cols = this.core.columnModel.getPaneColumns(pane);\n const cells = slot.cells[pane];\n if (!cells) return;\n const index = slot.index;\n const hasColSpan = pane === \"center\" && this.core.columnModel.hasColSpan();\n let coverage = 0;\n\n for (let i = 0; i < cols.length; i++) {\n const col = cols[i];\n const cell = cells[i];\n\n if (pane === \"center\") {\n const windowHidden = i < this.colFirst || i >= this.colLastExcl;\n if (windowHidden && !hasColSpan) {\n cleanupCellContent(this.core, cell);\n if (cell.style.display !== \"none\") cell.style.display = \"none\";\n continue;\n }\n }\n\n if (hasColSpan && coverage > 0) {\n coverage--;\n cleanupCellContent(this.core, cell);\n if (cell.style.display !== \"none\") cell.style.display = \"none\";\n continue;\n }\n\n if (cell.style.display === \"none\") cell.style.display = \"\";\n\n if (hasColSpan) {\n const span = this.resolveColSpan(node, col, index, cols.length - i);\n if (span > 1) {\n coverage = span - 1;\n this.applySpanWidth(cell, cols, i, span);\n } else if (cell.style.width !== `${col.currentWidth}px`) {\n cell.style.width = `${col.currentWidth}px`;\n }\n }\n\n if (this.core.editingService.isEditing(index, col.id)) continue;\n this.renderCell(cell, node, col);\n this.applyRangeClass(cell, index, col);\n }\n }\n\n private resolveColSpan(node: RowNode<any>, column: Column, rowIndex: number, remaining: number): number {\n const fn = column.colDef.colSpan;\n if (!fn) return 1;\n try {\n const span = fn({\n api: this.core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value: this.core.getCellValue(node, column),\n rowIndex\n });\n return Math.max(1, Math.min(Math.round(span) || 1, remaining));\n } catch (error) {\n this.core.reportError(error, \"colSpan\", { colId: column.id, rowId: node.id });\n return 1;\n }\n }\n\n private applySpanWidth(cell: HTMLElement, cols: Column[], start: number, span: number): void {\n let w = 0;\n for (let i = start; i < start + span && i < cols.length; i++) w += cols[i].currentWidth;\n cell.style.width = `${w}px`;\n }\n\n private renderDetailContent(row: HTMLElement, node: RowNode<any>): void {\n this.cleanupDetail(row);\n const master = node.masterId != null ? this.core.rowModel.getNodeById(node.masterId) : node;\n const container = el(\"div\", \"mach-detail\");\n row.appendChild(container);\n const renderer = this.core.options.detailRowRenderer;\n if (renderer) {\n const params = { data: node.data, node: master ?? node, api: this.core.getApi() };\n let out: string | HTMLElement | { el: HTMLElement; destroy?: () => void } | null | undefined;\n try {\n out = renderer(params);\n } catch (err) {\n this.core.reportError(err, \"detailRowRenderer\", { rowId: node.id });\n out = null;\n }\n if (typeof out === \"string\") {\n container.textContent = out;\n } else if (out instanceof HTMLElement) {\n container.appendChild(out);\n } else if (out && typeof out === \"object\" && out.el instanceof HTMLElement) {\n container.appendChild(out.el);\n setDetailDestroyer(row, out.destroy);\n }\n }\n }\n\n private cleanupDetail(row: HTMLElement): void {\n const destroy = takeDetailDestroyer(row);\n if (destroy) {\n try {\n destroy();\n } catch (err) {\n this.core.reportError(err, \"detailRowRenderer.destroy\");\n }\n }\n row.textContent = \"\";\n }\n\n private renderCell(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n cleanupCellContent(this.core, cell);\n if (node.isGroup) {\n this.renderGroupCell(cell, node, column);\n return;\n }\n if (column.isDetailToggle) {\n const expanded = this.core.rowModel.isRowExpanded(node.id);\n const toggle = el(\"span\", `mach-detail-toggle${expanded ? \" mach-detail-toggle--open\" : \"\"}`);\n toggle.textContent = \"▶\";\n cell.replaceChildren(toggle);\n cell.classList.add(\"mach-cell--detail-toggle\");\n this.resetSpanStyle(cell);\n return;\n }\n if (column.hasCheckbox) {\n const input = cell.querySelector<HTMLInputElement>(\".mach-row-checkbox\");\n if (input) {\n input.checked = node.selected;\n input.indeterminate = this.core.selectionService.isIndeterminate(node.id);\n input.disabled = !this.core.selectionService.isSelectable(node);\n }\n if (cell.className !== \"mach-cell mach-cell--selection\") cell.className = \"mach-cell mach-cell--selection\";\n this.resetSpanStyle(cell);\n return;\n }\n if (column.colDef.rowDrag) {\n const handle = el(\"span\", \"mach-row-drag-handle\");\n handle.textContent = \"⠿\";\n cell.replaceChildren(handle);\n if (cell.className !== \"mach-cell mach-cell--drag\") cell.className = \"mach-cell mach-cell--drag\";\n this.resetSpanStyle(cell);\n return;\n }\n if (column.colDef.type === \"index\" && !node.isDetail) {\n cell.textContent = String(this.core.rowModel.getRowSeq(node) + this.core.options.indexOffset);\n if (cell.className !== \"mach-cell mach-cell--index\") cell.className = \"mach-cell mach-cell--index\";\n this.applyCellSpanStyle(cell, node, column);\n return;\n }\n if (this.core.rowModel.isTree && this.getTreeColumn()?.id === column.id) {\n this.renderTreeCell(cell, node, column);\n return;\n }\n renderCellContent(this.core, cell, node, column);\n applyCellClasses(this.core, cell, node, column);\n applyCellStyle(this.core, cell, node, column);\n this.applyCellSpanStyle(cell, node, column);\n }\n\n private treeColumnCache: Column | null | undefined;\n\n private getTreeColumn(): Column | null {\n if (this.treeColumnCache !== undefined) return this.treeColumnCache;\n this.treeColumnCache =\n this.core.columnModel.getOrderedVisible().find(\n (c) => !c.hasCheckbox && !c.isDetailToggle && !c.colDef.rowDrag && c.colDef.type !== \"index\"\n ) ?? null;\n return this.treeColumnCache;\n }\n\n private renderTreeCell(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const hasChildren = this.core.rowModel.hasChildren(node.id);\n const depth = this.getNodeDepth(node);\n const indent = el(\"span\", \"mach-tree-indent\");\n indent.style.width = `${depth * 16}px`;\n const wrap = el(\"span\", \"mach-tree-cell\");\n wrap.appendChild(indent);\n if (hasChildren) {\n const expanded = this.core.rowModel.isRowExpanded(node.id);\n const toggle = el(\"span\", `mach-detail-toggle${expanded ? \" mach-detail-toggle--open\" : \"\"}`);\n toggle.textContent = \"▶\";\n wrap.appendChild(toggle);\n } else {\n const spacer = el(\"span\", \"mach-tree-toggle-spacer\");\n wrap.appendChild(spacer);\n }\n const text = el(\"span\", \"mach-tree-text\");\n text.textContent = formatCellValueWith(this.core, node, column, this.core.getCellValue(node, column));\n wrap.appendChild(text);\n cell.replaceChildren(wrap);\n applyCellClasses(this.core, cell, node, column);\n }\n\n private getNodeDepth(node: RowNode<any>): number {\n return this.core.rowModel.getTreeDepth(node);\n }\n\n private resetSpanStyle(cell: HTMLElement): void {\n if (cell.style.height !== \"\") cell.style.height = \"\";\n if (cell.style.zIndex !== \"\") cell.style.zIndex = \"\";\n if (cell.style.display === \"none\") cell.style.display = \"\";\n }\n\n private applyCellSpanStyle(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const spans = this.core.rowModel.getSpanInfo(column.id);\n if (!spans || node.isDetail) {\n this.resetSpanStyle(cell);\n return;\n }\n const idx = this.core.rowModel.getRowSeq(node) - 1;\n if (idx < 0 || idx >= spans.length) {\n this.resetSpanStyle(cell);\n return;\n }\n const value = spans[idx];\n if (value === -1) {\n cell.style.display = \"none\";\n return;\n }\n if (cell.style.display === \"none\") cell.style.display = \"\";\n if (value > 1) {\n const end = Math.min(idx + value, this.positions.length - 1);\n const height = this.positions[end] - this.positions[idx];\n cell.style.height = `${height > 0 ? height : value * this.core.options.rowHeight}px`;\n cell.style.zIndex = \"1\";\n } else {\n this.resetSpanStyle(cell);\n }\n }\n\n private renderGroupCell(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const base = \"mach-cell\";\n if (column.hasCheckbox) {\n const input = cell.querySelector<HTMLInputElement>(\".mach-row-checkbox\");\n if (input) {\n const state = this.core.selectionService.getGroupSelectionState(node);\n input.checked = state.all;\n input.indeterminate = state.some && !state.all;\n }\n if (cell.className !== `${base} mach-cell--selection`) cell.className = `${base} mach-cell--selection`;\n return;\n }\n if (column.isDetailToggle) {\n cell.textContent = \"\";\n if (cell.className !== base) cell.className = base;\n return;\n }\n const labelCol = this.core.columnModel.getGroupLabelColumn();\n if (labelCol && column.id === labelCol.id) {\n const wrap = el(\"span\", \"mach-group-label\");\n wrap.style.paddingLeft = `${(node.groupLevel ?? 0) * 16}px`;\n const toggle = el(\"span\", `mach-detail-toggle${this.core.rowModel.isGroupExpanded(node.id) ? \" mach-detail-toggle--open\" : \"\"}`);\n toggle.textContent = \"▶\";\n const text = el(\"span\", \"mach-group-text\");\n const groupCol = this.core.columnModel.getRowGroupColumns()[node.groupLevel ?? 0];\n const prefix = groupCol?.colDef.headerName ? `${groupCol.colDef.headerName}: ` : \"\";\n text.textContent = `${prefix}${node.groupKey ?? \"\"}`;\n const count = el(\"span\", \"mach-group-count\");\n count.textContent = `(${node.leafNodes?.length ?? 0})`;\n wrap.append(toggle, text, count);\n cell.replaceChildren(wrap);\n if (cell.className !== `${base} mach-cell--group`) cell.className = `${base} mach-cell--group`;\n return;\n }\n if (column.colDef.aggFunc && node.aggValues && Object.prototype.hasOwnProperty.call(node.aggValues, column.id)) {\n const value = node.aggValues[column.id];\n const formatted =\n column.colDef.valueFormatter != null\n ? formatCellValueWith(this.core, node, column, value)\n : defaultFormat(value);\n cell.textContent = formatted;\n if (cell.className !== `${base} mach-cell--num`) cell.className = `${base} mach-cell--num`;\n return;\n }\n cell.textContent = \"\";\n if (cell.className !== base) cell.className = base;\n }\n\n refreshRows(indexes: number[]): void {\n if (this.core.isDestroyed()) return;\n const seen = new Set<number>();\n for (const index of indexes) {\n if (index < 0 || seen.has(index)) continue;\n seen.add(index);\n const slot = this.pool[index % this.poolSize];\n if (!slot || slot.index !== index) continue;\n const node = this.core.rowModel.getDisplayedRow(index);\n if (!node) continue;\n if (slot.kind === \"detail\") {\n if (slot.detailRow) this.renderDetailContent(slot.detailRow, node);\n continue;\n }\n for (const pane of PANES) {\n const cells = slot.cells[pane];\n if (!cells) continue;\n this.renderPaneCells(slot, node, pane);\n }\n }\n this.flushFlash();\n }\n\n refreshAllCells(): void {\n if (this.core.isDestroyed()) return;\n for (const slot of this.pool) {\n if (slot.index < 0) continue;\n const node = this.core.rowModel.getDisplayedRow(slot.index);\n if (!node) continue;\n if (slot.kind === \"detail\") {\n if (slot.detailRow) this.renderDetailContent(slot.detailRow, node);\n continue;\n }\n for (const pane of PANES) {\n const cells = slot.cells[pane];\n if (!cells) continue;\n this.renderPaneCells(slot, node, pane);\n }\n }\n this.flushFlash();\n }\n\n onDataChanged(): void {\n if (this.core.isDestroyed()) return;\n if (this.focusedCell && this.focusedCell.rowIndex >= this.core.rowModel.getDisplayedRowCount()) {\n this.setFocusedCell(null, null);\n }\n this.invalidateRangeCache();\n this.applyContainerSizes();\n this.updateRange(true);\n this.updateFillHandle();\n this.refreshOverlays();\n this.core.summaryRenderer.refresh();\n }\n\n refreshOverlays(): void {\n const options = this.core.options;\n if (options.loading) {\n this.core.skeleton.showOverlay(\"loading\", options.overlayLoadingTemplate, options.allowUnsafeOverlayHtml);\n return;\n }\n if (this.core.rowModel.getDisplayedRowCount() === 0 && !options.suppressNoRowsOverlay) {\n const template = options.overlayNoRowsTemplate || this.core.buildDefaultEmptyState();\n this.core.skeleton.showOverlay(\"noRows\", template, options.allowUnsafeOverlayHtml);\n return;\n }\n this.core.skeleton.hideOverlay();\n }\n\n getCellElement(rowIndex: number, colId: string): HTMLElement | null {\n const column = this.core.columnModel.getColumn(colId);\n if (!column) return null;\n const pane = this.paneForColumn(column);\n const cols = this.core.columnModel.getPaneColumns(pane);\n const colIdx = cols.indexOf(column);\n if (colIdx < 0) return null;\n const slot = this.pool[rowIndex % this.poolSize];\n if (!slot || slot.index !== rowIndex || slot.kind !== \"master\") return null;\n return slot.cells[pane]?.[colIdx] ?? null;\n }\n\n private invalidateRangeCache(): void {\n this.rangeSelection.invalidate();\n }\n\n normalizedRange(): NormalizedRange | null {\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const colCount = this.core.columnModel.getOrderedVisible().length;\n return this.rangeSelection.normalize(rowCount, colCount);\n }\n\n getNormalizedRangeOrFocus(): NormalizedRange | null {\n const range = this.normalizedRange();\n if (range) return range;\n const focus = this.focusedCell;\n if (focus) {\n const ci = this.core.columnModel.getFlatIndex(focus.colId);\n if (ci >= 0) return { r1: focus.rowIndex, c1: ci, r2: focus.rowIndex, c2: ci };\n }\n return null;\n }\n\n getRangeSelection(): { row1: number; row2: number; colId1: string; colId2: string } | null {\n const range = this.normalizedRange();\n if (!range) return null;\n const flat = this.core.columnModel.getOrderedVisible();\n return {\n row1: range.r1,\n row2: range.r2,\n colId1: flat[range.c1]?.id ?? \"\",\n colId2: flat[range.c2]?.id ?? \"\"\n };\n }\n\n getPasteStart(): { row: number; colIdx: number } | null {\n const anchor = this.rangeSelection.getAnchor();\n if (anchor) {\n return { row: anchor.row, colIdx: anchor.colIdx };\n }\n const focus = this.getNormalizedRangeOrFocus();\n return focus ? { row: focus.r1, colIdx: focus.c1 } : null;\n }\n\n clearRangeSelection(): void {\n const old = this.normalizedRange();\n this.rangeSelection.clear();\n if (old) {\n this.refreshRowRange(old, null);\n this.updateFillHandle();\n this.core.emit(\"rangeSelectionChanged\", { range: null });\n }\n }\n\n private refreshRowRange(\n a: { r1: number; r2: number } | null,\n b: { r1: number; r2: number } | null\n ): void {\n const indexes: number[] = [];\n const collect = (r: { r1: number; r2: number } | null) => {\n if (!r) return;\n for (let i = r.r1; i <= r.r2; i++) indexes.push(i);\n };\n collect(a);\n collect(b);\n if (indexes.length > 0) this.refreshRows(indexes);\n }\n\n startRange(row: number, colIdx: number, extend: boolean): void {\n const old = this.normalizedRange();\n this.rangeSelection.start({ row, colIdx }, extend);\n const next = this.normalizedRange();\n this.refreshRowRange(old, next);\n this.updateFillHandle();\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n\n moveRangeEnd(row: number, colIdx: number): void {\n if (!this.rangeSelection.hasAnchor()) {\n const focus = this.focusedCell;\n if (!focus) return;\n const col = this.core.columnModel.getFlatIndex(focus.colId);\n if (!this.rangeSelection.ensureAnchor({ row: focus.rowIndex, colIdx: col })) return;\n }\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const colCount = this.core.columnModel.getOrderedVisible().length;\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({\n row: Math.max(0, Math.min(row, rowCount - 1)),\n colIdx: Math.max(0, Math.min(colIdx, colCount - 1))\n });\n const next = this.normalizedRange();\n this.refreshRowRange(old, next);\n this.updateFillHandle();\n const flat = this.core.columnModel.getOrderedVisible();\n const end = this.rangeSelection.getEnd();\n if (end && end.colIdx < flat.length) {\n this.setFocusedCell(end.row, flat[end.colIdx].id);\n }\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n\n private applyRangeClass(cell: HTMLElement, rowIndex: number, column: Column): void {\n const range = this.normalizedRange();\n if (!range) {\n if (cell.classList.contains(\"mach-cell--range\")) {\n cell.classList.remove(\"mach-cell--range\", \"mach-cell--range-top\", \"mach-cell--range-bottom\", \"mach-cell--range-left\", \"mach-cell--range-right\");\n }\n return;\n }\n const ci = this.core.columnModel.getFlatIndex(column.id);\n if (ci < 0) return;\n const inRange = rowIndex >= range.r1 && rowIndex <= range.r2 && ci >= range.c1 && ci <= range.c2;\n cell.classList.toggle(\"mach-cell--range\", inRange);\n if (inRange) {\n cell.classList.toggle(\"mach-cell--range-top\", rowIndex === range.r1);\n cell.classList.toggle(\"mach-cell--range-bottom\", rowIndex === range.r2);\n cell.classList.toggle(\"mach-cell--range-left\", ci === range.c1);\n cell.classList.toggle(\"mach-cell--range-right\", ci === range.c2);\n } else {\n cell.classList.remove(\"mach-cell--range-top\", \"mach-cell--range-bottom\", \"mach-cell--range-left\", \"mach-cell--range-right\");\n }\n }\n\n private fillHandleEl: HTMLElement | null = null;\n private fillDrag: {\n r1: number;\n r2: number;\n c1: number;\n c2: number;\n startX: number;\n startY: number;\n axis: \"h\" | \"v\" | null;\n active: boolean;\n } | null = null;\n private fillFromPointer = false;\n\n private ensureFillHandle(): HTMLElement {\n if (this.fillHandleEl) return this.fillHandleEl;\n const handle = el(\"div\", \"mach-fill-handle\");\n handle.style.display = \"none\";\n handle.addEventListener(\"pointerdown\", (e) => {\n this.fillFromPointer = true;\n this.onFillHandleDown(e as unknown as MouseEvent);\n });\n handle.addEventListener(\"mousedown\", (e) => {\n if (this.fillFromPointer) return;\n this.onFillHandleDown(e);\n });\n this.core.skeleton.rowContainers.center.appendChild(handle);\n this.fillHandleEl = handle;\n return handle;\n }\n\n private updateFillHandle(): void {\n const handle = this.ensureFillHandle();\n const range = this.normalizedRange();\n if (\n !this.core.options.enableRangeSelection ||\n !this.core.options.fillHandle ||\n !range\n ) {\n handle.style.display = \"none\";\n return;\n }\n const cm = this.core.columnModel;\n const leftCount = cm.getPaneColumns(\"left\").length;\n const centerCols = cm.getPaneColumns(\"center\");\n if (range.c2 < leftCount || range.c2 >= leftCount + centerCols.length) {\n handle.style.display = \"none\";\n return;\n }\n const local = range.c2 - leftCount;\n let x = 0;\n for (let i = 0; i <= local && i < centerCols.length; i++) x += centerCols[i].currentWidth;\n const bottom = this.positions[Math.min(range.r2 + 1, this.positions.length - 1)] ?? (range.r2 + 1) * this.core.options.rowHeight;\n handle.style.display = \"\";\n handle.style.left = `${x - 4}px`;\n handle.style.top = `${bottom - 4}px`;\n }\n\n private onFillHandleDown(e: MouseEvent): void {\n if (this.core.isDestroyed() || e.button !== 0) return;\n const range = this.normalizedRange();\n if (!range) return;\n e.preventDefault();\n e.stopPropagation();\n this.fillDrag = {\n r1: range.r1,\n r2: range.r2,\n c1: range.c1,\n c2: range.c2,\n startX: e.clientX,\n startY: e.clientY,\n axis: null,\n active: false\n };\n window.addEventListener(\"pointermove\", this.onFillMove);\n window.addEventListener(\"mousemove\", this.onFillMove);\n window.addEventListener(\"pointerup\", this.onFillUp);\n window.addEventListener(\"mouseup\", this.onFillUp);\n window.addEventListener(\"pointercancel\", this.onFillUp);\n }\n\n private fillTargetRow(e: MouseEvent): number {\n const container = this.core.skeleton.rowContainers.center;\n const rect = container.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const row = lowerBound(this.positions, y, rowCount);\n return Math.max(this.fillDrag!.r2, Math.min(row, rowCount - 1));\n }\n\n private fillTargetCol(e: MouseEvent): number {\n const container = this.core.skeleton.rowContainers.center;\n const rect = container.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const cm = this.core.columnModel;\n const leftCount = cm.getPaneColumns(\"left\").length;\n const centerCols = cm.getPaneColumns(\"center\");\n let acc = 0;\n for (let i = 0; i < centerCols.length; i++) {\n if (x < acc + centerCols[i].currentWidth / 2) return leftCount + i;\n acc += centerCols[i].currentWidth;\n }\n return leftCount + centerCols.length - 1;\n }\n\n private fillDragIndicator: HTMLElement | null = null;\n\n private cancelFillDrag(): void {\n this.fillDrag = null;\n this.fillFromPointer = false;\n window.removeEventListener(\"pointermove\", this.onFillMove);\n window.removeEventListener(\"mousemove\", this.onFillMove);\n window.removeEventListener(\"pointerup\", this.onFillUp);\n window.removeEventListener(\"mouseup\", this.onFillUp);\n window.removeEventListener(\"pointercancel\", this.onFillUp);\n this.core.skeleton.root.classList.remove(\"mach-root--filling\");\n }\n\n private onFillMove = (e: Event): void => {\n const drag = this.fillDrag;\n if (!drag) return;\n const me = e as MouseEvent;\n if (typeof me.clientX !== \"number\") return;\n\n if (!drag.active) {\n const dx = Math.abs(me.clientX - drag.startX);\n const dy = Math.abs(me.clientY - drag.startY);\n if (dx < 4 && dy < 4) return;\n drag.active = true;\n drag.axis = dx >= dy ? \"h\" : \"v\";\n this.core.skeleton.root.classList.add(\"mach-root--filling\");\n }\n\n if (drag.axis === \"v\") {\n const target = this.fillTargetRow(me);\n const end = this.rangeSelection.getEnd();\n if (end && end.row !== target) {\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({ row: target, colIdx: end.colIdx });\n this.refreshRowRange(old, this.normalizedRange());\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n return;\n }\n\n const targetCol = Math.max(drag.c2 + 1, this.fillTargetCol(me));\n const end = this.rangeSelection.getEnd();\n if (end && end.colIdx !== targetCol) {\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({ row: end.row, colIdx: targetCol });\n this.refreshRowRange(old, this.normalizedRange());\n this.updateFillHandle();\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n };\n\n private fillHorizontal(\n r1: number,\n r2: number,\n c1: number,\n c2: number,\n targetEnd: number\n ): void {\n const flat = this.core.columnModel.getOrderedVisible();\n const changedRows = new Set<number>();\n this.core.undoService.beginBatch();\n try {\n for (let r = r1; r <= r2; r++) {\n const srcNode = this.core.rowModel.getDisplayedRow(r);\n if (!srcNode || srcNode.isDetail || srcNode.isGroup) continue;\n const sources: any[] = [];\n for (let c = c1; c <= c2; c++) {\n const col = flat[c];\n sources.push(col ? this.core.getCellValue(srcNode, col) : undefined);\n }\n const n = c2 - c1 + 1;\n const allNumeric =\n n > 1 && sources.every((v) => typeof v === \"number\" && !isNaN(v));\n const diff = allNumeric ? (sources[n - 1] - sources[0]) / (n - 1) : 0;\n const intPattern =\n !allNumeric || sources.every((v) => Number.isInteger(v));\n\n for (let t = c2 + 1; t <= targetEnd; t++) {\n const col = flat[t];\n if (!col || col.hasCheckbox || col.isDetailToggle || col.colDef.rowDrag) continue;\n if (!this.core.editingService.isEditable(srcNode, col)) continue;\n const colOffset = t - c1;\n let value: any;\n if (n === 1) {\n value = sources[0];\n } else if (allNumeric) {\n const steps = colOffset - (n - 1);\n value = sources[n - 1] + diff * steps;\n value = intPattern ? Math.round(value) : Math.round(value * 1e6) / 1e6;\n } else {\n value = sources[colOffset % n];\n }\n const old = this.core.getCellValue(srcNode, col);\n if (this.core.setCellValue(srcNode, col, value, old)) changedRows.add(r);\n }\n }\n } finally {\n this.core.undoService.endBatch();\n }\n\n if (changedRows.size > 0) {\n this.refreshRows([...changedRows]);\n this.core.summaryRenderer.refresh();\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n }\n\n private onFillUp = (e: Event): void => {\n const drag = this.fillDrag;\n if (!drag) return;\n const me = e as MouseEvent;\n\n const finish = (): void => {\n this.cancelFillDrag();\n };\n\n if (!drag.active) {\n finish();\n return;\n }\n\n if (drag.axis === \"h\") {\n const targetCol =\n typeof me.clientX === \"number\" ? Math.max(drag.c2 + 1, this.fillTargetCol(me)) : drag.c2 + 1;\n finish();\n if (targetCol > drag.c2) {\n this.fillHorizontal(drag.r1, drag.r2, drag.c1, drag.c2, targetCol);\n this.updateFillHandle();\n } else {\n const end = this.rangeSelection.getEnd();\n if (!end || end.colIdx === drag.c2) return;\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({ row: end.row, colIdx: drag.c2 });\n this.refreshRowRange(old, this.normalizedRange());\n }\n return;\n }\n\n const targetRow = typeof me.clientY === \"number\" ? this.fillTargetRow(me) : drag.r2;\n finish();\n if (targetRow > drag.r2) {\n this.fillValues(drag.r1, drag.r2, drag.c1, drag.c2, targetRow);\n this.updateFillHandle();\n } else {\n const end = this.rangeSelection.getEnd();\n if (!end || end.row === drag.r2) return;\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({ row: drag.r2, colIdx: end.colIdx });\n this.refreshRowRange(old, this.normalizedRange());\n }\n };\n\n private fillValues(r1: number, r2: number, c1: number, c2: number, targetEnd: number): void {\n const flat = this.core.columnModel.getOrderedVisible();\n const changedRows = new Set<number>();\n this.core.undoService.beginBatch();\n try {\n this.fillValuesInner(r1, r2, c1, c2, targetEnd, flat, changedRows);\n } finally {\n this.core.undoService.endBatch();\n }\n\n if (changedRows.size > 0) {\n this.refreshRows([...changedRows]);\n this.core.summaryRenderer.refresh();\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n }\n\n private fillValuesInner(\n r1: number,\n r2: number,\n c1: number,\n c2: number,\n targetEnd: number,\n flat: Column[],\n changedRows: Set<number>\n ): void {\n for (let c = c1; c <= c2; c++) {\n const col = flat[c];\n if (!col || col.hasCheckbox || col.isDetailToggle || col.colDef.rowDrag) continue;\n\n const sources: any[] = [];\n let allNumeric = r1 < r2;\n for (let r = r1; r <= r2; r++) {\n const node = this.core.rowModel.getDisplayedRow(r);\n if (!node) {\n allNumeric = false;\n sources.push(undefined);\n continue;\n }\n const v = this.core.getCellValue(node, col);\n sources.push(v);\n if (typeof v !== \"number\" || isNaN(v)) allNumeric = false;\n }\n if (sources[0] === undefined && sources.length === 1) continue;\n\n const n = r2 - r1 + 1;\n let diff = 0;\n let intPattern = true;\n if (allNumeric) {\n diff = (sources[n - 1] - sources[0]) / (n - 1);\n for (const v of sources) if (!Number.isInteger(v)) intPattern = false;\n }\n\n for (let r = r2 + 1; r <= targetEnd; r++) {\n const node = this.core.rowModel.getDisplayedRow(r);\n if (!node || node.isDetail || node.isGroup) continue;\n if (!this.core.editingService.isEditable(node, col)) continue;\n let value: any;\n if (n === 1) {\n value = sources[0];\n } else if (allNumeric) {\n const steps = r - r2;\n value = sources[n - 1] + diff * steps;\n value = intPattern ? Math.round(value) : Math.round(value * 1e6) / 1e6;\n } else {\n value = sources[(r - r1) % n];\n }\n const old = this.core.getCellValue(node, col);\n if (this.core.setCellValue(node, col, value, old)) changedRows.add(r);\n }\n }\n }\n\n setFocusedCell(rowIndex: number | null, colId: string | null): void {\n this.clearFocusClass();\n if (rowIndex == null || colId == null) {\n this.focusedCell = null;\n return;\n }\n this.focusedCell = { rowIndex, colId };\n this.applyFocusClass();\n this.ensureFocusedCellVisible();\n }\n\n private applyFocusClass(): void {\n if (!this.focusedCell) return;\n const cell = this.getCellElement(this.focusedCell.rowIndex, this.focusedCell.colId);\n if (cell) cell.classList.add(\"mach-cell--focus\");\n }\n\n private clearFocusClass(): void {\n if (!this.focusedCell) return;\n const cell = this.getCellElement(this.focusedCell.rowIndex, this.focusedCell.colId);\n if (cell) cell.classList.remove(\"mach-cell--focus\");\n }\n\n private ensureFocusedCellVisible(): void {\n if (!this.focusedCell) return;\n this.scrollToIndex(this.focusedCell.rowIndex, \"nearest\");\n\n const column = this.core.columnModel.getColumn(this.focusedCell.colId);\n if (!column || column.pinned) return;\n const viewport = this.core.skeleton.bodyViewports.center;\n let x = 0;\n for (const col of this.core.columnModel.getPaneColumns(\"center\")) {\n if (col.id === column.id) break;\n x += col.currentWidth;\n }\n const left = viewport.scrollLeft;\n const width = viewport.clientWidth;\n if (x < left) viewport.scrollLeft = x;\n else if (x + column.currentWidth > left + width) {\n viewport.scrollLeft = x + column.currentWidth - width;\n }\n }\n\n scrollToIndex(rowIndex: number, position: \"top\" | \"bottom\" | \"middle\" | \"nearest\" = \"top\"): void {\n const viewport = this.core.skeleton.bodyViewports.center;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n if (rowCount === 0) return;\n const index = clamp(rowIndex, 0, rowCount - 1);\n const viewportHeight = viewport.clientHeight;\n const scrollTop = viewport.scrollTop;\n const rowTop = this.positions[index];\n const rowBottom = this.positions[index + 1];\n\n let target = scrollTop;\n if (position === \"top\") {\n target = rowTop;\n } else if (position === \"bottom\") {\n target = rowBottom - viewportHeight;\n } else if (position === \"middle\") {\n target = rowTop - (viewportHeight - (rowBottom - rowTop)) / 2;\n } else {\n if (rowTop < scrollTop) target = rowTop;\n else if (rowBottom > scrollTop + viewportHeight) target = rowBottom - viewportHeight;\n }\n\n const maxScroll = Math.max(0, this.positions[rowCount] - viewportHeight);\n viewport.scrollTop = clamp(target, 0, maxScroll);\n }\n\n private setHoverIndex(index: number): void {\n if (this.hoverIndex === index) return;\n const prev = this.hoverIndex;\n this.hoverIndex = index;\n this.toggleHover(prev, false);\n this.toggleHover(index, true);\n }\n\n private toggleHover(index: number, hover: boolean): void {\n if (index < 0) return;\n const slot = this.pool[index % this.poolSize];\n if (!slot || slot.index !== index || slot.kind !== \"master\") return;\n for (const pane of PANES) {\n slot.rows[pane]?.classList.toggle(\"mach-row--hover\", hover);\n }\n }\n\n focusGridRoot(): void {\n this.core.skeleton.root.focus({ preventScroll: true });\n }\n\n private resolveEventTarget(e: MouseEvent): { node: RowNode<any>; index: number; cellEl: HTMLElement | null } | null {\n const target = e.target as HTMLElement;\n const rowEl = target.closest<HTMLElement>(\".mach-row\");\n if (!rowEl) return null;\n const index = Number(rowEl.dataset.index);\n if (Number.isNaN(index)) return null;\n const node = this.core.rowModel.getDisplayedRow(index);\n if (!node) return null;\n const cellEl = target.closest<HTMLElement>(\".mach-cell\");\n return { node, index, cellEl };\n }\n\n private onBodyClick = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n const resolved = this.resolveEventTarget(e);\n if (!resolved) return;\n const { node, index, cellEl } = resolved;\n\n if (node.isGroup) {\n this.focusGridRoot();\n const checkbox = (e.target as HTMLElement).closest?.(\".mach-row-checkbox\");\n if (checkbox) {\n this.core.selectionService.setGroupSelected(node, !this.core.selectionService.getGroupSelectionState(node).all);\n return;\n }\n const labelCol = this.core.columnModel.getGroupLabelColumn();\n if (!labelCol || !cellEl || cellEl.dataset.colId === labelCol.id) {\n this.core.rowModel.toggleGroup(node.id);\n }\n return;\n }\n\n const target = e.target as HTMLElement;\n\n if (this.core.rowModel.isTree) {\n const treeCol = this.getTreeColumn();\n if (treeCol && cellEl?.dataset.colId === treeCol.id && target.closest(\".mach-detail-toggle\")) {\n if (this.core.rowModel.hasChildren(node.id)) {\n this.focusGridRoot();\n this.core.rowModel.toggleDetail(node.id);\n return;\n }\n }\n }\n\n const colId = cellEl?.dataset.colId ?? \"\";\n const column = colId ? this.core.columnModel.getColumn(colId) : undefined;\n\n if (column?.isDetailToggle && !node.isDetail) {\n this.focusGridRoot();\n this.core.toggleDetail(node.id);\n return;\n }\n\n if (node.isDetail) return;\n\n if (target.closest?.(\".mach-row-checkbox\")) {\n this.focusGridRoot();\n if (!this.core.options.suppressCellFocus) this.setFocusedCell(index, this.firstCheckboxColId());\n this.core.selectionService.onRowClick(node, e, true);\n return;\n }\n\n if (!cellEl || !column) return;\n\n this.focusGridRoot();\n if (!this.core.options.suppressCellFocus) this.setFocusedCell(index, colId);\n this.core.selectionService.onRowClick(node, e, false);\n\n const value = this.core.getCellValue(node, column);\n const event = this.core.emit(\"cellClicked\", {\n event: e,\n rowNode: node,\n rowIndex: index,\n column,\n colDef: column.colDef,\n value\n });\n column.colDef.onCellClick?.(event);\n this.core.emit(\"rowClicked\", { event: e, rowNode: node, rowIndex: index });\n\n const singleClick = this.core.options.singleClickEdit || column.colDef.singleClickEdit === true;\n if (singleClick && !node.isGroup && this.core.editingService.isEditable(node, column)) {\n this.core.editingService.start(index, column);\n }\n };\n\n private firstCheckboxColId(): string {\n for (const col of this.core.columnModel.getOrderedVisible()) {\n if (col.hasCheckbox) return col.id;\n }\n return this.core.columnModel.getOrderedVisible()[0]?.id ?? \"\";\n }\n\n private onBodyDblClick = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n const resolved = this.resolveEventTarget(e);\n if (!resolved) return;\n const { node, index, cellEl } = resolved;\n if (node.isDetail || node.isGroup || !cellEl) return;\n const colId = cellEl.dataset.colId ?? \"\";\n const column = this.core.columnModel.getColumn(colId);\n if (!column) return;\n\n const value = this.core.getCellValue(node, column);\n const event = this.core.emit(\"cellDoubleClicked\", {\n event: e,\n rowNode: node,\n rowIndex: index,\n column,\n colDef: column.colDef,\n value\n });\n column.colDef.onCellDoubleClick?.(event);\n this.core.emit(\"rowDoubleClicked\", { event: e, rowNode: node, rowIndex: index });\n\n if (this.core.editingService.isEditable(node, column)) {\n this.core.editingService.start(index, column);\n }\n };\n\n private onContextMenu = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n const resolved = this.resolveEventTarget(e);\n if (!resolved || resolved.node.isDetail || resolved.node.isGroup || !resolved.cellEl) return;\n const { node, index, cellEl } = resolved;\n const colId = cellEl.dataset.colId ?? \"\";\n const column = this.core.columnModel.getColumn(colId);\n if (!column) return;\n this.core.emit(\"cellContextMenu\", {\n event: e,\n rowNode: node,\n rowIndex: index,\n column,\n colDef: column.colDef,\n value: this.core.getCellValue(node, column)\n });\n if (this.core.options.contextMenu) {\n e.preventDefault();\n if (this.core.options.enableRangeSelection && !this.normalizedRange()) {\n const colIdx = this.core.columnModel.getFlatIndex(colId);\n if (colIdx >= 0) this.startRange(index, colIdx, false);\n }\n this.core.contextMenuService.open(e.clientX, e.clientY, { rowIndex: index, colId });\n }\n };\n\n private onMouseDown = (e: MouseEvent): void => {\n if (this.core.editingService.isEditing()) {\n this.core.editingService.stop(false);\n }\n if (this.core.options.enableRangeSelection && e.button === 0) {\n const resolved = this.resolveEventTarget(e);\n if (\n resolved &&\n !resolved.node.isDetail &&\n !resolved.node.isGroup &&\n resolved.cellEl &&\n !(e.target as HTMLElement).closest?.(\".mach-row-checkbox\")\n ) {\n const colIdx = this.core.columnModel.getFlatIndex(resolved.cellEl.dataset.colId ?? \"\");\n if (colIdx >= 0) {\n this.startRange(resolved.index, colIdx, e.shiftKey);\n this.rangeDragging = true;\n if (!e.shiftKey && !this.core.options.suppressCellFocus) {\n this.setFocusedCell(resolved.index, resolved.cellEl.dataset.colId ?? \"\");\n }\n }\n }\n }\n };\n\n private onWindowMouseUp = (): void => {\n this.rangeDragging = false;\n };\n\n private onMouseOver = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n const resolved = this.resolveEventTarget(e);\n if (this.rangeDragging) {\n if (resolved && !resolved.node.isDetail && !resolved.node.isGroup && resolved.cellEl) {\n const colIdx = this.core.columnModel.getFlatIndex(resolved.cellEl.dataset.colId ?? \"\");\n const end = this.rangeSelection.getEnd();\n if (colIdx >= 0 && end && (end.row !== resolved.index || end.colIdx !== colIdx)) {\n this.startRange(resolved.index, colIdx, true);\n }\n }\n }\n if (this.core.options.suppressRowHoverHighlight) return;\n if (!resolved || resolved.node.isDetail) return;\n this.setHoverIndex(resolved.index);\n };\n\n private onMouseLeave = (): void => {\n this.setHoverIndex(-1);\n };\n\n private onDragHandlePointerDown = (e: PointerEvent): void => {\n if (this.core.isDestroyed() || e.button !== 0) return;\n const target = e.target as HTMLElement;\n if (!target.closest(\".mach-row-drag-handle\")) return;\n const resolved = this.resolveEventTarget(e as unknown as MouseEvent);\n if (!resolved || resolved.node.isDetail || resolved.node.isGroup) return;\n\n this.rowDragController.start(e, resolved.node);\n e.preventDefault();\n };\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { PaneType } from \"../services/columnModel\";\nimport { el } from \"../lib/dom\";\nimport { DEFAULT_LOCALE, formatText } from \"../lib/locale\";\n\ntype SummaryContext = Pick<\n GridCore<any>,\n \"columnModel\" | \"getCellValue\" | \"isDestroyed\" | \"options\" | \"reportError\" | \"rowModel\" | \"skeleton\"\n>;\n\nexport class SummaryRenderer {\n private footerEl: HTMLElement | null = null;\n private rows: Record<PaneType, HTMLElement> = { left: undefined!, center: undefined!, right: undefined! };\n private cellsByPane: Record<PaneType, HTMLElement[]> = { left: [], center: [], right: [] };\n\n constructor(private core: SummaryContext) {}\n\n init(): void {\n this.footerEl = el(\"div\", \"mach-footer\");\n this.footerEl.style.display = \"none\";\n this.footerEl.setAttribute(\"role\", \"row\");\n this.core.skeleton.root.appendChild(this.footerEl);\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const row = el(\"div\", `mach-footer-row mach-footer-row--${pane}`);\n row.style.height = `${this.core.options.rowHeight}px`;\n this.footerEl.appendChild(row);\n this.rows[pane] = row;\n }\n }\n\n setVisible(visible: boolean): void {\n if (!this.footerEl) return;\n this.footerEl.style.display = visible ? \"\" : \"none\";\n }\n\n refresh(): void {\n if (!this.footerEl || this.core.isDestroyed()) return;\n const show = this.core.options.showSummary;\n this.setVisible(show);\n if (!show) return;\n\n const method = this.core.options.summaryMethod;\n const masterRows = this.core.rowModel.getDisplayedRows().filter((n) => !n.isDetail && !n.isGroup);\n const locale = { ...DEFAULT_LOCALE, ...this.core.options.locale };\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const cols = this.core.columnModel.getPaneColumns(pane);\n const row = this.rows[pane];\n if (this.cellsByPane[pane].length !== cols.length) {\n row.textContent = \"\";\n this.cellsByPane[pane] = cols.map(() => {\n const cell = el(\"div\", \"mach-footer-cell\");\n cell.setAttribute(\"role\", \"cell\");\n row.appendChild(cell);\n return cell;\n });\n }\n let x = 0;\n cols.forEach((col, i) => {\n const cell = this.cellsByPane[pane][i];\n cell.style.left = `${x}px`;\n cell.style.width = `${col.currentWidth}px`;\n x += col.currentWidth;\n\n if (col.hasCheckbox || col.isDetailToggle || col.colDef.rowDrag) {\n cell.textContent = \"\";\n return;\n }\n if (method) {\n try {\n cell.textContent = method({\n colId: col.id,\n column: col,\n values: masterRows.map((node) => this.core.getCellValue(node, col))\n });\n } catch (error) {\n this.core.reportError(error, \"summaryMethod\", { colId: col.id });\n cell.textContent = \"\";\n }\n } else if (i === 0 && pane === \"left\") {\n cell.textContent = formatText(locale.totalRowsLabel, masterRows.length);\n } else {\n cell.textContent = \"\";\n }\n });\n }\n }\n\n destroy(): void {\n this.footerEl?.remove();\n this.footerEl = null;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport { el } from \"../lib/dom\";\nimport { DEFAULT_LOCALE, formatText, formatTwo } from \"../lib/locale\";\n\ntype PaginationContext = Pick<\n GridCore<any>,\n \"eventBus\" | \"isDestroyed\" | \"options\" | \"rowModel\" | \"skeleton\"\n>;\n\nexport class PaginationBar {\n private barEl: HTMLElement | null = null;\n private totalEl: HTMLElement | null = null;\n private pageEl: HTMLElement | null = null;\n private sizeSelect: HTMLSelectElement | null = null;\n private firstBtn: HTMLButtonElement | null = null;\n private prevBtn: HTMLButtonElement | null = null;\n private nextBtn: HTMLButtonElement | null = null;\n private lastBtn: HTMLButtonElement | null = null;\n private offs: (() => void)[] = [];\n\n constructor(private core: PaginationContext) {}\n\n init(): void {\n this.barEl = el(\"div\", \"mach-pagination\");\n this.barEl.style.display = \"none\";\n this.barEl.setAttribute(\"role\", \"navigation\");\n\n const mkBtn = (cls: string, label: string, text: string): HTMLButtonElement => {\n const btn = el(\"button\", `mach-pagination-btn ${cls}`) as HTMLButtonElement;\n btn.type = \"button\";\n btn.title = label;\n btn.setAttribute(\"aria-label\", label);\n btn.textContent = text;\n return btn;\n };\n\n this.totalEl = el(\"span\", \"mach-pagination-total\");\n this.firstBtn = mkBtn(\"mach-pagination-first\", this.t(\"pageFirst\"), \"«\");\n this.prevBtn = mkBtn(\"mach-pagination-prev\", this.t(\"pagePrev\"), \"‹\");\n this.pageEl = el(\"span\", \"mach-pagination-page\");\n this.nextBtn = mkBtn(\"mach-pagination-next\", this.t(\"pageNext\"), \"›\");\n this.lastBtn = mkBtn(\"mach-pagination-last\", this.t(\"pageLast\"), \"»\");\n\n this.firstBtn.addEventListener(\"click\", () => this.core.rowModel.setPage(1));\n this.prevBtn.addEventListener(\"click\", () => this.core.rowModel.setPage(this.core.rowModel.getCurrentPage() - 1));\n this.nextBtn.addEventListener(\"click\", () => this.core.rowModel.setPage(this.core.rowModel.getCurrentPage() + 1));\n this.lastBtn.addEventListener(\"click\", () => this.core.rowModel.setPage(this.core.rowModel.getPageCount()));\n\n this.barEl.append(this.totalEl, this.firstBtn, this.prevBtn, this.pageEl, this.nextBtn, this.lastBtn);\n\n if (this.core.options.paginationShowSizeSelector) {\n this.sizeSelect = document.createElement(\"select\");\n this.sizeSelect.className = \"mach-pagination-size\";\n this.sizeSelect.setAttribute(\"aria-label\", \"page size\");\n this.buildSizeOptions();\n this.sizeSelect.addEventListener(\"change\", () => {\n const size = Number(this.sizeSelect!.value);\n if (!Number.isNaN(size)) this.core.rowModel.setPageSize(size);\n });\n this.barEl.appendChild(this.sizeSelect);\n }\n\n this.core.skeleton.root.appendChild(this.barEl);\n\n this.offs.push(\n this.core.eventBus.on(\"modelUpdated\", () => this.refresh()),\n this.core.eventBus.on(\"paginationChanged\", () => this.refresh())\n );\n this.refresh();\n }\n\n private buildSizeOptions(): void {\n if (!this.sizeSelect) return;\n const options = this.core.options.paginationPageSizeOptions;\n const current = this.core.options.paginationPageSize;\n if (!options.includes(current)) {\n options.push(current);\n options.sort((a, b) => a - b);\n }\n this.sizeSelect.textContent = \"\";\n for (const size of options) {\n const option = document.createElement(\"option\");\n option.value = String(size);\n option.textContent = formatText(this.t(\"perPage\"), size);\n if (size === current) option.selected = true;\n this.sizeSelect.appendChild(option);\n }\n }\n\n private t(key: Parameters<GridCore<any>[\"getLocaleText\"]>[0]): string {\n return this.core.options.locale?.[key] ?? DEFAULT_LOCALE[key];\n }\n\n rebuild(): void {\n if (!this.barEl) return;\n if (this.sizeSelect && this.core.options.paginationShowSizeSelector) {\n this.buildSizeOptions();\n }\n this.refresh();\n }\n\n refresh(): void {\n if (!this.barEl || this.core.isDestroyed()) return;\n const rm = this.core.rowModel;\n const active = rm.paginationActive;\n const total = rm.getTotalRowCount();\n const visible = active && total > 0;\n this.barEl.style.display = visible ? \"\" : \"none\";\n if (!visible) return;\n\n const page = rm.getCurrentPage();\n const pageCount = rm.getPageCount();\n\n if (this.totalEl && this.core.options.paginationShowTotal) {\n const text = formatText(this.t(\"paginationTotal\"), total);\n if (this.totalEl.textContent !== text) this.totalEl.textContent = text;\n }\n if (this.pageEl) {\n const text = formatTwo(this.t(\"paginationPage\"), page, pageCount);\n if (this.pageEl.textContent !== text) this.pageEl.textContent = text;\n }\n if (this.firstBtn) this.firstBtn.disabled = page <= 1;\n if (this.prevBtn) this.prevBtn.disabled = page <= 1;\n if (this.nextBtn) this.nextBtn.disabled = page >= pageCount;\n if (this.lastBtn) this.lastBtn.disabled = page >= pageCount;\n if (this.sizeSelect && Number(this.sizeSelect.value) !== this.core.options.paginationPageSize) {\n this.sizeSelect.value = String(this.core.options.paginationPageSize);\n }\n }\n\n destroy(): void {\n for (const off of this.offs) off();\n this.offs = [];\n this.barEl?.remove();\n this.barEl = null;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { PaneType } from \"../services/columnModel\";\nimport type { RowNode } from \"../types/row\";\nimport { el } from \"../lib/dom\";\nimport { renderCellContent, cleanupCellContent, applyCellClasses, applyCellStyle } from \"./cellContent\";\n\ntype PinnedRowsContext = Pick<\n GridCore<any>,\n | \"columnModel\"\n | \"getApi\"\n | \"getCellValue\"\n | \"isDestroyed\"\n | \"options\"\n | \"relayout\"\n | \"reportError\"\n | \"resolveCellRenderer\"\n | \"skeleton\"\n>;\n\nconst PANES: PaneType[] = [\"left\", \"center\", \"right\"];\n\ninterface SideState {\n root: HTMLElement;\n segments: Record<PaneType, HTMLElement>;\n centerViewport: HTMLElement;\n rowWrappers: Record<PaneType, HTMLElement[]>;\n cells: Record<PaneType, HTMLElement[]>[];\n data: any[];\n}\n\nexport class PinnedRowsRenderer {\n private top: SideState | null = null;\n private bottom: SideState | null = null;\n\n constructor(private core: PinnedRowsContext) {}\n\n init(): void {\n this.top = this.createSide(this.core.skeleton.pinnedTopEl);\n this.bottom = this.createSide(this.core.skeleton.pinnedBottomEl);\n }\n\n private createSide(root: HTMLElement): SideState {\n const state: SideState = {\n root,\n segments: { left: el(\"div\"), center: el(\"div\"), right: el(\"div\") } as Record<PaneType, HTMLElement>,\n centerViewport: el(\"div\", \"mach-pinned-viewport\"),\n rowWrappers: { left: [], center: [], right: [] } as Record<PaneType, HTMLElement[]>,\n cells: [],\n data: []\n };\n for (const pane of PANES) {\n state.segments[pane].className = `mach-pinned-seg mach-pinned-seg--${pane}`;\n if (pane !== \"center\") state.segments[pane].classList.add(\"mach-pane--hidden\");\n if (pane === \"center\") {\n state.centerViewport.appendChild(state.segments[pane]);\n }\n }\n root.append(state.segments.left, state.centerViewport, state.segments.right);\n return state;\n }\n\n setData(top: any[] | null, bottom: any[] | null): void {\n if (this.core.isDestroyed() || !this.top || !this.bottom) return;\n this.top.data = top ?? [];\n this.bottom.data = bottom ?? [];\n this.rebuild();\n this.applyLayout();\n this.core.relayout();\n }\n\n setTopData(rows: any[] | null): void {\n if (this.core.isDestroyed() || !this.top) return;\n this.top.data = rows ?? [];\n this.rebuildSide(this.top, \"top\");\n this.applyLayout();\n this.core.relayout();\n }\n\n setBottomData(rows: any[] | null): void {\n if (this.core.isDestroyed() || !this.bottom) return;\n this.bottom.data = rows ?? [];\n this.rebuildSide(this.bottom, \"bottom\");\n this.applyLayout();\n this.core.relayout();\n }\n\n getTopData(): any[] {\n return this.top ? this.top.data.slice() : [];\n }\n\n getBottomData(): any[] {\n return this.bottom ? this.bottom.data.slice() : [];\n }\n\n rebuild(): void {\n if (!this.top || !this.bottom) return;\n this.rebuildSide(this.top, \"top\");\n this.rebuildSide(this.bottom, \"bottom\");\n }\n\n private rebuildSide(side: SideState, sideName: \"top\" | \"bottom\"): void {\n for (const row of side.cells) {\n for (const pane of PANES) {\n for (const cell of row[pane]) cleanupCellContent(this.core, cell);\n }\n }\n for (const pane of PANES) {\n for (const wrapper of side.rowWrappers[pane]) wrapper.remove();\n side.rowWrappers[pane] = [];\n }\n side.cells = [];\n side.root.style.display = side.data.length > 0 ? \"\" : \"none\";\n if (side.data.length === 0) return;\n\n const rowHeight = this.core.options.rowHeight;\n const cm = this.core.columnModel;\n\n side.data.forEach((data, i) => {\n const node: RowNode<any> = {\n id: `__pinned_${sideName}_${i}`,\n data,\n rowIndex: -1,\n selected: false\n };\n const cellsByPane = {} as Record<PaneType, HTMLElement[]>;\n for (const pane of PANES) {\n const wrapper = el(\"div\", \"mach-pinned-row\");\n wrapper.style.height = `${rowHeight}px`;\n wrapper.setAttribute(\"role\", \"row\");\n cellsByPane[pane] = [];\n for (const col of cm.getPaneColumns(pane)) {\n const cell = el(\"div\", \"mach-cell\");\n cell.dataset.colId = col.id;\n cell.setAttribute(\"role\", \"gridcell\");\n if (col.hasCheckbox) cell.classList.add(\"mach-cell--selection\");\n if (!col.hasCheckbox && !col.isDetailToggle && !col.colDef.rowDrag && col.colDef.type !== \"index\") {\n try {\n renderCellContent(this.core, cell, node, col);\n applyCellClasses(this.core, cell, node, col);\n applyCellStyle(this.core, cell, node, col);\n } catch (err) {\n this.core.reportError(err, \"pinnedRow.render\", { colId: col.id, side: sideName, rowIndex: i });\n }\n }\n wrapper.appendChild(cell);\n cellsByPane[pane].push(cell);\n }\n side.segments[pane].appendChild(wrapper);\n side.rowWrappers[pane].push(wrapper);\n }\n side.cells.push(cellsByPane);\n });\n }\n\n applyLayout(): void {\n if (!this.top || !this.bottom) return;\n const cm = this.core.columnModel;\n const widths: Record<PaneType, number> = { left: 0, center: 0, right: 0 };\n const lefts: Record<PaneType, number[]> = { left: [], center: [], right: [] };\n for (const pane of PANES) {\n let x = 0;\n for (const col of cm.getPaneColumns(pane)) {\n lefts[pane].push(x);\n x += col.currentWidth;\n }\n widths[pane] = x;\n }\n\n for (const side of [this.top, this.bottom]) {\n const hidden = side.data.length === 0;\n side.segments.left.classList.toggle(\"mach-pane--hidden\", hidden || widths.left <= 0);\n side.segments.right.classList.toggle(\"mach-pane--hidden\", hidden || widths.right <= 0);\n side.segments.left.style.width = `${widths.left}px`;\n side.segments.right.style.width = `${widths.right}px`;\n side.segments.center.style.width = `${widths.center}px`;\n side.cells.forEach((cellsByPane) => {\n let globalColOffset = 0;\n for (const pane of PANES) {\n const cols = cm.getPaneColumns(pane);\n cellsByPane[pane].forEach((cell, i) => {\n cell.style.width = `${cols[i].currentWidth}px`;\n cell.style.left = `${lefts[pane][i]}px`;\n cell.setAttribute(\"aria-colindex\", String(globalColOffset + i + 1));\n });\n globalColOffset += cols.length;\n }\n });\n }\n }\n\n onScrollLeft(scrollLeft: number): void {\n if (this.top) this.top.segments.center.style.transform = `translateX(${-scrollLeft}px)`;\n if (this.bottom) this.bottom.segments.center.style.transform = `translateX(${-scrollLeft}px)`;\n }\n\n refresh(): void {\n this.rebuild();\n this.applyLayout();\n }\n\n destroy(): void {\n for (const side of [this.top, this.bottom]) {\n if (!side) continue;\n for (const row of side.cells) {\n for (const pane of PANES) {\n for (const cell of row[pane]) cleanupCellContent(this.core, cell);\n }\n }\n }\n this.top = null;\n this.bottom = null;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport { el } from \"../lib/dom\";\nimport { DEFAULT_LOCALE, formatText, type RgLocaleKey } from \"../lib/locale\";\nimport type { StatusBarPanel } from \"../types/options\";\n\ntype AnyLocale = Record<string, string | undefined>;\ntype StatusBarContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"columnModel\"\n | \"eventBus\"\n | \"getCellValue\"\n | \"isDestroyed\"\n | \"options\"\n | \"rowModel\"\n | \"selectionService\"\n | \"skeleton\"\n>;\n\nexport class StatusBarService {\n private barEl: HTMLElement | null = null;\n private items: Partial<Record<StatusBarPanel, HTMLElement>> = {};\n private offs: (() => void)[] = [];\n\n constructor(private core: StatusBarContext) {}\n\n init(): void {\n this.barEl = el(\"div\", \"mach-statusbar\");\n this.barEl.style.display = \"none\";\n this.barEl.setAttribute(\"role\", \"status\");\n this.core.skeleton.root.appendChild(this.barEl);\n this.rebuild();\n\n this.offs.push(\n this.core.eventBus.on(\"modelUpdated\", () => this.refresh()),\n this.core.eventBus.on(\"selectionChanged\", () => this.refresh()),\n this.core.eventBus.on(\"rangeSelectionChanged\", () => this.refresh()),\n this.core.eventBus.on(\"cellValueChanged\", () => this.refresh())\n );\n }\n\n rebuild(): void {\n if (!this.barEl) return;\n this.barEl.textContent = \"\";\n this.items = {};\n const options = this.core.options;\n if (!options.statusBarEnabled) {\n this.barEl.style.display = \"none\";\n return;\n }\n for (const panel of options.statusBarPanels) {\n const item = el(\"span\", `mach-statusbar-item mach-statusbar-item--${panel}`);\n this.barEl.appendChild(item);\n this.items[panel] = item;\n }\n this.refresh();\n }\n\n refresh(): void {\n if (!this.barEl || this.core.isDestroyed()) return;\n const options = this.core.options;\n this.barEl.style.display = options.statusBarEnabled ? \"\" : \"none\";\n if (!options.statusBarEnabled) return;\n\n const locale: AnyLocale = { ...DEFAULT_LOCALE, ...options.locale };\n const text = (key: RgLocaleKey, value?: number | string): string => {\n const template = locale[key] ?? DEFAULT_LOCALE[key];\n return value === undefined ? template : formatText(template, typeof value === \"number\" ? value : parseFloat(String(value)) || 0);\n };\n\n if (this.items.rowCount) {\n const rm = this.core.rowModel;\n const total = rm.getDisplayTotalCount();\n const loaded = rm.paginationActive ? rm.getTotalRowCount() : rm.getDisplayedRowCount();\n const value =\n rm.isInfinite && total > loaded\n ? `${formatText(text(\"totalRowsLabel\"), loaded)} / ${total}`\n : formatText(text(\"totalRowsLabel\"), loaded);\n if (this.items.rowCount.textContent !== value) this.items.rowCount.textContent = value;\n }\n\n if (this.items.selectedRowCount) {\n const count = this.core.selectionService.getSelectedNodes().length;\n const value = formatText(text(\"statusSelected\"), count);\n if (this.items.selectedRowCount.textContent !== value) {\n this.items.selectedRowCount.textContent = value;\n }\n }\n\n if (this.items.rangeAggregate) {\n const range = this.core.bodyRenderer.normalizedRange();\n let value = \"\";\n if (range) {\n const flat = this.core.columnModel.getOrderedVisible();\n let sum = 0;\n let count = 0;\n for (let r = range.r1; r <= range.r2; r++) {\n const node = this.core.rowModel.getDisplayedRow(r);\n if (!node || node.isDetail || node.isGroup) continue;\n for (let c = range.c1; c <= range.c2; c++) {\n const col = flat[c];\n if (!col) continue;\n const v = this.core.getCellValue(node, col);\n if (typeof v === \"number\" && !isNaN(v)) {\n sum += v;\n count++;\n }\n }\n }\n if (count > 0) {\n const avg = Math.round((sum / count) * 100) / 100;\n const sumText = Number.isInteger(sum) ? String(sum) : String(Math.round(sum * 100) / 100);\n value = `${text(\"statusSum\", sumText)} · ${text(\"statusAvg\", String(avg))} · ${text(\"statusCount\", String(count))}`;\n }\n }\n if (this.items.rangeAggregate.textContent !== value) this.items.rangeAggregate.textContent = value;\n }\n }\n\n destroy(): void {\n for (const off of this.offs) off();\n this.offs = [];\n this.barEl?.remove();\n this.barEl = null;\n }\n}\n","import type { ColumnState } from \"../types/colDef\";\n\nexport function saveColumnState(key: string, state: ColumnState[]): void {\n try {\n if (typeof localStorage === \"undefined\") return;\n localStorage.setItem(`mach-table:col-state:${key}`, JSON.stringify(state));\n } catch {\n void 0;\n }\n}\n\nexport function loadColumnState(key: string): ColumnState[] | null {\n try {\n if (typeof localStorage === \"undefined\") return null;\n const raw = localStorage.getItem(`mach-table:col-state:${key}`);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return null;\n return parsed.filter(\n (s): s is ColumnState => s != null && typeof s === \"object\" && typeof s.colId === \"string\"\n );\n } catch {\n return null;\n }\n}\n\nexport function clearColumnState(key: string): void {\n try {\n if (typeof localStorage === \"undefined\") return;\n localStorage.removeItem(`mach-table:col-state:${key}`);\n } catch {\n void 0;\n }\n}\n","import type { CellRendererParams } from \"../types/params\";\nimport type { CellRendererFn } from \"../types/colDef\";\n\nexport type TagVariant = \"success\" | \"warning\" | \"danger\" | \"info\" | \"neutral\";\n\nexport interface StatusTagConfig {\n variantMap?: Record<string, TagVariant>;\n labelMap?: Record<string, string>;\n}\n\nconst DEFAULT_STATUS_VARIANTS: Array<[RegExp, TagVariant]> = [\n [/^(success|ok|done|complete|completed|normal|active|enabled|启用|正常|完成|已完成|运行|运行中|在线|生效)$/i, \"success\"],\n [/^(warning|warn|hold|pending|standby|待机|待审核|暂停|预警|部分完成)$/i, \"warning\"],\n [/^(error|fail|failed|danger|fault|offline|disabled|故障|失败|错误|异常|停用|离线|断开)$/i, \"danger\"],\n [/^(info|processing|new|draft|进行中|新建|草稿|审批中|同步中)$/i, \"info\"]\n];\n\nexport function resolveTagVariant(value: any, variantMap?: Record<string, TagVariant>): TagVariant {\n const key = String(value ?? \"\");\n if (variantMap) {\n const exact = variantMap[key];\n if (exact) return exact;\n const lower = variantMap[key.toLowerCase()];\n if (lower) return lower;\n }\n for (const [pattern, variant] of DEFAULT_STATUS_VARIANTS) {\n if (pattern.test(key)) return variant;\n }\n return \"neutral\";\n}\n\nexport function createStatusTagRenderer(config: StatusTagConfig = {}): CellRendererFn {\n return (params: CellRendererParams) => {\n if (params.value == null || params.value === \"\") return \"\";\n const variant = resolveTagVariant(params.value, config.variantMap);\n const label = config.labelMap?.[String(params.value)] ?? (params.formatted || String(params.value));\n const tag = document.createElement(\"span\");\n tag.className = `mach-tag mach-tag--${variant}`;\n tag.textContent = label;\n return tag;\n };\n}\n\nexport interface ProgressConfig {\n showValue?: boolean;\n unit?: string;\n color?: string;\n}\n\nexport function createProgressBarRenderer(config: ProgressConfig = {}): CellRendererFn {\n return (params: CellRendererParams) => {\n const raw = Number(params.value);\n if (isNaN(raw)) return params.formatted;\n const pct = Math.max(0, Math.min(100, raw));\n const wrap = document.createElement(\"div\");\n wrap.className = \"mach-progress\";\n const track = document.createElement(\"div\");\n track.className = \"mach-progress__track\";\n const bar = document.createElement(\"div\");\n bar.className = \"mach-progress__bar\";\n bar.style.width = `${pct}%`;\n if (config.color) bar.style.background = config.color;\n track.appendChild(bar);\n wrap.appendChild(track);\n if (config.showValue !== false) {\n const label = document.createElement(\"span\");\n label.className = \"mach-progress__label\";\n label.textContent = `${Math.round(pct)}${config.unit ?? \"%\"}`;\n wrap.appendChild(label);\n }\n return wrap;\n };\n}\n\nexport function linkRenderer(params: CellRendererParams): string | HTMLElement {\n if (params.value == null || params.value === \"\") return \"\";\n const a = document.createElement(\"span\");\n a.className = \"mach-link\";\n a.textContent = params.formatted || String(params.value);\n return a;\n}\n\nconst ICON_PATHS: Record<string, string> = {\n edit: '<path d=\"M11.5 2.5l2 2L5 13H3v-2l8.5-8.5z\"/>',\n delete: '<path d=\"M3 5h10M6 5V3h4v2M5 5l.7 8h4.6L11 5\"/>',\n view: '<path d=\"M1.5 8s2.4-4.2 6.5-4.2S14.5 8 14.5 8s-2.4 4.2-6.5 4.2S1.5 8 1.5 8z\"/><circle cx=\"8\" cy=\"8\" r=\"1.8\"/>',\n copy: '<rect x=\"5\" y=\"5\" width=\"8\" height=\"8\" rx=\"1\"/><path d=\"M3 11V3h8\"/>',\n download: '<path d=\"M8 2v8m0 0l-3-3m3 3l3-3M2.5 13.5h11\"/>',\n refresh: '<path d=\"M13 3v4h-4M3 13V9h4\"/><path d=\"M13 7a5.5 5.5 0 00-9.7-2.6M3 9a5.5 5.5 0 009.7 2.6\"/>',\n close: '<path d=\"M3.5 3.5l9 9m0-9l-9 9\"/>',\n check: '<path d=\"M2.5 8.5l3.5 3.5 7.5-8\"/>',\n plus: '<path d=\"M8 2.5v11M2.5 8h11\"/>',\n search: '<circle cx=\"7\" cy=\"7\" r=\"4.5\"/><path d=\"M10.5 10.5L14 14\"/>'\n};\n\nfunction iconSvg(name: string, size = 14): string {\n const path = ICON_PATHS[name] ?? \"\";\n return `<svg viewBox=\"0 0 16 16\" width=\"${size}\" height=\"${size}\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${path}</svg>`;\n}\n\nexport interface ActionItem<TData = any> {\n icon?: string;\n label?: string;\n title?: string;\n danger?: boolean;\n show?: (params: CellRendererParams<TData>) => boolean;\n onClick: (params: CellRendererParams<TData>) => void;\n}\n\nexport interface ActionButtonsConfig {\n actions: ActionItem[];\n max?: number;\n}\n\nlet openActionMenu: HTMLElement | null = null;\nlet openActionAnchor: HTMLElement | null = null;\n\nfunction closeActionMenu(): void {\n openActionMenu?.remove();\n openActionMenu = null;\n openActionAnchor = null;\n document.removeEventListener(\"mousedown\", onActionMenuOutside, true);\n}\n\nfunction onActionMenuOutside(e: MouseEvent): void {\n if (openActionMenu && !openActionMenu.contains(e.target as Node)) closeActionMenu();\n}\n\nfunction showActionMenu(anchor: HTMLElement, items: Array<{ label: string; danger?: boolean; pick: () => void }>): void {\n closeActionMenu();\n const menu = document.createElement(\"div\");\n menu.className = \"mach-context-menu\";\n for (const item of items) {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"mach-context-menu-item\";\n if (item.danger) btn.classList.add(\"mach-context-menu-item--danger\");\n btn.textContent = item.label;\n btn.addEventListener(\"click\", () => {\n closeActionMenu();\n item.pick();\n });\n menu.appendChild(btn);\n }\n document.body.appendChild(menu);\n const rect = anchor.getBoundingClientRect();\n const menuRect = menu.getBoundingClientRect();\n menu.style.left = `${Math.min(Math.max(8, rect.left), window.innerWidth - menuRect.width - 8)}px`;\n menu.style.top = `${Math.min(rect.bottom + 4, window.innerHeight - menuRect.height - 8)}px`;\n openActionMenu = menu;\n openActionAnchor = anchor;\n document.addEventListener(\"mousedown\", onActionMenuOutside, true);\n}\n\nexport function createActionButtonsRenderer(config: ActionButtonsConfig): CellRendererFn {\n const max = config.max ?? 3;\n return (params: CellRendererParams) => {\n const visible = config.actions.filter((action) => {\n if (!action.show) return true;\n try {\n return action.show(params);\n } catch {\n return false;\n }\n });\n if (visible.length === 0) return \"\";\n\n const wrap = document.createElement(\"div\");\n wrap.className = \"mach-actions\";\n\n const shown = visible.slice(0, max);\n const overflow = visible.slice(max);\n\n for (const action of shown) {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"mach-action-btn\";\n if (action.danger) btn.classList.add(\"mach-action-btn--danger\");\n const title = action.title ?? action.label ?? \"\";\n if (title) btn.title = title;\n if (action.icon && ICON_PATHS[action.icon]) {\n btn.innerHTML = iconSvg(action.icon);\n btn.classList.add(\"mach-action-btn--icon\");\n } else {\n btn.textContent = action.label ?? title;\n }\n btn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n action.onClick(params);\n });\n wrap.appendChild(btn);\n }\n\n if (overflow.length > 0) {\n const more = document.createElement(\"button\");\n more.type = \"button\";\n more.className = \"mach-action-btn mach-action-btn--icon\";\n more.title = \"more\";\n more.textContent = \"⋯\";\n more.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n showActionMenu(\n more,\n overflow.map((action) => ({\n label: action.label ?? action.title ?? \"\",\n danger: action.danger,\n pick: () => action.onClick(params)\n }))\n );\n });\n wrap.appendChild(more);\n }\n\n return {\n el: wrap,\n destroy: () => {\n if (openActionAnchor && wrap.contains(openActionAnchor)) closeActionMenu();\n }\n };\n };\n}\n\nexport const presetStatusTagRenderer = createStatusTagRenderer();\nexport const presetProgressBarRenderer = createProgressBarRenderer();\n\nexport function registerBuiltinRenderers(register: (name: string, fn: CellRendererFn) => void): void {\n register(\"statusTag\", presetStatusTagRenderer);\n register(\"progressBar\", presetProgressBarRenderer);\n register(\"link\", linkRenderer);\n}\n","import type { CellRendererFn, CellEditorFactory } from \"../types/colDef\";\n\nconst cellRenderers = new Map<string, CellRendererFn>();\nconst cellEditors = new Map<string, CellEditorFactory>();\n\nexport function registerCellRenderer(name: string, renderer: CellRendererFn): () => void {\n const previous = cellRenderers.get(name);\n cellRenderers.set(name, renderer);\n return () => {\n if (cellRenderers.get(name) !== renderer) return;\n if (previous) cellRenderers.set(name, previous);\n else cellRenderers.delete(name);\n };\n}\n\nexport function getCellRenderer(name: string): CellRendererFn | undefined {\n return cellRenderers.get(name);\n}\n\nexport function registerCellEditor(name: string, editor: CellEditorFactory): () => void {\n const previous = cellEditors.get(name);\n cellEditors.set(name, editor);\n return () => {\n if (cellEditors.get(name) !== editor) return;\n if (previous) cellEditors.set(name, previous);\n else cellEditors.delete(name);\n };\n}\n\nexport function getCellEditor(name: string): CellEditorFactory | undefined {\n return cellEditors.get(name);\n}\n\n/** Register a built-in without replacing an application override. */\nexport function ensureCellRenderer(name: string, renderer: CellRendererFn): void {\n if (!cellRenderers.has(name)) cellRenderers.set(name, renderer);\n}\n\nexport function clearComponentRegistries(): void {\n cellRenderers.clear();\n cellEditors.clear();\n}\n","import type { ColDef, ColDefGroup, ColDefOrGroup } from \"../types/colDef\";\nimport { isColDefGroup } from \"../types/colDef\";\nimport { isSafePath } from \"./path\";\n\nexport function validateColumnDefs(defs: (ColDef<any> | ColDefGroup<any>)[] | null | undefined): string[] {\n if (!defs || defs.length === 0) return [];\n const issues: string[] = [];\n const seenIds = new Map<string, number>();\n let leafIndex = 0;\n\n const walk = (list: ColDefOrGroup<any>[], depth: number): void => {\n for (const def of list) {\n if (isColDefGroup(def)) {\n if (!Array.isArray(def.children) || def.children.length === 0) {\n issues.push(`列分组 \"${def.headerName ?? def.groupId ?? \"?\"}\" 的 children 为空`);\n continue;\n }\n walk(def.children, depth + 1);\n continue;\n }\n leafIndex++;\n const id = def.colId ?? def.field ?? `col_${leafIndex}`;\n seenIds.set(id, (seenIds.get(id) ?? 0) + 1);\n\n if (def.field && !isSafePath(def.field)) {\n issues.push(`列 \"${id}\" 的 field 路径不安全或无效,已禁止读取和写入`);\n }\n\n if (!def.field && !def.valueGetter && !def.checkboxSelection && !def.autoRowSpan && !def.rowSpan) {\n issues.push(`列 \"${id}\" 既无 field 也无 valueGetter,将始终显示空值(纯工具列请忽略此提示)`);\n }\n if (def.width != null && def.minWidth != null && def.width < def.minWidth) {\n issues.push(`列 \"${id}\" 的 width(${def.width}) 小于 minWidth(${def.minWidth}),将按 minWidth 渲染`);\n }\n if (def.width != null && def.maxWidth != null && def.width > def.maxWidth) {\n issues.push(`列 \"${id}\" 的 width(${def.width}) 大于 maxWidth(${def.maxWidth}),将按 maxWidth 渲染`);\n }\n }\n };\n\n walk(defs, 0);\n for (const [id, count] of seenIds) {\n if (count > 1) issues.push(`存在 ${count} 个重复的 colId/field \"${id}\",已自动加后缀区分,建议显式命名 colId`);\n }\n return issues;\n}\n","import { EventBus } from \"./eventBus\";\nimport { resolveOptions } from \"./resolveOptions\";\nimport { ColumnModel } from \"../services/columnModel\";\nimport { RowModel } from \"../services/rowModel\";\nimport { SelectionService } from \"../services/selectionService\";\nimport { ResizeService } from \"../services/resizeService\";\nimport { ColumnDragService } from \"../services/columnDragService\";\nimport { KeyboardService } from \"../services/keyboardService\";\nimport { EditingService } from \"../services/editingService\";\nimport { FilterPopupService } from \"../services/filterPopup\";\nimport { ColumnMenuService } from \"../services/columnMenuService\";\nimport { ContextMenuService } from \"../services/contextMenuService\";\nimport { TooltipService } from \"../services/tooltipService\";\nimport { WatermarkService } from \"../services/watermarkService\";\nimport { UndoRedoService } from \"../services/undoRedoService\";\nimport { GridApiImpl } from \"../services/gridApi\";\nimport { GridSkeleton } from \"../render/skeleton\";\nimport { HeaderRenderer } from \"../render/headerRenderer\";\nimport { BodyRenderer } from \"../render/bodyRenderer\";\nimport { SummaryRenderer } from \"../render/summaryRenderer\";\nimport { PaginationBar } from \"../render/paginationBar\";\nimport { PinnedRowsRenderer } from \"../render/pinnedRowsRenderer\";\nimport { StatusBarService } from \"../render/statusBarService\";\nimport { getByPath, setByPath } from \"../lib/path\";\nimport { loadColumnState, saveColumnState } from \"../lib/columnStateStore\";\nimport { registerBuiltinRenderers } from \"../lib/presetRenderers\";\nimport {\n ensureCellRenderer,\n getCellEditor,\n getCellRenderer\n} from \"../lib/componentRegistry\";\nimport { validateColumnDefs } from \"../lib/validateDefs\";\nimport { toTsv, parseTsv, writeClipboard } from \"../lib/clipboard\";\nimport { formatCellValueWith } from \"../render/cellContent\";\nimport { DEFAULT_LOCALE, type RgLocale, type RgLocaleKey } from \"../lib/locale\";\nimport type { ResolvedGridOptions } from \"../types/options\";\nimport type { GridApi } from \"../types/api\";\nimport type { GridFeature, GridFeatureContext, GridOptions } from \"../types/options\";\nimport type { Column } from \"../services/column\";\nimport type { RowNode } from \"../types/row\";\nimport type { GridEventMap, GridEventType } from \"../types/events\";\nimport type {\n CellEditorFactory,\n CellRendererFn,\n ColumnFilter,\n ColumnState,\n ColDef,\n ColDefGroup\n} from \"../types/colDef\";\n\ntype ColumnStateLike = ColumnState;\n\nlet gridUid = 0;\nfunction ensureBuiltinRenderers(): void {\n registerBuiltinRenderers(ensureCellRenderer);\n}\n\nexport class GridCore<TData = any> {\n readonly gridId: number;\n readonly options: ResolvedGridOptions<TData>;\n readonly eventBus: EventBus<GridEventMap<TData>>;\n readonly skeleton: GridSkeleton;\n readonly columnModel: ColumnModel;\n readonly rowModel: RowModel<TData>;\n readonly selectionService: SelectionService;\n readonly headerRenderer: HeaderRenderer;\n readonly bodyRenderer: BodyRenderer;\n readonly resizeService: ResizeService;\n readonly columnDragService: ColumnDragService;\n readonly keyboardService: KeyboardService;\n readonly editingService: EditingService;\n readonly undoService: UndoRedoService;\n readonly filterPopup: FilterPopupService;\n readonly columnMenu: ColumnMenuService;\n readonly contextMenuService: ContextMenuService;\n readonly tooltipService: TooltipService;\n readonly watermarkService: WatermarkService;\n readonly paginationBar: PaginationBar;\n readonly pinnedRowsRenderer: PinnedRowsRenderer;\n readonly summaryRenderer: SummaryRenderer;\n readonly statusBarService: StatusBarService;\n readonly api: GridApi<TData>;\n\n private destroyed = false;\n private autoIdCounter = 0;\n private readyRafId = 0;\n private lastColumnLayoutSignature = \"\";\n private activeFeatures = new Map<string, { feature: GridFeature<TData>; cleanup?: () => void }>();\n\n constructor(container: HTMLElement, options: GridOptions<TData>) {\n this.gridId = ++gridUid;\n ensureBuiltinRenderers();\n this.options = resolveOptions(options);\n this.eventBus = new EventBus<GridEventMap<TData>>((error, eventType) => {\n if (eventType === \"gridError\") console.error(\"[mach-table] error in gridError listener\", error);\n else this.reportError(error, \"eventBus.listener\", { eventType });\n });\n\n this.columnModel = new ColumnModel(this as GridCore<any>);\n this.rowModel = new RowModel<TData>(this as GridCore<any>);\n this.selectionService = new SelectionService(this as GridCore<any>);\n this.skeleton = new GridSkeleton(this as GridCore<any>);\n this.headerRenderer = new HeaderRenderer(this as GridCore<any>);\n this.bodyRenderer = new BodyRenderer(this as GridCore<any>);\n this.resizeService = new ResizeService(this as GridCore<any>);\n this.columnDragService = new ColumnDragService(this as GridCore<any>);\n this.keyboardService = new KeyboardService(this as GridCore<any>);\n this.editingService = new EditingService(this as GridCore<any>);\n this.undoService = new UndoRedoService(this as GridCore<any>);\n this.filterPopup = new FilterPopupService(this as GridCore<any>);\n this.columnMenu = new ColumnMenuService(this as GridCore<any>);\n this.contextMenuService = new ContextMenuService(this as GridCore<any>);\n this.tooltipService = new TooltipService(this as GridCore<any>);\n this.watermarkService = new WatermarkService(this as GridCore<any>);\n this.paginationBar = new PaginationBar(this as GridCore<any>);\n this.pinnedRowsRenderer = new PinnedRowsRenderer(this as GridCore<any>);\n this.summaryRenderer = new SummaryRenderer(this as GridCore<any>);\n this.statusBarService = new StatusBarService(this as GridCore<any>);\n this.api = new GridApiImpl<TData>(this as GridCore<TData>);\n\n try {\n this.skeleton.init(container, this.options);\n this.watermarkService.init();\n this.bodyRenderer.init();\n this.keyboardService.init();\n this.tooltipService.init();\n this.paginationBar.init();\n this.summaryRenderer.init();\n this.statusBarService.init();\n this.pinnedRowsRenderer.init();\n\n this.columnModel.setColumnDefs(this.options.columnDefs);\n this.validateDefs(this.options.columnDefs);\n this.checkWarnings();\n this.loadPersistedColumnState();\n this.headerRenderer.build();\n if (this.options.datasource) {\n void this.rowModel.startInfinite();\n } else {\n this.rowModel.setRowData(this.options.rowData);\n }\n this.relayout();\n this.pinnedRowsRenderer.setData(this.options.pinnedTopRowData, this.options.pinnedBottomRowData);\n this.setFeatures(this.options.features);\n\n this.readyRafId = requestAnimationFrame(() => {\n this.readyRafId = 0;\n if (!this.destroyed) this.emit(\"gridReady\", {});\n });\n } catch (error) {\n this.reportError(error, \"grid.constructor\");\n this.destroy();\n throw error;\n }\n }\n\n getApi(): GridApi<TData> {\n return this.api;\n }\n\n resolveCellRenderer(name: string): CellRendererFn | undefined {\n const local = this.options.components?.cellRenderers?.[name];\n if (local) return local;\n let renderer = getCellRenderer(name);\n if (!renderer) {\n // `clearComponentRegistries` is public for test/HMR isolation; built-ins\n // must remain recoverable for already-created and future grids.\n ensureBuiltinRenderers();\n renderer = getCellRenderer(name);\n }\n return renderer;\n }\n\n resolveCellEditor(name: string): CellEditorFactory | undefined {\n return this.options.components?.cellEditors?.[name] ?? getCellEditor(name);\n }\n\n setFeatures(features: readonly GridFeature<TData>[] | null | undefined): void {\n this.destroyFeatures();\n if (this.destroyed) return;\n const context: GridFeatureContext<TData> = {\n api: this.api,\n root: this.skeleton.root,\n getOptions: () => this.options,\n addEventListener: (type, listener) => this.eventBus.on(type, listener),\n reportError: (error, source, details) => this.reportError(error, `feature.${source}`, details)\n };\n\n for (const feature of features ?? []) {\n const key = typeof feature?.key === \"string\" ? feature.key.trim() : \"\";\n if (!key) {\n this.reportError(new Error(\"GridFeature.key must be a non-empty string\"), \"feature.setup\");\n continue;\n }\n if (this.activeFeatures.has(key)) {\n this.reportError(new Error(`Duplicate GridFeature key: ${key}`), \"feature.setup\", { key });\n continue;\n }\n try {\n const cleanup = feature.setup(context);\n this.activeFeatures.set(key, {\n feature,\n ...(typeof cleanup === \"function\" ? { cleanup } : {})\n });\n } catch (error) {\n this.reportError(error, \"feature.setup\", { key });\n }\n }\n }\n\n private destroyFeatures(): void {\n const entries = [...this.activeFeatures.entries()].reverse();\n this.activeFeatures.clear();\n for (const [key, active] of entries) {\n try {\n active.cleanup?.();\n } catch (error) {\n this.reportError(error, \"feature.cleanup\", { key });\n }\n try {\n active.feature.destroy?.();\n } catch (error) {\n this.reportError(error, \"feature.destroy\", { key });\n }\n }\n }\n\n isDestroyed(): boolean {\n return this.destroyed;\n }\n\n nextId(): number {\n return ++this.autoIdCounter;\n }\n\n getCellValue(node: RowNode<any>, column: Column): any {\n const def = column.colDef;\n if (def.valueGetter) {\n try {\n return def.valueGetter({\n api: this.api,\n colDef: def,\n column,\n node,\n data: node.data\n });\n } catch (error) {\n this.reportError(error, \"valueGetter\", { colId: column.id, rowId: node.id });\n return undefined;\n }\n }\n if (def.field) return getByPath(node.data, def.field);\n return undefined;\n }\n\n getLocaleText(key: RgLocaleKey): string {\n const locale: RgLocale = this.options.locale;\n return locale[key] ?? DEFAULT_LOCALE[key];\n }\n\n writeValue(node: RowNode<any>, column: Column, newValue: any, oldValue?: any): boolean {\n const colDef = column.colDef;\n if (colDef.valueSetter) {\n try {\n return colDef.valueSetter({\n oldValue,\n newValue,\n data: node.data!,\n node,\n colDef,\n column,\n api: this.api\n });\n } catch (error) {\n this.reportError(error, \"valueSetter\", { colId: column.id, rowId: node.id });\n return false;\n }\n }\n if (colDef.field) return setByPath(node.data, colDef.field, newValue);\n return false;\n }\n\n setCellValue(node: RowNode<any>, column: Column, newValue: any, oldValue: any): boolean {\n if (newValue === undefined || newValue === oldValue) return false;\n const colDef = column.colDef;\n\n let changed: boolean;\n if (colDef.valueSetter) {\n try {\n changed = colDef.valueSetter({\n oldValue,\n newValue,\n data: node.data!,\n node,\n colDef,\n column,\n api: this.api\n });\n } catch (error) {\n this.reportError(error, \"valueSetter\", { colId: column.id, rowId: node.id });\n return false;\n }\n } else if (colDef.field) {\n changed = setByPath(node.data, colDef.field, newValue);\n } else {\n return false;\n }\n\n if (changed) {\n this.bodyRenderer.invalidateRowHeight(node);\n this.bodyRenderer.queueFlash([node.rowIndex], [column.id]);\n this.emit(\"cellValueChanged\", {\n oldValue,\n newValue,\n rowNode: node,\n rowIndex: node.rowIndex,\n column,\n colDef,\n data: node.data!\n });\n this.undoService.record({ nodeId: node.id, columnId: column.id, oldValue, newValue });\n }\n return changed;\n }\n\n buildRangeTsv(range: { r1: number; c1: number; r2: number; c2: number }): string {\n const flat = this.columnModel.getOrderedVisible();\n const cols = flat.slice(range.c1, range.c2 + 1);\n const rows: string[][] = [];\n for (let r = range.r1; r <= range.r2; r++) {\n const node = this.rowModel.getDisplayedRow(r);\n rows.push(\n cols.map((col) => {\n if (!node || node.isDetail || node.isGroup) return \"\";\n return formatCellValueWith(this, node, col, this.getCellValue(node, col));\n })\n );\n }\n return toTsv(rows);\n }\n\n copyActiveRange(): Promise<boolean> {\n const range = this.bodyRenderer.getNormalizedRangeOrFocus();\n if (!range) return Promise.resolve(false);\n return writeClipboard(this.buildRangeTsv(range));\n }\n\n clearRangeValues(range: { r1: number; c1: number; r2: number; c2: number }): void {\n if (this.destroyed) return;\n const flat = this.columnModel.getOrderedVisible();\n const changedRows = new Set<number>();\n this.undoService.beginBatch();\n try {\n for (let r = range.r1; r <= range.r2; r++) {\n const node = this.rowModel.getDisplayedRow(r);\n if (!node || node.isDetail || node.isGroup) continue;\n for (let c = range.c1; c <= range.c2; c++) {\n const col = flat[c];\n if (!col || col.hasCheckbox || col.isDetailToggle || col.colDef.rowDrag) continue;\n if (!this.editingService.isEditable(node, col)) continue;\n const old = this.getCellValue(node, col);\n if (this.setCellValue(node, col, null, old)) changedRows.add(r);\n }\n }\n } finally {\n this.undoService.endBatch();\n }\n if (changedRows.size > 0) {\n this.bodyRenderer.refreshRows([...changedRows]);\n this.summaryRenderer.refresh();\n }\n }\n\n pasteText(text: string, startRow: number, startColIdx: number): void {\n if (this.destroyed) return;\n const grid = parseTsv(text);\n if (grid.length === 0) return;\n const flat = this.columnModel.getOrderedVisible();\n const rowCount = this.rowModel.getDisplayedRowCount();\n const changedRows = new Set<number>();\n let r = startRow;\n\n this.undoService.beginBatch();\n try {\n for (const line of grid) {\n while (r < rowCount) {\n const node = this.rowModel.getDisplayedRow(r);\n if (node && !node.isDetail && !node.isGroup) break;\n r++;\n }\n if (r >= rowCount) break;\n const node = this.rowModel.getDisplayedRow(r)!;\n let c = startColIdx;\n for (const token of line) {\n while (c < flat.length) {\n const skip = flat[c] && (flat[c].hasCheckbox || flat[c].isDetailToggle || flat[c].colDef.rowDrag);\n if (!skip) break;\n c++;\n }\n if (c >= flat.length) break;\n const col = flat[c];\n if (this.editingService.isEditable(node, col)) {\n const old = this.getCellValue(node, col);\n let value: any = token;\n if (token === \"\") {\n value = null;\n } else if (typeof old === \"number\" && !isNaN(Number(token))) {\n value = Number(token);\n }\n if (this.setCellValue(node, col, value, old)) changedRows.add(r);\n }\n c++;\n }\n r++;\n }\n } finally {\n this.undoService.endBatch();\n }\n\n if (changedRows.size > 0) {\n this.bodyRenderer.refreshRows([...changedRows]);\n this.summaryRenderer.refresh();\n }\n }\n\n pasteFromSystemClipboard(): Promise<void> {\n const start = this.bodyRenderer.getPasteStart();\n if (!start) return Promise.resolve();\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.readText) {\n return navigator.clipboard\n .readText()\n .then((text) => {\n if (text) this.pasteText(text, start.row, start.colIdx);\n })\n .catch(() => undefined);\n }\n } catch {\n void 0;\n }\n return Promise.resolve();\n }\n\n refreshSummary(): void {\n this.summaryRenderer.refresh();\n }\n\n emit<K extends GridEventType>(type: K, extra?: Partial<GridEventMap<TData>[K]>): GridEventMap<TData>[K] {\n const event = { type, api: this.api, ...extra } as GridEventMap<TData>[K];\n this.eventBus.emit(type, event);\n const handlerKey = (\"on\" + type.charAt(0).toUpperCase() + type.slice(1)) as keyof ResolvedGridOptions<TData>;\n const handler = this.options[handlerKey] as unknown as\n | ((event: GridEventMap<TData>[K]) => void)\n | undefined;\n if (typeof handler === \"function\") {\n try {\n handler(event);\n } catch (error) {\n if (type === \"gridError\") console.error(\"[mach-table] error in onGridError\", error);\n else this.reportError(error, `eventHandler.${String(handlerKey)}`, { eventType: type });\n }\n }\n return event;\n }\n\n reportError(error: unknown, source: string, context?: Record<string, unknown>): void {\n console.error(`[mach-table] ${source} error`, error);\n if (this.destroyed) return;\n this.emit(\"gridError\", { error, source, context });\n }\n\n cycleSort(column: Column, additive: boolean): void {\n this.columnModel.cycleSort(column, additive);\n this.applySortModel();\n }\n\n applySortModel(): void {\n this.headerRenderer.refreshSortIndicators();\n this.emit(\"sortChanged\", { sortModel: this.columnModel.getSortModel() });\n this.persistColumnState();\n if (this.rowModel.isInfinite) {\n this.rowModel.onServerParamsChanged();\n return;\n }\n this.rowModel.refreshPipeline();\n this.bodyRenderer.onDataChanged();\n }\n\n applyColumnFilter(column: Column, filter: ColumnFilter | null): void {\n const model = this.rowModel.getFilterModel();\n if (filter) model[column.id] = filter;\n else delete model[column.id];\n this.rowModel.setFilterModel(model);\n this.headerRenderer.refreshFilterIcons();\n this.emit(\"filterChanged\", { filterModel: this.rowModel.getFilterModel() });\n if (this.rowModel.isInfinite) {\n this.rowModel.onServerParamsChanged();\n return;\n }\n this.rowModel.refreshPipeline();\n this.bodyRenderer.onDataChanged();\n }\n\n applyQuickFilter(): void {\n this.emit(\"filterChanged\", { filterModel: this.rowModel.getFilterModel() });\n if (this.rowModel.isInfinite) {\n this.rowModel.onServerParamsChanged();\n return;\n }\n this.rowModel.refreshPipeline();\n this.bodyRenderer.onDataChanged();\n }\n\n moveColumn(colId: string, toIndex: number): void {\n if (!this.columnModel.moveColumn(colId, toIndex)) return;\n this.onColumnsStructureChanged();\n this.emit(\"columnMoved\", { colId, toIndex });\n this.persistColumnState();\n }\n\n toggleDetail(rowId: string): boolean {\n return this.rowModel.toggleDetail(rowId);\n }\n\n private stateLoadToken = 0;\n\n loadPersistedColumnState(): void {\n const token = ++this.stateLoadToken;\n if (!this.options.columnStateKey) return;\n let saved: ColumnStateLike[] | null | Promise<ColumnStateLike[] | null>;\n try {\n saved = this.options.columnStateStore\n ? this.options.columnStateStore.load(this.options.columnStateKey)\n : loadColumnState(this.options.columnStateKey);\n } catch (error) {\n this.reportError(error, \"columnState.load\");\n return;\n }\n if (saved == null) return;\n if (!Array.isArray(saved)) {\n Promise.resolve(saved)\n .then((states) => {\n if (this.destroyed || token !== this.stateLoadToken || !states || states.length === 0) return;\n this.columnModel.applyColumnState(states);\n if (this.rowModel.isInfinite) void this.rowModel.onServerParamsChanged();\n else this.rowModel.refreshPipeline();\n this.onColumnsStructureChanged();\n })\n .catch((error) => this.reportError(error, \"columnState.load\"));\n return;\n }\n if (saved.length > 0) {\n this.columnModel.applyColumnState(saved);\n }\n }\n\n persistColumnState(): void {\n if (!this.options.columnStateKey || this.destroyed) return;\n const state = this.columnModel.getColumnState();\n try {\n const result = this.options.columnStateStore\n ? this.options.columnStateStore.save(this.options.columnStateKey, state)\n : saveColumnState(this.options.columnStateKey, state);\n if (result && typeof (result as Promise<void>).catch === \"function\") {\n void (result as Promise<void>).catch((error) => this.reportError(error, \"columnState.save\"));\n }\n } catch (error) {\n this.reportError(error, \"columnState.save\");\n }\n }\n\n buildDefaultEmptyState(): HTMLElement {\n const locale = this.options.locale ?? {};\n const title = locale.emptyRows ?? DEFAULT_LOCALE.emptyRows;\n const hint = locale.emptyRowsHint ?? DEFAULT_LOCALE.emptyRowsHint;\n const empty = document.createElement(\"div\");\n empty.className = \"mach-empty\";\n\n const icon = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n icon.setAttribute(\"class\", \"mach-empty__icon\");\n icon.setAttribute(\"viewBox\", \"0 0 96 84\");\n icon.setAttribute(\"width\", \"96\");\n icon.setAttribute(\"height\", \"84\");\n icon.setAttribute(\"fill\", \"none\");\n icon.setAttribute(\"aria-hidden\", \"true\");\n // Static library-owned SVG only; user-controlled text is assigned via textContent below.\n icon.innerHTML =\n '<rect x=\"8\" y=\"10\" width=\"68\" height=\"56\" rx=\"6\" fill=\"#eaf3fe\"/>' +\n '<rect x=\"8\" y=\"10\" width=\"68\" height=\"12\" rx=\"6\" fill=\"#d5e8fd\"/>' +\n '<rect x=\"8\" y=\"19\" width=\"68\" height=\"3\" fill=\"#d5e8fd\"/>' +\n '<g stroke=\"#bcd7f8\" stroke-width=\"2.4\" stroke-linecap=\"round\">' +\n '<line x1=\"16\" y1=\"32\" x2=\"68\" y2=\"32\"/><line x1=\"16\" y1=\"42\" x2=\"60\" y2=\"42\"/>' +\n '<line x1=\"16\" y1=\"52\" x2=\"64\" y2=\"52\"/></g>' +\n '<circle cx=\"66\" cy=\"52\" r=\"15\" fill=\"#ffffff\" stroke=\"#8fbdf5\" stroke-width=\"3\"/>' +\n '<line x1=\"77\" y1=\"63\" x2=\"86\" y2=\"72\" stroke=\"#8fbdf5\" stroke-width=\"4\" stroke-linecap=\"round\"/>' +\n '<line x1=\"60\" y1=\"52\" x2=\"72\" y2=\"52\" stroke=\"#bcd7f8\" stroke-width=\"2.6\" stroke-linecap=\"round\"/>';\n\n const titleEl = document.createElement(\"div\");\n titleEl.className = \"mach-empty__title\";\n titleEl.textContent = title;\n const hintEl = document.createElement(\"div\");\n hintEl.className = \"mach-empty__hint\";\n hintEl.textContent = hint;\n empty.append(icon, titleEl, hintEl);\n return empty;\n }\n\n private lastValidatedDefs: unknown = null;\n private issuedWarningSignatures = new Set<string>();\n\n checkWarnings(): void {\n if (this.options.suppressWarnings || this.destroyed) return;\n if (this.options.treeData) {\n if (this.columnModel.getRowGroupColumns().length > 0) {\n console.warn(\"[mach-table] treeData 与 rowGroup 不支持同时启用,行分组已被忽略\");\n }\n if (this.options.masterDetail) {\n console.warn(\"[mach-table] treeData 与 masterDetail 不支持同时启用,主从明细已被忽略\");\n }\n }\n }\n\n validateDefs(defs: (ColDef<any> | ColDefGroup<any>)[] | null | undefined): void {\n if (this.options.suppressWarnings || this.destroyed) return;\n if (this.lastValidatedDefs === defs) return;\n this.lastValidatedDefs = defs;\n for (const issue of validateColumnDefs(defs)) {\n if (this.issuedWarningSignatures.has(issue)) continue;\n this.issuedWarningSignatures.add(issue);\n console.warn(`[mach-table] ${issue}`);\n }\n }\n\n onColumnsStructureChanged(): void {\n this.checkWarnings();\n this.validateDefs(this.columnModel.getColumnDefs());\n this.bodyRenderer.invalidateAllRowHeights();\n this.headerRenderer.build();\n this.bodyRenderer.rebuildPool();\n this.relayout();\n this.pinnedRowsRenderer.rebuild();\n this.summaryRenderer.refresh();\n this.emit(\"displayedColumnsChanged\", {});\n }\n\n relayout(): void {\n if (this.destroyed) return;\n this.columnModel.computeLayout(this.skeleton.measureViewportWidth());\n const widthSignature = this.columnModel.getOrderedVisible()\n .map((column) => `${column.id}:${column.currentWidth}`)\n .join(\"|\");\n if (this.lastColumnLayoutSignature && widthSignature !== this.lastColumnLayoutSignature) {\n this.bodyRenderer.invalidateAllRowHeights();\n }\n this.lastColumnLayoutSignature = widthSignature;\n this.skeleton.root.setAttribute(\"aria-colcount\", String(this.columnModel.getOrderedVisible().length));\n this.headerRenderer.applyLayout();\n this.bodyRenderer.relayout();\n this.pinnedRowsRenderer.applyLayout();\n this.summaryRenderer.refresh();\n }\n\n relayoutColumns(invalidateRowHeights = true): void {\n if (this.destroyed) return;\n this.columnModel.computeLayout(this.skeleton.measureViewportWidth());\n if (invalidateRowHeights) this.bodyRenderer.invalidateAllRowHeights();\n this.headerRenderer.applyLayout();\n this.bodyRenderer.applyContainerSizes();\n this.bodyRenderer.applyCellLayout();\n this.bodyRenderer.updateRange(true);\n this.pinnedRowsRenderer.applyLayout();\n this.summaryRenderer.refresh();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n if (this.readyRafId) cancelAnimationFrame(this.readyRafId);\n this.readyRafId = 0;\n const safely = (source: string, fn: () => void): void => {\n try {\n fn();\n } catch (error) {\n console.error(`[mach-table] ${source} destroy error`, error);\n }\n };\n safely(\"grid event\", () => this.emit(\"gridDestroyed\", {}));\n safely(\"features\", () => this.destroyFeatures());\n safely(\"rowModel\", () => this.rowModel.destroy());\n safely(\"editingService\", () => this.editingService.destroy());\n safely(\"keyboardService\", () => this.keyboardService.destroy());\n safely(\"filterPopup\", () => this.filterPopup.destroy());\n safely(\"columnMenu\", () => this.columnMenu.destroy());\n safely(\"contextMenu\", () => this.contextMenuService.destroy());\n safely(\"tooltip\", () => this.tooltipService.destroy());\n safely(\"watermark\", () => this.watermarkService.destroy());\n safely(\"pagination\", () => this.paginationBar.destroy());\n safely(\"columnDrag\", () => this.columnDragService.destroy());\n safely(\"resize\", () => this.resizeService.destroy());\n safely(\"bodyRenderer\", () => this.bodyRenderer.destroy());\n safely(\"headerRenderer\", () => this.headerRenderer.destroy());\n safely(\"pinnedRowsRenderer\", () => this.pinnedRowsRenderer.destroy());\n safely(\"summaryRenderer\", () => this.summaryRenderer.destroy());\n safely(\"statusBar\", () => this.statusBarService.destroy());\n safely(\"skeleton\", () => this.skeleton.destroy());\n this.eventBus.clear();\n }\n}\n","import { GridCore } from \"./gridCore\";\nimport type { GridApi, GridOptions } from \"../types\";\n\nexport function createGrid<TData = any>(container: HTMLElement, options: GridOptions<TData> = {}): GridApi<TData> {\n if (!container) {\n throw new Error(\"[mach-table] createGrid requires a container element\");\n }\n if (typeof document === \"undefined\") {\n throw new Error(\"[mach-table] createGrid can only be used in a browser environment\");\n }\n const core = new GridCore<TData>(container, options);\n return core.getApi();\n}\n","import type { GridOptions } from \"../types/options\";\nimport type { GridEventType } from \"../types/events\";\n\nexport type GridOptionValueKind =\n | \"array\"\n | \"boolean\"\n | \"boolean-object\"\n | \"function\"\n | \"number\"\n | \"object\"\n | \"string\"\n | \"unknown\";\n\nexport type GridOptionUpdateMode = \"columnDefs\" | \"options\" | \"quickFilter\" | \"rowData\";\n\nexport interface GridOptionMetadata {\n /** Runtime value category used by framework adapters. */\n kind: GridOptionValueKind;\n /** How a changed framework prop is forwarded to GridApi. */\n update: GridOptionUpdateMode;\n}\n\ntype EventOptionKey = `on${Capitalize<GridEventType>}`;\nexport type GridOptionKey = Exclude<keyof GridOptions<any>, EventOptionKey>;\n\n/**\n * Runtime single source of truth for every non-event GridOptions property.\n *\n * The mapped `satisfies` type intentionally makes adding a GridOptions field a\n * compile error until its adapter/update behavior is declared here.\n */\nexport const GRID_OPTION_META = {\n columnDefs: { kind: \"array\", update: \"columnDefs\" },\n rowData: { kind: \"array\", update: \"rowData\" },\n defaultColDef: { kind: \"object\", update: \"options\" },\n getRowId: { kind: \"function\", update: \"options\" },\n rowHeight: { kind: \"number\", update: \"options\" },\n headerHeight: { kind: \"number\", update: \"options\" },\n rowBuffer: { kind: \"number\", update: \"options\" },\n rowSelection: { kind: \"string\", update: \"options\" },\n multiSort: { kind: \"boolean\", update: \"options\" },\n size: { kind: \"string\", update: \"options\" },\n stripedRows: { kind: \"boolean\", update: \"options\" },\n showCellBorders: { kind: \"boolean\", update: \"options\" },\n theme: { kind: \"string\", update: \"options\" },\n quickFilterText: { kind: \"string\", update: \"quickFilter\" },\n masterDetail: { kind: \"boolean\", update: \"options\" },\n detailRowHeight: { kind: \"number\", update: \"options\" },\n detailRowRenderer: { kind: \"function\", update: \"options\" },\n isRowExpandable: { kind: \"function\", update: \"options\" },\n detailToggleColumn: { kind: \"boolean\", update: \"options\" },\n columnMenu: { kind: \"boolean\", update: \"options\" },\n columnStateKey: { kind: \"string\", update: \"options\" },\n columnStateStore: { kind: \"object\", update: \"options\" },\n aggFuncs: { kind: \"object\", update: \"options\" },\n components: { kind: \"object\", update: \"options\" },\n features: { kind: \"array\", update: \"options\" },\n locale: { kind: \"object\", update: \"options\" },\n singleClickEdit: { kind: \"boolean\", update: \"options\" },\n manualSorting: { kind: \"boolean\", update: \"options\" },\n manualFiltering: { kind: \"boolean\", update: \"options\" },\n showSummary: { kind: \"boolean\", update: \"options\" },\n summaryMethod: { kind: \"function\", update: \"options\" },\n treeData: { kind: \"boolean\", update: \"options\" },\n childrenKey: { kind: \"string\", update: \"options\" },\n autoCheckedChildren: { kind: \"boolean\", update: \"options\" },\n defaultExpandAll: { kind: \"boolean\", update: \"options\" },\n indexOffset: { kind: \"number\", update: \"options\" },\n applyRowDrag: { kind: \"boolean\", update: \"options\" },\n undoStackSize: { kind: \"number\", update: \"options\" },\n getRowHeight: { kind: \"function\", update: \"options\" },\n pinnedTopRowData: { kind: \"array\", update: \"options\" },\n pinnedBottomRowData: { kind: \"array\", update: \"options\" },\n pagination: { kind: \"boolean-object\", update: \"options\" },\n watermark: { kind: \"boolean-object\", update: \"options\" },\n suppressWarnings: { kind: \"boolean\", update: \"options\" },\n enableRangeSelection: { kind: \"boolean\", update: \"options\" },\n suppressClipboard: { kind: \"boolean\", update: \"options\" },\n contextMenu: { kind: \"boolean\", update: \"options\" },\n getContextMenuItems: { kind: \"function\", update: \"options\" },\n tooltipComponent: { kind: \"function\", update: \"options\" },\n tooltipShowDelay: { kind: \"number\", update: \"options\" },\n flashCells: { kind: \"boolean\", update: \"options\" },\n fillHandle: { kind: \"boolean\", update: \"options\" },\n statusBar: { kind: \"boolean-object\", update: \"options\" },\n datasource: { kind: \"object\", update: \"options\" },\n blockSize: { kind: \"number\", update: \"options\" },\n infiniteBufferRows: { kind: \"number\", update: \"options\" },\n suppressCellFocus: { kind: \"boolean\", update: \"options\" },\n suppressRowHoverHighlight: { kind: \"boolean\", update: \"options\" },\n suppressNoRowsOverlay: { kind: \"boolean\", update: \"options\" },\n suppressHeaderFocus: { kind: \"boolean\", update: \"options\" },\n loading: { kind: \"boolean\", update: \"options\" },\n overlayNoRowsTemplate: { kind: \"unknown\", update: \"options\" },\n overlayLoadingTemplate: { kind: \"unknown\", update: \"options\" },\n allowUnsafeOverlayHtml: { kind: \"boolean\", update: \"options\" },\n className: { kind: \"string\", update: \"options\" }\n} as const satisfies { [K in GridOptionKey]: GridOptionMetadata };\n\nexport const GRID_OPTION_KEYS = Object.freeze(Object.keys(GRID_OPTION_META) as GridOptionKey[]);\n\nexport const DIRECT_GRID_OPTION_KEYS = Object.freeze(\n GRID_OPTION_KEYS.filter((key) => GRID_OPTION_META[key].update === \"options\")\n);\n","import type { ColDef, ColDefGroup } from \"../types/colDef\";\n\nexport type GridSchemaFieldType = \"string\" | \"number\" | \"date\" | \"select\" | \"boolean\";\n\nexport interface SchemaSelectOption {\n label: string;\n value: string | number;\n}\n\nexport interface GridSchemaField {\n field: string;\n title?: string;\n type?: GridSchemaFieldType;\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n flex?: number;\n pinned?: \"left\" | \"right\";\n editable?: boolean;\n sortable?: boolean;\n filterable?: boolean;\n resizable?: boolean;\n hidden?: boolean;\n options?: SchemaSelectOption[];\n format?: \"date\" | \"datetime\";\n cellClass?: string | string[];\n}\n\nexport interface GridSchemaGroup {\n title: string;\n fields: string[];\n}\n\nexport interface GridSchema {\n fields: GridSchemaField[];\n groups?: GridSchemaGroup[];\n}\n\nfunction booleanFormatter(p: { value: any }): string {\n if (p.value === true) return \"是\";\n if (p.value === false) return \"否\";\n return \"\";\n}\n\nfunction dateFormatter(format: \"date\" | \"datetime\" | undefined): (p: { value: any }) => string {\n return (p) => {\n if (p.value == null || p.value === \"\") return \"\";\n const text = p.value instanceof Date ? p.value.toISOString() : String(p.value);\n return format === \"datetime\" ? text.slice(0, 16).replace(\"T\", \" \") : text.slice(0, 10);\n };\n}\n\nfunction selectFormatter(options: SchemaSelectOption[]): (p: { value: any }) => string {\n return (p) => {\n if (p.value == null) return \"\";\n const hit = options.find((o) => o.value === p.value);\n return hit ? hit.label : String(p.value);\n };\n}\n\nfunction fieldToColDef(field: GridSchemaField): ColDef<any> {\n const type = field.type ?? \"string\";\n const colDef: ColDef<any> = {\n colId: field.field,\n field: field.field,\n headerName: field.title ?? field.field,\n width: field.width,\n minWidth: field.minWidth,\n maxWidth: field.maxWidth,\n flex: field.flex,\n pinned: field.pinned ?? undefined,\n hide: field.hidden ?? false,\n editable: field.editable ?? false,\n sortable: field.sortable ?? true,\n resizable: field.resizable ?? true,\n filter: field.filterable === false ? false : type === \"number\" ? \"number\" : type === \"date\" ? \"date\" : type === \"select\" ? \"set\" : \"text\",\n cellClass: field.cellClass\n };\n\n if (type === \"number\") {\n colDef.type = \"rightAligned\";\n } else if (type === \"date\") {\n colDef.valueFormatter = dateFormatter(field.format);\n } else if (type === \"boolean\") {\n colDef.valueFormatter = booleanFormatter;\n colDef.filter = field.filterable === false ? false : \"set\";\n } else if (type === \"select\") {\n const options = field.options ?? [];\n colDef.valueFormatter = selectFormatter(options);\n if (field.editable) {\n colDef.cellEditor = \"select\";\n colDef.cellEditorParams = { values: options.map((o) => o.value) };\n }\n }\n\n return colDef;\n}\n\nexport function buildColDefsFromSchema<TData = any>(\n schema: GridSchema\n): (ColDef<TData> | ColDefGroup<TData>)[] {\n const byField = new Map(schema.fields.map((f) => [f.field, f]));\n const used = new Set<string>();\n const result: (ColDef<TData> | ColDefGroup<TData>)[] = [];\n\n for (const field of schema.fields) {\n if (used.has(field.field)) continue;\n const grouped = (schema.groups ?? []).some((g) => g.fields.includes(field.field));\n if (!grouped) {\n result.push(fieldToColDef(field));\n used.add(field.field);\n }\n }\n\n for (const group of schema.groups ?? []) {\n const children: ColDef<TData>[] = [];\n for (const fieldName of group.fields) {\n const field = byField.get(fieldName);\n if (!field || used.has(fieldName)) continue;\n children.push(fieldToColDef(field));\n used.add(fieldName);\n }\n if (children.length > 0) {\n result.push({ headerName: group.title, children });\n }\n }\n\n return result;\n}\n","import type { ColDef } from \"../types/colDef\";\nimport type { ActionButtonsConfig } from \"./presetRenderers\";\nimport { createActionButtonsRenderer } from \"./presetRenderers\";\n\nconst NO_INTERACT = { sortable: false, resizable: false, movable: false, filter: false } as const;\n\nexport function selectionColumn<TData = any>(overrides: Partial<ColDef<TData>> = {}): ColDef<TData> {\n return {\n colId: \"sel\",\n headerName: \"\",\n width: 46,\n pinned: \"left\",\n checkboxSelection: true,\n ...NO_INTERACT,\n ...overrides\n };\n}\n\nexport function indexColumn<TData = any>(overrides: Partial<ColDef<TData>> = {}): ColDef<TData> {\n return {\n colId: \"idx\",\n headerName: \"#\",\n type: \"index\",\n width: 60,\n pinned: \"left\",\n ...NO_INTERACT,\n ...overrides\n };\n}\n\nexport function dragColumn<TData = any>(overrides: Partial<ColDef<TData>> = {}): ColDef<TData> {\n return {\n colId: \"drag\",\n headerName: \"\",\n rowDrag: true,\n width: 40,\n ...NO_INTERACT,\n ...overrides\n };\n}\n\nexport function actionsColumn<TData = any>(\n config: ActionButtonsConfig & { width?: number; pinned?: \"left\" | \"right\" } = { actions: [] }\n): ColDef<TData> {\n const { width, pinned, ...rendererConfig } = config;\n const btnCount = Math.min(rendererConfig.actions?.length ?? 0, rendererConfig.max ?? 3);\n const defaultWidth = Math.max(1, btnCount) * 26 + ((rendererConfig.actions?.length ?? 0) > btnCount ? 26 : 0) + 10;\n return {\n colId: \"op\",\n headerName: \"操作\",\n width: width ?? Math.max(64, defaultWidth),\n pinned: pinned ?? \"right\",\n cellRenderer: createActionButtonsRenderer(rendererConfig as ActionButtonsConfig),\n ...NO_INTERACT,\n cellRendererParams: undefined\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAU;AAAA,EACV,SAAW;AAAA,EACX,UAAY;AAAA,EACZ,MAAQ;AAAA,IACN,KAAO;AAAA,EACT;AAAA,EACA,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,EACR,MAAQ;AAAA,EACR,QAAU;AAAA,EACV,OAAS;AAAA,EACT,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AAAA,EACA,eAAiB;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,KAAK;AAAA,MACH,QAAU;AAAA,QACR,OAAS;AAAA,QACT,SAAW;AAAA,MACb;AAAA,MACA,SAAW;AAAA,QACT,OAAS;AAAA,QACT,SAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,2BAA2B;AAAA,MACzB,OAAS;AAAA,MACT,SAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP;AAAA,IACA;AAAA,EACF;AAAA,EACA,aAAe;AAAA,IACb;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,iBAAiB;AAAA,EACnB;AACF;;;AC5DO,IAAM,WAAN,MAA6D;AAAA,EAGlE,YAAoB,iBAA0E;AAA1E;AAFpB,SAAQ,YAAY,oBAAI,IAA2C;AAAA,EAE4B;AAAA,EAE/F,GAAgC,MAAS,UAA4C;AACnF,QAAI,MAAM,KAAK,UAAU,IAAI,IAAI;AACjC,QAAI,CAAC,KAAK;AACR,YAAM,oBAAI,IAAI;AACd,WAAK,UAAU,IAAI,MAAM,GAAG;AAAA,IAC9B;AACA,QAAI,IAAI,QAAyB;AACjC,WAAO,MAAM;AACX,UAAK,OAAO,QAAQ;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,KAAkC,MAAS,UAA4C;AACrF,UAAM,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU;AACnC,UAAI;AACJ,eAAS,KAAK;AAAA,IAChB,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,IAAiC,MAAS,UAAsC;AAC9E,UAAM,MAAM,KAAK,UAAU,IAAI,IAAI;AACnC,QAAI,KAAK;AACP,UAAI,OAAO,QAAyB;AACpC,UAAI,IAAI,SAAS,EAAG,MAAK,UAAU,OAAO,IAAI;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,KAAkC,MAAS,SAA4B;AACrE,UAAM,MAAM,KAAK,UAAU,IAAI,IAAI;AACnC,QAAI,CAAC,IAAK;AACV,eAAW,YAAY,CAAC,GAAG,GAAG,GAAG;AAC/B,UAAI;AACF,iBAAS,OAAO;AAAA,MAClB,SAAS,KAAK;AACZ,gBAAQ,MAAM,0BAA0B,IAAI,cAAc,GAAG;AAC7D,aAAK,kBAAkB,KAAK,IAAI;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAc;AACZ,SAAK,UAAU,MAAM;AAAA,EACvB;AACF;;;ACjDO,IAAM,kBAAmC;AAAA,EAC9C,UAAU;AAAA,EACV,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AACZ;AASO,IAAM,oBAAsD;AAAA,EACjE,SAAS,EAAE,WAAW,IAAI,cAAc,IAAI,UAAU,IAAI,aAAa,EAAE;AAAA,EACzE,QAAQ,EAAE,WAAW,IAAI,cAAc,IAAI,UAAU,IAAI,aAAa,EAAE;AAAA,EACxE,OAAO,EAAE,WAAW,IAAI,cAAc,IAAI,UAAU,IAAI,aAAa,GAAG;AAC1E;AAEA,SAAS,cAAc,OAAgB,UAAkB,KAAa,UAAU,OAAe;AAC7F,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,IAAK,QAAO;AAChF,SAAO,UAAU,KAAK,MAAM,KAAK,IAAI;AACvC;AAEO,SAAS,eAAsB,aAA6D;AACjG,QAAM,OAAiB,YAAY,QAAQ,OAAO,UAAU,eAAe,KAAK,mBAAmB,YAAY,IAAI,IAC/G,YAAY,OACZ;AACJ,QAAM,SAAS,kBAAkB,IAAI;AACrC,QAAM,WAAW;AAAA,IACf,OAAO,YAAY,eAAe,WAAW,YAAY,WAAW,WAAW;AAAA,IAC/E;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,qBAAqB,OAAO,YAAY,eAAe,YAAY,MAAM,QAAQ,YAAY,WAAW,eAAe,IACzH,YAAY,WAAW,kBACvB;AACJ,QAAM,kBAAkB,qBACpB,CAAC,GAAG,IAAI,IAAI,mBAAmB,IAAI,CAAC,UAAU,cAAc,OAAO,GAAG,GAAG,IAAI,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC,IAChG,CAAC,IAAI,IAAI,IAAI,GAAG;AACpB,MAAI,CAAC,gBAAgB,SAAS,QAAQ,EAAG,iBAAgB,KAAK,QAAQ;AACtE,kBAAgB,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAEpC,QAAM,WAAuC;AAAA,IAC3C,YAAY,MAAM,QAAQ,YAAY,UAAU,IAAI,YAAY,aAAa,CAAC;AAAA,IAC9E,SAAS,MAAM,QAAQ,YAAY,OAAO,IAAI,YAAY,UAAU,CAAC;AAAA,IACrE,eAAe,EAAE,GAAG,iBAAiB,GAAI,YAAY,iBAAiB,CAAC,EAAG;AAAA,IAC1E,WAAW,cAAc,YAAY,WAAW,OAAO,WAAW,CAAC;AAAA,IACnE,cAAc,cAAc,YAAY,cAAc,OAAO,cAAc,CAAC;AAAA,IAC5E,WAAW,cAAc,YAAY,WAAW,GAAG,GAAG,IAAI;AAAA,IAC1D,cAAc,YAAY,iBAAiB,YAAY,YAAY,iBAAiB,aAChF,YAAY,eACZ;AAAA,IACJ,WAAW,YAAY,aAAa;AAAA,IACpC;AAAA,IACA,aAAa,YAAY,eAAe;AAAA,IACxC,iBAAiB,YAAY,mBAAmB;AAAA,IAChD,OAAO,YAAY,UAAU,WAAW,YAAY,UAAU,UAAU,YAAY,UAAU,SAC1F,YAAY,QACX,YAAY,WAAW,SAAS,iBAAiB,IAAI,SAAS;AAAA,IACnE,iBAAiB,YAAY,mBAAmB;AAAA,IAChD,cAAc,YAAY,gBAAgB;AAAA,IAC1C,iBAAiB,cAAc,YAAY,iBAAiB,KAAK,CAAC;AAAA,IAClE,oBAAoB,YAAY,sBAAsB;AAAA,IACtD,YAAY,YAAY,cAAc;AAAA,IACtC,gBAAgB,YAAY,kBAAkB;AAAA,IAC9C,QAAQ,YAAY,UAAU,CAAC;AAAA,IAC/B,iBAAiB,YAAY,mBAAmB;AAAA,IAChD,eAAe,YAAY,iBAAiB;AAAA,IAC5C,iBAAiB,YAAY,mBAAmB;AAAA,IAChD,aAAa,YAAY,eAAe;AAAA,IACxC,UAAU,YAAY,YAAY;AAAA,IAClC,aAAa,YAAY,eAAe;AAAA,IACxC,qBAAqB,YAAY,uBAAuB;AAAA,IACxD,kBAAkB,YAAY,oBAAoB;AAAA,IAClD,aAAa,YAAY,eAAe;AAAA,IACxC,cAAc,YAAY,gBAAgB;AAAA,IAC1C,eAAe,cAAc,YAAY,eAAe,KAAK,GAAG,IAAI;AAAA,IACpE,kBAAkB,MAAM,QAAQ,YAAY,gBAAgB,IAAI,YAAY,mBAAmB,CAAC;AAAA,IAChG,qBAAqB,MAAM,QAAQ,YAAY,mBAAmB,IAAI,YAAY,sBAAsB,CAAC;AAAA,IACzG,mBACE,YAAY,eAAe,SAAS,YAAY,cAAc,OAAO,OAAO;AAAA,IAC9E,oBAAoB;AAAA,IACpB,2BAA2B;AAAA,IAC3B,qBACE,OAAO,YAAY,eAAe,WAC9B,YAAY,WAAW,cAAc,QACrC;AAAA,IACN,4BACE,OAAO,YAAY,eAAe,WAC9B,YAAY,WAAW,yBAAyB,QAChD;AAAA,IACN,kBAAkB,YAAY,aAAa,QAAQ,YAAY,cAAc;AAAA,IAC7E,iBACE,YAAY,aAAa,QAAQ,YAAY,cAAc,QACvD,OACA,YAAY,cAAc,OACxB,EAAE,MAAM,YAAY,IACpB,YAAY;AAAA,IACpB,kBAAkB,YAAY,oBAAoB;AAAA,IAClD,sBAAsB,YAAY,wBAAwB;AAAA,IAC1D,mBAAmB,YAAY,qBAAqB;AAAA,IACpD,aAAa,YAAY,eAAe;AAAA,IACxC,kBAAkB,cAAc,YAAY,kBAAkB,KAAK,CAAC;AAAA,IACpE,YAAY,YAAY,cAAc;AAAA,IACtC,YAAY,YAAY,cAAc;AAAA,IACtC,kBAAkB,YAAY,cAAc,QAAS,OAAO,YAAY,cAAc,YAAY,YAAY,aAAa;AAAA,IAC3H,iBACE,OAAO,YAAY,cAAc,YAAY,YAAY,WAAW,SAChE,YAAY,UAAU,SACtB,CAAC,YAAY,oBAAoB,gBAAgB;AAAA,IACvD,WAAW,cAAc,YAAY,WAAW,KAAK,GAAG,IAAI;AAAA,IAC5D,oBAAoB,cAAc,YAAY,oBAAoB,IAAI,GAAG,IAAI;AAAA,IAC7E,mBAAmB,YAAY,qBAAqB;AAAA,IACpD,2BAA2B,YAAY,6BAA6B;AAAA,IACpE,uBAAuB,YAAY,yBAAyB;AAAA,IAC5D,qBAAqB,YAAY,uBAAuB;AAAA,IACxD,SAAS,YAAY,WAAW;AAAA,IAChC,uBAAuB,YAAY,yBAAyB;AAAA,IAC5D,wBAAwB,YAAY,0BAA0B;AAAA,IAC9D,wBAAwB,YAAY,0BAA0B;AAAA,IAC9D,WAAW,YAAY,aAAa;AAAA,IACpC,UAAU,MAAM,QAAQ,YAAY,QAAQ,IAAI,YAAY,WAAW,CAAC;AAAA,EAC1E;AAEA,MAAI,YAAY,SAAU,UAAS,WAAW,YAAY;AAC1D,MAAI,YAAY,kBAAmB,UAAS,oBAAoB,YAAY;AAC5E,MAAI,YAAY,gBAAiB,UAAS,kBAAkB,YAAY;AACxE,MAAI,YAAY,iBAAkB,UAAS,mBAAmB,YAAY;AAC1E,MAAI,YAAY,SAAU,UAAS,WAAW,YAAY;AAC1D,MAAI,YAAY,WAAY,UAAS,aAAa,YAAY;AAC9D,MAAI,YAAY,cAAe,UAAS,gBAAgB,YAAY;AACpE,MAAI,YAAY,WAAY,UAAS,aAAa,YAAY;AAC9D,MAAI,YAAY,aAAc,UAAS,eAAe,YAAY;AAClE,MAAI,YAAY,iBAAkB,UAAS,mBAAmB,YAAY;AAC1E,MAAI,YAAY,oBAAqB,UAAS,sBAAsB,YAAY;AAEhF,aAAW,OAAO,OAAO,KAAK,WAAW,GAAmC;AAC1E,QAAI,IAAI,WAAW,IAAI,KAAK,OAAO,YAAY,GAAG,MAAM,YAAY;AAClE,aAAO,OAAO,UAAU,EAAE,CAAC,GAAG,GAAG,YAAY,GAAG,EAAE,CAAC;AAAA,IACrD;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,YAAmB,QAAuB,UAAiD;AACzG,SAAO,EAAE,GAAG,UAAU,GAAG,OAAO;AAClC;;;ACvJO,IAAM,SAAN,MAA0B;AAAA,EAW/B,YAAY,IAAY,QAAuB;AAN/C,uBAA6B;AAC7B,wBAAe;AACf,uBAAyC;AACzC,iBAAQ;AACR,0BAAiB;AAGf,SAAK,KAAK;AACV,SAAK,SAAS;AACd,SAAK,OAAO,OAAO,QAAQ;AAC3B,UAAM,IAAI,OAAO;AACjB,SAAK,SAAS,MAAM,OAAO,SAAS,MAAM,SAAS,KAAK,OAAO,OAAO;AAAA,EACxE;AAAA,EAEA,IAAI,WAAoB;AACtB,WAAO,KAAK,OAAO,aAAa;AAAA,EAClC;AAAA,EAEA,IAAI,YAAqB;AACvB,WAAO,KAAK,OAAO,cAAc;AAAA,EACnC;AAAA,EAEA,IAAI,UAAmB;AACrB,WAAO,KAAK,OAAO,YAAY;AAAA,EACjC;AAAA,EAEA,IAAI,aAAsB;AACxB,WAAO,KAAK,OAAO,UAAU,QAAQ,KAAK,OAAO,WAAW;AAAA,EAC9D;AAAA,EAEA,IAAI,aAAyB;AAC3B,UAAM,IAAI,KAAK,OAAO;AACtB,WAAO,MAAM,OAAO,SAAU,KAAoB;AAAA,EACpD;AAAA,EAEA,IAAI,cAAuB;AACzB,WAAO,KAAK,OAAO,sBAAsB;AAAA,EAC3C;AACF;;;AC3CO,IAAM,cAAN,MAAM,aAAyB;AAAA,EAMpC,YAAY,SAAiB,KAAyB;AAHtD,kBAAoC;AACpC,oBAAmD,CAAC;AAGlD,SAAK,UAAU;AACf,SAAK,MAAM;AAAA,EACb;AAAA,EAEA,IAAI,aAAqB;AACvB,WAAO,KAAK,IAAI,cAAc,KAAK,IAAI,WAAW;AAAA,EACpD;AAAA,EAEA,eAAe,MAAuB,CAAC,GAAoB;AACzD,eAAW,SAAS,KAAK,UAAU;AACjC,UAAI,iBAAiB,aAAa,OAAM,eAAe,GAAG;AAAA,UACrD,KAAI,KAAK,KAAK;AAAA,IACrB;AACA,WAAO;AAAA,EACT;AACF;;;AC0JO,SAAS,cAA2B,KAAsD;AAC/F,SAAO,MAAM,QAAS,IAA2B,QAAQ;AAC3D;;;AC9KO,IAAM,uBAAuB;AAC7B,IAAM,oBAAoB;AAE1B,SAAS,WAAW,GAAW,OAA2B;AAC/D,QAAM,MAAM,MAAM,YAAY;AAC9B,QAAM,MAAM,MAAM,YAAY,OAAO;AACrC,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,CAAC;AACvC;AAEO,SAAS,oBAAoB,MAAoB,gBAAkC;AACxF,QAAM,SAAS,KAAK,IAAI,CAAC,MAAM,WAAW,EAAE,SAAS,sBAAsB,CAAC,CAAC;AAE7E,QAAM,WAAqB,CAAC;AAC5B,MAAI,YAAY;AAChB,OAAK,QAAQ,CAAC,GAAG,MAAM;AACrB,UAAM,IAAI,EAAE,QAAQ;AACpB,QAAI,IAAI,GAAG;AACT,eAAS,KAAK,CAAC;AACf,mBAAa;AAAA,IACf;AAAA,EACF,CAAC;AAED,MAAI,QAAQ;AACZ,aAAW,KAAK,OAAQ,UAAS;AAEjC,MAAI,YAAY,KAAK,iBAAiB,OAAO;AAC3C,QAAI,QAAQ,iBAAiB;AAC7B,aAAS,OAAO,GAAG,OAAO,KAAK,QAAQ,OAAO,SAAS,SAAS,GAAG,QAAQ;AACzE,YAAM,gBAA0B,CAAC;AACjC,UAAI,iBAAiB;AACrB,iBAAW,KAAK,UAAU;AACxB,cAAM,IAAI,KAAK,CAAC,EAAE,QAAQ;AAC1B,sBAAc,KAAK,CAAC;AACpB,0BAAkB;AAAA,MACpB;AACA,YAAM,WAAqB,CAAC;AAC5B,eAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,cAAM,IAAI,cAAc,CAAC;AACzB,cAAM,IAAI,KAAK,CAAC,EAAE,QAAQ;AAC1B,cAAM,QAAS,QAAQ,IAAK;AAC5B,cAAM,SAAS,OAAO,CAAC;AACvB,eAAO,CAAC,IAAI,WAAW,SAAS,OAAO,KAAK,CAAC,CAAC;AAC9C,iBAAS,KAAK,OAAO,CAAC,IAAI,MAAM;AAAA,MAClC;AACA,UAAI,OAAO;AACX,iBAAW,KAAK,SAAU,SAAQ;AAClC,eAAS;AACT,YAAM,gBAAgB,cAAc,OAAO,CAAC,QAAQ,MAAM,SAAS,CAAC,IAAI,IAAK;AAC7E,UAAI,cAAc,WAAW,cAAc,OAAQ;AACnD,eAAS,SAAS;AAClB,iBAAW,KAAK,cAAe,UAAS,KAAK,CAAC;AAAA,IAChD;AAAA,EACF;AAEA,SAAO;AACT;;;AC5CO,IAAM,uBAAuB;AAG7B,IAAM,cAAN,MAAkB;AAAA,EAYvB,YAAoB,MAA0B;AAA1B;AAXpB,SAAQ,UAAoB,CAAC;AAC7B,SAAQ,eAAmD,CAAC;AAC5D,SAAQ,OAAiB,CAAC;AAC1B,SAAQ,SAAmB,CAAC;AAC5B,SAAQ,QAAkB,CAAC;AAC3B,SAAQ,YAA6B,CAAC;AACtC,SAAQ,OAA6B,CAAC;AACtC,SAAQ,cAAc;AACtB,SAAQ,gBAAgB,oBAAI,IAAoB;AAChD,yBAAgB;AAAA,EAE+B;AAAA,EAE/C,cAAc,SAAwD;AACpE,SAAK,OAAO,UAAU,CAAC,GAAG,OAAO,IAAI,CAAC;AACtC,UAAM,OAAO,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACvD,UAAM,WAAW,KAAK,KAAK,QAAQ;AACnC,UAAM,UAAU,IAAI;AAAA,MAClB,KAAK,KAAK,QAAQ,gBAAgB,KAAK,KAAK,QAAQ,qBAChD,CAAC,oBAAoB,IACrB,CAAC;AAAA,IACP;AAEA,UAAM,QAAQ,CAAC,MAA4B,QAAiC,UAC1E,KAAK,IAAI,CAAC,KAAK,MAAM;AACnB,UAAI,cAAc,GAAG,GAAG;AACtB,cAAM,UAAU,IAAI,WAAW,IAAI,cAAc,SAAS,CAAC,IAAI,KAAK;AACpE,cAAM,QAAQ,IAAI,YAAY,SAAS,GAAG;AAC1C,cAAM,SAAS;AACf,cAAM,WAAW,MAAM,IAAI,UAAU,OAAO,QAAQ,CAAC;AACrD,eAAO;AAAA,MACT;AACA,YAAM,SAAS;AACf,YAAM,KAAK,OAAO,SAAS,OAAO,SAAS,OAAO,CAAC;AACnD,UAAI,WAAW;AACf,UAAI,SAAS;AACb,aAAO,QAAQ,IAAI,QAAQ,EAAG,YAAW,GAAG,EAAE,IAAI,QAAQ;AAC1D,cAAQ,IAAI,QAAQ;AACpB,YAAM,SAAS,IAAI,OAAO,UAAU,YAAY,QAAQ,QAAQ,CAAC;AACjE,aAAO,cAAc;AACrB,aAAO,QAAQ;AACf,YAAM,IAAI,KAAK,IAAI,QAAQ;AAC3B,UAAI,GAAG;AACL,eAAO,cAAc,EAAE;AACvB,eAAO,OAAO,EAAE;AAChB,eAAO,SAAS,EAAE;AAAA,MACpB;AACA,aAAO;AAAA,IACT,CAAC;AAEH,SAAK,eAAe,MAAM,KAAK,MAAM,MAAM,CAAC;AAE5C,QAAI,KAAK,KAAK,QAAQ,gBAAgB,KAAK,KAAK,QAAQ,oBAAoB;AAC1E,YAAM,YAAY,IAAI,OAAO,sBAAsB;AAAA,QACjD,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,WAAW;AAAA,QACX,SAAS;AAAA,QACT,QAAQ;AAAA,MACV,CAAC;AACD,gBAAU,iBAAiB;AAC3B,WAAK,aAAa,QAAQ,SAAS;AAAA,IACrC;AAEA,SAAK,UAAU,KAAK,cAAc,KAAK,YAAY;AACnD,SAAK,cAAc,KAAK,QAAQ,OAAO,CAAC,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC;AAEhF,SAAK,YAAY,KAAK,UAAU,OAAO,CAAC,MAAM,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;AACxF,QAAI,KAAK,UAAU,WAAW,GAAG;AAC/B,YAAM,UAA2B,CAAC;AAClC,iBAAW,KAAK,KAAK,SAAS;AAC5B,YAAI,EAAE,OAAO,YAAa,SAAQ,KAAK,EAAE,OAAO,EAAE,IAAI,WAAW,EAAE,OAAO,YAAY,CAAC;AAAA,MACzF;AACA,WAAK,YAAY;AAAA,IACnB;AAEA,SAAK,QAAQ;AAAA,EACf;AAAA,EAEQ,cAAc,UAA8C,MAAqB,CAAC,GAAkB;AAC1G,eAAW,SAAS,UAAU;AAC5B,UAAI,iBAAiB,YAAa,MAAK,cAAc,MAAM,UAAU,GAAG;AAAA,UACnE,KAAI,KAAK,KAAK;AAAA,IACrB;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,UAAgB;AACtB,UAAM,UAAU,KAAK,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI;AAClD,SAAK,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM;AACrD,SAAK,QAAQ,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO;AACvD,SAAK,SAAS,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,IAAI;AACrD,SAAK,cAAc,MAAM;AACzB,SAAK,kBAAkB,EAAE,QAAQ,CAAC,GAAG,MAAM,KAAK,cAAc,IAAI,EAAE,IAAI,CAAC,CAAC;AAAA,EAC5E;AAAA,EAEA,aAAa,OAAuB;AAClC,WAAO,KAAK,cAAc,IAAI,KAAK,KAAK;AAAA,EAC1C;AAAA,EAEA,aAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,gBAAsC;AACpC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,kBAAsD;AACpD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,iBAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAU,OAAmC;AAC3C,WAAO,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AAAA,EAChD;AAAA,EAEA,eAAe,MAA0B;AACvC,WAAO,SAAS,SAAS,KAAK,OAAO,SAAS,UAAU,KAAK,QAAQ,KAAK;AAAA,EAC5E;AAAA,EAEA,oBAA8B;AAC5B,WAAO,CAAC,GAAG,KAAK,MAAM,GAAG,KAAK,QAAQ,GAAG,KAAK,KAAK;AAAA,EACrD;AAAA,EAEA,qBAA+B;AAC7B,WAAO,KAAK,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,aAAa,IAAI;AAAA,EAC1E;AAAA,EAEA,gBAA0B;AACxB,WAAO,KAAK,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,WAAW,QAAQ,EAAE,OAAO,aAAa,IAAI;AAAA,EACtG;AAAA,EAEA,aAAsB;AACpB,WAAO,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW,IAAI;AAAA,EACzD;AAAA,EAEA,sBAA0C;AACxC,UAAM,UAAU,KAAK,kBAAkB;AACvC,WACE,KAAK,OAAO,KAAK,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,EAAE,cAAc,KAC3D,QAAQ,KAAK,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,EAAE,cAAc,KACvD,QAAQ,CAAC;AAAA,EAEb;AAAA,EAEA,OAAO,QAA0B;AAC/B,WAAO,OAAO,WAAW,SAAS,SAAS,OAAO,WAAW,UAAU,UAAU;AAAA,EACnF;AAAA,EAEA,cAAc,eAA6B;AACzC,SAAK,gBAAgB;AAErB,QAAI,cAAc;AAClB,eAAW,KAAK,CAAC,GAAG,KAAK,MAAM,GAAG,KAAK,KAAK,GAAG;AAC7C,QAAE,eAAe,WAAW,EAAE,eAAe,EAAE,OAAO,SAAS,sBAAsB,KAAK,aAAa,CAAC,CAAC;AACzG,qBAAe,EAAE;AAAA,IACnB;AAEA,UAAM,eAAe,KAAK,OAAO,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;AAChE,UAAM,YAAY,KAAK,IAAI,GAAG,gBAAgB,WAAW;AACzD,UAAM,SAAS,oBAAoB,cAAc,SAAS;AAC1D,SAAK,OAAO,QAAQ,CAAC,GAAG,MAAM;AAC5B,QAAE,eAAe,OAAO,CAAC;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EAEQ,aAAa,GAAoF;AACvG,UAAM,MAAM,EAAE;AACd,QAAI,EAAE,eAAe,MAAM;AACzB,aAAO,EAAE,OAAO,EAAE,aAAa,UAAU,IAAI,UAAU,UAAU,IAAI,SAAS;AAAA,IAChF;AACA,WAAO,EAAE,OAAO,IAAI,OAAO,UAAU,IAAI,UAAU,UAAU,IAAI,UAAU,MAAM,IAAI,KAAK;AAAA,EAC5F;AAAA,EAEA,eAAe,QAAgB,OAAqB;AAClD,WAAO,cAAc,WAAW,OAAO,KAAK,aAAa,MAAM,CAAC;AAAA,EAClE;AAAA,EAEA,oBAAoB,OAAe,SAAwB;AACzD,UAAM,SAAS,KAAK,UAAU,KAAK;AACnC,QAAI,CAAC,UAAU,OAAO,SAAS,CAAC,QAAS;AACzC,WAAO,OAAO,CAAC;AACf,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,WAAW,OAAe,SAA0B;AAClD,UAAM,SAAS,KAAK,UAAU,KAAK;AACnC,QAAI,CAAC,OAAQ,QAAO;AAEpB,UAAM,OAAO,KAAK,OAAO,MAAM;AAC/B,UAAM,UAAU,CAAC,UACf,OAAO,cAAc,OAAO,KAAK,OAAO,KAAK,MAAM;AAErD,UAAM,YAAgD,OAAO,cACzD,OAAO,YAAY,WACnB,KAAK;AAET,UAAM,WAAW,UAAU;AAAA,MACzB,CAAC,UAAgC,iBAAiB,UAAU,CAAC,MAAM,QAAQ,QAAQ,KAAK;AAAA,IAC1F;AACA,UAAM,OAAO,SAAS,QAAQ,MAAM;AACpC,QAAI,OAAO,EAAG,QAAO;AACrB,aAAS,OAAO,MAAM,CAAC;AACvB,UAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,SAAS,MAAM,CAAC;AAC7D,aAAS,OAAO,QAAQ,GAAG,MAAM;AAEjC,UAAM,YAAsB,CAAC;AAC7B,cAAU,QAAQ,CAAC,OAAO,QAAQ;AAChC,UAAI,iBAAiB,UAAU,CAAC,MAAM,QAAQ,QAAQ,KAAK,EAAG,WAAU,KAAK,GAAG;AAAA,IAClF,CAAC;AACD,QAAI,UAAU,WAAW,SAAS,OAAQ,QAAO;AACjD,cAAU,QAAQ,CAAC,SAAS,MAAM;AAChC,gBAAU,OAAO,IAAI,SAAS,CAAC;AAAA,IACjC,CAAC;AAED,SAAK,UAAU,KAAK,cAAc,KAAK,YAAY;AACnD,SAAK,QAAQ;AACb,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,OAAe,QAAsC;AACnE,UAAM,SAAS,KAAK,UAAU,KAAK;AACnC,QAAI,CAAC,OAAQ;AACb,WAAO,SAAS;AAChB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,iBAAgC;AAC9B,WAAO,KAAK,QAAQ,IAAI,CAAC,MAAM;AAC7B,YAAM,YAAY,KAAK,UAAU,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE;AAClE,YAAM,QAAqB;AAAA,QACzB,OAAO,EAAE;AAAA,QACT,MAAM,EAAE;AAAA,QACR,OAAO,EAAE,eAAe,EAAE;AAAA,QAC1B,QAAQ,EAAE;AAAA,MACZ;AACA,UAAI,aAAa,GAAG;AAClB,cAAM,OAAO,KAAK,UAAU,SAAS,EAAE;AACvC,cAAM,YAAY;AAAA,MACpB,OAAO;AACL,cAAM,OAAO;AACb,cAAM,YAAY;AAAA,MACpB;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,iBAAiB,QAA6B;AAC5C,UAAM,YAAY,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACzD,eAAW,KAAK,KAAK,SAAS;AAC5B,YAAM,IAAI,UAAU,IAAI,EAAE,EAAE;AAC5B,UAAI,CAAC,EAAG;AACR,UAAI,EAAE,QAAQ,KAAM,GAAE,OAAO,EAAE;AAC/B,UAAI,EAAE,SAAS,KAAM,GAAE,cAAc,EAAE;AACvC,UAAI,EAAE,WAAW,OAAW,GAAE,SAAS,EAAE;AAAA,IAC3C;AACA,UAAM,WAA6E,CAAC;AACpF,eAAW,KAAK,QAAQ;AACtB,UAAI,EAAE,QAAQ,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,GAAG;AACxD,iBAAS,KAAK,EAAE,OAAO,EAAE,OAAO,WAAW,EAAE,MAAM,WAAW,EAAE,aAAa,EAAE,CAAC;AAAA,MAClF;AAAA,IACF;AACA,aAAS,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AACjD,SAAK,YAAY,SAAS,IAAI,CAAC,EAAE,OAAO,UAAU,OAAO,EAAE,OAAO,UAAU,EAAE;AAC9E,SAAK,gBAAgB,MAAM;AAC3B,SAAK,QAAQ;AAAA,EACf;AAAA,EAEQ,gBAAgB,QAA6B;AACnD,UAAM,YAAY,oBAAI,IAAoB;AAC1C,WAAO,QAAQ,CAAC,GAAG,MAAM,UAAU,IAAI,EAAE,OAAO,CAAC,CAAC;AAClD,UAAM,YAAY,CAAC,MAAe,EAAE,WAAW,SAAS,SAAS,EAAE,WAAW,UAAU,UAAU;AAElG,eAAW,QAAQ,CAAC,QAAQ,UAAU,OAAO,GAAiB;AAC5D,YAAM,UAAU,KAAK,aAAa;AAAA,QAChC,CAAC,UACC,iBAAiB,UAAU,CAAC,MAAM,QAAQ,MAAM,gBAAgB,QAAQ,UAAU,KAAK,MAAM;AAAA,MACjG;AACA,UAAI,QAAQ,SAAS,EAAG;AACxB,YAAM,SAAS,QACZ,MAAM,EACN,KAAK,CAAC,GAAG,OAAO,UAAU,IAAI,EAAE,EAAE,KAAK,OAAO,qBAAqB,UAAU,IAAI,EAAE,EAAE,KAAK,OAAO,iBAAiB;AACrH,UAAI,OAAO,MAAM,CAAC,GAAG,MAAM,MAAM,QAAQ,CAAC,CAAC,EAAG;AAE9C,YAAM,QAAkB,CAAC;AACzB,WAAK,aAAa,QAAQ,CAAC,OAAO,QAAQ;AACxC,YAAI,iBAAiB,UAAU,CAAC,MAAM,QAAQ,MAAM,gBAAgB,QAAQ,UAAU,KAAK,MAAM,MAAM;AACrG,gBAAM,KAAK,GAAG;AAAA,QAChB;AAAA,MACF,CAAC;AACD,YAAM,QAAQ,CAAC,SAAS,MAAM;AAC5B,aAAK,aAAa,OAAO,IAAI,OAAO,CAAC;AAAA,MACvC,CAAC;AAAA,IACH;AACA,SAAK,UAAU,KAAK,cAAc,KAAK,YAAY;AAAA,EACrD;AAAA,EAEA,mBAAyB;AACvB,eAAW,KAAK,KAAK,SAAS;AAC5B,QAAE,cAAc;AAChB,QAAE,OAAO,EAAE,OAAO,QAAQ;AAC1B,YAAM,IAAI,EAAE,OAAO;AACnB,QAAE,SAAS,MAAM,OAAO,SAAS,MAAM,SAAS,KAAK,OAAO,OAAO;AAAA,IACrE;AACA,SAAK,YAAY,CAAC;AAClB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,eAA0B;AACxB,WAAO,KAAK,UAAU,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;AAAA,EAC7C;AAAA,EAEA,eAAe,WAAmC;AAChD,QAAI,CAAC,aAAa,UAAU,WAAW,GAAG;AACxC,WAAK,YAAY,CAAC;AAClB;AAAA,IACF;AACA,SAAK,YAAY,UACd,OAAO,CAAC,MAAM,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,cAAc,SAAS,EAAE,cAAc,OAAO,EAC7G,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,WAAW,EAAE,UAAU,EAAE;AAAA,EAC5D;AAAA,EAEA,UAAU,QAAgB,UAAyB;AACjD,UAAM,QAAQ,CAAC,GAAG,KAAK,SAAS;AAChC,UAAM,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,UAAU,OAAO,EAAE;AACxD,UAAM,UAAU,OAAO,IAAI,MAAM,GAAG,EAAE,YAAY;AAClD,UAAM,OAA6B,YAAY,OAAO,QAAQ,YAAY,QAAQ,SAAS;AAC3F,UAAM,QAAQ,YAAY,KAAK,KAAK,QAAQ;AAE5C,QAAI,OAAO;AACT,UAAI,SAAS,MAAM;AACjB,YAAI,OAAO,EAAG,OAAM,OAAO,KAAK,CAAC;AAAA,MACnC,WAAW,OAAO,GAAG;AACnB,cAAM,GAAG,IAAI,EAAE,OAAO,OAAO,IAAI,WAAW,KAAK;AAAA,MACnD,OAAO;AACL,cAAM,KAAK,EAAE,OAAO,OAAO,IAAI,WAAW,KAAK,CAAC;AAAA,MAClD;AAAA,IACF,OAAO;AACL,YAAM,SAAS;AACf,UAAI,KAAM,OAAM,KAAK,EAAE,OAAO,OAAO,IAAI,WAAW,KAAK,CAAC;AAAA,IAC5D;AACA,SAAK,YAAY;AAAA,EACnB;AACF;;;AChXA,SAAS,OAAO,OAAoB;AAClC,SAAO,SAAS,OAAO,KAAK,OAAO,KAAK,EAAE,YAAY;AACxD;AAEO,SAAS,mBAAmB,OAAY,YAAmC,UAAiC;AACjH,QAAM,IAAI,OAAO,KAAK;AACtB,QAAM,UAAU,WAAW,IAAI,CAAC,MAAM;AACpC,UAAM,MAAM,EAAE,SAAS,IAAI,YAAY;AACvC,YAAQ,EAAE,OAAO;AAAA,MACf,KAAK;AACH,eAAO,EAAE,SAAS,EAAE;AAAA,MACtB,KAAK;AACH,eAAO,CAAC,EAAE,SAAS,EAAE;AAAA,MACvB,KAAK;AACH,eAAO,MAAM;AAAA,MACf,KAAK;AACH,eAAO,MAAM;AAAA,MACf,KAAK;AACH,eAAO,EAAE,WAAW,EAAE;AAAA,MACxB,KAAK;AACH,eAAO,EAAE,SAAS,EAAE;AAAA,MACtB,KAAK;AACH,eAAO,MAAM;AAAA,MACf,KAAK;AACH,eAAO,MAAM;AAAA,MACf;AACE,eAAO;AAAA,IACX;AAAA,EACF,CAAC;AACD,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,SAAO,aAAa,OAAO,QAAQ,KAAK,OAAO,IAAI,QAAQ,MAAM,OAAO;AAC1E;AAEO,SAAS,qBAAqB,OAAY,YAAqC,UAAiC;AACrH,QAAM,UAAU,WAAW,IAAI,CAAC,MAAM;AACpC,UAAM,UAAU,SAAS,QAAQ,UAAU;AAC3C,QAAI,EAAE,UAAU,QAAS,QAAO;AAChC,QAAI,EAAE,UAAU,WAAY,QAAO,CAAC;AACpC,QAAI,QAAS,QAAO;AACpB,UAAM,IAAI,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAC1D,QAAI,MAAM,CAAC,EAAG,QAAO;AACrB,UAAM,IAAI,EAAE;AACZ,QAAI,KAAK,QAAQ,MAAM,CAAW,EAAG,QAAO;AAC5C,YAAQ,EAAE,OAAO;AAAA,MACf,KAAK;AACH,eAAO,MAAM;AAAA,MACf,KAAK;AACH,eAAO,MAAM;AAAA,MACf,KAAK;AACH,eAAO,IAAI;AAAA,MACb,KAAK;AACH,eAAO,KAAK;AAAA,MACd,KAAK;AACH,eAAO,IAAI;AAAA,MACb,KAAK;AACH,eAAO,KAAK;AAAA,MACd,KAAK;AACH,eAAO,KAAK,KAAK,MAAM,EAAE,UAAU;AAAA,MACrC;AACE,eAAO;AAAA,IACX;AAAA,EACF,CAAC;AACD,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,SAAO,aAAa,OAAO,QAAQ,KAAK,OAAO,IAAI,QAAQ,MAAM,OAAO;AAC1E;AAEA,SAAS,OAAO,OAA2B;AACzC,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,MAAI,iBAAiB,KAAM,QAAO,MAAM,MAAM,QAAQ,CAAC,IAAI,OAAO,MAAM,QAAQ;AAChF,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,IAAI,KAAK,MAAM,OAAO,KAAK,CAAC;AAClC,SAAO,MAAM,CAAC,IAAI,OAAO;AAC3B;AAEO,SAAS,mBAAmB,OAAY,YAAmC,UAAiC;AACjH,QAAM,UAAU,WAAW,IAAI,CAAC,MAAM;AACpC,UAAM,UAAU,OAAO,KAAK,KAAK;AACjC,QAAI,EAAE,UAAU,QAAS,QAAO;AAChC,QAAI,EAAE,UAAU,WAAY,QAAO,CAAC;AACpC,QAAI,QAAS,QAAO;AACpB,UAAM,IAAI,OAAO,KAAK;AACtB,UAAM,IAAI,EAAE,SAAS,OAAO,OAAO,EAAE,KAAK,IAAI;AAC9C,QAAI,KAAK,KAAM,QAAO;AACtB,YAAQ,EAAE,OAAO;AAAA,MACf,KAAK;AACH,eAAO,MAAM;AAAA,MACf,KAAK;AACH,eAAO,MAAM;AAAA,MACf,KAAK;AACH,eAAO,IAAI;AAAA,MACb,KAAK;AACH,eAAO,IAAI;AAAA,MACb,KAAK,WAAW;AACd,cAAM,KAAK,EAAE,UAAU,OAAO,OAAO,EAAE,MAAM,IAAI;AACjD,eAAO,MAAM,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK;AAAA,MAC/C;AAAA,MACA;AACE,eAAO;AAAA,IACX;AAAA,EACF,CAAC;AACD,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,SAAO,aAAa,OAAO,QAAQ,KAAK,OAAO,IAAI,QAAQ,MAAM,OAAO;AAC1E;AAEO,SAAS,kBAAkB,OAAY,cAAmD;AAC/F,MAAI,aAAa,WAAW,EAAG,QAAO;AACtC,SAAO,aAAa,KAAK,CAAC,MAAO,KAAK,QAAQ,SAAS,QAAS,MAAM,KAAK;AAC7E;AAEO,SAAS,qBAAqB,OAAY,QAA+B;AAC9E,QAAM,WAAW,OAAO,SAAS,SAAS,OAAO,aAAa,OAAO,OAAO;AAC5E,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,mBAAmB,OAAO,OAAO,YAAY,QAAQ;AAAA,IAC9D,KAAK;AACH,aAAO,qBAAqB,OAAO,OAAO,YAAY,QAAQ;AAAA,IAChE,KAAK;AACH,aAAO,mBAAmB,OAAO,OAAO,YAAY,QAAQ;AAAA,IAC9D,KAAK;AACH,aAAO,kBAAkB,OAAO,OAAO,MAAM;AAAA,IAC/C;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,oBACd,MACA,SACA,aACA,aACA,cACS;AACT,aAAW,SAAS,OAAO,KAAK,WAAW,GAAG;AAC5C,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AACjD,QAAI,CAAC,OAAQ;AACb,UAAM,QAAQ,aAAa,MAAM,MAAM;AACvC,QAAI,CAAC,qBAAqB,OAAO,MAAM,EAAG,QAAO;AAAA,EACnD;AAEA,MAAI,eAAe,YAAY,KAAK,MAAM,IAAI;AAC5C,UAAM,SAAS,YAAY,KAAK,EAAE,YAAY,EAAE,MAAM,KAAK;AAC3D,eAAW,SAAS,QAAQ;AAC1B,YAAM,MAAM,QAAQ,KAAK,CAAC,WAAW,OAAO,aAAa,MAAM,MAAM,CAAC,EAAE,SAAS,KAAK,CAAC;AACvF,UAAI,CAAC,IAAK,QAAO;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;;;ACzJA,IAAM,WAAW,OAAO,SAAS,cAC7B,IAAI,KAAK,SAAS,QAAW,EAAE,SAAS,MAAM,aAAa,OAAO,CAAC,IACnE;AAEG,SAAS,kBAAkB,QAAa,QAAqB;AAClE,QAAM,SAAS,UAAU,QAAQ,WAAW;AAC5C,QAAM,SAAS,UAAU,QAAQ,WAAW;AAC5C,MAAI,UAAU,OAAQ,QAAO;AAC7B,MAAI,OAAQ,QAAO;AACnB,MAAI,OAAQ,QAAO;AAEnB,MAAI,OAAO,WAAW,YAAY,OAAO,WAAW,UAAU;AAC5D,QAAI,MAAM,MAAM,KAAK,MAAM,MAAM,EAAG,QAAO;AAC3C,QAAI,MAAM,MAAM,EAAG,QAAO;AAC1B,QAAI,MAAM,MAAM,EAAG,QAAO;AAC1B,WAAO,SAAS;AAAA,EAClB;AACA,MAAI,kBAAkB,QAAQ,kBAAkB,MAAM;AACpD,WAAO,OAAO,QAAQ,IAAI,OAAO,QAAQ;AAAA,EAC3C;AACA,MAAI,OAAO,WAAW,aAAa,OAAO,WAAW,WAAW;AAC9D,WAAO,WAAW,SAAS,IAAI,SAAS,IAAI;AAAA,EAC9C;AACA,QAAM,IAAI,OAAO,MAAM;AACvB,QAAM,IAAI,OAAO,MAAM;AACvB,SAAO,WAAW,SAAS,QAAQ,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC;AAC9D;;;ACrBO,SAAS,UACd,OACA,WACA,SACA,cACkB;AAClB,QAAM,UAAU,oBAAI,IAAoB;AACxC,aAAW,KAAK,QAAS,SAAQ,IAAI,EAAE,IAAI,CAAC;AAE5C,QAAM,cAAsF,CAAC;AAC7F,QAAM,aAAiC,CAAC;AACxC,aAAW,QAAQ,WAAW;AAC5B,UAAM,SAAS,QAAQ,IAAI,KAAK,KAAK;AACrC,QAAI,CAAC,OAAQ;AACb,gBAAY,KAAK,OAAO,OAAO,cAAc,iBAAiB;AAC9D,eAAW,KAAK,KAAK,SAAS;AAAA,EAChC;AAEA,QAAM,YAAY,MAAM,IAAI,CAAC,UAAU;AAAA,IACrC;AAAA,IACA,QAAQ,UAAU,IAAI,CAAC,MAAM,aAAa,MAAM,QAAQ,IAAI,EAAE,KAAK,CAAE,CAAC;AAAA,EACxE,EAAE;AAEF,YAAU,KAAK,CAAC,GAAG,MAAM;AACvB,aAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,YAAM,IAAI,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI;AACjE,UAAI,MAAM,EAAG,QAAO,WAAW,CAAC,MAAM,QAAQ,IAAI,CAAC;AAAA,IACrD;AACA,WAAO;AAAA,EACT,CAAC;AAED,SAAO,UAAU,IAAI,CAAC,MAAM,EAAE,IAAI;AACpC;;;ACjCA,SAAS,QAAQ,QAAyB;AACxC,SAAO,OAAO,OAAO,CAAC,MAAmB,OAAO,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;AAC7E;AAEO,IAAM,oBAAiD;AAAA,EAC5D,KAAK,CAAC,WAAW,QAAQ,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,MAAM,GAAG,CAAC;AAAA,EAC9D,KAAK,CAAC,WAAW;AACf,UAAM,OAAO,QAAQ,MAAM;AAC3B,WAAO,KAAK,WAAW,IAAI,OAAO,KAAK,OAAO,CAAC,KAAK,MAAM,MAAM,GAAG,CAAC,IAAI,KAAK;AAAA,EAC/E;AAAA,EACA,OAAO,CAAC,WAAW,OAAO;AAAA,EAC1B,KAAK,CAAC,WAAW;AACf,UAAM,OAAO,QAAQ,MAAM;AAC3B,WAAO,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,GAAG,IAAI;AAAA,EACpD;AAAA,EACA,KAAK,CAAC,WAAW;AACf,UAAM,OAAO,QAAQ,MAAM;AAC3B,WAAO,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,GAAG,IAAI;AAAA,EACpD;AAAA,EACA,OAAO,CAAC,WAAY,OAAO,SAAS,IAAI,OAAO,CAAC,IAAI;AAAA,EACpD,MAAM,CAAC,WAAY,OAAO,SAAS,IAAI,OAAO,OAAO,SAAS,CAAC,IAAI;AACrE;AAEO,SAAS,kBAAkB,QAAiF;AACjH,QAAM,SAAS,EAAE,GAAG,mBAAmB,GAAI,UAAU,CAAC,EAAG;AACzD,SAAO,CAAC,SAAiB,OAAO,IAAI;AACtC;;;ACDA,SAAS,aAAa,MAAe,KAAoC;AACvE,MAAI,QAAQ,QAAQ,OAAO,SAAS,SAAU,QAAO;AACrD,QAAM,QAAS,KAAiC,GAAG;AACnD,SAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ;AACxC;AAEO,IAAM,WAAN,MAA4B;AAAA,EAsBjC,YAAoB,MAAuB;AAAvB;AArBpB,SAAQ,MAAwB,CAAC;AACjC,SAAQ,QAA0B,CAAC;AACnC,SAAQ,WAAW,oBAAI,IAAsB;AAC7C,SAAQ,YAA8B,CAAC;AACvC,SAAQ,YAAY,oBAAI,IAA4B;AACpD,SAAQ,cAA2B,CAAC;AACpC,SAAQ,cAA6B;AACrC,SAAQ,cAAc,oBAAI,IAAY;AACtC,SAAQ,mBAAmB,oBAAI,IAAY;AAC3C,SAAQ,gBAA0B,CAAC;AACnC,SAAQ,WAAW,oBAAI,IAAwB;AAC/C,SAAQ,aAA+B,CAAC;AACxC,SAAQ,kBAAiC;AACzC,SAAQ,oBAAoB;AAC5B,SAAQ,kBAAkB;AAC1B,SAAQ,cAAc;AACtB,SAAQ,gBAAwC;AAChD,SAAQ,yBAA8C;AACtD,SAAQ,YAAY,oBAAI,QAAgC;AACxD,SAAQ,cAAc,oBAAI,QAAgC;AAue1D,SAAQ,eAAiC,CAAC;AAC1C,SAAQ,OAAO;AACf,SAAQ,WAAW;AAAA,EAveyB;AAAA,EAE5C,aAAa,MAAa,OAAe,UAA0B;AACjE,UAAM,WAAW,KAAK,KAAK,QAAQ;AACnC,QAAI,CAAC,SAAU,QAAO;AACtB,QAAI;AACF,YAAM,KAAK,SAAS,EAAE,MAAM,OAAO,KAAK,KAAK,KAAK,OAAO,EAAE,CAAC;AAC5D,UAAI,OAAO,OAAO,YAAY,GAAG,SAAS,EAAG,QAAO;AACpD,WAAK,KAAK,YAAY,IAAI,MAAM,yCAAyC,GAAG,YAAY,EAAE,MAAM,CAAC;AAAA,IACnG,SAAS,OAAO;AACd,WAAK,KAAK,YAAY,OAAO,YAAY,EAAE,MAAM,CAAC;AAAA,IACpD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,SAAkB;AACpB,WAAO,KAAK,KAAK,QAAQ;AAAA,EAC3B;AAAA,EAEA,IAAI,aAAsB;AACxB,WAAO,KAAK,KAAK,QAAQ,cAAc;AAAA,EACzC;AAAA,EAEA,uBAA+B;AAC7B,QAAI,KAAK,YAAY;AACnB,YAAM,aAAa,KAAK,IAAI,GAAG,KAAK,UAAU,SAAS,KAAK,IAAI,MAAM;AACtE,cAAQ,KAAK,mBAAmB,KAAK,IAAI,UAAU;AAAA,IACrD;AACA,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,oBAA6B;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,gBAA+B;AAC7B,QAAI,CAAC,KAAK,WAAY,QAAO,QAAQ,QAAQ;AAC7C,SAAK,sBAAsB;AAC3B,SAAK,kBAAkB;AACvB,SAAK,oBAAoB;AACzB,SAAK,MAAM,CAAC;AACZ,SAAK,QAAQ,CAAC;AACd,SAAK,UAAU,MAAM;AACrB,SAAK,YAAY,MAAM;AACvB,SAAK,KAAK,YAAY,MAAM;AAC5B,SAAK,gBAAgB;AACrB,SAAK,KAAK,aAAa,cAAc;AACrC,WAAO,KAAK,UAAU,CAAC;AAAA,EACzB;AAAA,EAEA,iBAAgC;AAC9B,QAAI,CAAC,KAAK,WAAY,QAAO,QAAQ,QAAQ;AAC7C,WAAO,KAAK,cAAc;AAAA,EAC5B;AAAA,EAEQ,mBAAmB,GAAkB;AAC3C,SAAK,kBAAkB;AACvB,SAAK,KAAK,SAAS,mBAAmB,GAAG,KAAK,KAAK,cAAc,SAAS,CAAC;AAAA,EAC7E;AAAA,EAEQ,UAAU,OAAe,KAA6B;AAC5D,QAAI,CAAC,KAAK,cAAc,KAAK,kBAAmB,QAAO,QAAQ,QAAQ;AACvE,QAAI,KAAK,mBAAmB,QAAQ,SAAS,KAAK,gBAAiB,QAAO,QAAQ,QAAQ;AAC1F,UAAM,aAAa,KAAK,KAAK,QAAQ;AACrC,UAAM,YAAY,KAAK,KAAK,QAAQ;AACpC,UAAM,OAAO,OAAO,QAAQ;AAC5B,QAAI,QAAQ,MAAO,QAAO,QAAQ,QAAQ;AAC1C,UAAM,MAAM,EAAE,KAAK;AACnB,UAAM,aAAa,IAAI,gBAAgB;AACvC,SAAK,gBAAgB;AACrB,SAAK,oBAAoB;AACzB,SAAK,mBAAmB,IAAI;AAE5B,WAAO,IAAI,QAAc,CAAC,YAAY;AACpC,UAAI,UAAU;AACd,WAAK,yBAAyB;AAC9B,YAAM,OAAO,CAAC,WAAqB;AACjC,YAAI,QAAS;AACb,kBAAU;AACV,YAAI,QAAQ,KAAK,aAAa;AAC5B,eAAK,oBAAoB;AACzB,eAAK,gBAAgB;AACrB,eAAK,yBAAyB;AAC9B,eAAK,mBAAmB,KAAK;AAC7B,cAAI,UAAU,QAAS,QAA8B,SAAS,cAAc;AAC1E,iBAAK,KAAK,YAAY,QAAQ,sBAAsB,EAAE,UAAU,OAAO,QAAQ,KAAK,CAAC;AAAA,UACvF;AAAA,QACF;AACA,gBAAQ;AAAA,MACV;AAEA,UAAI;AACF,cAAM,UAAU,WAAW,QAAQ;AAAA,UACjC,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,WAAW,KAAK,KAAK,YAAY,aAAa;AAAA,UAC9C,aAAa,KAAK,eAAe;AAAA,UACjC,iBAAiB,KAAK;AAAA,UACtB,QAAQ,WAAW;AAAA,UACnB,WAAW,CAAC,MAAM,YAAY;AAC5B,gBAAI,QAAS;AACb,gBAAI,QAAQ,KAAK,eAAe,KAAK,KAAK,YAAY,KAAK,WAAW,OAAO,SAAS;AACpF,mBAAK;AACL;AAAA,YACF;AACA,kBAAM,WAAW,QAAQ,CAAC;AAC1B,gBAAI,OAAO,YAAY,YAAY,WAAW,GAAG;AAC/C,mBAAK,kBAAkB;AAAA,YACzB,WAAW,SAAS,SAAS,OAAO,OAAO;AACzC,mBAAK,kBAAkB,QAAQ,SAAS;AAAA,YAC1C;AACA,kBAAM,WAAW,KAAK,IAAI,WAAW;AACrC,iBAAK,mBAAmB,QAAQ;AAChC,iBAAK;AACL,iBAAK,gBAAgB;AACrB,iBAAK,KAAK,aAAa,cAAc;AACrC,gBAAI,SAAU,MAAK,KAAK,SAAS;AACjC,iBAAK,KAAK,eAAe,yBAAyB;AAAA,UACpD;AAAA,UACA,MAAM,CAAC,WAAW,KAAK,UAAU,IAAI,MAAM,2BAA2B,CAAC;AAAA,QACzE,CAAC;AACD,YAAI,WAAW,OAAQ,QAA0B,UAAU,YAAY;AACrE,eAAM,QAA0B,MAAM,IAAI;AAAA,QAC5C;AAAA,MACF,SAAS,OAAO;AACd,aAAK,KAAK;AAAA,MACZ;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,wBAA8B;AACpC,SAAK;AACL,SAAK,eAAe,MAAM;AAC1B,SAAK,gBAAgB;AACrB,SAAK,oBAAoB;AACzB,SAAK,mBAAmB,KAAK;AAC7B,SAAK,yBAAyB;AAC9B,SAAK,yBAAyB;AAAA,EAChC;AAAA,EAEQ,mBAAmB,MAAqB;AAC9C,eAAW,QAAQ,MAAM;AACvB,UAAI,QAAQ,KAAM;AAClB,YAAM,QAAQ,KAAK,IAAI;AACvB,YAAM,KAAK,KAAK,aAAa,MAAM,OAAO,OAAO,KAAK,KAAK,OAAO,CAAC,EAAE;AACrE,UAAI,KAAK,UAAU,IAAI,EAAE,GAAG;AAC1B,aAAK,KAAK,YAAY,IAAI,MAAM,qBAAqB,EAAE,EAAE,GAAG,sBAAsB,EAAE,OAAO,GAAG,CAAC;AAC/F;AAAA,MACF;AACA,YAAM,OAAuB;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,UAAU,KAAK,KAAK,iBAAiB,WAAW,EAAE;AAAA,MACpD;AACA,WAAK,IAAI,KAAK,IAAI;AAClB,WAAK,UAAU,IAAI,IAAI,IAAI;AAC3B,WAAK,MAAM,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,oBAAoB,kBAAgC;AAClD,QAAI,CAAC,KAAK,cAAc,KAAK,kBAAmB;AAChD,UAAM,SAAS,KAAK,IAAI;AACxB,QAAI,KAAK,mBAAmB,QAAQ,UAAU,KAAK,gBAAiB;AACpE,UAAM,SAAS,KAAK,KAAK,QAAQ;AACjC,QAAI,mBAAmB,SAAS,UAAU,mBAAmB,OAAQ;AACrE,UAAM,YAAY,KAAK,KAAK,QAAQ;AACpC,UAAM,OAAO,KAAK,mBAAmB,OACjC,SAAS,YACT,KAAK,IAAI,KAAK,iBAAiB,SAAS,SAAS;AACrD,SAAK,KAAK,UAAU,QAAQ,IAAI;AAAA,EAClC;AAAA,EAEA,wBAAuC;AACrC,WAAO,KAAK,eAAe;AAAA,EAC7B;AAAA,EAEA,sBAAqC;AACnC,SAAK,sBAAsB;AAC3B,QAAI,KAAK,WAAY,QAAO,KAAK,cAAc;AAC/C,SAAK,kBAAkB;AACvB,SAAK,WAAW,KAAK,KAAK,QAAQ,OAAO;AACzC,SAAK,KAAK,aAAa,cAAc;AACrC,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,UAAgB;AACd,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEA,WAAW,MAAwC;AACjD,UAAM,WAAW,KAAK,KAAK,QAAQ;AACnC,UAAM,cAAc,KAAK,KAAK,QAAQ;AACtC,UAAM,OAAyB,CAAC;AAChC,UAAM,QAA0B,CAAC;AACjC,UAAM,OAAO,oBAAI,IAA4B;AAC7C,UAAM,WAAW,oBAAI,IAAsB;AAC3C,QAAI,UAAU;AAEd,UAAM,YAAY,CAAC,MAAa,OAAe,aAAmD;AAChG,YAAM,QAAQ;AACd,YAAM,KAAK,KAAK,aAAa,MAAM,OAAO,QAAQ,KAAK,EAAE;AACzD,UAAI,KAAK,IAAI,EAAE,GAAG;AAChB,aAAK,KAAK,YAAY,IAAI,MAAM,qBAAqB,EAAE,EAAE,GAAG,WAAW,EAAE,OAAO,IAAI,MAAM,CAAC;AAC3F,eAAO;AAAA,MACT;AACA,YAAM,OAAuB,EAAE,IAAI,MAAM,UAAU,IAAI,UAAU,MAAM;AACvE,WAAK,UAAU,IAAI,MAAM,KAAK;AAC9B,WAAK,KAAK,IAAI;AACd,WAAK,IAAI,IAAI,IAAI;AACjB,UAAI,YAAY,MAAM;AACpB,cAAM,OAAO,SAAS,IAAI,QAAQ,KAAK,CAAC;AACxC,aAAK,KAAK,EAAE;AACZ,iBAAS,IAAI,UAAU,IAAI;AAAA,MAC7B,OAAO;AACL,cAAM,KAAK,IAAI;AAAA,MACjB;AACA,YAAM,WAAW,KAAK,SAAS,aAAa,MAAM,WAAW,IAAI;AACjE,UAAI,KAAK,UAAU,MAAM,QAAQ,QAAQ,GAAG;AAC1C,mBAAW,SAAS,UAAU;AAC5B,cAAI,SAAS,KAAM,WAAU,OAAgB,QAAQ,GAAG,EAAE;AAAA,QAC5D;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,KAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,SAAS;AAC7B,UAAI,QAAQ,KAAM,WAAU,MAAM,GAAG,IAAI;AAAA,IAC3C,CAAC;AAED,SAAK,MAAM;AACX,SAAK,QAAQ;AACb,SAAK,WAAW;AAChB,SAAK,YAAY;AACjB,SAAK,KAAK,YAAY,MAAM;AAC5B,eAAW,MAAM,CAAC,GAAG,KAAK,WAAW,GAAG;AACtC,UAAI,CAAC,KAAK,IAAI,EAAE,EAAG,MAAK,YAAY,OAAO,EAAE;AAAA,IAC/C;AACA,QAAI,KAAK,KAAK,QAAQ,kBAAkB;AACtC,iBAAW,QAAQ,MAAM;AACvB,YAAI,KAAK,iBAAiB,KAAK,EAAE,IAAI,EAAG,MAAK,YAAY,IAAI,KAAK,EAAE;AAAA,MACtE;AAAA,IACF;AAEA,SAAK,KAAK,iBAAiB,cAAc,YAAY,IAAI;AACzD,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,eAAe,IAAsB;AACnC,WAAO,KAAK,SAAS,IAAI,EAAE,KAAK,CAAC;AAAA,EACnC;AAAA,EAEA,iBAAiB,IAAoB;AACnC,WAAO,KAAK,SAAS,IAAI,EAAE,GAAG,UAAU;AAAA,EAC1C;AAAA,EAEA,YAAY,IAAqB;AAC/B,WAAO,KAAK,iBAAiB,EAAE,IAAI;AAAA,EACrC;AAAA,EAEA,iBAAiB,aAA0C;AACzD,UAAM,WAAW,KAAK,KAAK,QAAQ;AACnC,UAAM,UAA4B,CAAC;AAEnC,QAAI,YAAY,QAAQ,QAAQ;AAC9B,YAAM,YAAY,oBAAI,IAAY;AAClC,YAAM,aAAa,oBAAI,IAAW;AAClC,YAAM,UAAU,CAAC,SAAgB;AAC/B,YAAI,UAAU;AACZ,gBAAM,KAAK,KAAK,aAAa,MAAM,IAAI,oBAAoB,KAAK,KAAK,OAAO,CAAC,EAAE;AAC/E,gBAAM,QAAQ,CAAC,EAAE;AACjB,iBAAO,MAAM,SAAS,GAAG;AACvB,kBAAM,MAAM,MAAM,IAAI;AACtB,gBAAI,UAAU,IAAI,GAAG,EAAG;AACxB,sBAAU,IAAI,GAAG;AACjB,uBAAW,WAAW,KAAK,SAAS,IAAI,GAAG,KAAK,CAAC,EAAG,OAAM,KAAK,OAAO;AAAA,UACxE;AAAA,QACF,OAAO;AACL,gBAAM,QAAiB,CAAC,IAAI;AAC5B,iBAAO,MAAM,SAAS,GAAG;AACvB,kBAAM,MAAM,MAAM,IAAI;AACtB,uBAAW,IAAI,GAAG;AAClB,kBAAM,OAAO,KAAK,SAAS,aAAa,KAAK,KAAK,KAAK,QAAQ,WAAW,IAAI;AAC9E,gBAAI,MAAM;AACR,yBAAW,OAAO,KAAM,OAAM,KAAK,GAAY;AAAA,YACjD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,kBAAY,OAAO,QAAQ,OAAO;AAClC,WAAK,MAAM,KAAK,IAAI,OAAO,CAAC,SAAS;AACnC,cAAM,OAAO,UAAU,IAAI,KAAK,EAAE,KAAM,KAAK,QAAQ,QAAQ,WAAW,IAAI,KAAK,IAAI;AACrF,YAAI,MAAM;AACR,eAAK,UAAU,OAAO,KAAK,EAAE;AAC7B,eAAK,SAAS,OAAO,KAAK,EAAE;AAAA,QAC9B;AACA,eAAO,CAAC;AAAA,MACV,CAAC;AACD,YAAM,YAAY,IAAI,IAAI,KAAK,GAAG;AAClC,WAAK,QAAQ,KAAK,MAAM,OAAO,CAAC,SAAS,UAAU,IAAI,IAAI,CAAC;AAAA,IAC9D;AAEA,QAAI,YAAY,QAAQ,QAAQ;AAC9B,iBAAW,QAAQ,YAAY,QAAQ;AACrC,YAAI;AACJ,YAAI,UAAU;AACZ,iBAAO,KAAK,UAAU,IAAI,KAAK,aAAa,MAAM,IAAI,oBAAoB,KAAK,KAAK,OAAO,CAAC,EAAE,CAAC;AAAA,QACjG,OAAO;AACL,iBAAO,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,QAC7C;AACA,YAAI,MAAM;AACR,eAAK,OAAO;AACZ,eAAK,KAAK,aAAa,oBAAoB,IAAI;AAC/C,kBAAQ,KAAK,IAAI;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,YAAY,KAAK,QAAQ;AAC3B,YAAM,aAAa,YAAY,YAAY,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,YAAY,UAAU,KAAK,MAAM,MAAM,CAAC,IAAI,KAAK,MAAM;AAC9H,YAAM,QAA0B,CAAC;AACjC,kBAAY,IAAI,QAAQ,CAAC,MAAM,MAAM;AACnC,cAAM,KAAK,KAAK,aAAa,MAAM,aAAa,GAAG,OAAO,KAAK,KAAK,OAAO,CAAC,EAAE;AAC9E,YAAI,KAAK,UAAU,IAAI,EAAE,GAAG;AAC1B,eAAK,KAAK,YAAY,IAAI,MAAM,qBAAqB,EAAE,EAAE,GAAG,mBAAmB,EAAE,OAAO,GAAG,CAAC;AAC5F;AAAA,QACF;AACA,cAAM,OAAuB,EAAE,IAAI,MAAM,UAAU,IAAI,UAAU,MAAM;AACvE,aAAK,UAAU,IAAI,IAAI,IAAI;AAC3B,aAAK,UAAU,IAAI,MAAM,CAAC;AAC1B,cAAM,WAAW,KAAK,SAAS,aAAa,MAAM,KAAK,KAAK,QAAQ,WAAW,IAAI;AACnF,YAAI,UAAU;AACZ,qBAAW,SAAS,UAAU;AAC5B,gBAAI,SAAS,KAAM,MAAK,gBAAgB,MAAM,OAAgB,CAAC;AAAA,UACjE;AAAA,QACF;AACA,cAAM,KAAK,IAAI;AAAA,MACjB,CAAC;AACD,WAAK,MAAM,OAAO,YAAY,GAAG,GAAG,KAAK;AACzC,WAAK,WAAW;AAAA,IAClB;AAEA,SAAK,gBAAgB;AACrB,eAAW,QAAQ,SAAS;AAC1B,UAAI,KAAK,YAAY,EAAG,MAAK,KAAK,aAAa,YAAY,CAAC,KAAK,QAAQ,CAAC;AAAA,IAC5E;AAAA,EACF;AAAA,EAEQ,gBAAgB,QAAwB,MAAa,OAAqB;AAChF,UAAM,KAAK,KAAK,aAAa,MAAM,IAAI,OAAO,KAAK,KAAK,OAAO,CAAC,EAAE;AAClE,QAAI,KAAK,UAAU,IAAI,EAAE,GAAG;AAC1B,WAAK,KAAK,YAAY,IAAI,MAAM,qBAAqB,EAAE,EAAE,GAAG,mBAAmB,EAAE,OAAO,GAAG,CAAC;AAC5F;AAAA,IACF;AACA,UAAM,QAAwB;AAAA,MAC5B;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AACA,SAAK,UAAU,IAAI,IAAI,KAAK;AAC5B,SAAK,UAAU,IAAI,OAAO,KAAK;AAC/B,UAAM,OAAO,KAAK,SAAS,IAAI,OAAO,EAAE,KAAK,CAAC;AAC9C,SAAK,KAAK,MAAM,EAAE;AAClB,SAAK,SAAS,IAAI,OAAO,IAAI,IAAI;AACjC,UAAM,WAAW,aAAa,MAAM,KAAK,KAAK,QAAQ,WAAW;AACjE,QAAI,CAAC,SAAU;AACf,eAAW,UAAU,UAAU;AAC7B,UAAI,UAAU,KAAM,MAAK,gBAAgB,OAAO,QAAiB,QAAQ,CAAC;AAAA,IAC5E;AAAA,EACF;AAAA,EAEQ,aAAmB;AACzB,SAAK,MAAM,CAAC;AACZ,UAAM,OAAO,CAAC,SAAyB;AACrC,WAAK,IAAI,KAAK,IAAI;AAClB,UAAI,CAAC,KAAK,UAAU,IAAI,KAAK,EAAE,EAAG,MAAK,UAAU,IAAI,KAAK,IAAI,IAAI;AAClE,iBAAW,WAAW,KAAK,SAAS,IAAI,KAAK,EAAE,KAAK,CAAC,GAAG;AACtD,cAAM,QAAQ,KAAK,UAAU,IAAI,OAAO;AACxC,YAAI,MAAO,MAAK,KAAK;AAAA,MACvB;AAAA,IACF;AACA,eAAW,QAAQ,KAAK,MAAO,MAAK,IAAI;AAAA,EAC1C;AAAA,EAEA,eAAe,aAA0C;AACvD,UAAM,SAAS,KAAK,UAAU,KAAK,WAAW;AAC9C,SAAK,cAAc,cAAc,EAAE,GAAG,YAAY,IAAI,CAAC;AACvD,WAAO,KAAK,UAAU,KAAK,WAAW,MAAM;AAAA,EAC9C;AAAA,EAEA,iBAA8B;AAC5B,WAAO,EAAE,GAAG,KAAK,YAAY;AAAA,EAC/B;AAAA,EAEA,eAAe,MAA0C;AACvD,UAAM,OAAO,QAAQ,QAAQ,KAAK,KAAK,MAAM,KAAK,OAAO;AACzD,QAAI,SAAS,KAAK,YAAa,QAAO;AACtC,SAAK,cAAc;AACnB,WAAO;AAAA,EACT;AAAA,EAEA,iBAAgC;AAC9B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,kBAA2B;AACzB,WAAO,OAAO,KAAK,KAAK,WAAW,EAAE,SAAS,KAAK,KAAK,eAAe;AAAA,EACzE;AAAA,EAEA,kBAAwB;AACtB,UAAM,UAAU,KAAK,KAAK,YAAY,kBAAkB;AACxD,UAAM,eAAe,CAAC,MAAoB,WAAuB,KAAK,KAAK,aAAa,MAAM,MAAM;AAEpG,QAAI,KAAK,YAAY;AACnB,WAAK,IAAI,QAAQ,CAAC,MAAM,UAAU;AAChC,aAAK,WAAW;AAChB,aAAK,YAAY,IAAI,MAAM,QAAQ,CAAC;AAAA,MACtC,CAAC;AACD,WAAK,YAAY,KAAK;AACtB,WAAK,eAAe,KAAK;AACzB,WAAK,SAAS,MAAM;AACpB,WAAK,KAAK,KAAK,gBAAgB,EAAE,UAAU,KAAK,IAAI,OAAO,CAAC;AAC5D;AAAA,IACF;AAEA,QAAI;AAEJ,QAAI,KAAK,QAAQ;AACf,aAAO,KAAK,iBAAiB,SAAS,YAAY;AAAA,IACpD,OAAO;AACL,aAAO,KAAK;AACZ,YAAM,mBAAmB,KAAK,gBAAgB,KAAK,CAAC,KAAK,KAAK,QAAQ;AACtE,UAAI,kBAAkB;AACpB,eAAO,KAAK,OAAO,CAAC,SAAS,oBAAoB,MAAM,SAAS,KAAK,aAAa,KAAK,aAAa,YAAY,CAAC;AAAA,MACnH;AACA,YAAM,YAAY,KAAK,KAAK,YAAY,aAAa;AACrD,UAAI,UAAU,SAAS,KAAK,CAAC,KAAK,KAAK,QAAQ,eAAe;AAC5D,YAAI;AACF,iBAAO,UAAU,MAAM,WAAW,SAAS,YAAY;AAAA,QACzD,SAAS,OAAO;AACd,eAAK,KAAK,YAAY,OAAO,cAAc,EAAE,UAAU,CAAC;AAAA,QAC1D;AAAA,MACF;AAEA,YAAM,YAAY,KAAK,KAAK,YAAY,mBAAmB;AAC3D,UAAI,UAAU,SAAS,GAAG;AACxB,eAAO,KAAK,aAAa,MAAM,SAAS;AAAA,MAC1C,WAAW,KAAK,KAAK,QAAQ,cAAc;AACzC,cAAM,cAAgC,CAAC;AACvC,mBAAW,QAAQ,MAAM;AACvB,sBAAY,KAAK,IAAI;AACrB,cAAI,KAAK,YAAY,IAAI,KAAK,EAAE,KAAK,KAAK,gBAAgB,IAAI,GAAG;AAC/D,wBAAY,KAAK;AAAA,cACf,IAAI,aAAa,KAAK,EAAE;AAAA,cACxB,MAAM,KAAK;AAAA,cACX,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU,KAAK;AAAA,YACjB,CAAC;AAAA,UACH;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAEA,eAAW,QAAQ,KAAK,IAAK,MAAK,WAAW;AAE7C,QAAI,MAAM;AACV,SAAK,QAAQ,CAAC,MAAM,UAAU;AAC5B,WAAK,WAAW;AAChB,UAAI,CAAC,KAAK,YAAY,CAAC,KAAK,SAAS;AACnC;AACA,aAAK,YAAY,IAAI,MAAM,GAAG;AAAA,MAChC;AAAA,IACF,CAAC;AACD,SAAK,eAAe;AACpB,SAAK,gBAAgB;AAErB,SAAK,aAAa,YAAY;AAC9B,SAAK,KAAK,KAAK,gBAAgB,EAAE,UAAU,KAAK,OAAO,CAAC;AAAA,EAC1D;AAAA,EAMA,IAAI,mBAA4B;AAC9B,WAAO,KAAK,KAAK,QAAQ,qBAAqB,CAAC,KAAK;AAAA,EACtD;AAAA,EAEQ,kBAAwB;AAC9B,QAAI,CAAC,KAAK,kBAAkB;AAC1B,WAAK,YAAY,KAAK;AACtB;AAAA,IACF;AACA,UAAM,OAAO,KAAK,kBAAkB;AACpC,UAAM,YAAY,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,aAAa,SAAS,IAAI,CAAC;AACxE,QAAI,KAAK,OAAO,UAAW,MAAK,OAAO;AACvC,QAAI,KAAK,OAAO,EAAG,MAAK,OAAO;AAC/B,UAAM,SAAS,KAAK,OAAO,KAAK;AAChC,UAAM,QAAQ,KAAK,aAAa,MAAM,OAAO,QAAQ,IAAI;AACzD,UAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,WAAK,WAAW;AAAA,IAClB,CAAC;AACD,SAAK,YAAY;AAAA,EACnB;AAAA,EAEQ,oBAA4B;AAClC,SAAK,WAAW,KAAK,KAAK,QAAQ;AAClC,WAAO,KAAK,IAAI,GAAG,KAAK,QAAQ;AAAA,EAClC;AAAA,EAEA,iBAAyB;AACvB,WAAO,KAAK,mBAAmB,KAAK,OAAO;AAAA,EAC7C;AAAA,EAEA,mBAA2B;AACzB,WAAO,KAAK,aAAa,KAAK,qBAAqB,IAAI,KAAK,aAAa;AAAA,EAC3E;AAAA,EAEA,eAAuB;AACrB,QAAI,CAAC,KAAK,iBAAkB,QAAO;AACnC,WAAO,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,aAAa,SAAS,KAAK,kBAAkB,CAAC,CAAC;AAAA,EACnF;AAAA,EAEA,kBAAoC;AAClC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAQ,MAAc,SAAS,OAAa;AAC1C,QAAI,CAAC,KAAK,iBAAkB;AAC5B,UAAM,YAAY,KAAK,aAAa;AACpC,UAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAM,IAAI,KAAK,GAAG,SAAS,CAAC;AACnE,QAAI,SAAS,KAAK,KAAM;AACxB,SAAK,OAAO;AACZ,SAAK,gBAAgB;AACrB,SAAK,KAAK,aAAa,cAAc;AACrC,SAAK,KAAK,aAAa,cAAc,GAAG,KAAK;AAC7C,QAAI,CAAC,OAAQ,MAAK,sBAAsB;AAAA,EAC1C;AAAA,EAEA,YAAY,MAAoB;AAC9B,QAAI,CAAC,KAAK,iBAAkB;AAC5B,UAAM,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,KAAK,KAAK,kBAAkB,CAAC;AACrE,UAAM,gBAAgB,KAAK,OAAO,KAAK,KAAK,kBAAkB;AAC9D,SAAK,KAAK,QAAQ,qBAAqB;AACvC,SAAK,WAAW;AAChB,SAAK,OAAO,KAAK,MAAM,eAAe,IAAI,IAAI;AAC9C,SAAK,gBAAgB;AACrB,SAAK,KAAK,aAAa,cAAc;AACrC,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEA,qBAAqB,SAAwB;AAC3C,QAAI,KAAK,KAAK,QAAQ,sBAAsB,QAAS;AACrD,SAAK,KAAK,QAAQ,oBAAoB,WAAW,CAAC,KAAK;AACvD,QAAI,KAAK,KAAK,QAAQ,kBAAmB,MAAK,OAAO;AACrD,SAAK,gBAAgB;AACrB,SAAK,KAAK,aAAa,cAAc;AACrC,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEA,6BAAmC;AACjC,QAAI,CAAC,KAAK,iBAAkB;AAC5B,SAAK,OAAO;AACZ,SAAK,gBAAgB;AACrB,SAAK,KAAK,aAAa,cAAc;AACrC,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEQ,wBAA8B;AACpC,SAAK,KAAK,KAAK,qBAAqB;AAAA,MAClC,MAAM,KAAK,eAAe;AAAA,MAC1B,UAAU,KAAK,kBAAkB;AAAA,MACjC,WAAW,KAAK,aAAa;AAAA,MAC7B,OAAO,KAAK,iBAAiB;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EAEQ,iBACN,SACA,cACkB;AAClB,UAAM,YAAY,KAAK,KAAK,QAAQ,gBAAgB,CAAC,IAAI,KAAK,KAAK,YAAY,aAAa;AAC5F,UAAM,YAAY,oBAAI,IAAqB;AAC3C,UAAM,gBAAgB,KAAK,gBAAgB,KAAK,CAAC,KAAK,KAAK,QAAQ;AAEnE,UAAM,aAAa,CAAC,SAAkC;AACpD,YAAM,SAAS,UAAU,IAAI,KAAK,EAAE;AACpC,UAAI,WAAW,OAAW,QAAO;AACjC,UAAI,OAAO;AACX,UAAI,eAAe;AACjB,eAAO,oBAAoB,MAAM,SAAS,KAAK,aAAa,KAAK,aAAa,YAAY;AAC1F,mBAAW,WAAW,KAAK,SAAS,IAAI,KAAK,EAAE,KAAK,CAAC,GAAG;AACtD,gBAAM,QAAQ,KAAK,UAAU,IAAI,OAAO;AACxC,cAAI,SAAS,WAAW,KAAK,EAAG,QAAO;AAAA,QACzC;AAAA,MACF;AACA,gBAAU,IAAI,KAAK,IAAI,IAAI;AAC3B,aAAO;AAAA,IACT;AAEA,UAAM,MAAwB,CAAC;AAC/B,UAAM,OAAO,CAAC,UAA4B;AACxC,UAAI,UAAU;AACd,UAAI,UAAU,SAAS,GAAG;AACxB,kBAAU,UAAU,OAAO,WAAW,SAAS,YAAY;AAAA,MAC7D;AACA,iBAAW,QAAQ,SAAS;AAC1B,YAAI,CAAC,WAAW,IAAI,EAAG;AACvB,YAAI,KAAK,IAAI;AACb,YAAI,KAAK,YAAY,IAAI,KAAK,EAAE,GAAG;AACjC,gBAAM,cAAc,KAAK,SAAS,IAAI,KAAK,EAAE,KAAK,CAAC,GAChD,IAAI,CAAC,OAAO,KAAK,UAAU,IAAI,EAAE,CAAC,EAClC,OAAO,CAAC,MAA2B,KAAK,IAAI;AAC/C,eAAK,UAAU;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AACA,SAAK,KAAK,KAAK;AACf,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,cAAqE;AACxF,SAAK,SAAS,MAAM;AACpB,QAAI,KAAK,OAAQ;AACjB,QAAI,KAAK,KAAK,QAAQ,aAAc;AACpC,QAAI,KAAK,KAAK,YAAY,mBAAmB,EAAE,SAAS,EAAG;AAE3D,UAAM,cAAc,KAAK,KAAK,YAAY,kBAAkB,EAAE;AAAA,MAC5D,CAAC,MAAM,EAAE,OAAO,WAAW,QAAQ,EAAE,OAAO,gBAAgB;AAAA,IAC9D;AACA,QAAI,YAAY,WAAW,EAAG;AAE9B,UAAM,UAAU,KAAK;AACrB,QAAI,IAAI;AACR,eAAW,QAAQ,KAAK,WAAW;AACjC,UAAI,CAAC,KAAK,YAAY,CAAC,KAAK,QAAS,SAAQ,GAAG,IAAI;AAAA,IACtD;AACA,YAAQ,SAAS;AACjB,UAAM,IAAI;AACV,QAAI,MAAM,EAAG;AAEb,eAAW,OAAO,aAAa;AAC7B,YAAM,MAAM,IAAI,WAAW,CAAC;AAC5B,UAAI,IAAI;AACR,aAAO,IAAI,GAAG;AACZ,cAAM,OAAO,QAAQ,CAAC;AACtB,cAAM,QAAQ,aAAa,MAAM,GAAG;AACpC,YAAI,OAAO;AACX,YAAI,IAAI,OAAO,SAAS;AACtB,cAAI;AACF,kBAAM,MAAM,IAAI,OAAO,QAAQ;AAAA,cAC7B,KAAK,KAAK,KAAK,OAAO;AAAA,cACtB,QAAQ,IAAI;AAAA,cACZ,QAAQ;AAAA,cACR;AAAA,cACA,MAAM,KAAK;AAAA,cACX;AAAA,cACA,UAAU,KAAK;AAAA,YACjB,CAAC;AACD,mBAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC;AAAA,UAC1D,SAAS,OAAO;AACd,iBAAK,KAAK,YAAY,OAAO,WAAW,EAAE,OAAO,IAAI,IAAI,OAAO,KAAK,GAAG,CAAC;AAAA,UAC3E;AAAA,QACF,WAAW,IAAI,OAAO,aAAa;AACjC,iBACE,IAAI,OAAO,KACX,SAAS,QACT,UAAU,MACV,kBAAkB,OAAO,aAAa,QAAQ,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,GACnE;AACA;AAAA,UACF;AAAA,QACF;AACA,YAAI,CAAC,IAAI;AACT,iBAAS,IAAI,GAAG,IAAI,MAAM,IAAK,KAAI,IAAI,CAAC,IAAI;AAC5C,aAAK;AAAA,MACP;AACA,WAAK,SAAS,IAAI,IAAI,IAAI,GAAG;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,YAAY,OAAuC;AACjD,WAAO,KAAK,SAAS,IAAI,KAAK;AAAA,EAChC;AAAA,EAEA,UAAU,MAA8B;AACtC,WAAO,KAAK,YAAY,IAAI,IAAI,KAAK;AAAA,EACvC;AAAA,EAEA,aAAa,MAA8B;AACzC,WAAO,KAAK,UAAU,IAAI,IAAI,KAAK;AAAA,EACrC;AAAA,EAEQ,aAAa,MAAwB,WAA2C;AACtF,UAAM,aAAa,kBAAkB,KAAK,KAAK,QAAQ,QAAQ;AAC/D,UAAM,UAAU,KAAK,KAAK,YAAY,cAAc;AACpD,SAAK,gBAAgB,CAAC;AAEtB,UAAM,aAAa,CAAC,WAAkD;AACpE,YAAM,SAA8B,CAAC;AACrC,iBAAW,OAAO,SAAS;AACzB,cAAM,KAAK,WAAW,IAAI,OAAO,OAAQ;AACzC,YAAI,CAAC,GAAI;AACT,YAAI;AACF,iBAAO,IAAI,EAAE,IAAI,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,KAAK,aAAa,MAAM,GAAG,CAAC,CAAC;AAAA,QAC7E,SAAS,OAAO;AACd,eAAK,KAAK,YAAY,OAAO,WAAW,EAAE,OAAO,IAAI,IAAI,SAAS,IAAI,OAAO,QAAQ,CAAC;AACtF,iBAAO,IAAI,EAAE,IAAI;AAAA,QACnB;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,CACZ,OACA,OACA,eAC4D;AAC5D,UAAI,SAAS,UAAU,QAAQ;AAC7B,eAAO,EAAE,SAAS,OAAO,QAAQ,MAAM;AAAA,MACzC;AACA,YAAM,MAAM,UAAU,KAAK;AAC3B,YAAM,SAAS,oBAAI,IAA8B;AACjD,YAAM,QAAkB,CAAC;AACzB,iBAAW,QAAQ,OAAO;AACxB,cAAM,MAAM,KAAK,KAAK,aAAa,MAAM,GAAG;AAC5C,cAAM,MAAM,OAAO,OAAO,aAAQ,OAAO,GAAG;AAC5C,YAAI,SAAS,OAAO,IAAI,GAAG;AAC3B,YAAI,CAAC,QAAQ;AACX,mBAAS,CAAC;AACV,iBAAO,IAAI,KAAK,MAAM;AACtB,gBAAM,KAAK,GAAG;AAAA,QAChB;AACA,eAAO,KAAK,IAAI;AAAA,MAClB;AACA,YAAM,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,GAAG,QAAW,EAAE,SAAS,MAAM,aAAa,OAAO,CAAC,CAAC;AAE1F,YAAM,UAA4B,CAAC;AACnC,YAAM,SAA2B,CAAC;AAClC,iBAAW,OAAO,OAAO;AACvB,cAAM,WAAW,OAAO,IAAI,GAAG;AAC/B,cAAM,UAAU,GAAG,UAAU,KAAK,KAAK,IAAI,GAAG;AAC9C,aAAK,cAAc,KAAK,OAAO;AAC/B,cAAM,QAAQ,MAAM,UAAU,QAAQ,GAAG,OAAO;AAChD,cAAM,YAA4B;AAAA,UAChC,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,UAAU;AAAA,UACV,UAAU;AAAA,UACV,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW,MAAM;AAAA,UACjB,WAAW,WAAW,MAAM,MAAM;AAAA,QACpC;AACA,gBAAQ,KAAK,SAAS;AACtB,YAAI,KAAK,iBAAiB,IAAI,OAAO,GAAG;AACtC,kBAAQ,KAAK,GAAG,MAAM,OAAO;AAAA,QAC/B;AACA,eAAO,KAAK,GAAG,MAAM,MAAM;AAAA,MAC7B;AACA,aAAO,EAAE,SAAS,OAAO;AAAA,IAC3B;AAEA,WAAO,MAAM,MAAM,GAAG,EAAE,EAAE;AAAA,EAC5B;AAAA,EAEA,gBAAgB,MAA+B;AAC7C,QAAI,KAAK,OAAQ,QAAO,KAAK,YAAY,KAAK,EAAE;AAChD,QAAI,CAAC,KAAK,KAAK,QAAQ,aAAc,QAAO;AAC5C,UAAM,QAAQ,KAAK,KAAK,QAAQ;AAChC,QAAI,OAAO;AACT,UAAI;AACF,eAAO,MAAM,EAAE,MAAM,KAAK,MAAM,MAAM,KAAK,KAAK,KAAK,OAAO,EAAE,CAAC;AAAA,MACjE,SAAS,OAAO;AACd,aAAK,KAAK,YAAY,OAAO,mBAAmB,EAAE,OAAO,KAAK,GAAG,CAAC;AAClE,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,IAAqB;AACjC,WAAO,KAAK,YAAY,IAAI,EAAE;AAAA,EAChC;AAAA,EAEA,UAAU,IAAqB;AAC7B,WAAO,KAAK,kBAAkB,IAAI,IAAI;AAAA,EACxC;AAAA,EAEA,YAAY,IAAqB;AAC/B,WAAO,KAAK,kBAAkB,IAAI,KAAK;AAAA,EACzC;AAAA,EAEA,aAAa,IAAqB;AAChC,WAAO,KAAK,kBAAkB,IAAI,CAAC,KAAK,YAAY,IAAI,EAAE,CAAC;AAAA,EAC7D;AAAA,EAEQ,kBAAkB,IAAY,UAA4B;AAChE,UAAM,OAAO,KAAK,UAAU,IAAI,EAAE;AAClC,QAAI,CAAC,QAAQ,CAAC,KAAK,gBAAgB,IAAI,EAAG,QAAO;AACjD,QAAI,aAAa,KAAK,YAAY,IAAI,EAAE,EAAG,QAAO;AAClD,QAAI,SAAU,MAAK,YAAY,IAAI,EAAE;AAAA,QAChC,MAAK,YAAY,OAAO,EAAE;AAC/B,SAAK,gBAAgB;AACrB,SAAK,KAAK,aAAa,cAAc;AACrC,SAAK,KAAK,KAAK,iBAAiB,EAAE,OAAO,IAAI,SAAS,MAAM,SAAS,CAAC;AACtE,WAAO;AAAA,EACT;AAAA,EAEA,mBAAyB;AACvB,QAAI,UAAU;AACd,eAAW,QAAQ,KAAK,KAAK;AAC3B,UAAI,CAAC,KAAK,YAAY,IAAI,KAAK,EAAE,KAAK,KAAK,gBAAgB,IAAI,GAAG;AAChE,aAAK,YAAY,IAAI,KAAK,EAAE;AAC5B,kBAAU;AAAA,MACZ;AAAA,IACF;AACA,QAAI,SAAS;AACX,WAAK,gBAAgB;AACrB,WAAK,KAAK,aAAa,cAAc;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,qBAA2B;AACzB,QAAI,KAAK,YAAY,SAAS,EAAG;AACjC,SAAK,YAAY,MAAM;AACvB,SAAK,gBAAgB;AACrB,SAAK,KAAK,aAAa,cAAc;AAAA,EACvC;AAAA,EAEA,YAAY,SAA0B;AACpC,WAAO,KAAK,iBAAiB,SAAS,CAAC,KAAK,iBAAiB,IAAI,OAAO,CAAC;AAAA,EAC3E;AAAA,EAEA,gBAAgB,SAA0B;AACxC,WAAO,KAAK,iBAAiB,IAAI,OAAO;AAAA,EAC1C;AAAA,EAEA,aAAa,SAA6C;AACxD,WAAO,KAAK,UAAU,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,OAAO;AAAA,EACjE;AAAA,EAEA,kBAAwB;AACtB,QAAI,KAAK,cAAc,WAAW,EAAG;AACrC,QAAI,UAAU;AACd,eAAW,MAAM,KAAK,eAAe;AACnC,UAAI,CAAC,KAAK,iBAAiB,IAAI,EAAE,GAAG;AAClC,aAAK,iBAAiB,IAAI,EAAE;AAC5B,kBAAU;AAAA,MACZ;AAAA,IACF;AACA,QAAI,SAAS;AACX,WAAK,gBAAgB;AACrB,WAAK,KAAK,aAAa,cAAc;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,oBAA0B;AACxB,QAAI,KAAK,iBAAiB,SAAS,EAAG;AACtC,SAAK,iBAAiB,MAAM;AAC5B,SAAK,gBAAgB;AACrB,SAAK,KAAK,aAAa,cAAc;AAAA,EACvC;AAAA,EAEQ,iBAAiB,SAAiB,UAA4B;AACpE,QAAI,CAAC,KAAK,cAAc,SAAS,OAAO,EAAG,QAAO;AAClD,QAAI,aAAa,KAAK,iBAAiB,IAAI,OAAO,EAAG,QAAO;AAC5D,QAAI,SAAU,MAAK,iBAAiB,IAAI,OAAO;AAAA,QAC1C,MAAK,iBAAiB,OAAO,OAAO;AACzC,SAAK,gBAAgB;AACrB,SAAK,KAAK,aAAa,cAAc;AACrC,WAAO;AAAA,EACT;AAAA,EAEA,uBAAuB,WAAmB,SAA0B;AAClE,QAAI,KAAK,OAAQ,QAAO;AACxB,UAAM,WAAW,KAAK,gBAAgB,SAAS;AAC/C,UAAM,SAAS,KAAK,gBAAgB,OAAO;AAC3C,QAAI,CAAC,YAAY,CAAC,UAAU,SAAS,YAAY,OAAO,YAAY,SAAS,WAAW,OAAO,QAAS,QAAO;AAE/G,UAAM,aAAa,KAAK,IAAI,QAAQ,QAAQ;AAC5C,QAAI,WAAW,KAAK,IAAI,QAAQ,MAAM;AACtC,QAAI,aAAa,KAAK,WAAW,EAAG,QAAO;AAC3C,QAAI,WAAW,YAAY;AACzB,UAAI,MAAM;AACV,aAAO,MAAM,IAAI,KAAK,IAAI,UAAU,KAAK,IAAI,MAAM,CAAC,EAAE,SAAU;AAChE,iBAAW;AAAA,IACb;AACA,QAAI,eAAe,SAAU,QAAO;AAEpC,SAAK,IAAI,OAAO,YAAY,CAAC;AAC7B,UAAM,WAAW,KAAK,IAAI,QAAQ,MAAM;AACxC,SAAK,IAAI,OAAO,WAAW,aAAa,WAAW,IAAI,UAAU,GAAG,QAAQ;AAC5E,SAAK,gBAAgB;AACrB,SAAK,KAAK,aAAa,cAAc;AACrC,WAAO;AAAA,EACT;AAAA,EAEA,cAAgC;AAC9B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,eAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,mBAAqC;AACnC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,uBAA+B;AAC7B,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,gBAAgB,OAA2C;AACzD,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AAAA,EAEA,YAAY,IAAwC;AAClD,WAAO,KAAK,UAAU,IAAI,EAAE;AAAA,EAC9B;AAAA,EAEA,YAAY,UAA+D;AACzE,SAAK,IAAI,QAAQ,QAAQ;AAAA,EAC3B;AAAA,EAEA,8BAA8B,UAA+D;AAC3F,QAAI,QAAQ;AACZ,eAAW,QAAQ,KAAK,cAAc;AACpC,UAAI,KAAK,YAAY,KAAK,QAAS;AACnC,eAAS,MAAM,OAAO;AAAA,IACxB;AAAA,EACF;AACF;;;ACp9BO,IAAM,mBAAN,MAAuB;AAAA,EAK5B,YAAoB,MAAwB;AAAxB;AAJpB,SAAQ,cAAc,oBAAI,IAAY;AACtC,SAAQ,WAA0B;AAClC,SAAQ,mBAAmB,oBAAI,IAAY;AAAA,EAEE;AAAA,EAE7C,WAAW,IAAqB;AAC9B,WAAO,KAAK,YAAY,IAAI,EAAE;AAAA,EAChC;AAAA,EAEA,gBAAgB,IAAqB;AACnC,WAAO,KAAK,iBAAiB,IAAI,EAAE;AAAA,EACrC;AAAA,EAEA,aAAa,MAA6B;AACxC,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,QAAQ,QAAQ,OAAO;AAC7B,QAAI,CAAC,UAAU,CAAC,MAAO,QAAO;AAC9B,QAAI;AACF,aAAO,MAAM;AAAA,QACX,KAAK,KAAK,KAAK,OAAO;AAAA,QACtB,QAAQ,OAAO;AAAA,QACf;AAAA,QACA;AAAA,QACA,MAAM,KAAK;AAAA,QACX,OAAO,KAAK,KAAK,aAAa,MAAM,MAAM;AAAA,QAC1C,UAAU,KAAK;AAAA,MACjB,CAAC;AAAA,IACH,SAAS,OAAO;AACd,WAAK,KAAK,YAAY,OAAO,cAAc,EAAE,OAAO,KAAK,IAAI,OAAO,QAAQ,GAAG,CAAC;AAChF,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,qBAAqB,MAAoB;AAC/C,QAAI,KAAK,WAAW,KAAK,SAAU,QAAO;AAC1C,WAAO,KAAK,KAAK,YACd,kBAAkB,EAClB,KAAK,CAAC,WAAW,OAAO,eAAe,OAAO,OAAO,cAAc,IAAI;AAAA,EAC5E;AAAA,EAEA,mBAAmC;AACjC,WAAO,KAAK,KAAK,SAAS,YAAY,EAAE,OAAO,CAAC,MAAM,KAAK,YAAY,IAAI,EAAE,EAAE,CAAC;AAAA,EAClF;AAAA,EAEA,kBAAyB;AACvB,WAAO,KAAK,iBAAiB,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EAChF;AAAA,EAEA,iBAA2B;AACzB,WAAO,CAAC,GAAG,KAAK,WAAW;AAAA,EAC7B;AAAA,EAEA,cAAc,aAA4B;AACxC,QAAI,CAAC,aAAa;AAChB,WAAK,YAAY,MAAM;AACvB,WAAK,WAAW;AAAA,IAClB,OAAO;AACL,YAAM,WAAW,IAAI,IAAI,KAAK,KAAK,SAAS,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC1E,iBAAW,MAAM,CAAC,GAAG,KAAK,WAAW,GAAG;AACtC,YAAI,CAAC,SAAS,IAAI,EAAE,EAAG,MAAK,YAAY,OAAO,EAAE;AAAA,MACnD;AACA,UAAI,KAAK,YAAY,QAAQ,CAAC,SAAS,IAAI,KAAK,QAAQ,EAAG,MAAK,WAAW;AAAA,IAC7E;AACA,eAAW,QAAQ,KAAK,KAAK,SAAS,YAAY,GAAG;AACnD,WAAK,WAAW,KAAK,YAAY,IAAI,KAAK,EAAE;AAAA,IAC9C;AACA,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,uBAAuB,WAA0D;AAC/E,UAAM,SAAS,UAAU,aAAa,CAAC;AACvC,QAAI,OAAO,WAAW,EAAG,QAAO,EAAE,KAAK,OAAO,MAAM,MAAM;AAC1D,QAAI,kBAAkB;AACtB,QAAI,QAAQ;AACZ,eAAW,QAAQ,QAAQ;AACzB,UAAI,CAAC,KAAK,aAAa,IAAI,EAAG;AAC9B;AACA,UAAI,KAAK,YAAY,IAAI,KAAK,EAAE,EAAG;AAAA,IACrC;AACA,QAAI,oBAAoB,EAAG,QAAO,EAAE,KAAK,OAAO,MAAM,MAAM;AAC5D,WAAO,EAAE,KAAK,UAAU,iBAAiB,MAAM,QAAQ,EAAE;AAAA,EAC3D;AAAA,EAEA,iBAAiB,WAAyB,UAAyB;AACjE,UAAM,UAAU,UAAU,aAAa,CAAC,GAAG,OAAO,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;AAC7E,QAAI,OAAO,WAAW,EAAG;AACzB,SAAK,eAAe,OAAO,IAAI,CAAC,UAAU,EAAE,MAAM,SAAS,EAAE,CAAC;AAAA,EAChE;AAAA,EAEA,gBAAgB,MAAoB,UAAmB,cAAc,OAAa;AAChF,SAAK,eAAe,CAAC,EAAE,MAAM,UAAU,YAAY,CAAC,CAAC;AAAA,EACvD;AAAA,EAEA,eAAe,QAAgB,WAAW,MAAM,cAAc,MAAY;AACxE,UAAM,OAAO,KAAK,KAAK,SAAS,YAAY,MAAM;AAClD,QAAI,KAAM,MAAK,gBAAgB,MAAM,UAAU,WAAW;AAAA,EAC5D;AAAA,EAEA,WAAW,MAAoB,OAAmB,cAA6B;AAC7E,UAAM,OAAO,KAAK,KAAK,QAAQ;AAC/B,QAAI,SAAS,OAAQ;AACrB,QAAI,CAAC,KAAK,aAAa,IAAI,EAAG;AAE9B,QAAI,cAAc;AAChB,YAAM,SAAS,SAAS;AACxB,WAAK,eAAe,CAAC,EAAE,MAAM,UAAU,SAAS,OAAO,CAAC,KAAK,UAAU,aAAa,OAAO,CAAC,CAAC;AAC7F,WAAK,WAAW,KAAK;AACrB;AAAA,IACF;AAEA,UAAM,QAAQ,SAAS;AACvB,QAAI,UAAU,MAAM,WAAW,MAAM,UAAU;AAC7C,WAAK,eAAe,CAAC,EAAE,MAAM,UAAU,CAAC,KAAK,SAAS,CAAC,CAAC;AACxD,WAAK,WAAW,KAAK;AACrB;AAAA,IACF;AAEA,QAAI,SAAS,MAAM,YAAY,KAAK,YAAY,MAAM;AACpD,YAAM,SAAS,KAAK,KAAK,SAAS,YAAY,KAAK,QAAQ;AAC3D,UAAI,UAAU,OAAO,YAAY,KAAK,KAAK,YAAY,GAAG;AACxD,cAAM,QAAQ,KAAK,IAAI,OAAO,UAAU,KAAK,QAAQ;AACrD,cAAM,MAAM,KAAK,IAAI,OAAO,UAAU,KAAK,QAAQ;AACnD,cAAM,UAAU,CAAC;AACjB,iBAAS,IAAI,OAAO,KAAK,KAAK,KAAK;AACjC,gBAAM,MAAM,KAAK,KAAK,SAAS,gBAAgB,CAAC;AAChD,cAAI,OAAO,CAAC,IAAI,YAAY,CAAC,IAAI,WAAW,KAAK,aAAa,GAAG,GAAG;AAClE,oBAAQ,KAAK,EAAE,MAAM,KAAK,UAAU,KAAK,CAAC;AAAA,UAC5C;AAAA,QACF;AACA,aAAK,eAAe,OAAO;AAC3B;AAAA,MACF;AAAA,IACF;AAEA,SAAK,eAAe,CAAC,EAAE,MAAM,UAAU,MAAM,aAAa,KAAK,CAAC,CAAC;AACjE,SAAK,WAAW,KAAK;AAAA,EACvB;AAAA,EAEA,UAAU,eAAe,MAAY;AACnC,UAAM,OAAO,KAAK,KAAK,QAAQ;AAC/B,QAAI,SAAS,OAAQ;AACrB,UAAM,aAAa,eAAe,KAAK,KAAK,SAAS,iBAAiB,IAAI,KAAK,KAAK,SAAS,YAAY;AACzG,UAAM,aAAa,WAAW,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,KAAK,aAAa,CAAC,CAAC;AAC7F,QAAI,WAAW,WAAW,EAAG;AAC7B,QAAI,SAAS,UAAU;AACrB,WAAK,eAAe,CAAC,EAAE,MAAM,WAAW,CAAC,GAAG,UAAU,MAAM,aAAa,KAAK,CAAC,CAAC;AAChF;AAAA,IACF;AACA,SAAK,eAAe,WAAW,IAAI,CAAC,UAAU,EAAE,MAAM,UAAU,KAAK,EAAE,CAAC;AAAA,EAC1E;AAAA,EAEA,cAAoB;AAClB,SAAK,eAAe,CAAC,GAAG,IAAI;AAAA,EAC9B;AAAA,EAEA,oBAA6B;AAC3B,UAAM,OAAO,KAAK,KAAK,SAAS,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,EAAE,OAAO;AAC1F,UAAM,aAAa,KAAK,OAAO,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;AAC1D,QAAI,WAAW,WAAW,EAAG,QAAO;AACpC,QAAI,KAAK,KAAK,SAAS,YAAY;AACjC,YAAM,QAAQ,KAAK,KAAK,SAAS,qBAAqB;AACtD,UAAI,WAAW,SAAS,MAAO,QAAO;AAAA,IACxC;AACA,WAAO,WAAW,MAAM,CAAC,MAAM,KAAK,YAAY,IAAI,EAAE,EAAE,CAAC;AAAA,EAC3D;AAAA,EAEA,2BAAoC;AAClC,UAAM,OAAO,KAAK,KAAK,SAAS,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,EAAE,OAAO;AAC1F,UAAM,aAAa,KAAK,OAAO,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;AAC1D,UAAM,QAAQ,WAAW,OAAO,CAAC,KAAK,MAAM,OAAO,KAAK,YAAY,IAAI,EAAE,EAAE,IAAI,IAAI,IAAI,CAAC;AACzF,QAAI,UAAU,EAAG,QAAO;AACxB,QAAI,KAAK,KAAK,SAAS,YAAY;AACjC,YAAM,QAAQ,KAAK,KAAK,SAAS,qBAAqB;AACtD,UAAI,WAAW,SAAS,MAAO,QAAO;AAAA,IACxC;AACA,WAAO,QAAQ,KAAK,QAAQ,WAAW;AAAA,EACzC;AAAA,EAEA,qBACE,SACA,cAAc,OACR;AACN,SAAK,eAAe,SAAS,WAAW;AAAA,EAC1C;AAAA,EAEQ,eACN,SACA,WAAW,OACL;AACN,UAAM,SAAS,IAAI,IAAI,KAAK,WAAW;AACvC,UAAM,cAAc,YAAY,QAAQ,KAAK,CAAC,MAAM,EAAE,WAAW;AACjE,UAAM,SAAS,KAAK,KAAK,SAAS,UAAU,KAAK,KAAK,QAAQ;AAE9D,QAAI,aAAa;AACf,YAAM,OAAO,WACT,oBAAI,IAAY,IAChB,IAAI,IAAI,QAAQ,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAO,SAAS,KAAK,WAAW,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,CAAE,CAAC;AAC9G,WAAK,cAAc;AAAA,IACrB;AAEA,eAAW,KAAK,SAAS;AACvB,UAAI,CAAC,KAAK,aAAa,EAAE,IAAI,EAAG;AAChC,YAAM,UAAU,SAAS,KAAK,WAAW,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE;AAC7D,iBAAW,MAAM,SAAS;AACxB,YAAI,EAAE,SAAU,MAAK,YAAY,IAAI,EAAE;AAAA,YAClC,MAAK,YAAY,OAAO,EAAE;AAAA,MACjC;AAAA,IACF;AAEA,UAAM,aAAa,oBAAI,IAAY;AACnC,eAAW,MAAM,oBAAI,IAAI,CAAC,GAAG,QAAQ,GAAG,KAAK,WAAW,CAAC,GAAG;AAC1D,UAAI,OAAO,IAAI,EAAE,MAAM,KAAK,YAAY,IAAI,EAAE,EAAG,YAAW,IAAI,EAAE;AAAA,IACpE;AAEA,UAAM,eAAe,oBAAI,IAAqB;AAC9C,eAAW,QAAQ,KAAK,KAAK,SAAS,YAAY,GAAG;AACnD,mBAAa,IAAI,KAAK,IAAI,KAAK,QAAQ;AAAA,IACzC;AACA,UAAM,oBAAoB,IAAI,IAAI,KAAK,gBAAgB;AAEvD,SAAK,kBAAkB;AAEvB,UAAM,iBAA2B,CAAC;AAClC,UAAM,UAAU,oBAAI,IAAY,CAAC,GAAG,YAAY,GAAG,mBAAmB,GAAG,KAAK,gBAAgB,CAAC;AAC/F,eAAW,QAAQ,KAAK,KAAK,SAAS,YAAY,GAAG;AACnD,YAAM,QAAQ,KAAK,YAAY,IAAI,KAAK,EAAE;AAC1C,WAAK,WAAW;AAChB,UAAI,QAAQ,IAAI,KAAK,EAAE,KAAK,aAAa,IAAI,KAAK,EAAE,MAAM,OAAO;AAC/D,YAAI,KAAK,YAAY,EAAG,gBAAe,KAAK,KAAK,QAAQ;AAAA,MAC3D;AAAA,IACF;AAEA,QAAI,WAAW,OAAO,GAAG;AACvB,WAAK,KAAK,aAAa,YAAY,cAAc;AACjD,WAAK,KAAK,eAAe,yBAAyB;AAClD,WAAK,KAAK,KAAK,oBAAoB;AAAA,QACjC,eAAe,KAAK,iBAAiB;AAAA,QACrC,cAAc,KAAK,gBAAgB;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,WAAW,MAA8B;AAC/C,UAAM,MAAgB,CAAC,KAAK,EAAE;AAC9B,UAAM,OAAO,CAAC,OAAe;AAC3B,iBAAW,WAAW,KAAK,KAAK,SAAS,eAAe,EAAE,GAAG;AAC3D,YAAI,KAAK,OAAO;AAChB,aAAK,OAAO;AAAA,MACd;AAAA,IACF;AACA,SAAK,KAAK,EAAE;AACZ,WAAO;AAAA,EACT;AAAA,EAEQ,oBAA0B;AAChC,SAAK,iBAAiB,MAAM;AAC5B,QAAI,CAAC,KAAK,KAAK,SAAS,OAAQ;AAEhC,UAAM,WAAW,CAAC,OAAgD;AAChE,YAAM,WAAW,KAAK,KAAK,SAAS,eAAe,EAAE;AACrD,UAAI,SAAS,WAAW,GAAG;AACzB,eAAO,EAAE,KAAK,KAAK,YAAY,IAAI,EAAE,GAAG,MAAM,KAAK,YAAY,IAAI,EAAE,EAAE;AAAA,MACzE;AACA,UAAI,MAAM;AACV,UAAI,OAAO;AACX,iBAAW,WAAW,UAAU;AAC9B,cAAM,QAAQ,SAAS,OAAO;AAC9B,YAAI,MAAM,IAAK,QAAO;AAAA,iBACb,MAAM,MAAM;AACnB,iBAAO;AACP,gBAAM;AAAA,QACR,OAAO;AACL,gBAAM;AAAA,QACR;AAAA,MACF;AACA,UAAI,QAAQ,CAAC,IAAK,MAAK,iBAAiB,IAAI,EAAE;AAC9C,UAAI,IAAK,MAAK,YAAY,IAAI,EAAE;AAAA,UAC3B,MAAK,YAAY,OAAO,EAAE;AAC/B,aAAO,EAAE,KAAK,KAAK;AAAA,IACrB;AAEA,eAAW,QAAQ,KAAK,KAAK,SAAS,aAAa,GAAG;AACpD,eAAS,KAAK,EAAE;AAAA,IAClB;AACA,eAAW,QAAQ,KAAK,KAAK,SAAS,YAAY,GAAG;AACnD,WAAK,WAAW,KAAK,YAAY,IAAI,KAAK,EAAE;AAAA,IAC9C;AAAA,EACF;AACF;;;AClTO,SAAS,GAAG,KAAa,WAAoB,OAA6C;AAC/F,QAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAI,UAAW,GAAE,YAAY;AAC7B,MAAI,OAAO;AACT,eAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,QAAE,aAAa,KAAK,MAAM,GAAG,CAAC;AAAA,IAChC;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,MAAM,GAAW,KAAa,KAAqB;AACjE,SAAO,IAAI,MAAM,MAAM,IAAI,MAAM,MAAM;AACzC;AAaO,IAAM,cACX;AAEK,IAAM,gBACX;AAEK,IAAM,iBACX;;;AC5BK,IAAM,gBAAN,MAAoB;AAAA,EAWzB,YAAoB,MAAqB;AAArB;AAVpB,SAAQ,SAMG;AACX,SAAQ,QAAQ;AAChB,SAAQ,eAAe;AAoBvB,SAAQ,SAAS,CAAC,MAA0B;AAC1C,YAAM,SAAS,KAAK;AACpB,UAAI,CAAC,OAAQ;AACb,YAAM,MAAM,OAAO,OAAO;AAC1B,YAAM,MAAM,IAAI,YAAY;AAC5B,YAAM,MAAM,IAAI,YAAY,OAAO;AACnC,WAAK,eAAe,MAAM,OAAO,cAAc,EAAE,UAAU,OAAO,SAAS,KAAK,GAAG;AACnF,UAAI,KAAK,MAAO;AAChB,WAAK,QAAQ,sBAAsB,MAAM;AACvC,aAAK,QAAQ;AACb,cAAM,UAAU,KAAK;AACrB,YAAI,CAAC,QAAS;AACd,aAAK,KAAK,YAAY,eAAe,QAAQ,QAAQ,KAAK,YAAY;AACtE,aAAK,KAAK,gBAAgB;AAC1B,aAAK,KAAK,KAAK,iBAAiB;AAAA,UAC9B,OAAO,QAAQ,OAAO;AAAA,UACtB,OAAO,KAAK;AAAA,UACZ,UAAU;AAAA,QACZ,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,SAAQ,OAAO,CAAC,MAA0B;AACxC,YAAM,SAAS,KAAK;AACpB,UAAI,CAAC,OAAQ;AACb,WAAK,SAAS;AACd,UAAI,KAAK,OAAO;AACd,6BAAqB,KAAK,KAAK;AAC/B,aAAK,KAAK,YAAY,eAAe,OAAO,QAAQ,KAAK,YAAY;AACrE,aAAK,KAAK,gBAAgB;AAAA,MAC5B;AACA,WAAK,QAAQ;AACb,aAAO,OAAO,oBAAoB,eAAe,KAAK,MAAM;AAC5D,aAAO,OAAO,oBAAoB,aAAa,KAAK,IAAI;AACxD,aAAO,OAAO,oBAAoB,iBAAiB,KAAK,IAAI;AAC5D,UAAI;AACF,eAAO,OAAO,sBAAsB,EAAE,SAAS;AAAA,MACjD,QAAQ;AAAA,MAER;AACA,WAAK,KAAK,SAAS,KAAK,UAAU,OAAO,qBAAqB;AAC9D,WAAK,KAAK,KAAK,iBAAiB;AAAA,QAC9B,OAAO,OAAO,OAAO;AAAA,QACrB,OAAO,OAAO,OAAO,eAAe,OAAO,OAAO;AAAA,QAClD,UAAU;AAAA,MACZ,CAAC;AACD,WAAK,KAAK,mBAAmB;AAAA,IAC/B;AAAA,EAjE0C;AAAA,EAE1C,YAAY,GAAiB,QAAsB;AACjD,UAAM,SAAS,EAAE;AACjB,UAAM,MAAM,OAAO;AACnB,UAAM,aAAa,OAAO,eAAe,OAAO;AAChD,UAAM,WAAW,IAAI,YAAY;AACjC,QAAI,aAAa,YAAY,IAAI,SAAS,MAAM;AAC9C,aAAO,cAAc;AAAA,IACvB;AACA,SAAK,SAAS,EAAE,QAAQ,QAAQ,EAAE,SAAS,YAAY,OAAO,eAAe,YAAY,WAAW,EAAE,WAAW,OAAO;AACxH,WAAO,kBAAkB,EAAE,SAAS;AACpC,WAAO,iBAAiB,eAAe,KAAK,MAAM;AAClD,WAAO,iBAAiB,aAAa,KAAK,IAAI;AAC9C,WAAO,iBAAiB,iBAAiB,KAAK,IAAI;AAClD,SAAK,KAAK,SAAS,KAAK,UAAU,IAAI,qBAAqB;AAAA,EAC7D;AAAA,EAmDA,UAAgB;AACd,yBAAqB,KAAK,KAAK;AAC/B,SAAK,QAAQ;AACb,QAAI,KAAK,QAAQ;AACf,YAAM,SAAS,KAAK;AACpB,WAAK,SAAS;AACd,aAAO,OAAO,oBAAoB,eAAe,KAAK,MAAM;AAC5D,aAAO,OAAO,oBAAoB,aAAa,KAAK,IAAI;AACxD,aAAO,OAAO,oBAAoB,iBAAiB,KAAK,IAAI;AAAA,IAC9D;AACA,SAAK,KAAK,SAAS,MAAM,UAAU,OAAO,qBAAqB;AAAA,EACjE;AACF;;;AC/FA,IAAM,iBAAiB;AAMhB,IAAM,oBAAN,MAAwB;AAAA,EAK7B,YAAoB,MAAyB;AAAzB;AAJpB,SAAQ,UAAqE;AAC7E,SAAQ,WAAwG;AAChH,SAAQ,gBAAgB;AAmBxB,SAAQ,SAAS,CAAC,MAA0B;AAC1C,UAAI,KAAK,UAAU;AACjB,aAAK,gBAAgB,CAAC;AACtB;AAAA,MACF;AACA,YAAM,UAAU,KAAK;AACrB,UAAI,CAAC,QAAS;AACd,UAAI,KAAK,IAAI,EAAE,UAAU,QAAQ,MAAM,IAAI,kBAAkB,KAAK,IAAI,EAAE,UAAU,QAAQ,MAAM,IAAI,gBAAgB;AAClH;AAAA,MACF;AACA,WAAK,UAAU,CAAC;AAAA,IAClB;AAwDA,SAAQ,OAAO,MAAY;AACzB,YAAM,WAAW,KAAK;AACtB,WAAK,UAAU;AACf,WAAK,QAAQ;AACb,UAAI,CAAC,SAAU;AACf,WAAK,WAAW;AAChB,eAAS,OAAO,UAAU,OAAO,4BAA4B;AAC7D,eAAS,UAAU,OAAO;AAC1B,WAAK,KAAK,SAAS,KAAK,UAAU,OAAO,qBAAqB;AAC9D,UAAI,SAAS,eAAe,GAAG;AAC7B,aAAK,KAAK,WAAW,SAAS,OAAO,IAAI,SAAS,WAAW;AAAA,MAC/D;AAAA,IACF;AAAA,EAhG8C;AAAA,EAE9C,cAAc,GAAiB,QAAsB;AACnD,QAAI,EAAE,WAAW,EAAG;AACpB,QAAI,CAAC,OAAO,QAAS;AACrB,SAAK,UAAU,EAAE,QAAQ,QAAQ,EAAE,SAAS,QAAQ,EAAE,QAAQ;AAC9D,WAAO,iBAAiB,eAAe,KAAK,MAAM;AAClD,WAAO,iBAAiB,aAAa,KAAK,IAAI;AAC9C,WAAO,iBAAiB,iBAAiB,KAAK,IAAI;AAAA,EACpD;AAAA,EAEA,UAAmB;AACjB,UAAM,QAAQ,KAAK;AACnB,SAAK,gBAAgB;AACrB,WAAO;AAAA,EACT;AAAA,EAeQ,UAAU,GAAuB;AACvC,UAAM,UAAU,KAAK;AACrB,QAAI,CAAC,QAAS;AACd,UAAM,SAAS,KAAK,eAAe,QAAQ,MAAM;AACjD,QAAI,CAAC,UAAU,CAAC,OAAO,eAAe;AACpC,WAAK,QAAQ;AACb;AAAA,IACF;AACA,SAAK,gBAAgB;AACrB,UAAM,YAAY,GAAG,OAAO,qBAAqB;AACjD,WAAO,cAAc,YAAY,SAAS;AAC1C,WAAO,UAAU,IAAI,4BAA4B;AACjD,SAAK,KAAK,SAAS,KAAK,UAAU,IAAI,qBAAqB;AAC3D,SAAK,WAAW,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,WAAW,aAAa,GAAG;AAC7E,SAAK,gBAAgB,CAAC;AAAA,EACxB;AAAA,EAEQ,eAAe,QAAoC;AACzD,UAAM,OAAO,KAAK,KAAK,aAAa,cAAc,MAAM;AACxD,UAAM,YAAY,KAAK,KAAK,SAAS,oBAAoB,IAAI;AAC7D,WAAO,UAAU,cAA2B,kCAAkC,UAAU,OAAO,EAAE,CAAC,IAAI;AAAA,EACxG;AAAA,EAEQ,gBAAgB,GAAuB;AAC7C,UAAM,WAAW,KAAK;AACtB,QAAI,CAAC,SAAU;AACf,UAAM,OAAO,KAAK,KAAK,aAAa,cAAc,SAAS,MAAM;AACjE,UAAM,YAAY,KAAK,KAAK,SAAS,oBAAoB,IAAI;AAC7D,UAAM,UAAU,UAAU,sBAAsB;AAChD,UAAM,OAAO,KAAK,KAAK,YAAY,eAAe,IAAI;AACtD,UAAM,YAAY,KAAK,QAAQ,SAAS,MAAM;AAE9C,UAAM,IAAI,EAAE,UAAU,QAAQ;AAC9B,QAAI,SAAS;AACb,QAAI,aAAa;AACjB,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,MAAM,MAAM,KAAK,CAAC,EAAE,eAAe;AACzC,UAAI,IAAI,KAAK;AACX,iBAAS;AACT,qBAAa;AACb;AAAA,MACF;AACA,aAAO,KAAK,CAAC,EAAE;AAAA,IACjB;AACA,QAAI,SAAS,GAAG;AACd,eAAS,KAAK;AACd,mBAAa;AAAA,IACf;AAEA,aAAS,cAAc,SAAS,YAAY,SAAS,IAAI;AACzD,aAAS,UAAU,MAAM,OAAO,GAAG,UAAU;AAAA,EAC/C;AAAA,EAgBQ,UAAgB;AACtB,WAAO,oBAAoB,eAAe,KAAK,MAAM;AACrD,WAAO,oBAAoB,aAAa,KAAK,IAAI;AACjD,WAAO,oBAAoB,iBAAiB,KAAK,IAAI;AAAA,EACvD;AAAA,EAEA,UAAgB;AACd,SAAK,QAAQ;AACb,QAAI,KAAK,UAAU;AACjB,WAAK,SAAS,OAAO,UAAU,OAAO,4BAA4B;AAClE,WAAK,SAAS,UAAU,OAAO;AAC/B,WAAK,KAAK,SAAS,KAAK,UAAU,OAAO,qBAAqB;AAC9D,WAAK,WAAW;AAAA,IAClB;AACA,SAAK,UAAU;AAAA,EACjB;AACF;AAEA,SAAS,UAAU,OAAuB;AACxC,SAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,WAAW,aACvD,IAAI,OAAO,KAAK,IAChB,MAAM,QAAQ,mBAAmB,MAAM;AAC7C;;;ACrIO,SAAS,UAAU,OAAY,WAA2B;AAC/D,QAAM,IAAI,SAAS,OAAO,KAAK,OAAO,KAAK;AAC3C,MAAI,EAAE,SAAS,SAAS,KAAK,EAAE,SAAS,GAAG,KAAK,EAAE,SAAS,IAAI,KAAK,EAAE,SAAS,IAAI,GAAG;AACpF,WAAO,MAAM,EAAE,QAAQ,MAAM,IAAI,IAAI;AAAA,EACvC;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,OAAiB;AACnD,MAAI,OAAO,UAAU,YAAY,UAAU,GAAI,QAAO;AACtD,MAAI,kDAAkD,KAAK,KAAK,EAAG,QAAO;AAC1E,MAAI,6BAA6B,KAAK,KAAK,EAAG,QAAO,MAAM;AAC3D,SAAO;AACT;AAOO,SAAS,SAAY,UAA6B,SAA0B,CAAC,GAAW;AAC7F,QAAM,YAAY,OAAO,mBAAmB;AAC5C,QAAM,gBAAgB,OAAO,iBAAiB;AAC9C,QAAM,kBAAkB,OAAO,mBAAmB;AAClD,QAAM,QAAkB,CAAC;AAEzB,MAAI,eAAe;AACjB,UAAM,KAAK,SAAS,gBAAgB,EAAE,IAAI,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC,EAAE,KAAK,SAAS,CAAC;AAAA,EAC3F;AACA,aAAW,OAAO,SAAS,aAAa,GAAG;AACzC,UAAM;AAAA,MACJ,IAAI,IAAI,CAAC,MAAM,UAAU,kBAAkB,oBAAoB,CAAC,IAAI,GAAG,SAAS,CAAC,EAAE,KAAK,SAAS;AAAA,IACnG;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,KAAK,MAAM;AAC9B,SAAO,OAAO,aAAa,WAAW,OAAO;AAC/C;;;ACrCA,SAAS,WAAW,OAAY,iBAAkC;AAChE,QAAM,OAAO,kBAAkB,oBAAoB,KAAK,IAAI;AAC5D,QAAM,IAAI,QAAQ,OAAO,KAAK,OAAO,IAAI;AACzC,MAAI,YAAY,KAAK,CAAC,GAAG;AACvB,WAAO,MAAM,EAAE,QAAQ,MAAM,IAAI,IAAI;AAAA,EACvC;AACA,SAAO;AACT;AAEO,SAAS,MAAM,MAAe,kBAAkB,MAAc;AACnE,SAAO,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,WAAW,OAAO,eAAe,CAAC,EAAE,KAAK,GAAI,CAAC,EAAE,KAAK,IAAI;AACvG;AAEO,SAAS,SAAS,MAA0B;AACjD,SAAO,eAAe,MAAM,GAAI;AAClC;AAEO,SAAS,SAAS,MAAc,YAAY,KAAiB;AAClE,SAAO,eAAe,MAAM,SAAS;AACvC;AAEO,SAAS,eAAe,MAAc,WAA+B;AAC1E,QAAM,OAAmB,CAAC;AAC1B,MAAI,MAAgB,CAAC;AACrB,MAAI,OAAO;AACX,MAAI,WAAW;AACf,MAAI,IAAI;AAER,SAAO,IAAI,KAAK,QAAQ;AACtB,UAAM,KAAK,KAAK,CAAC;AACjB,QAAI,UAAU;AACZ,UAAI,OAAO,KAAK;AACd,YAAI,KAAK,IAAI,CAAC,MAAM,KAAK;AACvB,kBAAQ;AACR,eAAK;AACL;AAAA,QACF;AACA,mBAAW;AACX;AACA;AAAA,MACF;AACA,cAAQ;AACR;AACA;AAAA,IACF;AACA,QAAI,OAAO,OAAO,SAAS,IAAI;AAC7B,iBAAW;AACX;AACA;AAAA,IACF;AACA,QAAI,OAAO,WAAW;AACpB,UAAI,KAAK,IAAI;AACb,aAAO;AACP;AACA;AAAA,IACF;AACA,QAAI,OAAO,QAAQ,OAAO,MAAM;AAC9B,UAAI,KAAK,IAAI;AACb,WAAK,KAAK,GAAG;AACb,YAAM,CAAC;AACP,aAAO;AACP,UAAI,OAAO,QAAQ,KAAK,IAAI,CAAC,MAAM,KAAM,MAAK;AAAA,UACzC;AACL;AAAA,IACF;AACA,YAAQ;AACR;AAAA,EACF;AAEA,MAAI,SAAS,MAAM,IAAI,SAAS,GAAG;AACjC,QAAI,KAAK,IAAI;AACb,SAAK,KAAK,GAAG;AAAA,EACf;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,MAAuB;AACtD,MAAI,KAAiC;AACrC,MAAI;AACF,SAAK,SAAS,cAAc,UAAU;AACtC,OAAG,QAAQ;AACX,OAAG,MAAM,WAAW;AACpB,OAAG,MAAM,UAAU;AACnB,aAAS,KAAK,YAAY,EAAE;AAC5B,OAAG,MAAM;AACT,OAAG,OAAO;AACV,UAAM,KAAK,SAAS,YAAY,MAAM;AACtC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT,UAAE;AACA,QAAI,OAAO;AAAA,EACb;AACF;AAEA,eAAsB,eAAe,MAAgC;AACnE,MAAI;AACF,QAAI,OAAO,cAAc,eAAe,UAAU,WAAW,WAAW;AACtE,YAAM,UAAU,UAAU,UAAU,IAAI;AACxC,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO,iBAAiB,IAAI;AAC9B;;;ACvFO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAAoB,MAAuB;AAAvB;AAyDpB,SAAQ,SAAS,CAAC,MAA4B;AAC5C,UAAI,KAAK,KAAK,QAAQ,qBAAqB,KAAK,KAAK,eAAe,UAAU,EAAG;AACjF,YAAM,QAAQ,KAAK,KAAK,aAAa,0BAA0B;AAC/D,UAAI,CAAC,MAAO;AACZ,YAAM,OAAO,KAAK,KAAK,cAAc,KAAK;AAC1C,YAAM,KAAK,EAAE;AACb,UAAI,MAAM,OAAO,GAAG,YAAY,YAAY;AAC1C,WAAG,QAAQ,cAAc,IAAI;AAAA,MAC/B,OAAO;AACL,aAAK,eAAe,IAAI;AAAA,MAC1B;AACA,QAAE,eAAe;AAAA,IACnB;AAEA,SAAQ,QAAQ,CAAC,MAA4B;AAC3C,UAAI,KAAK,KAAK,QAAQ,qBAAqB,KAAK,KAAK,eAAe,UAAU,EAAG;AACjF,YAAM,QAAQ,KAAK,KAAK,aAAa,0BAA0B;AAC/D,UAAI,CAAC,MAAO;AACZ,YAAM,OAAO,KAAK,KAAK,cAAc,KAAK;AAC1C,YAAM,KAAK,EAAE;AACb,UAAI,MAAM,OAAO,GAAG,YAAY,YAAY;AAC1C,WAAG,QAAQ,cAAc,IAAI;AAAA,MAC/B,OAAO;AACL,aAAK,eAAe,IAAI;AAAA,MAC1B;AACA,WAAK,KAAK,iBAAiB,KAAK;AAChC,QAAE,eAAe;AAAA,IACnB;AAEA,SAAQ,UAAU,CAAC,MAA4B;AAC7C,UAAI,KAAK,KAAK,QAAQ,qBAAqB,KAAK,KAAK,eAAe,UAAU,EAAG;AACjF,YAAM,QAAQ,KAAK,KAAK,aAAa,cAAc;AACnD,UAAI,CAAC,MAAO;AACZ,YAAM,KAAK,EAAE;AACb,YAAM,OAAO,MAAM,OAAO,GAAG,YAAY,aAAa,GAAG,QAAQ,YAAY,IAAI;AACjF,UAAI,OAAO,SAAS,YAAY,SAAS,GAAI;AAC7C,QAAE,eAAe;AACjB,WAAK,KAAK,UAAU,MAAM,MAAM,KAAK,MAAM,MAAM;AAAA,IACnD;AAEA,SAAQ,YAAY,CAAC,MAA2B;AAC9C,UAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,UAAI,KAAK,KAAK,eAAe,UAAU,EAAG;AAE1C,WAAK,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,OAAO,EAAE,QAAQ,MAAM;AAChE,YAAI,KAAK,KAAK,QAAQ,iBAAiB,YAAY;AACjD,YAAE,eAAe;AACjB,eAAK,KAAK,iBAAiB,UAAU,IAAI;AAAA,QAC3C;AACA;AAAA,MACF;AAEA,WAAK,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,QAAQ;AACzC,cAAM,MAAM,EAAE,IAAI,YAAY;AAC9B,YAAI,QAAQ,KAAK;AACf,YAAE,eAAe;AACjB,cAAI,EAAE,SAAU,MAAK,KAAK,YAAY,KAAK;AAAA,cACtC,MAAK,KAAK,YAAY,KAAK;AAChC;AAAA,QACF;AACA,YAAI,QAAQ,KAAK;AACf,YAAE,eAAe;AACjB,eAAK,KAAK,YAAY,KAAK;AAC3B;AAAA,QACF;AAAA,MACF;AAEA,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,CAAC,eAAe,SAAS,EAAE,GAAG,EAAG;AAErC,YAAM,OAAO,KAAK,KAAK;AACvB,YAAM,QAAQ,KAAK;AAEnB,UAAI,EAAE,QAAQ,UAAU;AACtB,YAAI,KAAK,KAAK,QAAQ,wBAAwB,KAAK,gBAAgB,GAAG;AACpE,YAAE,eAAe;AACjB,eAAK,oBAAoB;AAAA,QAC3B;AACA;AAAA,MACF;AAEA,UAAI,EAAE,QAAQ,YAAY,EAAE,QAAQ,aAAa;AAC/C,YAAI,KAAK,KAAK,QAAQ,sBAAsB;AAC1C,gBAAM,QAAQ,KAAK,gBAAgB;AACnC,cAAI,SAAS,EAAE,MAAM,OAAO,MAAM,MAAM,MAAM,OAAO,MAAM,KAAK;AAC9D,cAAE,eAAe;AACjB,iBAAK,KAAK,iBAAiB,KAAK;AAChC;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AAEA,UAAI,CAAC,OAAO;AACV,YAAI,KAAK,KAAK,SAAS,qBAAqB,IAAI,GAAG;AACjD,gBAAMA,QAAO,KAAK,KAAK,YAAY,kBAAkB;AACrD,cAAIA,MAAK,SAAS,GAAG;AACnB,cAAE,eAAe;AACjB,iBAAK,eAAe,GAAGA,MAAK,CAAC,EAAE,EAAE;AAAA,UACnC;AAAA,QACF;AACA;AAAA,MACF;AAEA,YAAM,OAAO,KAAK,KAAK,YAAY,kBAAkB;AACrD,YAAM,SAAS,KAAK,UAAU,CAAC,MAAM,EAAE,OAAO,MAAM,KAAK;AACzD,UAAI,SAAS,EAAG;AAChB,YAAM,WAAW,KAAK,KAAK,SAAS,qBAAqB;AACzD,UAAI,aAAa,EAAG;AAEpB,YAAM,YAAY,EAAE,YAAY,KAAK,KAAK,QAAQ;AAElD,UAAI,MAAM,MAAM;AAChB,UAAI,UAAU;AACd,UAAI,UAAU;AACd,UAAI,aAAa;AAEjB,cAAQ,EAAE,KAAK;AAAA,QACb,KAAK;AACH,oBAAU,KAAK,eAAe,MAAM,GAAG,EAAE;AACzC,cAAI,WAAW,EAAG,OAAM;AACxB;AAAA,QACF,KAAK;AACH,oBAAU,KAAK,eAAe,MAAM,GAAG,CAAC;AACxC,cAAI,WAAW,KAAK,UAAU,SAAU,OAAM;AAC9C;AAAA,QACF,KAAK;AACH,uBAAa,KAAK,IAAI,GAAG,SAAS,CAAC;AACnC;AAAA,QACF,KAAK;AACH,uBAAa,KAAK,IAAI,KAAK,SAAS,GAAG,SAAS,CAAC;AACjD;AAAA,QACF,KAAK;AACH,uBAAa;AACb,cAAI,EAAE,QAAS,OAAM;AACrB;AAAA,QACF,KAAK;AACH,uBAAa,KAAK,SAAS;AAC3B,cAAI,EAAE,QAAS,OAAM,KAAK,IAAI,GAAG,KAAK,eAAe,WAAW,GAAG,EAAE,CAAC;AACtE;AAAA,QACF,KAAK;AAAA,QACL,KAAK,YAAY;AACf,gBAAM,WAAW,KAAK,KAAK,SAAS,cAAc;AAClD,gBAAM,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,eAAe,KAAK,KAAK,QAAQ,SAAS,CAAC;AAC5F,gBAAM,SAAS,EAAE,QAAQ,WAAW,MAAM,WAAW,MAAM;AAC3D,gBAAM,UAAU,KAAK,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,GAAG,MAAM,CAAC,GAAG,EAAE,QAAQ,WAAW,KAAK,CAAC;AAC5G,cAAI,WAAW,EAAG,OAAM;AACxB;AAAA,QACF;AAAA,QACA,KAAK;AAAA,QACL,KAAK,MAAM;AACT,gBAAM,OAAO,KAAK,KAAK,SAAS,gBAAgB,GAAG;AACnD,gBAAM,SAAS,KAAK,MAAM;AAC1B,cAAI,QAAQ,CAAC,KAAK,YAAY,UAAU,KAAK,KAAK,eAAe,WAAW,MAAM,MAAM,GAAG;AACzF,iBAAK,KAAK,eAAe,MAAM,KAAK,QAAQ,EAAE,QAAQ,OAAO,EAAE,MAAM,IAAI;AAAA,UAC3E,OAAO;AACL,kBAAM,OAAO,KAAK,eAAe,MAAM,GAAG,CAAC;AAC3C,gBAAI,QAAQ,KAAK,OAAO,SAAU,OAAM;AAAA,UAC1C;AACA;AAAA,QACF;AAAA,QACA,KAAK,KAAK;AACR,gBAAM,OAAO,KAAK,KAAK,SAAS,gBAAgB,GAAG;AACnD,cAAI,QAAQ,CAAC,KAAK,UAAU;AAC1B,gBAAI,KAAK,SAAS;AAChB,mBAAK,KAAK,SAAS,YAAY,KAAK,EAAE;AAAA,YACxC,WAAW,KAAK,KAAK,QAAQ,iBAAiB,QAAQ;AACpD,mBAAK,KAAK,iBAAiB;AAAA,gBACzB;AAAA,gBACA,CAAC,KAAK;AAAA,gBACN,KAAK,KAAK,QAAQ,iBAAiB;AAAA,cACrC;AAAA,YACF;AAAA,UACF;AACA;AAAA,QACF;AAAA,QACA,KAAK,OAAO;AACV,gBAAM,OAAO,KAAK,aAAa,KAAK,MAAM,OAAO,EAAE,WAAW,KAAK,CAAC;AACpE,cAAI,MAAM;AACR,iBAAK,eAAe,KAAK,UAAU,KAAK,OAAO,EAAE;AACjD,iBAAK,KAAK,eAAe,MAAM,KAAK,UAAU,KAAK,MAAM;AAAA,UAC3D;AACA;AAAA,QACF;AAAA,QACA;AACE,oBAAU;AAAA,MACd;AAEA,UAAI,QAAS,GAAE,eAAe;AAE9B,UAAI,cAAc,QAAQ,MAAM,YAAY,eAAe,SAAS;AAClE,aAAK,aAAa,KAAK,UAAU;AACjC;AAAA,MACF;AAEA,UAAI,QAAQ,MAAM,YAAY,KAAK,MAAM,EAAE,OAAO,MAAM,OAAO;AAC7D,aAAK,eAAe,KAAK,KAAK,MAAM,EAAE,EAAE;AAAA,MAC1C;AAAA,IACF;AAAA,EA/Q4C;AAAA,EAE5C,OAAa;AACX,SAAK,KAAK,SAAS,KAAK,iBAAiB,WAAW,KAAK,SAAS;AAClE,SAAK,KAAK,SAAS,KAAK,iBAAiB,QAAQ,KAAK,MAAuB;AAC7E,SAAK,KAAK,SAAS,KAAK,iBAAiB,OAAO,KAAK,KAAsB;AAC3E,SAAK,KAAK,SAAS,KAAK,iBAAiB,SAAS,KAAK,OAAwB;AAAA,EACjF;AAAA,EAEA,UAAgB;AACd,SAAK,KAAK,SAAS,KAAK,oBAAoB,WAAW,KAAK,SAAS;AACrE,SAAK,KAAK,SAAS,KAAK,oBAAoB,QAAQ,KAAK,MAAuB;AAChF,SAAK,KAAK,SAAS,KAAK,oBAAoB,OAAO,KAAK,KAAsB;AAC9E,SAAK,KAAK,SAAS,KAAK,oBAAoB,SAAS,KAAK,OAAwB;AAAA,EACpF;AAAA,EAEA,aAAa,UAAkB,OAAe,KAA0D;AACtG,UAAM,OAAO,KAAK,KAAK,YAAY,kBAAkB;AACrD,UAAM,QAAQ,KAAK,UAAU,CAAC,MAAM,EAAE,OAAO,KAAK;AAClD,QAAI,QAAQ,EAAG,QAAO;AACtB,UAAM,WAAW,KAAK,KAAK,SAAS,qBAAqB;AACzD,QAAI,IAAI;AACR,QAAI,MAAM;AAEV,aAAS,QAAQ,GAAG,SAAS,KAAK,SAAS,MAAM,WAAW,IAAI,SAAS;AACvE,WAAK;AACL,UAAI,KAAK,KAAK,QAAQ;AACpB,YAAI,OAAO,WAAW,EAAG,QAAO;AAChC,YAAI;AACJ,cAAM,KAAK,eAAe,MAAM,GAAG,CAAC;AAAA,MACtC,WAAW,IAAI,GAAG;AAChB,YAAI,OAAO,EAAG,QAAO;AACrB,YAAI,KAAK,SAAS;AAClB,cAAM,KAAK,eAAe,MAAM,GAAG,EAAE;AAAA,MACvC;AACA,UAAI,MAAM,KAAK,OAAO,SAAU,QAAO;AACvC,YAAM,OAAO,KAAK,KAAK,SAAS,gBAAgB,GAAG;AACnD,UAAI,QAAQ,CAAC,KAAK,YAAY,KAAK,KAAK,eAAe,WAAW,MAAM,KAAK,CAAC,CAAC,GAAG;AAChF,eAAO,EAAE,UAAU,KAAK,QAAQ,KAAK,CAAC,EAAE;AAAA,MAC1C;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,KAAa,KAAqB;AACvD,UAAM,WAAW,KAAK,KAAK,SAAS,qBAAqB;AACzD,QAAI,QAAQ;AACZ,WAAO,OAAO,KAAK,MAAM,UAAU;AACjC,YAAM,OAAO,KAAK,KAAK,SAAS,gBAAgB,GAAG;AACnD,UAAI,CAAC,QAAQ,CAAC,KAAK,SAAU,QAAO;AACpC,aAAO;AACP;AACA,UAAI,QAAQ,WAAW,EAAG;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AAyNF;;;AClSA,SAAS,UAAU,MAAc,OAA8B;AAC7D,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,OAAO;AACb,QAAM,YAAY;AAClB,MAAI,SAAS,QAAQ,UAAU,IAAI;AACjC,UAAM,QAAQ,SAAS,SAAS,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,OAAO,KAAK;AAAA,EAC3E;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAY,cAA4C;AAC/E,MAAI,gBAAgB,aAAa,SAAS,EAAG,QAAO;AACpD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,iBAAiB,KAAM,QAAO;AAClC,MAAI,OAAO,UAAU,YAAY,qBAAqB,KAAK,KAAK,EAAG,QAAO;AAC1E,SAAO;AACT;AAEO,SAAS,aAAa,QAAgB,OAAY,UAAuC;AAC9F,QAAM,MAAM,OAAO;AACnB,QAAM,OAAO,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa,gBAAgB,OAAO,IAAI,kBAAkB,MAAM;AAEtH,MAAI,SAAS,UAAU;AACrB,UAAMC,SAAQ,UAAU,UAAU,KAAK;AACvC,WAAO;AAAA,MACL,IAAIA;AAAA,MACJ,UAAU,MAAOA,OAAM,UAAU,KAAK,OAAO,OAAOA,OAAM,KAAK;AAAA,MAC/D,OAAO,MAAM;AACX,QAAAA,OAAM,MAAM;AACZ,QAAAA,OAAM,OAAO;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,QAAQ;AACnB,UAAMA,SAAQ,UAAU,QAAQ,KAAK;AACrC,UAAM,MAAM,SAAS,OAAO,KAAK,OAAO,KAAK;AAC7C,UAAM,YAAY,IAAI,MAAM,gBAAgB;AAC5C,WAAO;AAAA,MACL,IAAIA;AAAA,MACJ,UAAU,MAAM;AACd,YAAIA,OAAM,UAAU,GAAI,QAAO;AAC/B,YAAI,UAAW,QAAO,GAAGA,OAAM,KAAK,IAAI,UAAU,CAAC,CAAC;AACpD,eAAOA,OAAM;AAAA,MACf;AAAA,MACA,OAAO,MAAMA,OAAM,MAAM;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,SAAS,UAAU;AACrB,UAAM,SAAS,IAAI,kBAAkB,UAAU,CAAC;AAChD,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,YAAY;AACnB,eAAW,KAAK,QAAQ;AACtB,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,QAAQ,OAAO,CAAC;AACvB,aAAO,cAAc,OAAO,CAAC;AAC7B,UAAI,OAAO,KAAK,MAAM,OAAO,CAAC,EAAG,QAAO,WAAW;AACnD,aAAO,YAAY,MAAM;AAAA,IAC3B;AACA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU,MAAM;AACd,cAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC,MAAM,OAAO,KAAK;AAC3D,eAAO,UAAU,SAAY,QAAQ,OAAO;AAAA,MAC9C;AAAA,MACA,OAAO,MAAM,OAAO,MAAM;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,QAAQ,UAAU,QAAQ,KAAK;AACrC,MAAI,YAAY,SAAS,WAAW,EAAG,OAAM,QAAQ;AACrD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU,MAAM,MAAM;AAAA,IACtB,OAAO,MAAM;AACX,YAAM,MAAM;AACZ,YAAM,OAAO;AAAA,IACf;AAAA,EACF;AACF;;;AC5EA,IAAM,aAAa,oBAAI,QAAuC;AAC9D,IAAM,mBAAmB,oBAAI,QAAiC;AAC9D,IAAM,mBAAmB,oBAAI,QAAiC;AAEvD,SAAS,oBAAoB,SAAwC;AAC1E,MAAI,QAAQ,WAAW,IAAI,OAAO;AAClC,MAAI,CAAC,OAAO;AACV,YAAQ,CAAC;AACT,eAAW,IAAI,SAAS,KAAK;AAAA,EAC/B;AACA,SAAO;AACT;AAEO,SAAS,qBAAqB,SAAoD;AACvF,SAAO,WAAW,IAAI,OAAO;AAC/B;AAEO,SAAS,mBAAmB,SAAsB,SAAyC;AAChG,MAAI,QAAS,kBAAiB,IAAI,SAAS,OAAO;AAAA,MAC7C,kBAAiB,OAAO,OAAO;AACtC;AAEO,SAAS,oBAAoB,SAAgD;AAClF,QAAM,UAAU,iBAAiB,IAAI,OAAO;AAC5C,mBAAiB,OAAO,OAAO;AAC/B,SAAO;AACT;AAEO,SAAS,mBAAmB,SAAsB,SAAyC;AAChG,MAAI,QAAS,kBAAiB,IAAI,SAAS,OAAO;AAAA,MAC7C,kBAAiB,OAAO,OAAO;AACtC;AAEO,SAAS,oBAAoB,SAAgD;AAClF,QAAM,UAAU,iBAAiB,IAAI,OAAO;AAC5C,mBAAiB,OAAO,OAAO;AAC/B,SAAO;AACT;;;AClCO,SAAS,cAAc,OAAoB;AAChD,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,iBAAiB,KAAM,QAAO,MAAM,mBAAmB;AAC3D,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI;AACF,aAAO,KAAK,UAAU,KAAK;AAAA,IAC7B,QAAQ;AACN,aAAO,OAAO,KAAK;AAAA,IACrB;AAAA,EACF;AACA,SAAO,OAAO,KAAK;AACrB;AAEO,SAAS,mBAAmB,MAAoB,MAAyB;AAC9E,QAAM,QAAQ,qBAAqB,IAAI;AACvC,MAAI,CAAC,MAAO;AACZ,MAAI,MAAM,WAAY,cAAa,MAAM,UAAU;AACnD,QAAM,aAAa;AACnB,QAAM,UAAU,MAAM;AACtB,QAAM,UAAU;AAChB,MAAI,CAAC,QAAS;AACd,MAAI;AACF,YAAQ;AAAA,EACV,SAAS,OAAO;AACd,SAAK,YAAY,OAAO,wBAAwB,EAAE,OAAO,KAAK,QAAQ,MAAM,CAAC;AAAA,EAC/E;AACF;AAEO,SAAS,gBAAgB,MAAwB,MAAoB,QAAwB;AAClG,QAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAM,YAAY,OAAO,OAAO;AAChC,MAAI,WAAW;AACb,QAAI;AACF,YAAM,MAAM,UAAU;AAAA,QACpB,KAAK,KAAK,OAAO;AAAA,QACjB,QAAQ,OAAO;AAAA,QACf;AAAA,QACA;AAAA,QACA,MAAM,KAAK;AAAA,QACX;AAAA,MACF,CAAC;AACD,aAAO,OAAO,OAAO,KAAK,OAAO,GAAG;AAAA,IACtC,SAAS,OAAO;AACd,WAAK,YAAY,OAAO,kBAAkB,EAAE,OAAO,OAAO,IAAI,OAAO,KAAK,GAAG,CAAC;AAAA,IAChF;AAAA,EACF;AACA,SAAO,cAAc,KAAK;AAC5B;AAEO,SAAS,oBAAoB,MAAwB,MAAoB,QAAgB,OAAoB;AAClH,QAAM,YAAY,OAAO,OAAO;AAChC,MAAI,WAAW;AACb,QAAI;AACF,YAAM,MAAM,UAAU;AAAA,QACpB,KAAK,KAAK,OAAO;AAAA,QACjB,QAAQ,OAAO;AAAA,QACf;AAAA,QACA;AAAA,QACA,MAAM,KAAK;AAAA,QACX;AAAA,MACF,CAAC;AACD,aAAO,OAAO,OAAO,KAAK,OAAO,GAAG;AAAA,IACtC,SAAS,OAAO;AACd,WAAK,YAAY,OAAO,kBAAkB,EAAE,OAAO,OAAO,IAAI,OAAO,KAAK,GAAG,CAAC;AAAA,IAChF;AAAA,EACF;AACA,SAAO,cAAc,KAAK;AAC5B;AAEO,SAAS,eAAe,MAAwB,MAAmB,MAAoB,QAAsB;AAClH,QAAM,OAAO,OAAO,OAAO;AAC3B,QAAM,QAAQ,oBAAoB,IAAI;AACtC,QAAM,WAAW,MAAM;AACvB,MAAI,UAAU;AACZ,eAAW,OAAO,UAAU;AAC1B,cAAQ,IAAI,KAAK,OAAO,KAAK,EAAE;AAAA,IACjC;AAAA,EACF;AACA,MAAI,CAAC,MAAM;AACT,UAAM,YAAY;AAClB;AAAA,EACF;AACA,MAAI;AACJ,MAAI,OAAO,SAAS,YAAY;AAC9B,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI;AACF,eAAS,KAAK;AAAA,QACZ,KAAK,KAAK,OAAO;AAAA,QACjB,QAAQ,OAAO;AAAA,QACf;AAAA,QACA;AAAA,QACA,MAAM,KAAK;AAAA,QACX;AAAA,QACA,UAAU,KAAK;AAAA,MACjB,CAAC;AAAA,IACH,SAAS,OAAO;AACd,WAAK,YAAY,OAAO,aAAa,EAAE,OAAO,OAAO,IAAI,OAAO,KAAK,GAAG,CAAC;AACzE,eAAS;AAAA,IACX;AAAA,EACF,OAAO;AACL,aAAS;AAAA,EACX;AACA,MAAI,CAAC,QAAQ;AACX,UAAM,YAAY;AAClB;AAAA,EACF;AACA,QAAM,OAAO,OAAO,KAAK,MAAM;AAC/B,aAAW,OAAO,MAAM;AACtB,YAAQ,IAAI,KAAK,OAAO,KAAK,QAAQ,IAAI,QAAQ,GAAG,CAAC;AAAA,EACvD;AACA,QAAM,YAAY;AACpB;AAEO,SAAS,kBAAkB,MAAyB,MAAmB,MAAoB,QAAsB;AACtH,qBAAmB,MAAM,IAAI;AAE7B,QAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAM,YAAY,gBAAgB,MAAM,MAAM,MAAM;AACpD,QAAM,cAAc,OAAO,OAAO;AAClC,QAAM,WACJ,OAAO,gBAAgB,WAAW,KAAK,oBAAoB,WAAW,IAAI;AAE5E,MAAI,UAAU;AACZ,UAAM,SAA6B;AAAA,MACjC,KAAK,KAAK,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,MACf;AAAA,MACA;AAAA,MACA,MAAM,KAAK;AAAA,MACX;AAAA,MACA;AAAA,MACA,UAAU,KAAK;AAAA,MACf,gBAAgB,OAAO,OAAO;AAAA,IAChC;AACA,QAAI;AACJ,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,IACvB,SAAS,OAAO;AACd,WAAK,YAAY,OAAO,gBAAgB,EAAE,OAAO,OAAO,IAAI,OAAO,KAAK,GAAG,CAAC;AAC5E,WAAK,cAAc;AACnB;AAAA,IACF;AACA,QAAI,OAAO,QAAQ,UAAU;AAC3B,WAAK,cAAc;AAAA,IACrB,WAAW,eAAe,aAAa;AACrC,WAAK,gBAAgB,GAAG;AAAA,IAC1B,WAAW,OAAO,OAAO,QAAQ,YAAa,IAA4B,cAAc,aAAa;AACnG,YAAM,SAAS;AACf,WAAK,gBAAgB,OAAO,EAAE;AAC9B,UAAI,OAAO,QAAS,qBAAoB,IAAI,EAAE,UAAU,OAAO;AAAA,IACjE,OAAO;AACL,WAAK,cAAc;AAAA,IACrB;AAAA,EACF,OAAO;AACL,SAAK,cAAc;AAAA,EACrB;AAEA,MAAI,UAAU;AACd,MAAI,KAAK,QAAQ,iBAAkB,WAAU;AAC7C,QAAM,gBAAgB,OAAO,OAAO;AACpC,MAAI,eAAe;AACjB,QAAI;AACF,YAAM,MAAM,cAAc;AAAA,QACxB,KAAK,KAAK,OAAO;AAAA,QACjB,QAAQ,OAAO;AAAA,QACf;AAAA,QACA;AAAA,QACA,MAAM,KAAK;AAAA,QACX;AAAA,MACF,CAAC;AACD,gBAAU,OAAO;AAAA,IACnB,SAAS,OAAO;AACd,WAAK,YAAY,OAAO,sBAAsB,EAAE,OAAO,OAAO,IAAI,OAAO,KAAK,GAAG,CAAC;AAAA,IACpF;AAAA,EACF;AACA,MAAI,SAAS;AACX,QAAI,KAAK,aAAa,OAAO,MAAM,QAAS,MAAK,aAAa,SAAS,OAAO;AAAA,EAChF,WAAW,KAAK,aAAa,OAAO,GAAG;AACrC,SAAK,gBAAgB,OAAO;AAAA,EAC9B;AACF;AAEO,SAAS,iBAAiB,MAAwB,MAAmB,MAAoB,QAAsB;AACpH,QAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAM,UAAU,CAAC,WAAW;AAC5B,QAAM,UAAU,OAAO,OAAO;AAC9B,QAAM,QAAQ,OAAO,OAAO;AAC5B,MAAI,UAAU,UAAU;AACtB,YAAQ,KAAK,mBAAmB;AAAA,EAClC,WAAW,UAAU,SAAS;AAC5B,YAAQ,KAAK,kBAAkB;AAAA,EACjC,WAAW,YAAY,kBAAkB,YAAY,mBAAoB,OAAO,UAAU,YAAY,SAAS,MAAO;AACpH,YAAQ,KAAK,gBAAgB;AAAA,EAC/B;AAEA,QAAM,OAAO,OAAO,OAAO;AAC3B,MAAI,MAAM;AACR,QAAI,OAAO,SAAS,YAAY;AAC9B,YAAM,SAA0B;AAAA,QAC9B,KAAK,KAAK,OAAO;AAAA,QACjB,QAAQ,OAAO;AAAA,QACf;AAAA,QACA;AAAA,QACA,MAAM,KAAK;AAAA,QACX;AAAA,QACA,UAAU,KAAK;AAAA,MACjB;AACA,UAAI;AACF,cAAM,SAAS,KAAK,MAAM;AAC1B,YAAI,OAAO,WAAW,SAAU,SAAQ,KAAK,MAAM;AAAA,iBAC1C,MAAM,QAAQ,MAAM,EAAG,SAAQ,KAAK,GAAG,MAAM;AAAA,MACxD,SAAS,OAAO;AACd,aAAK,YAAY,OAAO,aAAa,EAAE,OAAO,OAAO,IAAI,OAAO,KAAK,GAAG,CAAC;AAAA,MAC3E;AAAA,IACF,WAAW,OAAO,SAAS,UAAU;AACnC,cAAQ,KAAK,IAAI;AAAA,IACnB,WAAW,MAAM,QAAQ,IAAI,GAAG;AAC9B,cAAQ,KAAK,GAAG,IAAI;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,WAAW,KAAK,UAAU,SAAS,kBAAkB;AAC3D,QAAM,aAAa,KAAK,UAAU,SAAS,oBAAoB;AAC/D,MAAI,SAAU,SAAQ,KAAK,kBAAkB;AAC7C,MAAI,WAAY,SAAQ,KAAK,oBAAoB;AACjD,MAAI,OAAO,OAAO,SAAU,SAAQ,KAAK,iBAAiB;AAE1D,QAAM,YAAY,QAAQ,KAAK,GAAG;AAClC,MAAI,KAAK,cAAc,UAAW,MAAK,YAAY;AACrD;;;ACnNO,IAAM,iBAAN,MAAqB;AAAA,EAG1B,YAAoB,MAAsB;AAAtB;AAFpB,SAAQ,UAA+B;AA2NvC,SAAQ,kBAAkB,CAAC,MAA2B;AACpD,UAAI,CAAC,KAAK,QAAS;AACnB,UAAI,EAAE,QAAQ,SAAS;AACrB,UAAE,eAAe;AACjB,UAAE,gBAAgB;AAClB,aAAK,KAAK,KAAK;AAAA,MACjB,WAAW,EAAE,QAAQ,UAAU;AAC7B,UAAE,eAAe;AACjB,UAAE,gBAAgB;AAClB,aAAK,KAAK,IAAI;AAAA,MAChB,WAAW,EAAE,QAAQ,OAAO;AAC1B,UAAE,eAAe;AACjB,UAAE,gBAAgB;AAClB,cAAM,UAAU,KAAK;AACrB,cAAM,OAAO,KAAK,KAAK,gBAAgB,aAAa,QAAQ,UAAU,QAAQ,OAAO,IAAI,EAAE,WAAW,KAAK,CAAC;AAC5G,aAAK,KAAK,KAAK;AACf,YAAI,MAAM;AACR,eAAK,KAAK,aAAa,cAAc,KAAK,UAAU,SAAS;AAC7D,eAAK,KAAK,aAAa,eAAe,KAAK,UAAU,KAAK,OAAO,EAAE;AACnE,eAAK,MAAM,KAAK,UAAU,KAAK,MAAM;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AAEA,SAAQ,eAAe,MAAY;AACjC,aAAO,WAAW,MAAM;AACtB,YAAI,KAAK,QAAS,MAAK,KAAK,KAAK;AAAA,MACnC,GAAG,CAAC;AAAA,IACN;AAAA,EArP2C;AAAA,EAE3C,UAAU,UAAmB,OAAyB;AACpD,QAAI,CAAC,KAAK,QAAS,QAAO;AAC1B,QAAI,YAAY,QAAQ,SAAS,KAAM,QAAO;AAC9C,WAAO,KAAK,QAAQ,aAAa,YAAY,KAAK,QAAQ,OAAO,OAAO;AAAA,EAC1E;AAAA,EAEA,WAAW,MAAoB,QAAyB;AACtD,QAAI,KAAK,YAAY,KAAK,WAAW,KAAK,QAAQ,KAAM,QAAO;AAC/D,UAAM,WAAW,OAAO,OAAO;AAC/B,QAAI,CAAC,SAAU,QAAO;AACtB,QAAI,OAAO,aAAa,YAAY;AAClC,UAAI;AACF,eAAO,SAAS;AAAA,UACd,KAAK,KAAK,KAAK,OAAO;AAAA,UACtB,QAAQ,OAAO;AAAA,UACf;AAAA,UACA;AAAA,UACA,MAAM,KAAK;AAAA,UACX,OAAO,KAAK,KAAK,aAAa,MAAM,MAAM;AAAA,UAC1C,UAAU,KAAK;AAAA,QACjB,CAAC;AAAA,MACH,SAAS,OAAO;AACd,aAAK,KAAK,YAAY,OAAO,YAAY,EAAE,OAAO,OAAO,IAAI,OAAO,KAAK,GAAG,CAAC;AAC7E,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAkB,QAAgB,UAAmC;AACzE,QAAI,KAAK,QAAS,MAAK,KAAK,KAAK;AACjC,UAAM,OAAO,KAAK,KAAK,SAAS,gBAAgB,QAAQ;AACxD,QAAI,CAAC,QAAQ,KAAK,QAAQ,KAAM,QAAO;AACvC,QAAI,CAAC,KAAK,WAAW,MAAM,MAAM,EAAG,QAAO;AAC3C,UAAM,OAAO,KAAK,KAAK,aAAa,eAAe,UAAU,OAAO,EAAE;AACtE,QAAI,CAAC,KAAM,QAAO;AAElB,UAAM,QAAQ,KAAK,KAAK,aAAa,MAAM,MAAM;AACjD,UAAM,MAAM,OAAO;AACnB,QAAI;AACJ,UAAM,KAAK,IAAI;AACf,QAAI;AACF,UAAI,OAAO,OAAO,YAAY;AAC5B,iBAAS,GAAG;AAAA,UACV,KAAK,KAAK,KAAK,OAAO;AAAA,UACtB,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA,MAAM,KAAK;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,WAAW,OAAO,OAAO,YAAY,CAAC,CAAC,QAAQ,UAAU,QAAQ,QAAQ,EAAE,SAAS,EAAE,GAAG;AACvF,cAAM,UAAU,KAAK,KAAK,kBAAkB,EAAE;AAC9C,YAAI,SAAS;AACX,mBAAS,QAAQ;AAAA,YACf,KAAK,KAAK,KAAK,OAAO;AAAA,YACtB,QAAQ;AAAA,YACR;AAAA,YACA;AAAA,YACA,MAAM,KAAK;AAAA,YACX;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH,OAAO;AACL,mBAAS,aAAa,QAAQ,OAAO,QAAQ;AAAA,QAC/C;AAAA,MACF,OAAO;AACL,iBAAS,aAAa,QAAQ,OAAO,QAAQ;AAAA,MAC/C;AAAA,IACF,SAAS,OAAO;AACd,WAAK,KAAK,YAAY,OAAO,cAAc,EAAE,OAAO,OAAO,IAAI,OAAO,KAAK,GAAG,CAAC;AAC/E,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,UAAU,EAAE,OAAO,cAAc,cAAc;AAClD,WAAK,KAAK,YAAY,IAAI,MAAM,yDAAyD,GAAG,cAAc;AAAA,QACxG,OAAO,OAAO;AAAA,QACd,OAAO,KAAK;AAAA,MACd,CAAC;AACD,aAAO;AAAA,IACT;AAEA,QAAI;AACF,UAAI,OAAO,sBAAsB,GAAG;AAClC,eAAO,UAAU;AACjB,eAAO;AAAA,MACT;AAAA,IACF,SAAS,OAAO;AACd,WAAK,KAAK,YAAY,OAAO,kCAAkC,EAAE,OAAO,OAAO,IAAI,OAAO,KAAK,GAAG,CAAC;AACnG,UAAI;AAAE,eAAO,UAAU;AAAA,MAAG,QAAQ;AAAA,MAAU;AAC5C,aAAO;AAAA,IACT;AAEA,uBAAmB,KAAK,MAAM,IAAI;AAElC,SAAK,cAAc;AACnB,SAAK,UAAU,IAAI,oBAAoB;AACvC,SAAK,YAAY,OAAO,EAAE;AAC1B,SAAK,UAAU,EAAE,MAAM,QAAQ,QAAQ,UAAU,UAAU,MAAM;AAEjE,WAAO,GAAG,iBAAiB,WAAW,KAAK,eAAe;AAC1D,WAAO,GAAG,iBAAiB,YAAY,KAAK,YAAY;AACxD,QAAI;AACF,aAAO,QAAQ;AAAA,IACjB,SAAS,OAAO;AACd,WAAK,KAAK,YAAY,OAAO,oBAAoB,EAAE,OAAO,OAAO,IAAI,OAAO,KAAK,GAAG,CAAC;AAAA,IACvF;AAEA,SAAK,KAAK,KAAK,sBAAsB,EAAE,UAAU,OAAO,OAAO,IAAI,SAAS,KAAK,CAAC;AAClF,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,SAAS,OAAa;AACzB,UAAM,UAAU,KAAK;AACrB,QAAI,CAAC,QAAS;AACd,SAAK,UAAU;AAEf,QAAI;AACJ,QAAI,UAAU;AACd,QAAI,CAAC,QAAQ;AACX,UAAI;AACF,mBAAW,QAAQ,OAAO,SAAS;AAAA,MACrC,SAAS,OAAO;AACd,aAAK,KAAK,YAAY,OAAO,uBAAuB,EAAE,OAAO,QAAQ,OAAO,IAAI,OAAO,QAAQ,KAAK,GAAG,CAAC;AACxG,iBAAS;AAAA,MACX;AACA,UAAI,iBAAiB;AACrB,UAAI,CAAC,gBAAgB;AACnB,YAAI;AACF,2BAAiB,QAAQ,OAAO,mBAAmB,QAAQ,KAAK;AAAA,QAClE,SAAS,OAAO;AACd,eAAK,KAAK,YAAY,OAAO,+BAA+B,EAAE,OAAO,QAAQ,OAAO,IAAI,OAAO,QAAQ,KAAK,GAAG,CAAC;AAChH,2BAAiB;AAAA,QACnB;AAAA,MACF;AACA,UAAI,CAAC,gBAAgB;AACnB,cAAM,kBAAkB,KAAK,cAAc,SAAS,QAAQ;AAC5D,YAAI,OAAO,oBAAoB,UAAU;AACvC,eAAK,UAAU;AACf,eAAK,UAAU,SAAS,eAAe;AACvC;AAAA,QACF;AACA,kBAAU,KAAK,WAAW,SAAS,QAAQ;AAAA,MAC7C;AAAA,IACF;AAEA,YAAQ,OAAO,GAAG,oBAAoB,WAAW,KAAK,eAAe;AACrE,YAAQ,OAAO,GAAG,oBAAoB,YAAY,KAAK,YAAY;AACnE,QAAI;AACF,cAAQ,OAAO,UAAU;AAAA,IAC3B,SAAS,OAAO;AACd,WAAK,KAAK,YAAY,OAAO,sBAAsB,EAAE,OAAO,QAAQ,OAAO,IAAI,OAAO,QAAQ,KAAK,GAAG,CAAC;AAAA,IACzG;AAEA,UAAM,OAAO,KAAK,KAAK,aAAa,eAAe,QAAQ,UAAU,QAAQ,OAAO,EAAE;AACtF,QAAI,MAAM;AACR,WAAK,UAAU,OAAO,oBAAoB;AAC1C,WAAK,UAAU,OAAO,kBAAkB;AAAA,IAC1C;AAEA,SAAK,KAAK,KAAK,sBAAsB;AAAA,MACnC,UAAU,QAAQ;AAAA,MAClB,OAAO,QAAQ,OAAO;AAAA,MACtB,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ;AAAA,MAClB,UAAU,UAAU,WAAW,QAAQ;AAAA,IACzC,CAAC;AAED,QAAI,QAAQ,KAAK,YAAY,GAAG;AAC9B,WAAK,KAAK,aAAa,YAAY,CAAC,QAAQ,KAAK,QAAQ,CAAC;AAAA,IAC5D;AAAA,EACF;AAAA,EAEQ,cAAc,SAAuB,UAAiD;AAC5F,UAAM,WAAW,QAAQ,OAAO,OAAO;AACvC,QAAI,CAAC,SAAU,QAAO;AACtB,QAAI;AACF,aAAO,SAAS,UAAU;AAAA,QACxB,UAAU,QAAQ;AAAA,QAClB;AAAA,QACA,MAAM,QAAQ,KAAK;AAAA,QACnB,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ,OAAO;AAAA,QACvB,QAAQ,QAAQ;AAAA,QAChB,KAAK,KAAK,KAAK,OAAO;AAAA,MACxB,CAAC;AAAA,IACH,SAAS,OAAO;AACd,WAAK,KAAK,YAAY,OAAO,YAAY,EAAE,OAAO,QAAQ,OAAO,IAAI,OAAO,QAAQ,KAAK,GAAG,CAAC;AAC7F,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,UAAU,SAAuB,SAAuB;AAC9D,UAAM,WAAW,QAAQ,OAAO;AAChC,aAAS,UAAU,IAAI,qBAAqB;AAC5C,aAAS,aAAa,SAAS,OAAO;AACtC,aAAS,aAAa,gBAAgB,MAAM;AAC5C,UAAM,QAAQ,SAAS,cAAc,eAAe,KAAK;AACzD,IAAC,MAAsB,QAAQ;AAC/B,UAAM,QAAQ,MAAM;AAClB,eAAS,UAAU,OAAO,qBAAqB;AAC/C,eAAS,gBAAgB,OAAO;AAChC,eAAS,gBAAgB,cAAc;AAAA,IACzC;AACA,aAAS,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AAAA,EAC1D;AAAA,EAEQ,WAAW,SAAuB,UAAwB;AAChE,QAAI,aAAa,OAAW,QAAO;AACnC,WAAO,KAAK,KAAK,aAAa,QAAQ,MAAM,QAAQ,QAAQ,UAAU,QAAQ,QAAQ;AAAA,EACxF;AAAA,EAgCA,UAAgB;AACd,QAAI,KAAK,QAAS,MAAK,KAAK,IAAI;AAAA,EAClC;AACF;;;ACzRO,IAAM,iBAAiB;AAAA,EAC5B,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,yBAAyB;AAAA,EACzB,cAAc;AAAA,EACd,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,eAAe;AAAA,EACf,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AAAA,EACX,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,WAAW;AAAA,EACX,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AACZ;AAKO,IAAM,YAAsB;AAAA,EACjC,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,yBAAyB;AAAA,EACzB,cAAc;AAAA,EACd,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,eAAe;AAAA,EACf,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AAAA,EACX,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,WAAW;AAAA,EACX,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AACZ;AAEA,IAAM,oBAAiD;AAAA,EACrD,UAAU;AAAA,EACV,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,oBAAoB;AAAA,EACpB,SAAS;AACX;AAEO,SAAS,eAAe,OAA4B;AACzD,SAAO,kBAAkB,KAAK,KAAM;AACtC;AAEO,SAAS,WAAW,UAAkB,GAA4B;AACvE,SAAO,SAAS,QAAQ,OAAO,OAAO,CAAC,CAAC;AAC1C;AAEO,SAAS,UAAU,UAAkB,GAAoB,GAA4B;AAC1F,SAAO,SAAS,QAAQ,OAAO,OAAO,CAAC,CAAC,EAAE,QAAQ,OAAO,OAAO,CAAC,CAAC;AACpE;;;ACrHA,IAAM,eAAkC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,iBAAsC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,eAAkC,CAAC,UAAU,aAAa,YAAY,eAAe,WAAW,SAAS,UAAU;AAElH,IAAM,qBAAN,MAAyB;AAAA,EAI9B,YAAoB,MAA0B;AAA1B;AAHpB,SAAQ,QAA4B;AACpC,SAAQ,YAA2B;AAanC,SAAQ,eAAe,CAAC,MAAwB;AAC9C,UAAI,KAAK,SAAS,CAAC,KAAK,MAAM,SAAS,EAAE,MAAc,EAAG,MAAK,MAAM;AAAA,IACvE;AAEA,SAAQ,aAAa,CAAC,MAA2B;AAC/C,UAAI,EAAE,QAAQ,SAAU,MAAK,MAAM;AAAA,IACrC;AAAA,EAjB+C;AAAA,EAE/C,OAAO,QAAgB,QAA2B;AAChD,QAAI,KAAK,cAAc,OAAO,IAAI;AAChC,WAAK,MAAM;AACX;AAAA,IACF;AACA,SAAK,MAAM;AACX,SAAK,KAAK,QAAQ,MAAM;AAAA,EAC1B;AAAA,EAUQ,KAAK,QAAgB,QAA2B;AACtD,UAAM,SAAS,KAAK,KAAK,SAAS,eAAe,EAAE,OAAO,EAAE,KAAK;AACjE,UAAM,OAAO,QAAQ,QAAQ,OAAO;AACpC,UAAM,QAAQ,GAAG,OAAO,mBAAmB;AAC3C,UAAM,aAAa,QAAQ,QAAQ;AACnC,UAAM,aAAa,cAAc,GAAG,OAAO,EAAE,SAAS;AAEtD,QAAI,SAAS,MAAO,MAAK,aAAa,OAAO,QAAQ,MAAM;AAAA,QACtD,MAAK,mBAAmB,OAAO,QAAQ,MAAM,MAAM;AAExD,UAAM,SAAS,GAAG,OAAO,oBAAoB;AAC7C,UAAM,WAAW,GAAG,UAAU,uBAAuB;AACrD,aAAS,OAAO;AAChB,aAAS,cAAc,KAAK,KAAK,cAAc,OAAO;AACtD,aAAS,iBAAiB,SAAS,MAAM;AACvC,WAAK,KAAK,kBAAkB,QAAQ,IAAI;AACxC,WAAK,MAAM;AAAA,IACb,CAAC;AACD,UAAM,WAAW,GAAG,UAAU,uBAAuB;AACrD,aAAS,OAAO;AAChB,aAAS,cAAc,KAAK,KAAK,cAAc,OAAO;AACtD,aAAS,iBAAiB,SAAS,MAAM;AACvC,YAAM,OAAO,KAAK,WAAW,KAAK;AAClC,WAAK,KAAK,kBAAkB,QAAQ,IAAI;AACxC,WAAK,MAAM;AAAA,IACb,CAAC;AACD,WAAO,OAAO,UAAU,QAAQ;AAChC,UAAM,YAAY,MAAM;AAExB,aAAS,KAAK,YAAY,KAAK;AAC/B,SAAK,QAAQ;AACb,SAAK,YAAY,OAAO;AAExB,UAAM,OAAO,OAAO,sBAAsB;AAC1C,UAAM,YAAY,MAAM,sBAAsB;AAC9C,UAAM,OAAO,MAAM,KAAK,MAAM,GAAG,OAAO,aAAa,UAAU,QAAQ,CAAC;AACxE,QAAI,MAAM,KAAK,SAAS;AACxB,QAAI,MAAM,UAAU,SAAS,OAAO,cAAc,GAAG;AACnD,YAAM,KAAK,IAAI,GAAG,KAAK,MAAM,UAAU,SAAS,CAAC;AAAA,IACnD;AACA,UAAM,MAAM,OAAO,GAAG,IAAI;AAC1B,UAAM,MAAM,MAAM,GAAG,GAAG;AAExB,aAAS,iBAAiB,aAAa,KAAK,cAAc,IAAI;AAC9D,aAAS,iBAAiB,WAAW,KAAK,YAAY,IAAI;AAC1D,UAAM,aAAa,MAAM,cAAgC,eAAe;AACxE,gBAAY,MAAM;AAAA,EACpB;AAAA,EAEA,QAAc;AACZ,QAAI,CAAC,KAAK,MAAO;AACjB,SAAK,MAAM,OAAO;AAClB,SAAK,QAAQ;AACb,SAAK,YAAY;AACjB,aAAS,oBAAoB,aAAa,KAAK,cAAc,IAAI;AACjE,aAAS,oBAAoB,WAAW,KAAK,YAAY,IAAI;AAAA,EAC/D;AAAA,EAEA,UAAgB;AACd,SAAK,MAAM;AAAA,EACb;AAAA,EAEQ,mBACN,OACA,QACA,MACA,QACM;AACN,UAAM,UAAU,SAAS,SAAS,eAAe,SAAS,WAAW,iBAAiB;AACtF,UAAM,WACJ,UAAU,OAAO,SAAS,SAAS,OAAO,WAAW,SAAS,IAAI,OAAO,WAAW,CAAC,IAAI;AAC3F,UAAM,eACJ,UAAU,UAAU,SAAS,SAAS,aAAa;AACrD,UAAM,UAAU,iBAAiB,WAAW,iBAAiB;AAE7D,UAAM,SAAS,GAAG,UAAU,oBAAoB;AAChD,eAAW,KAAK,SAAS;AACvB,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,QAAQ;AACf,aAAO,cAAc,KAAK,KAAK,cAAc,eAAe,CAAC,CAAC;AAC9D,aAAO,YAAY,MAAM;AAAA,IAC3B;AACA,WAAO,QAAQ;AAEf,UAAM,aAAa,GAAG,SAAS,mBAAmB;AAClD,QAAI,SAAS,SAAU,YAAW,OAAO;AACzC,QAAI,SAAS,OAAQ,YAAW,OAAO;AACvC,QAAI,YAAY,SAAS,SAAS,QAAQ,CAAC,SAAS;AAClD,iBAAW,QAAQ,SAAS,SAAS,OAAO,SAAS,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,OAAO,SAAS,KAAK;AAAA,IAClG;AAEA,UAAM,cAAc,GAAG,SAAS,6CAA6C;AAC7E,QAAI,SAAS,SAAU,aAAY,OAAO;AAC1C,QAAI,SAAS,OAAQ,aAAY,OAAO;AACxC,QAAI,YAAY,YAAY,YAAY,SAAS,UAAU,MAAM;AAC/D,kBAAY,QAAQ,OAAO,SAAS,MAAM,EAAE,MAAM,GAAG,EAAE;AAAA,IACzD;AACA,gBAAY,MAAM,UAAU,iBAAiB,YAAY,KAAK;AAE9D,WAAO,iBAAiB,UAAU,MAAM;AACtC,YAAM,QAAQ,OAAO,UAAU,WAAW,OAAO,UAAU;AAC3D,iBAAW,MAAM,UAAU,QAAQ,SAAS;AAC5C,kBAAY,MAAM,UAAU,OAAO,UAAU,YAAY,KAAK;AAAA,IAChE,CAAC;AAED,UAAM,aAAa,CAAC,MAAqB;AACvC,UAAI,EAAE,QAAQ,SAAS;AACrB,cAAM,OAAO,KAAK,WAAW,KAAK;AAClC,aAAK,KAAK,kBAAkB,QAAQ,IAAI;AACxC,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AACA,eAAW,iBAAiB,WAAW,UAAU;AACjD,gBAAY,iBAAiB,WAAW,UAAU;AAElD,UAAM,OAAO,GAAG,OAAO,kBAAkB;AACzC,SAAK,OAAO,QAAQ,YAAY,WAAW;AAC3C,UAAM,YAAY,IAAI;AACtB,UAAM,QAAQ,aAAa;AAAA,EAC7B;AAAA,EAEQ,aAAa,OAAoB,QAAgB,QAAmC;AAC1F,UAAM,MAAM,OAAO;AACnB,UAAM,SAAS,IAAI;AACnB,QAAI;AAEJ,QAAI,QAAQ,QAAQ;AAClB,eAAS,OAAO;AAAA,IAClB,OAAO;AACL,YAAM,OAAO,oBAAI,IAAY;AAC7B,eAAS,CAAC;AACV,YAAM,QAAQ,KAAK,KAAK,SAAS,YAAY;AAC7C,YAAM,MAAM,KAAK,IAAI,MAAM,QAAQ,QAAQ,aAAa,GAAG;AAC3D,eAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,cAAM,IAAI,KAAK,KAAK,aAAa,MAAM,CAAC,GAAG,MAAM;AACjD,cAAM,MAAM,KAAK,OAAO,aAAa,OAAO,CAAC;AAC7C,YAAI,KAAK,IAAI,GAAG,EAAG;AACnB,aAAK,IAAI,GAAG;AACZ,eAAO,KAAK,CAAC;AAAA,MACf;AAAA,IACF;AAEA,UAAM,WAAW,IAAI;AAAA,MACnB,QAAQ,SAAS,QAAQ,OAAO,OAAO,IAAI,CAAC,MAAO,KAAK,OAAO,aAAa,OAAO,CAAC,CAAE,IAAI,OAAO,IAAI,CAAC,MAAO,KAAK,OAAO,aAAa,OAAO,CAAC,CAAE;AAAA,IAClJ;AAEA,UAAM,SAAS,GAAG,SAAS,6CAA6C;AACxE,WAAO,OAAO;AACd,WAAO,cAAc,KAAK,KAAK,cAAc,QAAQ;AAErD,UAAM,OAAO,GAAG,OAAO,sBAAsB;AAC7C,UAAM,aAAiC,CAAC;AACxC,UAAM,aAAa,oBAAI,IAAoC;AAE3D,UAAM,aAAa,CAAC,UAAkB;AACpC,WAAK,cAAc;AACnB,iBAAW,SAAS;AACpB,YAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,iBAAW,KAAK,QAAQ;AACtB,cAAM,OAAO,KAAK,OAAO,KAAK,KAAK,cAAc,eAAe,IAAI,OAAO,CAAC;AAC5E,YAAI,KAAK,CAAC,KAAK,YAAY,EAAE,SAAS,CAAC,EAAG;AAC1C,cAAM,MAAM,KAAK,OAAO,aAAa,OAAO,CAAC;AAC7C,mBAAW,IAAI,KAAK,CAAC;AACrB,cAAM,QAAQ,GAAG,SAAS,sBAAsB;AAChD,cAAM,KAAK,SAAS,cAAc,OAAO;AACzC,WAAG,OAAO;AACV,WAAG,UAAU,SAAS,IAAI,GAAG;AAC7B,WAAG,iBAAiB,UAAU,MAAM;AAClC,cAAI,GAAG,QAAS,UAAS,IAAI,GAAG;AAAA,cAC3B,UAAS,OAAO,GAAG;AAAA,QAC1B,CAAC;AACD,cAAM,OAAO,GAAG,MAAM;AACtB,aAAK,cAAc;AACnB,cAAM,OAAO,IAAI,IAAI;AACrB,aAAK,YAAY,KAAK;AACtB,mBAAW,KAAK,EAAE;AAAA,MACpB;AAAA,IACF;AAEA,WAAO,iBAAiB,SAAS,MAAM,WAAW,OAAO,KAAK,CAAC;AAC/D,eAAW,EAAE;AACb,UAAM,QAAQ,aAAa;AAC3B,UAAM,QAAQ,YAAY,KAAK,UAAU,CAAC,GAAG,WAAW,QAAQ,CAAC,CAAC;AAElE,UAAM,kBAAkB,MAAM;AAC5B,YAAM,UAAU,CAAC,GAAG,WAAW,QAAQ,CAAC;AACxC,YAAM,QAAQ,YAAY,KAAK,UAAU,OAAO;AAAA,IAClD;AACA,oBAAgB;AAEhB,UAAM,OAAO,GAAG,OAAO,wCAAwC;AAC/D,SAAK,OAAO,QAAQ,IAAI;AACxB,UAAM,YAAY,IAAI;AAAA,EACxB;AAAA,EAEQ,WAAW,OAAyC;AAC1D,UAAM,OAAO,MAAM,QAAQ;AAE3B,QAAI,SAAS,OAAO;AAClB,UAAI,UAA8C,CAAC;AACnD,UAAI;AACF,kBAAU,KAAK,MAAM,MAAM,QAAQ,aAAa,IAAI;AAAA,MACtD,QAAQ;AACN,kBAAU,CAAC;AAAA,MACb;AACA,YAAM,eAAe,oBAAI,IAAY;AACrC,YAAM,iBAAmC,qCAAqC,EAAE,QAAQ,CAAC,OAAO;AAC9F,cAAM,OAAO,GAAG,QAAQ,uBAAuB;AAC/C,cAAM,OAAO,KAAK,cAAc,MAAM;AACtC,cAAM,aAAa,KAAK,KAAK,cAAc,eAAe;AAC1D,cAAM,OAAO,KAAK,gBAAgB,aAAa,aAAa,KAAK,eAAe;AAChF,qBAAa,IAAI,IAAI;AAAA,MACvB,CAAC;AACD,YAAM,SAAS,QAAQ,OAAO,CAAC,CAAC,GAAG,MAAM,aAAa,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;AAChF,UAAI,OAAO,WAAW,QAAQ,UAAU,OAAO,WAAW,EAAG,QAAO;AACpE,aAAO,EAAE,MAAM,OAAO,QAAQ,OAAO;AAAA,IACvC;AAEA,UAAM,SAAS,MAAM,cAAiC,qBAAqB;AAC3E,UAAM,SAAS,MAAM,iBAAmC,oBAAoB;AAC5E,UAAM,aAAa,OAAO,CAAC;AAC3B,UAAM,cAAc,OAAO,CAAC;AAC5B,QAAI,CAAC,UAAU,CAAC,WAAY,QAAO;AAEnC,UAAM,QAAQ,OAAO;AACrB,QAAI,UAAU,WAAW,UAAU,YAAY;AAC7C,aAAO,EAAE,MAAM,YAAY,CAAC,EAAE,MAAqC,CAAC,EAAE;AAAA,IACxE;AACA,UAAM,MAAM,WAAW;AACvB,QAAI,QAAQ,MAAM,EAAE,UAAU,WAAY,QAAO;AAEjD,QAAI,SAAS,UAAU;AACrB,YAAM,QAAQ,OAAO,GAAG;AACxB,UAAI,MAAM,KAAK,EAAG,QAAO;AACzB,UAAI,UAAU,WAAW;AACvB,cAAM,SAAS,eAAe,YAAY,UAAU,KAAK,OAAO,YAAY,KAAK,IAAI;AACrF,YAAI,MAAM,MAAM,EAAG,QAAO;AAC1B,eAAO,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE,OAAO,WAAW,OAAO,OAAO,CAAC,EAAE;AAAA,MAC7E;AACA,aAAO,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE,OAAmC,MAAM,CAAC,EAAE;AAAA,IACtF;AAEA,QAAI,SAAS,QAAQ;AACnB,YAAM,QAAQ;AACd,UAAI,UAAU,WAAW;AACvB,cAAM,SAAS,eAAe,YAAY,UAAU,KAAK,YAAY,QAAQ;AAC7E,eAAO,EAAE,MAAM,QAAQ,YAAY,CAAC,EAAE,OAAO,WAAW,OAAO,OAAO,CAAC,EAAE;AAAA,MAC3E;AACA,aAAO,EAAE,MAAM,QAAQ,YAAY,CAAC,EAAE,OAAiC,MAAM,CAAC,EAAE;AAAA,IAClF;AAEA,WAAO,EAAE,MAAM,QAAQ,YAAY,CAAC,EAAE,OAAiC,OAAO,IAAI,CAAC,EAAE;AAAA,EACvF;AACF;;;AClTO,IAAM,oBAAN,MAAwB;AAAA,EAK7B,YAAoB,MAAyB;AAAzB;AAJpB,SAAQ,QAA4B;AACpC,SAAQ,YAA2B;AACnC,SAAQ,mBAAuC;AAiD/C,SAAQ,eAAe,CAAC,MAAwB;AAC9C,UAAI,KAAK,SAAS,CAAC,KAAK,MAAM,SAAS,EAAE,MAAc,EAAG,MAAK,MAAM;AAAA,IACvE;AAEA,SAAQ,aAAa,CAAC,MAA2B;AAC/C,UAAI,EAAE,QAAQ,SAAU,MAAK,MAAM;AAAA,IACrC;AAAA,EArD8C;AAAA,EAE9C,OAAO,QAAgB,QAA2B;AAChD,QAAI,KAAK,cAAc,OAAO,IAAI;AAChC,WAAK,MAAM;AACX;AAAA,IACF;AACA,SAAK,MAAM;AACX,SAAK,KAAK,QAAQ,MAAM;AAAA,EAC1B;AAAA,EAEA,eAAe,QAA4B;AACzC,SAAK,MAAM;AACX,UAAM,SACJ,WACC,MAAM;AACL,YAAM,OAAO,KAAK,KAAK,SAAS;AAChC,YAAM,OAAO,KAAK,sBAAsB;AACxC,YAAM,OAAO,SAAS,cAAc,KAAK;AACzC,WAAK,MAAM,WAAW;AACtB,WAAK,MAAM,OAAO,GAAG,KAAK,QAAQ,EAAE;AACpC,WAAK,MAAM,MAAM,GAAG,KAAK,MAAM,KAAK,KAAK,QAAQ,YAAY;AAC7D,WAAK,MAAM,QAAQ;AACnB,WAAK,MAAM,SAAS;AACpB,eAAS,KAAK,YAAY,IAAI;AAC9B,WAAK,mBAAmB;AACxB,aAAO;AAAA,IACT,GAAG;AACL,SAAK,KAAK,MAA2B,MAAM;AAAA,EAC7C;AAAA,EAEA,QAAc;AACZ,QAAI,KAAK,kBAAkB;AACzB,WAAK,iBAAiB,OAAO;AAC7B,WAAK,mBAAmB;AAAA,IAC1B;AACA,SAAK,OAAO,OAAO;AACnB,SAAK,QAAQ;AACb,SAAK,YAAY;AACjB,aAAS,oBAAoB,aAAa,KAAK,cAAc,IAAI;AACjE,aAAS,oBAAoB,WAAW,KAAK,YAAY,IAAI;AAAA,EAC/D;AAAA,EAEA,UAAgB;AACd,SAAK,MAAM;AAAA,EACb;AAAA,EAUQ,KAAK,QAAuB,QAA2B;AAC7D,UAAM,MAAM,KAAK,KAAK,OAAO;AAC7B,UAAM,QAAQ,GAAG,OAAO,qCAAqC;AAC7D,UAAM,aAAa,QAAQ,MAAM;AAEjC,UAAM,QAAQ,GAAG,OAAO,yBAAyB;AACjD,UAAM,cAAc,SAChB,OAAO,OAAO,cAAc,OAAO,OAAO,SAAS,OAAO,KAC1D,KAAK,KAAK,cAAc,gBAAgB;AAC5C,UAAM,YAAY,KAAK;AAEvB,QAAI,UAAU,OAAO,UAAU;AAC7B,YAAM,UAAU,GAAG,OAAO,2BAA2B;AACrD,YAAM,cAAc,CAAC,UAAgD,QAA+B;AAClG,cAAM,MAAM,GAAG,UAAU,uBAAuB;AAChD,YAAI,OAAO;AACX,YAAI,cAAc,KAAK,KAAK,cAAc,QAAQ;AAClD,YAAI,iBAAiB,SAAS,MAAM;AAClC,cAAI,aAAa,MAAM,CAAC,EAAE,OAAO,OAAO,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,CAAC;AAClE,eAAK,MAAM;AAAA,QACb,CAAC;AACD,eAAO;AAAA,MACT;AACA,cAAQ,OAAO,YAAY,WAAW,KAAK,GAAG,YAAY,YAAY,MAAM,GAAG,YAAY,aAAa,IAAI,CAAC;AAC7G,YAAM,YAAY,OAAO;AAAA,IAC3B;AAEA,UAAM,SAAS,GAAG,OAAO,2BAA2B;AACpD,UAAM,aAAa,CAAC,UAA+C,WAAoC;AACrG,YAAM,MAAM,GAAG,UAAU,uBAAuB;AAChD,UAAI,OAAO;AACX,UAAI,cAAc,KAAK,KAAK,cAAc,QAAQ;AAClD,UAAI,iBAAiB,SAAS,MAAM;AAClC,YAAI,OAAQ,KAAI,gBAAgB,OAAO,IAAI,MAAM;AACjD,aAAK,MAAM;AAAA,MACb,CAAC;AACD,aAAO;AAAA,IACT;AACA,QAAI,QAAQ;AACV,aAAO,OAAO,WAAW,WAAW,MAAM,GAAG,WAAW,YAAY,OAAO,GAAG,WAAW,YAAY,IAAI,CAAC;AAC1G,YAAM,YAAY,MAAM;AAAA,IAC1B;AAEA,UAAM,UAAU,GAAG,OAAO,2BAA2B;AACrD,UAAM,SAAS,GAAG,UAAU,uBAAuB;AACnD,WAAO,OAAO;AACd,WAAO,cAAc,KAAK,KAAK,cAAc,UAAU;AACvD,WAAO,iBAAiB,SAAS,MAAM;AACrC,UAAI,OAAQ,KAAI,eAAe,OAAO,EAAE;AAAA,UACnC,KAAI,mBAAmB;AAC5B,WAAK,MAAM;AAAA,IACb,CAAC;AACD,UAAM,UAAU,GAAG,UAAU,uBAAuB;AACpD,YAAQ,OAAO;AACf,YAAQ,cAAc,KAAK,KAAK,cAAc,YAAY;AAC1D,YAAQ,iBAAiB,SAAS,MAAM;AACtC,UAAI,OAAQ,KAAI,oBAAoB,OAAO,IAAI,KAAK;AACpD,WAAK,MAAM;AAAA,IACb,CAAC;AACD,QAAI,QAAQ;AACV,cAAQ,OAAO,QAAQ,OAAO;AAC9B,YAAM,YAAY,OAAO;AAAA,IAC3B;AAEA,UAAM,UAAU,GAAG,OAAO,2BAA2B;AACrD,UAAM,YAAY,OAAO;AAEzB,UAAM,YAAY,GAAG,OAAO,4BAA4B;AACxD,cAAU,cAAc,KAAK,KAAK,cAAc,kBAAkB;AAClE,UAAM,YAAY,SAAS;AAE3B,UAAM,OAAO,GAAG,OAAO,wBAAwB;AAC/C,eAAW,OAAO,KAAK,KAAK,YAAY,WAAW,GAAG;AACpD,UAAI,IAAI,eAAgB;AACxB,YAAM,QAAQ,GAAG,SAAS,sBAAsB;AAChD,YAAM,KAAK,SAAS,cAAc,OAAO;AACzC,SAAG,OAAO;AACV,SAAG,UAAU,CAAC,IAAI;AAClB,SAAG,WAAW,IAAI;AAClB,SAAG,iBAAiB,UAAU,MAAM;AAClC,YAAI,oBAAoB,IAAI,IAAI,GAAG,OAAO;AAC1C,aAAK,kBAAkB;AAAA,MACzB,CAAC;AACD,YAAM,OAAO,GAAG,MAAM;AACtB,WAAK,cAAc,IAAI,OAAO,cAAc,IAAI,OAAO,SAAS,IAAI;AACpE,YAAM,OAAO,IAAI,IAAI;AACrB,WAAK,YAAY,KAAK;AAAA,IACxB;AACA,UAAM,YAAY,IAAI;AAEtB,UAAM,SAAS,GAAG,OAAO,oBAAoB;AAC7C,UAAM,WAAW,GAAG,UAAU,uBAAuB;AACrD,aAAS,OAAO;AAChB,aAAS,cAAc,KAAK,KAAK,cAAc,UAAU;AACzD,aAAS,iBAAiB,SAAS,MAAM;AACvC,UAAI,iBAAiB;AACrB,WAAK,MAAM;AAAA,IACb,CAAC;AACD,UAAM,YAAY,GAAG,UAAU,uBAAuB;AACtD,cAAU,OAAO;AACjB,cAAU,cAAc,KAAK,KAAK,cAAc,aAAa;AAC7D,cAAU,iBAAiB,SAAS,MAAM;AACxC,UAAI,mBAAmB;AACvB,WAAK,MAAM;AAAA,IACb,CAAC;AACD,WAAO,OAAO,UAAU,SAAS;AACjC,UAAM,YAAY,MAAM;AAExB,aAAS,KAAK,YAAY,KAAK;AAC/B,SAAK,QAAQ;AACb,SAAK,YAAY,SAAS,OAAO,KAAK;AAEtC,UAAM,OAAO,OAAO,sBAAsB;AAC1C,UAAM,YAAY,MAAM,sBAAsB;AAC9C,UAAM,OAAO,MAAM,KAAK,MAAM,GAAG,OAAO,aAAa,UAAU,QAAQ,CAAC;AACxE,QAAI,MAAM,KAAK,SAAS;AACxB,QAAI,MAAM,UAAU,SAAS,OAAO,cAAc,GAAG;AACnD,YAAM,KAAK,IAAI,GAAG,KAAK,MAAM,UAAU,SAAS,CAAC;AAAA,IACnD;AACA,UAAM,MAAM,OAAO,GAAG,IAAI;AAC1B,UAAM,MAAM,MAAM,GAAG,GAAG;AAExB,aAAS,iBAAiB,aAAa,KAAK,cAAc,IAAI;AAC9D,aAAS,iBAAiB,WAAW,KAAK,YAAY,IAAI;AAAA,EAC5D;AAAA,EAEQ,oBAA0B;AAChC,QAAI,CAAC,KAAK,MAAO;AACjB,UAAM,QAAQ,KAAK,MAAM,iBAAmC,+CAA+C;AAC3G,UAAM,OAAO,KAAK,KAAK,YAAY,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,cAAc;AAC/E,UAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,YAAM,MAAM,KAAK,CAAC;AAClB,UAAI,CAAC,IAAK;AACV,YAAM,KAAK,KAAK,cAAgC,OAAO;AACvD,UAAI,MAAM,CAAC,GAAG,SAAU,IAAG,UAAU,CAAC,IAAI;AAAA,IAC5C,CAAC;AAAA,EACH;AACF;;;AC3LO,IAAM,qBAAN,MAAyB;AAAA,EAG9B,YAAoB,MAA0B;AAA1B;AAFpB,SAAQ,QAA4B;AAsIpC,SAAQ,eAAe,CAAC,MAAwB;AAC9C,UAAI,KAAK,SAAS,CAAC,KAAK,MAAM,SAAS,EAAE,MAAc,EAAG,MAAK,MAAM;AAAA,IACvE;AAEA,SAAQ,aAAa,CAAC,MAA2B;AAC/C,UAAI,EAAE,QAAQ,SAAU,MAAK,MAAM;AAAA,IACrC;AAAA,EA1I+C;AAAA,EAE/C,KAAK,GAAW,GAAW,QAAoD;AAC7E,SAAK,MAAM;AACX,UAAM,OAAO,KAAK;AAClB,QAAI;AACJ,QAAI;AAEJ,QAAI,QAAQ;AACV,aAAO,KAAK,SAAS,gBAAgB,OAAO,QAAQ;AACpD,kBAAY,KAAK,YAAY,UAAU,OAAO,KAAK;AAAA,IACrD,OAAO;AACL,YAAM,QAAQ,KAAK,aAAa,0BAA0B;AAC1D,UAAI,CAAC,MAAO;AACZ,YAAM,OAAO,KAAK,YAAY,kBAAkB;AAChD,aAAO,KAAK,SAAS,gBAAgB,MAAM,EAAE;AAC7C,kBAAY,KAAK,MAAM,EAAE;AAAA,IAC3B;AACA,QAAI,CAAC,QAAQ,CAAC,UAAW;AACzB,UAAM,cAAc,KAAK;AAEzB,UAAM,QAAQ,GAAG,OAAO,mBAAmB;AAC3C,UAAM,aAAa,QAAQ,MAAM;AAEjC,UAAM,eAAe,KAAK,QAAQ;AAClC,QAAI,cAAc;AAChB,UAAI;AACJ,UAAI;AACF,gBAAQ,aAAa;AAAA,UACnB,MAAM,KAAK;AAAA,UACX;AAAA,UACA,KAAK,KAAK,OAAO;AAAA,UACjB,OAAO,UAAU;AAAA,UACjB,OAAO,KAAK,aAAa,MAAM,SAAS;AAAA,UACxC,UAAU;AAAA,QACZ,CAAC;AAAA,MACH,SAAS,OAAO;AACd,aAAK,YAAY,OAAO,uBAAuB,EAAE,OAAO,UAAU,IAAI,OAAO,KAAK,GAAG,CAAC;AACtF;AAAA,MACF;AACA,UAAI,UAAU,QAAQ,UAAU,OAAW;AAC3C,UAAI,aAAa;AACjB,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,WAAW;AAClB,gBAAM,MAAM,GAAG,OAAO,6BAA6B;AACnD,gBAAM,YAAY,GAAG;AACrB;AAAA,QACF;AACA,cAAM,MAAM,GAAG,UAAU,wBAAwB;AACjD,YAAI,OAAO;AACX,YAAI,cAAc,KAAK,SAAS;AAChC,YAAI,KAAK,OAAQ,KAAI,UAAU,IAAI,gCAAgC;AACnE,YAAI,KAAK,UAAU;AACjB,cAAI,WAAW;AAAA,QACjB,OAAO;AACL,uBAAa;AACb,cAAI,iBAAiB,SAAS,MAAM;AAClC,iBAAK,MAAM;AACX,gBAAI;AACF,mBAAK,SAAS;AAAA,YAChB,SAAS,OAAO;AACd,mBAAK,YAAY,OAAO,sBAAsB,EAAE,OAAO,UAAW,IAAI,OAAO,KAAM,GAAG,CAAC;AAAA,YACzF;AAAA,UACF,CAAC;AAAA,QACH;AACA,cAAM,YAAY,GAAG;AAAA,MACvB;AACA,UAAI,CAAC,YAAY;AACf,cAAM,OAAO;AACb;AAAA,MACF;AACA,WAAK,OAAO,OAAO,GAAG,CAAC;AACvB;AAAA,IACF;AAEA,UAAM,UAAU,GAAG,UAAU,wBAAwB;AACrD,YAAQ,OAAO;AACf,YAAQ,cAAc,KAAK,cAAc,UAAU;AACnD,YAAQ,iBAAiB,SAAS,MAAM;AACtC,WAAK,KAAK,gBAAgB;AAC1B,WAAK,MAAM;AAAA,IACb,CAAC;AACD,UAAM,YAAY,OAAO;AAEzB,QAAI,CAAC,KAAK,QAAQ,mBAAmB;AACnC,YAAM,WAAW,GAAG,UAAU,wBAAwB;AACtD,eAAS,OAAO;AAChB,eAAS,cAAc,KAAK,cAAc,WAAW;AACrD,eAAS,iBAAiB,SAAS,MAAM;AACvC,aAAK,KAAK,yBAAyB;AACnC,aAAK,MAAM;AAAA,MACb,CAAC;AACD,YAAM,YAAY,QAAQ;AAE1B,YAAM,WAAW,GAAG,UAAU,wBAAwB;AACtD,eAAS,OAAO;AAChB,eAAS,cAAc,KAAK,cAAc,mBAAmB;AAC7D,eAAS,iBAAiB,SAAS,MAAM;AACvC,cAAM,SAAS,KAAK,aAAa,0BAA0B;AAC3D,YAAI,OAAQ,MAAK,iBAAiB,MAAM;AACxC,aAAK,MAAM;AAAA,MACb,CAAC;AACD,YAAM,YAAY,QAAQ;AAAA,IAC5B;AAEA,SAAK,OAAO,OAAO,GAAG,CAAC;AAAA,EACzB;AAAA,EAEQ,OAAO,OAAoB,GAAW,GAAiB;AAC7D,aAAS,KAAK,YAAY,KAAK;AAC/B,SAAK,QAAQ;AACb,UAAM,OAAO,MAAM,sBAAsB;AACzC,UAAM,OAAO,MAAM,GAAG,GAAG,KAAK,IAAI,GAAG,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC;AACxE,UAAM,MAAM,MAAM,GAAG,GAAG,KAAK,IAAI,GAAG,OAAO,cAAc,KAAK,SAAS,CAAC,CAAC;AACzE,UAAM,MAAM,OAAO,GAAG,IAAI;AAC1B,UAAM,MAAM,MAAM,GAAG,GAAG;AACxB,aAAS,iBAAiB,aAAa,KAAK,cAAc,IAAI;AAC9D,aAAS,iBAAiB,WAAW,KAAK,YAAY,IAAI;AAAA,EAC5D;AAAA,EAEA,QAAc;AACZ,QAAI,CAAC,KAAK,MAAO;AACjB,SAAK,MAAM,OAAO;AAClB,SAAK,QAAQ;AACb,aAAS,oBAAoB,aAAa,KAAK,cAAc,IAAI;AACjE,aAAS,oBAAoB,WAAW,KAAK,YAAY,IAAI;AAAA,EAC/D;AAAA,EAEA,UAAgB;AACd,SAAK,MAAM;AAAA,EACb;AASF;;;AC/IO,IAAM,iBAAN,MAAqB;AAAA,EAM1B,YAAoB,MAAsB;AAAtB;AALpB,SAAQ,QAA4B;AACpC,SAAQ,YAAY;AACpB,SAAQ,YAAY;AACpB,SAAQ,cAAkC;AA0C1C,SAAQ,cAAc,CAAC,MAAwB;AAC7C,UAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,UAAI,CAAC,KAAK,KAAK,QAAQ,iBAAkB;AACzC,YAAM,SAAS,EAAE;AACjB,YAAM,OAAO,OAAO,QAAqB,YAAY;AACrD,UAAI,CAAC,QAAQ,SAAS,KAAK,YAAa;AAExC,WAAK,YAAY;AACjB,WAAK,YAAY;AACjB,WAAK,cAAc;AAEnB,YAAM,QAAQ,KAAK,QAAQ,SAAS;AACpC,YAAM,QAAQ,KAAK,QAAqB,WAAW;AACnD,YAAM,QAAQ,OAAO,OAAO,QAAQ,KAAK;AACzC,YAAM,OAAO,OAAO,MAAM,KAAK,IAAI,SAAY,KAAK,KAAK,SAAS,gBAAgB,KAAK;AACvF,YAAM,SAA6B,QAAQ,KAAK,KAAK,YAAY,UAAU,KAAK,IAAI;AACpF,UAAI,CAAC,QAAQ,CAAC,UAAU,KAAK,YAAY,KAAK,QAAS;AACvD,UAAI,KAAK,UAAU,SAAS,oBAAoB,EAAG;AAEnD,YAAM,QAAQ,KAAK,KAAK,aAAa,MAAM,MAAM;AACjD,YAAM,SAA6B;AAAA,QACjC,MAAM,KAAK;AAAA,QACX;AAAA,QACA,KAAK,KAAK,KAAK,OAAO;AAAA,QACtB,OAAO,OAAO;AAAA,QACd;AAAA,QACA,WAAW,gBAAgB,KAAK,MAAM,MAAM,MAAM;AAAA,QAClD,UAAU;AAAA,MACZ;AAEA,YAAM,SAAS,OAAO,OAAO;AAC7B,UAAI,WAAW,OAAO;AACtB,UAAI,QAAQ;AACV,YAAI;AACF,qBAAW,OAAO,EAAE,GAAG,QAAQ,QAAQ,OAAO,QAAQ,OAAO,CAAC,KAAK,OAAO;AAAA,QAC5E,SAAS,OAAO;AACd,eAAK,KAAK,YAAY,OAAO,sBAAsB,EAAE,OAAO,OAAO,IAAI,OAAO,KAAK,GAAG,CAAC;AAAA,QACzF;AAAA,MACF;AACA,UAAI,CAAC,YAAY,CAAC,OAAO,OAAO,mBAAoB;AAEpD,WAAK,YAAY,WAAW,MAAM;AAChC,YAAI,KAAK,KAAK,YAAY,KAAK,KAAK,gBAAgB,KAAM;AAC1D,aAAK,UAAU,MAAM,MAAM;AAAA,MAC7B,GAAG,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,gBAAgB,CAAC;AAAA,IACpD;AAEA,SAAQ,cAAc,MAAY;AAChC,WAAK,KAAK;AAAA,IACZ;AAAA,EAzF2C;AAAA,EAE3C,OAAa;AACX,UAAM,OAAO,KAAK,KAAK,SAAS;AAChC,SAAK,iBAAiB,aAAa,KAAK,WAAW;AACnD,SAAK,iBAAiB,cAAc,KAAK,WAAW;AAAA,EACtD;AAAA,EAEA,UAAgB;AACd,SAAK,YAAY;AACjB,SAAK,YAAY;AACjB,UAAM,OAAO,KAAK,KAAK,SAAS;AAChC,SAAK,oBAAoB,aAAa,KAAK,WAAW;AACtD,SAAK,oBAAoB,cAAc,KAAK,WAAW;AACvD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,OAAa;AACX,SAAK,YAAY;AACjB,SAAK,YAAY;AACjB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,cAAoB;AAC1B,QAAI,KAAK,WAAW;AAClB,mBAAa,KAAK,SAAS;AAC3B,WAAK,YAAY;AAAA,IACnB;AACA,QAAI,KAAK,WAAW;AAClB,mBAAa,KAAK,SAAS;AAC3B,WAAK,YAAY;AAAA,IACnB;AAAA,EACF;AAAA,EAEQ,cAAoB;AAC1B,QAAI,CAAC,KAAK,MAAO;AACjB,SAAK,MAAM,OAAO;AAClB,SAAK,QAAQ;AAAA,EACf;AAAA,EAqDQ,UAAU,MAAmB,QAAkC;AACrE,SAAK,YAAY;AACjB,UAAM,YAAY,KAAK,KAAK,QAAQ;AACpC,QAAI,CAAC,UAAW;AAEhB,UAAM,QAAQ,GAAG,OAAO,cAAc;AACtC,UAAM,aAAa,QAAQ,SAAS;AACpC,QAAI;AACJ,QAAI;AACF,gBAAU,UAAU,MAAM;AAAA,IAC5B,SAAS,KAAK;AACZ,WAAK,KAAK,YAAY,KAAK,oBAAoB,EAAE,OAAO,OAAO,OAAO,UAAU,OAAO,SAAS,CAAC;AACjG;AAAA,IACF;AACA,QAAI,OAAO,YAAY,UAAU;AAC/B,YAAM,cAAc;AAAA,IACtB,OAAO;AACL,YAAM,YAAY,OAAO;AAAA,IAC3B;AAEA,aAAS,KAAK,YAAY,KAAK;AAC/B,SAAK,QAAQ;AACb,UAAM,OAAO,KAAK,sBAAsB;AACxC,UAAM,YAAY,MAAM,sBAAsB;AAC9C,UAAM,OAAO,MAAM,KAAK,MAAM,GAAG,KAAK,IAAI,GAAG,OAAO,aAAa,UAAU,QAAQ,CAAC,CAAC;AACrF,QAAI,MAAM,KAAK,SAAS;AACxB,QAAI,MAAM,UAAU,SAAS,OAAO,cAAc,GAAG;AACnD,YAAM,KAAK,IAAI,GAAG,KAAK,MAAM,UAAU,SAAS,CAAC;AAAA,IACnD;AACA,UAAM,MAAM,OAAO,GAAG,IAAI;AAC1B,UAAM,MAAM,MAAM,GAAG,GAAG;AAAA,EAC1B;AACF;;;AC9IO,IAAM,mBAAN,MAAuB;AAAA,EAG5B,YAAoB,MAAwB;AAAxB;AAFpB,SAAQ,UAA8B;AAAA,EAEO;AAAA,EAE7C,OAAa;AACX,SAAK,UAAU,SAAS,cAAc,KAAK;AAC3C,SAAK,QAAQ,YAAY;AACzB,SAAK,QAAQ,aAAa,eAAe,MAAM;AAC/C,SAAK,QAAQ,MAAM,gBAAgB;AACnC,SAAK,KAAK,SAAS,KAAK,YAAY,KAAK,OAAO;AAChD,SAAK,MAAM;AAAA,EACb;AAAA,EAEA,QAAc;AACZ,QAAI,CAAC,KAAK,WAAW,KAAK,KAAK,YAAY,EAAG;AAC9C,UAAM,SAAS,KAAK,KAAK,QAAQ,mBAAmB,KAAK,KAAK,QAAQ,kBAAkB;AACxF,QAAI,CAAC,UAAU,CAAC,OAAO,MAAM;AAC3B,WAAK,QAAQ,MAAM,UAAU;AAC7B,WAAK,QAAQ,MAAM,kBAAkB;AACrC;AAAA,IACF;AACA,UAAM,MAAM,KAAK,UAAU,MAAM;AACjC,SAAK,QAAQ,MAAM,UAAU;AAC7B,QAAI,KAAK;AACP,WAAK,QAAQ,MAAM,kBAAkB,OAAO,GAAG;AAC/C,WAAK,QAAQ,MAAM,kBAAkB;AAAA,IACvC,OAAO;AACL,WAAK,QAAQ,MAAM,kBAAkB;AAAA,IACvC;AAAA,EACF;AAAA,EAEQ,UAAU,QAAwC;AACxD,QAAI;AACF,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,YAAM,MAAM,OAAO,WAAW,IAAI;AAClC,UAAI,CAAC,IAAK,QAAO;AACjB,YAAM,WAAW,OAAO,YAAY;AACpC,YAAM,MAAM,OAAO,OAAO;AAC1B,YAAM,QAAQ,OAAO,SAAS;AAC9B,YAAM,QAAQ,OAAO,UAAU,KAAK,OAAO,IAAI,0BAA0B;AACzE,YAAM,UAAU,OAAO,WAAW;AAElC,UAAI,OAAO,OAAO,QAAQ;AAC1B,YAAM,UAAU,IAAI,YAAY,OAAO,IAAI;AAC3C,YAAM,QAAQ,KAAK,KAAK,QAAQ,KAAK;AAErC,YAAM,OAAO,KAAK,IAAI,KAAK,QAAQ,EAAE;AACrC,aAAO,QAAQ;AACf,aAAO,SAAS;AAEhB,YAAM,OAAO,OAAO,WAAW,IAAI;AACnC,WAAK,UAAU,GAAG,GAAG,MAAM,IAAI;AAC/B,WAAK,cAAc;AACnB,WAAK,YAAY;AACjB,WAAK,OAAO,OAAO,QAAQ;AAC3B,WAAK,UAAU,OAAO,GAAG,OAAO,CAAC;AACjC,WAAK,OAAQ,QAAQ,KAAK,KAAM,GAAG;AACnC,WAAK,YAAY;AACjB,WAAK,eAAe;AACpB,WAAK,SAAS,OAAO,MAAM,GAAG,CAAC;AAE/B,aAAO,OAAO,UAAU,WAAW;AAAA,IACrC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,SAAkB;AACxB,WAAO,KAAK,KAAK,SAAS,KAAK,UAAU,SAAS,iBAAiB;AAAA,EACrE;AAAA,EAEA,UAAgB;AACd,SAAK,MAAM;AAAA,EACb;AAAA,EAEA,UAAgB;AACd,SAAK,SAAS,OAAO;AACrB,SAAK,UAAU;AAAA,EACjB;AACF;;;AChEO,IAAM,kBAAN,MAAsB;AAAA,EAK3B,YAAoB,MAAmB;AAAnB;AAJpB,SAAQ,QAAuB,CAAC;AAChC,SAAQ,UAAU;AAClB,SAAQ,UAA8B;AAAA,EAEE;AAAA,EAExC,aAAmB;AACjB,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU,CAAC;AAAA,EAClB;AAAA,EAEA,WAAiB;AACf,QAAI,CAAC,KAAK,QAAS;AACnB,UAAM,QAAQ,KAAK;AACnB,SAAK,UAAU;AACf,QAAI,MAAM,SAAS,EAAG,MAAK,KAAK,KAAK;AAAA,EACvC;AAAA,EAEA,cAAoB;AAClB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAO,OAAwB;AAC7B,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ,KAAK,KAAK;AACvB;AAAA,IACF;AACA,SAAK,KAAK,CAAC,KAAK,CAAC;AAAA,EACnB;AAAA,EAEQ,KAAK,OAA0B;AACrC,UAAM,UAAU,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,aAAa;AAC3D,QAAI,YAAY,EAAG;AACnB,SAAK,MAAM,SAAS,KAAK,UAAU;AACnC,SAAK,MAAM,KAAK,KAAK;AACrB,WAAO,KAAK,MAAM,SAAS,QAAS,MAAK,MAAM,MAAM;AACrD,SAAK,UAAU,KAAK,MAAM,SAAS;AAAA,EACrC;AAAA,EAEA,aAAmB;AACjB,UAAM,UAAU,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,aAAa;AAC3D,QAAI,YAAY,GAAG;AACjB,WAAK,MAAM;AACX;AAAA,IACF;AACA,WAAO,KAAK,MAAM,SAAS,SAAS;AAClC,WAAK,MAAM,MAAM;AACjB,WAAK;AAAA,IACP;AACA,QAAI,KAAK,UAAU,GAAI,MAAK,UAAU;AAAA,EACxC;AAAA,EAEA,UAAmB;AACjB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,UAAmB;AACjB,WAAO,KAAK,UAAU,KAAK,MAAM,SAAS;AAAA,EAC5C;AAAA,EAEA,OAAgB;AACd,QAAI,CAAC,KAAK,QAAQ,EAAG,QAAO;AAC5B,SAAK,MAAM,KAAK,MAAM,KAAK,OAAO,GAAG,KAAK;AAC1C,SAAK;AACL,WAAO;AAAA,EACT;AAAA,EAEA,OAAgB;AACd,QAAI,CAAC,KAAK,QAAQ,EAAG,QAAO;AAC5B,SAAK;AACL,SAAK,MAAM,KAAK,MAAM,KAAK,OAAO,GAAG,IAAI;AACzC,WAAO;AAAA,EACT;AAAA,EAEQ,MAAM,OAAoB,MAAqB;AACrD,UAAM,OAAO,KAAK;AAClB,UAAM,iBAA2B,CAAC;AAClC,eAAW,SAAS,OAAO;AACzB,YAAM,OAAO,KAAK,SAAS,YAAY,MAAM,MAAM;AACnD,YAAM,SAAS,KAAK,YAAY,UAAU,MAAM,QAAQ;AACxD,UAAI,CAAC,QAAQ,CAAC,UAAU,KAAK,QAAQ,KAAM;AAC3C,YAAM,QAAQ,OAAO,MAAM,WAAW,MAAM;AAC5C,YAAM,WAAW,OAAO,MAAM,WAAW,MAAM;AAC/C,UAAI,KAAK,WAAW,MAAM,QAAQ,OAAO,QAAQ,GAAG;AAClD,aAAK,aAAa,oBAAoB,IAAI;AAC1C,aAAK,aAAa,WAAW,CAAC,KAAK,QAAQ,GAAG,CAAC,OAAO,EAAE,CAAC;AACzD,YAAI,KAAK,YAAY,EAAG,gBAAe,KAAK,KAAK,QAAQ;AACzD,aAAK,KAAK,oBAAoB;AAAA,UAC5B,UAAU;AAAA,UACV,UAAU;AAAA,UACV,SAAS;AAAA,UACT,UAAU,KAAK;AAAA,UACf;AAAA,UACA,QAAQ,OAAO;AAAA,UACf,MAAM,KAAK;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,eAAe,SAAS,EAAG,MAAK,aAAa,YAAY,cAAc;AAC3E,SAAK,gBAAgB,QAAQ;AAC7B,SAAK,iBAAiB,QAAQ;AAAA,EAChC;AAAA,EAEA,QAAc;AACZ,SAAK,QAAQ,CAAC;AACd,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,EACjB;AACF;;;AC5HO,IAAM,cAAc;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AC9BO,SAAS,WAAW,OAAoB;AAC7C,QAAM,IAAI,SAAS,OAAO,KAAK,OAAO,KAAK;AAC3C,SAAO,EACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AAC1B;AAEO,SAAS,aAAa,UAAkB,SAAiB,OAAO,4BAAqC;AAC1G,MAAI;AACF,QAAI,OAAO,aAAa,eAAe,OAAO,SAAS,YAAa,QAAO;AAC3E,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,QAAI,OAAO,QAAQ,eAAe,OAAO,IAAI,oBAAoB,YAAY;AAC3E,YAAM,OAAO,IAAI,KAAK,CAAC,OAAO,GAAG,EAAE,MAAM,KAAK,CAAC;AAC/C,YAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,QAAE,OAAO;AACT,QAAE,WAAW;AACb,QAAE,MAAM;AACR,YAAM,SAAS,OAAO,IAAI,oBAAoB,aAAa,IAAI,gBAAgB,KAAK,GAAG,IAAI;AAC3F,UAAI,OAAQ,YAAW,MAAM;AAC3B,YAAI;AACF,iBAAO,GAAG;AAAA,QACZ,QAAQ;AAAA,QAER;AAAA,MACF,GAAG,CAAC;AAAA,IACN,OAAO;AACL,QAAE,OAAO,QAAQ,IAAI,IAAI,mBAAmB,OAAO,CAAC;AACpD,QAAE,WAAW;AACb,QAAE,MAAM;AAAA,IACV;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACrCA,IAAM,uBAAuB,oBAAI,IAAI,CAAC,aAAa,aAAa,aAAa,CAAC;AAEvE,SAAS,WAAW,MAAuB;AAChD,MAAI,OAAO,SAAS,YAAY,KAAK,WAAW,EAAG,QAAO;AAC1D,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,SAAO,MAAM,MAAM,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC,qBAAqB,IAAI,IAAI,CAAC;AACjF;AAEO,SAAS,UAAU,KAAU,MAAmB;AACrD,MAAI,OAAO,KAAM,QAAO;AACxB,MAAI,CAAC,WAAW,IAAI,EAAG,QAAO;AAC9B,QAAM,MAAM,KAAK,QAAQ,GAAG;AAC5B,MAAI,MAAM,EAAG,QAAO,IAAI,IAAI;AAC5B,MAAI,MAAM;AACV,MAAI,QAAQ;AACZ,SAAO,QAAQ,KAAK,QAAQ;AAC1B,QAAI,OAAO,KAAM,QAAO;AACxB,UAAM,MAAM,KAAK,QAAQ,KAAK,KAAK;AACnC,QAAI,MAAM,GAAG;AACX,YAAM,IAAI,KAAK,MAAM,KAAK,CAAC;AAC3B;AAAA,IACF;AACA,UAAM,IAAI,KAAK,MAAM,OAAO,GAAG,CAAC;AAChC,YAAQ,MAAM;AAAA,EAChB;AACA,SAAO;AACT;AAEO,SAAS,UAAU,KAAU,MAAc,OAAqB;AACrE,MAAI,OAAO,QAAQ,CAAC,WAAW,IAAI,EAAG,QAAO;AAC7C,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,QAAK,OAAO,QAAQ,YAAY,OAAO,QAAQ,cAAe,QAAQ,KAAM,QAAO;AACnF,QAAI,IAAI,MAAM,CAAC,CAAC,KAAK,KAAM,KAAI,MAAM,CAAC,CAAC,IAAI,CAAC;AAC5C,UAAM,IAAI,MAAM,CAAC,CAAC;AAAA,EACpB;AACA,MAAK,OAAO,QAAQ,YAAY,OAAO,QAAQ,cAAe,QAAQ,KAAM,QAAO;AACnF,MAAI,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;AAC/B,SAAO;AACT;;;AC1BO,IAAM,cAAN,MAAyD;AAAA,EAG9D,YAAoB,MAAuB;AAAvB;AAFpB,SAAQ,gBAA0C;AAAA,EAEN;AAAA,EAE5C,WAAW,MAAwC;AACjD,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,QAAQ,UAAU,QAAQ,CAAC;AACrC,QAAI,KAAK,KAAK,SAAS,WAAY;AACnC,SAAK,KAAK,SAAS,WAAW,IAAI;AAClC,SAAK,KAAK,aAAa,cAAc;AAAA,EACvC;AAAA,EAEA,iBAAiB,aAA0C;AACzD,QAAI,KAAK,KAAK,YAAY,KAAK,KAAK,KAAK,SAAS,WAAY;AAC9D,SAAK,KAAK,SAAS,iBAAiB,WAAW;AAC/C,SAAK,KAAK,aAAa,cAAc;AAAA,EACvC;AAAA,EAEA,gBAA+C;AAC7C,WAAO,KAAK,KAAK,YAAY,cAAc;AAAA,EAC7C;AAAA,EAEA,cAAc,SAA0D;AACtE,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,QAAQ,aAAa,WAAW,CAAC;AAC3C,SAAK,KAAK,YAAY,cAAc,OAAO;AAC3C,SAAK,KAAK,yBAAyB;AACnC,SAAK,KAAK,0BAA0B;AACpC,QAAI,KAAK,KAAK,SAAS,WAAY,MAAK,KAAK,KAAK,SAAS,sBAAsB;AAAA,SAC5E;AACH,WAAK,KAAK,SAAS,gBAAgB;AACnC,WAAK,KAAK,aAAa,cAAc;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,iBAAgC;AAC9B,WAAO,KAAK,KAAK,YAAY,eAAe;AAAA,EAC9C;AAAA,EAEA,eAAe,OAA4B;AACzC,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,YAAY,iBAAiB,KAAK;AAC5C,SAAK,KAAK,0BAA0B;AACpC,SAAK,KAAK,eAAe;AACzB,SAAK,KAAK,mBAAmB;AAAA,EAC/B;AAAA,EAEA,mBAAyB;AACvB,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,YAAY,iBAAiB;AACvC,SAAK,KAAK,0BAA0B;AACpC,SAAK,KAAK,eAAe;AACzB,SAAK,KAAK,mBAAmB;AAAA,EAC/B;AAAA,EAEA,oBAAoB,OAAe,SAAwB;AACzD,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,YAAY,oBAAoB,OAAO,OAAO;AACxD,SAAK,KAAK,0BAA0B;AACpC,SAAK,KAAK,KAAK,2BAA2B,EAAE,OAAO,QAAQ,CAAC;AAC5D,SAAK,KAAK,mBAAmB;AAAA,EAC/B;AAAA,EAEA,WAAW,OAAe,SAAuB;AAC/C,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,WAAW,OAAO,OAAO;AAAA,EACrC;AAAA,EAEA,gBAAgB,OAAe,QAAuC;AACpE,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,YAAY,gBAAgB,OAAO,MAAM;AACnD,SAAK,KAAK,0BAA0B;AACpC,SAAK,KAAK,mBAAmB;AAAA,EAC/B;AAAA,EAEA,iBAAiB,OAAsB;AACrC,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,UAAM,OAAO,KAAK,KAAK,YAAY,kBAAkB;AACrD,QAAI,KAAK,WAAW,EAAG;AACvB,UAAM,SAAS,SAAS,KAAK,KAAK,SAAS,qBAAqB;AAChE,QAAI,UAAU,EAAG;AACjB,UAAM,QAAQ,KAAK,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,cAAc,CAAC;AAC7D,QAAI,SAAS,EAAG;AAChB,eAAW,OAAO,MAAM;AACtB,WAAK,KAAK,YAAY,eAAe,KAAK,KAAK,IAAI,IAAI,KAAK,MAAO,IAAI,eAAe,SAAU,KAAK,CAAC,CAAC;AAAA,IACzG;AACA,SAAK,KAAK,gBAAgB;AAC1B,SAAK,KAAK,mBAAmB;AAAA,EAC/B;AAAA,EAEA,eAAe,OAAe,aAAa,OAAa;AACtD,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,UAAM,SAAS,KAAK,KAAK,YAAY,UAAU,KAAK;AACpD,QAAI,CAAC,OAAQ;AAEb,QAAI,KAAK,uBAAuB,QAAQ,UAAU,GAAG;AACnD,WAAK,KAAK,gBAAgB;AAC1B,WAAK,KAAK,mBAAmB;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,uBACN,QACA,YACS;AAET,QAAI,OAAO,eAAe,OAAO,gBAAgB;AAC/C,WAAK,KAAK,YAAY,eAAe,QAAQ,OAAO,iBAAiB,KAAK,EAAE;AAC5E,aAAO;AAAA,IACT;AAEA,SAAK,kBAAL,KAAK,gBAAkB,SAAS,cAAc,QAAQ;AACtD,UAAM,MAAM,KAAK,cAAc,WAAW,IAAI;AAC9C,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,QAAQ,OAAO,iBAAiB,KAAK,KAAK,SAAS,IAAI;AAC7D,QAAI,OAAO,GAAG,MAAM,SAAS,IAAI,MAAM,UAAU,IAAI,MAAM,QAAQ,IAAI,MAAM,UAAU;AAEvF,QAAI,WAAW;AACf,UAAM,WAAW,CAAC,SAAiB;AACjC,UAAI,CAAC,KAAM;AACX,YAAM,IAAI,IAAI,YAAY,IAAI,EAAE;AAChC,UAAI,IAAI,SAAU,YAAW;AAAA,IAC/B;AAEA,QAAI,CAAC,YAAY;AACf,eAAS,OAAO,OAAO,cAAc,OAAO,OAAO,SAAS,OAAO,EAAE;AAAA,IACvE;AACA,UAAM,QAAQ,KAAK,KAAK,SAAS,YAAY;AAC7C,UAAM,MAAM,KAAK,IAAI,MAAM,QAAQ,GAAI;AACvC,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,eAAS,gBAAgB,KAAK,MAAM,MAAM,CAAC,GAAG,MAAM,CAAC;AAAA,IACvD;AAEA,UAAM,SAAS,OAAO,WAAW,KAAK,MAAM,OAAO,aAAa,KAAK,MAAM,KAAK,KAAK,QAAQ,aAAa,KAAK,KAAK;AACpH,SAAK,KAAK,YAAY,eAAe,QAAQ,KAAK,KAAK,QAAQ,IAAI,KAAK;AACxE,WAAO;AAAA,EACT;AAAA,EAEA,mBAAmB,YAA4B;AAC7C,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,QAAI,UAAU;AACd,eAAW,OAAO,KAAK,KAAK,YAAY,kBAAkB,GAAG;AAC3D,gBAAU,KAAK,uBAAuB,KAAK,cAAc,KAAK,KAAK;AAAA,IACrE;AACA,QAAI,SAAS;AACX,WAAK,KAAK,gBAAgB;AAC1B,WAAK,KAAK,mBAAmB;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,eAA0B;AACxB,WAAO,KAAK,KAAK,YAAY,aAAa;AAAA,EAC5C;AAAA,EAEA,aAAa,WAAmC;AAC9C,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,YAAY,eAAe,SAAS;AAC9C,SAAK,KAAK,eAAe;AAAA,EAC3B;AAAA,EAEA,iBAA8B;AAC5B,WAAO,KAAK,KAAK,SAAS,eAAe;AAAA,EAC3C;AAAA,EAEA,eAAe,aAAuC;AACpD,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,SAAS,eAAe,WAAW;AAC7C,SAAK,KAAK,eAAe,mBAAmB;AAC5C,SAAK,KAAK,KAAK,iBAAiB,EAAE,aAAa,KAAK,KAAK,SAAS,eAAe,EAAE,CAAC;AACpF,QAAI,KAAK,KAAK,SAAS,YAAY;AACjC,WAAK,KAAK,KAAK,SAAS,sBAAsB;AAC9C;AAAA,IACF;AACA,SAAK,KAAK,SAAS,gBAAgB;AACnC,SAAK,KAAK,aAAa,cAAc;AAAA,EACvC;AAAA,EAEA,sBAAsB,OAAwB;AAC5C,WAAO,OAAO,UAAU,eAAe,KAAK,KAAK,KAAK,SAAS,eAAe,GAAG,KAAK;AAAA,EACxF;AAAA,EAEA,eAAe,MAAuC;AACpD,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,QAAQ,kBAAkB,QAAQ,QAAQ,KAAK,KAAK,MAAM,KAAK,OAAO;AAChF,QAAI,KAAK,KAAK,SAAS,eAAe,IAAI,GAAG;AAC3C,WAAK,KAAK,iBAAiB;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,iBAAgC;AAC9B,WAAO,KAAK,KAAK,SAAS,eAAe;AAAA,EAC3C;AAAA,EAEA,kBAAkD;AAChD,WAAO,KAAK,KAAK,QAAQ;AAAA,EAC3B;AAAA,EAEA,gBAAgB,MAA4C;AAC1D,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,QAAI,KAAK,KAAK,QAAQ,iBAAiB,KAAM;AAC7C,SAAK,KAAK,QAAQ,eAAe;AACjC,QAAI,SAAS,OAAQ,MAAK,YAAY;AACtC,SAAK,KAAK,eAAe,MAAM;AAC/B,SAAK,KAAK,aAAa,YAAY;AAAA,EACrC;AAAA,EAEA,mBAAmB;AACjB,WAAO,KAAK,KAAK,iBAAiB,iBAAiB;AAAA,EACrD;AAAA,EAEA,kBAA2B;AACzB,WAAO,KAAK,KAAK,iBAAiB,gBAAgB;AAAA,EACpD;AAAA,EAEA,eAAe,QAAgB,WAAW,MAAM,cAAc,MAAY;AACxE,SAAK,KAAK,iBAAiB,eAAe,QAAQ,UAAU,WAAW;AAAA,EACzE;AAAA,EAEA,UAAU,eAAe,MAAY;AACnC,SAAK,KAAK,iBAAiB,UAAU,YAAY;AAAA,EACnD;AAAA,EAEA,cAAoB;AAClB,SAAK,KAAK,iBAAiB,YAAY;AAAA,EACzC;AAAA,EAEA,uBAA+B;AAC7B,WAAO,KAAK,KAAK,SAAS,qBAAqB;AAAA,EACjD;AAAA,EAEA,WAAW,UAAkB;AAC3B,WAAO,KAAK,KAAK,SAAS,gBAAgB,QAAQ;AAAA,EACpD;AAAA,EAEA,YAAY,IAAY;AACtB,WAAO,KAAK,KAAK,SAAS,YAAY,EAAE;AAAA,EAC1C;AAAA,EAEA,YAAY,UAAoD;AAC9D,SAAK,KAAK,SAAS,YAAY,QAAQ;AAAA,EACzC;AAAA,EAEA,8BAA8B,UAAoD;AAChF,SAAK,KAAK,SAAS,8BAA8B,QAAQ;AAAA,EAC3D;AAAA,EAEA,cAAc,UAAkB,WAAoD,OAAa;AAC/F,SAAK,KAAK,aAAa,cAAc,UAAU,QAAQ;AAAA,EACzD;AAAA,EAEA,UAAU,OAAwB;AAChC,QAAI,KAAK,KAAK,YAAY,EAAG,QAAO;AACpC,WAAO,KAAK,KAAK,SAAS,UAAU,KAAK;AAAA,EAC3C;AAAA,EAEA,YAAY,OAAwB;AAClC,QAAI,KAAK,KAAK,YAAY,EAAG,QAAO;AACpC,WAAO,KAAK,KAAK,SAAS,YAAY,KAAK;AAAA,EAC7C;AAAA,EAEA,gBAAgB,OAAwB;AACtC,QAAI,KAAK,KAAK,YAAY,EAAG,QAAO;AACpC,WAAO,KAAK,KAAK,SAAS,aAAa,KAAK;AAAA,EAC9C;AAAA,EAEA,cAAc,OAAwB;AACpC,WAAO,KAAK,KAAK,SAAS,cAAc,KAAK;AAAA,EAC/C;AAAA,EAEA,mBAAyB;AACvB,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,SAAS,iBAAiB;AAAA,EACtC;AAAA,EAEA,qBAA2B;AACzB,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,SAAS,mBAAmB;AAAA,EACxC;AAAA,EAEA,eAAe,SAA0B;AACvC,QAAI,KAAK,KAAK,YAAY,EAAG,QAAO;AACpC,WAAO,KAAK,KAAK,SAAS,YAAY,OAAO;AAAA,EAC/C;AAAA,EAEA,YAAY,WAAmB,SAA0B;AACvD,QAAI,KAAK,KAAK,YAAY,EAAG,QAAO;AACpC,WAAO,KAAK,KAAK,SAAS,uBAAuB,WAAW,OAAO;AAAA,EACrE;AAAA,EAEA,gBAAgB,SAA0B;AACxC,WAAO,KAAK,KAAK,SAAS,gBAAgB,OAAO;AAAA,EACnD;AAAA,EAEA,kBAAwB;AACtB,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,SAAS,gBAAgB;AAAA,EACrC;AAAA,EAEA,oBAA0B;AACxB,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,SAAS,kBAAkB;AAAA,EACvC;AAAA,EAEA,aAAa,MAAe,cAAc,MAAY;AACpD,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,UAAM,WAAW,KAAK,KAAK,QAAQ;AACnC,UAAM,UAA8C,CAAC;AACrD,eAAW,OAAO,MAAM;AACtB,YAAM,OAAO,WACT,KAAK,KAAK,SAAS;AAAA,QACjB,KAAK,KAAK,SAAS,aAAa,KAAK,IAAI,uBAAuB,KAAK,KAAK,OAAO,CAAC,EAAE;AAAA,MACtF,IACA,KAAK,KAAK,SAAS,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG;AAC/D,UAAI,KAAM,SAAQ,KAAK,EAAE,MAAM,UAAU,KAAK,CAAC;AAAA,IACjD;AACA,QAAI,QAAQ,SAAS,GAAG;AACtB,WAAK,KAAK,iBAAiB,qBAAqB,SAAS,WAAW;AAAA,IACtE,WAAW,aAAa;AACtB,WAAK,YAAY;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,sBAA+B;AAC7B,UAAM,cAAc,IAAI,IAAI,KAAK,KAAK,iBAAiB,iBAAiB,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC1F,WAAO,KAAK,KAAK,SACd,iBAAiB,EACjB,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,YAAY,IAAI,EAAE,EAAE,CAAC,EAChE,IAAI,CAAC,MAAM,EAAE,IAAK,EAClB,OAAO,OAAO;AAAA,EACnB;AAAA,EAEA,iBAA2B;AACzB,WAAO,KAAK,KAAK,iBAAiB,eAAe;AAAA,EACnD;AAAA,EAEA,OAAgB;AACd,QAAI,KAAK,KAAK,YAAY,EAAG,QAAO;AACpC,WAAO,KAAK,KAAK,YAAY,KAAK;AAAA,EACpC;AAAA,EAEA,OAAgB;AACd,QAAI,KAAK,KAAK,YAAY,EAAG,QAAO;AACpC,WAAO,KAAK,KAAK,YAAY,KAAK;AAAA,EACpC;AAAA,EAEA,UAAmB;AACjB,WAAO,KAAK,KAAK,YAAY,QAAQ;AAAA,EACvC;AAAA,EAEA,UAAmB;AACjB,WAAO,KAAK,KAAK,YAAY,QAAQ;AAAA,EACvC;AAAA,EAEA,oBAAoB,MAA4B;AAC9C,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,QAAQ,mBAAmB,QAAQ,CAAC;AAC9C,SAAK,KAAK,mBAAmB,WAAW,KAAK,KAAK,QAAQ,gBAAgB;AAAA,EAC5E;AAAA,EAEA,sBAA+B;AAC7B,WAAO,KAAK,KAAK,mBAAmB,WAAW;AAAA,EACjD;AAAA,EAEA,uBAAuB,MAA4B;AACjD,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,QAAQ,sBAAsB,QAAQ,CAAC;AACjD,SAAK,KAAK,mBAAmB,cAAc,KAAK,KAAK,QAAQ,mBAAmB;AAAA,EAClF;AAAA,EAEA,yBAAkC;AAChC,WAAO,KAAK,KAAK,mBAAmB,cAAc;AAAA,EACpD;AAAA,EAEA,oBAAoE;AAClE,WAAO,KAAK,KAAK,aAAa,kBAAkB;AAAA,EAClD;AAAA,EAEA,sBAA4B;AAC1B,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,aAAa,oBAAoB;AAAA,EAC7C;AAAA,EAEA,uBAAyC;AACvC,QAAI,KAAK,KAAK,YAAY,EAAG,QAAO,QAAQ,QAAQ,KAAK;AACzD,WAAO,KAAK,KAAK,gBAAgB;AAAA,EACnC;AAAA,EAEA,gBAAgB,QAA4B;AAC1C,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,WAAW,eAAe,MAAM;AAAA,EAC5C;AAAA,EAEA,gBAAsB;AACpB,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,SAAS;AACnB,SAAK,KAAK,aAAa,WAAW;AAAA,EACpC;AAAA,EAEA,aAAsB;AACpB,WAAO,KAAK,KAAK,SAAS;AAAA,EAC5B;AAAA,EAEA,SAAwB;AACtB,QAAI,KAAK,KAAK,YAAY,EAAG,QAAO,QAAQ,QAAQ;AACpD,QAAI,KAAK,KAAK,SAAS,YAAY;AACjC,aAAO,KAAK,KAAK,SAAS,eAAe;AAAA,IAC3C,OAAO;AACL,WAAK,KAAK,SAAS,WAAW,KAAK,KAAK,QAAQ,OAAO;AACvD,WAAK,KAAK,aAAa,cAAc;AACrC,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,oBAA6B;AAC3B,WAAO,KAAK,KAAK,SAAS;AAAA,EAC5B;AAAA,EAEA,qBAAqB,SAAwB;AAC3C,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,SAAS,qBAAqB,OAAO;AAAA,EACjD;AAAA,EAEA,UAAkB;AAChB,WAAO,KAAK,KAAK,SAAS,eAAe;AAAA,EAC3C;AAAA,EAEA,QAAQ,MAAoB;AAC1B,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,SAAS,QAAQ,IAAI;AAAA,EACjC;AAAA,EAEA,cAAsB;AACpB,WAAO,KAAK,KAAK,QAAQ;AAAA,EAC3B;AAAA,EAEA,YAAY,MAAoB;AAC9B,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,SAAK,KAAK,SAAS,YAAY,IAAI;AAAA,EACrC;AAAA,EAEA,eAAuB;AACrB,WAAO,KAAK,KAAK,SAAS,aAAa;AAAA,EACzC;AAAA,EAEA,mBAA2B;AACzB,WAAO,KAAK,KAAK,SAAS,iBAAiB;AAAA,EAC7C;AAAA,EAEA,UAAU,MAAc,UAAmD,CAAC,GAAY;AACtF,QAAI,KAAK,KAAK,YAAY,KAAK,CAAC,KAAM,QAAO;AAC7C,UAAM,OAAO,SAAS,MAAM,QAAQ,aAAa,GAAG;AACpD,QAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,UAAM,YAAY,KAAK,QAAQ,kBAAkB,CAAC,KAAK,CAAC;AACxD,UAAM,OAAO,KAAK,OAAO,QAAQ,kBAAkB,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,MAAM,EAAE,CAAC;AAChG,UAAM,OAAO,QAAQ,QAAQ;AAE7B,QAAI,SAAS,SAAS;AACpB,WAAK,KAAK,UAAU,MAAM,MAAM,KAAK,GAAG,GAAG,CAAC;AAC5C,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,KAAK,KAAK,YAAY,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK;AACnF,UAAM,WAAW,oBAAI,IAAoB;AACzC,eAAW,OAAO,MAAM;AACtB,eAAS,IAAI,OAAO,IAAI,OAAO,cAAc,IAAI,OAAO,SAAS,IAAI,EAAE,GAAG,IAAI,OAAO,KAAM;AAC3F,UAAI,IAAI,OAAO,MAAO,UAAS,IAAI,IAAI,OAAO,OAAO,IAAI,OAAO,KAAK;AAAA,IACvE;AACA,QAAI,UAAU,SAAS,EAAG,WAAU,CAAC,IAAI,UAAU,CAAC,EAAE,QAAQ,WAAW,EAAE;AAC3E,QAAI,aAAa,UACd,IAAI,CAAC,QAAQ,WAAW,EAAE,OAAO,SAAS,IAAI,OAAO,MAAM,EAAE,KAAK,CAAC,KAAK,MAAM,MAAM,EAAE,EACtF,OAAO,CAAC,UAAqD,MAAM,SAAS,IAAI;AAEnF,QAAI,WAAW,WAAW,GAAG;AAC3B,mBAAa,KAAK,IAAI,CAAC,KAAK,WAAW,EAAE,OAAO,IAAI,OAAO,OAAQ,MAAM,EAAE;AAAA,IAC7E;AAEA,UAAM,UAAU,KAAK,IAAI,CAAC,KAAK,aAAa;AAC1C,YAAM,SAA8B,CAAC;AACrC,iBAAW,QAAQ,CAAC,EAAE,OAAO,MAAM,MAAM;AACvC,cAAM,MAAM,IAAI,KAAK;AACrB,YAAI,QAAQ,OAAW;AACvB,YAAI;AACJ,YAAI,QAAQ,YAAY;AACtB,cAAI;AACF,oBAAQ,QAAQ,WAAW,EAAE,OAAO,KAAK,OAAO,UAAU,aAAa,MAAM,CAAC;AAAA,UAChF,SAAS,OAAO;AACd,iBAAK,KAAK,YAAY,OAAO,kBAAkB,EAAE,OAAO,UAAU,aAAa,MAAM,CAAC;AACtF,oBAAQ;AAAA,UACV;AAAA,QACF,WAAW,QAAQ,IAAI;AACrB,kBAAQ;AAAA,QACV,WACE,QAAQ,kBAAkB,SAC1B,kDAAkD,KAAK,GAAG,KAC1D,CAAC,YAAY,KAAK,GAAG,GACrB;AACA,kBAAQ,OAAO,GAAG;AAAA,QACpB,OAAO;AACL,kBAAQ;AAAA,QACV;AACA,YAAI,CAAC,UAAU,QAAQ,OAAO,KAAK,GAAG;AACpC,eAAK,KAAK,YAAY,IAAI,MAAM,qBAAqB,KAAK,EAAE,GAAG,cAAc,EAAE,MAAM,CAAC;AAAA,QACxF;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT,CAAC;AAED,QAAI,SAAS,UAAU;AACrB,WAAK,KAAK,SAAS,iBAAiB,EAAE,KAAK,QAA8B,CAAC;AAAA,IAC5E,OAAO;AACL,WAAK,KAAK,SAAS,WAAW,OAA6B;AAAA,IAC7D;AACA,SAAK,KAAK,aAAa,cAAc;AACrC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAA+C,CAAC,GAAY;AAChE,QAAI,KAAK,KAAK,YAAY,EAAG,QAAO;AACpC,QAAI;AACF,YAAM,MAAM,OAAO,KAAK,IAAI,UAAU,sBAAsB;AAC5D,UAAI,CAAC,IAAK,QAAO;AACjB,YAAM,OAAO,KAAK,KAAK,YACpB,kBAAkB,EAClB,OAAO,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,EAAE,kBAAkB,CAAC,EAAE,OAAO,OAAO;AACzE,YAAM,QAAQ,KAAK,KAAK,SAAS,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,EAAE,OAAO;AAC1F,YAAM,gBAAgB,QAAQ,kBAAkB;AAChD,YAAM,cAAc,gBAChB,OAAO,KAAK,IAAI,CAAC,MAAM,OAAO,WAAW,EAAE,OAAO,cAAc,EAAE,OAAO,SAAS,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,UACxG;AACJ,YAAM,WAAW,MACd;AAAA,QACC,CAAC,SACC,OAAO,KACJ,IAAI,CAAC,MAAM;AACV,gBAAM,IAAI,gBAAgB,KAAK,MAAM,MAAM,CAAC;AAC5C,iBAAO,OAAO,WAAW,CAAC,CAAC;AAAA,QAC7B,CAAC,EACA,KAAK,EAAE,CAAC;AAAA,MACf,EACC,KAAK,EAAE;AACV,YAAM,OACJ,2DAA2D,WAAW,QAAQ,SAAS,WAAW,CAAC,kWAO5F,WAAW,QAAQ,SAAS,EAAE,CAAC,eAAe,WAAW,GAAG,QAAQ;AAE7E,UAAI,SAAS,MAAM,IAAI;AACvB,UAAI,SAAS,MAAM;AACnB,UAAI,MAAM;AACV,UAAI,MAAM;AACV,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,iBAAiB,QAAyE;AACxF,UAAM,SAAS,KAAK,KAAK,YAAY,UAAU,OAAO,KAAK;AAC3D,QAAI,CAAC,OAAQ,QAAO;AACpB,WAAO,KAAK,KAAK,eAAe,MAAM,OAAO,UAAU,QAAQ,OAAO,YAAY,IAAI;AAAA,EACxF;AAAA,EAEA,YAAY,QAAwB;AAClC,SAAK,KAAK,eAAe,KAAK,UAAU,KAAK;AAAA,EAC/C;AAAA,EAEA,eAAqB;AACnB,SAAK,KAAK,aAAa,gBAAgB;AACvC,SAAK,KAAK,mBAAmB,QAAQ;AACrC,SAAK,KAAK,gBAAgB,QAAQ;AAAA,EACpC;AAAA,EAEA,cAAc,SAA4C;AACxD,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,UAAM,WAAW,KAAK,KAAK;AAC3B,QAAI,gBAAgB;AACpB,QAAI,mBAAmB;AACvB,QAAI,qBAAqB;AACzB,QAAI,mBAAmB;AACvB,QAAI,sBAAsB;AAC1B,QAAI,qBAAqB;AACzB,QAAI,kBAAkB;AACtB,QAAI,iBAAiB;AACrB,QAAI,oBAAoB;AACxB,UAAM,iBAAiB,SAAS;AAChC,UAAM,eAAe,SAAS;AAE9B,eAAW,aAAa,aAAa;AACnC,YAAM,MAAM,KAAK,UAAU,OAAO,CAAC,EAAE,YAAY,CAAC,GAAG,UAAU,MAAM,CAAC,CAAC;AACvE,UAAI,OAAO,UAAU,eAAe,KAAK,SAAS,GAAG,GAAG;AACtD,eAAO,OAAO,UAAU,EAAE,CAAC,GAAG,GAAG,QAAQ,GAAG,EAAE,CAAC;AAAA,MACjD;AAAA,IACF;AAEA,QAAI,QAAQ,aAAa,QAAQ,OAAO,SAAS,QAAQ,SAAS,KAAK,QAAQ,YAAY,KAAK,QAAQ,cAAc,SAAS,WAAW;AACxI,eAAS,YAAY,QAAQ;AAC7B,sBAAgB;AAAA,IAClB;AACA,QAAI,QAAQ,gBAAgB,QAAQ,OAAO,SAAS,QAAQ,YAAY,KAAK,QAAQ,eAAe,KAAK,QAAQ,iBAAiB,SAAS,cAAc;AACvJ,eAAS,eAAe,QAAQ;AAChC,sBAAgB;AAChB,2BAAqB;AAAA,IACvB;AACA,QAAI,QAAQ,aAAa,QAAQ,OAAO,SAAS,QAAQ,SAAS,KAAK,QAAQ,aAAa,KAAK,QAAQ,cAAc,SAAS,WAAW;AACzI,eAAS,YAAY,KAAK,MAAM,QAAQ,SAAS;AACjD,sBAAgB;AAAA,IAClB;AACA,QAAI,QAAQ,aAAa,KAAM,UAAS,YAAY,QAAQ;AAC5D,QAAI,QAAQ,mBAAmB,QAAQ,OAAO,SAAS,QAAQ,eAAe,KAAK,QAAQ,kBAAkB,KAAK,QAAQ,oBAAoB,SAAS,iBAAiB;AACtK,eAAS,kBAAkB,QAAQ;AACnC,WAAK,KAAK,aAAa,oBAAoB;AAC3C,WAAK,KAAK,aAAa,YAAY,IAAI;AAAA,IACzC;AACA,QAAI,QAAQ,mBAAmB,KAAM,UAAS,kBAAkB,QAAQ;AACxE,QAAI,QAAQ,iBAAiB,KAAM,UAAS,gBAAgB,QAAQ;AACpE,QAAI,QAAQ,mBAAmB,KAAM,UAAS,kBAAkB,QAAQ;AACxE,QAAI,QAAQ,UAAU,QAAQ,QAAQ,WAAW,SAAS,QAAQ;AAChE,eAAS,SAAS,QAAQ;AAC1B,2BAAqB;AACrB,yBAAmB;AACnB,WAAK,KAAK,cAAc,QAAQ;AAChC,WAAK,KAAK,iBAAiB,QAAQ;AAAA,IACrC;AACA,QAAI,QAAQ,eAAe,QAAQ,QAAQ,gBAAgB,SAAS,aAAa;AAC/E,eAAS,cAAc,QAAQ;AAC/B,yBAAmB;AAAA,IACrB;AACA,QAAI,QAAQ,eAAe,QAAQ,QAAQ,gBAAgB,SAAS,aAAa;AAC/E,eAAS,cAAc,QAAQ;AAC/B,4BAAsB;AACtB,sBAAgB;AAAA,IAClB;AACA,QAAI,QAAQ,iBAAiB,QAAQ,OAAO,SAAS,QAAQ,aAAa,KAAK,QAAQ,iBAAiB,KAAK,QAAQ,kBAAkB,cAAc;AACnJ,eAAS,gBAAgB,KAAK,MAAM,QAAQ,aAAa;AACzD,WAAK,KAAK,YAAY,WAAW;AAAA,IACnC;AACA,QAAI,OAAO,UAAU,eAAe,KAAK,SAAS,cAAc,GAAG;AACjE,YAAM,UAAU,SAAS,iBAAiB,QAAQ;AAClD,eAAS,eAAe,QAAQ;AAChC,UAAI,QAAS,MAAK,KAAK,aAAa,wBAAwB;AAC5D,sBAAgB;AAAA,IAClB;AACA,QAAI,QAAQ,wBAAwB,MAAM;AACxC,eAAS,uBAAuB,QAAQ;AACxC,UAAI,CAAC,QAAQ,qBAAsB,MAAK,oBAAoB;AAAA,IAC9D;AACA,QAAI,OAAO,UAAU,eAAe,KAAK,SAAS,kBAAkB,EAAG,UAAS,mBAAmB,QAAQ;AAC3G,QAAI,QAAQ,oBAAoB,QAAQ,OAAO,SAAS,QAAQ,gBAAgB,KAAK,QAAQ,oBAAoB,GAAG;AAClH,eAAS,mBAAmB,QAAQ;AAAA,IACtC;AACA,QAAI,QAAQ,cAAc,KAAM,UAAS,aAAa,QAAQ;AAC9D,QAAI,OAAO,UAAU,eAAe,KAAK,SAAS,qBAAqB,EAAG,UAAS,sBAAsB,QAAQ;AACjH,QAAI,QAAQ,SAAS,QAAQ,QAAQ,UAAU,SAAS,OAAO;AAC7D,eAAS,QAAQ,QAAQ;AACzB,WAAK,KAAK,SAAS,WAAW,QAAQ,KAAK;AAC3C,WAAK,KAAK,iBAAiB,QAAQ;AAAA,IACrC;AACA,QAAI,QAAQ,eAAe,QAAW;AACpC,YAAM,MAAM,QAAQ;AACpB,YAAM,SAAS,QAAQ,SAAS,SAAS,cAAc;AACvD,UAAI,WAAW,SAAS,mBAAmB;AACzC,aAAK,KAAK,SAAS,qBAAqB,MAAM;AAAA,MAChD;AACA,UAAI,OAAO,QAAQ,YAAY,KAAK;AAClC,YAAI,IAAI,YAAY,KAAM,UAAS,qBAAqB,IAAI;AAC5D,YAAI,IAAI,mBAAmB,KAAM,UAAS,4BAA4B,IAAI;AAC1E,YAAI,IAAI,aAAa,KAAM,UAAS,sBAAsB,IAAI;AAC9D,YAAI,IAAI,wBAAwB,KAAM,UAAS,6BAA6B,IAAI;AAAA,MAClF;AACA,UAAI,SAAS,mBAAmB;AAC9B,aAAK,KAAK,SAAS,2BAA2B;AAAA,MAChD;AACA,WAAK,KAAK,cAAc,QAAQ;AAAA,IAClC;AACA,QAAI,QAAQ,cAAc,QAAW;AACnC,eAAS,mBAAmB,QAAQ,aAAa,QAAQ,QAAQ,cAAc;AAC/E,eAAS,kBACP,QAAQ,aAAa,QAAQ,QAAQ,cAAc,QAC/C,OACA,QAAQ,cAAc,OACpB,EAAE,MAAM,YAAY,IACpB,QAAQ;AAChB,WAAK,KAAK,iBAAiB,QAAQ;AAAA,IACrC;AACA,QAAI,QAAQ,qBAAqB,KAAM,UAAS,oBAAoB,QAAQ;AAC5E,QAAI,QAAQ,eAAe,KAAM,UAAS,cAAc,QAAQ;AAChE,QAAI,QAAQ,cAAc,KAAM,UAAS,aAAa,QAAQ;AAC9D,QAAI,QAAQ,cAAc,KAAM,UAAS,aAAa,QAAQ;AAC9D,QAAI,QAAQ,cAAc,QAAW;AACnC,eAAS,mBACP,QAAQ,cAAc,QAAS,OAAO,QAAQ,cAAc,YAAY,QAAQ,aAAa;AAC/F,UAAI,OAAO,QAAQ,cAAc,YAAY,QAAQ,WAAW,QAAQ;AACtE,iBAAS,kBAAkB,QAAQ,UAAU;AAAA,MAC/C;AACA,WAAK,KAAK,iBAAiB,QAAQ;AAAA,IACrC;AACA,QAAI,OAAO,UAAU,eAAe,KAAK,SAAS,eAAe,GAAG;AAClE,eAAS,gBAAgB,QAAQ;AACjC,4BAAsB;AAAA,IACxB;AACA,QAAI,QAAQ,QAAQ,QAAQ,OAAO,UAAU,eAAe,KAAK,mBAAmB,QAAQ,IAAI,KAAK,QAAQ,SAAS,SAAS,MAAM;AACnI,YAAM,SAAS,kBAAkB,QAAQ,IAAI;AAC7C,eAAS,OAAO,QAAQ;AACxB,eAAS,YAAY,QAAQ,aAAa,OAAO;AACjD,eAAS,eAAe,QAAQ,gBAAgB,OAAO;AACvD,WAAK,KAAK,SAAS,UAAU,QAAQ,IAAI;AACzC,sBAAgB;AAChB,2BAAqB;AAAA,IACvB;AACA,QAAI,QAAQ,eAAe,QAAQ,QAAQ,gBAAgB,SAAS,aAAa;AAC/E,eAAS,cAAc,QAAQ;AAC/B,WAAK,KAAK,SAAS,WAAW,QAAQ,WAAW;AAAA,IACnD;AACA,QAAI,QAAQ,mBAAmB,QAAQ,QAAQ,oBAAoB,SAAS,iBAAiB;AAC3F,eAAS,kBAAkB,QAAQ;AACnC,WAAK,KAAK,SAAS,eAAe,QAAQ,eAAe;AAAA,IAC3D;AACA,QAAI,QAAQ,qBAAqB,KAAM,UAAS,oBAAoB,QAAQ;AAC5E,QAAI,QAAQ,6BAA6B,KAAM,UAAS,4BAA4B,QAAQ;AAC5F,QAAI,QAAQ,yBAAyB,KAAM,UAAS,wBAAwB,QAAQ;AACpF,QAAI,QAAQ,uBAAuB,QAAQ,QAAQ,wBAAwB,SAAS,qBAAqB;AACvG,eAAS,sBAAsB,QAAQ;AACvC,2BAAqB;AAAA,IACvB;AACA,QAAI,OAAO,UAAU,eAAe,KAAK,SAAS,uBAAuB,GAAG;AAC1E,eAAS,wBAAwB,QAAQ,yBAAyB;AAAA,IACpE;AACA,QAAI,OAAO,UAAU,eAAe,KAAK,SAAS,wBAAwB,GAAG;AAC3E,eAAS,yBAAyB,QAAQ,0BAA0B;AAAA,IACtE;AACA,QAAI,QAAQ,0BAA0B,MAAM;AAC1C,eAAS,yBAAyB,QAAQ;AAAA,IAC5C;AACA,QAAI,OAAO,UAAU,eAAe,KAAK,SAAS,WAAW,GAAG;AAC9D,eAAS,YAAY,QAAQ,aAAa;AAC1C,WAAK,KAAK,SAAS,eAAe,SAAS,SAAS;AAAA,IACtD;AACA,QAAI,QAAQ,WAAW,KAAM,UAAS,UAAU,QAAQ;AACxD,QAAI,QAAQ,gBAAgB,QAAQ,QAAQ,iBAAiB,SAAS,cAAc;AAClF,eAAS,eAAe,QAAQ;AAChC,UAAI,QAAQ,iBAAiB,OAAQ,MAAK,YAAY;AACtD,2BAAqB;AACrB,yBAAmB;AAAA,IACrB;AACA,QAAI,QAAQ,oBAAoB,QAAW;AACzC,WAAK,eAAe,QAAQ,eAAe;AAAA,IAC7C;AACA,QAAI,QAAQ,kBAAkB,UAAa,QAAQ,kBAAkB,SAAS,eAAe;AAC3F,eAAS,gBAAgB,EAAE,GAAG,iBAAiB,GAAG,QAAQ,cAAc;AACxE,2BAAqB;AAAA,IACvB;AACA,QAAI,OAAO,UAAU,eAAe,KAAK,SAAS,UAAU,KAAK,QAAQ,aAAa,SAAS,UAAU;AACvG,eAAS,WAAW,QAAQ;AAC5B,wBAAkB;AAAA,IACpB;AACA,QAAI,QAAQ,gBAAgB,QAAQ,QAAQ,iBAAiB,SAAS,cAAc;AAClF,eAAS,eAAe,QAAQ;AAChC,2BAAqB;AACrB,wBAAkB;AAAA,IACpB;AACA,QAAI,QAAQ,sBAAsB,QAAQ,QAAQ,uBAAuB,SAAS,oBAAoB;AACpG,eAAS,qBAAqB,QAAQ;AACtC,2BAAqB;AAAA,IACvB;AACA,QAAI,QAAQ,YAAY,QAAQ,QAAQ,aAAa,SAAS,UAAU;AACtE,eAAS,WAAW,QAAQ;AAC5B,wBAAkB;AAClB,2BAAqB;AAAA,IACvB;AACA,QAAI,QAAQ,eAAe,QAAQ,QAAQ,gBAAgB,SAAS,aAAa;AAC/E,eAAS,cAAc,QAAQ;AAC/B,wBAAkB;AAAA,IACpB;AACA,QAAI,QAAQ,uBAAuB,KAAM,UAAS,sBAAsB,QAAQ;AAChF,QAAI,QAAQ,oBAAoB,QAAQ,QAAQ,qBAAqB,SAAS,kBAAkB;AAC9F,eAAS,mBAAmB,QAAQ;AACpC,wBAAkB;AAAA,IACpB;AACA,QAAI,QAAQ,gBAAgB,KAAM,UAAS,eAAe,QAAQ;AAClE,QAAI,QAAQ,oBAAoB,KAAM,UAAS,mBAAmB,QAAQ;AAC1E,QAAI,OAAO,UAAU,eAAe,KAAK,SAAS,UAAU,GAAG;AAC7D,eAAS,WAAW,QAAQ;AAC5B,wBAAkB;AAAA,IACpB;AACA,QAAI,OAAO,UAAU,eAAe,KAAK,SAAS,YAAY,GAAG;AAC/D,eAAS,aAAa,QAAQ;AAC9B,yBAAmB;AAAA,IACrB;AACA,QAAI,OAAO,UAAU,eAAe,KAAK,SAAS,UAAU,GAAG;AAC7D,eAAS,WAAW,MAAM,QAAQ,QAAQ,QAAQ,IAAI,QAAQ,WAAW,CAAC;AAC1E,WAAK,KAAK,YAAY,SAAS,QAAQ;AAAA,IACzC;AACA,QAAI,OAAO,UAAU,eAAe,KAAK,SAAS,kBAAkB,GAAG;AACrE,eAAS,mBAAmB,QAAQ;AACpC,uBAAiB;AAAA,IACnB;AACA,QAAI,OAAO,UAAU,eAAe,KAAK,SAAS,gBAAgB,GAAG;AACnE,eAAS,iBAAiB,QAAQ,kBAAkB;AACpD,uBAAiB;AAAA,IACnB;AACA,QAAI,QAAQ,aAAa,QAAQ,OAAO,SAAS,QAAQ,SAAS,KAAK,QAAQ,YAAY,GAAG;AAC5F,eAAS,YAAY,KAAK,MAAM,QAAQ,SAAS;AAAA,IACnD;AACA,QAAI,QAAQ,sBAAsB,QAAQ,OAAO,SAAS,QAAQ,kBAAkB,KAAK,QAAQ,sBAAsB,GAAG;AACxH,eAAS,qBAAqB,KAAK,MAAM,QAAQ,kBAAkB;AAAA,IACrE;AACA,QAAI,OAAO,UAAU,eAAe,KAAK,SAAS,YAAY,KAAK,QAAQ,eAAe,SAAS,YAAY;AAC7G,eAAS,aAAa,QAAQ;AAC9B,eAAS,oBAAoB,QAAQ,cAAc,QAAQ,SAAS;AACpE,0BAAoB;AACpB,WAAK,KAAK,cAAc,QAAQ;AAAA,IAClC;AACA,QAAI,OAAO,UAAU,eAAe,KAAK,SAAS,mBAAmB,GAAG;AACtE,eAAS,oBAAoB,QAAQ;AACrC,yBAAmB;AAAA,IACrB;AACA,QAAI,OAAO,UAAU,eAAe,KAAK,SAAS,iBAAiB,GAAG;AACpE,eAAS,kBAAkB,QAAQ;AACnC,yBAAmB;AAAA,IACrB;AACA,QAAI,QAAQ,qBAAqB,QAAW;AAC1C,eAAS,mBAAmB,QAAQ,oBAAoB,CAAC;AACzD,WAAK,KAAK,mBAAmB,WAAW,SAAS,gBAAgB;AAAA,IACnE;AACA,QAAI,QAAQ,wBAAwB,QAAW;AAC7C,eAAS,sBAAsB,QAAQ,uBAAuB,CAAC;AAC/D,WAAK,KAAK,mBAAmB,cAAc,SAAS,mBAAmB;AAAA,IACzE;AAEA,QAAI,oBAAoB;AACtB,WAAK,KAAK,YAAY,cAAc,SAAS,UAAU;AACvD,WAAK,KAAK,0BAA0B;AACpC,2BAAqB;AACrB,yBAAmB;AAAA,IACrB;AACA,QAAI,gBAAgB;AAClB,WAAK,KAAK,yBAAyB;AACnC,WAAK,KAAK,0BAA0B;AAAA,IACtC;AACA,QAAI,mBAAmB;AACrB,WAAK,KAAK,KAAK,SAAS,oBAAoB;AAAA,IAC9C,WAAW,iBAAiB;AAC1B,UAAI,KAAK,KAAK,SAAS,WAAY,MAAK,KAAK,KAAK,SAAS,sBAAsB;AAAA,WAC5E;AACH,aAAK,KAAK,SAAS,WAAW,SAAS,OAAO;AAC9C,aAAK,KAAK,aAAa,cAAc;AAAA,MACvC;AAAA,IACF;AAEA,QAAI,eAAe;AACjB,WAAK,KAAK,SAAS,cAAc,SAAS,WAAW,SAAS,YAAY;AAC1E,WAAK,KAAK,SAAS;AACnB,WAAK,KAAK,gBAAgB,KAAK;AAAA,IACjC;AACA,QAAI,QAAQ,cAAc,QAAQ,QAAQ,eAAe,gBAAgB;AACvE,2BAAqB;AAAA,IACvB;AACA,QAAI,mBAAoB,MAAK,KAAK,eAAe,MAAM;AACvD,QAAI,iBAAkB,MAAK,KAAK,aAAa,YAAY;AAAA,aAChD,iBAAkB,MAAK,aAAa;AAC7C,QAAI,oBAAqB,MAAK,KAAK,gBAAgB,QAAQ;AAC3D,SAAK,KAAK,aAAa,gBAAgB;AAAA,EACzC;AAAA,EAEA,aAAa,SAA0B,CAAC,GAAW;AACjD,UAAM,OAAO,KAAK,KAAK,YAAY,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,EAAE,cAAc;AACxG,QAAI,OAAO,aAAa;AACtB,aAAO;AAAA,QACL;AAAA,UACE,iBAAiB,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO,cAAc,EAAE,OAAO,SAAS,EAAE,EAAE;AAAA,UACpF,cAAc,MAAM,CAAC;AAAA,QACvB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,QAAQ,OAAO,eACjB,KAAK,KAAK,iBAAiB,iBAAiB,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ,IAC5F,OAAO,mBACL,KAAK,KAAK,SAAS,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,EAAE,OAAO,IAC/E,KAAK,KAAK,SAAS,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,EAAE,OAAO;AAEhF,WAAO,SAAS;AAAA,MACd,iBAAiB,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO,cAAc,EAAE,OAAO,SAAS,EAAE,EAAE;AAAA,MACpF,cAAc,MACZ,MAAM;AAAA,QAAI,CAAC,SACT,KAAK,IAAI,CAAC,MAAM;AACd,gBAAM,IAAI,KAAK,KAAK,aAAa,MAAM,CAAC;AACxC,cAAI,OAAO,MAAM,SAAU,QAAO;AAClC,iBAAO,gBAAgB,KAAK,MAAM,MAAM,CAAC;AAAA,QAC3C,CAAC;AAAA,MACH;AAAA,IACJ,GAAG,MAAM;AAAA,EACX;AAAA,EAEA,WAAW,MAAyC;AAClD,QAAI,SAAS,WAAW;AACtB,WAAK,KAAK,SAAS;AAAA,QACjB;AAAA,QACA,KAAK,KAAK,QAAQ;AAAA,QAClB,KAAK,KAAK,QAAQ;AAAA,MACpB;AAAA,IACF,WAAW,SAAS,UAAU;AAC5B,YAAM,UAAU,KAAK,KAAK,QAAQ,yBAAyB,KAAK,KAAK,uBAAuB;AAC5F,WAAK,KAAK,SAAS,YAAY,UAAU,SAAS,KAAK,KAAK,QAAQ,sBAAsB;AAAA,IAC5F,OAAO;AACL,WAAK,KAAK,SAAS,YAAY;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,eAAqB;AACnB,SAAK,KAAK,SAAS,YAAY;AAAA,EACjC;AAAA,EAEA,iBACE,WACA,UACY;AACZ,WAAO,KAAK,KAAK,SAAS,GAAG,WAAW,QAAQ;AAAA,EAClD;AAAA,EAEA,oBACE,WACA,UACM;AACN,SAAK,KAAK,SAAS,IAAI,WAAW,QAAQ;AAAA,EAC5C;AAAA,EAEA,UAAgB;AACd,SAAK,KAAK,QAAQ;AAAA,EACpB;AAAA,EAEA,cAAuB;AACrB,WAAO,KAAK,KAAK,YAAY;AAAA,EAC/B;AACF;;;ACp7BA,IAAM,eAA2B,CAAC,WAAW,UAAU,OAAO;AAGvD,IAAM,eAAN,MAAmB;AAAA,EAwBxB,YAAoB,MAAuB;AAAvB;AAlBpB,sBAA8C,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAChF,+BAAqD,CAAC;AAUtD,SAAQ,iBAA8C;AACtD,SAAQ,wBAAgD;AACxD,SAAQ,2BAA2B;AACnC,SAAQ,oBAA8B,CAAC;AACvC,SAAQ,iBAAwC;AAChD,SAAQ,cAAc;AAyJtB,SAAQ,aAAkC;AAAA,EAvJE;AAAA,EAE5C,KAAK,WAAwB,SAAoC;AAC/D,UAAM,UAAU,CAAC,aAAa,cAAc,QAAQ,IAAI,EAAE;AAC1D,QAAI,QAAQ,YAAa,SAAQ,KAAK,cAAc;AACpD,QAAI,QAAQ,gBAAiB,SAAQ,KAAK,mBAAmB;AAC7D,SAAK,OAAO,GAAG,OAAO,QAAQ,KAAK,GAAG,CAAC;AACvC,SAAK,eAAe,QAAQ,SAAS;AACrC,SAAK,KAAK,MAAM,YAAY,gBAAgB,GAAG,QAAQ,SAAS,IAAI;AACpE,SAAK,KAAK,MAAM,YAAY,mBAAmB,GAAG,QAAQ,YAAY,IAAI;AAC1E,SAAK,KAAK,aAAa,QAAQ,MAAM;AACrC,SAAK,KAAK,WAAW;AAErB,SAAK,WAAW,GAAG,OAAO,aAAa;AACvC,SAAK,SAAS,aAAa,QAAQ,UAAU;AAC7C,SAAK,aAAa,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AACpD,SAAK,cAAc,CAAC;AACpB,SAAK,sBAAsB,CAAC;AAE5B,eAAW,QAAQ,CAAC,QAAQ,UAAU,OAAO,GAAiB;AAC5D,YAAM,SAAS,GAAG,OAAO,wBAAwB,IAAI,mBAAmB;AACxE,YAAM,gBAAgB,GAAG,OAAO,kBAAkB;AAClD,UAAI,SAAS,UAAU;AACrB,cAAM,WAAW,GAAG,OAAO,sBAAsB;AACjD,iBAAS,YAAY,aAAa;AAClC,eAAO,YAAY,QAAQ;AAAA,MAC7B,OAAO;AACL,eAAO,YAAY,aAAa;AAAA,MAClC;AACA,WAAK,SAAS,YAAY,MAAM;AAChC,WAAK,YAAY,IAAI,IAAI;AACzB,WAAK,oBAAoB,IAAI,IAAI;AAAA,IACnC;AAEA,SAAK,kBAAkB,CAAC;AAExB,SAAK,SAAS,GAAG,OAAO,WAAW;AACnC,SAAK,cAAc,GAAG,OAAO,wCAAwC;AACrE,SAAK,YAAY,MAAM,UAAU;AACjC,SAAK,iBAAiB,GAAG,OAAO,2CAA2C;AAC3E,SAAK,eAAe,MAAM,UAAU;AACpC,SAAK,gBAAgB,CAAC;AACtB,SAAK,gBAAgB,CAAC;AACtB,SAAK,YAAY,CAAC;AAElB,eAAW,QAAQ,CAAC,QAAQ,UAAU,OAAO,GAAiB;AAC5D,YAAM,SAAS,GAAG,OAAO,wBAAwB,IAAI,iBAAiB;AACtE,YAAM,WAAW,GAAG,OAAO,qBAAqB,SAAS,WAAW,gCAAgC,EAAE,EAAE;AACxG,YAAMC,aAAY,GAAG,OAAO,oBAAoB;AAChD,eAAS,YAAYA,UAAS;AAC9B,aAAO,YAAY,QAAQ;AAC3B,WAAK,OAAO,YAAY,MAAM;AAC9B,WAAK,UAAU,IAAI,IAAI;AACvB,WAAK,cAAc,IAAI,IAAI;AAC3B,WAAK,cAAc,IAAI,IAAIA;AAAA,IAC7B;AAEA,SAAK,iBAAiB,GAAG,OAAO,cAAc;AAC9C,SAAK,eAAe,MAAM,UAAU;AACpC,SAAK,eAAe,aAAa,QAAQ,QAAQ;AACjD,SAAK,eAAe,aAAa,aAAa,QAAQ;AACtD,SAAK,iBAAiB,GAAG,OAAO,sBAAsB;AACtD,SAAK,eAAe,YAAY,KAAK,cAAc;AAEnD,SAAK,oBAAoB,GAAG,OAAO,uBAAuB;AAC1D,SAAK,kBAAkB,MAAM,UAAU;AACvC,SAAK,kBAAkB,YAAY,GAAG,OAAO,cAAc,CAAC;AAC5D,SAAK,sBAAsB,GAAG,MAAM;AACpC,SAAK,kBAAkB,YAAY,KAAK,mBAAmB;AAE3D,SAAK,KAAK;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AACA,cAAU,YAAY,KAAK,IAAI;AAE/B,QAAI,OAAO,mBAAmB,aAAa;AACzC,WAAK,iBAAiB,IAAI,eAAe,MAAM,KAAK,KAAK,SAAS,CAAC;AACnE,WAAK,eAAe,QAAQ,KAAK,IAAI;AAAA,IACvC;AAEA,SAAK,WAAW,QAAQ,KAAK;AAAA,EAC/B;AAAA,EAEA,kBAAkB,OAAqB;AACrC,SAAK,cAAc;AACnB,eAAW,QAAQ,CAAC,QAAQ,UAAU,OAAO,GAAiB;AAC5D,YAAM,YAAY,KAAK,oBAAoB,IAAI;AAC/C,YAAM,OAAO,KAAK,WAAW,IAAI;AACjC,aAAO,KAAK,SAAS,OAAO;AAC1B,cAAM,MAAM,GAAG,OAAO,iBAAiB;AACvC,YAAI,aAAa,QAAQ,KAAK;AAC9B,YAAI,aAAa,iBAAiB,OAAO,KAAK,SAAS,CAAC,CAAC;AACzD,YAAI,MAAM,MAAM,GAAG,KAAK,SAAS,KAAK,KAAK,QAAQ,YAAY;AAC/D,YAAI,MAAM,SAAS,GAAG,KAAK,KAAK,QAAQ,YAAY;AACpD,kBAAU,YAAY,GAAG;AACzB,aAAK,KAAK,GAAG;AAAA,MACf;AACA,aAAO,KAAK,SAAS,OAAO;AAC1B,aAAK,IAAI,EAAG,OAAO;AAAA,MACrB;AAAA,IACF;AACA,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEQ,oBAA0B;AAChC,SAAK,SAAS,MAAM,SAAS,GAAG,KAAK,cAAc,KAAK,KAAK,QAAQ,YAAY;AACjF,eAAW,QAAQ,CAAC,QAAQ,UAAU,OAAO,GAAiB;AAC5D,YAAM,OAAO,KAAK,WAAW,IAAI;AACjC,WAAK,QAAQ,CAAC,KAAK,MAAM;AACvB,YAAI,MAAM,MAAM,GAAG,IAAI,KAAK,KAAK,QAAQ,YAAY;AACrD,YAAI,MAAM,SAAS,GAAG,KAAK,KAAK,QAAQ,YAAY;AAAA,MACtD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,cAAc,MAAc,OAAqB;AAC/C,SAAK,eAAe,QAAQ,IAAI;AAChC,SAAK,eAAe,SAAS,KAAK;AAAA,EACpC;AAAA,EAEQ,eAAe,MAAgB,OAAqB;AAC1D,UAAM,KAAK,KAAK,YAAY,IAAI;AAChC,UAAM,KAAK,KAAK,UAAU,IAAI;AAC9B,OAAG,MAAM,QAAQ,GAAG,KAAK;AACzB,OAAG,MAAM,QAAQ,GAAG,KAAK;AACzB,UAAM,SAAS,SAAS;AACxB,OAAG,UAAU,OAAO,qBAAqB,MAAM;AAC/C,OAAG,UAAU,OAAO,qBAAqB,MAAM;AAAA,EACjD;AAAA,EAEA,uBAA+B;AAC7B,WAAO,KAAK,cAAc,OAAO;AAAA,EACnC;AAAA,EAEA,cAAc,WAAmB,cAA4B;AAC3D,SAAK,KAAK,MAAM,YAAY,gBAAgB,GAAG,SAAS,IAAI;AAC5D,SAAK,KAAK,MAAM,YAAY,mBAAmB,GAAG,YAAY,IAAI;AAClE,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,UAAU,MAAsB;AAC9B,eAAW,KAAK,cAAc;AAC5B,WAAK,KAAK,UAAU,OAAO,cAAc,CAAC,IAAI,MAAM,IAAI;AAAA,IAC1D;AAAA,EACF;AAAA,EAIA,WAAW,OAAwB;AACjC,QAAI,CAAC,KAAK,KAAM;AAChB,SAAK,aAAa;AAClB,SAAK,aAAa;AAClB,UAAM,OAAO,UAAU,UAAW,UAAU,UAAU,KAAK,kBAAkB;AAC7E,SAAK,KAAK,UAAU,OAAO,mBAAmB,IAAI;AAElD,QAAI,UAAU,UAAU,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;AAChG,YAAM,KAAK,OAAO,WAAW,8BAA8B;AAC3D,YAAM,UAAU,MAAM,KAAK,KAAK,UAAU,OAAO,mBAAmB,GAAG,OAAO;AAC9E,UAAI,OAAO,GAAG,qBAAqB,YAAY;AAC7C,WAAG,iBAAiB,UAAU,OAAO;AACrC,aAAK,aAAa,MAAM,GAAG,oBAAoB,UAAU,OAAO;AAAA,MAClE,WAAW,OAAO,GAAG,gBAAgB,YAAY;AAC/C,WAAG,YAAY,OAAO;AACtB,aAAK,aAAa,MAAM,GAAG,eAAe,OAAO;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,oBAA6B;AACnC,QAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,WAAY,QAAO;AACrF,WAAO,OAAO,WAAW,8BAA8B,EAAE;AAAA,EAC3D;AAAA,EAEA,WAAW,IAAmB;AAC5B,SAAK,KAAK,UAAU,OAAO,gBAAgB,EAAE;AAAA,EAC/C;AAAA,EAEA,eAAe,IAAmB;AAChC,SAAK,KAAK,UAAU,OAAO,qBAAqB,EAAE;AAAA,EACpD;AAAA,EAEA,eAAe,WAA4C;AACzD,eAAW,SAAS,KAAK,kBAAmB,MAAK,KAAK,UAAU,OAAO,KAAK;AAC5E,SAAK,oBAAoB,CAAC;AAC1B,eAAW,SAAS,OAAO,aAAa,EAAE,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO,GAAG;AACxE,UAAI,KAAK,KAAK,UAAU,SAAS,KAAK,EAAG;AACzC,WAAK,KAAK,UAAU,IAAI,KAAK;AAC7B,WAAK,kBAAkB,KAAK,KAAK;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,YAAY,MAA4B,SAA0B,kBAAkB,OAAa;AAC/F,QACE,KAAK,mBAAmB,QACxB,KAAK,0BAA0B,WAC/B,KAAK,6BAA6B,gBAClC;AACF,SAAK,iBAAiB;AACtB,SAAK,wBAAwB;AAC7B,SAAK,2BAA2B;AAChC,SAAK,eAAe,gBAAgB;AAEpC,QAAI;AACJ,QAAI;AACF,iBAAW,OAAO,YAAY,aAAa,QAAQ,IAAI;AAAA,IACzD,SAAS,OAAO;AACd,WAAK,KAAK,YAAY,OAAO,iBAAiB;AAC9C,iBAAW;AAAA,IACb;AAEA,QAAI,oBAAoB,aAAa;AACnC,WAAK,eAAe,YAAY,QAAQ;AAAA,IAC1C,WAAW,YAAY,iBAAiB;AACtC,WAAK,eAAe,YAAY;AAAA,IAClC,WAAW,UAAU;AACnB,WAAK,eAAe,cAAc;AAAA,IACpC,WAAW,SAAS,WAAW;AAC7B,YAAM,UAAU,GAAG,OAAO,cAAc;AACxC,cAAQ,aAAa,cAAc,SAAS;AAC5C,WAAK,eAAe,YAAY,OAAO;AAAA,IACzC;AACA,SAAK,eAAe,MAAM,UAAU;AACpC,SAAK,KAAK,aAAa,aAAa,SAAS,YAAY,SAAS,OAAO;AAAA,EAC3E;AAAA,EAEA,cAAoB;AAClB,QAAI,CAAC,KAAK,eAAgB;AAC1B,SAAK,iBAAiB;AACtB,SAAK,wBAAwB;AAC7B,SAAK,2BAA2B;AAChC,SAAK,eAAe,MAAM,UAAU;AACpC,SAAK,eAAe,gBAAgB;AACpC,SAAK,KAAK,aAAa,aAAa,OAAO;AAAA,EAC7C;AAAA,EAEA,mBAAmB,QAAiB,MAAoB;AACtD,QAAI,CAAC,KAAK,kBAAmB;AAC7B,QAAI,QAAQ;AACV,UAAI,KAAK,oBAAoB,gBAAgB,KAAM,MAAK,oBAAoB,cAAc;AAC1F,WAAK,kBAAkB,MAAM,UAAU;AACvC,WAAK,KAAK,aAAa,aAAa,MAAM;AAAA,IAC5C,OAAO;AACL,WAAK,kBAAkB,MAAM,UAAU;AACvC,UAAI,KAAK,mBAAmB,UAAW,MAAK,KAAK,aAAa,aAAa,OAAO;AAAA,IACpF;AAAA,EACF;AAAA,EAEA,UAAgB;AACd,SAAK,aAAa;AAClB,SAAK,aAAa;AAClB,SAAK,gBAAgB,WAAW;AAChC,SAAK,iBAAiB;AACtB,SAAK,KAAK,OAAO;AAAA,EACnB;AAEF;;;AClSA,IAAM,eAAuC;AAAA,EAC3C,UAAU;AAAA,EACV,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,oBAAoB;AAAA,EACpB,SAAS;AACX;AAEO,SAAS,eAAe,QAA8B;AAC3D,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,SAAS,OAAO;AACzB,UAAM,QAAQ,OAAO,OAAO;AAC5B,WAAO,gBAAM,KAAK;AAAA,EACpB;AACA,QAAM,QAAkB,CAAC;AACzB,aAAW,aAAa,OAAO,YAAY;AACzC,UAAM,QAAQ,aAAa,UAAU,KAAK,KAAK,UAAU;AACzD,UAAM,QAAQ,UAAU;AACxB,UAAM,SAAS,YAAY,YAAY,UAAU,SAAS;AAC1D,QAAI,UAAU,UAAU,WAAW,UAAU,UAAU,YAAY;AACjE,YAAM,KAAK,KAAK;AAAA,IAClB,WAAW,UAAU,UAAU,aAAa,SAAS,MAAM;AACzD,YAAM,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,UAAU,KAAK,EAAE;AAAA,IACnD,WAAW,SAAS,QAAQ,OAAO,KAAK,MAAM,IAAI;AAChD,YAAM,KAAK,GAAG,KAAK,IAAI,KAAK,EAAE;AAAA,IAChC,OAAO;AACL,YAAM,KAAK,KAAK;AAAA,IAClB;AAAA,EACF;AACA,QAAM,WAAW,OAAO,aAAa,OAAO,aAAQ;AACpD,SAAO,MAAM,KAAK,QAAQ;AAC5B;;;ACQO,IAAM,iBAAN,MAAqB;AAAA,EAK1B,YAAoB,MAAqB;AAArB;AAJpB,SAAQ,YAA0B,CAAC;AACnC,SAAQ,aAA0B,CAAC;AACnC,SAAQ,YAA0C,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EAE1C;AAAA,EAE1C,QAAc;AACZ,eAAW,QAAQ,KAAK,WAAW;AACjC,YAAM,UAAU,oBAAoB,KAAK,EAAE;AAC3C,UAAI,SAAS;AACX,YAAI;AACF,kBAAQ;AAAA,QACV,SAAS,OAAO;AACd,eAAK,KAAK,YAAY,OAAO,2BAA2B,EAAE,OAAO,KAAK,OAAO,GAAG,CAAC;AAAA,QACnF;AAAA,MACF;AAAA,IACF;AACA,SAAK,YAAY,CAAC;AAClB,SAAK,aAAa,CAAC;AACnB,UAAM,QAAQ,KAAK,KAAK,YAAY,eAAe;AACnD,SAAK,KAAK,SAAS,kBAAkB,KAAK;AAE1C,UAAM,SAAS,CAAC,QACd,IAAI,WAAW,SAAS,SAAS,IAAI,WAAW,UAAU,UAAU;AAEtE,UAAM,YAAY,CAChB,UACA,OACA,SACe;AACf,YAAM,MAAkB,CAAC;AACzB,iBAAW,SAAS,UAAU;AAC5B,YAAI,iBAAiB,aAAa;AAChC,gBAAM,UAAU,UAAU,MAAM,UAAU,QAAQ,GAAG,IAAI;AACzD,cAAI,QAAQ,SAAS,EAAG,KAAI,KAAK,EAAE,OAAO,OAAO,OAAO,UAAU,QAAQ,CAAC;AAAA,QAC7E,OAAO;AACL,cAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,MAAM,MAAM;AACzC,gBAAI,KAAK,EAAE,QAAQ,OAAO,OAAO,UAAU,CAAC,EAAE,CAAC;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,KAAK,KAAK,YAAY,gBAAgB;AACpD,eAAW,QAAQ,CAAC,QAAQ,UAAU,OAAO,GAAiB;AAC5D,WAAK,UAAU,IAAI,IAAI,UAAU,OAAO,GAAG,IAAI;AAAA,IACjD;AAEA,UAAM,eAAe,KAAK,KAAK,QAAQ;AACvC,eAAW,QAAQ,CAAC,QAAQ,UAAU,OAAO,GAAiB;AAC5D,YAAM,OAAO,KAAK,KAAK,SAAS,WAAW,IAAI;AAC/C,iBAAW,OAAO,KAAM,KAAI,cAAc;AAC1C,YAAM,aAAa,CAAC,SAAmB;AACrC,cAAM,MAAM,KAAK,KAAK,IAAI,KAAK,OAAO,KAAK,SAAS,CAAC,CAAC;AACtD,YAAI,KAAK,QAAQ;AACf,gBAAM,OAAO,KAAK,eAAe,KAAK,QAAQ,QAAQ,KAAK,OAAO,YAAY;AAC9E,cAAI,YAAY,KAAK,EAAE;AACvB,eAAK,UAAU,KAAK,IAAI;AAAA,QAC1B,WAAW,KAAK,OAAO;AACrB,gBAAM,OAAO,KAAK,gBAAgB,KAAK,KAAK;AAC5C,cAAI,YAAY,IAAI;AACpB,eAAK,WAAW,KAAK,EAAE,OAAO,KAAK,OAAO,IAAI,KAAK,CAAC;AAAA,QACtD;AACA,mBAAW,SAAS,KAAK,SAAU,YAAW,KAAK;AAAA,MACrD;AACA,iBAAW,QAAQ,KAAK,UAAU,IAAI,EAAG,YAAW,IAAI;AAAA,IAC1D;AAEA,SAAK,YAAY;AACjB,SAAK,sBAAsB;AAC3B,SAAK,mBAAmB;AACxB,SAAK,yBAAyB;AAAA,EAChC;AAAA,EAEQ,eAAe,QAAgB,SAAiB,cAAkC;AACxF,UAAM,SAAS,OAAO;AACtB,UAAM,SAAS,GAAG,OAAO,yCAAyC;AAClE,WAAO,QAAQ,QAAQ,OAAO;AAC9B,WAAO,aAAa,QAAQ,cAAc;AAC1C,WAAO,MAAM,SAAS,GAAG,UAAU,YAAY;AAE/C,QAAI,OAAO,OAAO,gBAAgB,SAAU,QAAO,UAAU,IAAI,OAAO,WAAW;AAAA,aAC1E,MAAM,QAAQ,OAAO,WAAW,EAAG,QAAO,UAAU,IAAI,GAAG,OAAO,WAAW;AACtF,QAAI,OAAO,cAAe,QAAO,aAAa,SAAS,OAAO,aAAa;AAE3E,UAAM,cAAc,OAAO,eAAe,OAAO;AACjD,QAAI,gBAAgB,SAAU,QAAO,UAAU,IAAI,0BAA0B;AAAA,aACpE,gBAAgB,QAAS,QAAO,UAAU,IAAI,yBAAyB;AAEhF,QAAI,CAAC,KAAK,KAAK,QAAQ,qBAAqB;AAC1C,aAAO,WAAW;AAClB,aAAO,iBAAiB,aAAa,MAAM,OAAO,MAAM,EAAE,eAAe,KAAK,CAAC,CAAC;AAChF,aAAO,iBAAiB,WAAW,CAAC,MAAqB,KAAK,gBAAgB,GAAG,MAAM,CAAC;AAAA,IAC1F;AAEA,QAAI;AACJ,QAAI,OAAO,eAAe,KAAK,KAAK,QAAQ,iBAAiB,YAAY;AACvE,oBAAc,SAAS,cAAc,OAAO;AAC5C,kBAAY,OAAO;AACnB,kBAAY,YAAY;AACxB,kBAAY,aAAa,cAAc,iBAAiB;AACxD,kBAAY,iBAAiB,SAAS,CAAC,MAAM,EAAE,gBAAgB,CAAC;AAChE,kBAAY,iBAAiB,UAAU,MAAM;AAC3C,YAAI,YAAa,QAAS,MAAK,KAAK,iBAAiB,UAAU,IAAI;AAAA,YAC9D,MAAK,KAAK,iBAAiB,YAAY;AAAA,MAC9C,CAAC;AACD,aAAO,YAAY,WAAW;AAAA,IAChC;AAEA,UAAM,kBAAkB,OAAO;AAC/B,QAAI,iBAAiB;AACnB,UAAI;AACJ,UAAI;AACF,cAAM,gBAAgB,EAAE,QAAQ,QAAQ,KAAK,KAAK,KAAK,OAAO,EAAE,CAAC;AAAA,MACnE,SAAS,KAAK;AACZ,aAAK,KAAK,YAAY,KAAK,mBAAmB,EAAE,OAAO,OAAO,GAAG,CAAC;AAClE,cAAM;AAAA,MACR;AACA,UAAI,OAAO,QAAQ,UAAU;AAC3B,cAAM,UAAU,GAAG,QAAQ,mBAAmB;AAC9C,gBAAQ,cAAc;AACtB,eAAO,YAAY,OAAO;AAAA,MAC5B,WAAW,eAAe,aAAa;AACrC,cAAM,UAAU,GAAG,QAAQ,6CAA6C;AACxE,gBAAQ,YAAY,GAAG;AACvB,eAAO,YAAY,OAAO;AAAA,MAC5B,WAAW,OAAO,OAAO,QAAQ,YAAY,IAAI,cAAc,aAAa;AAC1E,cAAM,UAAU,GAAG,QAAQ,6CAA6C;AACxE,gBAAQ,YAAY,IAAI,EAAE;AAC1B,eAAO,YAAY,OAAO;AAC1B,2BAAmB,QAAQ,IAAI,OAAO;AAAA,MACxC,OAAO;AACL,cAAM,UAAU,GAAG,QAAQ,mBAAmB;AAC9C,gBAAQ,cAAc,OAAO,cAAc,OAAO,SAAS,OAAO;AAClE,eAAO,YAAY,OAAO;AAAA,MAC5B;AAAA,IACF,OAAO;AACL,YAAM,UAAU,GAAG,QAAQ,mBAAmB;AAC9C,cAAQ,cAAc,OAAO,cAAc,OAAO,SAAS,OAAO;AAClE,aAAO,YAAY,OAAO;AAAA,IAC5B;AAEA,UAAM,SAAS,GAAG,QAAQ,qBAAqB;AAC/C,WAAO,YAAY,MAAM;AAEzB,QAAI;AACJ,QAAI;AACJ,QAAI,OAAO,YAAY;AACrB,kBAAY,SAAS,cAAc,QAAQ;AAC3C,gBAAU,OAAO;AACjB,gBAAU,YAAY;AACtB,gBAAU,aAAa,cAAc,UAAU,OAAO,EAAE,EAAE;AAC1D,gBAAU,YAAY;AACtB,gBAAU,iBAAiB,SAAS,CAAC,MAAM;AACzC,UAAE,gBAAgB;AAClB,aAAK,KAAK,YAAY,OAAO,QAAQ,SAAU;AAAA,MACjD,CAAC;AACD,aAAO,YAAY,SAAS;AAC5B,oBAAc,GAAG,QAAQ,iBAAiB;AAC1C,aAAO,YAAY,WAAW;AAAA,IAChC;AAEA,QAAI,KAAK,KAAK,QAAQ,YAAY;AAChC,YAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,cAAQ,OAAO;AACf,cAAQ,YAAY;AACpB,cAAQ,aAAa,cAAc,aAAa;AAChD,cAAQ,cAAc;AACtB,cAAQ,iBAAiB,SAAS,CAAC,MAAM;AACvC,UAAE,gBAAgB;AAClB,aAAK,KAAK,WAAW,OAAO,QAAQ,OAAO;AAAA,MAC7C,CAAC;AACD,aAAO,YAAY,OAAO;AAAA,IAC5B;AAEA,QAAI,OAAO,WAAW;AACpB,YAAM,WAAW,GAAG,OAAO,oBAAoB;AAC/C,eAAS,iBAAiB,eAAe,CAAC,MAAM;AAC9C,YAAI,EAAE,WAAW,EAAG;AACpB,UAAE,eAAe;AACjB,UAAE,gBAAgB;AAClB,aAAK,KAAK,cAAc,YAAY,GAAG,MAAM;AAAA,MAC/C,CAAC;AACD,eAAS,iBAAiB,YAAY,CAAC,MAAM;AAC3C,UAAE,gBAAgB;AAClB,aAAK,KAAK,OAAO,EAAE,eAAe,OAAO,EAAE;AAAA,MAC7C,CAAC;AACD,eAAS,iBAAiB,SAAS,CAAC,MAAM,EAAE,gBAAgB,CAAC;AAC7D,aAAO,YAAY,QAAQ;AAAA,IAC7B;AAEA,WAAO,iBAAiB,SAAS,CAAC,MAAM;AACtC,UAAI,KAAK,KAAK,kBAAkB,QAAQ,EAAG;AAC3C,YAAM,SAAS,EAAE;AACjB,UAAI,OAAO,QAAQ,yDAAyD,EAAG;AAC/E,UAAI,OAAO,SAAU,MAAK,KAAK,UAAU,QAAQ,EAAE,QAAQ;AAAA,IAC7D,CAAC;AAED,WAAO,iBAAiB,eAAe,CAAC,MAAM;AAC5C,UAAI,EAAE,WAAW,EAAG;AACpB,YAAM,SAAS,EAAE;AACjB,UAAI,OAAO,QAAQ,yDAAyD,EAAG;AAC/E,WAAK,KAAK,kBAAkB,cAAc,GAAG,MAAM;AAAA,IACrD,CAAC;AAED,WAAO,EAAE,QAAQ,IAAI,QAAQ,QAAQ,WAAW,aAAa,YAAY;AAAA,EAC3E;AAAA,EAEQ,gBAAgB,OAAsC;AAC5D,UAAM,SAAS,GAAG,OAAO,0CAA0C;AACnE,QAAI,MAAM,QAAS,QAAO,QAAQ,UAAU,MAAM;AAClD,WAAO,aAAa,QAAQ,cAAc;AAC1C,UAAM,MAAM,MAAM;AAClB,QAAI,OAAO,IAAI,gBAAgB,SAAU,QAAO,UAAU,IAAI,IAAI,WAAW;AAAA,aACpE,MAAM,QAAQ,IAAI,WAAW,EAAG,QAAO,UAAU,IAAI,GAAG,IAAI,WAAW;AAChF,UAAM,UAAU,GAAG,QAAQ,4CAA4C;AACvE,YAAQ,cAAc,MAAM;AAC5B,WAAO,YAAY,OAAO;AAC1B,WAAO;AAAA,EACT;AAAA,EAEA,cAAoB;AAClB,QAAI,YAAY;AAChB,UAAM,SAAmC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,EAAE;AAExE,eAAW,QAAQ,CAAC,QAAQ,UAAU,OAAO,GAAiB;AAC5D,YAAM,OAAO,KAAK,KAAK,SAAS,WAAW,IAAI;AAC/C,UAAI,IAAI;AACR,YAAM,YAAY,oBAAI,IAAoB;AAC1C,iBAAW,QAAQ,KAAK,WAAW;AACjC,YAAI,KAAK,KAAK,YAAY,OAAO,KAAK,MAAM,MAAM,KAAM;AACxD,kBAAU,IAAI,KAAK,OAAO,IAAI,CAAC;AAC/B,aAAK,KAAK,OAAO;AAAA,MACnB;AACA,YAAM,eAAe,KAAK,KAAK,QAAQ;AACvC,iBAAW,QAAQ,KAAK,WAAW;AACjC,YAAI,KAAK,KAAK,YAAY,OAAO,KAAK,MAAM,MAAM,KAAM;AACxD,cAAM,OAAO,UAAU,IAAI,KAAK,OAAO,EAAE,KAAK;AAC9C,aAAK,GAAG,MAAM,QAAQ,GAAG,KAAK,OAAO,YAAY;AACjD,aAAK,GAAG,MAAM,OAAO,GAAG,IAAI;AAC5B,aAAK,GAAG,aAAa,iBAAiB,OAAO,WAAW,CAAC;AAAA,MAC3D;AAEA,iBAAW,MAAM,KAAK,YAAY;AAChC,cAAM,SAAS,KAAK,kBAAkB,GAAG,OAAO,IAAI;AACpD,YAAI,OAAO,WAAW,EAAG;AACzB,cAAM,OAAO,UAAU,IAAI,OAAO,CAAC,EAAE,EAAE,KAAK;AAC5C,YAAI,QAAQ;AACZ,mBAAW,QAAQ,OAAQ,UAAS,KAAK;AACzC,WAAG,GAAG,MAAM,OAAO,GAAG,IAAI;AAC1B,WAAG,GAAG,MAAM,QAAQ,GAAG,KAAK;AAC5B,WAAG,GAAG,MAAM,SAAS,GAAG,YAAY;AACpC,WAAG,GAAG,aAAa,gBAAgB,OAAO,OAAO,MAAM,CAAC;AAAA,MAC1D;AAEA,iBAAW,OAAO,KAAM,KAAI,MAAM,QAAQ,GAAG,CAAC;AAC9C,aAAO,IAAI,IAAI;AAAA,IACjB;AACA,SAAK,KAAK,SAAS,cAAc,OAAO,MAAM,OAAO,KAAK;AAAA,EAC5D;AAAA,EAEQ,kBAAkB,OAAyB,MAA0B;AAC3E,WAAO,MACJ,eAAe,EACf,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,KAAK,KAAK,YAAY,OAAO,CAAC,MAAM,IAAI;AAAA,EACtE;AAAA,EAEQ,gBAAgB,GAAkB,QAAsB;AAC9D,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,UAAM,SAAS,CAAC,UAAwB;AACtC,YAAM,OAAO,KAAK;AAAA,QAChB,OAAO,OAAO,YAAY;AAAA,QAC1B,OAAO,eAAe;AAAA,MACxB;AACA,WAAK,KAAK,YAAY,eAAe,QAAQ,IAAI;AACjD,WAAK,KAAK,gBAAgB;AAC1B,WAAK,KAAK,KAAK,iBAAiB,EAAE,OAAO,OAAO,IAAI,OAAO,OAAO,cAAc,UAAU,KAAK,CAAC;AAChG,QAAE,eAAe;AAAA,IACnB;AAEA,YAAQ,MAAM;AAAA,MACZ,MAAK,EAAE,QAAQ,WAAW,EAAE,QAAQ;AAClC,YAAK,EAAE,OAAuB,QAAQ,yDAAyD,EAAG;AAClG,UAAE,eAAe;AACjB,YAAI,OAAO,SAAU,MAAK,KAAK,UAAU,QAAQ,EAAE,QAAQ;AAC3D;AAAA,MACF,MAAK,EAAE,WAAW,EAAE,QAAQ,gBAAgB,EAAE,QAAQ;AACpD,YAAI,CAAC,OAAO,UAAW;AACvB,eAAO,EAAE,QAAQ,eAAe,KAAK,GAAG;AACxC;AAAA,MACF,MAAK,EAAE,YAAY,EAAE,QAAQ,eAAe,EAAE,QAAQ;AACpD,YAAI,CAAC,OAAO,QAAS;AACrB,UAAE,eAAe;AAAG;AAClB,gBAAM,OAAO,KAAK,KAAK,YAAY,OAAO,MAAM;AAChD,gBAAM,WAAW,KAAK,KAAK,YAAY,eAAe,IAAI;AAC1D,gBAAM,OAAO,SAAS,QAAQ,MAAM;AACpC,gBAAM,KAAK,EAAE,QAAQ,eAAe,KAAK,IAAI,SAAS,SAAS,GAAG,OAAO,CAAC,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC;AAClG,cAAI,OAAO,KAAM,MAAK,KAAK,WAAW,OAAO,IAAI,EAAE;AAAA,QACrD;AACA;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,wBAA8B;AAC5B,UAAM,QAAQ,KAAK,KAAK,YAAY,aAAa;AACjD,UAAM,QAAQ,MAAM,SAAS;AAC7B,eAAW,MAAM,KAAK,WAAW;AAC/B,YAAM,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,EAAE;AAC3D,UAAI,OAAO,GAAG;AACZ,cAAM,MAAM,MAAM,GAAG,EAAE;AACvB,cAAM,QAAQ,QAAQ,iCAAiC,MAAM,CAAC,YAAY;AAC1E,WAAG,OAAO,aAAa,QAAQ,QAAQ,gBAAgB,kBAAkB;AACzE,WAAG,GAAG,aAAa,aAAa,QAAQ,QAAQ,cAAc,YAAY;AAC1E,WAAG,GAAG,UAAU,IAAI,0BAA0B;AAAA,MAChD,OAAO;AACL,WAAG,OAAO,YAAY;AACtB,WAAG,GAAG,gBAAgB,WAAW;AACjC,WAAG,GAAG,UAAU,OAAO,0BAA0B;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,qBAA2B;AACzB,UAAM,KAAK,KAAK,KAAK,SAAS,eAAe;AAC7C,eAAW,MAAM,KAAK,WAAW;AAC/B,UAAI,CAAC,GAAG,UAAW;AACnB,YAAM,SAAS,GAAG,GAAG,OAAO,EAAE;AAC9B,YAAM,SAAS,UAAU;AACzB,SAAG,UAAU,UAAU,OAAO,2BAA2B,MAAM;AAC/D,UAAI,GAAG,aAAa;AAClB,cAAM,UAAU,SAAS,eAAe,MAAM,IAAI;AAClD,WAAG,YAAY,MAAM,UAAU,UAAU,KAAK;AAC9C,YAAI,QAAS,IAAG,YAAY,cAAc;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,2BAAiC;AAC/B,eAAW,MAAM,KAAK,WAAW;AAC/B,UAAI,CAAC,GAAG,YAAa;AACrB,SAAG,YAAY,UAAU,KAAK,KAAK,iBAAiB,kBAAkB;AACtE,SAAG,YAAY,gBAAgB,KAAK,KAAK,iBAAiB,yBAAyB;AAAA,IACrF;AAAA,EACF;AAAA,EAEA,UAAgB;AACd,eAAW,QAAQ,KAAK,WAAW;AACjC,YAAM,UAAU,oBAAoB,KAAK,EAAE;AAC3C,UAAI,CAAC,QAAS;AACd,UAAI;AACF,gBAAQ;AAAA,MACV,SAAS,OAAO;AACd,gBAAQ,MAAM,8CAA8C,KAAK;AAAA,MACnE;AAAA,IACF;AACA,SAAK,YAAY,CAAC;AAClB,SAAK,aAAa,CAAC;AAAA,EACrB;AACF;;;AC5YO,IAAM,sBAAN,MAA0B;AAAA,EAA1B;AACL,SAAQ,SAA2B;AACnC,SAAQ,MAAwB;AAChC,SAAQ,QAAwC;AAChD,SAAQ,gBAAgB;AACxB,SAAQ,gBAAgB;AAAA;AAAA,EAExB,YAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,SAA2B;AACzB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAqB;AACnB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,MAAM,OAAkB,QAAuB;AAC7C,QAAI,CAAC,UAAU,CAAC,KAAK,OAAQ,MAAK,SAAS,EAAE,GAAG,MAAM;AACtD,SAAK,MAAM,EAAE,GAAG,MAAM;AACtB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,aAAa,OAA2B;AACtC,QAAI,KAAK,OAAQ,QAAO;AACxB,QAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,SAAK,SAAS,EAAE,GAAG,MAAM;AACzB,SAAK,WAAW;AAChB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,OAAwB;AAC7B,SAAK,MAAM,EAAE,GAAG,MAAM;AACtB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,QAAc;AACZ,SAAK,SAAS;AACd,SAAK,MAAM;AACX,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,aAAmB;AACjB,SAAK,QAAQ;AACb,SAAK,gBAAgB;AACrB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,UAAU,UAAkB,UAA0C;AACpE,QACE,KAAK,UAAU,SACf,KAAK,kBAAkB,YACvB,KAAK,kBAAkB,SACvB,QAAO,KAAK;AACd,SAAK,gBAAgB;AACrB,SAAK,gBAAgB;AACrB,QAAI,CAAC,KAAK,UAAU,CAAC,KAAK,OAAO,YAAY,KAAK,YAAY,GAAG;AAC/D,WAAK,QAAQ;AACb,aAAO;AAAA,IACT;AACA,SAAK,QAAQ;AAAA,MACX,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,OAAO,KAAK,KAAK,IAAI,KAAK,WAAW,CAAC,CAAC;AAAA,MACrE,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,OAAO,KAAK,KAAK,IAAI,GAAG,GAAG,WAAW,CAAC,CAAC;AAAA,MAC/E,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,IAAI,QAAQ,WAAW,CAAC,CAAC;AAAA,MAC3E,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,IAAI,MAAM,GAAG,WAAW,CAAC,CAAC;AAAA,IACvF;AACA,WAAO,KAAK;AAAA,EACd;AACF;;;ACpEO,IAAM,oBAAN,MAAwB;AAAA,EAG7B,YACU,MACA,cACR;AAFQ;AACA;AAJV,SAAQ,QAA6B;AAuBrC,SAAQ,SAAS,CAAC,UAA8B;AAC9C,YAAM,OAAO,KAAK;AAClB,UAAI,CAAC,KAAM;AACX,UAAI,CAAC,KAAK,QAAQ;AAChB,YAAI,KAAK,IAAI,MAAM,UAAU,KAAK,MAAM,IAAI,EAAG;AAC/C,aAAK,SAAS;AACd,aAAK,KAAK,SAAS,KAAK,UAAU,IAAI,yBAAyB;AAAA,MACjE;AAEA,YAAM,YAAY,KAAK,KAAK,SAAS,cAAc;AACnD,YAAM,IAAI,MAAM,UAAU,UAAU,sBAAsB,EAAE;AAC5D,YAAM,WAAW,KAAK,KAAK,SAAS,qBAAqB;AACzD,YAAM,YAAY,KAAK,aAAa;AACpC,UAAI,cAAc;AAClB,UAAI,aAAa,UAAU,QAAQ,KAAK;AACxC,eAAS,QAAQ,GAAG,QAAQ,UAAU,SAAS;AAC7C,cAAM,OAAO,KAAK,KAAK,SAAS,gBAAgB,KAAK;AACrD,YAAI,CAAC,QAAQ,KAAK,YAAY,KAAK,QAAS;AAC5C,cAAM,MAAM,UAAU,KAAK;AAC3B,cAAM,SAAS,UAAU,QAAQ,CAAC;AAClC,YAAI,IAAI,OAAO,SAAS,OAAO,GAAG;AAChC,wBAAc;AACd,uBAAa;AACb;AAAA,QACF;AAAA,MACF;AACA,WAAK,cAAc;AACnB,WAAK,UAAU,MAAM,MAAM,GAAG,UAAU;AAAA,IAC1C;AAEA,SAAQ,OAAO,MAAY;AACzB,YAAM,OAAO,KAAK,UAAU;AAC5B,UAAI,CAAC,QAAQ,CAAC,KAAK,UAAU,KAAK,cAAc,EAAG;AACnD,YAAM,OAAO,KAAK,KAAK;AACvB,YAAM,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,aAAa,KAAK,KAAK,SAAS,qBAAqB,CAAC,CAAC;AAC5F,UAAI,SAAS,MAAM,SAAS,KAAK,EAAG;AACpC,WAAK,KAAK,KAAK,cAAc,EAAE,SAAS,KAAK,MAAM,WAAW,MAAM,SAAS,GAAG,CAAC;AACjF,UAAI,KAAK,KAAK,QAAQ,gBAAgB,CAAC,KAAK,KAAK,SAAS,QAAQ;AAChE,aAAK,KAAK,SAAS,uBAAuB,MAAM,KAAK,OAAO,KAAK,IAAI,EAAE;AAAA,MACzE;AAAA,IACF;AAAA,EA1DG;AAAA,EAEH,MAAM,OAAqB,MAA0B;AACnD,SAAK,QAAQ;AACb,UAAM,YAAY,GAAG,OAAO,yBAAyB;AACrD,SAAK,KAAK,SAAS,cAAc,OAAO,YAAY,SAAS;AAC7D,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,QAAQ,MAAM;AAAA,MACd;AAAA,MACA,aAAa;AAAA,MACb,QAAQ;AAAA,IACV;AACA,WAAO,iBAAiB,eAAe,KAAK,MAAM;AAClD,WAAO,iBAAiB,aAAa,KAAK,IAAI;AAC9C,WAAO,iBAAiB,iBAAiB,KAAK,IAAI;AAAA,EACpD;AAAA,EA4CQ,YAAiC;AACvC,UAAM,OAAO,KAAK;AAClB,SAAK,QAAQ;AACb,SAAK,gBAAgB;AACrB,UAAM,UAAU,OAAO;AACvB,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAwB;AAC9B,WAAO,oBAAoB,eAAe,KAAK,MAAM;AACrD,WAAO,oBAAoB,aAAa,KAAK,IAAI;AACjD,WAAO,oBAAoB,iBAAiB,KAAK,IAAI;AACrD,SAAK,KAAK,SAAS,KAAK,UAAU,OAAO,yBAAyB;AAAA,EACpE;AAAA,EAEA,UAAgB;AACd,SAAK,UAAU;AAAA,EACjB;AACF;;;ACrFA,IAAM,QAAoB,CAAC,QAAQ,UAAU,OAAO;AAwCpD,SAAS,WAAW,WAAyB,GAAW,OAAuB;AAC7E,MAAI,KAAK;AACT,MAAI,KAAK;AACT,SAAO,KAAK,IAAI;AACd,UAAM,MAAO,KAAK,MAAO;AACzB,QAAI,UAAU,MAAM,CAAC,KAAK,EAAG,MAAK,MAAM;AAAA,QACnC,MAAK;AAAA,EACZ;AACA,SAAO;AACT;AAEO,IAAM,eAAN,MAAmB;AAAA,EAexB,YAAoB,MAAmB;AAAnB;AAdpB,SAAQ,OAAkB,CAAC;AAC3B,SAAQ,WAAW;AACnB,SAAQ,QAAQ;AAChB,SAAQ,WAAW;AACnB,SAAQ,QAAQ;AAChB,SAAQ,aAAa;AACrB,SAAQ,YAAY,IAAI,aAAa,CAAC;AACtC,SAAQ,iBAAiB,IAAI,oBAAoB;AACjD,SAAQ,gBAAgB;AACxB,SAAQ,WAAW;AACnB,SAAQ,cAAc,OAAO;AAC7B,uBAAkC;AAkDlC,SAAQ,WAAW,MAAY;AAC7B,UAAI,KAAK,MAAO;AAChB,WAAK,QAAQ,sBAAsB,MAAM;AACvC,aAAK,QAAQ;AACb,aAAK,WAAW;AAAA,MAClB,CAAC;AAAA,IACH;AAuBA,SAAQ,eAAe,IAAI,aAAa,IAAI,YAAY,KAAK,CAAC,CAAC;AAC/D,SAAQ,mBAAmB;AAC3B,SAAQ,iBAAiB,oBAAI,QAA8B;AAC3D,SAAQ,eAAwC,CAAC;AACjD,SAAQ,gBAA0C;AAo4BlD,SAAQ,eAAmC;AAC3C,SAAQ,WASG;AACX,SAAQ,kBAAkB;AA6F1B,SAAQ,oBAAwC;AAahD,SAAQ,aAAa,CAAC,MAAmB;AACvC,YAAM,OAAO,KAAK;AAClB,UAAI,CAAC,KAAM;AACX,YAAM,KAAK;AACX,UAAI,OAAO,GAAG,YAAY,SAAU;AAEpC,UAAI,CAAC,KAAK,QAAQ;AAChB,cAAM,KAAK,KAAK,IAAI,GAAG,UAAU,KAAK,MAAM;AAC5C,cAAM,KAAK,KAAK,IAAI,GAAG,UAAU,KAAK,MAAM;AAC5C,YAAI,KAAK,KAAK,KAAK,EAAG;AACtB,aAAK,SAAS;AACd,aAAK,OAAO,MAAM,KAAK,MAAM;AAC7B,aAAK,KAAK,SAAS,KAAK,UAAU,IAAI,oBAAoB;AAAA,MAC5D;AAEA,UAAI,KAAK,SAAS,KAAK;AACrB,cAAM,SAAS,KAAK,cAAc,EAAE;AACpC,cAAMC,OAAM,KAAK,eAAe,OAAO;AACvC,YAAIA,QAAOA,KAAI,QAAQ,QAAQ;AAC7B,gBAAM,MAAM,KAAK,gBAAgB;AACjC,eAAK,eAAe,OAAO,EAAE,KAAK,QAAQ,QAAQA,KAAI,OAAO,CAAC;AAC9D,eAAK,gBAAgB,KAAK,KAAK,gBAAgB,CAAC;AAChD,eAAK,KAAK,KAAK,yBAAyB,EAAE,OAAO,KAAK,kBAAkB,EAAE,CAAC;AAAA,QAC7E;AACA;AAAA,MACF;AAEA,YAAM,YAAY,KAAK,IAAI,KAAK,KAAK,GAAG,KAAK,cAAc,EAAE,CAAC;AAC9D,YAAM,MAAM,KAAK,eAAe,OAAO;AACvC,UAAI,OAAO,IAAI,WAAW,WAAW;AACnC,cAAM,MAAM,KAAK,gBAAgB;AACjC,aAAK,eAAe,OAAO,EAAE,KAAK,IAAI,KAAK,QAAQ,UAAU,CAAC;AAC9D,aAAK,gBAAgB,KAAK,KAAK,gBAAgB,CAAC;AAChD,aAAK,iBAAiB;AACtB,aAAK,KAAK,KAAK,yBAAyB,EAAE,OAAO,KAAK,kBAAkB,EAAE,CAAC;AAAA,MAC7E;AAAA,IACF;AA0DA,SAAQ,WAAW,CAAC,MAAmB;AACrC,YAAM,OAAO,KAAK;AAClB,UAAI,CAAC,KAAM;AACX,YAAM,KAAK;AAEX,YAAM,SAAS,MAAY;AACzB,aAAK,eAAe;AAAA,MACtB;AAEA,UAAI,CAAC,KAAK,QAAQ;AAChB,eAAO;AACP;AAAA,MACF;AAEA,UAAI,KAAK,SAAS,KAAK;AACrB,cAAM,YACJ,OAAO,GAAG,YAAY,WAAW,KAAK,IAAI,KAAK,KAAK,GAAG,KAAK,cAAc,EAAE,CAAC,IAAI,KAAK,KAAK;AAC7F,eAAO;AACP,YAAI,YAAY,KAAK,IAAI;AACvB,eAAK,eAAe,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,SAAS;AACjE,eAAK,iBAAiB;AAAA,QACxB,OAAO;AACL,gBAAM,MAAM,KAAK,eAAe,OAAO;AACvC,cAAI,CAAC,OAAO,IAAI,WAAW,KAAK,GAAI;AACpC,gBAAM,MAAM,KAAK,gBAAgB;AACjC,eAAK,eAAe,OAAO,EAAE,KAAK,IAAI,KAAK,QAAQ,KAAK,GAAG,CAAC;AAC5D,eAAK,gBAAgB,KAAK,KAAK,gBAAgB,CAAC;AAAA,QAClD;AACA;AAAA,MACF;AAEA,YAAM,YAAY,OAAO,GAAG,YAAY,WAAW,KAAK,cAAc,EAAE,IAAI,KAAK;AACjF,aAAO;AACP,UAAI,YAAY,KAAK,IAAI;AACvB,aAAK,WAAW,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,SAAS;AAC7D,aAAK,iBAAiB;AAAA,MACxB,OAAO;AACL,cAAM,MAAM,KAAK,eAAe,OAAO;AACvC,YAAI,CAAC,OAAO,IAAI,QAAQ,KAAK,GAAI;AACjC,cAAM,MAAM,KAAK,gBAAgB;AACjC,aAAK,eAAe,OAAO,EAAE,KAAK,KAAK,IAAI,QAAQ,IAAI,OAAO,CAAC;AAC/D,aAAK,gBAAgB,KAAK,KAAK,gBAAgB,CAAC;AAAA,MAClD;AAAA,IACF;AAiLA,SAAQ,cAAc,CAAC,MAAwB;AAC7C,UAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,YAAM,WAAW,KAAK,mBAAmB,CAAC;AAC1C,UAAI,CAAC,SAAU;AACf,YAAM,EAAE,MAAM,OAAO,OAAO,IAAI;AAEhC,UAAI,KAAK,SAAS;AAChB,aAAK,cAAc;AACnB,cAAM,WAAY,EAAE,OAAuB,UAAU,oBAAoB;AACzE,YAAI,UAAU;AACZ,eAAK,KAAK,iBAAiB,iBAAiB,MAAM,CAAC,KAAK,KAAK,iBAAiB,uBAAuB,IAAI,EAAE,GAAG;AAC9G;AAAA,QACF;AACA,cAAM,WAAW,KAAK,KAAK,YAAY,oBAAoB;AAC3D,YAAI,CAAC,YAAY,CAAC,UAAU,OAAO,QAAQ,UAAU,SAAS,IAAI;AAChE,eAAK,KAAK,SAAS,YAAY,KAAK,EAAE;AAAA,QACxC;AACA;AAAA,MACF;AAEA,YAAM,SAAS,EAAE;AAEjB,UAAI,KAAK,KAAK,SAAS,QAAQ;AAC7B,cAAM,UAAU,KAAK,cAAc;AACnC,YAAI,WAAW,QAAQ,QAAQ,UAAU,QAAQ,MAAM,OAAO,QAAQ,qBAAqB,GAAG;AAC5F,cAAI,KAAK,KAAK,SAAS,YAAY,KAAK,EAAE,GAAG;AAC3C,iBAAK,cAAc;AACnB,iBAAK,KAAK,SAAS,aAAa,KAAK,EAAE;AACvC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,QAAQ,QAAQ,QAAQ,SAAS;AACvC,YAAM,SAAS,QAAQ,KAAK,KAAK,YAAY,UAAU,KAAK,IAAI;AAEhE,UAAI,QAAQ,kBAAkB,CAAC,KAAK,UAAU;AAC5C,aAAK,cAAc;AACnB,aAAK,KAAK,aAAa,KAAK,EAAE;AAC9B;AAAA,MACF;AAEA,UAAI,KAAK,SAAU;AAEnB,UAAI,OAAO,UAAU,oBAAoB,GAAG;AAC1C,aAAK,cAAc;AACnB,YAAI,CAAC,KAAK,KAAK,QAAQ,kBAAmB,MAAK,eAAe,OAAO,KAAK,mBAAmB,CAAC;AAC9F,aAAK,KAAK,iBAAiB,WAAW,MAAM,GAAG,IAAI;AACnD;AAAA,MACF;AAEA,UAAI,CAAC,UAAU,CAAC,OAAQ;AAExB,WAAK,cAAc;AACnB,UAAI,CAAC,KAAK,KAAK,QAAQ,kBAAmB,MAAK,eAAe,OAAO,KAAK;AAC1E,WAAK,KAAK,iBAAiB,WAAW,MAAM,GAAG,KAAK;AAEpD,YAAM,QAAQ,KAAK,KAAK,aAAa,MAAM,MAAM;AACjD,YAAM,QAAQ,KAAK,KAAK,KAAK,eAAe;AAAA,QAC1C,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,QACV;AAAA,QACA,QAAQ,OAAO;AAAA,QACf;AAAA,MACF,CAAC;AACD,aAAO,OAAO,cAAc,KAAK;AACjC,WAAK,KAAK,KAAK,cAAc,EAAE,OAAO,GAAG,SAAS,MAAM,UAAU,MAAM,CAAC;AAEzE,YAAM,cAAc,KAAK,KAAK,QAAQ,mBAAmB,OAAO,OAAO,oBAAoB;AAC3F,UAAI,eAAe,CAAC,KAAK,WAAW,KAAK,KAAK,eAAe,WAAW,MAAM,MAAM,GAAG;AACrF,aAAK,KAAK,eAAe,MAAM,OAAO,MAAM;AAAA,MAC9C;AAAA,IACF;AASA,SAAQ,iBAAiB,CAAC,MAAwB;AAChD,UAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,YAAM,WAAW,KAAK,mBAAmB,CAAC;AAC1C,UAAI,CAAC,SAAU;AACf,YAAM,EAAE,MAAM,OAAO,OAAO,IAAI;AAChC,UAAI,KAAK,YAAY,KAAK,WAAW,CAAC,OAAQ;AAC9C,YAAM,QAAQ,OAAO,QAAQ,SAAS;AACtC,YAAM,SAAS,KAAK,KAAK,YAAY,UAAU,KAAK;AACpD,UAAI,CAAC,OAAQ;AAEb,YAAM,QAAQ,KAAK,KAAK,aAAa,MAAM,MAAM;AACjD,YAAM,QAAQ,KAAK,KAAK,KAAK,qBAAqB;AAAA,QAChD,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,QACV;AAAA,QACA,QAAQ,OAAO;AAAA,QACf;AAAA,MACF,CAAC;AACD,aAAO,OAAO,oBAAoB,KAAK;AACvC,WAAK,KAAK,KAAK,oBAAoB,EAAE,OAAO,GAAG,SAAS,MAAM,UAAU,MAAM,CAAC;AAE/E,UAAI,KAAK,KAAK,eAAe,WAAW,MAAM,MAAM,GAAG;AACrD,aAAK,KAAK,eAAe,MAAM,OAAO,MAAM;AAAA,MAC9C;AAAA,IACF;AAEA,SAAQ,gBAAgB,CAAC,MAAwB;AAC/C,UAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,YAAM,WAAW,KAAK,mBAAmB,CAAC;AAC1C,UAAI,CAAC,YAAY,SAAS,KAAK,YAAY,SAAS,KAAK,WAAW,CAAC,SAAS,OAAQ;AACtF,YAAM,EAAE,MAAM,OAAO,OAAO,IAAI;AAChC,YAAM,QAAQ,OAAO,QAAQ,SAAS;AACtC,YAAM,SAAS,KAAK,KAAK,YAAY,UAAU,KAAK;AACpD,UAAI,CAAC,OAAQ;AACb,WAAK,KAAK,KAAK,mBAAmB;AAAA,QAChC,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,QACV;AAAA,QACA,QAAQ,OAAO;AAAA,QACf,OAAO,KAAK,KAAK,aAAa,MAAM,MAAM;AAAA,MAC5C,CAAC;AACD,UAAI,KAAK,KAAK,QAAQ,aAAa;AACjC,UAAE,eAAe;AACjB,YAAI,KAAK,KAAK,QAAQ,wBAAwB,CAAC,KAAK,gBAAgB,GAAG;AACrE,gBAAM,SAAS,KAAK,KAAK,YAAY,aAAa,KAAK;AACvD,cAAI,UAAU,EAAG,MAAK,WAAW,OAAO,QAAQ,KAAK;AAAA,QACvD;AACA,aAAK,KAAK,mBAAmB,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,OAAO,MAAM,CAAC;AAAA,MACpF;AAAA,IACF;AAEA,SAAQ,cAAc,CAAC,MAAwB;AAC7C,UAAI,KAAK,KAAK,eAAe,UAAU,GAAG;AACxC,aAAK,KAAK,eAAe,KAAK,KAAK;AAAA,MACrC;AACA,UAAI,KAAK,KAAK,QAAQ,wBAAwB,EAAE,WAAW,GAAG;AAC5D,cAAM,WAAW,KAAK,mBAAmB,CAAC;AAC1C,YACE,YACA,CAAC,SAAS,KAAK,YACf,CAAC,SAAS,KAAK,WACf,SAAS,UACT,CAAE,EAAE,OAAuB,UAAU,oBAAoB,GACzD;AACA,gBAAM,SAAS,KAAK,KAAK,YAAY,aAAa,SAAS,OAAO,QAAQ,SAAS,EAAE;AACrF,cAAI,UAAU,GAAG;AACf,iBAAK,WAAW,SAAS,OAAO,QAAQ,EAAE,QAAQ;AAClD,iBAAK,gBAAgB;AACrB,gBAAI,CAAC,EAAE,YAAY,CAAC,KAAK,KAAK,QAAQ,mBAAmB;AACvD,mBAAK,eAAe,SAAS,OAAO,SAAS,OAAO,QAAQ,SAAS,EAAE;AAAA,YACzE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,SAAQ,kBAAkB,MAAY;AACpC,WAAK,gBAAgB;AAAA,IACvB;AAEA,SAAQ,cAAc,CAAC,MAAwB;AAC7C,UAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,YAAM,WAAW,KAAK,mBAAmB,CAAC;AAC1C,UAAI,KAAK,eAAe;AACtB,YAAI,YAAY,CAAC,SAAS,KAAK,YAAY,CAAC,SAAS,KAAK,WAAW,SAAS,QAAQ;AACpF,gBAAM,SAAS,KAAK,KAAK,YAAY,aAAa,SAAS,OAAO,QAAQ,SAAS,EAAE;AACrF,gBAAM,MAAM,KAAK,eAAe,OAAO;AACvC,cAAI,UAAU,KAAK,QAAQ,IAAI,QAAQ,SAAS,SAAS,IAAI,WAAW,SAAS;AAC/E,iBAAK,WAAW,SAAS,OAAO,QAAQ,IAAI;AAAA,UAC9C;AAAA,QACF;AAAA,MACF;AACA,UAAI,KAAK,KAAK,QAAQ,0BAA2B;AACjD,UAAI,CAAC,YAAY,SAAS,KAAK,SAAU;AACzC,WAAK,cAAc,SAAS,KAAK;AAAA,IACnC;AAEA,SAAQ,eAAe,MAAY;AACjC,WAAK,cAAc,EAAE;AAAA,IACvB;AAEA,SAAQ,0BAA0B,CAAC,MAA0B;AAC3D,UAAI,KAAK,KAAK,YAAY,KAAK,EAAE,WAAW,EAAG;AAC/C,YAAM,SAAS,EAAE;AACjB,UAAI,CAAC,OAAO,QAAQ,uBAAuB,EAAG;AAC9C,YAAM,WAAW,KAAK,mBAAmB,CAA0B;AACnE,UAAI,CAAC,YAAY,SAAS,KAAK,YAAY,SAAS,KAAK,QAAS;AAElE,WAAK,kBAAkB,MAAM,GAAG,SAAS,IAAI;AAC7C,QAAE,eAAe;AAAA,IACnB;AApkDE,SAAK,oBAAoB,IAAI,kBAAkB,MAAM,MAAM,KAAK,SAAS;AAAA,EAC3E;AAAA,EAEA,OAAa;AACX,UAAM,WAAW,KAAK,KAAK,SAAS,cAAc;AAClD,aAAS,iBAAiB,UAAU,KAAK,UAAU,EAAE,SAAS,KAAK,CAAC;AACpE,UAAM,OAAO,KAAK,KAAK,SAAS;AAChC,SAAK,iBAAiB,SAAS,KAAK,WAAW;AAC/C,SAAK,iBAAiB,YAAY,KAAK,cAAc;AACrD,SAAK,iBAAiB,eAAe,KAAK,aAAa;AACvD,SAAK,iBAAiB,aAAa,KAAK,WAAW;AACnD,SAAK,iBAAiB,aAAa,KAAK,WAAW;AACnD,SAAK,iBAAiB,cAAc,KAAK,YAAY;AACrD,SAAK,iBAAiB,eAAe,KAAK,uBAAuB;AACjE,WAAO,iBAAiB,WAAW,KAAK,eAAe;AAAA,EACzD;AAAA,EAEA,UAAgB;AACd,yBAAqB,KAAK,KAAK;AAC/B,UAAM,WAAW,KAAK,KAAK,SAAS,cAAc;AAClD,aAAS,oBAAoB,UAAU,KAAK,QAAQ;AACpD,UAAM,OAAO,KAAK,KAAK,SAAS;AAChC,SAAK,oBAAoB,SAAS,KAAK,WAAW;AAClD,SAAK,oBAAoB,YAAY,KAAK,cAAc;AACxD,SAAK,oBAAoB,eAAe,KAAK,aAAa;AAC1D,SAAK,oBAAoB,aAAa,KAAK,WAAW;AACtD,SAAK,oBAAoB,aAAa,KAAK,WAAW;AACtD,SAAK,oBAAoB,cAAc,KAAK,YAAY;AACxD,SAAK,oBAAoB,eAAe,KAAK,uBAAuB;AACpE,WAAO,oBAAoB,WAAW,KAAK,eAAe;AAC1D,SAAK,eAAe;AACpB,SAAK,kBAAkB,QAAQ;AAC/B,eAAW,QAAQ,KAAK,MAAM;AAC5B,UAAI,KAAK,UAAW,MAAK,cAAc,KAAK,SAAS;AACrD,iBAAW,QAAQ,OAAO;AACxB,mBAAW,QAAQ,KAAK,MAAM,IAAI,KAAK,CAAC,EAAG,oBAAmB,KAAK,MAAM,IAAI;AAAA,MAC/E;AAAA,IACF;AACA,SAAK,cAAc,OAAO;AAC1B,SAAK,mBAAmB,OAAO;AAAA,EACjC;AAAA,EAEA,cAAc,QAA0B;AACtC,WAAO,OAAO,WAAW,SAAS,SAAS,OAAO,WAAW,UAAU,UAAU;AAAA,EACnF;AAAA,EAUA,aAAmB;AACjB,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,UAAM,KAAK,KAAK,KAAK;AACrB,UAAM,WAAW,GAAG,cAAc;AAClC,OAAG,oBAAoB,OAAO,MAAM,YAAY,cAAc,CAAC,SAAS,UAAU;AAClF,OAAG,cAAc,KAAK,MAAM,YAAY,cAAc,CAAC,SAAS,SAAS;AACzE,OAAG,cAAc,MAAM,MAAM,YAAY,cAAc,CAAC,SAAS,SAAS;AAC1E,SAAK,KAAK,mBAAmB,aAAa,SAAS,UAAU;AAC7D,SAAK,KAAK,eAAe,KAAK;AAC9B,SAAK,YAAY;AACjB,SAAK,KAAK,SAAS,oBAAoB,KAAK,WAAW,CAAC;AAAA,EAC1D;AAAA,EAEQ,aAAuC;AAC7C,UAAM,SAAmC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,EAAE;AACxE,eAAW,QAAQ,OAAO;AACxB,aAAO,IAAI,IAAI,KAAK,KAAK,YAAY,eAAe,IAAI,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,cAAc,CAAC;AAAA,IAClG;AACA,WAAO;AAAA,EACT;AAAA,EAQA,sBAA4B;AAC1B,UAAM,KAAK,KAAK,KAAK;AACrB,UAAM,SAAS,KAAK,WAAW;AAC/B,UAAM,WAAW,GAAG,cAAc;AAClC,UAAM,YAAY,KAAK,KAAK,SAAS,iBAAiB;AACtD,UAAM,WAAW,KAAK,KAAK,SAAS,qBAAqB;AACzD,UAAM,kBAAkB,KAAK,IAAI,UAAU,UAAU,MAAM;AAC3D,UAAM,YAAY,KAAK,KAAK,QAAQ;AACpC,UAAM,eAAe,KAAK,KAAK,QAAQ;AACvC,UAAM,eAAe,KAAK,KAAK,QAAQ;AACvC,UAAM,MAAM,KAAK,KAAK,OAAO;AAE7B,QAAI,KAAK,aAAa,SAAS,kBAAkB,GAAG;AAClD,UAAI,MAAM,KAAK,aAAa;AAC5B,aAAO,MAAM,kBAAkB,EAAG,QAAO;AACzC,WAAK,eAAe,IAAI,aAAa,IAAI,YAAY,MAAM,CAAC,CAAC;AAAA,IAC/D;AACA,UAAM,YAAY,KAAK;AACvB,UAAM,iBAAiB,KAAK,KAAK,QAAQ,eAAe,CAAC,IAAI,KAAK,yBAAyB;AAC3F,QAAI,IAAI;AACR,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,IAAI,iBAAiB,KAAK;AACxC,gBAAU,CAAC,IAAI;AACf,YAAM,OAAO,IAAI,UAAU,SAAS,UAAU,CAAC,IAAI;AACnD,UAAI;AACJ,UAAI,MAAM,UAAU;AAClB,YAAI;AAAA,MACN,WAAW,SAAS,gBAAgB,eAAe,SAAS,IAAI;AAC9D,cAAM,SAAS,KAAK,eAAe,IAAI,IAAI;AAC3C,YAAI,WAAW,QAAW;AACxB,cAAI;AAAA,QACN,OAAO;AACL,cAAI;AACJ,cAAI,cAAc;AAChB,gBAAI;AACF,oBAAM,YAAY,aAAa,EAAE,MAAM,KAAK,MAAM,MAAM,IAAI,CAAC;AAC7D,kBAAI,OAAO,SAAS,SAAS,IAAI,KAAK,IAAI,GAAG,aAAa,SAAS,IAAI;AAAA,YACzE,SAAS,OAAO;AACd,mBAAK,KAAK,YAAY,OAAO,gBAAgB,EAAE,OAAO,KAAK,GAAG,CAAC;AAAA,YACjE;AAAA,UACF;AACA,cAAI,eAAe,SAAS,GAAG;AAC7B,kBAAM,WAAW,KAAK,kBAAkB,MAAM,cAAc;AAC5D,gBAAI,WAAW,EAAG,KAAI;AAAA,UACxB;AACA,eAAK,eAAe,IAAI,MAAM,CAAC;AAAA,QACjC;AACA,YAAI,IAAI,KAAM,QAAO;AAAA,MACvB,OAAO;AACL,YAAI;AAAA,MACN;AACA,WAAK;AAAA,IACP;AACA,cAAU,eAAe,IAAI;AAC7B,UAAM,cAAc,IAAI,KAAK,IAAI,GAAG,WAAW,eAAe,IAAI;AAClE,SAAK,mBAAmB;AACxB,SAAK,YAAY,UAAU,SAAS,GAAG,kBAAkB,CAAC;AAE1D,UAAM,kBAAkB,KAAK,IAAI,GAAG,SAAS,cAAc,OAAO,OAAO,OAAO,KAAK;AACrF,UAAM,cAAc,KAAK,IAAI,OAAO,QAAQ,eAAe;AAE3D,eAAW,QAAQ,OAAO;AACxB,YAAM,YAAY,GAAG,cAAc,IAAI;AACvC,gBAAU,MAAM,SAAS,GAAG,WAAW;AACvC,UAAI,SAAS,SAAU,WAAU,MAAM,QAAQ,GAAG,WAAW;AAAA,IAC/D;AAEA,OAAG,KAAK,aAAa,iBAAiB,OAAO,WAAW,CAAC,CAAC;AAAA,EAC5D;AAAA,EAEA,oBAAoB,MAA0B;AAC5C,SAAK,eAAe,OAAO,IAAI;AAAA,EACjC;AAAA,EAEA,0BAAgC;AAC9B,SAAK,iBAAiB,oBAAI,QAAQ;AAAA,EACpC;AAAA,EAEQ,2BAAqC;AAC3C,WAAO,KAAK,KAAK,YAAY,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,eAAe,IAAI;AAAA,EAC7F;AAAA,EAEA,IAAY,mBAA4B;AACtC,WAAO,KAAK,KAAK,YAAY,kBAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,eAAe,IAAI;AAAA,EAC3F;AAAA,EAEQ,kBAAkB,MAAoB,MAAwB;AACpE,SAAK,kBAAL,KAAK,gBAAkB,SAAS,cAAc,QAAQ;AACtD,UAAM,MAAM,KAAK,cAAc,WAAW,IAAI;AAC9C,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,QAAQ,OAAO,iBAAiB,KAAK,KAAK,SAAS,IAAI;AAC7D,UAAM,WAAW,WAAW,MAAM,QAAQ,KAAK;AAC/C,QAAI,OAAO,GAAG,MAAM,SAAS,IAAI,MAAM,UAAU,IAAI,QAAQ,MAAM,MAAM,UAAU;AACnF,UAAM,UAAU,WAAW,MAAM,iBAAiB,qBAAqB,CAAC,KAAK;AAC7E,UAAM,aAAa,KAAK,MAAM,WAAW,IAAI;AAC7C,QAAI,WAAW;AAEf,eAAW,OAAO,MAAM;AACtB,YAAM,OAAO,gBAAgB,KAAK,MAAM,MAAM,GAAG;AACjD,UAAI,CAAC,KAAM;AACX,YAAM,SAAS,KAAK,IAAI,IAAI,IAAI,eAAe,UAAU,IAAI,CAAC;AAC9D,UAAI,QAAQ;AACZ,UAAI,IAAI;AACR,iBAAW,MAAM,MAAM;AACrB,cAAM,KAAK,IAAI,YAAY,EAAE,EAAE;AAC/B,YAAI,IAAI,KAAK,IAAI,KAAK,QAAQ;AAC5B;AACA,cAAI;AAAA,QACN,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,SAAS,GAAI;AAAA,MACnB;AACA,UAAI,QAAQ,SAAU,YAAW;AAAA,IACnC;AACA,WAAO,WAAW,aAAa,KAAK,MAAM,UAAU,GAAG;AAAA,EACzD;AAAA,EAEA,WAAW,YAAsB,QAAwB;AACvD,QAAI,CAAC,KAAK,KAAK,QAAQ,WAAY;AACnC,eAAW,YAAY,YAAY;AACjC,iBAAW,SAAS,OAAQ,MAAK,aAAa,KAAK,CAAC,UAAU,KAAK,CAAC;AAAA,IACtE;AAAA,EACF;AAAA,EAEA,aAAmB;AACjB,QAAI,KAAK,aAAa,WAAW,EAAG;AACpC,UAAM,UAAU,KAAK;AACrB,SAAK,eAAe,CAAC;AACrB,eAAW,CAAC,UAAU,KAAK,KAAK,SAAS;AACvC,YAAM,OAAO,KAAK,eAAe,UAAU,KAAK;AAChD,UAAI,CAAC,KAAM;AACX,WAAK,UAAU,OAAO,kBAAkB;AACxC,WAAK,KAAK;AACV,WAAK,UAAU,IAAI,kBAAkB;AACrC,YAAM,UAAU,oBAAoB,IAAI;AACxC,YAAM,QAAQ,QAAQ;AACtB,UAAI,MAAO,cAAa,KAAK;AAC7B,cAAQ,aAAa,WAAW,MAAM;AACpC,aAAK,UAAU,OAAO,kBAAkB;AACxC,gBAAQ,aAAa;AAAA,MACvB,GAAG,GAAG;AAAA,IACR;AAAA,EACF;AAAA,EAEA,WAAiB;AACf,SAAK,oBAAoB;AACzB,UAAM,WAAW,KAAK,KAAK,SAAS,cAAc;AAClD,UAAM,YAAY,KAAK,KAAK,QAAQ;AACpC,QAAI,eAAe;AACnB,QAAI,KAAK,KAAK,QAAQ,cAAc;AAClC,qBAAe,KAAK,IAAI,cAAc,KAAK,KAAK,QAAQ,eAAe;AAAA,IACzE;AACA,QAAI,KAAK,mBAAmB,GAAG;AAC7B,qBAAe,KAAK,IAAI,cAAc,KAAK,gBAAgB;AAAA,IAC7D;AACA,UAAM,UAAU,KAAK,KAAK,SAAS,eAAe,KAAK,IAAI,GAAG,YAAY,CAAC;AAC3E,UAAM,SAAS,UAAU,KAAK,KAAK,QAAQ,YAAY,IAAI;AAC3D,QAAI,SAAS,KAAK,SAAU,MAAK,SAAS,MAAM;AAChD,SAAK,gBAAgB;AACrB,SAAK,YAAY,IAAI;AACrB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEQ,SAAS,QAAsB;AACrC,WAAO,KAAK,WAAW,QAAQ;AAC7B,YAAM,OAAgB,EAAE,OAAO,IAAI,QAAQ,IAAI,MAAM,UAAU,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE;AACnF,YAAM,KAAK,KAAK,KAAK;AACrB,iBAAW,QAAQ,OAAO;AACxB,cAAM,OAAO,KAAK,KAAK,YAAY,eAAe,IAAI;AACtD,YAAI,KAAK,WAAW,EAAG;AACvB,cAAM,MAAM,GAAG,OAAO,UAAU;AAChC,YAAI,MAAM,SAAS,GAAG,KAAK,KAAK,QAAQ,SAAS;AACjD,YAAI,aAAa,QAAQ,KAAK;AAC9B,YAAI,MAAM,UAAU;AACpB,cAAM,QAAuB,CAAC;AAC9B,mBAAW,OAAO,MAAM;AACtB,gBAAM,OAAO,GAAG,OAAO,WAAW;AAClC,eAAK,QAAQ,QAAQ,IAAI;AACzB,eAAK,aAAa,QAAQ,UAAU;AACpC,cAAI,IAAI,aAAa;AACnB,kBAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,kBAAM,OAAO,KAAK,KAAK,QAAQ,iBAAiB,WAAW,UAAU;AACrE,kBAAM,YAAY;AAClB,gBAAI,MAAM,SAAS,QAAS,OAAM,OAAO,cAAc,KAAK,KAAK,MAAM;AACvE,kBAAM,aAAa,cAAc,YAAY;AAC7C,iBAAK,YAAY,KAAK;AACtB,iBAAK,UAAU,IAAI,sBAAsB;AAAA,UAC3C;AACA,cAAI,YAAY,IAAI;AACpB,gBAAM,KAAK,IAAI;AAAA,QACjB;AACA,WAAG,cAAc,IAAI,EAAE,YAAY,GAAG;AACtC,aAAK,KAAK,IAAI,IAAI;AAClB,aAAK,MAAM,IAAI,IAAI;AAAA,MACrB;AACA,UAAI,KAAK,KAAK,QAAQ,cAAc;AAClC,cAAM,YAAY,GAAG,OAAO,0BAA0B;AACtD,kBAAU,MAAM,SAAS,GAAG,KAAK,KAAK,QAAQ,eAAe;AAC7D,kBAAU,aAAa,QAAQ,KAAK;AACpC,kBAAU,MAAM,UAAU;AAC1B,WAAG,cAAc,OAAO,YAAY,SAAS;AAC7C,aAAK,YAAY;AAAA,MACnB;AACA,WAAK,KAAK,KAAK,IAAI;AACnB,WAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEA,cAAoB;AAClB,SAAK,kBAAkB;AACvB,SAAK,qBAAqB;AAC1B,eAAW,QAAQ,KAAK,MAAM;AAC5B,UAAI,KAAK,UAAW,MAAK,cAAc,KAAK,SAAS;AACrD,iBAAW,QAAQ,OAAO;AACxB,mBAAW,QAAQ,KAAK,MAAM,IAAI,KAAK,CAAC,EAAG,oBAAmB,KAAK,MAAM,IAAI;AAC7E,aAAK,KAAK,IAAI,GAAG,OAAO;AAAA,MAC1B;AACA,WAAK,WAAW,OAAO;AAAA,IACzB;AACA,SAAK,OAAO,CAAC;AACb,SAAK,WAAW;AAChB,SAAK,QAAQ;AACb,SAAK,WAAW;AAChB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,kBAAwB;AACtB,UAAM,kBACJ,KAAK,KAAK,QAAQ,gBAClB,KAAK,KAAK,QAAQ,gBAAgB,QAClC,KAAK;AACP,QAAI,kBAAkB;AACtB,eAAW,QAAQ,OAAO;AACxB,YAAM,OAAO,KAAK,KAAK,YAAY,eAAe,IAAI;AACtD,UAAI,IAAI;AACR,YAAM,QAAkB,CAAC;AACzB,iBAAW,OAAO,MAAM;AACtB,cAAM,KAAK,CAAC;AACZ,aAAK,IAAI;AAAA,MACX;AACA,iBAAW,QAAQ,KAAK,MAAM;AAC5B,cAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,cAAM,MAAM,KAAK,KAAK,IAAI;AAC1B,YAAI,CAAC,SAAS,CAAC,IAAK;AACpB,YAAI,CAAC,iBAAiB;AACpB,cAAI,MAAM,SAAS,GAAG,KAAK,KAAK,QAAQ,SAAS;AAAA,QACnD;AACA,iBAAS,IAAI,GAAG,IAAI,KAAK,UAAU,IAAI,MAAM,QAAQ,KAAK;AACxD,gBAAM,CAAC,EAAE,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,YAAY;AAC9C,gBAAM,CAAC,EAAE,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC;AACjC,gBAAM,CAAC,EAAE,aAAa,iBAAiB,OAAO,kBAAkB,IAAI,CAAC,CAAC;AAAA,QACxE;AAAA,MACF;AACA,UAAI,KAAK,KAAK,QAAQ,cAAc;AAClC,mBAAW,QAAQ,KAAK,MAAM;AAC5B,eAAK,WAAW,MAAM,YAAY,mBAAmB,GAAG,KAAK,KAAK,QAAQ,eAAe,IAAI;AAAA,QAC/F;AAAA,MACF;AACA,yBAAmB,KAAK;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,mBAA4B;AAClC,UAAM,WAAW,KAAK,KAAK,SAAS,cAAc;AAClD,UAAM,OAAO,KAAK,KAAK,YAAY,eAAe,QAAQ;AAC1D,UAAM,YAAY,KAAK;AACvB,UAAM,WAAW,KAAK;AACtB,QAAI,QAAQ;AACZ,QAAI,OAAO,KAAK;AAEhB,QAAI,KAAK,SAAS,IAAI;AACpB,YAAM,QAAQ,SAAS;AACvB,UAAI,QAAQ;AACZ,iBAAW,OAAO,KAAM,UAAS,IAAI;AACrC,UAAI,QAAQ,KAAK,QAAQ,OAAO;AAC9B,cAAM,aAAa,SAAS;AAC5B,YAAI,IAAI;AACR,iBAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,cAAI,IAAI,KAAK,CAAC,EAAE,gBAAgB,WAAY,SAAQ,IAAI;AAAA,cACnD;AACL,eAAK,KAAK,CAAC,EAAE;AAAA,QACf;AACA,YAAI,MAAM;AACV,iBAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,KAAK;AACxC,iBAAO,KAAK,CAAC,EAAE;AACf,cAAI,OAAO,aAAa,OAAO;AAC7B,mBAAO,IAAI;AACX;AAAA,UACF;AAAA,QACF;AACA,YAAI,OAAO,KAAK,OAAQ,QAAO,KAAK;AACpC,gBAAQ,KAAK,IAAI,GAAG,QAAQ,CAAC;AAC7B,eAAO,KAAK,IAAI,KAAK,QAAQ,OAAO,CAAC;AAAA,MACvC;AAAA,IACF;AAEA,SAAK,WAAW;AAChB,SAAK,cAAc;AACnB,WAAO,UAAU,aAAa,SAAS;AAAA,EACzC;AAAA,EAEA,YAAY,QAAQ,OAAa;AAC/B,UAAM,WAAW,KAAK,KAAK,SAAS,cAAc;AAClD,UAAM,WAAW,KAAK,KAAK,SAAS,qBAAqB;AACzD,UAAM,SAAS,KAAK,KAAK,QAAQ;AACjC,UAAM,mBAAmB,KAAK,iBAAiB;AAE/C,QAAI,aAAa,GAAG;AAClB,iBAAW,QAAQ,KAAK,KAAM,MAAK,SAAS,IAAI;AAChD,WAAK,QAAQ;AACb,WAAK,WAAW;AAChB;AAAA,IACF;AAEA,UAAM,YAAY,SAAS;AAC3B,UAAM,aAAa,YAAY,SAAS;AACxC,UAAM,eAAe,WAAW,KAAK,WAAW,WAAW,QAAQ;AACnE,QAAI,cAAc,WAAW,KAAK,WAAW,YAAY,QAAQ,IAAI;AACrE,QAAI,cAAc,SAAU,eAAc;AAE1C,UAAM,QAAQ,MAAM,eAAe,QAAQ,GAAG,WAAW,CAAC;AAC1D,UAAM,WAAW,MAAM,cAAc,QAAQ,GAAG,QAAQ;AAExD,QAAI,CAAC,SAAS,UAAU,KAAK,SAAS,aAAa,KAAK,SAAU;AAClE,SAAK,QAAQ;AACb,SAAK,WAAW;AAEhB,eAAW,QAAQ,KAAK,MAAM;AAC5B,UAAI,KAAK,UAAU,OAAO,KAAK,QAAQ,SAAS,KAAK,SAAS,WAAW;AACvE,aAAK,SAAS,IAAI;AAAA,MACpB;AAAA,IACF;AAEA,aAAS,IAAI,OAAO,IAAI,UAAU,KAAK;AACrC,YAAM,OAAO,KAAK,KAAK,SAAS,gBAAgB,CAAC;AACjD,YAAM,OAAO,KAAK,KAAK,IAAI,KAAK,QAAQ;AACxC,UAAI,CAAC,QAAQ,CAAC,KAAM;AACpB,UAAI,CAAC,SAAS,KAAK,UAAU,KAAK,KAAK,WAAW,KAAK,IAAI;AACzD,YAAI,oBAAoB,KAAK,SAAS,UAAU;AAC9C,eAAK,gBAAgB,MAAM,MAAM,QAAQ;AAAA,QAC3C;AACA;AAAA,MACF;AACA,WAAK,WAAW,MAAM,CAAC;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,SAAS,MAAqB;AACpC,SAAK,QAAQ;AACb,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,eAAW,QAAQ,OAAO;AACxB,YAAM,MAAM,KAAK,KAAK,IAAI;AAC1B,UAAI,IAAK,KAAI,MAAM,UAAU;AAAA,IAC/B;AACA,QAAI,KAAK,WAAW;AAClB,WAAK,cAAc,KAAK,SAAS;AACjC,WAAK,UAAU,MAAM,UAAU;AAAA,IACjC;AAAA,EACF;AAAA,EAEQ,WAAW,MAAe,OAAqB;AACrD,UAAM,OAAO,KAAK,KAAK,SAAS,gBAAgB,KAAK;AACrD,QAAI,CAAC,MAAM;AACT,WAAK,SAAS,IAAI;AAClB;AAAA,IACF;AACA,SAAK,QAAQ;AACb,SAAK,SAAS,KAAK;AACnB,UAAM,IAAI,KAAK,UAAU,KAAK;AAC9B,UAAM,IAAI,KAAK,UAAU,QAAQ,CAAC,IAAI,KAAK,UAAU,KAAK;AAE1D,QAAI,KAAK,UAAU;AACjB,WAAK,OAAO;AACZ,iBAAW,QAAQ,OAAO;AACxB,cAAM,MAAM,KAAK,KAAK,IAAI;AAC1B,YAAI,IAAK,KAAI,MAAM,UAAU;AAAA,MAC/B;AACA,YAAM,YAAY,KAAK;AACvB,UAAI,WAAW;AACb,kBAAU,MAAM,UAAU;AAC1B,kBAAU,MAAM,YAAY,cAAc,CAAC;AAC3C,kBAAU,MAAM,SAAS,GAAG,CAAC;AAC7B,kBAAU,QAAQ,QAAQ,OAAO,KAAK;AACtC,kBAAU,aAAa,iBAAiB,OAAO,QAAQ,CAAC,CAAC;AACzD,aAAK,oBAAoB,WAAW,IAAI;AAAA,MAC1C;AACA;AAAA,IACF;AAEA,SAAK,OAAO;AACZ,QAAI,KAAK,UAAW,MAAK,UAAU,MAAM,UAAU;AAEnD,eAAW,QAAQ,OAAO;AACxB,YAAM,MAAM,KAAK,KAAK,IAAI;AAC1B,UAAI,CAAC,IAAK;AACV,UAAI,MAAM,UAAU;AACpB,UAAI,MAAM,YAAY,cAAc,CAAC;AACrC,UAAI,MAAM,SAAS,GAAG,CAAC;AACvB,UAAI,QAAQ,QAAQ,OAAO,KAAK;AAChC,UAAI,QAAQ,KAAK,KAAK;AACtB,UAAI,aAAa,iBAAiB,OAAO,QAAQ,CAAC,CAAC;AACnD,UAAI,UAAU,OAAO,sBAAsB,KAAK,QAAQ;AACxD,UAAI,UAAU,OAAO,mBAAmB,KAAK,eAAe,SAAS,CAAC,KAAK,KAAK,QAAQ,yBAAyB;AACjH,UAAI,UAAU,OAAO,iBAAiB,QAAQ,MAAM,CAAC;AACrD,UAAI,aAAa,iBAAiB,KAAK,WAAW,SAAS,OAAO;AAElE,WAAK,gBAAgB,MAAM,MAAM,IAAI;AAAA,IACvC;AAEA,QAAI,KAAK,eAAe,KAAK,YAAY,aAAa,OAAO;AAC3D,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,gBAAgB,MAAe,MAAoB,MAAsB;AAC/E,UAAM,OAAO,KAAK,KAAK,YAAY,eAAe,IAAI;AACtD,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,QAAI,CAAC,MAAO;AACZ,UAAM,QAAQ,KAAK;AACnB,UAAM,aAAa,SAAS,YAAY,KAAK,KAAK,YAAY,WAAW;AACzE,QAAI,WAAW;AAEf,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,MAAM,KAAK,CAAC;AAClB,YAAM,OAAO,MAAM,CAAC;AAEpB,UAAI,SAAS,UAAU;AACrB,cAAM,eAAe,IAAI,KAAK,YAAY,KAAK,KAAK;AACpD,YAAI,gBAAgB,CAAC,YAAY;AAC/B,6BAAmB,KAAK,MAAM,IAAI;AAClC,cAAI,KAAK,MAAM,YAAY,OAAQ,MAAK,MAAM,UAAU;AACxD;AAAA,QACF;AAAA,MACF;AAEA,UAAI,cAAc,WAAW,GAAG;AAC9B;AACA,2BAAmB,KAAK,MAAM,IAAI;AAClC,YAAI,KAAK,MAAM,YAAY,OAAQ,MAAK,MAAM,UAAU;AACxD;AAAA,MACF;AAEA,UAAI,KAAK,MAAM,YAAY,OAAQ,MAAK,MAAM,UAAU;AAExD,UAAI,YAAY;AACd,cAAM,OAAO,KAAK,eAAe,MAAM,KAAK,OAAO,KAAK,SAAS,CAAC;AAClE,YAAI,OAAO,GAAG;AACZ,qBAAW,OAAO;AAClB,eAAK,eAAe,MAAM,MAAM,GAAG,IAAI;AAAA,QACzC,WAAW,KAAK,MAAM,UAAU,GAAG,IAAI,YAAY,MAAM;AACvD,eAAK,MAAM,QAAQ,GAAG,IAAI,YAAY;AAAA,QACxC;AAAA,MACF;AAEA,UAAI,KAAK,KAAK,eAAe,UAAU,OAAO,IAAI,EAAE,EAAG;AACvD,WAAK,WAAW,MAAM,MAAM,GAAG;AAC/B,WAAK,gBAAgB,MAAM,OAAO,GAAG;AAAA,IACvC;AAAA,EACF;AAAA,EAEQ,eAAe,MAAoB,QAAgB,UAAkB,WAA2B;AACtG,UAAM,KAAK,OAAO,OAAO;AACzB,QAAI,CAAC,GAAI,QAAO;AAChB,QAAI;AACF,YAAM,OAAO,GAAG;AAAA,QACd,KAAK,KAAK,KAAK,OAAO;AAAA,QACtB,QAAQ,OAAO;AAAA,QACf;AAAA,QACA;AAAA,QACA,MAAM,KAAK;AAAA,QACX,OAAO,KAAK,KAAK,aAAa,MAAM,MAAM;AAAA,QAC1C;AAAA,MACF,CAAC;AACD,aAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAM,IAAI,KAAK,GAAG,SAAS,CAAC;AAAA,IAC/D,SAAS,OAAO;AACd,WAAK,KAAK,YAAY,OAAO,WAAW,EAAE,OAAO,OAAO,IAAI,OAAO,KAAK,GAAG,CAAC;AAC5E,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,eAAe,MAAmB,MAAgB,OAAe,MAAoB;AAC3F,QAAI,IAAI;AACR,aAAS,IAAI,OAAO,IAAI,QAAQ,QAAQ,IAAI,KAAK,QAAQ,IAAK,MAAK,KAAK,CAAC,EAAE;AAC3E,SAAK,MAAM,QAAQ,GAAG,CAAC;AAAA,EACzB;AAAA,EAEQ,oBAAoB,KAAkB,MAA0B;AACtE,SAAK,cAAc,GAAG;AACtB,UAAM,SAAS,KAAK,YAAY,OAAO,KAAK,KAAK,SAAS,YAAY,KAAK,QAAQ,IAAI;AACvF,UAAM,YAAY,GAAG,OAAO,aAAa;AACzC,QAAI,YAAY,SAAS;AACzB,UAAM,WAAW,KAAK,KAAK,QAAQ;AACnC,QAAI,UAAU;AACZ,YAAM,SAAS,EAAE,MAAM,KAAK,MAAM,MAAM,UAAU,MAAM,KAAK,KAAK,KAAK,OAAO,EAAE;AAChF,UAAI;AACJ,UAAI;AACF,cAAM,SAAS,MAAM;AAAA,MACvB,SAAS,KAAK;AACZ,aAAK,KAAK,YAAY,KAAK,qBAAqB,EAAE,OAAO,KAAK,GAAG,CAAC;AAClE,cAAM;AAAA,MACR;AACA,UAAI,OAAO,QAAQ,UAAU;AAC3B,kBAAU,cAAc;AAAA,MAC1B,WAAW,eAAe,aAAa;AACrC,kBAAU,YAAY,GAAG;AAAA,MAC3B,WAAW,OAAO,OAAO,QAAQ,YAAY,IAAI,cAAc,aAAa;AAC1E,kBAAU,YAAY,IAAI,EAAE;AAC5B,2BAAmB,KAAK,IAAI,OAAO;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,KAAwB;AAC5C,UAAM,UAAU,oBAAoB,GAAG;AACvC,QAAI,SAAS;AACX,UAAI;AACF,gBAAQ;AAAA,MACV,SAAS,KAAK;AACZ,aAAK,KAAK,YAAY,KAAK,2BAA2B;AAAA,MACxD;AAAA,IACF;AACA,QAAI,cAAc;AAAA,EACpB;AAAA,EAEQ,WAAW,MAAmB,MAAoB,QAAsB;AAC9E,uBAAmB,KAAK,MAAM,IAAI;AAClC,QAAI,KAAK,SAAS;AAChB,WAAK,gBAAgB,MAAM,MAAM,MAAM;AACvC;AAAA,IACF;AACA,QAAI,OAAO,gBAAgB;AACzB,YAAM,WAAW,KAAK,KAAK,SAAS,cAAc,KAAK,EAAE;AACzD,YAAM,SAAS,GAAG,QAAQ,qBAAqB,WAAW,8BAA8B,EAAE,EAAE;AAC5F,aAAO,cAAc;AACrB,WAAK,gBAAgB,MAAM;AAC3B,WAAK,UAAU,IAAI,0BAA0B;AAC7C,WAAK,eAAe,IAAI;AACxB;AAAA,IACF;AACA,QAAI,OAAO,aAAa;AACtB,YAAM,QAAQ,KAAK,cAAgC,oBAAoB;AACvE,UAAI,OAAO;AACT,cAAM,UAAU,KAAK;AACrB,cAAM,gBAAgB,KAAK,KAAK,iBAAiB,gBAAgB,KAAK,EAAE;AACxE,cAAM,WAAW,CAAC,KAAK,KAAK,iBAAiB,aAAa,IAAI;AAAA,MAChE;AACA,UAAI,KAAK,cAAc,iCAAkC,MAAK,YAAY;AAC1E,WAAK,eAAe,IAAI;AACxB;AAAA,IACF;AACA,QAAI,OAAO,OAAO,SAAS;AACzB,YAAM,SAAS,GAAG,QAAQ,sBAAsB;AAChD,aAAO,cAAc;AACrB,WAAK,gBAAgB,MAAM;AAC3B,UAAI,KAAK,cAAc,4BAA6B,MAAK,YAAY;AACrE,WAAK,eAAe,IAAI;AACxB;AAAA,IACF;AACA,QAAI,OAAO,OAAO,SAAS,WAAW,CAAC,KAAK,UAAU;AACpD,WAAK,cAAc,OAAO,KAAK,KAAK,SAAS,UAAU,IAAI,IAAI,KAAK,KAAK,QAAQ,WAAW;AAC5F,UAAI,KAAK,cAAc,6BAA8B,MAAK,YAAY;AACtE,WAAK,mBAAmB,MAAM,MAAM,MAAM;AAC1C;AAAA,IACF;AACA,QAAI,KAAK,KAAK,SAAS,UAAU,KAAK,cAAc,GAAG,OAAO,OAAO,IAAI;AACvE,WAAK,eAAe,MAAM,MAAM,MAAM;AACtC;AAAA,IACF;AACA,sBAAkB,KAAK,MAAM,MAAM,MAAM,MAAM;AAC/C,qBAAiB,KAAK,MAAM,MAAM,MAAM,MAAM;AAC9C,mBAAe,KAAK,MAAM,MAAM,MAAM,MAAM;AAC5C,SAAK,mBAAmB,MAAM,MAAM,MAAM;AAAA,EAC5C;AAAA,EAIQ,gBAA+B;AACrC,QAAI,KAAK,oBAAoB,OAAW,QAAO,KAAK;AACpD,SAAK,kBACH,KAAK,KAAK,YAAY,kBAAkB,EAAE;AAAA,MACxC,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,EAAE,kBAAkB,CAAC,EAAE,OAAO,WAAW,EAAE,OAAO,SAAS;AAAA,IACvF,KAAK;AACP,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,eAAe,MAAmB,MAAoB,QAAsB;AAClF,UAAM,cAAc,KAAK,KAAK,SAAS,YAAY,KAAK,EAAE;AAC1D,UAAM,QAAQ,KAAK,aAAa,IAAI;AACpC,UAAM,SAAS,GAAG,QAAQ,kBAAkB;AAC5C,WAAO,MAAM,QAAQ,GAAG,QAAQ,EAAE;AAClC,UAAM,OAAO,GAAG,QAAQ,gBAAgB;AACxC,SAAK,YAAY,MAAM;AACvB,QAAI,aAAa;AACf,YAAM,WAAW,KAAK,KAAK,SAAS,cAAc,KAAK,EAAE;AACzD,YAAM,SAAS,GAAG,QAAQ,qBAAqB,WAAW,8BAA8B,EAAE,EAAE;AAC5F,aAAO,cAAc;AACrB,WAAK,YAAY,MAAM;AAAA,IACzB,OAAO;AACL,YAAM,SAAS,GAAG,QAAQ,yBAAyB;AACnD,WAAK,YAAY,MAAM;AAAA,IACzB;AACA,UAAM,OAAO,GAAG,QAAQ,gBAAgB;AACxC,SAAK,cAAc,oBAAoB,KAAK,MAAM,MAAM,QAAQ,KAAK,KAAK,aAAa,MAAM,MAAM,CAAC;AACpG,SAAK,YAAY,IAAI;AACrB,SAAK,gBAAgB,IAAI;AACzB,qBAAiB,KAAK,MAAM,MAAM,MAAM,MAAM;AAAA,EAChD;AAAA,EAEQ,aAAa,MAA4B;AAC/C,WAAO,KAAK,KAAK,SAAS,aAAa,IAAI;AAAA,EAC7C;AAAA,EAEQ,eAAe,MAAyB;AAC9C,QAAI,KAAK,MAAM,WAAW,GAAI,MAAK,MAAM,SAAS;AAClD,QAAI,KAAK,MAAM,WAAW,GAAI,MAAK,MAAM,SAAS;AAClD,QAAI,KAAK,MAAM,YAAY,OAAQ,MAAK,MAAM,UAAU;AAAA,EAC1D;AAAA,EAEQ,mBAAmB,MAAmB,MAAoB,QAAsB;AACtF,UAAM,QAAQ,KAAK,KAAK,SAAS,YAAY,OAAO,EAAE;AACtD,QAAI,CAAC,SAAS,KAAK,UAAU;AAC3B,WAAK,eAAe,IAAI;AACxB;AAAA,IACF;AACA,UAAM,MAAM,KAAK,KAAK,SAAS,UAAU,IAAI,IAAI;AACjD,QAAI,MAAM,KAAK,OAAO,MAAM,QAAQ;AAClC,WAAK,eAAe,IAAI;AACxB;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,GAAG;AACvB,QAAI,UAAU,IAAI;AAChB,WAAK,MAAM,UAAU;AACrB;AAAA,IACF;AACA,QAAI,KAAK,MAAM,YAAY,OAAQ,MAAK,MAAM,UAAU;AACxD,QAAI,QAAQ,GAAG;AACb,YAAM,MAAM,KAAK,IAAI,MAAM,OAAO,KAAK,UAAU,SAAS,CAAC;AAC3D,YAAM,SAAS,KAAK,UAAU,GAAG,IAAI,KAAK,UAAU,GAAG;AACvD,WAAK,MAAM,SAAS,GAAG,SAAS,IAAI,SAAS,QAAQ,KAAK,KAAK,QAAQ,SAAS;AAChF,WAAK,MAAM,SAAS;AAAA,IACtB,OAAO;AACL,WAAK,eAAe,IAAI;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,gBAAgB,MAAmB,MAAoB,QAAsB;AACnF,UAAM,OAAO;AACb,QAAI,OAAO,aAAa;AACtB,YAAM,QAAQ,KAAK,cAAgC,oBAAoB;AACvE,UAAI,OAAO;AACT,cAAM,QAAQ,KAAK,KAAK,iBAAiB,uBAAuB,IAAI;AACpE,cAAM,UAAU,MAAM;AACtB,cAAM,gBAAgB,MAAM,QAAQ,CAAC,MAAM;AAAA,MAC7C;AACA,UAAI,KAAK,cAAc,GAAG,IAAI,wBAAyB,MAAK,YAAY,GAAG,IAAI;AAC/E;AAAA,IACF;AACA,QAAI,OAAO,gBAAgB;AACzB,WAAK,cAAc;AACnB,UAAI,KAAK,cAAc,KAAM,MAAK,YAAY;AAC9C;AAAA,IACF;AACA,UAAM,WAAW,KAAK,KAAK,YAAY,oBAAoB;AAC3D,QAAI,YAAY,OAAO,OAAO,SAAS,IAAI;AACzC,YAAM,OAAO,GAAG,QAAQ,kBAAkB;AAC1C,WAAK,MAAM,cAAc,IAAI,KAAK,cAAc,KAAK,EAAE;AACvD,YAAM,SAAS,GAAG,QAAQ,qBAAqB,KAAK,KAAK,SAAS,gBAAgB,KAAK,EAAE,IAAI,8BAA8B,EAAE,EAAE;AAC/H,aAAO,cAAc;AACrB,YAAM,OAAO,GAAG,QAAQ,iBAAiB;AACzC,YAAM,WAAW,KAAK,KAAK,YAAY,mBAAmB,EAAE,KAAK,cAAc,CAAC;AAChF,YAAM,SAAS,UAAU,OAAO,aAAa,GAAG,SAAS,OAAO,UAAU,OAAO;AACjF,WAAK,cAAc,GAAG,MAAM,GAAG,KAAK,YAAY,EAAE;AAClD,YAAM,QAAQ,GAAG,QAAQ,kBAAkB;AAC3C,YAAM,cAAc,IAAI,KAAK,WAAW,UAAU,CAAC;AACnD,WAAK,OAAO,QAAQ,MAAM,KAAK;AAC/B,WAAK,gBAAgB,IAAI;AACzB,UAAI,KAAK,cAAc,GAAG,IAAI,oBAAqB,MAAK,YAAY,GAAG,IAAI;AAC3E;AAAA,IACF;AACA,QAAI,OAAO,OAAO,WAAW,KAAK,aAAa,OAAO,UAAU,eAAe,KAAK,KAAK,WAAW,OAAO,EAAE,GAAG;AAC9G,YAAM,QAAQ,KAAK,UAAU,OAAO,EAAE;AACtC,YAAM,YACJ,OAAO,OAAO,kBAAkB,OAC5B,oBAAoB,KAAK,MAAM,MAAM,QAAQ,KAAK,IAClD,cAAc,KAAK;AACzB,WAAK,cAAc;AACnB,UAAI,KAAK,cAAc,GAAG,IAAI,kBAAmB,MAAK,YAAY,GAAG,IAAI;AACzE;AAAA,IACF;AACA,SAAK,cAAc;AACnB,QAAI,KAAK,cAAc,KAAM,MAAK,YAAY;AAAA,EAChD;AAAA,EAEA,YAAY,SAAyB;AACnC,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,SAAS,SAAS;AAC3B,UAAI,QAAQ,KAAK,KAAK,IAAI,KAAK,EAAG;AAClC,WAAK,IAAI,KAAK;AACd,YAAM,OAAO,KAAK,KAAK,QAAQ,KAAK,QAAQ;AAC5C,UAAI,CAAC,QAAQ,KAAK,UAAU,MAAO;AACnC,YAAM,OAAO,KAAK,KAAK,SAAS,gBAAgB,KAAK;AACrD,UAAI,CAAC,KAAM;AACX,UAAI,KAAK,SAAS,UAAU;AAC1B,YAAI,KAAK,UAAW,MAAK,oBAAoB,KAAK,WAAW,IAAI;AACjE;AAAA,MACF;AACA,iBAAW,QAAQ,OAAO;AACxB,cAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,YAAI,CAAC,MAAO;AACZ,aAAK,gBAAgB,MAAM,MAAM,IAAI;AAAA,MACvC;AAAA,IACF;AACA,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,kBAAwB;AACtB,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,eAAW,QAAQ,KAAK,MAAM;AAC5B,UAAI,KAAK,QAAQ,EAAG;AACpB,YAAM,OAAO,KAAK,KAAK,SAAS,gBAAgB,KAAK,KAAK;AAC1D,UAAI,CAAC,KAAM;AACX,UAAI,KAAK,SAAS,UAAU;AAC1B,YAAI,KAAK,UAAW,MAAK,oBAAoB,KAAK,WAAW,IAAI;AACjE;AAAA,MACF;AACA,iBAAW,QAAQ,OAAO;AACxB,cAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,YAAI,CAAC,MAAO;AACZ,aAAK,gBAAgB,MAAM,MAAM,IAAI;AAAA,MACvC;AAAA,IACF;AACA,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,gBAAsB;AACpB,QAAI,KAAK,KAAK,YAAY,EAAG;AAC7B,QAAI,KAAK,eAAe,KAAK,YAAY,YAAY,KAAK,KAAK,SAAS,qBAAqB,GAAG;AAC9F,WAAK,eAAe,MAAM,IAAI;AAAA,IAChC;AACA,SAAK,qBAAqB;AAC1B,SAAK,oBAAoB;AACzB,SAAK,YAAY,IAAI;AACrB,SAAK,iBAAiB;AACtB,SAAK,gBAAgB;AACrB,SAAK,KAAK,gBAAgB,QAAQ;AAAA,EACpC;AAAA,EAEA,kBAAwB;AACtB,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,QAAQ,SAAS;AACnB,WAAK,KAAK,SAAS,YAAY,WAAW,QAAQ,wBAAwB,QAAQ,sBAAsB;AACxG;AAAA,IACF;AACA,QAAI,KAAK,KAAK,SAAS,qBAAqB,MAAM,KAAK,CAAC,QAAQ,uBAAuB;AACrF,YAAM,WAAW,QAAQ,yBAAyB,KAAK,KAAK,uBAAuB;AACnF,WAAK,KAAK,SAAS,YAAY,UAAU,UAAU,QAAQ,sBAAsB;AACjF;AAAA,IACF;AACA,SAAK,KAAK,SAAS,YAAY;AAAA,EACjC;AAAA,EAEA,eAAe,UAAkB,OAAmC;AAClE,UAAM,SAAS,KAAK,KAAK,YAAY,UAAU,KAAK;AACpD,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,OAAO,KAAK,cAAc,MAAM;AACtC,UAAM,OAAO,KAAK,KAAK,YAAY,eAAe,IAAI;AACtD,UAAM,SAAS,KAAK,QAAQ,MAAM;AAClC,QAAI,SAAS,EAAG,QAAO;AACvB,UAAM,OAAO,KAAK,KAAK,WAAW,KAAK,QAAQ;AAC/C,QAAI,CAAC,QAAQ,KAAK,UAAU,YAAY,KAAK,SAAS,SAAU,QAAO;AACvE,WAAO,KAAK,MAAM,IAAI,IAAI,MAAM,KAAK;AAAA,EACvC;AAAA,EAEQ,uBAA6B;AACnC,SAAK,eAAe,WAAW;AAAA,EACjC;AAAA,EAEA,kBAA0C;AACxC,UAAM,WAAW,KAAK,KAAK,SAAS,qBAAqB;AACzD,UAAM,WAAW,KAAK,KAAK,YAAY,kBAAkB,EAAE;AAC3D,WAAO,KAAK,eAAe,UAAU,UAAU,QAAQ;AAAA,EACzD;AAAA,EAEA,4BAAoD;AAClD,UAAM,QAAQ,KAAK,gBAAgB;AACnC,QAAI,MAAO,QAAO;AAClB,UAAM,QAAQ,KAAK;AACnB,QAAI,OAAO;AACT,YAAM,KAAK,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK;AACzD,UAAI,MAAM,EAAG,QAAO,EAAE,IAAI,MAAM,UAAU,IAAI,IAAI,IAAI,MAAM,UAAU,IAAI,GAAG;AAAA,IAC/E;AACA,WAAO;AAAA,EACT;AAAA,EAEA,oBAA2F;AACzF,UAAM,QAAQ,KAAK,gBAAgB;AACnC,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,OAAO,KAAK,KAAK,YAAY,kBAAkB;AACrD,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,QAAQ,KAAK,MAAM,EAAE,GAAG,MAAM;AAAA,MAC9B,QAAQ,KAAK,MAAM,EAAE,GAAG,MAAM;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,gBAAwD;AACtD,UAAM,SAAS,KAAK,eAAe,UAAU;AAC7C,QAAI,QAAQ;AACV,aAAO,EAAE,KAAK,OAAO,KAAK,QAAQ,OAAO,OAAO;AAAA,IAClD;AACA,UAAM,QAAQ,KAAK,0BAA0B;AAC7C,WAAO,QAAQ,EAAE,KAAK,MAAM,IAAI,QAAQ,MAAM,GAAG,IAAI;AAAA,EACvD;AAAA,EAEA,sBAA4B;AAC1B,UAAM,MAAM,KAAK,gBAAgB;AACjC,SAAK,eAAe,MAAM;AAC1B,QAAI,KAAK;AACP,WAAK,gBAAgB,KAAK,IAAI;AAC9B,WAAK,iBAAiB;AACtB,WAAK,KAAK,KAAK,yBAAyB,EAAE,OAAO,KAAK,CAAC;AAAA,IACzD;AAAA,EACF;AAAA,EAEQ,gBACN,GACA,GACM;AACN,UAAM,UAAoB,CAAC;AAC3B,UAAM,UAAU,CAAC,MAAyC;AACxD,UAAI,CAAC,EAAG;AACR,eAAS,IAAI,EAAE,IAAI,KAAK,EAAE,IAAI,IAAK,SAAQ,KAAK,CAAC;AAAA,IACnD;AACA,YAAQ,CAAC;AACT,YAAQ,CAAC;AACT,QAAI,QAAQ,SAAS,EAAG,MAAK,YAAY,OAAO;AAAA,EAClD;AAAA,EAEA,WAAW,KAAa,QAAgB,QAAuB;AAC7D,UAAM,MAAM,KAAK,gBAAgB;AACjC,SAAK,eAAe,MAAM,EAAE,KAAK,OAAO,GAAG,MAAM;AACjD,UAAM,OAAO,KAAK,gBAAgB;AAClC,SAAK,gBAAgB,KAAK,IAAI;AAC9B,SAAK,iBAAiB;AACtB,SAAK,KAAK,KAAK,yBAAyB,EAAE,OAAO,KAAK,kBAAkB,EAAE,CAAC;AAAA,EAC7E;AAAA,EAEA,aAAa,KAAa,QAAsB;AAC9C,QAAI,CAAC,KAAK,eAAe,UAAU,GAAG;AACpC,YAAM,QAAQ,KAAK;AACnB,UAAI,CAAC,MAAO;AACZ,YAAM,MAAM,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK;AAC1D,UAAI,CAAC,KAAK,eAAe,aAAa,EAAE,KAAK,MAAM,UAAU,QAAQ,IAAI,CAAC,EAAG;AAAA,IAC/E;AACA,UAAM,WAAW,KAAK,KAAK,SAAS,qBAAqB;AACzD,UAAM,WAAW,KAAK,KAAK,YAAY,kBAAkB,EAAE;AAC3D,UAAM,MAAM,KAAK,gBAAgB;AACjC,SAAK,eAAe,OAAO;AAAA,MACzB,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,WAAW,CAAC,CAAC;AAAA,MAC5C,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,WAAW,CAAC,CAAC;AAAA,IACpD,CAAC;AACD,UAAM,OAAO,KAAK,gBAAgB;AAClC,SAAK,gBAAgB,KAAK,IAAI;AAC9B,SAAK,iBAAiB;AACtB,UAAM,OAAO,KAAK,KAAK,YAAY,kBAAkB;AACrD,UAAM,MAAM,KAAK,eAAe,OAAO;AACvC,QAAI,OAAO,IAAI,SAAS,KAAK,QAAQ;AACnC,WAAK,eAAe,IAAI,KAAK,KAAK,IAAI,MAAM,EAAE,EAAE;AAAA,IAClD;AACA,SAAK,KAAK,KAAK,yBAAyB,EAAE,OAAO,KAAK,kBAAkB,EAAE,CAAC;AAAA,EAC7E;AAAA,EAEQ,gBAAgB,MAAmB,UAAkB,QAAsB;AACjF,UAAM,QAAQ,KAAK,gBAAgB;AACnC,QAAI,CAAC,OAAO;AACV,UAAI,KAAK,UAAU,SAAS,kBAAkB,GAAG;AAC/C,aAAK,UAAU,OAAO,oBAAoB,wBAAwB,2BAA2B,yBAAyB,wBAAwB;AAAA,MAChJ;AACA;AAAA,IACF;AACA,UAAM,KAAK,KAAK,KAAK,YAAY,aAAa,OAAO,EAAE;AACvD,QAAI,KAAK,EAAG;AACZ,UAAM,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM;AAC9F,SAAK,UAAU,OAAO,oBAAoB,OAAO;AACjD,QAAI,SAAS;AACX,WAAK,UAAU,OAAO,wBAAwB,aAAa,MAAM,EAAE;AACnE,WAAK,UAAU,OAAO,2BAA2B,aAAa,MAAM,EAAE;AACtE,WAAK,UAAU,OAAO,yBAAyB,OAAO,MAAM,EAAE;AAC9D,WAAK,UAAU,OAAO,0BAA0B,OAAO,MAAM,EAAE;AAAA,IACjE,OAAO;AACL,WAAK,UAAU,OAAO,wBAAwB,2BAA2B,yBAAyB,wBAAwB;AAAA,IAC5H;AAAA,EACF;AAAA,EAeQ,mBAAgC;AACtC,QAAI,KAAK,aAAc,QAAO,KAAK;AACnC,UAAM,SAAS,GAAG,OAAO,kBAAkB;AAC3C,WAAO,MAAM,UAAU;AACvB,WAAO,iBAAiB,eAAe,CAAC,MAAM;AAC5C,WAAK,kBAAkB;AACvB,WAAK,iBAAiB,CAA0B;AAAA,IAClD,CAAC;AACD,WAAO,iBAAiB,aAAa,CAAC,MAAM;AAC1C,UAAI,KAAK,gBAAiB;AAC1B,WAAK,iBAAiB,CAAC;AAAA,IACzB,CAAC;AACD,SAAK,KAAK,SAAS,cAAc,OAAO,YAAY,MAAM;AAC1D,SAAK,eAAe;AACpB,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAyB;AAC/B,UAAM,SAAS,KAAK,iBAAiB;AACrC,UAAM,QAAQ,KAAK,gBAAgB;AACnC,QACE,CAAC,KAAK,KAAK,QAAQ,wBACnB,CAAC,KAAK,KAAK,QAAQ,cACnB,CAAC,OACD;AACA,aAAO,MAAM,UAAU;AACvB;AAAA,IACF;AACA,UAAM,KAAK,KAAK,KAAK;AACrB,UAAM,YAAY,GAAG,eAAe,MAAM,EAAE;AAC5C,UAAM,aAAa,GAAG,eAAe,QAAQ;AAC7C,QAAI,MAAM,KAAK,aAAa,MAAM,MAAM,YAAY,WAAW,QAAQ;AACrE,aAAO,MAAM,UAAU;AACvB;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,KAAK;AACzB,QAAI,IAAI;AACR,aAAS,IAAI,GAAG,KAAK,SAAS,IAAI,WAAW,QAAQ,IAAK,MAAK,WAAW,CAAC,EAAE;AAC7E,UAAM,SAAS,KAAK,UAAU,KAAK,IAAI,MAAM,KAAK,GAAG,KAAK,UAAU,SAAS,CAAC,CAAC,MAAM,MAAM,KAAK,KAAK,KAAK,KAAK,QAAQ;AACvH,WAAO,MAAM,UAAU;AACvB,WAAO,MAAM,OAAO,GAAG,IAAI,CAAC;AAC5B,WAAO,MAAM,MAAM,GAAG,SAAS,CAAC;AAAA,EAClC;AAAA,EAEQ,iBAAiB,GAAqB;AAC5C,QAAI,KAAK,KAAK,YAAY,KAAK,EAAE,WAAW,EAAG;AAC/C,UAAM,QAAQ,KAAK,gBAAgB;AACnC,QAAI,CAAC,MAAO;AACZ,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,SAAK,WAAW;AAAA,MACd,IAAI,MAAM;AAAA,MACV,IAAI,MAAM;AAAA,MACV,IAAI,MAAM;AAAA,MACV,IAAI,MAAM;AAAA,MACV,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AACA,WAAO,iBAAiB,eAAe,KAAK,UAAU;AACtD,WAAO,iBAAiB,aAAa,KAAK,UAAU;AACpD,WAAO,iBAAiB,aAAa,KAAK,QAAQ;AAClD,WAAO,iBAAiB,WAAW,KAAK,QAAQ;AAChD,WAAO,iBAAiB,iBAAiB,KAAK,QAAQ;AAAA,EACxD;AAAA,EAEQ,cAAc,GAAuB;AAC3C,UAAM,YAAY,KAAK,KAAK,SAAS,cAAc;AACnD,UAAM,OAAO,UAAU,sBAAsB;AAC7C,UAAM,IAAI,EAAE,UAAU,KAAK;AAC3B,UAAM,WAAW,KAAK,KAAK,SAAS,qBAAqB;AACzD,UAAM,MAAM,WAAW,KAAK,WAAW,GAAG,QAAQ;AAClD,WAAO,KAAK,IAAI,KAAK,SAAU,IAAI,KAAK,IAAI,KAAK,WAAW,CAAC,CAAC;AAAA,EAChE;AAAA,EAEQ,cAAc,GAAuB;AAC3C,UAAM,YAAY,KAAK,KAAK,SAAS,cAAc;AACnD,UAAM,OAAO,UAAU,sBAAsB;AAC7C,UAAM,IAAI,EAAE,UAAU,KAAK;AAC3B,UAAM,KAAK,KAAK,KAAK;AACrB,UAAM,YAAY,GAAG,eAAe,MAAM,EAAE;AAC5C,UAAM,aAAa,GAAG,eAAe,QAAQ;AAC7C,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,UAAI,IAAI,MAAM,WAAW,CAAC,EAAE,eAAe,EAAG,QAAO,YAAY;AACjE,aAAO,WAAW,CAAC,EAAE;AAAA,IACvB;AACA,WAAO,YAAY,WAAW,SAAS;AAAA,EACzC;AAAA,EAIQ,iBAAuB;AAC7B,SAAK,WAAW;AAChB,SAAK,kBAAkB;AACvB,WAAO,oBAAoB,eAAe,KAAK,UAAU;AACzD,WAAO,oBAAoB,aAAa,KAAK,UAAU;AACvD,WAAO,oBAAoB,aAAa,KAAK,QAAQ;AACrD,WAAO,oBAAoB,WAAW,KAAK,QAAQ;AACnD,WAAO,oBAAoB,iBAAiB,KAAK,QAAQ;AACzD,SAAK,KAAK,SAAS,KAAK,UAAU,OAAO,oBAAoB;AAAA,EAC/D;AAAA,EAwCQ,eACN,IACA,IACA,IACA,IACA,WACM;AACN,UAAM,OAAO,KAAK,KAAK,YAAY,kBAAkB;AACrD,UAAM,cAAc,oBAAI,IAAY;AACpC,SAAK,KAAK,YAAY,WAAW;AACjC,QAAI;AACF,eAAS,IAAI,IAAI,KAAK,IAAI,KAAK;AAC7B,cAAM,UAAU,KAAK,KAAK,SAAS,gBAAgB,CAAC;AACpD,YAAI,CAAC,WAAW,QAAQ,YAAY,QAAQ,QAAS;AACrD,cAAM,UAAiB,CAAC;AACxB,iBAAS,IAAI,IAAI,KAAK,IAAI,KAAK;AAC7B,gBAAM,MAAM,KAAK,CAAC;AAClB,kBAAQ,KAAK,MAAM,KAAK,KAAK,aAAa,SAAS,GAAG,IAAI,MAAS;AAAA,QACrE;AACA,cAAM,IAAI,KAAK,KAAK;AACpB,cAAM,aACJ,IAAI,KAAK,QAAQ,MAAM,CAAC,MAAM,OAAO,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;AAClE,cAAM,OAAO,cAAc,QAAQ,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,IAAI,KAAK;AACpE,cAAM,aACJ,CAAC,cAAc,QAAQ,MAAM,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAEzD,iBAAS,IAAI,KAAK,GAAG,KAAK,WAAW,KAAK;AACxC,gBAAM,MAAM,KAAK,CAAC;AAClB,cAAI,CAAC,OAAO,IAAI,eAAe,IAAI,kBAAkB,IAAI,OAAO,QAAS;AACzE,cAAI,CAAC,KAAK,KAAK,eAAe,WAAW,SAAS,GAAG,EAAG;AACxD,gBAAM,YAAY,IAAI;AACtB,cAAI;AACJ,cAAI,MAAM,GAAG;AACX,oBAAQ,QAAQ,CAAC;AAAA,UACnB,WAAW,YAAY;AACrB,kBAAM,QAAQ,aAAa,IAAI;AAC/B,oBAAQ,QAAQ,IAAI,CAAC,IAAI,OAAO;AAChC,oBAAQ,aAAa,KAAK,MAAM,KAAK,IAAI,KAAK,MAAM,QAAQ,GAAG,IAAI;AAAA,UACrE,OAAO;AACL,oBAAQ,QAAQ,YAAY,CAAC;AAAA,UAC/B;AACA,gBAAM,MAAM,KAAK,KAAK,aAAa,SAAS,GAAG;AAC/C,cAAI,KAAK,KAAK,aAAa,SAAS,KAAK,OAAO,GAAG,EAAG,aAAY,IAAI,CAAC;AAAA,QACzE;AAAA,MACF;AAAA,IACF,UAAE;AACA,WAAK,KAAK,YAAY,SAAS;AAAA,IACjC;AAEA,QAAI,YAAY,OAAO,GAAG;AACxB,WAAK,YAAY,CAAC,GAAG,WAAW,CAAC;AACjC,WAAK,KAAK,gBAAgB,QAAQ;AAClC,WAAK,KAAK,KAAK,yBAAyB,EAAE,OAAO,KAAK,kBAAkB,EAAE,CAAC;AAAA,IAC7E;AAAA,EACF;AAAA,EA+CQ,WAAW,IAAY,IAAY,IAAY,IAAY,WAAyB;AAC1F,UAAM,OAAO,KAAK,KAAK,YAAY,kBAAkB;AACrD,UAAM,cAAc,oBAAI,IAAY;AACpC,SAAK,KAAK,YAAY,WAAW;AACjC,QAAI;AACF,WAAK,gBAAgB,IAAI,IAAI,IAAI,IAAI,WAAW,MAAM,WAAW;AAAA,IACnE,UAAE;AACA,WAAK,KAAK,YAAY,SAAS;AAAA,IACjC;AAEA,QAAI,YAAY,OAAO,GAAG;AACxB,WAAK,YAAY,CAAC,GAAG,WAAW,CAAC;AACjC,WAAK,KAAK,gBAAgB,QAAQ;AAClC,WAAK,KAAK,KAAK,yBAAyB,EAAE,OAAO,KAAK,kBAAkB,EAAE,CAAC;AAAA,IAC7E;AAAA,EACF;AAAA,EAEQ,gBACN,IACA,IACA,IACA,IACA,WACA,MACA,aACM;AACN,aAAS,IAAI,IAAI,KAAK,IAAI,KAAK;AAC7B,YAAM,MAAM,KAAK,CAAC;AAClB,UAAI,CAAC,OAAO,IAAI,eAAe,IAAI,kBAAkB,IAAI,OAAO,QAAS;AAEzE,YAAM,UAAiB,CAAC;AACxB,UAAI,aAAa,KAAK;AACtB,eAAS,IAAI,IAAI,KAAK,IAAI,KAAK;AAC7B,cAAM,OAAO,KAAK,KAAK,SAAS,gBAAgB,CAAC;AACjD,YAAI,CAAC,MAAM;AACT,uBAAa;AACb,kBAAQ,KAAK,MAAS;AACtB;AAAA,QACF;AACA,cAAM,IAAI,KAAK,KAAK,aAAa,MAAM,GAAG;AAC1C,gBAAQ,KAAK,CAAC;AACd,YAAI,OAAO,MAAM,YAAY,MAAM,CAAC,EAAG,cAAa;AAAA,MACtD;AACA,UAAI,QAAQ,CAAC,MAAM,UAAa,QAAQ,WAAW,EAAG;AAEtD,YAAM,IAAI,KAAK,KAAK;AACpB,UAAI,OAAO;AACX,UAAI,aAAa;AACjB,UAAI,YAAY;AACd,gBAAQ,QAAQ,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,IAAI;AAC5C,mBAAW,KAAK,QAAS,KAAI,CAAC,OAAO,UAAU,CAAC,EAAG,cAAa;AAAA,MAClE;AAEA,eAAS,IAAI,KAAK,GAAG,KAAK,WAAW,KAAK;AACxC,cAAM,OAAO,KAAK,KAAK,SAAS,gBAAgB,CAAC;AACjD,YAAI,CAAC,QAAQ,KAAK,YAAY,KAAK,QAAS;AAC5C,YAAI,CAAC,KAAK,KAAK,eAAe,WAAW,MAAM,GAAG,EAAG;AACrD,YAAI;AACJ,YAAI,MAAM,GAAG;AACX,kBAAQ,QAAQ,CAAC;AAAA,QACnB,WAAW,YAAY;AACrB,gBAAM,QAAQ,IAAI;AAClB,kBAAQ,QAAQ,IAAI,CAAC,IAAI,OAAO;AAChC,kBAAQ,aAAa,KAAK,MAAM,KAAK,IAAI,KAAK,MAAM,QAAQ,GAAG,IAAI;AAAA,QACrE,OAAO;AACL,kBAAQ,SAAS,IAAI,MAAM,CAAC;AAAA,QAC9B;AACA,cAAM,MAAM,KAAK,KAAK,aAAa,MAAM,GAAG;AAC5C,YAAI,KAAK,KAAK,aAAa,MAAM,KAAK,OAAO,GAAG,EAAG,aAAY,IAAI,CAAC;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAAe,UAAyB,OAA4B;AAClE,SAAK,gBAAgB;AACrB,QAAI,YAAY,QAAQ,SAAS,MAAM;AACrC,WAAK,cAAc;AACnB;AAAA,IACF;AACA,SAAK,cAAc,EAAE,UAAU,MAAM;AACrC,SAAK,gBAAgB;AACrB,SAAK,yBAAyB;AAAA,EAChC;AAAA,EAEQ,kBAAwB;AAC9B,QAAI,CAAC,KAAK,YAAa;AACvB,UAAM,OAAO,KAAK,eAAe,KAAK,YAAY,UAAU,KAAK,YAAY,KAAK;AAClF,QAAI,KAAM,MAAK,UAAU,IAAI,kBAAkB;AAAA,EACjD;AAAA,EAEQ,kBAAwB;AAC9B,QAAI,CAAC,KAAK,YAAa;AACvB,UAAM,OAAO,KAAK,eAAe,KAAK,YAAY,UAAU,KAAK,YAAY,KAAK;AAClF,QAAI,KAAM,MAAK,UAAU,OAAO,kBAAkB;AAAA,EACpD;AAAA,EAEQ,2BAAiC;AACvC,QAAI,CAAC,KAAK,YAAa;AACvB,SAAK,cAAc,KAAK,YAAY,UAAU,SAAS;AAEvD,UAAM,SAAS,KAAK,KAAK,YAAY,UAAU,KAAK,YAAY,KAAK;AACrE,QAAI,CAAC,UAAU,OAAO,OAAQ;AAC9B,UAAM,WAAW,KAAK,KAAK,SAAS,cAAc;AAClD,QAAI,IAAI;AACR,eAAW,OAAO,KAAK,KAAK,YAAY,eAAe,QAAQ,GAAG;AAChE,UAAI,IAAI,OAAO,OAAO,GAAI;AAC1B,WAAK,IAAI;AAAA,IACX;AACA,UAAM,OAAO,SAAS;AACtB,UAAM,QAAQ,SAAS;AACvB,QAAI,IAAI,KAAM,UAAS,aAAa;AAAA,aAC3B,IAAI,OAAO,eAAe,OAAO,OAAO;AAC/C,eAAS,aAAa,IAAI,OAAO,eAAe;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,cAAc,UAAkB,WAAoD,OAAa;AAC/F,UAAM,WAAW,KAAK,KAAK,SAAS,cAAc;AAClD,UAAM,WAAW,KAAK,KAAK,SAAS,qBAAqB;AACzD,QAAI,aAAa,EAAG;AACpB,UAAM,QAAQ,MAAM,UAAU,GAAG,WAAW,CAAC;AAC7C,UAAM,iBAAiB,SAAS;AAChC,UAAM,YAAY,SAAS;AAC3B,UAAM,SAAS,KAAK,UAAU,KAAK;AACnC,UAAM,YAAY,KAAK,UAAU,QAAQ,CAAC;AAE1C,QAAI,SAAS;AACb,QAAI,aAAa,OAAO;AACtB,eAAS;AAAA,IACX,WAAW,aAAa,UAAU;AAChC,eAAS,YAAY;AAAA,IACvB,WAAW,aAAa,UAAU;AAChC,eAAS,UAAU,kBAAkB,YAAY,WAAW;AAAA,IAC9D,OAAO;AACL,UAAI,SAAS,UAAW,UAAS;AAAA,eACxB,YAAY,YAAY,eAAgB,UAAS,YAAY;AAAA,IACxE;AAEA,UAAM,YAAY,KAAK,IAAI,GAAG,KAAK,UAAU,QAAQ,IAAI,cAAc;AACvE,aAAS,YAAY,MAAM,QAAQ,GAAG,SAAS;AAAA,EACjD;AAAA,EAEQ,cAAc,OAAqB;AACzC,QAAI,KAAK,eAAe,MAAO;AAC/B,UAAM,OAAO,KAAK;AAClB,SAAK,aAAa;AAClB,SAAK,YAAY,MAAM,KAAK;AAC5B,SAAK,YAAY,OAAO,IAAI;AAAA,EAC9B;AAAA,EAEQ,YAAY,OAAe,OAAsB;AACvD,QAAI,QAAQ,EAAG;AACf,UAAM,OAAO,KAAK,KAAK,QAAQ,KAAK,QAAQ;AAC5C,QAAI,CAAC,QAAQ,KAAK,UAAU,SAAS,KAAK,SAAS,SAAU;AAC7D,eAAW,QAAQ,OAAO;AACxB,WAAK,KAAK,IAAI,GAAG,UAAU,OAAO,mBAAmB,KAAK;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,gBAAsB;AACpB,SAAK,KAAK,SAAS,KAAK,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,EACvD;AAAA,EAEQ,mBAAmB,GAAyF;AAClH,UAAM,SAAS,EAAE;AACjB,UAAM,QAAQ,OAAO,QAAqB,WAAW;AACrD,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,QAAQ,OAAO,MAAM,QAAQ,KAAK;AACxC,QAAI,OAAO,MAAM,KAAK,EAAG,QAAO;AAChC,UAAM,OAAO,KAAK,KAAK,SAAS,gBAAgB,KAAK;AACrD,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,SAAS,OAAO,QAAqB,YAAY;AACvD,WAAO,EAAE,MAAM,OAAO,OAAO;AAAA,EAC/B;AAAA,EA6EQ,qBAA6B;AACnC,eAAW,OAAO,KAAK,KAAK,YAAY,kBAAkB,GAAG;AAC3D,UAAI,IAAI,YAAa,QAAO,IAAI;AAAA,IAClC;AACA,WAAO,KAAK,KAAK,YAAY,kBAAkB,EAAE,CAAC,GAAG,MAAM;AAAA,EAC7D;AAmHF;;;AC5oDO,IAAM,kBAAN,MAAsB;AAAA,EAK3B,YAAoB,MAAsB;AAAtB;AAJpB,SAAQ,WAA+B;AACvC,SAAQ,OAAsC,EAAE,MAAM,QAAY,QAAQ,QAAY,OAAO,OAAW;AACxG,SAAQ,cAA+C,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EAE9C;AAAA,EAE3C,OAAa;AACX,SAAK,WAAW,GAAG,OAAO,aAAa;AACvC,SAAK,SAAS,MAAM,UAAU;AAC9B,SAAK,SAAS,aAAa,QAAQ,KAAK;AACxC,SAAK,KAAK,SAAS,KAAK,YAAY,KAAK,QAAQ;AACjD,eAAW,QAAQ,CAAC,QAAQ,UAAU,OAAO,GAAiB;AAC5D,YAAM,MAAM,GAAG,OAAO,oCAAoC,IAAI,EAAE;AAChE,UAAI,MAAM,SAAS,GAAG,KAAK,KAAK,QAAQ,SAAS;AACjD,WAAK,SAAS,YAAY,GAAG;AAC7B,WAAK,KAAK,IAAI,IAAI;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,WAAW,SAAwB;AACjC,QAAI,CAAC,KAAK,SAAU;AACpB,SAAK,SAAS,MAAM,UAAU,UAAU,KAAK;AAAA,EAC/C;AAAA,EAEA,UAAgB;AACd,QAAI,CAAC,KAAK,YAAY,KAAK,KAAK,YAAY,EAAG;AAC/C,UAAM,OAAO,KAAK,KAAK,QAAQ;AAC/B,SAAK,WAAW,IAAI;AACpB,QAAI,CAAC,KAAM;AAEX,UAAM,SAAS,KAAK,KAAK,QAAQ;AACjC,UAAM,aAAa,KAAK,KAAK,SAAS,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,EAAE,OAAO;AAChG,UAAM,SAAS,EAAE,GAAG,gBAAgB,GAAG,KAAK,KAAK,QAAQ,OAAO;AAEhE,eAAW,QAAQ,CAAC,QAAQ,UAAU,OAAO,GAAiB;AAC5D,YAAM,OAAO,KAAK,KAAK,YAAY,eAAe,IAAI;AACtD,YAAM,MAAM,KAAK,KAAK,IAAI;AAC1B,UAAI,KAAK,YAAY,IAAI,EAAE,WAAW,KAAK,QAAQ;AACjD,YAAI,cAAc;AAClB,aAAK,YAAY,IAAI,IAAI,KAAK,IAAI,MAAM;AACtC,gBAAM,OAAO,GAAG,OAAO,kBAAkB;AACzC,eAAK,aAAa,QAAQ,MAAM;AAChC,cAAI,YAAY,IAAI;AACpB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AACA,UAAI,IAAI;AACR,WAAK,QAAQ,CAAC,KAAK,MAAM;AACvB,cAAM,OAAO,KAAK,YAAY,IAAI,EAAE,CAAC;AACrC,aAAK,MAAM,OAAO,GAAG,CAAC;AACtB,aAAK,MAAM,QAAQ,GAAG,IAAI,YAAY;AACtC,aAAK,IAAI;AAET,YAAI,IAAI,eAAe,IAAI,kBAAkB,IAAI,OAAO,SAAS;AAC/D,eAAK,cAAc;AACnB;AAAA,QACF;AACA,YAAI,QAAQ;AACV,cAAI;AACF,iBAAK,cAAc,OAAO;AAAA,cACxB,OAAO,IAAI;AAAA,cACX,QAAQ;AAAA,cACR,QAAQ,WAAW,IAAI,CAAC,SAAS,KAAK,KAAK,aAAa,MAAM,GAAG,CAAC;AAAA,YACpE,CAAC;AAAA,UACH,SAAS,OAAO;AACd,iBAAK,KAAK,YAAY,OAAO,iBAAiB,EAAE,OAAO,IAAI,GAAG,CAAC;AAC/D,iBAAK,cAAc;AAAA,UACrB;AAAA,QACF,WAAW,MAAM,KAAK,SAAS,QAAQ;AACrC,eAAK,cAAc,WAAW,OAAO,gBAAgB,WAAW,MAAM;AAAA,QACxE,OAAO;AACL,eAAK,cAAc;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,UAAgB;AACd,SAAK,UAAU,OAAO;AACtB,SAAK,WAAW;AAAA,EAClB;AACF;;;ACnFO,IAAM,gBAAN,MAAoB;AAAA,EAWzB,YAAoB,MAAyB;AAAzB;AAVpB,SAAQ,QAA4B;AACpC,SAAQ,UAA8B;AACtC,SAAQ,SAA6B;AACrC,SAAQ,aAAuC;AAC/C,SAAQ,WAAqC;AAC7C,SAAQ,UAAoC;AAC5C,SAAQ,UAAoC;AAC5C,SAAQ,UAAoC;AAC5C,SAAQ,OAAuB,CAAC;AAAA,EAEc;AAAA,EAE9C,OAAa;AACX,SAAK,QAAQ,GAAG,OAAO,iBAAiB;AACxC,SAAK,MAAM,MAAM,UAAU;AAC3B,SAAK,MAAM,aAAa,QAAQ,YAAY;AAE5C,UAAM,QAAQ,CAAC,KAAa,OAAe,SAAoC;AAC7E,YAAM,MAAM,GAAG,UAAU,uBAAuB,GAAG,EAAE;AACrD,UAAI,OAAO;AACX,UAAI,QAAQ;AACZ,UAAI,aAAa,cAAc,KAAK;AACpC,UAAI,cAAc;AAClB,aAAO;AAAA,IACT;AAEA,SAAK,UAAU,GAAG,QAAQ,uBAAuB;AACjD,SAAK,WAAW,MAAM,yBAAyB,KAAK,EAAE,WAAW,GAAG,MAAG;AACvE,SAAK,UAAU,MAAM,wBAAwB,KAAK,EAAE,UAAU,GAAG,QAAG;AACpE,SAAK,SAAS,GAAG,QAAQ,sBAAsB;AAC/C,SAAK,UAAU,MAAM,wBAAwB,KAAK,EAAE,UAAU,GAAG,QAAG;AACpE,SAAK,UAAU,MAAM,wBAAwB,KAAK,EAAE,UAAU,GAAG,MAAG;AAEpE,SAAK,SAAS,iBAAiB,SAAS,MAAM,KAAK,KAAK,SAAS,QAAQ,CAAC,CAAC;AAC3E,SAAK,QAAQ,iBAAiB,SAAS,MAAM,KAAK,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,eAAe,IAAI,CAAC,CAAC;AAChH,SAAK,QAAQ,iBAAiB,SAAS,MAAM,KAAK,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,eAAe,IAAI,CAAC,CAAC;AAChH,SAAK,QAAQ,iBAAiB,SAAS,MAAM,KAAK,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,aAAa,CAAC,CAAC;AAE1G,SAAK,MAAM,OAAO,KAAK,SAAS,KAAK,UAAU,KAAK,SAAS,KAAK,QAAQ,KAAK,SAAS,KAAK,OAAO;AAEpG,QAAI,KAAK,KAAK,QAAQ,4BAA4B;AAChD,WAAK,aAAa,SAAS,cAAc,QAAQ;AACjD,WAAK,WAAW,YAAY;AAC5B,WAAK,WAAW,aAAa,cAAc,WAAW;AACtD,WAAK,iBAAiB;AACtB,WAAK,WAAW,iBAAiB,UAAU,MAAM;AAC/C,cAAM,OAAO,OAAO,KAAK,WAAY,KAAK;AAC1C,YAAI,CAAC,OAAO,MAAM,IAAI,EAAG,MAAK,KAAK,SAAS,YAAY,IAAI;AAAA,MAC9D,CAAC;AACD,WAAK,MAAM,YAAY,KAAK,UAAU;AAAA,IACxC;AAEA,SAAK,KAAK,SAAS,KAAK,YAAY,KAAK,KAAK;AAE9C,SAAK,KAAK;AAAA,MACR,KAAK,KAAK,SAAS,GAAG,gBAAgB,MAAM,KAAK,QAAQ,CAAC;AAAA,MAC1D,KAAK,KAAK,SAAS,GAAG,qBAAqB,MAAM,KAAK,QAAQ,CAAC;AAAA,IACjE;AACA,SAAK,QAAQ;AAAA,EACf;AAAA,EAEQ,mBAAyB;AAC/B,QAAI,CAAC,KAAK,WAAY;AACtB,UAAM,UAAU,KAAK,KAAK,QAAQ;AAClC,UAAM,UAAU,KAAK,KAAK,QAAQ;AAClC,QAAI,CAAC,QAAQ,SAAS,OAAO,GAAG;AAC9B,cAAQ,KAAK,OAAO;AACpB,cAAQ,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,IAC9B;AACA,SAAK,WAAW,cAAc;AAC9B,eAAW,QAAQ,SAAS;AAC1B,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,QAAQ,OAAO,IAAI;AAC1B,aAAO,cAAc,WAAW,KAAK,EAAE,SAAS,GAAG,IAAI;AACvD,UAAI,SAAS,QAAS,QAAO,WAAW;AACxC,WAAK,WAAW,YAAY,MAAM;AAAA,IACpC;AAAA,EACF;AAAA,EAEQ,EAAE,KAA4D;AACpE,WAAO,KAAK,KAAK,QAAQ,SAAS,GAAG,KAAK,eAAe,GAAG;AAAA,EAC9D;AAAA,EAEA,UAAgB;AACd,QAAI,CAAC,KAAK,MAAO;AACjB,QAAI,KAAK,cAAc,KAAK,KAAK,QAAQ,4BAA4B;AACnE,WAAK,iBAAiB;AAAA,IACxB;AACA,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,UAAgB;AACd,QAAI,CAAC,KAAK,SAAS,KAAK,KAAK,YAAY,EAAG;AAC5C,UAAM,KAAK,KAAK,KAAK;AACrB,UAAM,SAAS,GAAG;AAClB,UAAM,QAAQ,GAAG,iBAAiB;AAClC,UAAM,UAAU,UAAU,QAAQ;AAClC,SAAK,MAAM,MAAM,UAAU,UAAU,KAAK;AAC1C,QAAI,CAAC,QAAS;AAEd,UAAM,OAAO,GAAG,eAAe;AAC/B,UAAM,YAAY,GAAG,aAAa;AAElC,QAAI,KAAK,WAAW,KAAK,KAAK,QAAQ,qBAAqB;AACzD,YAAM,OAAO,WAAW,KAAK,EAAE,iBAAiB,GAAG,KAAK;AACxD,UAAI,KAAK,QAAQ,gBAAgB,KAAM,MAAK,QAAQ,cAAc;AAAA,IACpE;AACA,QAAI,KAAK,QAAQ;AACf,YAAM,OAAO,UAAU,KAAK,EAAE,gBAAgB,GAAG,MAAM,SAAS;AAChE,UAAI,KAAK,OAAO,gBAAgB,KAAM,MAAK,OAAO,cAAc;AAAA,IAClE;AACA,QAAI,KAAK,SAAU,MAAK,SAAS,WAAW,QAAQ;AACpD,QAAI,KAAK,QAAS,MAAK,QAAQ,WAAW,QAAQ;AAClD,QAAI,KAAK,QAAS,MAAK,QAAQ,WAAW,QAAQ;AAClD,QAAI,KAAK,QAAS,MAAK,QAAQ,WAAW,QAAQ;AAClD,QAAI,KAAK,cAAc,OAAO,KAAK,WAAW,KAAK,MAAM,KAAK,KAAK,QAAQ,oBAAoB;AAC7F,WAAK,WAAW,QAAQ,OAAO,KAAK,KAAK,QAAQ,kBAAkB;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,UAAgB;AACd,eAAW,OAAO,KAAK,KAAM,KAAI;AACjC,SAAK,OAAO,CAAC;AACb,SAAK,OAAO,OAAO;AACnB,SAAK,QAAQ;AAAA,EACf;AACF;;;ACrHA,IAAMC,SAAoB,CAAC,QAAQ,UAAU,OAAO;AAW7C,IAAM,qBAAN,MAAyB;AAAA,EAI9B,YAAoB,MAAyB;AAAzB;AAHpB,SAAQ,MAAwB;AAChC,SAAQ,SAA2B;AAAA,EAEW;AAAA,EAE9C,OAAa;AACX,SAAK,MAAM,KAAK,WAAW,KAAK,KAAK,SAAS,WAAW;AACzD,SAAK,SAAS,KAAK,WAAW,KAAK,KAAK,SAAS,cAAc;AAAA,EACjE;AAAA,EAEQ,WAAW,MAA8B;AAC/C,UAAM,QAAmB;AAAA,MACvB;AAAA,MACA,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,EAAE;AAAA,MACjE,gBAAgB,GAAG,OAAO,sBAAsB;AAAA,MAChD,aAAa,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,MAC/C,OAAO,CAAC;AAAA,MACR,MAAM,CAAC;AAAA,IACT;AACA,eAAW,QAAQA,QAAO;AACxB,YAAM,SAAS,IAAI,EAAE,YAAY,oCAAoC,IAAI;AACzE,UAAI,SAAS,SAAU,OAAM,SAAS,IAAI,EAAE,UAAU,IAAI,mBAAmB;AAC7E,UAAI,SAAS,UAAU;AACrB,cAAM,eAAe,YAAY,MAAM,SAAS,IAAI,CAAC;AAAA,MACvD;AAAA,IACF;AACA,SAAK,OAAO,MAAM,SAAS,MAAM,MAAM,gBAAgB,MAAM,SAAS,KAAK;AAC3E,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,KAAmB,QAA4B;AACrD,QAAI,KAAK,KAAK,YAAY,KAAK,CAAC,KAAK,OAAO,CAAC,KAAK,OAAQ;AAC1D,SAAK,IAAI,OAAO,OAAO,CAAC;AACxB,SAAK,OAAO,OAAO,UAAU,CAAC;AAC9B,SAAK,QAAQ;AACb,SAAK,YAAY;AACjB,SAAK,KAAK,SAAS;AAAA,EACrB;AAAA,EAEA,WAAW,MAA0B;AACnC,QAAI,KAAK,KAAK,YAAY,KAAK,CAAC,KAAK,IAAK;AAC1C,SAAK,IAAI,OAAO,QAAQ,CAAC;AACzB,SAAK,YAAY,KAAK,KAAK,KAAK;AAChC,SAAK,YAAY;AACjB,SAAK,KAAK,SAAS;AAAA,EACrB;AAAA,EAEA,cAAc,MAA0B;AACtC,QAAI,KAAK,KAAK,YAAY,KAAK,CAAC,KAAK,OAAQ;AAC7C,SAAK,OAAO,OAAO,QAAQ,CAAC;AAC5B,SAAK,YAAY,KAAK,QAAQ,QAAQ;AACtC,SAAK,YAAY;AACjB,SAAK,KAAK,SAAS;AAAA,EACrB;AAAA,EAEA,aAAoB;AAClB,WAAO,KAAK,MAAM,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;AAAA,EAC7C;AAAA,EAEA,gBAAuB;AACrB,WAAO,KAAK,SAAS,KAAK,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,EACnD;AAAA,EAEA,UAAgB;AACd,QAAI,CAAC,KAAK,OAAO,CAAC,KAAK,OAAQ;AAC/B,SAAK,YAAY,KAAK,KAAK,KAAK;AAChC,SAAK,YAAY,KAAK,QAAQ,QAAQ;AAAA,EACxC;AAAA,EAEQ,YAAY,MAAiB,UAAkC;AACrE,eAAW,OAAO,KAAK,OAAO;AAC5B,iBAAW,QAAQA,QAAO;AACxB,mBAAW,QAAQ,IAAI,IAAI,EAAG,oBAAmB,KAAK,MAAM,IAAI;AAAA,MAClE;AAAA,IACF;AACA,eAAW,QAAQA,QAAO;AACxB,iBAAW,WAAW,KAAK,YAAY,IAAI,EAAG,SAAQ,OAAO;AAC7D,WAAK,YAAY,IAAI,IAAI,CAAC;AAAA,IAC5B;AACA,SAAK,QAAQ,CAAC;AACd,SAAK,KAAK,MAAM,UAAU,KAAK,KAAK,SAAS,IAAI,KAAK;AACtD,QAAI,KAAK,KAAK,WAAW,EAAG;AAE5B,UAAM,YAAY,KAAK,KAAK,QAAQ;AACpC,UAAM,KAAK,KAAK,KAAK;AAErB,SAAK,KAAK,QAAQ,CAAC,MAAM,MAAM;AAC7B,YAAM,OAAqB;AAAA,QACzB,IAAI,YAAY,QAAQ,IAAI,CAAC;AAAA,QAC7B;AAAA,QACA,UAAU;AAAA,QACV,UAAU;AAAA,MACZ;AACA,YAAM,cAAc,CAAC;AACrB,iBAAW,QAAQA,QAAO;AACxB,cAAM,UAAU,GAAG,OAAO,iBAAiB;AAC3C,gBAAQ,MAAM,SAAS,GAAG,SAAS;AACnC,gBAAQ,aAAa,QAAQ,KAAK;AAClC,oBAAY,IAAI,IAAI,CAAC;AACrB,mBAAW,OAAO,GAAG,eAAe,IAAI,GAAG;AACzC,gBAAM,OAAO,GAAG,OAAO,WAAW;AAClC,eAAK,QAAQ,QAAQ,IAAI;AACzB,eAAK,aAAa,QAAQ,UAAU;AACpC,cAAI,IAAI,YAAa,MAAK,UAAU,IAAI,sBAAsB;AAC9D,cAAI,CAAC,IAAI,eAAe,CAAC,IAAI,kBAAkB,CAAC,IAAI,OAAO,WAAW,IAAI,OAAO,SAAS,SAAS;AACjG,gBAAI;AACF,gCAAkB,KAAK,MAAM,MAAM,MAAM,GAAG;AAC5C,+BAAiB,KAAK,MAAM,MAAM,MAAM,GAAG;AAC3C,6BAAe,KAAK,MAAM,MAAM,MAAM,GAAG;AAAA,YAC3C,SAAS,KAAK;AACZ,mBAAK,KAAK,YAAY,KAAK,oBAAoB,EAAE,OAAO,IAAI,IAAI,MAAM,UAAU,UAAU,EAAE,CAAC;AAAA,YAC/F;AAAA,UACF;AACA,kBAAQ,YAAY,IAAI;AACxB,sBAAY,IAAI,EAAE,KAAK,IAAI;AAAA,QAC7B;AACA,aAAK,SAAS,IAAI,EAAE,YAAY,OAAO;AACvC,aAAK,YAAY,IAAI,EAAE,KAAK,OAAO;AAAA,MACrC;AACA,WAAK,MAAM,KAAK,WAAW;AAAA,IAC7B,CAAC;AAAA,EACH;AAAA,EAEA,cAAoB;AAClB,QAAI,CAAC,KAAK,OAAO,CAAC,KAAK,OAAQ;AAC/B,UAAM,KAAK,KAAK,KAAK;AACrB,UAAM,SAAmC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,EAAE;AACxE,UAAM,QAAoC,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAC5E,eAAW,QAAQA,QAAO;AACxB,UAAI,IAAI;AACR,iBAAW,OAAO,GAAG,eAAe,IAAI,GAAG;AACzC,cAAM,IAAI,EAAE,KAAK,CAAC;AAClB,aAAK,IAAI;AAAA,MACX;AACA,aAAO,IAAI,IAAI;AAAA,IACjB;AAEA,eAAW,QAAQ,CAAC,KAAK,KAAK,KAAK,MAAM,GAAG;AAC1C,YAAM,SAAS,KAAK,KAAK,WAAW;AACpC,WAAK,SAAS,KAAK,UAAU,OAAO,qBAAqB,UAAU,OAAO,QAAQ,CAAC;AACnF,WAAK,SAAS,MAAM,UAAU,OAAO,qBAAqB,UAAU,OAAO,SAAS,CAAC;AACrF,WAAK,SAAS,KAAK,MAAM,QAAQ,GAAG,OAAO,IAAI;AAC/C,WAAK,SAAS,MAAM,MAAM,QAAQ,GAAG,OAAO,KAAK;AACjD,WAAK,SAAS,OAAO,MAAM,QAAQ,GAAG,OAAO,MAAM;AACnD,WAAK,MAAM,QAAQ,CAAC,gBAAgB;AAClC,YAAI,kBAAkB;AACtB,mBAAW,QAAQA,QAAO;AACxB,gBAAM,OAAO,GAAG,eAAe,IAAI;AACnC,sBAAY,IAAI,EAAE,QAAQ,CAAC,MAAM,MAAM;AACrC,iBAAK,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,YAAY;AAC1C,iBAAK,MAAM,OAAO,GAAG,MAAM,IAAI,EAAE,CAAC,CAAC;AACnC,iBAAK,aAAa,iBAAiB,OAAO,kBAAkB,IAAI,CAAC,CAAC;AAAA,UACpE,CAAC;AACD,6BAAmB,KAAK;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,aAAa,YAA0B;AACrC,QAAI,KAAK,IAAK,MAAK,IAAI,SAAS,OAAO,MAAM,YAAY,cAAc,CAAC,UAAU;AAClF,QAAI,KAAK,OAAQ,MAAK,OAAO,SAAS,OAAO,MAAM,YAAY,cAAc,CAAC,UAAU;AAAA,EAC1F;AAAA,EAEA,UAAgB;AACd,SAAK,QAAQ;AACb,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,UAAgB;AACd,eAAW,QAAQ,CAAC,KAAK,KAAK,KAAK,MAAM,GAAG;AAC1C,UAAI,CAAC,KAAM;AACX,iBAAW,OAAO,KAAK,OAAO;AAC5B,mBAAW,QAAQA,QAAO;AACxB,qBAAW,QAAQ,IAAI,IAAI,EAAG,oBAAmB,KAAK,MAAM,IAAI;AAAA,QAClE;AAAA,MACF;AAAA,IACF;AACA,SAAK,MAAM;AACX,SAAK,SAAS;AAAA,EAChB;AACF;;;ACjMO,IAAM,mBAAN,MAAuB;AAAA,EAK5B,YAAoB,MAAwB;AAAxB;AAJpB,SAAQ,QAA4B;AACpC,SAAQ,QAAsD,CAAC;AAC/D,SAAQ,OAAuB,CAAC;AAAA,EAEa;AAAA,EAE7C,OAAa;AACX,SAAK,QAAQ,GAAG,OAAO,gBAAgB;AACvC,SAAK,MAAM,MAAM,UAAU;AAC3B,SAAK,MAAM,aAAa,QAAQ,QAAQ;AACxC,SAAK,KAAK,SAAS,KAAK,YAAY,KAAK,KAAK;AAC9C,SAAK,QAAQ;AAEb,SAAK,KAAK;AAAA,MACR,KAAK,KAAK,SAAS,GAAG,gBAAgB,MAAM,KAAK,QAAQ,CAAC;AAAA,MAC1D,KAAK,KAAK,SAAS,GAAG,oBAAoB,MAAM,KAAK,QAAQ,CAAC;AAAA,MAC9D,KAAK,KAAK,SAAS,GAAG,yBAAyB,MAAM,KAAK,QAAQ,CAAC;AAAA,MACnE,KAAK,KAAK,SAAS,GAAG,oBAAoB,MAAM,KAAK,QAAQ,CAAC;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,UAAgB;AACd,QAAI,CAAC,KAAK,MAAO;AACjB,SAAK,MAAM,cAAc;AACzB,SAAK,QAAQ,CAAC;AACd,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,QAAQ,kBAAkB;AAC7B,WAAK,MAAM,MAAM,UAAU;AAC3B;AAAA,IACF;AACA,eAAW,SAAS,QAAQ,iBAAiB;AAC3C,YAAM,OAAO,GAAG,QAAQ,4CAA4C,KAAK,EAAE;AAC3E,WAAK,MAAM,YAAY,IAAI;AAC3B,WAAK,MAAM,KAAK,IAAI;AAAA,IACtB;AACA,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,UAAgB;AACd,QAAI,CAAC,KAAK,SAAS,KAAK,KAAK,YAAY,EAAG;AAC5C,UAAM,UAAU,KAAK,KAAK;AAC1B,SAAK,MAAM,MAAM,UAAU,QAAQ,mBAAmB,KAAK;AAC3D,QAAI,CAAC,QAAQ,iBAAkB;AAE/B,UAAM,SAAoB,EAAE,GAAG,gBAAgB,GAAG,QAAQ,OAAO;AACjE,UAAM,OAAO,CAAC,KAAkB,UAAoC;AAClE,YAAM,WAAW,OAAO,GAAG,KAAK,eAAe,GAAG;AAClD,aAAO,UAAU,SAAY,WAAW,WAAW,UAAU,OAAO,UAAU,WAAW,QAAQ,WAAW,OAAO,KAAK,CAAC,KAAK,CAAC;AAAA,IACjI;AAEA,QAAI,KAAK,MAAM,UAAU;AACvB,YAAM,KAAK,KAAK,KAAK;AACrB,YAAM,QAAQ,GAAG,qBAAqB;AACtC,YAAM,SAAS,GAAG,mBAAmB,GAAG,iBAAiB,IAAI,GAAG,qBAAqB;AACrF,YAAM,QACJ,GAAG,cAAc,QAAQ,SACrB,GAAG,WAAW,KAAK,gBAAgB,GAAG,MAAM,CAAC,MAAM,KAAK,KACxD,WAAW,KAAK,gBAAgB,GAAG,MAAM;AAC/C,UAAI,KAAK,MAAM,SAAS,gBAAgB,MAAO,MAAK,MAAM,SAAS,cAAc;AAAA,IACnF;AAEA,QAAI,KAAK,MAAM,kBAAkB;AAC/B,YAAM,QAAQ,KAAK,KAAK,iBAAiB,iBAAiB,EAAE;AAC5D,YAAM,QAAQ,WAAW,KAAK,gBAAgB,GAAG,KAAK;AACtD,UAAI,KAAK,MAAM,iBAAiB,gBAAgB,OAAO;AACrD,aAAK,MAAM,iBAAiB,cAAc;AAAA,MAC5C;AAAA,IACF;AAEA,QAAI,KAAK,MAAM,gBAAgB;AAC7B,YAAM,QAAQ,KAAK,KAAK,aAAa,gBAAgB;AACrD,UAAI,QAAQ;AACZ,UAAI,OAAO;AACT,cAAM,OAAO,KAAK,KAAK,YAAY,kBAAkB;AACrD,YAAI,MAAM;AACV,YAAI,QAAQ;AACZ,iBAAS,IAAI,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK;AACzC,gBAAM,OAAO,KAAK,KAAK,SAAS,gBAAgB,CAAC;AACjD,cAAI,CAAC,QAAQ,KAAK,YAAY,KAAK,QAAS;AAC5C,mBAAS,IAAI,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK;AACzC,kBAAM,MAAM,KAAK,CAAC;AAClB,gBAAI,CAAC,IAAK;AACV,kBAAM,IAAI,KAAK,KAAK,aAAa,MAAM,GAAG;AAC1C,gBAAI,OAAO,MAAM,YAAY,CAAC,MAAM,CAAC,GAAG;AACtC,qBAAO;AACP;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,YAAI,QAAQ,GAAG;AACb,gBAAM,MAAM,KAAK,MAAO,MAAM,QAAS,GAAG,IAAI;AAC9C,gBAAM,UAAU,OAAO,UAAU,GAAG,IAAI,OAAO,GAAG,IAAI,OAAO,KAAK,MAAM,MAAM,GAAG,IAAI,GAAG;AACxF,kBAAQ,GAAG,KAAK,aAAa,OAAO,CAAC,SAAM,KAAK,aAAa,OAAO,GAAG,CAAC,CAAC,SAAM,KAAK,eAAe,OAAO,KAAK,CAAC,CAAC;AAAA,QACnH;AAAA,MACF;AACA,UAAI,KAAK,MAAM,eAAe,gBAAgB,MAAO,MAAK,MAAM,eAAe,cAAc;AAAA,IAC/F;AAAA,EACF;AAAA,EAEA,UAAgB;AACd,eAAW,OAAO,KAAK,KAAM,KAAI;AACjC,SAAK,OAAO,CAAC;AACb,SAAK,OAAO,OAAO;AACnB,SAAK,QAAQ;AAAA,EACf;AACF;;;AC3HO,SAAS,gBAAgB,KAAa,OAA4B;AACvE,MAAI;AACF,QAAI,OAAO,iBAAiB,YAAa;AACzC,iBAAa,QAAQ,wBAAwB,GAAG,IAAI,KAAK,UAAU,KAAK,CAAC;AAAA,EAC3E,QAAQ;AAAA,EAER;AACF;AAEO,SAAS,gBAAgB,KAAmC;AACjE,MAAI;AACF,QAAI,OAAO,iBAAiB,YAAa,QAAO;AAChD,UAAM,MAAM,aAAa,QAAQ,wBAAwB,GAAG,EAAE;AAC9D,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO;AACnC,WAAO,OAAO;AAAA,MACZ,CAAC,MAAwB,KAAK,QAAQ,OAAO,MAAM,YAAY,OAAO,EAAE,UAAU;AAAA,IACpF;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,iBAAiB,KAAmB;AAClD,MAAI;AACF,QAAI,OAAO,iBAAiB,YAAa;AACzC,iBAAa,WAAW,wBAAwB,GAAG,EAAE;AAAA,EACvD,QAAQ;AAAA,EAER;AACF;;;ACvBA,IAAM,0BAAuD;AAAA,EAC3D,CAAC,2FAA2F,SAAS;AAAA,EACrG,CAAC,4DAA4D,SAAS;AAAA,EACtE,CAAC,6EAA6E,QAAQ;AAAA,EACtF,CAAC,oDAAoD,MAAM;AAC7D;AAEO,SAAS,kBAAkB,OAAY,YAAqD;AACjG,QAAM,MAAM,OAAO,SAAS,EAAE;AAC9B,MAAI,YAAY;AACd,UAAM,QAAQ,WAAW,GAAG;AAC5B,QAAI,MAAO,QAAO;AAClB,UAAM,QAAQ,WAAW,IAAI,YAAY,CAAC;AAC1C,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,aAAW,CAAC,SAAS,OAAO,KAAK,yBAAyB;AACxD,QAAI,QAAQ,KAAK,GAAG,EAAG,QAAO;AAAA,EAChC;AACA,SAAO;AACT;AAEO,SAAS,wBAAwB,SAA0B,CAAC,GAAmB;AACpF,SAAO,CAAC,WAA+B;AACrC,QAAI,OAAO,SAAS,QAAQ,OAAO,UAAU,GAAI,QAAO;AACxD,UAAM,UAAU,kBAAkB,OAAO,OAAO,OAAO,UAAU;AACjE,UAAM,QAAQ,OAAO,WAAW,OAAO,OAAO,KAAK,CAAC,MAAM,OAAO,aAAa,OAAO,OAAO,KAAK;AACjG,UAAM,MAAM,SAAS,cAAc,MAAM;AACzC,QAAI,YAAY,sBAAsB,OAAO;AAC7C,QAAI,cAAc;AAClB,WAAO;AAAA,EACT;AACF;AAQO,SAAS,0BAA0B,SAAyB,CAAC,GAAmB;AACrF,SAAO,CAAC,WAA+B;AACrC,UAAM,MAAM,OAAO,OAAO,KAAK;AAC/B,QAAI,MAAM,GAAG,EAAG,QAAO,OAAO;AAC9B,UAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC;AAC1C,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,YAAY;AACjB,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAClB,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,YAAY;AAChB,QAAI,MAAM,QAAQ,GAAG,GAAG;AACxB,QAAI,OAAO,MAAO,KAAI,MAAM,aAAa,OAAO;AAChD,UAAM,YAAY,GAAG;AACrB,SAAK,YAAY,KAAK;AACtB,QAAI,OAAO,cAAc,OAAO;AAC9B,YAAM,QAAQ,SAAS,cAAc,MAAM;AAC3C,YAAM,YAAY;AAClB,YAAM,cAAc,GAAG,KAAK,MAAM,GAAG,CAAC,GAAG,OAAO,QAAQ,GAAG;AAC3D,WAAK,YAAY,KAAK;AAAA,IACxB;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,aAAa,QAAkD;AAC7E,MAAI,OAAO,SAAS,QAAQ,OAAO,UAAU,GAAI,QAAO;AACxD,QAAM,IAAI,SAAS,cAAc,MAAM;AACvC,IAAE,YAAY;AACd,IAAE,cAAc,OAAO,aAAa,OAAO,OAAO,KAAK;AACvD,SAAO;AACT;AAEA,IAAM,aAAqC;AAAA,EACzC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AACV;AAEA,SAAS,QAAQ,MAAc,OAAO,IAAY;AAChD,QAAM,OAAO,WAAW,IAAI,KAAK;AACjC,SAAO,mCAAmC,IAAI,aAAa,IAAI,yGAAyG,IAAI;AAC9K;AAgBA,IAAI,iBAAqC;AACzC,IAAI,mBAAuC;AAE3C,SAAS,kBAAwB;AAC/B,kBAAgB,OAAO;AACvB,mBAAiB;AACjB,qBAAmB;AACnB,WAAS,oBAAoB,aAAa,qBAAqB,IAAI;AACrE;AAEA,SAAS,oBAAoB,GAAqB;AAChD,MAAI,kBAAkB,CAAC,eAAe,SAAS,EAAE,MAAc,EAAG,iBAAgB;AACpF;AAEA,SAAS,eAAe,QAAqB,OAA2E;AACtH,kBAAgB;AAChB,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,QAAI,OAAO;AACX,QAAI,YAAY;AAChB,QAAI,KAAK,OAAQ,KAAI,UAAU,IAAI,gCAAgC;AACnE,QAAI,cAAc,KAAK;AACvB,QAAI,iBAAiB,SAAS,MAAM;AAClC,sBAAgB;AAChB,WAAK,KAAK;AAAA,IACZ,CAAC;AACD,SAAK,YAAY,GAAG;AAAA,EACtB;AACA,WAAS,KAAK,YAAY,IAAI;AAC9B,QAAM,OAAO,OAAO,sBAAsB;AAC1C,QAAM,WAAW,KAAK,sBAAsB;AAC5C,OAAK,MAAM,OAAO,GAAG,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,aAAa,SAAS,QAAQ,CAAC,CAAC;AAC7F,OAAK,MAAM,MAAM,GAAG,KAAK,IAAI,KAAK,SAAS,GAAG,OAAO,cAAc,SAAS,SAAS,CAAC,CAAC;AACvF,mBAAiB;AACjB,qBAAmB;AACnB,WAAS,iBAAiB,aAAa,qBAAqB,IAAI;AAClE;AAEO,SAAS,4BAA4B,QAA6C;AACvF,QAAM,MAAM,OAAO,OAAO;AAC1B,SAAO,CAAC,WAA+B;AACrC,UAAM,UAAU,OAAO,QAAQ,OAAO,CAAC,WAAW;AAChD,UAAI,CAAC,OAAO,KAAM,QAAO;AACzB,UAAI;AACF,eAAO,OAAO,KAAK,MAAM;AAAA,MAC3B,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AACD,QAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,YAAY;AAEjB,UAAM,QAAQ,QAAQ,MAAM,GAAG,GAAG;AAClC,UAAM,WAAW,QAAQ,MAAM,GAAG;AAElC,eAAW,UAAU,OAAO;AAC1B,YAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,UAAI,OAAO;AACX,UAAI,YAAY;AAChB,UAAI,OAAO,OAAQ,KAAI,UAAU,IAAI,yBAAyB;AAC9D,YAAM,QAAQ,OAAO,SAAS,OAAO,SAAS;AAC9C,UAAI,MAAO,KAAI,QAAQ;AACvB,UAAI,OAAO,QAAQ,WAAW,OAAO,IAAI,GAAG;AAC1C,YAAI,YAAY,QAAQ,OAAO,IAAI;AACnC,YAAI,UAAU,IAAI,uBAAuB;AAAA,MAC3C,OAAO;AACL,YAAI,cAAc,OAAO,SAAS;AAAA,MACpC;AACA,UAAI,iBAAiB,SAAS,CAAC,MAAM;AACnC,UAAE,gBAAgB;AAClB,eAAO,QAAQ,MAAM;AAAA,MACvB,CAAC;AACD,WAAK,YAAY,GAAG;AAAA,IACtB;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,YAAM,OAAO,SAAS,cAAc,QAAQ;AAC5C,WAAK,OAAO;AACZ,WAAK,YAAY;AACjB,WAAK,QAAQ;AACb,WAAK,cAAc;AACnB,WAAK,iBAAiB,SAAS,CAAC,MAAM;AACpC,UAAE,gBAAgB;AAClB;AAAA,UACE;AAAA,UACA,SAAS,IAAI,CAAC,YAAY;AAAA,YACxB,OAAO,OAAO,SAAS,OAAO,SAAS;AAAA,YACvC,QAAQ,OAAO;AAAA,YACf,MAAM,MAAM,OAAO,QAAQ,MAAM;AAAA,UACnC,EAAE;AAAA,QACJ;AAAA,MACF,CAAC;AACD,WAAK,YAAY,IAAI;AAAA,IACvB;AAEA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS,MAAM;AACb,YAAI,oBAAoB,KAAK,SAAS,gBAAgB,EAAG,iBAAgB;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,0BAA0B,wBAAwB;AACxD,IAAM,4BAA4B,0BAA0B;AAE5D,SAAS,yBAAyB,UAA4D;AACnG,WAAS,aAAa,uBAAuB;AAC7C,WAAS,eAAe,yBAAyB;AACjD,WAAS,QAAQ,YAAY;AAC/B;;;ACnOA,IAAM,gBAAgB,oBAAI,IAA4B;AACtD,IAAM,cAAc,oBAAI,IAA+B;AAEhD,SAAS,qBAAqB,MAAc,UAAsC;AACvF,QAAM,WAAW,cAAc,IAAI,IAAI;AACvC,gBAAc,IAAI,MAAM,QAAQ;AAChC,SAAO,MAAM;AACX,QAAI,cAAc,IAAI,IAAI,MAAM,SAAU;AAC1C,QAAI,SAAU,eAAc,IAAI,MAAM,QAAQ;AAAA,QACzC,eAAc,OAAO,IAAI;AAAA,EAChC;AACF;AAEO,SAAS,gBAAgB,MAA0C;AACxE,SAAO,cAAc,IAAI,IAAI;AAC/B;AAEO,SAAS,mBAAmB,MAAc,QAAuC;AACtF,QAAM,WAAW,YAAY,IAAI,IAAI;AACrC,cAAY,IAAI,MAAM,MAAM;AAC5B,SAAO,MAAM;AACX,QAAI,YAAY,IAAI,IAAI,MAAM,OAAQ;AACtC,QAAI,SAAU,aAAY,IAAI,MAAM,QAAQ;AAAA,QACvC,aAAY,OAAO,IAAI;AAAA,EAC9B;AACF;AAEO,SAAS,cAAc,MAA6C;AACzE,SAAO,YAAY,IAAI,IAAI;AAC7B;AAGO,SAAS,mBAAmB,MAAc,UAAgC;AAC/E,MAAI,CAAC,cAAc,IAAI,IAAI,EAAG,eAAc,IAAI,MAAM,QAAQ;AAChE;AAEO,SAAS,2BAAiC;AAC/C,gBAAc,MAAM;AACpB,cAAY,MAAM;AACpB;;;ACrCO,SAAS,mBAAmB,MAAuE;AACxG,MAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO,CAAC;AACxC,QAAM,SAAmB,CAAC;AAC1B,QAAM,UAAU,oBAAI,IAAoB;AACxC,MAAI,YAAY;AAEhB,QAAM,OAAO,CAAC,MAA4B,UAAwB;AAChE,eAAW,OAAO,MAAM;AACtB,UAAI,cAAc,GAAG,GAAG;AACtB,YAAI,CAAC,MAAM,QAAQ,IAAI,QAAQ,KAAK,IAAI,SAAS,WAAW,GAAG;AAC7D,iBAAO,KAAK,uBAAQ,IAAI,cAAc,IAAI,WAAW,GAAG,gCAAiB;AACzE;AAAA,QACF;AACA,aAAK,IAAI,UAAU,QAAQ,CAAC;AAC5B;AAAA,MACF;AACA;AACA,YAAM,KAAK,IAAI,SAAS,IAAI,SAAS,OAAO,SAAS;AACrD,cAAQ,IAAI,KAAK,QAAQ,IAAI,EAAE,KAAK,KAAK,CAAC;AAE1C,UAAI,IAAI,SAAS,CAAC,WAAW,IAAI,KAAK,GAAG;AACvC,eAAO,KAAK,WAAM,EAAE,uHAA6B;AAAA,MACnD;AAEA,UAAI,CAAC,IAAI,SAAS,CAAC,IAAI,eAAe,CAAC,IAAI,qBAAqB,CAAC,IAAI,eAAe,CAAC,IAAI,SAAS;AAChG,eAAO,KAAK,WAAM,EAAE,uKAA+C;AAAA,MACrE;AACA,UAAI,IAAI,SAAS,QAAQ,IAAI,YAAY,QAAQ,IAAI,QAAQ,IAAI,UAAU;AACzE,eAAO,KAAK,WAAM,EAAE,kBAAa,IAAI,KAAK,2BAAiB,IAAI,QAAQ,2CAAkB;AAAA,MAC3F;AACA,UAAI,IAAI,SAAS,QAAQ,IAAI,YAAY,QAAQ,IAAI,QAAQ,IAAI,UAAU;AACzE,eAAO,KAAK,WAAM,EAAE,kBAAa,IAAI,KAAK,2BAAiB,IAAI,QAAQ,2CAAkB;AAAA,MAC3F;AAAA,IACF;AAAA,EACF;AAEA,OAAK,MAAM,CAAC;AACZ,aAAW,CAAC,IAAI,KAAK,KAAK,SAAS;AACjC,QAAI,QAAQ,EAAG,QAAO,KAAK,gBAAM,KAAK,0CAAsB,EAAE,yGAAyB;AAAA,EACzF;AACA,SAAO;AACT;;;ACOA,IAAI,UAAU;AACd,SAAS,yBAA+B;AACtC,2BAAyB,kBAAkB;AAC7C;AAEO,IAAM,WAAN,MAA4B;AAAA,EAgCjC,YAAY,WAAwB,SAA6B;AANjE,SAAQ,YAAY;AACpB,SAAQ,gBAAgB;AACxB,SAAQ,aAAa;AACrB,SAAQ,4BAA4B;AACpC,SAAQ,iBAAiB,oBAAI,IAAmE;AAqbhG,SAAQ,iBAAiB;AAmFzB,SAAQ,oBAA6B;AACrC,SAAQ,0BAA0B,oBAAI,IAAY;AAtgBhD,SAAK,SAAS,EAAE;AAChB,2BAAuB;AACvB,SAAK,UAAU,eAAe,OAAO;AACrC,SAAK,WAAW,IAAI,SAA8B,CAAC,OAAO,cAAc;AACtE,UAAI,cAAc,YAAa,SAAQ,MAAM,4CAA4C,KAAK;AAAA,UACzF,MAAK,YAAY,OAAO,qBAAqB,EAAE,UAAU,CAAC;AAAA,IACjE,CAAC;AAED,SAAK,cAAc,IAAI,YAAY,IAAqB;AACxD,SAAK,WAAW,IAAI,SAAgB,IAAqB;AACzD,SAAK,mBAAmB,IAAI,iBAAiB,IAAqB;AAClE,SAAK,WAAW,IAAI,aAAa,IAAqB;AACtD,SAAK,iBAAiB,IAAI,eAAe,IAAqB;AAC9D,SAAK,eAAe,IAAI,aAAa,IAAqB;AAC1D,SAAK,gBAAgB,IAAI,cAAc,IAAqB;AAC5D,SAAK,oBAAoB,IAAI,kBAAkB,IAAqB;AACpE,SAAK,kBAAkB,IAAI,gBAAgB,IAAqB;AAChE,SAAK,iBAAiB,IAAI,eAAe,IAAqB;AAC9D,SAAK,cAAc,IAAI,gBAAgB,IAAqB;AAC5D,SAAK,cAAc,IAAI,mBAAmB,IAAqB;AAC/D,SAAK,aAAa,IAAI,kBAAkB,IAAqB;AAC7D,SAAK,qBAAqB,IAAI,mBAAmB,IAAqB;AACtE,SAAK,iBAAiB,IAAI,eAAe,IAAqB;AAC9D,SAAK,mBAAmB,IAAI,iBAAiB,IAAqB;AAClE,SAAK,gBAAgB,IAAI,cAAc,IAAqB;AAC5D,SAAK,qBAAqB,IAAI,mBAAmB,IAAqB;AACtE,SAAK,kBAAkB,IAAI,gBAAgB,IAAqB;AAChE,SAAK,mBAAmB,IAAI,iBAAiB,IAAqB;AAClE,SAAK,MAAM,IAAI,YAAmB,IAAuB;AAEzD,QAAI;AACF,WAAK,SAAS,KAAK,WAAW,KAAK,OAAO;AAC1C,WAAK,iBAAiB,KAAK;AAC3B,WAAK,aAAa,KAAK;AACvB,WAAK,gBAAgB,KAAK;AAC1B,WAAK,eAAe,KAAK;AACzB,WAAK,cAAc,KAAK;AACxB,WAAK,gBAAgB,KAAK;AAC1B,WAAK,iBAAiB,KAAK;AAC3B,WAAK,mBAAmB,KAAK;AAE7B,WAAK,YAAY,cAAc,KAAK,QAAQ,UAAU;AACtD,WAAK,aAAa,KAAK,QAAQ,UAAU;AACzC,WAAK,cAAc;AACnB,WAAK,yBAAyB;AAC9B,WAAK,eAAe,MAAM;AAC1B,UAAI,KAAK,QAAQ,YAAY;AAC3B,aAAK,KAAK,SAAS,cAAc;AAAA,MACnC,OAAO;AACL,aAAK,SAAS,WAAW,KAAK,QAAQ,OAAO;AAAA,MAC/C;AACA,WAAK,SAAS;AACd,WAAK,mBAAmB,QAAQ,KAAK,QAAQ,kBAAkB,KAAK,QAAQ,mBAAmB;AAC/F,WAAK,YAAY,KAAK,QAAQ,QAAQ;AAEtC,WAAK,aAAa,sBAAsB,MAAM;AAC5C,aAAK,aAAa;AAClB,YAAI,CAAC,KAAK,UAAW,MAAK,KAAK,aAAa,CAAC,CAAC;AAAA,MAChD,CAAC;AAAA,IACH,SAAS,OAAO;AACd,WAAK,YAAY,OAAO,kBAAkB;AAC1C,WAAK,QAAQ;AACb,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,SAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,oBAAoB,MAA0C;AAC5D,UAAM,QAAQ,KAAK,QAAQ,YAAY,gBAAgB,IAAI;AAC3D,QAAI,MAAO,QAAO;AAClB,QAAI,WAAW,gBAAgB,IAAI;AACnC,QAAI,CAAC,UAAU;AAGb,6BAAuB;AACvB,iBAAW,gBAAgB,IAAI;AAAA,IACjC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,kBAAkB,MAA6C;AAC7D,WAAO,KAAK,QAAQ,YAAY,cAAc,IAAI,KAAK,cAAc,IAAI;AAAA,EAC3E;AAAA,EAEA,YAAY,UAAkE;AAC5E,SAAK,gBAAgB;AACrB,QAAI,KAAK,UAAW;AACpB,UAAM,UAAqC;AAAA,MACzC,KAAK,KAAK;AAAA,MACV,MAAM,KAAK,SAAS;AAAA,MACpB,YAAY,MAAM,KAAK;AAAA,MACvB,kBAAkB,CAAC,MAAM,aAAa,KAAK,SAAS,GAAG,MAAM,QAAQ;AAAA,MACrE,aAAa,CAAC,OAAO,QAAQ,YAAY,KAAK,YAAY,OAAO,WAAW,MAAM,IAAI,OAAO;AAAA,IAC/F;AAEA,eAAW,WAAW,YAAY,CAAC,GAAG;AACpC,YAAM,MAAM,OAAO,SAAS,QAAQ,WAAW,QAAQ,IAAI,KAAK,IAAI;AACpE,UAAI,CAAC,KAAK;AACR,aAAK,YAAY,IAAI,MAAM,4CAA4C,GAAG,eAAe;AACzF;AAAA,MACF;AACA,UAAI,KAAK,eAAe,IAAI,GAAG,GAAG;AAChC,aAAK,YAAY,IAAI,MAAM,8BAA8B,GAAG,EAAE,GAAG,iBAAiB,EAAE,IAAI,CAAC;AACzF;AAAA,MACF;AACA,UAAI;AACF,cAAM,UAAU,QAAQ,MAAM,OAAO;AACrC,aAAK,eAAe,IAAI,KAAK;AAAA,UAC3B;AAAA,UACA,GAAI,OAAO,YAAY,aAAa,EAAE,QAAQ,IAAI,CAAC;AAAA,QACrD,CAAC;AAAA,MACH,SAAS,OAAO;AACd,aAAK,YAAY,OAAO,iBAAiB,EAAE,IAAI,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBAAwB;AAC9B,UAAM,UAAU,CAAC,GAAG,KAAK,eAAe,QAAQ,CAAC,EAAE,QAAQ;AAC3D,SAAK,eAAe,MAAM;AAC1B,eAAW,CAAC,KAAK,MAAM,KAAK,SAAS;AACnC,UAAI;AACF,eAAO,UAAU;AAAA,MACnB,SAAS,OAAO;AACd,aAAK,YAAY,OAAO,mBAAmB,EAAE,IAAI,CAAC;AAAA,MACpD;AACA,UAAI;AACF,eAAO,QAAQ,UAAU;AAAA,MAC3B,SAAS,OAAO;AACd,aAAK,YAAY,OAAO,mBAAmB,EAAE,IAAI,CAAC;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,SAAiB;AACf,WAAO,EAAE,KAAK;AAAA,EAChB;AAAA,EAEA,aAAa,MAAoB,QAAqB;AACpD,UAAM,MAAM,OAAO;AACnB,QAAI,IAAI,aAAa;AACnB,UAAI;AACF,eAAO,IAAI,YAAY;AAAA,UACrB,KAAK,KAAK;AAAA,UACV,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA,MAAM,KAAK;AAAA,QACb,CAAC;AAAA,MACH,SAAS,OAAO;AACd,aAAK,YAAY,OAAO,eAAe,EAAE,OAAO,OAAO,IAAI,OAAO,KAAK,GAAG,CAAC;AAC3E,eAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,IAAI,MAAO,QAAO,UAAU,KAAK,MAAM,IAAI,KAAK;AACpD,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,KAA0B;AACtC,UAAM,SAAmB,KAAK,QAAQ;AACtC,WAAO,OAAO,GAAG,KAAK,eAAe,GAAG;AAAA,EAC1C;AAAA,EAEA,WAAW,MAAoB,QAAgB,UAAe,UAAyB;AACrF,UAAM,SAAS,OAAO;AACtB,QAAI,OAAO,aAAa;AACtB,UAAI;AACF,eAAO,OAAO,YAAY;AAAA,UACxB;AAAA,UACA;AAAA,UACA,MAAM,KAAK;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA,KAAK,KAAK;AAAA,QACZ,CAAC;AAAA,MACH,SAAS,OAAO;AACd,aAAK,YAAY,OAAO,eAAe,EAAE,OAAO,OAAO,IAAI,OAAO,KAAK,GAAG,CAAC;AAC3E,eAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,OAAO,MAAO,QAAO,UAAU,KAAK,MAAM,OAAO,OAAO,QAAQ;AACpE,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,MAAoB,QAAgB,UAAe,UAAwB;AACtF,QAAI,aAAa,UAAa,aAAa,SAAU,QAAO;AAC5D,UAAM,SAAS,OAAO;AAEtB,QAAI;AACJ,QAAI,OAAO,aAAa;AACtB,UAAI;AACF,kBAAU,OAAO,YAAY;AAAA,UAC3B;AAAA,UACA;AAAA,UACA,MAAM,KAAK;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA,KAAK,KAAK;AAAA,QACZ,CAAC;AAAA,MACH,SAAS,OAAO;AACd,aAAK,YAAY,OAAO,eAAe,EAAE,OAAO,OAAO,IAAI,OAAO,KAAK,GAAG,CAAC;AAC3E,eAAO;AAAA,MACT;AAAA,IACF,WAAW,OAAO,OAAO;AACvB,gBAAU,UAAU,KAAK,MAAM,OAAO,OAAO,QAAQ;AAAA,IACvD,OAAO;AACL,aAAO;AAAA,IACT;AAEA,QAAI,SAAS;AACX,WAAK,aAAa,oBAAoB,IAAI;AAC1C,WAAK,aAAa,WAAW,CAAC,KAAK,QAAQ,GAAG,CAAC,OAAO,EAAE,CAAC;AACzD,WAAK,KAAK,oBAAoB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,UAAU,KAAK;AAAA,QACf;AAAA,QACA;AAAA,QACA,MAAM,KAAK;AAAA,MACb,CAAC;AACD,WAAK,YAAY,OAAO,EAAE,QAAQ,KAAK,IAAI,UAAU,OAAO,IAAI,UAAU,SAAS,CAAC;AAAA,IACtF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,OAAmE;AAC/E,UAAM,OAAO,KAAK,YAAY,kBAAkB;AAChD,UAAM,OAAO,KAAK,MAAM,MAAM,IAAI,MAAM,KAAK,CAAC;AAC9C,UAAM,OAAmB,CAAC;AAC1B,aAAS,IAAI,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK;AACzC,YAAM,OAAO,KAAK,SAAS,gBAAgB,CAAC;AAC5C,WAAK;AAAA,QACH,KAAK,IAAI,CAAC,QAAQ;AAChB,cAAI,CAAC,QAAQ,KAAK,YAAY,KAAK,QAAS,QAAO;AACnD,iBAAO,oBAAoB,MAAM,MAAM,KAAK,KAAK,aAAa,MAAM,GAAG,CAAC;AAAA,QAC1E,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO,MAAM,IAAI;AAAA,EACnB;AAAA,EAEA,kBAAoC;AAClC,UAAM,QAAQ,KAAK,aAAa,0BAA0B;AAC1D,QAAI,CAAC,MAAO,QAAO,QAAQ,QAAQ,KAAK;AACxC,WAAO,eAAe,KAAK,cAAc,KAAK,CAAC;AAAA,EACjD;AAAA,EAEA,iBAAiB,OAAiE;AAChF,QAAI,KAAK,UAAW;AACpB,UAAM,OAAO,KAAK,YAAY,kBAAkB;AAChD,UAAM,cAAc,oBAAI,IAAY;AACpC,SAAK,YAAY,WAAW;AAC5B,QAAI;AACF,eAAS,IAAI,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK;AACzC,cAAM,OAAO,KAAK,SAAS,gBAAgB,CAAC;AAC5C,YAAI,CAAC,QAAQ,KAAK,YAAY,KAAK,QAAS;AAC5C,iBAAS,IAAI,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK;AACzC,gBAAM,MAAM,KAAK,CAAC;AAClB,cAAI,CAAC,OAAO,IAAI,eAAe,IAAI,kBAAkB,IAAI,OAAO,QAAS;AACzE,cAAI,CAAC,KAAK,eAAe,WAAW,MAAM,GAAG,EAAG;AAChD,gBAAM,MAAM,KAAK,aAAa,MAAM,GAAG;AACvC,cAAI,KAAK,aAAa,MAAM,KAAK,MAAM,GAAG,EAAG,aAAY,IAAI,CAAC;AAAA,QAChE;AAAA,MACF;AAAA,IACF,UAAE;AACA,WAAK,YAAY,SAAS;AAAA,IAC5B;AACA,QAAI,YAAY,OAAO,GAAG;AACxB,WAAK,aAAa,YAAY,CAAC,GAAG,WAAW,CAAC;AAC9C,WAAK,gBAAgB,QAAQ;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,UAAU,MAAc,UAAkB,aAA2B;AACnE,QAAI,KAAK,UAAW;AACpB,UAAM,OAAO,SAAS,IAAI;AAC1B,QAAI,KAAK,WAAW,EAAG;AACvB,UAAM,OAAO,KAAK,YAAY,kBAAkB;AAChD,UAAM,WAAW,KAAK,SAAS,qBAAqB;AACpD,UAAM,cAAc,oBAAI,IAAY;AACpC,QAAI,IAAI;AAER,SAAK,YAAY,WAAW;AAC5B,QAAI;AACF,iBAAW,QAAQ,MAAM;AACvB,eAAO,IAAI,UAAU;AACnB,gBAAMC,QAAO,KAAK,SAAS,gBAAgB,CAAC;AAC5C,cAAIA,SAAQ,CAACA,MAAK,YAAY,CAACA,MAAK,QAAS;AAC7C;AAAA,QACF;AACA,YAAI,KAAK,SAAU;AACnB,cAAM,OAAO,KAAK,SAAS,gBAAgB,CAAC;AAC5C,YAAI,IAAI;AACR,mBAAW,SAAS,MAAM;AACxB,iBAAO,IAAI,KAAK,QAAQ;AACtB,kBAAM,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,eAAe,KAAK,CAAC,EAAE,kBAAkB,KAAK,CAAC,EAAE,OAAO;AACzF,gBAAI,CAAC,KAAM;AACX;AAAA,UACF;AACA,cAAI,KAAK,KAAK,OAAQ;AACtB,gBAAM,MAAM,KAAK,CAAC;AAClB,cAAI,KAAK,eAAe,WAAW,MAAM,GAAG,GAAG;AAC7C,kBAAM,MAAM,KAAK,aAAa,MAAM,GAAG;AACvC,gBAAI,QAAa;AACjB,gBAAI,UAAU,IAAI;AAChB,sBAAQ;AAAA,YACV,WAAW,OAAO,QAAQ,YAAY,CAAC,MAAM,OAAO,KAAK,CAAC,GAAG;AAC3D,sBAAQ,OAAO,KAAK;AAAA,YACtB;AACA,gBAAI,KAAK,aAAa,MAAM,KAAK,OAAO,GAAG,EAAG,aAAY,IAAI,CAAC;AAAA,UACjE;AACA;AAAA,QACF;AACA;AAAA,MACF;AAAA,IACF,UAAE;AACA,WAAK,YAAY,SAAS;AAAA,IAC5B;AAEA,QAAI,YAAY,OAAO,GAAG;AACxB,WAAK,aAAa,YAAY,CAAC,GAAG,WAAW,CAAC;AAC9C,WAAK,gBAAgB,QAAQ;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,2BAA0C;AACxC,UAAM,QAAQ,KAAK,aAAa,cAAc;AAC9C,QAAI,CAAC,MAAO,QAAO,QAAQ,QAAQ;AACnC,QAAI;AACF,UAAI,OAAO,cAAc,eAAe,UAAU,WAAW,UAAU;AACrE,eAAO,UAAU,UACd,SAAS,EACT,KAAK,CAAC,SAAS;AACd,cAAI,KAAM,MAAK,UAAU,MAAM,MAAM,KAAK,MAAM,MAAM;AAAA,QACxD,CAAC,EACA,MAAM,MAAM,MAAS;AAAA,MAC1B;AAAA,IACF,QAAQ;AAAA,IAER;AACA,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,iBAAuB;AACrB,SAAK,gBAAgB,QAAQ;AAAA,EAC/B;AAAA,EAEA,KAA8B,MAAS,OAAiE;AACtG,UAAM,QAAQ,EAAE,MAAM,KAAK,KAAK,KAAK,GAAG,MAAM;AAC9C,SAAK,SAAS,KAAK,MAAM,KAAK;AAC9B,UAAM,aAAc,OAAO,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC;AACtE,UAAM,UAAU,KAAK,QAAQ,UAAU;AAGvC,QAAI,OAAO,YAAY,YAAY;AACjC,UAAI;AACF,gBAAQ,KAAK;AAAA,MACf,SAAS,OAAO;AACd,YAAI,SAAS,YAAa,SAAQ,MAAM,qCAAqC,KAAK;AAAA,YAC7E,MAAK,YAAY,OAAO,gBAAgB,OAAO,UAAU,CAAC,IAAI,EAAE,WAAW,KAAK,CAAC;AAAA,MACxF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,OAAgB,QAAgB,SAAyC;AACnF,YAAQ,MAAM,gBAAgB,MAAM,UAAU,KAAK;AACnD,QAAI,KAAK,UAAW;AACpB,SAAK,KAAK,aAAa,EAAE,OAAO,QAAQ,QAAQ,CAAC;AAAA,EACnD;AAAA,EAEA,UAAU,QAAgB,UAAyB;AACjD,SAAK,YAAY,UAAU,QAAQ,QAAQ;AAC3C,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,iBAAuB;AACrB,SAAK,eAAe,sBAAsB;AAC1C,SAAK,KAAK,eAAe,EAAE,WAAW,KAAK,YAAY,aAAa,EAAE,CAAC;AACvE,SAAK,mBAAmB;AACxB,QAAI,KAAK,SAAS,YAAY;AAC5B,WAAK,SAAS,sBAAsB;AACpC;AAAA,IACF;AACA,SAAK,SAAS,gBAAgB;AAC9B,SAAK,aAAa,cAAc;AAAA,EAClC;AAAA,EAEA,kBAAkB,QAAgB,QAAmC;AACnE,UAAM,QAAQ,KAAK,SAAS,eAAe;AAC3C,QAAI,OAAQ,OAAM,OAAO,EAAE,IAAI;AAAA,QAC1B,QAAO,MAAM,OAAO,EAAE;AAC3B,SAAK,SAAS,eAAe,KAAK;AAClC,SAAK,eAAe,mBAAmB;AACvC,SAAK,KAAK,iBAAiB,EAAE,aAAa,KAAK,SAAS,eAAe,EAAE,CAAC;AAC1E,QAAI,KAAK,SAAS,YAAY;AAC5B,WAAK,SAAS,sBAAsB;AACpC;AAAA,IACF;AACA,SAAK,SAAS,gBAAgB;AAC9B,SAAK,aAAa,cAAc;AAAA,EAClC;AAAA,EAEA,mBAAyB;AACvB,SAAK,KAAK,iBAAiB,EAAE,aAAa,KAAK,SAAS,eAAe,EAAE,CAAC;AAC1E,QAAI,KAAK,SAAS,YAAY;AAC5B,WAAK,SAAS,sBAAsB;AACpC;AAAA,IACF;AACA,SAAK,SAAS,gBAAgB;AAC9B,SAAK,aAAa,cAAc;AAAA,EAClC;AAAA,EAEA,WAAW,OAAe,SAAuB;AAC/C,QAAI,CAAC,KAAK,YAAY,WAAW,OAAO,OAAO,EAAG;AAClD,SAAK,0BAA0B;AAC/B,SAAK,KAAK,eAAe,EAAE,OAAO,QAAQ,CAAC;AAC3C,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,aAAa,OAAwB;AACnC,WAAO,KAAK,SAAS,aAAa,KAAK;AAAA,EACzC;AAAA,EAIA,2BAAiC;AAC/B,UAAM,QAAQ,EAAE,KAAK;AACrB,QAAI,CAAC,KAAK,QAAQ,eAAgB;AAClC,QAAI;AACJ,QAAI;AACF,cAAQ,KAAK,QAAQ,mBACjB,KAAK,QAAQ,iBAAiB,KAAK,KAAK,QAAQ,cAAc,IAC9D,gBAAgB,KAAK,QAAQ,cAAc;AAAA,IACjD,SAAS,OAAO;AACd,WAAK,YAAY,OAAO,kBAAkB;AAC1C;AAAA,IACF;AACA,QAAI,SAAS,KAAM;AACnB,QAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,cAAQ,QAAQ,KAAK,EAClB,KAAK,CAAC,WAAW;AAChB,YAAI,KAAK,aAAa,UAAU,KAAK,kBAAkB,CAAC,UAAU,OAAO,WAAW,EAAG;AACvF,aAAK,YAAY,iBAAiB,MAAM;AACxC,YAAI,KAAK,SAAS,WAAY,MAAK,KAAK,SAAS,sBAAsB;AAAA,YAClE,MAAK,SAAS,gBAAgB;AACnC,aAAK,0BAA0B;AAAA,MACjC,CAAC,EACA,MAAM,CAAC,UAAU,KAAK,YAAY,OAAO,kBAAkB,CAAC;AAC/D;AAAA,IACF;AACA,QAAI,MAAM,SAAS,GAAG;AACpB,WAAK,YAAY,iBAAiB,KAAK;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,qBAA2B;AACzB,QAAI,CAAC,KAAK,QAAQ,kBAAkB,KAAK,UAAW;AACpD,UAAM,QAAQ,KAAK,YAAY,eAAe;AAC9C,QAAI;AACF,YAAM,SAAS,KAAK,QAAQ,mBACxB,KAAK,QAAQ,iBAAiB,KAAK,KAAK,QAAQ,gBAAgB,KAAK,IACrE,gBAAgB,KAAK,QAAQ,gBAAgB,KAAK;AACtD,UAAI,UAAU,OAAQ,OAAyB,UAAU,YAAY;AACnE,aAAM,OAAyB,MAAM,CAAC,UAAU,KAAK,YAAY,OAAO,kBAAkB,CAAC;AAAA,MAC7F;AAAA,IACF,SAAS,OAAO;AACd,WAAK,YAAY,OAAO,kBAAkB;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,yBAAsC;AACpC,UAAM,SAAS,KAAK,QAAQ,UAAU,CAAC;AACvC,UAAM,QAAQ,OAAO,aAAa,eAAe;AACjD,UAAM,OAAO,OAAO,iBAAiB,eAAe;AACpD,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAElB,UAAM,OAAO,SAAS,gBAAgB,8BAA8B,KAAK;AACzE,SAAK,aAAa,SAAS,kBAAkB;AAC7C,SAAK,aAAa,WAAW,WAAW;AACxC,SAAK,aAAa,SAAS,IAAI;AAC/B,SAAK,aAAa,UAAU,IAAI;AAChC,SAAK,aAAa,QAAQ,MAAM;AAChC,SAAK,aAAa,eAAe,MAAM;AAEvC,SAAK,YACH;AAUF,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY;AACpB,YAAQ,cAAc;AACtB,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AACnB,WAAO,cAAc;AACrB,UAAM,OAAO,MAAM,SAAS,MAAM;AAClC,WAAO;AAAA,EACT;AAAA,EAKA,gBAAsB;AACpB,QAAI,KAAK,QAAQ,oBAAoB,KAAK,UAAW;AACrD,QAAI,KAAK,QAAQ,UAAU;AACzB,UAAI,KAAK,YAAY,mBAAmB,EAAE,SAAS,GAAG;AACpD,gBAAQ,KAAK,kIAAkD;AAAA,MACjE;AACA,UAAI,KAAK,QAAQ,cAAc;AAC7B,gBAAQ,KAAK,4IAAuD;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,MAAmE;AAC9E,QAAI,KAAK,QAAQ,oBAAoB,KAAK,UAAW;AACrD,QAAI,KAAK,sBAAsB,KAAM;AACrC,SAAK,oBAAoB;AACzB,eAAW,SAAS,mBAAmB,IAAI,GAAG;AAC5C,UAAI,KAAK,wBAAwB,IAAI,KAAK,EAAG;AAC7C,WAAK,wBAAwB,IAAI,KAAK;AACtC,cAAQ,KAAK,gBAAgB,KAAK,EAAE;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,4BAAkC;AAChC,SAAK,cAAc;AACnB,SAAK,aAAa,KAAK,YAAY,cAAc,CAAC;AAClD,SAAK,aAAa,wBAAwB;AAC1C,SAAK,eAAe,MAAM;AAC1B,SAAK,aAAa,YAAY;AAC9B,SAAK,SAAS;AACd,SAAK,mBAAmB,QAAQ;AAChC,SAAK,gBAAgB,QAAQ;AAC7B,SAAK,KAAK,2BAA2B,CAAC,CAAC;AAAA,EACzC;AAAA,EAEA,WAAiB;AACf,QAAI,KAAK,UAAW;AACpB,SAAK,YAAY,cAAc,KAAK,SAAS,qBAAqB,CAAC;AACnE,UAAM,iBAAiB,KAAK,YAAY,kBAAkB,EACvD,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,IAAI,OAAO,YAAY,EAAE,EACrD,KAAK,GAAG;AACX,QAAI,KAAK,6BAA6B,mBAAmB,KAAK,2BAA2B;AACvF,WAAK,aAAa,wBAAwB;AAAA,IAC5C;AACA,SAAK,4BAA4B;AACjC,SAAK,SAAS,KAAK,aAAa,iBAAiB,OAAO,KAAK,YAAY,kBAAkB,EAAE,MAAM,CAAC;AACpG,SAAK,eAAe,YAAY;AAChC,SAAK,aAAa,SAAS;AAC3B,SAAK,mBAAmB,YAAY;AACpC,SAAK,gBAAgB,QAAQ;AAAA,EAC/B;AAAA,EAEA,gBAAgB,uBAAuB,MAAY;AACjD,QAAI,KAAK,UAAW;AACpB,SAAK,YAAY,cAAc,KAAK,SAAS,qBAAqB,CAAC;AACnE,QAAI,qBAAsB,MAAK,aAAa,wBAAwB;AACpE,SAAK,eAAe,YAAY;AAChC,SAAK,aAAa,oBAAoB;AACtC,SAAK,aAAa,gBAAgB;AAClC,SAAK,aAAa,YAAY,IAAI;AAClC,SAAK,mBAAmB,YAAY;AACpC,SAAK,gBAAgB,QAAQ;AAAA,EAC/B;AAAA,EAEA,UAAgB;AACd,QAAI,KAAK,UAAW;AACpB,SAAK,YAAY;AACjB,QAAI,KAAK,WAAY,sBAAqB,KAAK,UAAU;AACzD,SAAK,aAAa;AAClB,UAAM,SAAS,CAAC,QAAgB,OAAyB;AACvD,UAAI;AACF,WAAG;AAAA,MACL,SAAS,OAAO;AACd,gBAAQ,MAAM,gBAAgB,MAAM,kBAAkB,KAAK;AAAA,MAC7D;AAAA,IACF;AACA,WAAO,cAAc,MAAM,KAAK,KAAK,iBAAiB,CAAC,CAAC,CAAC;AACzD,WAAO,YAAY,MAAM,KAAK,gBAAgB,CAAC;AAC/C,WAAO,YAAY,MAAM,KAAK,SAAS,QAAQ,CAAC;AAChD,WAAO,kBAAkB,MAAM,KAAK,eAAe,QAAQ,CAAC;AAC5D,WAAO,mBAAmB,MAAM,KAAK,gBAAgB,QAAQ,CAAC;AAC9D,WAAO,eAAe,MAAM,KAAK,YAAY,QAAQ,CAAC;AACtD,WAAO,cAAc,MAAM,KAAK,WAAW,QAAQ,CAAC;AACpD,WAAO,eAAe,MAAM,KAAK,mBAAmB,QAAQ,CAAC;AAC7D,WAAO,WAAW,MAAM,KAAK,eAAe,QAAQ,CAAC;AACrD,WAAO,aAAa,MAAM,KAAK,iBAAiB,QAAQ,CAAC;AACzD,WAAO,cAAc,MAAM,KAAK,cAAc,QAAQ,CAAC;AACvD,WAAO,cAAc,MAAM,KAAK,kBAAkB,QAAQ,CAAC;AAC3D,WAAO,UAAU,MAAM,KAAK,cAAc,QAAQ,CAAC;AACnD,WAAO,gBAAgB,MAAM,KAAK,aAAa,QAAQ,CAAC;AACxD,WAAO,kBAAkB,MAAM,KAAK,eAAe,QAAQ,CAAC;AAC5D,WAAO,sBAAsB,MAAM,KAAK,mBAAmB,QAAQ,CAAC;AACpE,WAAO,mBAAmB,MAAM,KAAK,gBAAgB,QAAQ,CAAC;AAC9D,WAAO,aAAa,MAAM,KAAK,iBAAiB,QAAQ,CAAC;AACzD,WAAO,YAAY,MAAM,KAAK,SAAS,QAAQ,CAAC;AAChD,SAAK,SAAS,MAAM;AAAA,EACtB;AACF;;;AChsBO,SAAS,WAAwB,WAAwB,UAA8B,CAAC,GAAmB;AAChH,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AACA,MAAI,OAAO,aAAa,aAAa;AACnC,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AACA,QAAM,OAAO,IAAI,SAAgB,WAAW,OAAO;AACnD,SAAO,KAAK,OAAO;AACrB;;;ACmBO,IAAM,mBAAmB;AAAA,EAC9B,YAAY,EAAE,MAAM,SAAS,QAAQ,aAAa;AAAA,EAClD,SAAS,EAAE,MAAM,SAAS,QAAQ,UAAU;AAAA,EAC5C,eAAe,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EACnD,UAAU,EAAE,MAAM,YAAY,QAAQ,UAAU;AAAA,EAChD,WAAW,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EAC/C,cAAc,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EAClD,WAAW,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EAC/C,cAAc,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EAClD,WAAW,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EAChD,MAAM,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EAC1C,aAAa,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EAClD,iBAAiB,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EACtD,OAAO,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EAC3C,iBAAiB,EAAE,MAAM,UAAU,QAAQ,cAAc;AAAA,EACzD,cAAc,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EACnD,iBAAiB,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EACrD,mBAAmB,EAAE,MAAM,YAAY,QAAQ,UAAU;AAAA,EACzD,iBAAiB,EAAE,MAAM,YAAY,QAAQ,UAAU;AAAA,EACvD,oBAAoB,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EACzD,YAAY,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EACjD,gBAAgB,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EACpD,kBAAkB,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EACtD,UAAU,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EAC9C,YAAY,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EAChD,UAAU,EAAE,MAAM,SAAS,QAAQ,UAAU;AAAA,EAC7C,QAAQ,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EAC5C,iBAAiB,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EACtD,eAAe,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EACpD,iBAAiB,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EACtD,aAAa,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EAClD,eAAe,EAAE,MAAM,YAAY,QAAQ,UAAU;AAAA,EACrD,UAAU,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EAC/C,aAAa,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EACjD,qBAAqB,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EAC1D,kBAAkB,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EACvD,aAAa,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EACjD,cAAc,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EACnD,eAAe,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EACnD,cAAc,EAAE,MAAM,YAAY,QAAQ,UAAU;AAAA,EACpD,kBAAkB,EAAE,MAAM,SAAS,QAAQ,UAAU;AAAA,EACrD,qBAAqB,EAAE,MAAM,SAAS,QAAQ,UAAU;AAAA,EACxD,YAAY,EAAE,MAAM,kBAAkB,QAAQ,UAAU;AAAA,EACxD,WAAW,EAAE,MAAM,kBAAkB,QAAQ,UAAU;AAAA,EACvD,kBAAkB,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EACvD,sBAAsB,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EAC3D,mBAAmB,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EACxD,aAAa,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EAClD,qBAAqB,EAAE,MAAM,YAAY,QAAQ,UAAU;AAAA,EAC3D,kBAAkB,EAAE,MAAM,YAAY,QAAQ,UAAU;AAAA,EACxD,kBAAkB,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EACtD,YAAY,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EACjD,YAAY,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EACjD,WAAW,EAAE,MAAM,kBAAkB,QAAQ,UAAU;AAAA,EACvD,YAAY,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EAChD,WAAW,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EAC/C,oBAAoB,EAAE,MAAM,UAAU,QAAQ,UAAU;AAAA,EACxD,mBAAmB,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EACxD,2BAA2B,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EAChE,uBAAuB,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EAC5D,qBAAqB,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EAC1D,SAAS,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EAC9C,uBAAuB,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EAC5D,wBAAwB,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EAC7D,wBAAwB,EAAE,MAAM,WAAW,QAAQ,UAAU;AAAA,EAC7D,WAAW,EAAE,MAAM,UAAU,QAAQ,UAAU;AACjD;AAEO,IAAM,mBAAmB,OAAO,OAAO,OAAO,KAAK,gBAAgB,CAAoB;AAEvF,IAAM,0BAA0B,OAAO;AAAA,EAC5C,iBAAiB,OAAO,CAAC,QAAQ,iBAAiB,GAAG,EAAE,WAAW,SAAS;AAC7E;;;ACjEA,SAAS,iBAAiB,GAA2B;AACnD,MAAI,EAAE,UAAU,KAAM,QAAO;AAC7B,MAAI,EAAE,UAAU,MAAO,QAAO;AAC9B,SAAO;AACT;AAEA,SAAS,cAAc,QAAwE;AAC7F,SAAO,CAAC,MAAM;AACZ,QAAI,EAAE,SAAS,QAAQ,EAAE,UAAU,GAAI,QAAO;AAC9C,UAAM,OAAO,EAAE,iBAAiB,OAAO,EAAE,MAAM,YAAY,IAAI,OAAO,EAAE,KAAK;AAC7E,WAAO,WAAW,aAAa,KAAK,MAAM,GAAG,EAAE,EAAE,QAAQ,KAAK,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE;AAAA,EACvF;AACF;AAEA,SAAS,gBAAgB,SAA8D;AACrF,SAAO,CAAC,MAAM;AACZ,QAAI,EAAE,SAAS,KAAM,QAAO;AAC5B,UAAM,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK;AACnD,WAAO,MAAM,IAAI,QAAQ,OAAO,EAAE,KAAK;AAAA,EACzC;AACF;AAEA,SAAS,cAAc,OAAqC;AAC1D,QAAM,OAAO,MAAM,QAAQ;AAC3B,QAAM,SAAsB;AAAA,IAC1B,OAAO,MAAM;AAAA,IACb,OAAO,MAAM;AAAA,IACb,YAAY,MAAM,SAAS,MAAM;AAAA,IACjC,OAAO,MAAM;AAAA,IACb,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,IAChB,MAAM,MAAM;AAAA,IACZ,QAAQ,MAAM,UAAU;AAAA,IACxB,MAAM,MAAM,UAAU;AAAA,IACtB,UAAU,MAAM,YAAY;AAAA,IAC5B,UAAU,MAAM,YAAY;AAAA,IAC5B,WAAW,MAAM,aAAa;AAAA,IAC9B,QAAQ,MAAM,eAAe,QAAQ,QAAQ,SAAS,WAAW,WAAW,SAAS,SAAS,SAAS,SAAS,WAAW,QAAQ;AAAA,IACnI,WAAW,MAAM;AAAA,EACnB;AAEA,MAAI,SAAS,UAAU;AACrB,WAAO,OAAO;AAAA,EAChB,WAAW,SAAS,QAAQ;AAC1B,WAAO,iBAAiB,cAAc,MAAM,MAAM;AAAA,EACpD,WAAW,SAAS,WAAW;AAC7B,WAAO,iBAAiB;AACxB,WAAO,SAAS,MAAM,eAAe,QAAQ,QAAQ;AAAA,EACvD,WAAW,SAAS,UAAU;AAC5B,UAAM,UAAU,MAAM,WAAW,CAAC;AAClC,WAAO,iBAAiB,gBAAgB,OAAO;AAC/C,QAAI,MAAM,UAAU;AAClB,aAAO,aAAa;AACpB,aAAO,mBAAmB,EAAE,QAAQ,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE;AAAA,IAClE;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,uBACd,QACwC;AACxC,QAAM,UAAU,IAAI,IAAI,OAAO,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC9D,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAAiD,CAAC;AAExD,aAAW,SAAS,OAAO,QAAQ;AACjC,QAAI,KAAK,IAAI,MAAM,KAAK,EAAG;AAC3B,UAAM,WAAW,OAAO,UAAU,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS,MAAM,KAAK,CAAC;AAChF,QAAI,CAAC,SAAS;AACZ,aAAO,KAAK,cAAc,KAAK,CAAC;AAChC,WAAK,IAAI,MAAM,KAAK;AAAA,IACtB;AAAA,EACF;AAEA,aAAW,SAAS,OAAO,UAAU,CAAC,GAAG;AACvC,UAAM,WAA4B,CAAC;AACnC,eAAW,aAAa,MAAM,QAAQ;AACpC,YAAM,QAAQ,QAAQ,IAAI,SAAS;AACnC,UAAI,CAAC,SAAS,KAAK,IAAI,SAAS,EAAG;AACnC,eAAS,KAAK,cAAc,KAAK,CAAC;AAClC,WAAK,IAAI,SAAS;AAAA,IACpB;AACA,QAAI,SAAS,SAAS,GAAG;AACvB,aAAO,KAAK,EAAE,YAAY,MAAM,OAAO,SAAS,CAAC;AAAA,IACnD;AAAA,EACF;AAEA,SAAO;AACT;;;AC5HA,IAAM,cAAc,EAAE,UAAU,OAAO,WAAW,OAAO,SAAS,OAAO,QAAQ,MAAM;AAEhF,SAAS,gBAA6B,YAAoC,CAAC,GAAkB;AAClG,SAAO;AAAA,IACL,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,mBAAmB;AAAA,IACnB,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;AAEO,SAAS,YAAyB,YAAoC,CAAC,GAAkB;AAC9F,SAAO;AAAA,IACL,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;AAEO,SAAS,WAAwB,YAAoC,CAAC,GAAkB;AAC7F,SAAO;AAAA,IACL,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,OAAO;AAAA,IACP,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;AAEO,SAAS,cACd,SAA8E,EAAE,SAAS,CAAC,EAAE,GAC7E;AACf,QAAM,EAAE,OAAO,QAAQ,GAAG,eAAe,IAAI;AAC7C,QAAM,WAAW,KAAK,IAAI,eAAe,SAAS,UAAU,GAAG,eAAe,OAAO,CAAC;AACtF,QAAM,eAAe,KAAK,IAAI,GAAG,QAAQ,IAAI,OAAO,eAAe,SAAS,UAAU,KAAK,WAAW,KAAK,KAAK;AAChH,SAAO;AAAA,IACL,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,OAAO,SAAS,KAAK,IAAI,IAAI,YAAY;AAAA,IACzC,QAAQ,UAAU;AAAA,IAClB,cAAc,4BAA4B,cAAqC;AAAA,IAC/E,GAAG;AAAA,IACH,oBAAoB;AAAA,EACtB;AACF;;;AtDoGO,IAAM,UAAkB,gBAAY;","names":["cols","input","container","end","PANES","node"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../package.json","../src/core/eventBus.ts","../src/core/resolveOptions.ts","../src/services/column.ts","../src/services/columnGroup.ts","../src/types/colDef.ts","../src/lib/layout.ts","../src/services/columnModel.ts","../src/services/filterService.ts","../src/lib/compare.ts","../src/services/sortService.ts","../src/lib/aggregate.ts","../src/services/rowModel.ts","../src/services/selectionService.ts","../src/lib/dom.ts","../src/services/resizeService.ts","../src/services/columnDragService.ts","../src/lib/csv.ts","../src/lib/clipboard.ts","../src/services/keyboardService.ts","../src/services/editors.ts","../src/render/runtimeState.ts","../src/render/cellContent.ts","../src/services/editingService.ts","../src/lib/locale.ts","../src/services/filterPopup.ts","../src/services/columnMenuService.ts","../src/services/contextMenuService.ts","../src/services/tooltipService.ts","../src/services/watermarkService.ts","../src/services/undoRedoService.ts","../src/services/changeTrackingService.ts","../src/types/events.ts","../src/lib/download.ts","../src/lib/path.ts","../src/services/gridApi.ts","../src/render/skeleton.ts","../src/lib/filterSummary.ts","../src/render/headerRenderer.ts","../src/services/rangeSelectionModel.ts","../src/services/rowDragController.ts","../src/render/bodyRenderer.ts","../src/render/summaryRenderer.ts","../src/render/paginationBar.ts","../src/render/pinnedRowsRenderer.ts","../src/render/statusBarService.ts","../src/lib/columnStateStore.ts","../src/lib/presetRenderers.ts","../src/lib/componentRegistry.ts","../src/lib/validateDefs.ts","../src/core/gridOptionMetadata.ts","../src/lib/validateOptions.ts","../src/core/gridCore.ts","../src/core/createGrid.ts","../src/lib/schema.ts","../src/lib/presetColumns.ts","../src/lib/columnHelper.ts","../src/lib/presets.ts","../src/lib/businessColumns.ts"],"sourcesContent":["import packageJson from \"../package.json\";\n\nexport { createGrid } from \"./core/createGrid\";\nexport { GridCore } from \"./core/gridCore\";\nexport { EventBus } from \"./core/eventBus\";\nexport { defaultComparator } from \"./lib/compare\";\nexport { getByPath, setByPath, isSafePath } from \"./lib/path\";\nexport { computeColumnWidths, fitColumnWidths } from \"./lib/layout\";\nexport type { WidthInput } from \"./lib/layout\";\n\nexport type {\n ColDef,\n ColDefGroup,\n ColDefOrGroup,\n ColumnState,\n ColumnFilter,\n FilterModel,\n FilterType,\n SortModel,\n SortModelItem,\n SortDirection,\n PinnedDirection,\n TextFilterMatch,\n NumberFilterMatch,\n DateFilterMatch,\n TextFilterCondition,\n NumberFilterCondition,\n DateFilterCondition,\n SetFilterCondition,\n SelectEditorParams,\n SetFilterParams,\n CellRendererFn,\n CellClassRule,\n CellEditorFactory,\n CellStyleRule,\n CellAlign\n} from \"./types/colDef\";\nexport { isColDefGroup } from \"./types/colDef\";\nexport type {\n ValueGetterParams,\n ValueFormatterParams,\n ValueSetterParams,\n CellRendererParams,\n CellClassParams,\n EditableParams,\n CellEditorParams,\n GetRowIdParams,\n GetRowHeightParams,\n HeaderComponentParams,\n ICellEditor,\n ICellRendererResult,\n CellRendererOutput\n} from \"./types/params\";\nexport type {\n GridOptions,\n ResolvedGridOptions,\n EventHandlers,\n RowSelectionMode,\n GridSize,\n ColumnLayoutMode,\n ThemeMode,\n GridEditType,\n EditableIndicator,\n RowEditValidationParams,\n RowEditValidationResult,\n DetailRowRendererParams,\n TreeDataLoadParams,\n GridComponents,\n GridFeature,\n GridFeatureContext,\n OverlayContent,\n OverlayTemplate,\n ColumnStateStore,\n StatusBarPanel,\n StatusBarConfig,\n GridDatasource,\n InfiniteGetRowsParams,\n PaginationConfig,\n WatermarkConfig,\n ActionPolicy,\n ActionPolicyContext\n} from \"./types/options\";\nexport { GRID_SIZE_PRESETS } from \"./core/resolveOptions\";\nexport type { GridSizePreset } from \"./core/resolveOptions\";\nexport { GRID_OPTION_META, GRID_OPTION_KEYS, DIRECT_GRID_OPTION_KEYS } from \"./core/gridOptionMetadata\";\nexport type {\n GridOptionKey,\n GridOptionMetadata,\n GridOptionUpdateMode,\n GridOptionValueKind\n} from \"./core/gridOptionMetadata\";\nexport { describeFilter } from \"./lib/filterSummary\";\nexport { validateGridOptions } from \"./lib/validateOptions\";\nexport type { GridValidationCode, GridValidationIssue } from \"./lib/validateOptions\";\nexport { buildColDefsFromSchema } from \"./lib/schema\";\nexport type { GridSchema, GridSchemaField, GridSchemaGroup, GridSchemaFieldType, SchemaSelectOption } from \"./lib/schema\";\nexport {\n saveColumnState,\n loadColumnState,\n clearColumnState,\n createColumnStateKey,\n createLocalColumnStateStore\n} from \"./lib/columnStateStore\";\nexport type {\n ColumnStateKeyParts,\n ColumnStateStorage,\n LocalColumnStateStoreOptions,\n ManagedColumnStateStore,\n StoredColumnState\n} from \"./lib/columnStateStore\";\nexport { BUILTIN_AGG_FUNCS, createAggResolver } from \"./lib/aggregate\";\nexport type { AggFunction, AggValues } from \"./lib/aggregate\";\nexport { DEFAULT_LOCALE, LOCALE_EN, matchLocaleKey, formatText, formatTwo } from \"./lib/locale\";\nexport type { RgLocale, RgLocaleKey } from \"./lib/locale\";\nexport { toTsv, parseTsv, parseCsv, parseDelimited } from \"./lib/clipboard\";\nexport { escapeHtml, downloadFile } from \"./lib/download\";\nexport { sanitizeFormulaCell } from \"./lib/csv\";\nexport {\n registerCellRenderer,\n registerCellEditor,\n getCellRenderer,\n getCellEditor,\n clearComponentRegistries\n} from \"./lib/componentRegistry\";\nexport {\n createStatusTagRenderer,\n createProgressBarRenderer,\n createActionButtonsRenderer,\n createRowActionsRenderer,\n linkRenderer,\n resolveTagVariant,\n registerBuiltinRenderers\n} from \"./lib/presetRenderers\";\nexport type {\n TagVariant,\n StatusTagConfig,\n ProgressConfig,\n ActionItem,\n ActionButtonsConfig,\n RowActionsConfig,\n ActionVariant,\n ActionOverflowMode\n} from \"./lib/presetRenderers\";\nexport { selectionColumn, indexColumn, dragColumn, actionsColumn, rowActionsColumn } from \"./lib/presetColumns\";\nexport { createColumnHelper, defineColumns } from \"./lib/columnHelper\";\nexport type { ColumnHelper, FieldPath, FieldPathValue } from \"./lib/columnHelper\";\nexport { createMachTablePreset, createEnterprisePreset, defineMachTablePreset, defineGridOptions } from \"./lib/presets\";\nexport {\n createBusinessColumnTypes,\n createCachedDictionary,\n createDictionaryRenderer\n} from \"./lib/businessColumns\";\nexport type {\n BusinessColumnType,\n BusinessColumnTypeOptions,\n CachedDictionary,\n CachedDictionaryOptions,\n DictionaryEntry,\n DictionaryKey,\n DictionaryRendererOptions\n} from \"./lib/businessColumns\";\nexport type { TooltipParams, ContextMenuParams, ContextMenuItem } from \"./types/params\";\nexport type {\n GridApi,\n CsvExportParams,\n RowTransaction,\n GridCellChange,\n GridChange,\n GridDiagnosticError,\n GridDiagnostics,\n ColumnWorkbenchItem,\n SaveChangesResult,\n SaveChangesHandler,\n ImportCsvOptions,\n PrintOptions\n} from \"./types/api\";\nexport type { RowNode } from \"./types/row\";\nexport type { GridState, GridStateSection, ApplyGridStateOptions } from \"./types/state\";\nexport type {\n GridEventMap,\n GridEventType,\n GridEventBase,\n GridReadyEvent,\n CellClickEvent,\n CellDoubleClickEvent,\n CellContextMenuEvent,\n RowClickEvent,\n SelectionChangedEvent,\n SortChangedEvent,\n FilterChangedEvent,\n ColumnResizedEvent,\n ColumnMovedEvent,\n ColumnVisibilityChangedEvent,\n CellValueChangedEvent,\n CellEditingStartedEvent,\n CellEditingStoppedEvent,\n RowEditingStartedEvent,\n RowEditingStoppedEvent,\n RowEditChange,\n ModelUpdatedEvent,\n DetailToggledEvent,\n TreeChildrenLoadedEvent,\n TreeChildrenLoadFailedEvent,\n RowDragEndEvent,\n RangeSelectionChangedEvent,\n GridCellRange,\n PaginationChangedEvent,\n GridErrorEvent,\n GridErrorCode,\n DirtyStateChangedEvent\n} from \"./types/events\";\nexport { EVENT_TYPES } from \"./types/events\";\nexport { Column } from \"./services/column\";\nexport { evaluateColumnFilter } from \"./services/filterService\";\nexport { sortNodes } from \"./services/sortService\";\n\nexport const version: string = packageJson.version;\n","{\n \"name\": \"@agile-team/mach-table\",\n \"version\": \"0.13.0\",\n \"description\": \"Enterprise-grade, framework-agnostic TypeScript data grid with virtualization, editing, grouping and extensibility\",\n \"keywords\": [\n \"data-grid\",\n \"table\",\n \"virtualization\",\n \"typescript\",\n \"enterprise\",\n \"vue\",\n \"react\"\n ],\n \"author\": \"ChenyCHENYU (Agile Team)\",\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"homepage\": \"https://github.com/ChenyCHENYU/MachTable#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/ChenyCHENYU/MachTable/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/ChenyCHENYU/MachTable.git\",\n \"directory\": \"packages/core\"\n },\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./styles/mach-table.css\": {\n \"types\": \"./styles/mach-table.css.d.ts\",\n \"default\": \"./styles/mach-table.css\"\n }\n },\n \"files\": [\n \"dist\",\n \"styles\"\n ],\n \"sideEffects\": [\n \"**/*.css\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:coverage\": \"vitest run --coverage\"\n }\n}\n","type EventKey<TEvents extends object> = Extract<keyof TEvents, string>;\ntype Listener<TEvent> = (event: TEvent) => void;\n\nexport class EventBus<TEvents extends object = Record<string, any>> {\n private listeners = new Map<EventKey<TEvents>, Set<Listener<any>>>();\n\n constructor(private onListenerError?: (error: unknown, eventType: EventKey<TEvents>) => void) {}\n\n on<K extends EventKey<TEvents>>(type: K, listener: Listener<TEvents[K]>): () => void {\n let set = this.listeners.get(type);\n if (!set) {\n set = new Set();\n this.listeners.set(type, set);\n }\n set.add(listener as Listener<any>);\n return () => {\n set.delete(listener);\n };\n }\n\n once<K extends EventKey<TEvents>>(type: K, listener: Listener<TEvents[K]>): () => void {\n const off = this.on(type, (event) => {\n off();\n listener(event);\n });\n return off;\n }\n\n off<K extends EventKey<TEvents>>(type: K, listener: Listener<TEvents[K]>): void {\n const set = this.listeners.get(type);\n if (set) {\n set.delete(listener as Listener<any>);\n if (set.size === 0) this.listeners.delete(type);\n }\n }\n\n emit<K extends EventKey<TEvents>>(type: K, payload?: TEvents[K]): void {\n const set = this.listeners.get(type);\n if (!set) return;\n for (const listener of [...set]) {\n try {\n listener(payload);\n } catch (err) {\n console.error(`[mach-table] error in \"${type}\" listener`, err);\n this.onListenerError?.(err, type);\n }\n }\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import type { GridOptions, GridSize, ResolvedGridOptions } from \"../types/options\";\nimport type { ColDef } from \"../types/colDef\";\n\nexport const DEFAULT_COL_DEF: Partial<ColDef> = {\n sortable: true,\n resizable: true,\n movable: true,\n filter: false,\n minWidth: 80\n};\n\nexport interface GridSizePreset {\n rowHeight: number;\n headerHeight: number;\n fontSize: number;\n cellPadding: number;\n}\n\nexport const GRID_SIZE_PRESETS: Record<GridSize, GridSizePreset> = {\n compact: { rowHeight: 30, headerHeight: 34, fontSize: 12, cellPadding: 6 },\n normal: { rowHeight: 36, headerHeight: 40, fontSize: 13, cellPadding: 9 },\n large: { rowHeight: 44, headerHeight: 48, fontSize: 14, cellPadding: 12 }\n};\n\nfunction finiteAtLeast(value: unknown, fallback: number, min: number, integer = false): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < min) return fallback;\n return integer ? Math.floor(value) : value;\n}\n\nfunction resolveSize(value: GridOptions[\"size\"]): GridSize {\n return value && Object.prototype.hasOwnProperty.call(GRID_SIZE_PRESETS, value) ? value : \"normal\";\n}\n\nfunction resolveTheme(options: GridOptions): ResolvedGridOptions[\"theme\"] {\n if (options.theme === \"light\" || options.theme === \"dark\" || options.theme === \"auto\") return options.theme;\n return options.className?.includes(\"mach-theme-dark\") ? \"dark\" : \"light\";\n}\n\nfunction resolvePageSizeOptions<TData>(options: GridOptions<TData>, pageSize: number): number[] {\n const requested =\n typeof options.pagination === \"object\" && Array.isArray(options.pagination.pageSizeOptions)\n ? options.pagination.pageSizeOptions\n : undefined;\n const values = requested\n ? [...new Set(requested.map((value) => finiteAtLeast(value, 0, 1, true)).filter(Boolean))]\n : [10, 20, 50, 100];\n if (!values.includes(pageSize)) values.push(pageSize);\n return values.sort((left, right) => left - right);\n}\n\nfunction resolveDataAndLayout<TData>(options: GridOptions<TData>, size: GridSize) {\n const preset = GRID_SIZE_PRESETS[size];\n return {\n columnDefs: Array.isArray(options.columnDefs) ? options.columnDefs : [],\n rowData: Array.isArray(options.rowData) ? options.rowData : [],\n defaultColDef: { ...DEFAULT_COL_DEF, ...(options.defaultColDef ?? {}) },\n columnTypes: options.columnTypes ?? {},\n rowHeight: finiteAtLeast(options.rowHeight, preset.rowHeight, 1),\n headerHeight: finiteAtLeast(options.headerHeight, preset.headerHeight, 1),\n rowBuffer: finiteAtLeast(options.rowBuffer, 8, 0, true),\n columnLayout: options.columnLayout === \"fit\" ? \"fit\" as const : \"normal\" as const,\n rowSelection:\n options.rowSelection === \"single\" || options.rowSelection === \"multiple\"\n ? options.rowSelection\n : \"none\" as const,\n multiSort: options.multiSort ?? true,\n size,\n pinnedTopRowData: Array.isArray(options.pinnedTopRowData) ? options.pinnedTopRowData : [],\n pinnedBottomRowData: Array.isArray(options.pinnedBottomRowData) ? options.pinnedBottomRowData : []\n };\n}\n\nfunction resolveAppearance(options: GridOptions) {\n return {\n stripedRows: options.stripedRows ?? false,\n showCellBorders: options.showCellBorders ?? false,\n theme: resolveTheme(options),\n quickFilterText: options.quickFilterText ?? null,\n suppressCellFocus: options.suppressCellFocus ?? false,\n suppressRowHoverHighlight: options.suppressRowHoverHighlight ?? false,\n suppressNoRowsOverlay: options.suppressNoRowsOverlay ?? false,\n suppressHeaderFocus: options.suppressHeaderFocus ?? false,\n loading: options.loading ?? false,\n className: options.className ?? \"\"\n };\n}\n\nfunction resolveEditingAndHistory(options: GridOptions) {\n return {\n editType: options.editType === \"fullRow\" ? \"fullRow\" as const : \"cell\" as const,\n editableIndicator:\n options.editableIndicator === \"always\" || options.editableIndicator === \"none\"\n ? options.editableIndicator\n : \"hover\" as const,\n singleClickEdit: options.singleClickEdit ?? false,\n manualSorting: options.manualSorting ?? false,\n manualFiltering: options.manualFiltering ?? false,\n showSummary: options.showSummary ?? false,\n indexOffset: options.indexOffset ?? 0,\n applyRowDrag: options.applyRowDrag ?? true,\n undoStackSize: finiteAtLeast(options.undoStackSize, 100, 0, true),\n asyncTransactionWaitMillis: finiteAtLeast(options.asyncTransactionWaitMillis, 16, 0, true)\n };\n}\n\nfunction resolveHierarchy(options: GridOptions) {\n return {\n masterDetail: options.masterDetail ?? false,\n detailRowHeight: finiteAtLeast(options.detailRowHeight, 240, 1),\n detailToggleColumn: options.detailToggleColumn ?? true,\n treeData: options.treeData ?? false,\n childrenKey: options.childrenKey ?? \"children\",\n autoCheckedChildren: options.autoCheckedChildren ?? true,\n defaultExpandAll: options.defaultExpandAll ?? false\n };\n}\n\nfunction resolvePagination<TData>(options: GridOptions<TData>) {\n const config = typeof options.pagination === \"object\" ? options.pagination : undefined;\n const pageSize = finiteAtLeast(\n config?.pageSize,\n 20,\n 1,\n true\n );\n return {\n paginationEnabled: options.pagination !== false && options.datasource == null,\n paginationMode: config?.mode === \"server\" ? \"server\" as const : \"client\" as const,\n paginationPage: finiteAtLeast(config?.page, 1, 1, true),\n paginationTotal: finiteAtLeast(config?.total, 0, 0, true),\n paginationPageSize: pageSize,\n paginationPageSizeOptions: resolvePageSizeOptions(options, pageSize),\n paginationShowTotal: config ? config.showTotal !== false : true,\n paginationShowSizeSelector: config ? config.showPageSizeSelector !== false : true\n };\n}\n\nfunction resolveWatermark(options: GridOptions) {\n return {\n watermarkEnabled: options.watermark != null && options.watermark !== false,\n watermarkConfig:\n options.watermark == null || options.watermark === false\n ? null\n : options.watermark === true\n ? { text: \"MachTable\" }\n : options.watermark\n };\n}\n\nfunction resolveInteraction(options: GridOptions) {\n return {\n columnMenu: options.columnMenu ?? false,\n columnStateKey: options.columnStateKey ?? null,\n locale: options.locale ?? {},\n suppressWarnings: options.suppressWarnings ?? false,\n enableRangeSelection: options.enableRangeSelection ?? false,\n suppressClipboard: options.suppressClipboard ?? false,\n contextMenu: options.contextMenu ?? false,\n tooltipShowDelay: finiteAtLeast(options.tooltipShowDelay, 600, 0),\n flashCells: options.flashCells ?? true,\n fillHandle: options.fillHandle ?? true,\n statusBarEnabled:\n options.statusBar === true || (typeof options.statusBar === \"object\" && options.statusBar != null),\n statusBarPanels:\n typeof options.statusBar === \"object\" && options.statusBar?.panels\n ? options.statusBar.panels\n : [\"rowCount\", \"selectedRowCount\", \"rangeAggregate\"] as const\n };\n}\n\nfunction resolveDatasource(options: GridOptions) {\n return {\n blockSize: finiteAtLeast(options.blockSize, 100, 1, true),\n infiniteBufferRows: finiteAtLeast(options.infiniteBufferRows, 40, 0, true),\n datasourceRetryCount: finiteAtLeast(options.datasourceRetryCount, 2, 0, true),\n datasourceRetryDelay: finiteAtLeast(options.datasourceRetryDelay, 300, 0, true)\n };\n}\n\nfunction resolveAccessibility(options: GridOptions) {\n return {\n ariaLabel: options.ariaLabel ?? \"MachTable data grid\",\n ariaLabelledBy: options.ariaLabelledBy ?? \"\",\n ariaDescribedBy: options.ariaDescribedBy ?? \"\",\n overlayNoRowsTemplate: options.overlayNoRowsTemplate ?? \"\",\n overlayLoadingTemplate: options.overlayLoadingTemplate ?? \"\",\n allowUnsafeOverlayHtml: options.allowUnsafeOverlayHtml ?? false\n };\n}\n\nconst OPTIONAL_OPTION_KEYS = [\n \"getRowId\",\n \"detailRowRenderer\",\n \"isRowExpandable\",\n \"columnStateStore\",\n \"aggFuncs\",\n \"components\",\n \"actionPolicy\",\n \"summaryMethod\",\n \"datasource\",\n \"getRowHeight\",\n \"tooltipComponent\",\n \"getContextMenuItems\",\n \"initialState\",\n \"rowEditValidator\",\n \"isTreeRowExpandable\",\n \"loadTreeChildren\"\n] as const;\n\nfunction copyOptionalOptions<TData>(\n source: GridOptions<TData>,\n target: ResolvedGridOptions<TData>\n): void {\n for (const key of OPTIONAL_OPTION_KEYS) {\n if (source[key]) Object.assign(target, { [key]: source[key] });\n }\n}\n\nfunction copyEventHandlers<TData>(source: GridOptions<TData>, target: ResolvedGridOptions<TData>): void {\n for (const key of Object.keys(source) as (keyof GridOptions<TData>)[]) {\n if (key.startsWith(\"on\") && typeof source[key] === \"function\") {\n Object.assign(target, { [key]: source[key] });\n }\n }\n}\n\nexport function resolveOptions<TData>(userOptions: GridOptions<TData>): ResolvedGridOptions<TData> {\n const size = resolveSize(userOptions.size);\n const resolved = {\n ...resolveDataAndLayout(userOptions, size),\n ...resolveAppearance(userOptions),\n ...resolveEditingAndHistory(userOptions),\n ...resolveHierarchy(userOptions),\n ...resolvePagination(userOptions),\n ...resolveWatermark(userOptions),\n ...resolveInteraction(userOptions),\n ...resolveDatasource(userOptions),\n ...resolveAccessibility(userOptions),\n features: Array.isArray(userOptions.features) ? userOptions.features : []\n } as ResolvedGridOptions<TData>;\n\n copyOptionalOptions(userOptions, resolved);\n copyEventHandlers(userOptions, resolved);\n\n return resolved;\n}\n\nexport function columnTypeNames(type: ColDef[\"type\"]): readonly string[] {\n if (Array.isArray(type)) return type.filter((name): name is string => typeof name === \"string\" && name.length > 0);\n return typeof type === \"string\" && type.length > 0 ? [type] : [];\n}\n\nexport function hasColumnType(colDef: Pick<ColDef, \"type\">, name: string): boolean {\n return columnTypeNames(colDef.type).includes(name);\n}\n\nexport function mergeColDef<TData>(\n colDef: ColDef<TData>,\n defaults: Partial<ColDef<TData>>,\n columnTypes: Readonly<Record<string, Partial<ColDef<TData>>>> = {}\n): ColDef<TData> {\n const typedDefaults: Partial<ColDef<TData>> = {};\n for (const name of columnTypeNames(colDef.type)) {\n const definition = columnTypes[name];\n if (definition) Object.assign(typedDefaults, definition);\n }\n return { ...defaults, ...typedDefaults, ...colDef } as ColDef<TData>;\n}\n","import type { ColDef, FilterType, PinnedDirection } from \"../types/colDef\";\nimport type { ColumnGroup } from \"./columnGroup\";\n\nexport class Column<TData = any> {\n readonly id: string;\n readonly colDef: ColDef<TData>;\n hide: boolean;\n pinned: PinnedDirection | null;\n manualWidth: number | null = null;\n currentWidth = 0;\n parentGroup: ColumnGroup<TData> | null = null;\n level = 0;\n isDetailToggle = false;\n\n constructor(id: string, colDef: ColDef<TData>) {\n this.id = id;\n this.colDef = colDef;\n this.hide = colDef.hide ?? false;\n const p = colDef.pinned;\n this.pinned = p === true ? \"left\" : p === false || p == null ? null : p;\n }\n\n get sortable(): boolean {\n return this.colDef.sortable !== false;\n }\n\n get resizable(): boolean {\n return this.colDef.resizable !== false;\n }\n\n get movable(): boolean {\n return this.colDef.movable !== false;\n }\n\n get filterable(): boolean {\n return this.colDef.filter != null && this.colDef.filter !== false;\n }\n\n get filterType(): FilterType {\n const f = this.colDef.filter;\n return f === true ? \"text\" : (f as FilterType) ?? \"text\";\n }\n\n get hasCheckbox(): boolean {\n return this.colDef.checkboxSelection === true;\n }\n}\n","import type { ColDefGroup } from \"../types/colDef\";\nimport type { Column } from \"./column\";\n\nexport class ColumnGroup<TData = any> {\n readonly groupId: string;\n readonly def: ColDefGroup<TData>;\n parent: ColumnGroup<TData> | null = null;\n children: (ColumnGroup<TData> | Column<TData>)[] = [];\n\n constructor(groupId: string, def: ColDefGroup<TData>) {\n this.groupId = groupId;\n this.def = def;\n }\n\n get headerName(): string {\n return this.def.headerName ?? this.def.groupId ?? \"\";\n }\n\n getLeafColumns(out: Column<TData>[] = []): Column<TData>[] {\n for (const child of this.children) {\n if (child instanceof ColumnGroup) child.getLeafColumns(out);\n else out.push(child);\n }\n return out;\n }\n}\n","import type {\n CellClassParams,\n CellEditorParams,\n CellRendererParams,\n EditableParams,\n HeaderComponentParams,\n ICellEditor,\n ICellRendererResult,\n ValueFormatterParams,\n ValueGetterParams,\n ValueSetterParams\n} from \"./params\";\nimport type { CellClickEvent, CellDoubleClickEvent } from \"./events\";\nimport type { RowNode } from \"./row\";\n\nexport type SortDirection = \"asc\" | \"desc\";\nexport type PinnedDirection = \"left\" | \"right\";\nexport type FilterType = \"text\" | \"number\" | \"date\" | \"set\";\nexport type CellAlign = \"left\" | \"center\" | \"right\";\n\nexport type TextFilterMatch =\n | \"contains\"\n | \"notContains\"\n | \"equals\"\n | \"notEquals\"\n | \"startsWith\"\n | \"endsWith\"\n | \"blank\"\n | \"notBlank\";\n\nexport type NumberFilterMatch =\n | \"equals\"\n | \"notEquals\"\n | \"lessThan\"\n | \"lessThanOrEqual\"\n | \"greaterThan\"\n | \"greaterThanOrEqual\"\n | \"inRange\"\n | \"blank\"\n | \"notBlank\";\n\nexport type DateFilterMatch =\n | \"equals\"\n | \"notEquals\"\n | \"lessThan\"\n | \"greaterThan\"\n | \"inRange\"\n | \"blank\"\n | \"notBlank\";\n\nexport interface TextFilterCondition {\n match: TextFilterMatch;\n value?: string;\n}\n\nexport interface NumberFilterCondition {\n match: NumberFilterMatch;\n value?: number;\n value2?: number;\n}\n\nexport interface DateFilterCondition {\n match: DateFilterMatch;\n value?: string;\n value2?: string;\n}\n\nexport interface SetFilterCondition {\n values: (string | number | null)[];\n}\n\nexport interface TextColumnFilter {\n type: \"text\";\n operator?: \"and\" | \"or\";\n conditions: TextFilterCondition[];\n}\n\nexport interface NumberColumnFilter {\n type: \"number\";\n operator?: \"and\" | \"or\";\n conditions: NumberFilterCondition[];\n}\n\nexport interface DateColumnFilter {\n type: \"date\";\n operator?: \"and\" | \"or\";\n conditions: DateFilterCondition[];\n}\n\nexport interface SetColumnFilter {\n type: \"set\";\n values: (string | number | null)[];\n}\n\nexport type ColumnFilter = TextColumnFilter | NumberColumnFilter | DateColumnFilter | SetColumnFilter;\nexport type FilterModel = Record<string, ColumnFilter>;\n\nexport interface SortModelItem {\n colId: string;\n direction: SortDirection;\n}\nexport type SortModel = SortModelItem[];\n\nexport interface SelectEditorParams {\n values: (string | number)[];\n}\n\nexport interface SetFilterParams {\n values?: (string | number | null)[];\n maxValues?: number;\n}\n\nexport type CellEditorFactory = (params: CellEditorParams) => ICellEditor;\n\nexport type CellRendererFn = (params: CellRendererParams) => string | HTMLElement | ICellRendererResult | null | undefined;\n\nexport type CellClassRule = string | string[] | ((params: CellClassParams) => string | string[] | null | undefined);\n\nexport type CellStyleRule = Partial<CSSStyleDeclaration> | ((params: CellClassParams<any, any>) => Partial<CSSStyleDeclaration> | null | undefined);\n\nexport interface ColDef<TData = any, TValue = any> {\n colId?: string;\n field?: string;\n headerName?: string;\n align?: CellAlign;\n headerAlign?: CellAlign;\n headerClass?: string | string[];\n headerTooltip?: string;\n headerComponent?: (params: HeaderComponentParams<TData>) => string | HTMLElement | ICellRendererResult | null | undefined;\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n flex?: number;\n /** Excludes the column from `columnLayout: \"fit\"` scaling. */\n suppressSizeToFit?: boolean;\n hide?: boolean;\n pinned?: PinnedDirection | boolean;\n sortable?: boolean;\n resizable?: boolean;\n movable?: boolean;\n filter?: boolean | FilterType;\n filterParams?: SetFilterParams;\n editable?: boolean | ((params: EditableParams<TData, TValue>) => boolean);\n cellEditor?: \"text\" | \"number\" | \"date\" | \"select\" | CellEditorFactory | string;\n cellEditorParams?: SelectEditorParams;\n wrapText?: boolean;\n checkboxSelection?: boolean;\n rowGroup?: boolean;\n aggFunc?: string;\n cellStyle?: CellStyleRule;\n selectable?: (params: CellClassParams<TData, TValue>) => boolean;\n singleClickEdit?: boolean;\n tooltipValueGetter?: (params: ValueFormatterParams<TData, TValue>) => string | null | undefined;\n rowSpan?: (params: CellClassParams<TData, TValue>) => number;\n autoRowSpan?: boolean;\n colSpan?: (params: CellClassParams<TData, TValue>) => number;\n autoHeight?: boolean;\n validate?: (\n newValue: TValue,\n params: ValueSetterParams<TData, TValue>\n ) => string | true | null | undefined | Promise<string | true | null | undefined>;\n rowDrag?: boolean;\n valueGetter?: (params: ValueGetterParams<TData, TValue>) => TValue;\n valueSetter?: (params: ValueSetterParams<TData, TValue>) => boolean;\n valueFormatter?: (params: ValueFormatterParams<TData, TValue>) => any;\n cellRenderer?: CellRendererFn | string;\n cellRendererParams?: Record<string, any>;\n cellClass?: CellClassRule;\n comparator?: (valueA: any, valueB: any, nodeA: RowNode<TData>, nodeB: RowNode<TData>) => number;\n /** Named column type(s), resolved left-to-right before this column definition. */\n type?: string | readonly string[];\n initialSort?: SortDirection;\n onCellClick?: (event: CellClickEvent<TData, TValue>) => void;\n onCellDoubleClick?: (event: CellDoubleClickEvent<TData, TValue>) => void;\n}\n\nexport interface ColDefGroup<TData = any> {\n groupId?: string;\n headerName?: string;\n headerClass?: string | string[];\n children: (ColDefGroup<TData> | ColDef<TData>)[];\n}\n\nexport type ColDefOrGroup<TData = any> = ColDefGroup<TData> | ColDef<TData>;\n\nexport function isColDefGroup<TData = any>(def: ColDefOrGroup<TData>): def is ColDefGroup<TData> {\n return Array.isArray((def as ColDefGroup<TData>).children);\n}\n\nexport interface ColumnState {\n colId: string;\n hide?: boolean;\n width?: number;\n pinned?: \"left\" | \"right\" | null;\n sort?: SortDirection | null;\n sortIndex?: number | null;\n}\n","export interface WidthInput {\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n flex?: number;\n}\n\nexport const DEFAULT_COLUMN_WIDTH = 150;\nexport const DEFAULT_MIN_WIDTH = 80;\n\nexport function clampWidth(w: number, input: WidthInput): number {\n const min = input.minWidth ?? DEFAULT_MIN_WIDTH;\n const max = input.maxWidth ?? Number.MAX_SAFE_INTEGER;\n return Math.max(min, Math.min(max, w));\n}\n\nexport function computeColumnWidths(cols: WidthInput[], availableWidth: number): number[] {\n const widths = cols.map((c) => clampWidth(c.width ?? DEFAULT_COLUMN_WIDTH, c));\n\n const flexCols: number[] = [];\n let flexTotal = 0;\n cols.forEach((c, i) => {\n const f = c.flex ?? 0;\n if (f > 0) {\n flexCols.push(i);\n flexTotal += f;\n }\n });\n\n let total = 0;\n for (const w of widths) total += w;\n\n if (flexTotal > 0 && availableWidth > total) {\n let extra = availableWidth - total;\n for (let pass = 0; pass < 4 && extra > 0.5 && flexCols.length > 0; pass++) {\n const remainingFlex: number[] = [];\n let remainingTotal = 0;\n for (const i of flexCols) {\n const f = cols[i].flex ?? 0;\n remainingFlex.push(i);\n remainingTotal += f;\n }\n const consumed: number[] = [];\n for (let k = 0; k < remainingFlex.length; k++) {\n const i = remainingFlex[k];\n const f = cols[i].flex ?? 0;\n const share = (extra * f) / remainingTotal;\n const before = widths[i];\n widths[i] = clampWidth(before + share, cols[i]);\n consumed.push(widths[i] - before);\n }\n let used = 0;\n for (const c of consumed) used += c;\n extra -= used;\n const stillFlexible = remainingFlex.filter((_index, k) => consumed[k] > 0.001);\n if (stillFlexible.length === remainingFlex.length) break;\n flexCols.length = 0;\n for (const i of stillFlexible) flexCols.push(i);\n }\n }\n\n return widths;\n}\n\n/** Fits columns into a viewport while honoring every min/max bound. */\nexport function fitColumnWidths(cols: WidthInput[], availableWidth: number): number[] {\n const widths = cols.map((column) => clampWidth(column.width ?? DEFAULT_COLUMN_WIDTH, column));\n if (!Number.isFinite(availableWidth) || availableWidth <= 0 || cols.length === 0) return widths;\n\n const active = new Set(cols.map((_column, index) => index));\n let remainingWidth = availableWidth;\n for (let pass = 0; pass < cols.length + 1 && active.size > 0; pass++) {\n let weightTotal = 0;\n for (const index of active) weightTotal += Math.max(1, widths[index]);\n if (weightTotal <= 0) break;\n\n let constrained = false;\n for (const index of [...active]) {\n const target = remainingWidth * (Math.max(1, widths[index]) / weightTotal);\n const fitted = clampWidth(target, cols[index]);\n const min = cols[index].minWidth ?? DEFAULT_MIN_WIDTH;\n const max = cols[index].maxWidth ?? Number.MAX_SAFE_INTEGER;\n if (target < min || target > max) {\n widths[index] = fitted;\n remainingWidth -= fitted;\n active.delete(index);\n constrained = true;\n }\n }\n if (!constrained) {\n for (const index of active) {\n widths[index] = clampWidth(\n remainingWidth * (Math.max(1, widths[index]) / weightTotal),\n cols[index]\n );\n }\n break;\n }\n remainingWidth = Math.max(0, remainingWidth);\n }\n\n const drift = availableWidth - widths.reduce((sum, width) => sum + width, 0);\n if (Math.abs(drift) > 0.01) {\n for (let index = widths.length - 1; index >= 0; index--) {\n const candidate = clampWidth(widths[index] + drift, cols[index]);\n if (Math.abs(candidate - widths[index]) > 0.01) {\n widths[index] = candidate;\n break;\n }\n }\n }\n return widths;\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport { Column } from \"./column\";\nimport { ColumnGroup } from \"./columnGroup\";\nimport type {\n ColDef,\n ColDefOrGroup,\n ColumnState,\n SortModel,\n SortModelItem,\n SortDirection,\n PinnedDirection\n} from \"../types/colDef\";\nimport { isColDefGroup } from \"../types/colDef\";\nimport { mergeColDef } from \"../core/resolveOptions\";\nimport { computeColumnWidths, fitColumnWidths, clampWidth, DEFAULT_COLUMN_WIDTH } from \"../lib/layout\";\n\nexport type PaneType = \"left\" | \"center\" | \"right\";\n\nexport const DETAIL_TOGGLE_COL_ID = \"__rg_detail_toggle__\";\ntype ColumnModelContext = Pick<GridCore<any>, \"options\">;\n\nexport class ColumnModel {\n private columns: Column[] = [];\n private rootChildren: (ColumnGroup<any> | Column<any>)[] = [];\n private left: Column[] = [];\n private center: Column[] = [];\n private right: Column[] = [];\n private sortModel: SortModelItem[] = [];\n private defs: ColDefOrGroup<any>[] = [];\n private headerDepth = 1;\n private flatIndexById = new Map<string, number>();\n viewportWidth = 0;\n\n constructor(private core: ColumnModelContext) {}\n\n setColumnDefs(colDefs: ColDefOrGroup<any>[] | null | undefined): void {\n this.defs = colDefs ? [...colDefs] : [];\n const prev = new Map(this.columns.map((c) => [c.id, c]));\n const defaults = this.core.options.defaultColDef;\n const usedIds = new Set<string>(\n this.core.options.masterDetail && this.core.options.detailToggleColumn\n ? [DETAIL_TOGGLE_COL_ID]\n : []\n );\n\n const build = (list: ColDefOrGroup<any>[], parent: ColumnGroup<any> | null, level: number): (ColumnGroup<any> | Column<any>)[] =>\n list.map((def, i) => {\n if (isColDefGroup(def)) {\n const groupId = def.groupId ?? def.headerName ?? `group_${i}_${level}`;\n const group = new ColumnGroup(groupId, def);\n group.parent = parent;\n group.children = build(def.children, group, level + 1);\n return group;\n }\n const colDef = def as ColDef<any>;\n const id = colDef.colId ?? colDef.field ?? `col_${i}`;\n let uniqueId = id;\n let suffix = 2;\n while (usedIds.has(uniqueId)) uniqueId = `${id}_${suffix++}`;\n usedIds.add(uniqueId);\n const column = new Column(uniqueId, mergeColDef(colDef, defaults, this.core.options.columnTypes));\n column.parentGroup = parent;\n column.level = level;\n const p = prev.get(uniqueId);\n if (p) {\n column.manualWidth = p.manualWidth;\n column.hide = p.hide;\n column.pinned = p.pinned;\n }\n return column;\n });\n\n this.rootChildren = build(this.defs, null, 0);\n\n if (this.core.options.masterDetail && this.core.options.detailToggleColumn) {\n const toggleCol = new Column(DETAIL_TOGGLE_COL_ID, {\n colId: DETAIL_TOGGLE_COL_ID,\n headerName: \"\",\n width: 38,\n pinned: \"left\",\n sortable: false,\n resizable: false,\n movable: false,\n filter: false\n });\n toggleCol.isDetailToggle = true;\n this.rootChildren.unshift(toggleCol);\n }\n\n this.columns = this.collectLeaves(this.rootChildren);\n this.headerDepth = this.columns.reduce((max, c) => Math.max(max, c.level + 1), 1);\n\n this.sortModel = this.sortModel.filter((s) => this.columns.some((c) => c.id === s.colId));\n if (this.sortModel.length === 0) {\n const initial: SortModelItem[] = [];\n for (const c of this.columns) {\n if (c.colDef.initialSort) initial.push({ colId: c.id, direction: c.colDef.initialSort });\n }\n this.sortModel = initial;\n }\n\n this.regroup();\n }\n\n private collectLeaves(children: (ColumnGroup<any> | Column<any>)[], out: Column<any>[] = []): Column<any>[] {\n for (const child of children) {\n if (child instanceof ColumnGroup) this.collectLeaves(child.children, out);\n else out.push(child);\n }\n return out;\n }\n\n private regroup(): void {\n const visible = this.columns.filter((c) => !c.hide);\n this.left = visible.filter((c) => c.pinned === \"left\");\n this.right = visible.filter((c) => c.pinned === \"right\");\n this.center = visible.filter((c) => c.pinned === null);\n this.flatIndexById.clear();\n this.getOrderedVisible().forEach((c, i) => this.flatIndexById.set(c.id, i));\n }\n\n getFlatIndex(colId: string): number {\n return this.flatIndexById.get(colId) ?? -1;\n }\n\n getColumns(): Column[] {\n return this.columns;\n }\n\n getColumnDefs(): ColDefOrGroup<any>[] {\n return this.defs;\n }\n\n getRootChildren(): (ColumnGroup<any> | Column<any>)[] {\n return this.rootChildren;\n }\n\n getHeaderDepth(): number {\n return this.headerDepth;\n }\n\n getColumn(colId: string): Column | undefined {\n return this.columns.find((c) => c.id === colId);\n }\n\n getPaneColumns(pane: PaneType): Column[] {\n return pane === \"left\" ? this.left : pane === \"right\" ? this.right : this.center;\n }\n\n getOrderedVisible(): Column[] {\n return [...this.left, ...this.center, ...this.right];\n }\n\n getRowGroupColumns(): Column[] {\n return this.getOrderedVisible().filter((c) => c.colDef.rowGroup === true);\n }\n\n getAggColumns(): Column[] {\n return this.getOrderedVisible().filter((c) => c.colDef.aggFunc != null && c.colDef.rowGroup !== true);\n }\n\n hasColSpan(): boolean {\n return this.center.some((c) => c.colDef.colSpan != null);\n }\n\n getGroupLabelColumn(): Column | undefined {\n const ordered = this.getOrderedVisible();\n return (\n this.center.find((c) => !c.hasCheckbox && !c.isDetailToggle) ??\n ordered.find((c) => !c.hasCheckbox && !c.isDetailToggle) ??\n ordered[0]\n );\n }\n\n paneOf(column: Column): PaneType {\n return column.pinned === \"left\" ? \"left\" : column.pinned === \"right\" ? \"right\" : \"center\";\n }\n\n computeLayout(viewportWidth: number): void {\n this.viewportWidth = viewportWidth;\n\n let pinnedTotal = 0;\n for (const c of [...this.left, ...this.right]) {\n c.currentWidth = clampWidth(c.manualWidth ?? c.colDef.width ?? DEFAULT_COLUMN_WIDTH, this.widthInputOf(c));\n pinnedTotal += c.currentWidth;\n }\n\n const available = Math.max(0, viewportWidth - pinnedTotal);\n const scalable = this.center.filter((column) => !column.colDef.suppressSizeToFit);\n const fixed = this.center.filter((column) => column.colDef.suppressSizeToFit);\n let fixedTotal = 0;\n for (const column of fixed) {\n column.currentWidth = clampWidth(\n column.manualWidth ?? column.colDef.width ?? DEFAULT_COLUMN_WIDTH,\n this.widthInputOf(column)\n );\n fixedTotal += column.currentWidth;\n }\n const scalableInputs = scalable.map((column) => this.widthInputOf(column));\n const scalableWidth = Math.max(0, available - fixedTotal);\n const widths = this.core.options.columnLayout === \"fit\"\n ? fitColumnWidths(scalableInputs, scalableWidth)\n : computeColumnWidths(scalableInputs, scalableWidth);\n scalable.forEach((column, index) => {\n column.currentWidth = widths[index];\n });\n }\n\n private widthInputOf(c: Column): { width?: number; minWidth?: number; maxWidth?: number; flex?: number } {\n const def = c.colDef;\n if (c.manualWidth != null) {\n return { width: c.manualWidth, minWidth: def.minWidth, maxWidth: def.maxWidth };\n }\n return { width: def.width, minWidth: def.minWidth, maxWidth: def.maxWidth, flex: def.flex };\n }\n\n setColumnWidth(column: Column, width: number): void {\n column.manualWidth = clampWidth(width, this.widthInputOf(column));\n }\n\n setColumnVisibility(colId: string, visible: boolean): void {\n const column = this.getColumn(colId);\n if (!column || column.hide === !visible) return;\n column.hide = !visible;\n this.regroup();\n }\n\n moveColumn(colId: string, toIndex: number): boolean {\n const column = this.getColumn(colId);\n if (!column) return false;\n\n const pane = this.paneOf(column);\n const inScope = (child: Column<any>) =>\n column.parentGroup ? true : this.paneOf(child) === pane;\n\n const container: (ColumnGroup<any> | Column<any>)[] = column.parentGroup\n ? column.parentGroup.children\n : this.rootChildren;\n\n const siblings = container.filter(\n (child): child is Column<any> => child instanceof Column && !child.hide && inScope(child)\n );\n const from = siblings.indexOf(column);\n if (from < 0) return false;\n siblings.splice(from, 1);\n const target = Math.max(0, Math.min(toIndex, siblings.length));\n siblings.splice(target, 0, column);\n\n const leafSlots: number[] = [];\n container.forEach((child, idx) => {\n if (child instanceof Column && !child.hide && inScope(child)) leafSlots.push(idx);\n });\n if (leafSlots.length !== siblings.length) return false;\n leafSlots.forEach((slotIdx, i) => {\n container[slotIdx] = siblings[i];\n });\n\n this.columns = this.collectLeaves(this.rootChildren);\n this.regroup();\n return true;\n }\n\n setColumnPinned(colId: string, pinned: PinnedDirection | null): void {\n const column = this.getColumn(colId);\n if (!column) return;\n column.pinned = pinned;\n this.regroup();\n }\n\n getColumnState(): ColumnState[] {\n return this.columns.map((c) => {\n const sortIndex = this.sortModel.findIndex((s) => s.colId === c.id);\n const state: ColumnState = {\n colId: c.id,\n hide: c.hide,\n width: c.manualWidth ?? c.currentWidth,\n pinned: c.pinned\n };\n if (sortIndex >= 0) {\n state.sort = this.sortModel[sortIndex].direction;\n state.sortIndex = sortIndex;\n } else {\n state.sort = null;\n state.sortIndex = null;\n }\n return state;\n });\n }\n\n applyColumnState(states: ColumnState[]): void {\n const stateById = new Map(states.map((s) => [s.colId, s]));\n for (const c of this.columns) {\n const s = stateById.get(c.id);\n if (!s) continue;\n if (s.hide != null) c.hide = s.hide;\n if (s.width != null) c.manualWidth = s.width;\n if (s.pinned !== undefined) c.pinned = s.pinned;\n }\n const nextSort: { colId: string; direction: SortDirection; sortIndex: number }[] = [];\n for (const s of states) {\n if (s.sort && this.columns.some((c) => c.id === s.colId)) {\n nextSort.push({ colId: s.colId, direction: s.sort, sortIndex: s.sortIndex ?? 0 });\n }\n }\n nextSort.sort((a, b) => a.sortIndex - b.sortIndex);\n this.sortModel = nextSort.map(({ colId, direction }) => ({ colId, direction }));\n this.applyStateOrder(states);\n this.regroup();\n }\n\n private applyStateOrder(states: ColumnState[]): void {\n const orderById = new Map<string, number>();\n states.forEach((s, i) => orderById.set(s.colId, i));\n const paneOfCol = (c: Column) => (c.pinned === \"left\" ? \"left\" : c.pinned === \"right\" ? \"right\" : \"center\");\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const current = this.rootChildren.filter(\n (child): child is Column<any> =>\n child instanceof Column && !child.hide && child.parentGroup === null && paneOfCol(child) === pane\n );\n if (current.length < 2) continue;\n const sorted = current\n .slice()\n .sort((a, b) => (orderById.get(a.id) ?? Number.MAX_SAFE_INTEGER) - (orderById.get(b.id) ?? Number.MAX_SAFE_INTEGER));\n if (sorted.every((c, i) => c === current[i])) continue;\n\n const slots: number[] = [];\n this.rootChildren.forEach((child, idx) => {\n if (child instanceof Column && !child.hide && child.parentGroup === null && paneOfCol(child) === pane) {\n slots.push(idx);\n }\n });\n slots.forEach((slotIdx, i) => {\n this.rootChildren[slotIdx] = sorted[i];\n });\n }\n this.columns = this.collectLeaves(this.rootChildren);\n }\n\n resetColumnState(): void {\n for (const c of this.columns) {\n c.manualWidth = null;\n c.hide = c.colDef.hide ?? false;\n const p = c.colDef.pinned;\n c.pinned = p === true ? \"left\" : p === false || p == null ? null : p;\n }\n this.sortModel = [];\n this.regroup();\n }\n\n getSortModel(): SortModel {\n return this.sortModel.map((s) => ({ ...s }));\n }\n\n applySortModel(sortModel: SortModel | null): void {\n if (!sortModel || sortModel.length === 0) {\n this.sortModel = [];\n return;\n }\n this.sortModel = sortModel\n .filter((s) => this.columns.some((c) => c.id === s.colId) && (s.direction === \"asc\" || s.direction === \"desc\"))\n .map((s) => ({ colId: s.colId, direction: s.direction }));\n }\n\n cycleSort(column: Column, additive: boolean): void {\n const model = [...this.sortModel];\n const idx = model.findIndex((s) => s.colId === column.id);\n const current = idx >= 0 ? model[idx].direction : null;\n const next: SortDirection | null = current === null ? \"asc\" : current === \"asc\" ? \"desc\" : null;\n const multi = additive && this.core.options.multiSort;\n\n if (multi) {\n if (next === null) {\n if (idx >= 0) model.splice(idx, 1);\n } else if (idx >= 0) {\n model[idx] = { colId: column.id, direction: next };\n } else {\n model.push({ colId: column.id, direction: next });\n }\n } else {\n model.length = 0;\n if (next) model.push({ colId: column.id, direction: next });\n }\n this.sortModel = model;\n }\n}\n","import type { ColumnFilter, FilterModel, TextFilterCondition, NumberFilterCondition, DateFilterCondition } from \"../types/colDef\";\nimport type { RowNode } from \"../types/row\";\nimport type { Column } from \"./column\";\n\nfunction textOf(value: any): string {\n return value == null ? \"\" : String(value).toLowerCase();\n}\n\nexport function evaluateTextFilter(value: any, conditions: TextFilterCondition[], operator: \"and\" | \"or\"): boolean {\n const v = textOf(value);\n const results = conditions.map((c) => {\n const fv = (c.value ?? \"\").toLowerCase();\n switch (c.match) {\n case \"contains\":\n return v.includes(fv);\n case \"notContains\":\n return !v.includes(fv);\n case \"equals\":\n return v === fv;\n case \"notEquals\":\n return v !== fv;\n case \"startsWith\":\n return v.startsWith(fv);\n case \"endsWith\":\n return v.endsWith(fv);\n case \"blank\":\n return v === \"\";\n case \"notBlank\":\n return v !== \"\";\n default:\n return true;\n }\n });\n if (results.length === 0) return true;\n return operator === \"or\" ? results.some(Boolean) : results.every(Boolean);\n}\n\nexport function evaluateNumberFilter(value: any, conditions: NumberFilterCondition[], operator: \"and\" | \"or\"): boolean {\n const results = conditions.map((c) => {\n const isBlank = value == null || value === \"\";\n if (c.match === \"blank\") return isBlank;\n if (c.match === \"notBlank\") return !isBlank;\n if (isBlank) return false;\n const n = typeof value === \"number\" ? value : Number(value);\n if (isNaN(n)) return false;\n const f = c.value;\n if (f == null || isNaN(f)) return false;\n switch (c.match) {\n case \"equals\":\n return n === f;\n case \"notEquals\":\n return n !== f;\n case \"lessThan\":\n return n < f;\n case \"lessThanOrEqual\":\n return n <= f;\n case \"greaterThan\":\n return n > f;\n case \"greaterThanOrEqual\":\n return n >= f;\n case \"inRange\":\n return n >= f && n <= (c.value2 ?? f);\n default:\n return true;\n }\n });\n if (results.length === 0) return true;\n return operator === \"or\" ? results.some(Boolean) : results.every(Boolean);\n}\n\nfunction toTime(value: any): number | null {\n if (value == null || value === \"\") return null;\n if (value instanceof Date) return isNaN(value.getTime()) ? null : value.getTime();\n if (typeof value === \"number\") return value;\n const t = Date.parse(String(value));\n return isNaN(t) ? null : t;\n}\n\nexport function evaluateDateFilter(value: any, conditions: DateFilterCondition[], operator: \"and\" | \"or\"): boolean {\n const results = conditions.map((c) => {\n const isBlank = toTime(value) == null;\n if (c.match === \"blank\") return isBlank;\n if (c.match === \"notBlank\") return !isBlank;\n if (isBlank) return false;\n const t = toTime(value)!;\n const f = c.value != null ? toTime(c.value) : null;\n if (f == null) return false;\n switch (c.match) {\n case \"equals\":\n return t === f;\n case \"notEquals\":\n return t !== f;\n case \"lessThan\":\n return t < f;\n case \"greaterThan\":\n return t > f;\n case \"inRange\": {\n const f2 = c.value2 != null ? toTime(c.value2) : null;\n return f2 != null ? t >= f && t <= f2 : t >= f;\n }\n default:\n return true;\n }\n });\n if (results.length === 0) return true;\n return operator === \"or\" ? results.some(Boolean) : results.every(Boolean);\n}\n\nexport function evaluateSetFilter(value: any, filterValues: (string | number | null)[]): boolean {\n if (filterValues.length === 0) return true;\n return filterValues.some((v) => (v == null && value == null) || v === value);\n}\n\nexport function evaluateColumnFilter(value: any, filter: ColumnFilter): boolean {\n const operator = filter.type !== \"set\" && filter.operator === \"or\" ? \"or\" : \"and\";\n switch (filter.type) {\n case \"text\":\n return evaluateTextFilter(value, filter.conditions, operator);\n case \"number\":\n return evaluateNumberFilter(value, filter.conditions, operator);\n case \"date\":\n return evaluateDateFilter(value, filter.conditions, operator);\n case \"set\":\n return evaluateSetFilter(value, filter.values);\n default:\n return true;\n }\n}\n\nexport function doesNodePassFilters(\n node: RowNode<any>,\n columns: Column[],\n filterModel: FilterModel,\n quickFilter: string | null,\n getCellValue: (node: RowNode<any>, column: Column) => any\n): boolean {\n for (const colId of Object.keys(filterModel)) {\n const filter = filterModel[colId];\n const column = columns.find((c) => c.id === colId);\n if (!column) continue;\n const value = getCellValue(node, column);\n if (!evaluateColumnFilter(value, filter)) return false;\n }\n\n if (quickFilter && quickFilter.trim() !== \"\") {\n const tokens = quickFilter.trim().toLowerCase().split(/\\s+/);\n for (const token of tokens) {\n const hit = columns.some((column) => textOf(getCellValue(node, column)).includes(token));\n if (!hit) return false;\n }\n }\n\n return true;\n}\n","const collator = typeof Intl !== \"undefined\"\n ? new Intl.Collator(undefined, { numeric: true, sensitivity: \"base\" })\n : null;\n\nexport function defaultComparator(valueA: any, valueB: any): number {\n const aEmpty = valueA == null || valueA === \"\";\n const bEmpty = valueB == null || valueB === \"\";\n if (aEmpty && bEmpty) return 0;\n if (aEmpty) return 1;\n if (bEmpty) return -1;\n\n if (typeof valueA === \"number\" && typeof valueB === \"number\") {\n if (isNaN(valueA) && isNaN(valueB)) return 0;\n if (isNaN(valueA)) return 1;\n if (isNaN(valueB)) return -1;\n return valueA - valueB;\n }\n if (valueA instanceof Date && valueB instanceof Date) {\n return valueA.getTime() - valueB.getTime();\n }\n if (typeof valueA === \"boolean\" && typeof valueB === \"boolean\") {\n return valueA === valueB ? 0 : valueA ? 1 : -1;\n }\n const a = String(valueA);\n const b = String(valueB);\n return collator ? collator.compare(a, b) : a.localeCompare(b);\n}\n","import { defaultComparator } from \"../lib/compare\";\nimport type { SortModel } from \"../types/colDef\";\nimport type { RowNode } from \"../types/row\";\nimport type { Column } from \"./column\";\n\nexport function sortNodes<TData>(\n nodes: RowNode<TData>[],\n sortModel: SortModel,\n columns: Column[],\n getCellValue: (node: RowNode<TData>, column: Column) => any\n): RowNode<TData>[] {\n const colById = new Map<string, Column>();\n for (const c of columns) colById.set(c.id, c);\n\n const comparators: ((a: any, b: any, na: RowNode<TData>, nb: RowNode<TData>) => number)[] = [];\n const directions: (\"asc\" | \"desc\")[] = [];\n for (const item of sortModel) {\n const column = colById.get(item.colId);\n if (!column) continue;\n comparators.push(column.colDef.comparator ?? defaultComparator);\n directions.push(item.direction);\n }\n\n const decorated = nodes.map((node) => ({\n node,\n values: sortModel.map((s) => getCellValue(node, colById.get(s.colId)!))\n }));\n\n decorated.sort((a, b) => {\n for (let i = 0; i < comparators.length; i++) {\n const r = comparators[i](a.values[i], b.values[i], a.node, b.node);\n if (r !== 0) return directions[i] === \"asc\" ? r : -r;\n }\n return 0;\n });\n\n return decorated.map((d) => d.node);\n}\n","export type AggValues = Record<string, any>;\n\nexport type AggFunction = (values: any[]) => any;\n\nfunction numeric(values: any[]): number[] {\n return values.filter((v): v is number => typeof v === \"number\" && !isNaN(v));\n}\n\nexport const BUILTIN_AGG_FUNCS: Record<string, AggFunction> = {\n sum: (values) => numeric(values).reduce((acc, v) => acc + v, 0),\n avg: (values) => {\n const nums = numeric(values);\n return nums.length === 0 ? null : nums.reduce((acc, v) => acc + v, 0) / nums.length;\n },\n count: (values) => values.length,\n min: (values) => {\n const nums = numeric(values);\n return nums.length === 0 ? null : Math.min(...nums);\n },\n max: (values) => {\n const nums = numeric(values);\n return nums.length === 0 ? null : Math.max(...nums);\n },\n first: (values) => (values.length > 0 ? values[0] : null),\n last: (values) => (values.length > 0 ? values[values.length - 1] : null)\n};\n\nexport function createAggResolver(custom?: Record<string, AggFunction>): (name: string) => AggFunction | undefined {\n const merged = { ...BUILTIN_AGG_FUNCS, ...(custom ?? {}) };\n return (name: string) => merged[name];\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { RowNode } from \"../types/row\";\nimport type { FilterModel } from \"../types/colDef\";\nimport type { RowTransaction } from \"../types/api\";\nimport { doesNodePassFilters } from \"./filterService\";\nimport { sortNodes } from \"./sortService\";\nimport { createAggResolver } from \"../lib/aggregate\";\nimport { defaultComparator } from \"../lib/compare\";\n\ntype ColumnLike = import(\"./column\").Column;\ntype RowModelContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"changeTracker\"\n | \"columnModel\"\n | \"emit\"\n | \"getApi\"\n | \"getCellValue\"\n | \"getLocaleText\"\n | \"headerRenderer\"\n | \"isDestroyed\"\n | \"nextId\"\n | \"options\"\n | \"relayout\"\n | \"reportError\"\n | \"selectionService\"\n | \"skeleton\"\n | \"undoService\"\n>;\n\nfunction readChildren(data: unknown, key: string): unknown[] | undefined {\n if (data == null || typeof data !== \"object\") return undefined;\n const value = (data as Record<string, unknown>)[key];\n return Array.isArray(value) ? value : undefined;\n}\n\nexport class RowModel<TData = any> {\n private all: RowNode<TData>[] = [];\n private roots: RowNode<TData>[] = [];\n private childIds = new Map<string, string[]>();\n private displayed: RowNode<TData>[] = [];\n private nodesById = new Map<string, RowNode<TData>>();\n private filterModel: FilterModel = {};\n private quickFilter: string | null = null;\n private expandedIds = new Set<string>();\n private groupExpandedIds = new Set<string>();\n private knownGroupIds: string[] = [];\n private spanInfo = new Map<string, Int32Array>();\n private mastersBuf: RowNode<TData>[] = [];\n private infiniteLastRow: number | null = null;\n private infiniteRequested = false;\n private infiniteLoading = false;\n private infiniteSeq = 0;\n private infiniteAbort: AbortController | null = null;\n private infiniteRetryTimer: ReturnType<typeof setTimeout> | null = null;\n private infinitePendingResolve: (() => void) | null = null;\n private treeDepth = new WeakMap<RowNode<TData>, number>();\n private rowSequence = new WeakMap<RowNode<TData>, number>();\n private treeLoadControllers = new Map<string, AbortController>();\n private treeLoadPromises = new Map<string, Promise<readonly TData[]>>();\n\n constructor(private core: RowModelContext) {}\n\n resolveRowId(data: TData, index: number, fallback: string): string {\n const getRowId = this.core.options.getRowId;\n if (!getRowId) return fallback;\n try {\n const id = getRowId({ data, index, api: this.core.getApi() });\n if (typeof id === \"string\" && id.length > 0) return id;\n this.core.reportError(new Error(\"getRowId must return a non-empty string\"), \"getRowId\", { index });\n } catch (error) {\n this.core.reportError(error, \"getRowId\", { index });\n }\n return fallback;\n }\n\n get isTree(): boolean {\n return this.core.options.treeData;\n }\n\n get isInfinite(): boolean {\n return this.core.options.datasource != null;\n }\n\n getDisplayTotalCount(): number {\n if (this.isInfinite) {\n const detailRows = Math.max(0, this.displayed.length - this.all.length);\n return (this.infiniteLastRow ?? this.all.length) + detailRows;\n }\n return this.displayed.length;\n }\n\n isLoadingInfinite(): boolean {\n return this.infiniteLoading;\n }\n\n startInfinite(): Promise<void> {\n if (!this.isInfinite) return Promise.resolve();\n this.cancelInfiniteRequest();\n this.infiniteLastRow = null;\n this.infiniteRequested = false;\n this.all = [];\n this.roots = [];\n this.nodesById.clear();\n this.expandedIds.clear();\n this.core.undoService.clear();\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n return this.loadBlock(0);\n }\n\n reloadInfinite(): Promise<void> {\n if (!this.isInfinite) return Promise.resolve();\n return this.startInfinite();\n }\n\n private setInfiniteLoading(v: boolean): void {\n this.infiniteLoading = v;\n this.core.skeleton.setInfiniteLoading(v, this.core.getLocaleText(\"loading\"));\n }\n\n private loadBlock(start: number, end?: number): Promise<void> {\n if (!this.isInfinite || this.infiniteRequested) return Promise.resolve();\n if (this.infiniteLastRow != null && start >= this.infiniteLastRow) return Promise.resolve();\n const datasource = this.core.options.datasource!;\n const blockSize = this.core.options.blockSize;\n const stop = end ?? start + blockSize;\n if (stop <= start) return Promise.resolve();\n const seq = ++this.infiniteSeq;\n const controller = new AbortController();\n this.infiniteAbort = controller;\n this.infiniteRequested = true;\n this.setInfiniteLoading(true);\n\n return new Promise<void>((resolve) => {\n let settled = false;\n let attempt = 0;\n this.infinitePendingResolve = resolve;\n const done = (reason?: unknown) => {\n if (settled) return;\n settled = true;\n if (seq === this.infiniteSeq) {\n this.infiniteRequested = false;\n this.infiniteAbort = null;\n this.infinitePendingResolve = null;\n this.setInfiniteLoading(false);\n if (reason != null && (reason as { name?: string })?.name !== \"AbortError\") {\n this.core.reportError(reason, \"datasource.getRows\", { startRow: start, endRow: stop });\n }\n }\n resolve();\n };\n\n const runAttempt = () => {\n if (settled || seq !== this.infiniteSeq || controller.signal.aborted || this.core.isDestroyed()) {\n done();\n return;\n }\n attempt++;\n let attemptSettled = false;\n const failAttempt = (reason?: unknown) => {\n if (attemptSettled || settled) return;\n attemptSettled = true;\n if (seq !== this.infiniteSeq || controller.signal.aborted || this.core.isDestroyed()) {\n done();\n return;\n }\n if (attempt <= this.core.options.datasourceRetryCount) {\n const delay = Math.min(\n this.core.options.datasourceRetryDelay * 2 ** Math.max(0, attempt - 1),\n 30_000\n );\n this.infiniteRetryTimer = setTimeout(() => {\n this.infiniteRetryTimer = null;\n runAttempt();\n }, delay);\n return;\n }\n done(reason ?? new Error(\"Datasource request failed\"));\n };\n\n try {\n const request = datasource.getRows({\n startRow: start,\n endRow: stop,\n sortModel: this.core.columnModel.getSortModel(),\n filterModel: this.getFilterModel(),\n quickFilterText: this.quickFilter,\n signal: controller.signal,\n onSuccess: (rows, lastRow) => {\n if (attemptSettled || settled) return;\n attemptSettled = true;\n if (seq !== this.infiniteSeq || this.core.isDestroyed() || controller.signal.aborted) {\n done();\n return;\n }\n const received = rows ?? [];\n if (typeof lastRow === \"number\" && lastRow >= 0) {\n this.infiniteLastRow = lastRow;\n } else if (received.length < stop - start) {\n this.infiniteLastRow = start + received.length;\n }\n const wasEmpty = this.all.length === 0;\n this.appendInfiniteRows(received);\n done();\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n if (wasEmpty) this.core.relayout();\n this.core.headerRenderer.refreshSelectAllCheckbox();\n },\n fail: failAttempt\n });\n if (request && typeof request.catch === \"function\") {\n void request.catch(failAttempt);\n }\n } catch (error) {\n failAttempt(error);\n }\n };\n\n runAttempt();\n });\n }\n\n private cancelInfiniteRequest(): void {\n this.infiniteSeq++;\n if (this.infiniteRetryTimer != null) clearTimeout(this.infiniteRetryTimer);\n this.infiniteRetryTimer = null;\n this.infiniteAbort?.abort();\n this.infiniteAbort = null;\n this.infiniteRequested = false;\n this.setInfiniteLoading(false);\n this.infinitePendingResolve?.();\n this.infinitePendingResolve = null;\n }\n\n private appendInfiniteRows(rows: TData[]): void {\n for (const data of rows) {\n if (data == null) continue;\n const index = this.all.length;\n const id = this.resolveRowId(data, index, `inf-${this.core.nextId()}`);\n if (this.nodesById.has(id)) {\n this.core.reportError(new Error(`Duplicate row id: ${id}`), \"datasource.getRows\", { rowId: id });\n continue;\n }\n const node: RowNode<TData> = {\n id,\n data,\n rowIndex: -1,\n selected: this.core.selectionService.isSelected(id)\n };\n this.all.push(node);\n this.nodesById.set(id, node);\n this.roots.push(node);\n }\n }\n\n checkInfiniteScroll(lastVisibleIndex: number): void {\n if (!this.isInfinite || this.infiniteRequested) return;\n const loaded = this.all.length;\n if (this.infiniteLastRow != null && loaded >= this.infiniteLastRow) return;\n const buffer = this.core.options.infiniteBufferRows;\n if (lastVisibleIndex + buffer < loaded && lastVisibleIndex < loaded) return;\n const blockSize = this.core.options.blockSize;\n const stop = this.infiniteLastRow == null\n ? loaded + blockSize\n : Math.min(this.infiniteLastRow, loaded + blockSize);\n void this.loadBlock(loaded, stop);\n }\n\n onServerParamsChanged(): Promise<void> {\n return this.reloadInfinite();\n }\n\n onDatasourceChanged(): Promise<void> {\n this.cancelInfiniteRequest();\n if (this.isInfinite) return this.startInfinite();\n this.infiniteLastRow = null;\n this.setRowData(this.core.options.rowData);\n this.core.bodyRenderer.onDataChanged();\n return Promise.resolve();\n }\n\n destroy(): void {\n this.cancelInfiniteRequest();\n this.cancelTreeLoads();\n }\n\n setRowData(rows: TData[] | null | undefined): void {\n this.cancelTreeLoads();\n this.core.changeTracker.clear();\n const getRowId = this.core.options.getRowId;\n const childrenKey = this.core.options.childrenKey;\n const next: RowNode<TData>[] = [];\n const roots: RowNode<TData>[] = [];\n const byId = new Map<string, RowNode<TData>>();\n const childIds = new Map<string, string[]>();\n let autoSeq = 0;\n\n const buildNode = (data: TData, depth: number, parentId: string | null): RowNode<TData> | null => {\n const index = autoSeq++;\n const id = this.resolveRowId(data, index, `auto-${index}`);\n if (byId.has(id)) {\n this.core.reportError(new Error(`Duplicate row id: ${id}`), \"rowData\", { rowId: id, index });\n return null;\n }\n const children = this.isTree ? readChildren(data, childrenKey) : undefined;\n const node: RowNode<TData> = {\n id,\n data,\n rowIndex: -1,\n selected: false,\n treeChildrenLoaded: Array.isArray(children)\n };\n this.treeDepth.set(node, depth);\n next.push(node);\n byId.set(id, node);\n if (parentId != null) {\n const list = childIds.get(parentId) ?? [];\n list.push(id);\n childIds.set(parentId, list);\n } else {\n roots.push(node);\n }\n if (this.isTree && Array.isArray(children)) {\n for (const child of children) {\n if (child != null) buildNode(child as TData, depth + 1, id);\n }\n }\n return node;\n };\n\n (rows ?? []).forEach((data) => {\n if (data != null) buildNode(data, 0, null);\n });\n\n this.all = next;\n this.roots = roots;\n this.childIds = childIds;\n this.nodesById = byId;\n this.core.undoService.clear();\n for (const id of [...this.expandedIds]) {\n if (!byId.has(id)) this.expandedIds.delete(id);\n }\n if (this.core.options.defaultExpandAll) {\n for (const node of next) {\n if (this.getChildrenCount(node.id) > 0) this.expandedIds.add(node.id);\n }\n }\n\n this.core.selectionService.onRowsRebuilt(getRowId != null);\n this.refreshPipeline();\n }\n\n getChildrenIds(id: string): string[] {\n return this.childIds.get(id) ?? [];\n }\n\n getChildrenCount(id: string): number {\n return this.childIds.get(id)?.length ?? 0;\n }\n\n hasChildren(id: string): boolean {\n return this.getChildrenCount(id) > 0;\n }\n\n isTreeRowLoading(id: string): boolean {\n return this.nodesById.get(id)?.treeLoading === true;\n }\n\n private cancelTreeLoads(): void {\n for (const controller of this.treeLoadControllers.values()) controller.abort();\n this.treeLoadControllers.clear();\n this.treeLoadPromises.clear();\n }\n\n loadTreeChildren(id: string, force = false): Promise<readonly TData[]> {\n const node = this.nodesById.get(id);\n const loader = this.core.options.loadTreeChildren;\n if (!this.isTree || !node?.data || !loader) return Promise.resolve([]);\n if (!force && node.treeChildrenLoaded) {\n return Promise.resolve(this.getChildrenIds(id).flatMap((childId) => {\n const data = this.nodesById.get(childId)?.data;\n return data == null ? [] : [data];\n }));\n }\n const pending = this.treeLoadPromises.get(id);\n if (pending && !force) return pending;\n this.treeLoadControllers.get(id)?.abort();\n const controller = new AbortController();\n this.treeLoadControllers.set(id, controller);\n node.treeLoading = true;\n node.treeLoadError = undefined;\n this.core.bodyRenderer.onDataChanged();\n\n const request = Promise.resolve().then(() => loader({\n data: node.data!,\n node,\n api: this.core.getApi(),\n signal: controller.signal\n })).then((children) => {\n if (controller.signal.aborted || this.core.isDestroyed()) return [];\n if (!Array.isArray(children)) {\n throw new TypeError(\"[MachTable] loadTreeChildren must resolve to an array.\");\n }\n this.replaceTreeChildren(node, children as readonly TData[]);\n node.treeChildrenLoaded = true;\n node.treeLoadError = undefined;\n this.core.emit(\"treeChildrenLoaded\", { rowId: id, rowNode: node, children });\n return children;\n }).catch((error: unknown) => {\n if (controller.signal.aborted || (error as { name?: string })?.name === \"AbortError\") return [];\n node.treeLoadError = error;\n node.treeChildrenLoaded = false;\n this.core.reportError(error, \"treeData.loadChildren\", { rowId: id });\n this.core.emit(\"treeChildrenLoadFailed\", { rowId: id, rowNode: node, error });\n throw error;\n }).finally(() => {\n if (this.treeLoadControllers.get(id) === controller) {\n this.treeLoadControllers.delete(id);\n this.treeLoadPromises.delete(id);\n node.treeLoading = false;\n this.core.bodyRenderer.onDataChanged();\n }\n });\n this.treeLoadPromises.set(id, request);\n return request;\n }\n\n private replaceTreeChildren(parent: RowNode<TData>, children: readonly TData[]): void {\n const removed = new Set<string>();\n const stack = [...this.getChildrenIds(parent.id)];\n while (stack.length > 0) {\n const childId = stack.pop()!;\n if (removed.has(childId)) continue;\n removed.add(childId);\n stack.push(...this.getChildrenIds(childId));\n }\n this.validateTreeChildren(children, removed);\n for (const childId of removed) {\n this.treeLoadControllers.get(childId)?.abort();\n this.treeLoadControllers.delete(childId);\n this.treeLoadPromises.delete(childId);\n this.childIds.delete(childId);\n this.nodesById.delete(childId);\n this.expandedIds.delete(childId);\n }\n this.childIds.delete(parent.id);\n const depth = this.getTreeDepth(parent) + 1;\n for (const child of children) {\n if (child != null) this.buildChildNodes(parent, child, depth);\n }\n this.reindexAll();\n this.core.selectionService.onRowsRebuilt(this.core.options.getRowId != null);\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n\n private validateTreeChildren(children: readonly TData[], replacedIds: ReadonlySet<string>): void {\n const getRowId = this.core.options.getRowId;\n const reserved = getRowId\n ? new Set([...this.nodesById.keys()].filter((id) => !replacedIds.has(id)))\n : null;\n const seenObjects = new WeakSet<object>();\n const stack = [...children];\n let index = 0;\n while (stack.length > 0) {\n const data = stack.pop()!;\n if (data == null) continue;\n if (typeof data === \"object\") {\n if (seenObjects.has(data)) throw new TypeError(\"[MachTable] Lazy tree children contain a cyclic object graph.\");\n seenObjects.add(data);\n }\n if (getRowId && reserved) {\n const id = getRowId({ data, index: index++, api: this.core.getApi() });\n if (typeof id !== \"string\" || id.length === 0) {\n throw new TypeError(\"[MachTable] getRowId must return a non-empty string for lazy tree children.\");\n }\n if (reserved.has(id)) throw new Error(`Duplicate row id: ${id}`);\n reserved.add(id);\n }\n const nested = readChildren(data, this.core.options.childrenKey);\n if (nested) stack.push(...nested as TData[]);\n }\n }\n\n applyTransaction(transaction: RowTransaction<TData>, refresh = true): void {\n const getRowId = this.core.options.getRowId;\n const touched: RowNode<TData>[] = [];\n const externallyReplacedIds: string[] = [];\n\n if (transaction.remove?.length) {\n const removeIds = new Set<string>();\n const removeRefs = new Set<TData>();\n const collect = (data: TData) => {\n if (getRowId) {\n const id = this.resolveRowId(data, -1, `__missing_remove_${this.core.nextId()}`);\n const stack = [id];\n while (stack.length > 0) {\n const cur = stack.pop()!;\n if (removeIds.has(cur)) continue;\n removeIds.add(cur);\n for (const childId of this.childIds.get(cur) ?? []) stack.push(childId);\n }\n } else {\n const stack: TData[] = [data];\n while (stack.length > 0) {\n const cur = stack.pop()!;\n removeRefs.add(cur);\n const kids = this.isTree ? readChildren(cur, this.core.options.childrenKey) : undefined;\n if (kids) {\n for (const kid of kids) stack.push(kid as TData);\n }\n }\n }\n };\n transaction.remove.forEach(collect);\n this.all = this.all.filter((node) => {\n const drop = removeIds.has(node.id) || (node.data != null && removeRefs.has(node.data));\n if (drop) {\n externallyReplacedIds.push(node.id);\n this.nodesById.delete(node.id);\n this.childIds.delete(node.id);\n }\n return !drop;\n });\n const remaining = new Set(this.all);\n this.roots = this.roots.filter((node) => remaining.has(node));\n }\n\n if (transaction.update?.length) {\n for (const data of transaction.update) {\n let node: RowNode<TData> | undefined;\n if (getRowId) {\n node = this.nodesById.get(this.resolveRowId(data, -1, `__missing_update_${this.core.nextId()}`));\n } else {\n node = this.all.find((n) => n.data === data);\n }\n if (node) {\n node.data = data;\n externallyReplacedIds.push(node.id);\n this.core.bodyRenderer.invalidateRowHeight(node);\n touched.push(node);\n }\n }\n }\n\n if (transaction.add?.length) {\n const startIndex = transaction.addIndex != null ? Math.max(0, Math.min(transaction.addIndex, this.roots.length)) : this.roots.length;\n const added: RowNode<TData>[] = [];\n transaction.add.forEach((data, i) => {\n const id = this.resolveRowId(data, startIndex + i, `add-${this.core.nextId()}`);\n if (this.nodesById.has(id)) {\n this.core.reportError(new Error(`Duplicate row id: ${id}`), \"transaction.add\", { rowId: id });\n return;\n }\n const node: RowNode<TData> = { id, data, rowIndex: -1, selected: false };\n this.nodesById.set(id, node);\n this.treeDepth.set(node, 0);\n const children = this.isTree ? readChildren(data, this.core.options.childrenKey) : undefined;\n if (children) {\n for (const child of children) {\n if (child != null) this.buildChildNodes(node, child as TData, 1);\n }\n }\n added.push(node);\n });\n this.roots.splice(startIndex, 0, ...added);\n this.reindexAll();\n }\n\n if (refresh) {\n this.refreshPipeline();\n for (const node of touched) {\n if (node.rowIndex >= 0) this.core.bodyRenderer.refreshRows([node.rowIndex]);\n }\n }\n this.core.changeTracker.clearRows(externallyReplacedIds);\n }\n\n applyTransactions(transactions: readonly RowTransaction<TData>[]): void {\n if (transactions.length === 0) return;\n for (const transaction of transactions) this.applyTransaction(transaction, false);\n this.refreshPipeline();\n }\n\n private buildChildNodes(parent: RowNode<TData>, data: TData, depth: number): void {\n const id = this.resolveRowId(data, -1, `add-${this.core.nextId()}`);\n if (this.nodesById.has(id)) {\n this.core.reportError(new Error(`Duplicate row id: ${id}`), \"transaction.add\", { rowId: id });\n return;\n }\n const children = readChildren(data, this.core.options.childrenKey);\n const child: RowNode<TData> = {\n id,\n data,\n rowIndex: -1,\n selected: false,\n treeChildrenLoaded: Array.isArray(children)\n };\n this.nodesById.set(id, child);\n this.treeDepth.set(child, depth);\n const list = this.childIds.get(parent.id) ?? [];\n list.push(child.id);\n this.childIds.set(parent.id, list);\n if (!children) return;\n for (const nested of children) {\n if (nested != null) this.buildChildNodes(child, nested as TData, depth + 1);\n }\n }\n\n private reindexAll(): void {\n this.all = [];\n const walk = (node: RowNode<TData>) => {\n this.all.push(node);\n if (!this.nodesById.has(node.id)) this.nodesById.set(node.id, node);\n for (const childId of this.childIds.get(node.id) ?? []) {\n const child = this.nodesById.get(childId);\n if (child) walk(child);\n }\n };\n for (const root of this.roots) walk(root);\n }\n\n setFilterModel(filterModel: FilterModel | null): boolean {\n const before = JSON.stringify(this.filterModel);\n this.filterModel = filterModel ? { ...filterModel } : {};\n return JSON.stringify(this.filterModel) !== before;\n }\n\n getFilterModel(): FilterModel {\n return { ...this.filterModel };\n }\n\n setQuickFilter(text: string | null | undefined): boolean {\n const next = text != null && text.trim() !== \"\" ? text : null;\n if (next === this.quickFilter) return false;\n this.quickFilter = next;\n return true;\n }\n\n getQuickFilter(): string | null {\n return this.quickFilter;\n }\n\n isFilterPresent(): boolean {\n return Object.keys(this.filterModel).length > 0 || this.quickFilter != null;\n }\n\n refreshPipeline(): void {\n const columns = this.core.columnModel.getOrderedVisible();\n const getCellValue = (node: RowNode<any>, column: ColumnLike) => this.core.getCellValue(node, column);\n\n if (this.isInfinite) {\n this.all.forEach((node, index) => {\n node.rowIndex = index;\n this.rowSequence.set(node, index + 1);\n });\n this.displayed = this.all;\n this.pipelineRows = this.all;\n this.spanInfo.clear();\n this.core.emit(\"modelUpdated\", { rowCount: this.all.length });\n return;\n }\n\n let rows: RowNode<TData>[];\n\n if (this.isTree) {\n rows = this.buildTreeDisplay(columns, getCellValue);\n } else {\n rows = this.all;\n const filteringLocally = this.isFilterPresent() && !this.core.options.manualFiltering;\n if (filteringLocally) {\n rows = rows.filter((node) => doesNodePassFilters(node, columns, this.filterModel, this.quickFilter, getCellValue));\n }\n const sortModel = this.core.columnModel.getSortModel();\n if (sortModel.length > 0 && !this.core.options.manualSorting) {\n try {\n rows = sortNodes(rows, sortModel, columns, getCellValue);\n } catch (error) {\n this.core.reportError(error, \"comparator\", { sortModel });\n }\n }\n\n const groupCols = this.core.columnModel.getRowGroupColumns();\n if (groupCols.length > 0) {\n rows = this.buildGrouped(rows, groupCols);\n } else if (this.core.options.masterDetail) {\n const withDetails: RowNode<TData>[] = [];\n for (const node of rows) {\n withDetails.push(node);\n if (this.expandedIds.has(node.id) && this.isRowExpandable(node)) {\n withDetails.push({\n id: `__detail__${node.id}`,\n data: node.data,\n rowIndex: -1,\n selected: false,\n isDetail: true,\n masterId: node.id\n });\n }\n }\n rows = withDetails;\n }\n }\n\n for (const node of this.all) node.rowIndex = -1;\n\n let seq = 0;\n rows.forEach((node, index) => {\n node.rowIndex = index;\n if (!node.isDetail && !node.isGroup) {\n seq++;\n this.rowSequence.set(node, seq);\n }\n });\n this.pipelineRows = rows;\n this.applyPagination();\n\n this.computeSpans(getCellValue);\n this.core.emit(\"modelUpdated\", { rowCount: rows.length });\n }\n\n private pipelineRows: RowNode<TData>[] = [];\n private page = 1;\n private pageSize = 20;\n\n get paginationActive(): boolean {\n return this.core.options.paginationEnabled && !this.isInfinite;\n }\n\n private applyPagination(): void {\n if (!this.paginationActive) {\n this.displayed = this.pipelineRows;\n return;\n }\n const size = this.effectivePageSize();\n const pageCount = this.getPageCount();\n if (this.page > pageCount) this.page = pageCount;\n if (this.page < 1) this.page = 1;\n this.core.options.paginationPage = this.page;\n if (this.core.options.paginationMode === \"server\") {\n this.pipelineRows.forEach((node, index) => {\n node.rowIndex = index;\n });\n this.displayed = this.pipelineRows;\n return;\n }\n const start = (this.page - 1) * size;\n const slice = this.pipelineRows.slice(start, start + size);\n slice.forEach((node, index) => {\n node.rowIndex = index;\n });\n this.displayed = slice;\n }\n\n private effectivePageSize(): number {\n this.pageSize = this.core.options.paginationPageSize;\n return Math.max(1, this.pageSize);\n }\n\n getCurrentPage(): number {\n return this.paginationActive ? this.page : 1;\n }\n\n getTotalRowCount(): number {\n if (this.isInfinite) return this.getDisplayTotalCount();\n if (this.paginationActive && this.core.options.paginationMode === \"server\") {\n return this.core.options.paginationTotal;\n }\n return this.pipelineRows.length;\n }\n\n getPageCount(): number {\n if (!this.paginationActive) return 1;\n return Math.max(1, Math.ceil(this.getTotalRowCount() / this.effectivePageSize()));\n }\n\n getPipelineRows(): RowNode<TData>[] {\n return this.pipelineRows;\n }\n\n setPage(page: number, silent = false): void {\n if (!this.paginationActive) return;\n const pageCount = this.getPageCount();\n const next = Math.max(1, Math.min(Math.round(page) || 1, pageCount));\n if (next === this.page) return;\n this.page = next;\n this.core.options.paginationPage = next;\n this.applyPagination();\n this.core.bodyRenderer.onDataChanged();\n this.core.bodyRenderer.scrollToIndex(0, \"top\");\n if (!silent) this.emitPaginationChanged();\n }\n\n setPageSize(size: number): void {\n if (!this.paginationActive) return;\n const next = Math.max(1, Math.round(size) || this.effectivePageSize());\n const firstVisible = (this.page - 1) * this.effectivePageSize();\n this.core.options.paginationPageSize = next;\n this.pageSize = next;\n this.page = Math.floor(firstVisible / next) + 1;\n this.core.options.paginationPage = this.page;\n this.applyPagination();\n this.core.bodyRenderer.onDataChanged();\n this.emitPaginationChanged();\n }\n\n restorePagination(page: number, pageSize: number): void {\n this.pageSize = Math.max(1, Math.round(pageSize) || 1);\n this.core.options.paginationPageSize = this.pageSize;\n this.page = Math.max(1, Math.round(page) || 1);\n this.core.options.paginationPage = this.page;\n }\n\n setPaginationEnabled(enabled: boolean): void {\n if (this.core.options.paginationEnabled === enabled) return;\n this.core.options.paginationEnabled = enabled && !this.isInfinite;\n if (this.core.options.paginationEnabled) this.page = 1;\n this.applyPagination();\n this.core.bodyRenderer.onDataChanged();\n this.emitPaginationChanged();\n }\n\n onPaginationOptionsChanged(): void {\n if (!this.paginationActive) return;\n this.page = this.core.options.paginationMode === \"server\"\n ? this.core.options.paginationPage\n : 1;\n this.applyPagination();\n this.core.bodyRenderer.onDataChanged();\n this.emitPaginationChanged();\n }\n\n private emitPaginationChanged(): void {\n this.core.emit(\"paginationChanged\", {\n page: this.getCurrentPage(),\n pageSize: this.effectivePageSize(),\n pageCount: this.getPageCount(),\n total: this.getTotalRowCount()\n });\n }\n\n private buildTreeDisplay(\n columns: ColumnLike[],\n getCellValue: (node: RowNode<any>, column: ColumnLike) => any\n ): RowNode<TData>[] {\n const sortModel = this.core.options.manualSorting ? [] : this.core.columnModel.getSortModel();\n const passCache = new Map<string, boolean>();\n const filterPresent = this.isFilterPresent() && !this.core.options.manualFiltering;\n\n const nodePasses = (node: RowNode<TData>): boolean => {\n const cached = passCache.get(node.id);\n if (cached !== undefined) return cached;\n let pass = true;\n if (filterPresent) {\n pass = doesNodePassFilters(node, columns, this.filterModel, this.quickFilter, getCellValue);\n for (const childId of this.childIds.get(node.id) ?? []) {\n const child = this.nodesById.get(childId);\n if (child && nodePasses(child)) pass = true;\n }\n }\n passCache.set(node.id, pass);\n return pass;\n };\n\n const out: RowNode<TData>[] = [];\n const walk = (nodes: RowNode<TData>[]) => {\n let ordered = nodes;\n if (sortModel.length > 0) {\n ordered = sortNodes(nodes, sortModel, columns, getCellValue);\n }\n for (const node of ordered) {\n if (!nodePasses(node)) continue;\n out.push(node);\n if (this.expandedIds.has(node.id)) {\n const childNodes = (this.childIds.get(node.id) ?? [])\n .map((id) => this.nodesById.get(id))\n .filter((n): n is RowNode<TData> => n != null);\n walk(childNodes);\n }\n }\n };\n walk(this.roots);\n return out;\n }\n\n private computeSpans(getCellValue: (node: RowNode<any>, column: ColumnLike) => any): void {\n this.spanInfo.clear();\n if (this.isTree) return;\n if (this.core.options.masterDetail) return;\n if (this.core.columnModel.getRowGroupColumns().length > 0) return;\n\n const spanColumns = this.core.columnModel.getOrderedVisible().filter(\n (c) => c.colDef.rowSpan != null || c.colDef.autoRowSpan === true\n );\n if (spanColumns.length === 0) return;\n\n const masters = this.mastersBuf;\n let m = 0;\n for (const node of this.displayed) {\n if (!node.isDetail && !node.isGroup) masters[m++] = node;\n }\n masters.length = m;\n const n = m;\n if (n === 0) return;\n\n for (const col of spanColumns) {\n const arr = new Int32Array(n);\n let i = 0;\n while (i < n) {\n const node = masters[i];\n const value = getCellValue(node, col);\n let span = 1;\n if (col.colDef.rowSpan) {\n try {\n const out = col.colDef.rowSpan({\n api: this.core.getApi(),\n colDef: col.colDef,\n column: col,\n node,\n data: node.data,\n value,\n rowIndex: node.rowIndex\n });\n span = Math.max(1, Math.min(Math.round(out) || 1, n - i));\n } catch (error) {\n this.core.reportError(error, \"rowSpan\", { colId: col.id, rowId: node.id });\n }\n } else if (col.colDef.autoRowSpan) {\n while (\n i + span < n &&\n value != null &&\n value !== \"\" &&\n defaultComparator(value, getCellValue(masters[i + span], col)) === 0\n ) {\n span++;\n }\n }\n arr[i] = span;\n for (let k = 1; k < span; k++) arr[i + k] = -1;\n i += span;\n }\n this.spanInfo.set(col.id, arr);\n }\n }\n\n getSpanInfo(colId: string): Int32Array | undefined {\n return this.spanInfo.get(colId);\n }\n\n getRowSeq(node: RowNode<TData>): number {\n return this.rowSequence.get(node) ?? 0;\n }\n\n getTreeDepth(node: RowNode<TData>): number {\n return this.treeDepth.get(node) ?? 0;\n }\n\n private buildGrouped(rows: RowNode<TData>[], groupCols: ColumnLike[]): RowNode<TData>[] {\n const aggResolve = createAggResolver(this.core.options.aggFuncs);\n const aggCols = this.core.columnModel.getAggColumns();\n this.knownGroupIds = [];\n\n const computeAgg = (leaves: RowNode<TData>[]): Record<string, any> => {\n const values: Record<string, any> = {};\n for (const col of aggCols) {\n const fn = aggResolve(col.colDef.aggFunc!);\n if (!fn) continue;\n try {\n values[col.id] = fn(leaves.map((leaf) => this.core.getCellValue(leaf, col)));\n } catch (error) {\n this.core.reportError(error, \"aggFunc\", { colId: col.id, aggFunc: col.colDef.aggFunc });\n values[col.id] = null;\n }\n }\n return values;\n };\n\n const build = (\n nodes: RowNode<TData>[],\n level: number,\n parentPath: string\n ): { display: RowNode<TData>[]; leaves: RowNode<TData>[] } => {\n if (level >= groupCols.length) {\n return { display: nodes, leaves: nodes };\n }\n const col = groupCols[level];\n const groups = new Map<string, RowNode<TData>[]>();\n const order: string[] = [];\n for (const node of nodes) {\n const raw = this.core.getCellValue(node, col);\n const key = raw == null ? \"(空)\" : String(raw);\n let bucket = groups.get(key);\n if (!bucket) {\n bucket = [];\n groups.set(key, bucket);\n order.push(key);\n }\n bucket.push(node);\n }\n order.sort((a, b) => a.localeCompare(b, undefined, { numeric: true, sensitivity: \"base\" }));\n\n const display: RowNode<TData>[] = [];\n const leaves: RowNode<TData>[] = [];\n for (const key of order) {\n const children = groups.get(key)!;\n const groupId = `${parentPath}/g${level}:${key}`;\n this.knownGroupIds.push(groupId);\n const child = build(children, level + 1, groupId);\n const groupNode: RowNode<TData> = {\n id: groupId,\n data: null,\n rowIndex: -1,\n selected: false,\n isGroup: true,\n groupLevel: level,\n groupKey: key,\n leafNodes: child.leaves,\n aggValues: computeAgg(child.leaves)\n };\n display.push(groupNode);\n if (this.groupExpandedIds.has(groupId)) {\n display.push(...child.display);\n }\n leaves.push(...child.leaves);\n }\n return { display, leaves };\n };\n\n return build(rows, 0, \"\").display;\n }\n\n isRowExpandable(node: RowNode<TData>): boolean {\n if (this.isTree) {\n if (this.hasChildren(node.id)) return true;\n if (node.treeLoading) return true;\n if (node.treeChildrenLoaded || !node.data || !this.core.options.loadTreeChildren) return false;\n const checkTree = this.core.options.isTreeRowExpandable;\n if (!checkTree) return false;\n try {\n return checkTree({ data: node.data, node, api: this.core.getApi() });\n } catch (error) {\n this.core.reportError(error, \"isTreeRowExpandable\", { rowId: node.id });\n return false;\n }\n }\n if (!this.core.options.masterDetail) return false;\n const check = this.core.options.isRowExpandable;\n if (check) {\n try {\n return check({ data: node.data, node, api: this.core.getApi() });\n } catch (error) {\n this.core.reportError(error, \"isRowExpandable\", { rowId: node.id });\n return false;\n }\n }\n return true;\n }\n\n isRowExpanded(id: string): boolean {\n return this.expandedIds.has(id);\n }\n\n getExpandedRowIds(): string[] {\n return [...this.expandedIds];\n }\n\n getExpandedGroupIds(): string[] {\n return [...this.groupExpandedIds];\n }\n\n restoreExpansion(rowIds: readonly string[], groupIds: readonly string[]): void {\n this.expandedIds = new Set(rowIds.filter((id) => this.nodesById.has(id)));\n this.groupExpandedIds = new Set(groupIds);\n }\n\n expandRow(id: string): boolean {\n return this.setDetailExpanded(id, true);\n }\n\n collapseRow(id: string): boolean {\n return this.setDetailExpanded(id, false);\n }\n\n toggleDetail(id: string): boolean {\n return this.setDetailExpanded(id, !this.expandedIds.has(id));\n }\n\n private setDetailExpanded(id: string, expanded: boolean): boolean {\n const node = this.nodesById.get(id);\n if (!node || (expanded && !this.isRowExpandable(node))) return false;\n if (expanded === this.expandedIds.has(id)) return expanded;\n if (expanded) this.expandedIds.add(id);\n else this.expandedIds.delete(id);\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n this.core.emit(\"detailToggled\", { rowId: id, rowNode: node, expanded });\n if (expanded && this.isTree && !this.hasChildren(id) && !node.treeLoading) {\n void this.loadTreeChildren(id).catch(() => undefined);\n }\n return expanded;\n }\n\n expandAllDetails(): void {\n let changed = false;\n for (const node of this.all) {\n if (!this.expandedIds.has(node.id) && this.isRowExpandable(node)) {\n this.expandedIds.add(node.id);\n changed = true;\n }\n }\n if (changed) {\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n }\n\n collapseAllDetails(): void {\n if (this.expandedIds.size === 0) return;\n this.expandedIds.clear();\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n\n toggleGroup(groupId: string): boolean {\n return this.setGroupExpanded(groupId, !this.groupExpandedIds.has(groupId));\n }\n\n isGroupExpanded(groupId: string): boolean {\n return this.groupExpandedIds.has(groupId);\n }\n\n getGroupNode(groupId: string): RowNode<TData> | undefined {\n return this.displayed.find((n) => n.isGroup && n.id === groupId);\n }\n\n expandAllGroups(): void {\n if (this.knownGroupIds.length === 0) return;\n let changed = false;\n for (const id of this.knownGroupIds) {\n if (!this.groupExpandedIds.has(id)) {\n this.groupExpandedIds.add(id);\n changed = true;\n }\n }\n if (changed) {\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n }\n\n collapseAllGroups(): void {\n if (this.groupExpandedIds.size === 0) return;\n this.groupExpandedIds.clear();\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n\n private setGroupExpanded(groupId: string, expanded: boolean): boolean {\n if (!this.knownGroupIds.includes(groupId)) return expanded;\n if (expanded === this.groupExpandedIds.has(groupId)) return expanded;\n if (expanded) this.groupExpandedIds.add(groupId);\n else this.groupExpandedIds.delete(groupId);\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n return expanded;\n }\n\n reorderRowsByDisplayed(fromIndex: number, toIndex: number): boolean {\n if (this.isTree) return false;\n const fromNode = this.getDisplayedRow(fromIndex);\n const toNode = this.getDisplayedRow(toIndex);\n if (!fromNode || !toNode || fromNode.isDetail || toNode.isDetail || fromNode.isGroup || toNode.isGroup) return false;\n\n const fromAllIdx = this.all.indexOf(fromNode);\n let toAllIdx = this.all.indexOf(toNode);\n if (fromAllIdx < 0 || toAllIdx < 0) return false;\n if (toAllIdx > fromAllIdx) {\n let idx = toAllIdx;\n while (idx + 1 < this.all.length && this.all[idx + 1].isDetail) idx++;\n toAllIdx = idx;\n }\n if (fromAllIdx === toAllIdx) return false;\n\n this.all.splice(fromAllIdx, 1);\n const insertAt = this.all.indexOf(toNode);\n this.all.splice(toAllIdx > fromAllIdx ? insertAt + 1 : insertAt, 0, fromNode);\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n return true;\n }\n\n getAllNodes(): RowNode<TData>[] {\n return this.all;\n }\n\n getRootNodes(): RowNode<TData>[] {\n return this.roots;\n }\n\n getDisplayedRows(): RowNode<TData>[] {\n return this.displayed;\n }\n\n getDisplayedRowCount(): number {\n return this.displayed.length;\n }\n\n getDisplayedRow(index: number): RowNode<TData> | undefined {\n return this.displayed[index];\n }\n\n getNodeById(id: string): RowNode<TData> | undefined {\n return this.nodesById.get(id);\n }\n\n forEachNode(callback: (node: RowNode<TData>, index: number) => void): void {\n this.all.forEach(callback);\n }\n\n forEachNodeAfterFilterAndSort(callback: (node: RowNode<TData>, index: number) => void): void {\n let index = 0;\n for (const node of this.pipelineRows) {\n if (node.isDetail || node.isGroup) continue;\n callback(node, index++);\n }\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { RowNode } from \"../types/row\";\n\ntype SelectionContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"columnModel\"\n | \"emit\"\n | \"getApi\"\n | \"getCellValue\"\n | \"headerRenderer\"\n | \"options\"\n | \"reportError\"\n | \"rowModel\"\n>;\n\nexport class SelectionService {\n private selectedIds = new Set<string>();\n private anchorId: string | null = null;\n private indeterminateIds = new Set<string>();\n\n constructor(private core: SelectionContext) {}\n\n isSelected(id: string): boolean {\n return this.selectedIds.has(id);\n }\n\n isIndeterminate(id: string): boolean {\n return this.indeterminateIds.has(id);\n }\n\n isSelectable(node: RowNode<any>): boolean {\n const column = this.findSelectableColumn(node);\n const check = column?.colDef.selectable;\n if (!column || !check) return true;\n try {\n return check({\n api: this.core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value: this.core.getCellValue(node, column),\n rowIndex: node.rowIndex\n });\n } catch (error) {\n this.core.reportError(error, \"selectable\", { rowId: node.id, colId: column?.id });\n return false;\n }\n }\n\n private findSelectableColumn(node: RowNode<any>) {\n if (node.isGroup || node.isDetail) return undefined;\n return this.core.columnModel\n .getOrderedVisible()\n .find((column) => column.hasCheckbox && column.colDef.selectable != null);\n }\n\n getSelectedNodes(): RowNode<any>[] {\n return this.core.rowModel.getAllNodes().filter((n) => this.selectedIds.has(n.id));\n }\n\n getSelectedRows(): any[] {\n return this.getSelectedNodes().filter((n) => n.data != null).map((n) => n.data);\n }\n\n getSelectedIds(): string[] {\n return [...this.selectedIds];\n }\n\n restoreSelection(ids: readonly string[]): void {\n const requested = new Set(ids);\n const changes = this.core.rowModel\n .getAllNodes()\n .filter((node) => requested.has(node.id) && !node.isDetail && !node.isGroup)\n .map((node) => ({ node, selected: true }));\n this.applySelection(changes, true);\n }\n\n onRowsRebuilt(preserveIds: boolean): void {\n if (!preserveIds) {\n this.selectedIds.clear();\n this.anchorId = null;\n } else {\n const existing = new Set(this.core.rowModel.getAllNodes().map((n) => n.id));\n for (const id of [...this.selectedIds]) {\n if (!existing.has(id)) this.selectedIds.delete(id);\n }\n if (this.anchorId != null && !existing.has(this.anchorId)) this.anchorId = null;\n }\n for (const node of this.core.rowModel.getAllNodes()) {\n node.selected = this.selectedIds.has(node.id);\n }\n this.recomputeTriState();\n }\n\n getGroupSelectionState(groupNode: RowNode<any>): { all: boolean; some: boolean } {\n const leaves = groupNode.leafNodes ?? [];\n if (leaves.length === 0) return { all: false, some: false };\n let selectableCount = 0;\n let count = 0;\n for (const leaf of leaves) {\n if (!this.isSelectable(leaf)) continue;\n selectableCount++;\n if (this.selectedIds.has(leaf.id)) count++;\n }\n if (selectableCount === 0) return { all: false, some: false };\n return { all: count === selectableCount, some: count > 0 };\n }\n\n setGroupSelected(groupNode: RowNode<any>, selected: boolean): void {\n const leaves = (groupNode.leafNodes ?? []).filter((n) => this.isSelectable(n));\n if (leaves.length === 0) return;\n this.applySelection(leaves.map((node) => ({ node, selected })));\n }\n\n setNodeSelected(node: RowNode<any>, selected: boolean, clearOthers = false): void {\n this.applySelection([{ node, selected, clearOthers }]);\n }\n\n selectNodeById(nodeId: string, selected = true, clearOthers = true): void {\n const node = this.core.rowModel.getNodeById(nodeId);\n if (node) this.setNodeSelected(node, selected, clearOthers);\n }\n\n onRowClick(node: RowNode<any>, event: MouseEvent, fromCheckbox: boolean): void {\n const mode = this.core.options.rowSelection;\n if (mode === \"none\") return;\n if (!this.isSelectable(node)) return;\n\n if (fromCheckbox) {\n const single = mode === \"single\";\n this.applySelection([{ node, selected: single ? true : !node.selected, clearOthers: single }]);\n this.anchorId = node.id;\n return;\n }\n\n const multi = mode === \"multiple\";\n if (multi && (event.ctrlKey || event.metaKey)) {\n this.applySelection([{ node, selected: !node.selected }]);\n this.anchorId = node.id;\n return;\n }\n\n if (multi && event.shiftKey && this.anchorId != null) {\n const anchor = this.core.rowModel.getNodeById(this.anchorId);\n if (anchor && anchor.rowIndex >= 0 && node.rowIndex >= 0) {\n const start = Math.min(anchor.rowIndex, node.rowIndex);\n const end = Math.max(anchor.rowIndex, node.rowIndex);\n const changes = [];\n for (let i = start; i <= end; i++) {\n const row = this.core.rowModel.getDisplayedRow(i);\n if (row && !row.isDetail && !row.isGroup && this.isSelectable(row)) {\n changes.push({ node: row, selected: true });\n }\n }\n this.applySelection(changes);\n return;\n }\n }\n\n this.applySelection([{ node, selected: true, clearOthers: true }]);\n this.anchorId = node.id;\n }\n\n selectAll(filteredOnly = true): void {\n const mode = this.core.options.rowSelection;\n if (mode === \"none\") return;\n const candidates = filteredOnly ? this.core.rowModel.getDisplayedRows() : this.core.rowModel.getAllNodes();\n const selectable = candidates.filter((n) => !n.isDetail && !n.isGroup && this.isSelectable(n));\n if (selectable.length === 0) return;\n if (mode === \"single\") {\n this.applySelection([{ node: selectable[0], selected: true, clearOthers: true }]);\n return;\n }\n this.applySelection(selectable.map((node) => ({ node, selected: true })));\n }\n\n deselectAll(): void {\n this.applySelection([], true);\n }\n\n isSelectAllActive(): boolean {\n const rows = this.core.rowModel.getDisplayedRows().filter((n) => !n.isDetail && !n.isGroup);\n const selectable = rows.filter((n) => this.isSelectable(n));\n if (selectable.length === 0) return false;\n if (this.core.rowModel.isInfinite) {\n const total = this.core.rowModel.getDisplayTotalCount();\n if (selectable.length < total) return false;\n }\n return selectable.every((n) => this.selectedIds.has(n.id));\n }\n\n isSelectAllIndeterminate(): boolean {\n const rows = this.core.rowModel.getDisplayedRows().filter((n) => !n.isDetail && !n.isGroup);\n const selectable = rows.filter((n) => this.isSelectable(n));\n const count = selectable.reduce((acc, n) => acc + (this.selectedIds.has(n.id) ? 1 : 0), 0);\n if (count === 0) return false;\n if (this.core.rowModel.isInfinite) {\n const total = this.core.rowModel.getDisplayTotalCount();\n if (selectable.length < total) return true;\n }\n return count > 0 && count < selectable.length;\n }\n\n applySelectionPublic(\n changes: { node: RowNode<any>; selected: boolean; clearOthers?: boolean }[],\n clearOthers = false\n ): void {\n this.applySelection(changes, clearOthers);\n }\n\n private applySelection(\n changes: { node: RowNode<any>; selected: boolean; clearOthers?: boolean }[],\n clearAll = false\n ): void {\n const before = new Set(this.selectedIds);\n const clearOthers = clearAll || changes.some((c) => c.clearOthers);\n const isTree = this.core.rowModel.isTree && this.core.options.autoCheckedChildren;\n\n if (clearOthers) {\n const keep = clearAll\n ? new Set<string>()\n : new Set(changes.filter((c) => c.selected).flatMap((c) => (isTree ? this.subtreeIds(c.node) : [c.node.id])));\n this.selectedIds = keep;\n }\n\n for (const c of changes) {\n if (!this.isSelectable(c.node)) continue;\n const targets = isTree ? this.subtreeIds(c.node) : [c.node.id];\n for (const id of targets) {\n if (c.selected) this.selectedIds.add(id);\n else this.selectedIds.delete(id);\n }\n }\n\n const changedIds = new Set<string>();\n for (const id of new Set([...before, ...this.selectedIds])) {\n if (before.has(id) !== this.selectedIds.has(id)) changedIds.add(id);\n }\n\n const prevSelected = new Map<string, boolean>();\n for (const node of this.core.rowModel.getAllNodes()) {\n prevSelected.set(node.id, node.selected);\n }\n const prevIndeterminate = new Set(this.indeterminateIds);\n\n this.recomputeTriState();\n\n const refreshIndexes: number[] = [];\n const touched = new Set<string>([...changedIds, ...prevIndeterminate, ...this.indeterminateIds]);\n for (const node of this.core.rowModel.getAllNodes()) {\n const isSel = this.selectedIds.has(node.id);\n node.selected = isSel;\n if (touched.has(node.id) || prevSelected.get(node.id) !== isSel) {\n if (node.rowIndex >= 0) refreshIndexes.push(node.rowIndex);\n }\n }\n\n if (changedIds.size > 0) {\n this.core.bodyRenderer.refreshRows(refreshIndexes);\n this.core.headerRenderer.refreshSelectAllCheckbox();\n this.core.emit(\"selectionChanged\", {\n selectedNodes: this.getSelectedNodes(),\n selectedRows: this.getSelectedRows()\n });\n }\n }\n\n private subtreeIds(node: RowNode<any>): string[] {\n const out: string[] = [node.id];\n const walk = (id: string) => {\n for (const childId of this.core.rowModel.getChildrenIds(id)) {\n out.push(childId);\n walk(childId);\n }\n };\n walk(node.id);\n return out;\n }\n\n private recomputeTriState(): void {\n this.indeterminateIds.clear();\n if (!this.core.rowModel.isTree) return;\n\n const evaluate = (id: string): { all: boolean; some: boolean } => {\n const childIds = this.core.rowModel.getChildrenIds(id);\n if (childIds.length === 0) {\n return { all: this.selectedIds.has(id), some: this.selectedIds.has(id) };\n }\n let all = true;\n let some = false;\n for (const childId of childIds) {\n const state = evaluate(childId);\n if (state.all) some = true;\n else if (state.some) {\n some = true;\n all = false;\n } else {\n all = false;\n }\n }\n if (some && !all) this.indeterminateIds.add(id);\n if (all) this.selectedIds.add(id);\n else this.selectedIds.delete(id);\n return { all, some };\n };\n\n for (const root of this.core.rowModel.getRootNodes()) {\n evaluate(root.id);\n }\n for (const node of this.core.rowModel.getAllNodes()) {\n node.selected = this.selectedIds.has(node.id);\n }\n }\n}\n","export function el(tag: string, className?: string, attrs?: Record<string, string>): HTMLElement {\n const e = document.createElement(tag);\n if (className) e.className = className;\n if (attrs) {\n for (const key of Object.keys(attrs)) {\n e.setAttribute(key, attrs[key]);\n }\n }\n return e;\n}\n\nexport function setStyles(e: HTMLElement, styles: Partial<CSSStyleDeclaration>): void {\n Object.assign(e.style, styles);\n}\n\nexport function clamp(v: number, min: number, max: number): number {\n return v < min ? min : v > max ? max : v;\n}\n\nlet uidCounter = 0;\n\nexport function nextUid(prefix = \"rg\"): string {\n uidCounter++;\n return `${prefix}-${uidCounter}`;\n}\n\nexport function toPx(n: number): string {\n return `${n}px`;\n}\n\nexport const FILTER_ICON =\n '<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2 3.5h12L9.5 8v4.5L6.5 14V8L2 3.5z\"/></svg>';\n\nexport const SORT_ASC_ICON =\n '<svg viewBox=\"0 0 16 16\" width=\"12\" height=\"12\" fill=\"currentColor\"><path d=\"M8 3l4 5H4l4-5z\"/></svg>';\n\nexport const SORT_DESC_ICON =\n '<svg viewBox=\"0 0 16 16\" width=\"12\" height=\"12\" fill=\"currentColor\"><path d=\"M8 13l4-5H4l4 5z\"/></svg>';\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport { clamp } from \"../lib/dom\";\n\ntype ResizeContext = Pick<\n GridCore<any>,\n \"columnModel\" | \"emit\" | \"persistColumnState\" | \"relayoutColumns\" | \"skeleton\"\n>;\n\nexport class ResizeService {\n private active: {\n column: Column;\n startX: number;\n startWidth: number;\n pointerId: number;\n handle: HTMLElement;\n } | null = null;\n private rafId = 0;\n private pendingWidth = 0;\n\n constructor(private core: ResizeContext) {}\n\n startResize(e: PointerEvent, column: Column): void {\n const handle = e.currentTarget as HTMLElement;\n const def = column.colDef;\n const startWidth = column.manualWidth ?? column.currentWidth;\n const minWidth = def.minWidth ?? 80;\n if (startWidth < minWidth && def.width == null) {\n column.manualWidth = startWidth;\n }\n this.active = { column, startX: e.clientX, startWidth: column.manualWidth ?? startWidth, pointerId: e.pointerId, handle };\n handle.setPointerCapture(e.pointerId);\n handle.addEventListener(\"pointermove\", this.onMove);\n handle.addEventListener(\"pointerup\", this.onUp);\n handle.addEventListener(\"pointercancel\", this.onUp);\n this.core.skeleton.root.classList.add(\"mach-root--resizing\");\n }\n\n private onMove = (e: PointerEvent): void => {\n const active = this.active;\n if (!active) return;\n const def = active.column.colDef;\n const min = def.minWidth ?? 80;\n const max = def.maxWidth ?? Number.MAX_SAFE_INTEGER;\n this.pendingWidth = clamp(active.startWidth + (e.clientX - active.startX), min, max);\n if (this.rafId) return;\n this.rafId = requestAnimationFrame(() => {\n this.rafId = 0;\n const current = this.active;\n if (!current) return;\n this.core.columnModel.setColumnWidth(current.column, this.pendingWidth);\n this.core.relayoutColumns();\n this.core.emit(\"columnResized\", {\n colId: current.column.id,\n width: this.pendingWidth,\n finished: false\n });\n });\n };\n\n private onUp = (e: PointerEvent): void => {\n const active = this.active;\n if (!active) return;\n this.active = null;\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.core.columnModel.setColumnWidth(active.column, this.pendingWidth);\n this.core.relayoutColumns();\n }\n this.rafId = 0;\n active.handle.removeEventListener(\"pointermove\", this.onMove);\n active.handle.removeEventListener(\"pointerup\", this.onUp);\n active.handle.removeEventListener(\"pointercancel\", this.onUp);\n try {\n active.handle.releasePointerCapture(e.pointerId);\n } catch {\n void 0;\n }\n this.core.skeleton.root.classList.remove(\"mach-root--resizing\");\n this.core.emit(\"columnResized\", {\n colId: active.column.id,\n width: active.column.manualWidth ?? active.column.currentWidth,\n finished: true\n });\n this.core.persistColumnState();\n };\n\n destroy(): void {\n cancelAnimationFrame(this.rafId);\n this.rafId = 0;\n if (this.active) {\n const active = this.active;\n this.active = null;\n active.handle.removeEventListener(\"pointermove\", this.onMove);\n active.handle.removeEventListener(\"pointerup\", this.onUp);\n active.handle.removeEventListener(\"pointercancel\", this.onUp);\n }\n this.core.skeleton.root?.classList.remove(\"mach-root--resizing\");\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport { el } from \"../lib/dom\";\n\nconst DRAG_THRESHOLD = 6;\ntype ColumnDragContext = Pick<\n GridCore<any>,\n \"bodyRenderer\" | \"columnModel\" | \"moveColumn\" | \"skeleton\"\n>;\n\nexport class ColumnDragService {\n private pending: { column: Column; startX: number; startY: number } | null = null;\n private dragging: { column: Column; cellEl: HTMLElement; indicator: HTMLElement; targetIndex: number } | null = null;\n private suppressClick = false;\n\n constructor(private core: ColumnDragContext) {}\n\n onPointerDown(e: PointerEvent, column: Column): void {\n if (e.button !== 0) return;\n if (!column.movable) return;\n this.pending = { column, startX: e.clientX, startY: e.clientY };\n window.addEventListener(\"pointermove\", this.onMove);\n window.addEventListener(\"pointerup\", this.onUp);\n window.addEventListener(\"pointercancel\", this.onUp);\n }\n\n didDrag(): boolean {\n const value = this.suppressClick;\n this.suppressClick = false;\n return value;\n }\n\n private onMove = (e: PointerEvent): void => {\n if (this.dragging) {\n this.updateIndicator(e);\n return;\n }\n const pending = this.pending;\n if (!pending) return;\n if (Math.abs(e.clientX - pending.startX) < DRAG_THRESHOLD && Math.abs(e.clientY - pending.startY) < DRAG_THRESHOLD) {\n return;\n }\n this.startDrag(e);\n };\n\n private startDrag(e: PointerEvent): void {\n const pending = this.pending;\n if (!pending) return;\n const cellEl = this.findHeaderCell(pending.column);\n if (!cellEl || !cellEl.parentElement) {\n this.cleanup();\n return;\n }\n this.suppressClick = true;\n const indicator = el(\"div\", \"mach-drop-indicator\");\n cellEl.parentElement.appendChild(indicator);\n cellEl.classList.add(\"mach-header-cell--dragging\");\n this.core.skeleton.root.classList.add(\"mach-root--dragging\");\n this.dragging = { column: pending.column, cellEl, indicator, targetIndex: -1 };\n this.updateIndicator(e);\n }\n\n private findHeaderCell(column: Column): HTMLElement | null {\n const pane = this.core.bodyRenderer.paneForColumn(column);\n const container = this.core.skeleton.headerRowContainers[pane];\n return container.querySelector<HTMLElement>(`.mach-header-cell[data-col-id=\"${cssEscape(column.id)}\"]`);\n }\n\n private updateIndicator(e: PointerEvent): void {\n const dragging = this.dragging;\n if (!dragging) return;\n const pane = this.core.bodyRenderer.paneForColumn(dragging.column);\n const container = this.core.skeleton.headerRowContainers[pane];\n const rowRect = container.getBoundingClientRect();\n const cols = this.core.columnModel.getPaneColumns(pane);\n const fromIndex = cols.indexOf(dragging.column);\n\n const x = e.clientX - rowRect.left;\n let target = -1;\n let indicatorX = 0;\n let acc = 0;\n for (let i = 0; i < cols.length; i++) {\n const mid = acc + cols[i].currentWidth / 2;\n if (x < mid) {\n target = i;\n indicatorX = acc;\n break;\n }\n acc += cols[i].currentWidth;\n }\n if (target < 0) {\n target = cols.length;\n indicatorX = acc;\n }\n\n dragging.targetIndex = target > fromIndex ? target - 1 : target;\n dragging.indicator.style.left = `${indicatorX}px`;\n }\n\n private onUp = (): void => {\n const dragging = this.dragging;\n this.pending = null;\n this.cleanup();\n if (!dragging) return;\n this.dragging = null;\n dragging.cellEl.classList.remove(\"mach-header-cell--dragging\");\n dragging.indicator.remove();\n this.core.skeleton.root.classList.remove(\"mach-root--dragging\");\n if (dragging.targetIndex >= 0) {\n this.core.moveColumn(dragging.column.id, dragging.targetIndex);\n }\n };\n\n private cleanup(): void {\n window.removeEventListener(\"pointermove\", this.onMove);\n window.removeEventListener(\"pointerup\", this.onUp);\n window.removeEventListener(\"pointercancel\", this.onUp);\n };\n\n destroy(): void {\n this.cleanup();\n if (this.dragging) {\n this.dragging.cellEl.classList.remove(\"mach-header-cell--dragging\");\n this.dragging.indicator.remove();\n this.core.skeleton.root.classList.remove(\"mach-root--dragging\");\n this.dragging = null;\n }\n this.pending = null;\n }\n}\n\nfunction cssEscape(value: string): string {\n return typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\"\n ? CSS.escape(value)\n : value.replace(/[^a-zA-Z0-9_-]/g, \"\\\\$&\");\n}\n","import type { CsvExportParams } from \"../types/api\";\n\nexport function csvEscape(value: any, separator: string): string {\n const s = value == null ? \"\" : String(value);\n if (s.includes(separator) || s.includes('\"') || s.includes(\"\\n\") || s.includes(\"\\r\")) {\n return '\"' + s.replace(/\"/g, '\"\"') + '\"';\n }\n return s;\n}\n\nexport function sanitizeFormulaCell(value: any): any {\n if (typeof value !== \"string\" || value === \"\") return value;\n if (/^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/.test(value)) return value;\n if (/^[\\s\\u0000-\\u001f]*[=+\\-@]/.test(value)) return \"'\" + value;\n return value;\n}\n\nexport interface CsvRowAccessor<T> {\n getHeaderLabels(): string[];\n getRowValues(): T[][];\n}\n\nexport function buildCsv<T>(accessor: CsvRowAccessor<T>, params: CsvExportParams = {}): string {\n const separator = params.columnSeparator ?? \",\";\n const includeHeader = params.includeHeader ?? true;\n const protectFormulas = params.protectFormulas ?? true;\n const lines: string[] = [];\n\n if (includeHeader) {\n lines.push(accessor.getHeaderLabels().map((l) => csvEscape(l, separator)).join(separator));\n }\n for (const row of accessor.getRowValues()) {\n lines.push(\n row.map((v) => csvEscape(protectFormulas ? sanitizeFormulaCell(v) : v, separator)).join(separator)\n );\n }\n\n const body = lines.join(\"\\r\\n\");\n return params.prependBOM ? \"\\uFEFF\" + body : body;\n}\n","import { sanitizeFormulaCell } from \"./csv\";\n\nfunction escapeCell(value: any, protectFormulas: boolean): string {\n const safe = protectFormulas ? sanitizeFormulaCell(value) : value;\n const s = safe == null ? \"\" : String(safe);\n if (/[\"\\t\\n\\r]/.test(s)) {\n return '\"' + s.replace(/\"/g, '\"\"') + '\"';\n }\n return s;\n}\n\nexport function toTsv(rows: any[][], protectFormulas = true): string {\n return rows.map((row) => row.map((value) => escapeCell(value, protectFormulas)).join(\"\\t\")).join(\"\\n\");\n}\n\nexport function parseTsv(text: string): string[][] {\n return parseDelimited(text, \"\\t\");\n}\n\nexport function parseCsv(text: string, separator = \",\"): string[][] {\n return parseDelimited(text, separator);\n}\n\nexport function parseDelimited(text: string, separator: string): string[][] {\n const rows: string[][] = [];\n let row: string[] = [];\n let cell = \"\";\n let inQuotes = false;\n let i = 0;\n\n while (i < text.length) {\n const ch = text[i];\n if (inQuotes) {\n if (ch === '\"') {\n if (text[i + 1] === '\"') {\n cell += '\"';\n i += 2;\n continue;\n }\n inQuotes = false;\n i++;\n continue;\n }\n cell += ch;\n i++;\n continue;\n }\n if (ch === '\"' && cell === \"\") {\n inQuotes = true;\n i++;\n continue;\n }\n if (ch === separator) {\n row.push(cell);\n cell = \"\";\n i++;\n continue;\n }\n if (ch === \"\\n\" || ch === \"\\r\") {\n row.push(cell);\n rows.push(row);\n row = [];\n cell = \"\";\n if (ch === \"\\r\" && text[i + 1] === \"\\n\") i += 2;\n else i++;\n continue;\n }\n cell += ch;\n i++;\n }\n\n if (cell !== \"\" || row.length > 0) {\n row.push(cell);\n rows.push(row);\n }\n return rows;\n}\n\nexport function fallbackCopyText(text: string): boolean {\n let ta: HTMLTextAreaElement | null = null;\n try {\n ta = document.createElement(\"textarea\");\n ta.value = text;\n ta.style.position = \"fixed\";\n ta.style.opacity = \"0\";\n document.body.appendChild(ta);\n ta.focus();\n ta.select();\n const ok = document.execCommand(\"copy\");\n return ok;\n } catch {\n return false;\n } finally {\n ta?.remove();\n }\n}\n\nexport async function writeClipboard(text: string): Promise<boolean> {\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n void 0;\n }\n return fallbackCopyText(text);\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport { writeClipboard } from \"../lib/clipboard\";\n\ntype KeyboardContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"buildRangeTsv\"\n | \"clearRangeValues\"\n | \"columnModel\"\n | \"editingService\"\n | \"isDestroyed\"\n | \"options\"\n | \"pasteText\"\n | \"rowModel\"\n | \"selectionService\"\n | \"skeleton\"\n | \"undoService\"\n>;\n\nconst NAVIGATION_KEYS = new Set([\n \"ArrowUp\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Enter\",\n \"F2\",\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\",\n \"Tab\",\n \" \",\n \"Escape\",\n \"Delete\",\n \"Backspace\"\n]);\n\nconst MOVEMENT_KEYS = new Set([\n \"ArrowUp\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\"\n]);\n\ninterface KeyboardPosition {\n colIdx: number;\n row: number;\n}\n\nexport class KeyboardService {\n constructor(private core: KeyboardContext) {}\n\n init(): void {\n this.core.skeleton.root.addEventListener(\"keydown\", this.onKeyDown);\n this.core.skeleton.root.addEventListener(\"copy\", this.onCopy as EventListener);\n this.core.skeleton.root.addEventListener(\"cut\", this.onCut as EventListener);\n this.core.skeleton.root.addEventListener(\"paste\", this.onPaste as EventListener);\n }\n\n destroy(): void {\n this.core.skeleton.root.removeEventListener(\"keydown\", this.onKeyDown);\n this.core.skeleton.root.removeEventListener(\"copy\", this.onCopy as EventListener);\n this.core.skeleton.root.removeEventListener(\"cut\", this.onCut as EventListener);\n this.core.skeleton.root.removeEventListener(\"paste\", this.onPaste as EventListener);\n }\n\n nextEditable(rowIndex: number, colId: string, dir: 1 | -1): { rowIndex: number; column: Column } | null {\n const cols = this.core.columnModel.getOrderedVisible();\n const start = cols.findIndex((c) => c.id === colId);\n if (start < 0) return null;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n let i = start;\n let row = rowIndex;\n\n for (let guard = 0; guard < (cols.length + 1) * (rowCount + 1); guard++) {\n i += dir;\n if (i >= cols.length) {\n if (row >= rowCount - 1) return null;\n i = 0;\n row = this.skipDetailRows(row + 1, 1);\n } else if (i < 0) {\n if (row <= 0) return null;\n i = cols.length - 1;\n row = this.skipDetailRows(row - 1, -1);\n }\n if (row < 0 || row >= rowCount) return null;\n const node = this.core.rowModel.getDisplayedRow(row);\n if (node && !node.isDetail && this.core.editingService.isEditable(node, cols[i])) {\n return { rowIndex: row, column: cols[i] };\n }\n }\n return null;\n }\n\n private skipDetailRows(row: number, dir: 1 | -1): number {\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n let guard = 0;\n while (row >= 0 && row < rowCount) {\n const node = this.core.rowModel.getDisplayedRow(row);\n if (!node || !node.isDetail) return row;\n row += dir;\n guard++;\n if (guard > rowCount + 2) break;\n }\n return -1;\n }\n\n private onCopy = (e: ClipboardEvent): void => {\n if (this.core.options.suppressClipboard || this.core.editingService.isEditing()) return;\n const range = this.core.bodyRenderer.getNormalizedRangeOrFocus();\n if (!range) return;\n const text = this.core.buildRangeTsv(range);\n const dt = e.clipboardData;\n if (dt && typeof dt.setData === \"function\") {\n dt.setData(\"text/plain\", text);\n } else {\n void writeClipboard(text);\n }\n e.preventDefault();\n };\n\n private onCut = (e: ClipboardEvent): void => {\n if (this.core.options.suppressClipboard || this.core.editingService.isEditing()) return;\n const range = this.core.bodyRenderer.getNormalizedRangeOrFocus();\n if (!range) return;\n const text = this.core.buildRangeTsv(range);\n const dt = e.clipboardData;\n if (dt && typeof dt.setData === \"function\") {\n dt.setData(\"text/plain\", text);\n } else {\n void writeClipboard(text);\n }\n this.core.clearRangeValues(range);\n e.preventDefault();\n };\n\n private onPaste = (e: ClipboardEvent): void => {\n if (this.core.options.suppressClipboard || this.core.editingService.isEditing()) return;\n const start = this.core.bodyRenderer.getPasteStart();\n if (!start) return;\n const dt = e.clipboardData;\n const text = dt && typeof dt.getData === \"function\" ? dt.getData(\"text/plain\") : null;\n if (typeof text !== \"string\" || text === \"\") return;\n e.preventDefault();\n this.core.pasteText(text, start.row, start.colIdx);\n };\n\n private onKeyDown = (e: KeyboardEvent): void => {\n if (this.core.isDestroyed() || this.core.editingService.isEditing()) return;\n if (this.handleSelectAll(e) || this.handleHistoryShortcut(e)) return;\n if (!NAVIGATION_KEYS.has(e.key)) return;\n if (this.handleRangeCommand(e)) return;\n if (this.focusFirstCell(e)) return;\n this.handleFocusedKey(e);\n };\n\n private handleSelectAll(e: KeyboardEvent): boolean {\n const modifier = e.ctrlKey || e.metaKey;\n if (!modifier || e.key.toLowerCase() !== \"a\") return false;\n if (this.core.options.rowSelection === \"multiple\") {\n e.preventDefault();\n this.core.selectionService.selectAll(true);\n }\n return true;\n }\n\n private handleHistoryShortcut(e: KeyboardEvent): boolean {\n if ((!e.ctrlKey && !e.metaKey) || e.altKey) return false;\n const key = e.key.toLowerCase();\n if (key === \"z\") {\n e.preventDefault();\n if (e.shiftKey) this.core.undoService.redo();\n else this.core.undoService.undo();\n return true;\n }\n if (key !== \"y\") return false;\n e.preventDefault();\n this.core.undoService.redo();\n return true;\n }\n\n private handleRangeCommand(e: KeyboardEvent): boolean {\n const body = this.core.bodyRenderer;\n if (e.key === \"Escape\") {\n if (this.core.options.enableRangeSelection && body.normalizedRange()) {\n e.preventDefault();\n body.clearRangeSelection();\n }\n return true;\n }\n if (e.key !== \"Delete\" && e.key !== \"Backspace\") return false;\n if (!this.core.options.enableRangeSelection) return true;\n const range = body.normalizedRange();\n if (range && !(range.r1 === range.r2 && range.c1 === range.c2)) {\n e.preventDefault();\n this.core.clearRangeValues(range);\n }\n return true;\n }\n\n private focusFirstCell(e: KeyboardEvent): boolean {\n if (this.core.bodyRenderer.focusedCell) return false;\n const columns = this.core.columnModel.getOrderedVisible();\n if (this.core.rowModel.getDisplayedRowCount() > 0 && columns.length > 0) {\n e.preventDefault();\n this.core.bodyRenderer.setFocusedCell(0, columns[0].id);\n }\n return true;\n }\n\n private handleFocusedKey(e: KeyboardEvent): void {\n const body = this.core.bodyRenderer;\n const focus = body.focusedCell;\n if (!focus) return;\n const columns = this.core.columnModel.getOrderedVisible();\n const colIdx = columns.findIndex((column) => column.id === focus.colId);\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n if (colIdx < 0 || rowCount === 0) return;\n\n const start = { row: focus.rowIndex, colIdx };\n const position = this.resolveKeyPosition(e, start, columns, rowCount);\n if (!position) return;\n e.preventDefault();\n\n const moved = position.row !== start.row || position.colIdx !== start.colIdx;\n if (e.shiftKey && this.core.options.enableRangeSelection && moved) {\n body.moveRangeEnd(position.row, position.colIdx);\n return;\n }\n if (moved) body.setFocusedCell(position.row, columns[position.colIdx].id);\n }\n\n private resolveKeyPosition(\n e: KeyboardEvent,\n position: KeyboardPosition,\n columns: readonly Column[],\n rowCount: number\n ): KeyboardPosition | null {\n if (MOVEMENT_KEYS.has(e.key)) return this.movePosition(e, position, columns.length, rowCount);\n if (e.key === \"Enter\" || e.key === \"F2\") {\n return this.activateEditor(e, position, columns, rowCount);\n }\n if (e.key === \" \") {\n this.toggleFocusedRow(position.row);\n return position;\n }\n if (e.key === \"Tab\") return this.moveToEditable(e, position, columns);\n return null;\n }\n\n private movePosition(\n e: KeyboardEvent,\n position: KeyboardPosition,\n columnCount: number,\n rowCount: number\n ): KeyboardPosition {\n let { row, colIdx } = position;\n switch (e.key) {\n case \"ArrowUp\":\n row = this.validSkippedRow(row, this.skipDetailRows(row - 1, -1), rowCount);\n break;\n case \"ArrowDown\":\n row = this.validSkippedRow(row, this.skipDetailRows(row + 1, 1), rowCount);\n break;\n case \"ArrowLeft\":\n colIdx = Math.max(0, colIdx - 1);\n break;\n case \"ArrowRight\":\n colIdx = Math.min(columnCount - 1, colIdx + 1);\n break;\n case \"Home\":\n colIdx = 0;\n if (e.ctrlKey) row = 0;\n break;\n case \"End\":\n colIdx = columnCount - 1;\n if (e.ctrlKey) row = Math.max(0, this.skipDetailRows(rowCount - 1, -1));\n break;\n case \"PageUp\":\n case \"PageDown\":\n row = this.movePage(e.key, row, rowCount);\n break;\n }\n return { row, colIdx };\n }\n\n private validSkippedRow(current: number, candidate: number, rowCount: number): number {\n return candidate >= 0 && candidate < rowCount ? candidate : current;\n }\n\n private movePage(key: string, row: number, rowCount: number): number {\n const viewport = this.core.skeleton.bodyViewports.center;\n const pageRows = Math.max(1, Math.floor(viewport.clientHeight / this.core.options.rowHeight));\n const direction: 1 | -1 = key === \"PageUp\" ? -1 : 1;\n const target = Math.max(0, Math.min(rowCount - 1, row + pageRows * direction));\n return this.validSkippedRow(row, this.skipDetailRows(target, direction), rowCount);\n }\n\n private activateEditor(\n e: KeyboardEvent,\n position: KeyboardPosition,\n columns: readonly Column[],\n rowCount: number\n ): KeyboardPosition {\n const node = this.core.rowModel.getDisplayedRow(position.row);\n const column = columns[position.colIdx];\n if (node && !node.isDetail && column && this.core.editingService.isEditable(node, column)) {\n this.core.editingService.start(position.row, column, e.key === \"F2\" ? e.key : null);\n return position;\n }\n const down = this.skipDetailRows(position.row + 1, 1);\n return { ...position, row: this.validSkippedRow(position.row, down, rowCount) };\n }\n\n private toggleFocusedRow(row: number): void {\n const node = this.core.rowModel.getDisplayedRow(row);\n if (!node || node.isDetail) return;\n if (node.isGroup) {\n this.core.rowModel.toggleGroup(node.id);\n return;\n }\n if (this.core.options.rowSelection === \"none\") return;\n this.core.selectionService.setNodeSelected(\n node,\n !node.selected,\n this.core.options.rowSelection === \"single\"\n );\n }\n\n private moveToEditable(\n e: KeyboardEvent,\n position: KeyboardPosition,\n columns: readonly Column[]\n ): KeyboardPosition | null {\n const next = this.nextEditable(position.row, columns[position.colIdx].id, e.shiftKey ? -1 : 1);\n if (!next) return null;\n this.core.bodyRenderer.setFocusedCell(next.rowIndex, next.column.id);\n this.core.editingService.start(next.rowIndex, next.column);\n return position;\n }\n}\n","import type { ICellEditor } from \"../types/params\";\nimport type { Column } from \"./column\";\n\nfunction baseInput(type: string, value: any): HTMLInputElement {\n const input = document.createElement(\"input\");\n input.type = type;\n input.className = \"mach-editor-input\";\n if (value != null && value !== \"\") {\n input.value = type === \"date\" ? String(value).slice(0, 10) : String(value);\n }\n return input;\n}\n\nfunction inferEditorType(value: any, selectValues?: (string | number)[]): string {\n if (selectValues && selectValues.length > 0) return \"select\";\n if (typeof value === \"number\") return \"number\";\n if (value instanceof Date) return \"date\";\n if (typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}/.test(value)) return \"date\";\n return \"text\";\n}\n\nexport function createEditor(column: Column, value: any, keyPress?: string | null): ICellEditor {\n const def = column.colDef;\n const name = typeof def.cellEditor === \"string\" ? def.cellEditor : inferEditorType(value, def.cellEditorParams?.values);\n\n if (name === \"number\") {\n const input = baseInput(\"number\", value);\n return {\n el: input,\n getValue: () => (input.value === \"\" ? null : Number(input.value)),\n focus: () => {\n input.focus();\n input.select();\n }\n };\n }\n\n if (name === \"date\") {\n const input = baseInput(\"date\", value);\n const raw = value == null ? \"\" : String(value);\n const timeMatch = raw.match(/T(\\d{2}:\\d{2})/);\n return {\n el: input,\n getValue: () => {\n if (input.value === \"\") return null;\n if (timeMatch) return `${input.value}T${timeMatch[1]}`;\n return input.value;\n },\n focus: () => input.focus()\n };\n }\n\n if (name === \"select\") {\n const values = def.cellEditorParams?.values ?? [];\n const select = document.createElement(\"select\");\n select.className = \"mach-editor-select\";\n for (const v of values) {\n const option = document.createElement(\"option\");\n option.value = String(v);\n option.textContent = String(v);\n if (String(value) === String(v)) option.selected = true;\n select.appendChild(option);\n }\n return {\n el: select,\n getValue: () => {\n const match = values.find((v) => String(v) === select.value);\n return match !== undefined ? match : select.value;\n },\n focus: () => select.focus()\n };\n }\n\n const input = baseInput(\"text\", value);\n if (keyPress && keyPress.length === 1) input.value = keyPress;\n return {\n el: input,\n getValue: () => input.value,\n focus: () => {\n input.focus();\n input.select();\n }\n };\n}\n","/** Runtime-only DOM state kept out of public elements and their string keys. */\nexport interface CellRuntimeState {\n destroy?: () => void;\n flashTimer?: number;\n styleKeys?: string[];\n}\n\nconst cellStates = new WeakMap<HTMLElement, CellRuntimeState>();\nconst detailDestroyers = new WeakMap<HTMLElement, () => void>();\nconst headerDestroyers = new WeakMap<HTMLElement, () => void>();\n\nexport function getCellRuntimeState(element: HTMLElement): CellRuntimeState {\n let state = cellStates.get(element);\n if (!state) {\n state = {};\n cellStates.set(element, state);\n }\n return state;\n}\n\nexport function peekCellRuntimeState(element: HTMLElement): CellRuntimeState | undefined {\n return cellStates.get(element);\n}\n\nexport function setDetailDestroyer(element: HTMLElement, destroy: (() => void) | undefined): void {\n if (destroy) detailDestroyers.set(element, destroy);\n else detailDestroyers.delete(element);\n}\n\nexport function takeDetailDestroyer(element: HTMLElement): (() => void) | undefined {\n const destroy = detailDestroyers.get(element);\n detailDestroyers.delete(element);\n return destroy;\n}\n\nexport function setHeaderDestroyer(element: HTMLElement, destroy: (() => void) | undefined): void {\n if (destroy) headerDestroyers.set(element, destroy);\n else headerDestroyers.delete(element);\n}\n\nexport function takeHeaderDestroyer(element: HTMLElement): (() => void) | undefined {\n const destroy = headerDestroyers.get(element);\n headerDestroyers.delete(element);\n return destroy;\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { RowNode } from \"../types/row\";\nimport type { Column } from \"../services/column\";\nimport { hasColumnType } from \"../core/resolveOptions\";\nimport type { CellClassParams, CellRendererParams } from \"../types/params\";\nimport { getCellRuntimeState, peekCellRuntimeState } from \"./runtimeState\";\n\ntype ErrorContext = Pick<GridCore<any>, \"reportError\">;\ntype CellValueContext = Pick<GridCore<any>, \"getApi\" | \"getCellValue\" | \"reportError\">;\ntype CellRenderContext = CellValueContext & Pick<GridCore<any>, \"options\" | \"resolveCellRenderer\">;\n\nexport function defaultFormat(value: any): string {\n if (value == null) return \"\";\n if (value instanceof Date) return value.toLocaleDateString();\n if (typeof value === \"object\") {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n }\n return String(value);\n}\n\nexport function cleanupCellContent(core: ErrorContext, cell: HTMLElement): void {\n const state = peekCellRuntimeState(cell);\n if (!state) return;\n if (state.flashTimer) clearTimeout(state.flashTimer);\n state.flashTimer = undefined;\n const destroy = state.destroy;\n state.destroy = undefined;\n if (!destroy) return;\n try {\n destroy();\n } catch (error) {\n core.reportError(error, \"cellRenderer.destroy\", { colId: cell.dataset.colId });\n }\n}\n\nexport function formatCellValue(core: CellValueContext, node: RowNode<any>, column: Column): string {\n const value = core.getCellValue(node, column);\n const formatter = column.colDef.valueFormatter;\n if (formatter) {\n try {\n const out = formatter({\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value\n });\n return out == null ? \"\" : String(out);\n } catch (error) {\n core.reportError(error, \"valueFormatter\", { colId: column.id, rowId: node.id });\n }\n }\n return defaultFormat(value);\n}\n\nexport function formatCellValueWith(core: CellValueContext, node: RowNode<any>, column: Column, value: any): string {\n const formatter = column.colDef.valueFormatter;\n if (formatter) {\n try {\n const out = formatter({\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value\n });\n return out == null ? \"\" : String(out);\n } catch (error) {\n core.reportError(error, \"valueFormatter\", { colId: column.id, rowId: node.id });\n }\n }\n return defaultFormat(value);\n}\n\nexport function applyCellStyle(core: CellValueContext, cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const rule = column.colDef.cellStyle;\n const state = getCellRuntimeState(cell);\n const prevKeys = state.styleKeys;\n if (prevKeys) {\n for (const key of prevKeys) {\n Reflect.set(cell.style, key, \"\");\n }\n }\n if (!rule) {\n state.styleKeys = undefined;\n return;\n }\n let styles: Partial<CSSStyleDeclaration> | null | undefined;\n if (typeof rule === \"function\") {\n const value = core.getCellValue(node, column);\n try {\n styles = rule({\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value,\n rowIndex: node.rowIndex\n });\n } catch (error) {\n core.reportError(error, \"cellStyle\", { colId: column.id, rowId: node.id });\n styles = null;\n }\n } else {\n styles = rule;\n }\n if (!styles) {\n state.styleKeys = undefined;\n return;\n }\n const keys = Object.keys(styles);\n for (const key of keys) {\n Reflect.set(cell.style, key, Reflect.get(styles, key));\n }\n state.styleKeys = keys;\n}\n\nexport function renderCellContent(core: CellRenderContext, cell: HTMLElement, node: RowNode<any>, column: Column): void {\n cleanupCellContent(core, cell);\n\n const value = core.getCellValue(node, column);\n const formatted = formatCellValue(core, node, column);\n const rendererDef = column.colDef.cellRenderer;\n const renderer =\n typeof rendererDef === \"string\" ? core.resolveCellRenderer(rendererDef) : rendererDef;\n\n if (renderer) {\n const params: CellRendererParams = {\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value,\n formatted,\n rowIndex: node.rowIndex,\n rendererParams: column.colDef.cellRendererParams\n };\n let out: ReturnType<typeof renderer>;\n try {\n out = renderer(params);\n } catch (error) {\n core.reportError(error, \"cellRenderer\", { colId: column.id, rowId: node.id });\n cell.textContent = formatted;\n return;\n }\n if (typeof out === \"string\") {\n cell.textContent = out;\n } else if (out instanceof HTMLElement) {\n cell.replaceChildren(out);\n } else if (out && typeof out === \"object\" && out.el instanceof HTMLElement) {\n const result = out;\n cell.replaceChildren(result.el);\n if (result.destroy) getCellRuntimeState(cell).destroy = result.destroy;\n } else {\n cell.textContent = \"\";\n }\n } else {\n cell.textContent = formatted;\n }\n\n let tooltip = formatted;\n if (core.options.tooltipComponent) tooltip = \"\";\n const tooltipGetter = column.colDef.tooltipValueGetter;\n if (tooltipGetter) {\n try {\n const out = tooltipGetter({\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value\n });\n tooltip = out ?? formatted;\n } catch (error) {\n core.reportError(error, \"tooltipValueGetter\", { colId: column.id, rowId: node.id });\n }\n }\n if (tooltip) {\n if (cell.getAttribute(\"title\") !== tooltip) cell.setAttribute(\"title\", tooltip);\n } else if (cell.hasAttribute(\"title\")) {\n cell.removeAttribute(\"title\");\n }\n}\n\nexport function applyCellClasses(core: CellValueContext, cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const value = core.getCellValue(node, column);\n const classes = [\"mach-cell\"];\n const align = column.colDef.align;\n if (align === \"center\") {\n classes.push(\"mach-cell--center\");\n } else if (align === \"right\") {\n classes.push(\"mach-cell--right\");\n } else if (hasColumnType(column.colDef, \"rightAligned\") || hasColumnType(column.colDef, \"numericColumn\") || (typeof value === \"number\" && value != null)) {\n classes.push(\"mach-cell--num\");\n }\n\n const rule = column.colDef.cellClass;\n if (rule) {\n if (typeof rule === \"function\") {\n const params: CellClassParams = {\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value,\n rowIndex: node.rowIndex\n };\n try {\n const result = rule(params);\n if (typeof result === \"string\") classes.push(result);\n else if (Array.isArray(result)) classes.push(...result);\n } catch (error) {\n core.reportError(error, \"cellClass\", { colId: column.id, rowId: node.id });\n }\n } else if (typeof rule === \"string\") {\n classes.push(rule);\n } else if (Array.isArray(rule)) {\n classes.push(...rule);\n }\n }\n\n const hadFocus = cell.classList.contains(\"mach-cell--focus\");\n const hadEditing = cell.classList.contains(\"mach-cell--editing\");\n if (hadFocus) classes.push(\"mach-cell--focus\");\n if (hadEditing) classes.push(\"mach-cell--editing\");\n if (column.colDef.wrapText) classes.push(\"mach-cell--wrap\");\n\n const className = classes.join(\" \");\n if (cell.className !== className) cell.className = className;\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport type { RowNode } from \"../types/row\";\nimport type { ICellEditor } from \"../types/params\";\nimport { createEditor } from \"./editors\";\nimport { cleanupCellContent } from \"../render/cellContent\";\n\ntype EditingContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"columnModel\"\n | \"emit\"\n | \"getApi\"\n | \"getCellValue\"\n | \"keyboardService\"\n | \"notifyCellValueChanged\"\n | \"options\"\n | \"reportError\"\n | \"resolveCellEditor\"\n | \"rowModel\"\n | \"setCellValue\"\n | \"statusBarService\"\n | \"summaryRenderer\"\n | \"undoService\"\n | \"writeValue\"\n>;\n\ninterface MountedEditor {\n editor: ICellEditor;\n cell: HTMLElement;\n shell: HTMLElement;\n keydown: (event: KeyboardEvent) => void;\n input?: (event: Event) => void;\n}\n\ninterface CellEditingState extends MountedEditor {\n node: RowNode<any>;\n column: Column;\n rowIndex: number;\n oldValue: any;\n confirmButton: HTMLButtonElement;\n cancelButton: HTMLButtonElement;\n}\n\ninterface RowDraft {\n column: Column;\n oldValue: any;\n value: any;\n mounted: MountedEditor | null;\n error?: string;\n}\n\ninterface RowEditingState {\n node: RowNode<any>;\n rowIndex: number;\n drafts: Map<string, RowDraft>;\n validating: boolean;\n}\n\nconst CHECK_PATH = '<path d=\"M3 8.5 6.4 12 13.5 4\"/>';\nconst CLOSE_PATH = '<path d=\"m4 4 8 8m0-8-8 8\"/>';\n\nfunction createEditButton(kind: \"confirm\" | \"cancel\", label: string): HTMLButtonElement {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = `mach-edit-control mach-edit-control--${kind}`;\n button.setAttribute(\"aria-label\", label);\n button.title = label;\n button.innerHTML = `<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${kind === \"confirm\" ? CHECK_PATH : CLOSE_PATH}</svg>`;\n button.addEventListener(\"mousedown\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n });\n return button;\n}\n\nexport class EditingService {\n private cellEditing: CellEditingState | null = null;\n private rowEditing: RowEditingState | null = null;\n private stopPromise: Promise<boolean> | null = null;\n private stopToken = 0;\n\n constructor(private core: EditingContext) {}\n\n isEditing(rowIndex?: number, colId?: string): boolean {\n if (this.cellEditing) {\n if (rowIndex == null && colId == null) return true;\n return this.cellEditing.rowIndex === rowIndex && this.cellEditing.column.id === colId;\n }\n if (!this.rowEditing) return false;\n if (rowIndex == null && colId == null) return true;\n if (this.currentRowIndex(this.rowEditing) !== rowIndex) return false;\n return colId == null || this.rowEditing.drafts.has(colId);\n }\n\n isCellEditing(): boolean {\n return this.cellEditing != null;\n }\n\n isRowEditing(rowIndex?: number): boolean {\n if (!this.rowEditing) return false;\n return rowIndex == null || this.currentRowIndex(this.rowEditing) === rowIndex;\n }\n\n isEditable(node: RowNode<any>, column: Column): boolean {\n if (node.isDetail || node.isGroup || node.data == null) return false;\n const editable = column.colDef.editable;\n if (!editable) return false;\n if (typeof editable === \"function\") {\n try {\n return editable({\n api: this.core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value: this.core.getCellValue(node, column),\n rowIndex: node.rowIndex\n });\n } catch (error) {\n this.core.reportError(error, \"editable\", { colId: column.id, rowId: node.id });\n return false;\n }\n }\n return true;\n }\n\n start(rowIndex: number, column: Column, keyPress?: string | null): boolean {\n if (this.core.options.editType === \"fullRow\") return this.startRow(rowIndex, column.id);\n if (this.cellEditing || this.rowEditing) return false;\n const node = this.core.rowModel.getDisplayedRow(rowIndex);\n if (!node || node.data == null || !this.isEditable(node, column)) return false;\n const cell = this.core.bodyRenderer.getCellElement(rowIndex, column.id);\n if (!cell) return false;\n\n const oldValue = this.core.getCellValue(node, column);\n const editor = this.createCellEditor(node, column, rowIndex, oldValue, keyPress);\n if (!editor) return false;\n\n cleanupCellContent(this.core, cell);\n const shell = document.createElement(\"div\");\n shell.className = \"mach-cell-editor-shell\";\n const controls = document.createElement(\"div\");\n controls.className = \"mach-cell-editor-controls\";\n const confirmButton = createEditButton(\"confirm\", \"Confirm edit\");\n const cancelButton = createEditButton(\"cancel\", \"Cancel edit\");\n controls.append(confirmButton, cancelButton);\n shell.append(editor.el, controls);\n cell.replaceChildren(shell);\n cell.classList.add(\"mach-cell--editing\");\n cell.removeAttribute(\"title\");\n\n const keydown = this.onCellEditorKeyDown;\n editor.el.addEventListener(\"keydown\", keydown);\n editor.el.addEventListener(\"focusout\", this.onCellEditorBlur);\n confirmButton.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n void this.stopAsync(false);\n });\n cancelButton.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n void this.stopAsync(true);\n });\n\n this.cellEditing = {\n node,\n column,\n editor,\n rowIndex,\n oldValue,\n cell,\n shell,\n keydown,\n confirmButton,\n cancelButton\n };\n this.focusEditor(editor, column, node);\n this.core.emit(\"cellEditingStarted\", { rowIndex, colId: column.id, rowNode: node });\n return true;\n }\n\n startRow(rowIndex: number, preferredColId?: string): boolean {\n if (this.cellEditing || this.rowEditing) return false;\n const node = this.core.rowModel.getDisplayedRow(rowIndex);\n if (!node || node.data == null || node.isDetail || node.isGroup) return false;\n\n const drafts = new Map<string, RowDraft>();\n for (const column of this.core.columnModel.getOrderedVisible()) {\n if (!this.isEditable(node, column)) continue;\n const oldValue = this.core.getCellValue(node, column);\n drafts.set(column.id, { column, oldValue, value: oldValue, mounted: null });\n }\n if (drafts.size === 0) return false;\n\n const row: RowEditingState = { node, rowIndex, drafts, validating: false };\n this.rowEditing = row;\n this.core.bodyRenderer.refreshRows([rowIndex]);\n if (drafts.size === 0) {\n this.rowEditing = null;\n this.core.bodyRenderer.refreshRows([rowIndex]);\n return false;\n }\n const first = drafts.values().next().value;\n const target = (preferredColId ? drafts.get(preferredColId) : undefined) ?? first;\n if (target?.mounted) this.focusEditor(target.mounted.editor, target.column, node);\n this.core.emit(\"rowEditingStarted\", { rowIndex, rowNode: node, data: node.data });\n return true;\n }\n\n /** Called by BodyRenderer so row editors survive horizontal/vertical virtualization. */\n renderEditor(rowIndex: number, node: RowNode<any>, column: Column, cell: HTMLElement): boolean {\n if (this.cellEditing) return this.cellEditing.node === node && this.cellEditing.column.id === column.id;\n const row = this.rowEditing;\n if (!row || row.node !== node) return false;\n const draft = row.drafts.get(column.id);\n if (!draft) return false;\n if (draft.mounted?.cell !== cell) {\n if (draft.mounted) this.unmountRowDraft(draft);\n if (!this.mountRowDraft(rowIndex, row, draft, cell)) {\n row.drafts.delete(column.id);\n return false;\n }\n }\n return true;\n }\n\n /** Captures a staged value before a pooled/virtual cell is reused. */\n releaseCell(rowIndex: number, colId: string, cell: HTMLElement): void {\n const row = this.rowEditing;\n if (row && this.currentRowIndex(row) === rowIndex) {\n const draft = row.drafts.get(colId);\n if (draft?.mounted?.cell === cell) this.unmountRowDraft(draft);\n return;\n }\n if (this.cellEditing?.cell === cell) {\n const editing = this.cellEditing;\n void this.stopAsync(false);\n // A pooled cell cannot safely retain an editor while async validation is pending.\n // Synchronous commits have already completed; pending editors are cancelled cleanly.\n if (this.cellEditing === editing) void this.stopAsync(true);\n }\n }\n\n stop(cancel = false): void {\n void this.stopAsync(cancel);\n }\n\n stopAsync(cancel = false): Promise<boolean> {\n if (this.rowEditing) return this.stopRowAsync(cancel);\n const editing = this.cellEditing;\n if (!editing) return Promise.resolve(false);\n if (cancel) {\n this.stopToken++;\n this.stopPromise = null;\n return Promise.resolve(this.finishCellStop(editing, true, editing.oldValue));\n }\n if (this.stopPromise) return this.stopPromise;\n\n let newValue: any;\n try {\n newValue = editing.editor.getValue();\n } catch (error) {\n this.core.reportError(error, \"cellEditor.getValue\", { colId: editing.column.id, rowId: editing.node.id });\n return Promise.resolve(this.finishCellStop(editing, true, editing.oldValue));\n }\n try {\n if (editing.editor.isCancelAfterEnd?.(newValue)) {\n return Promise.resolve(this.finishCellStop(editing, true, editing.oldValue));\n }\n } catch (error) {\n this.core.reportError(error, \"cellEditor.isCancelAfterEnd\", { colId: editing.column.id, rowId: editing.node.id });\n return Promise.resolve(this.finishCellStop(editing, true, editing.oldValue));\n }\n\n const validation = this.validateValue(editing.node, editing.column, editing.oldValue, newValue);\n if (validation && typeof (validation as Promise<unknown>).then === \"function\") {\n const token = ++this.stopToken;\n this.setCellBusy(editing, true);\n const task = Promise.resolve(validation)\n .then((result) => {\n if (token !== this.stopToken || this.cellEditing !== editing) return false;\n if (typeof result === \"string\") {\n this.showError(editing.editor, result);\n return false;\n }\n return this.finishCellStop(editing, false, newValue);\n })\n .catch((error) => {\n if (token !== this.stopToken || this.cellEditing !== editing) return false;\n this.core.reportError(error, \"validate\", { colId: editing.column.id, rowId: editing.node.id });\n this.showError(editing.editor, \"Validation failed\");\n return false;\n })\n .finally(() => {\n if (this.stopPromise === task) this.stopPromise = null;\n });\n this.stopPromise = task;\n return task;\n }\n if (typeof validation === \"string\") {\n this.showError(editing.editor, validation);\n return Promise.resolve(false);\n }\n return Promise.resolve(this.finishCellStop(editing, false, newValue));\n }\n\n stopRowAsync(cancel = false): Promise<boolean> {\n const row = this.rowEditing;\n if (!row) return Promise.resolve(false);\n if (cancel) {\n this.stopToken++;\n this.stopPromise = null;\n return Promise.resolve(this.finishRowStop(row, true));\n }\n if (this.stopPromise) return this.stopPromise;\n\n for (const draft of row.drafts.values()) this.captureRowDraft(draft);\n const changed = [...row.drafts.values()].filter((draft) => !Object.is(draft.oldValue, draft.value));\n if (changed.length === 0) return Promise.resolve(this.finishRowStop(row, false));\n\n const token = ++this.stopToken;\n for (const draft of changed) draft.error = undefined;\n row.validating = true;\n this.setRowBusy(row, true);\n const task = Promise.all(\n changed.map(async (draft) => {\n try {\n const result = await this.validateValue(row.node, draft.column, draft.oldValue, draft.value);\n return { draft, message: typeof result === \"string\" ? result : null };\n } catch (error) {\n this.core.reportError(error, \"validate\", { colId: draft.column.id, rowId: row.node.id });\n return { draft, message: \"Validation failed\" };\n }\n })\n )\n .then(async (results) => {\n if (token !== this.stopToken || this.rowEditing !== row) return false;\n const invalid = results.filter((result) => result.message != null);\n if (invalid.length > 0) {\n this.showRowErrors(row, invalid.map((result) => ({ draft: result.draft, message: result.message! })));\n return false;\n }\n const rowErrors = await this.validateRowDraft(row, changed);\n if (token !== this.stopToken || this.rowEditing !== row) return false;\n if (rowErrors.length > 0) {\n this.showRowErrors(row, rowErrors);\n return false;\n }\n return this.finishRowStop(row, false);\n })\n .finally(() => {\n if (this.stopPromise === task) this.stopPromise = null;\n });\n this.stopPromise = task;\n return task;\n }\n\n private finishCellStop(editing: CellEditingState, cancel: boolean, newValue: any): boolean {\n if (this.cellEditing !== editing) return false;\n this.cellEditing = null;\n const changed = !cancel && this.applyValue(editing.node, editing.column, editing.oldValue, newValue);\n this.destroyMountedEditor(editing, true);\n\n this.core.emit(\"cellEditingStopped\", {\n rowIndex: editing.rowIndex,\n colId: editing.column.id,\n rowNode: editing.node,\n oldValue: editing.oldValue,\n newValue: changed ? newValue : editing.oldValue\n });\n if (editing.node.rowIndex >= 0) this.core.bodyRenderer.refreshRows([editing.node.rowIndex]);\n this.core.summaryRenderer.refresh();\n this.core.statusBarService.refresh();\n return true;\n }\n\n private finishRowStop(row: RowEditingState, cancelled: boolean): boolean {\n if (this.rowEditing !== row) return false;\n const changes = cancelled ? [] : this.commitRowDrafts(row);\n if (changes == null) return false;\n for (const draft of row.drafts.values()) {\n if (!cancelled) this.captureRowDraft(draft);\n if (draft.mounted) this.destroyMountedEditor(draft.mounted, true);\n draft.mounted = null;\n }\n this.rowEditing = null;\n\n const rowIndex = this.currentRowIndex(row);\n this.core.emit(\"rowEditingStopped\", {\n rowIndex,\n rowNode: row.node,\n data: row.node.data!,\n cancelled,\n changes\n });\n if (rowIndex >= 0) this.core.bodyRenderer.refreshRows([rowIndex]);\n this.core.summaryRenderer.refresh();\n this.core.statusBarService.refresh();\n return true;\n }\n\n private commitRowDrafts(\n row: RowEditingState\n ): Array<{ colId: string; oldValue: unknown; newValue: unknown }> | null {\n const changed = [...row.drafts.values()].filter((draft) => !Object.is(draft.oldValue, draft.value));\n if (changed.length === 0) return [];\n const applied: RowDraft[] = [];\n this.core.undoService.beginBatch();\n for (const draft of changed) {\n if (!this.core.writeValue(row.node, draft.column, draft.value, draft.oldValue)) {\n let rollbackFailed = false;\n for (const previous of [...applied].reverse()) {\n if (!this.core.writeValue(row.node, previous.column, previous.oldValue, previous.value)) rollbackFailed = true;\n }\n this.core.undoService.cancelBatch();\n if (rollbackFailed) {\n this.core.reportError(new Error(\"A valueSetter rejected full-row rollback\"), \"rowEditRollback\", {\n rowId: row.node.id,\n colId: draft.column.id\n });\n }\n this.showRowErrors(row, [{ draft, message: \"Value was rejected by the column setter\" }]);\n return null;\n }\n applied.push(draft);\n }\n for (const draft of applied) {\n this.core.notifyCellValueChanged(row.node, draft.column, draft.oldValue, draft.value);\n }\n this.core.undoService.endBatch();\n return applied.map((draft) => ({\n colId: draft.column.id,\n oldValue: draft.oldValue,\n newValue: draft.value\n }));\n }\n\n private mountRowDraft(rowIndex: number, row: RowEditingState, draft: RowDraft, cell: HTMLElement): boolean {\n const editor = this.createCellEditor(row.node, draft.column, rowIndex, draft.value, null);\n if (!editor) return false;\n cleanupCellContent(this.core, cell);\n const shell = document.createElement(\"div\");\n shell.className = \"mach-row-editor-shell\";\n shell.appendChild(editor.el);\n cell.replaceChildren(shell);\n cell.classList.add(\"mach-cell--editing\", \"mach-cell--row-editing\");\n cell.removeAttribute(\"title\");\n\n const keydown = (event: KeyboardEvent) => this.onRowEditorKeyDown(event, row, draft);\n const input = () => {\n try {\n draft.value = editor.getValue();\n draft.error = undefined;\n } catch {\n // getValue is retried at commit and reported with column context there.\n }\n };\n editor.el.addEventListener(\"keydown\", keydown);\n editor.el.addEventListener(\"input\", input);\n draft.mounted = { editor, cell, shell, keydown, input };\n if (draft.error) this.showError(editor, draft.error);\n if (row.validating) {\n editor.el.classList.add(\"mach-editor-validating\");\n editor.el.setAttribute(\"aria-busy\", \"true\");\n editor.el.inert = true;\n }\n return true;\n }\n\n private unmountRowDraft(draft: RowDraft): void {\n if (!draft.mounted) return;\n this.captureRowDraft(draft);\n this.destroyMountedEditor(draft.mounted, true);\n draft.mounted = null;\n }\n\n private captureRowDraft(draft: RowDraft): void {\n if (!draft.mounted) return;\n try {\n const next = draft.mounted.editor.getValue();\n if (next !== undefined) draft.value = next;\n } catch (error) {\n this.core.reportError(error, \"cellEditor.getValue\", {\n colId: draft.column.id,\n rowId: this.rowEditing?.node.id\n });\n }\n }\n\n private createCellEditor(\n node: RowNode<any>,\n column: Column,\n rowIndex: number,\n value: any,\n keyPress?: string | null\n ): ICellEditor | null {\n const def = column.colDef;\n let editor: ICellEditor;\n try {\n const params = {\n api: this.core.getApi(),\n colDef: def,\n column,\n node,\n data: node.data,\n value,\n rowIndex,\n keyPress\n };\n if (typeof def.cellEditor === \"function\") {\n editor = def.cellEditor(params);\n } else if (typeof def.cellEditor === \"string\" && ![\"text\", \"number\", \"date\", \"select\"].includes(def.cellEditor)) {\n editor = this.core.resolveCellEditor(def.cellEditor)?.(params) ?? createEditor(column, value, keyPress);\n } else {\n editor = createEditor(column, value, keyPress);\n }\n } catch (error) {\n this.core.reportError(error, \"cellEditor\", { colId: column.id, rowId: node.id });\n return null;\n }\n if (!editor || !(editor.el instanceof HTMLElement)) {\n this.core.reportError(new Error(\"cellEditor must return an editor with an HTMLElement el\"), \"cellEditor\", {\n colId: column.id,\n rowId: node.id\n });\n return null;\n }\n try {\n if (editor.isCancelBeforeStart?.()) {\n editor.destroy?.();\n return null;\n }\n } catch (error) {\n this.core.reportError(error, \"cellEditor.isCancelBeforeStart\", { colId: column.id, rowId: node.id });\n try { editor.destroy?.(); } catch { void 0; }\n return null;\n }\n return editor;\n }\n\n private validateValue(\n node: RowNode<any>,\n column: Column,\n oldValue: any,\n newValue: any\n ): string | true | null | undefined | Promise<string | true | null | undefined> {\n const validate = column.colDef.validate;\n if (!validate) return true;\n try {\n return validate(newValue, {\n oldValue,\n newValue,\n data: node.data!,\n node,\n colDef: column.colDef,\n column,\n api: this.core.getApi()\n });\n } catch (error) {\n this.core.reportError(error, \"validate\", { colId: column.id, rowId: node.id });\n return \"Validation failed\";\n }\n }\n\n private async validateRowDraft(\n row: RowEditingState,\n changed: RowDraft[]\n ): Promise<Array<{ draft: RowDraft; message: string }>> {\n const validator = this.core.options.rowEditValidator;\n if (!validator) return [];\n const values: Record<string, unknown> = Object.create(null);\n for (const [colId, draft] of row.drafts) values[colId] = draft.value;\n const changes = changed.map((draft) => ({\n colId: draft.column.id,\n oldValue: draft.oldValue,\n newValue: draft.value\n }));\n let result: import(\"../types/options\").RowEditValidationResult;\n try {\n result = await validator({ data: row.node.data!, node: row.node, values, changes, api: this.core.getApi() });\n } catch (error) {\n this.core.reportError(error, \"rowEditValidator\", { rowId: row.node.id });\n return [{ draft: changed[0], message: \"Row validation failed\" }];\n }\n if (typeof result === \"string\") return [{ draft: changed[0], message: result }];\n if (!result || result === true || typeof result !== \"object\") return [];\n const errors: Array<{ draft: RowDraft; message: string }> = [];\n for (const [colId, message] of Object.entries(result)) {\n const draft = row.drafts.get(colId);\n if (draft && typeof message === \"string\" && message) errors.push({ draft, message });\n }\n if (errors.length === 0) {\n const firstMessage = Object.values(result).find((message) => typeof message === \"string\" && message);\n if (typeof firstMessage === \"string\") errors.push({ draft: changed[0], message: firstMessage });\n }\n return errors;\n }\n\n private showRowErrors(row: RowEditingState, errors: Array<{ draft: RowDraft; message: string }>): void {\n row.validating = false;\n this.setRowBusy(row, false);\n for (const { draft, message } of errors) {\n draft.error = message;\n if (draft.mounted) this.showError(draft.mounted.editor, message);\n }\n errors[0].draft.mounted?.editor.focus?.();\n }\n\n private showError(editor: ICellEditor, message: string): void {\n const editorEl = editor.el;\n editorEl.classList.add(\"mach-editor-invalid\");\n editorEl.setAttribute(\"title\", message);\n editorEl.setAttribute(\"aria-invalid\", \"true\");\n editorEl.classList.remove(\"mach-editor-validating\");\n editorEl.removeAttribute(\"aria-busy\");\n editorEl.inert = false;\n const input = editorEl.querySelector(\"input, select, textarea\") ?? editorEl;\n (input as HTMLElement).focus?.();\n const clear = () => {\n editorEl.classList.remove(\"mach-editor-invalid\");\n editorEl.removeAttribute(\"title\");\n editorEl.removeAttribute(\"aria-invalid\");\n };\n editorEl.addEventListener(\"input\", clear, { once: true });\n }\n\n private setCellBusy(editing: CellEditingState, busy: boolean): void {\n editing.editor.el.classList.toggle(\"mach-editor-validating\", busy);\n if (busy) editing.editor.el.setAttribute(\"aria-busy\", \"true\");\n else editing.editor.el.removeAttribute(\"aria-busy\");\n editing.editor.el.inert = busy;\n editing.confirmButton.disabled = busy;\n editing.cancelButton.disabled = false;\n editing.shell.classList.toggle(\"mach-editor-shell--busy\", busy);\n }\n\n private setRowBusy(row: RowEditingState, busy: boolean): void {\n for (const draft of row.drafts.values()) {\n const editorEl = draft.mounted?.editor.el;\n if (!editorEl) continue;\n editorEl.classList.toggle(\"mach-editor-validating\", busy);\n if (busy) editorEl.setAttribute(\"aria-busy\", \"true\");\n else editorEl.removeAttribute(\"aria-busy\");\n editorEl.inert = busy;\n }\n }\n\n private applyValue(node: RowNode<any>, column: Column, oldValue: any, newValue: any): boolean {\n if (newValue === undefined) return false;\n return this.core.setCellValue(node, column, newValue, oldValue);\n }\n\n private focusEditor(editor: ICellEditor, column: Column, node: RowNode<any>): void {\n try {\n editor.focus?.();\n } catch (error) {\n this.core.reportError(error, \"cellEditor.focus\", { colId: column.id, rowId: node.id });\n }\n }\n\n private destroyMountedEditor(mounted: MountedEditor, removeCellState: boolean): void {\n mounted.editor.el.removeEventListener(\"keydown\", mounted.keydown);\n if (mounted.input) mounted.editor.el.removeEventListener(\"input\", mounted.input);\n mounted.editor.el.removeEventListener(\"focusout\", this.onCellEditorBlur);\n mounted.editor.el.classList.remove(\"mach-editor-validating\");\n mounted.editor.el.removeAttribute(\"aria-busy\");\n mounted.editor.el.inert = false;\n try {\n mounted.editor.destroy?.();\n } catch (error) {\n this.core.reportError(error, \"cellEditor.destroy\", { colId: mounted.cell.dataset.colId });\n }\n if (removeCellState) mounted.cell.classList.remove(\"mach-cell--editing\", \"mach-cell--row-editing\", \"mach-cell--error\");\n }\n\n private currentRowIndex(row: RowEditingState): number {\n return row.node.rowIndex >= 0 ? row.node.rowIndex : row.rowIndex;\n }\n\n private onCellEditorKeyDown = (event: KeyboardEvent): void => {\n if (!this.cellEditing) return;\n if (event.key === \"Enter\") {\n event.preventDefault();\n event.stopPropagation();\n void this.stopAsync(false);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n void this.stopAsync(true);\n } else if (event.key === \"Tab\") {\n event.preventDefault();\n event.stopPropagation();\n const current = this.cellEditing;\n const next = this.core.keyboardService.nextEditable(current.rowIndex, current.column.id, event.shiftKey ? -1 : 1);\n void this.stopAsync(false).then((stopped) => {\n if (stopped && next) {\n this.core.bodyRenderer.scrollToIndex(next.rowIndex, \"nearest\");\n this.core.bodyRenderer.setFocusedCell(next.rowIndex, next.column.id);\n this.start(next.rowIndex, next.column);\n }\n });\n }\n };\n\n private onRowEditorKeyDown(event: KeyboardEvent, row: RowEditingState, draft: RowDraft): void {\n if (this.rowEditing !== row) return;\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n void this.stopRowAsync(true);\n return;\n }\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n event.stopPropagation();\n void this.stopRowAsync(false);\n return;\n }\n if (event.key !== \"Tab\") return;\n event.preventDefault();\n event.stopPropagation();\n this.captureRowDraft(draft);\n const drafts = [...row.drafts.values()];\n const currentIndex = drafts.indexOf(draft);\n const direction = event.shiftKey ? -1 : 1;\n for (let offset = 1; offset <= drafts.length; offset++) {\n const next = drafts[(currentIndex + direction * offset + drafts.length) % drafts.length];\n if (!next.mounted) continue;\n this.focusEditor(next.mounted.editor, next.column, row.node);\n break;\n }\n }\n\n private onCellEditorBlur = (): void => {\n window.setTimeout(() => {\n if (this.cellEditing) void this.stopAsync(false);\n }, 0);\n };\n\n destroy(): void {\n if (this.cellEditing || this.rowEditing) void this.stopAsync(true);\n }\n}\n","export const DEFAULT_LOCALE = {\n matchContains: \"包含\",\n matchNotContains: \"不包含\",\n matchEquals: \"等于\",\n matchNotEquals: \"不等于\",\n matchStartsWith: \"开头是\",\n matchEndsWith: \"结尾是\",\n matchBlank: \"为空\",\n matchNotBlank: \"不为空\",\n matchLessThan: \"小于\",\n matchLessThanOrEqual: \"小于等于\",\n matchGreaterThan: \"大于\",\n matchGreaterThanOrEqual: \"大于等于\",\n matchInRange: \"在范围内\",\n apply: \"应用\",\n reset: \"重置\",\n search: \"搜索...\",\n emptySetLabel: \"(空)\",\n selectedCount: \"已选 {n} 项\",\n sortAsc: \"升序\",\n sortDesc: \"降序\",\n clearSort: \"取消排序\",\n pinLeft: \"固定左侧\",\n pinRight: \"固定右侧\",\n clearPin: \"取消固定\",\n autoSize: \"自适应列宽\",\n hideColumn: \"隐藏此列\",\n columnVisibility: \"列显示\",\n resetAll: \"重置全部\",\n autoSizeAll: \"全部自适应\",\n columnSettings: \"列设置\",\n totalLabel: \"合计\",\n totalRowsLabel: \"共 {n} 行\",\n menuCopy: \"复制\",\n menuPaste: \"粘贴\",\n menuClearContents: \"清除内容\",\n loading: \"加载中...\",\n statusSelected: \"已选 {n} 行\",\n statusSum: \"和 {n}\",\n statusAvg: \"均 {n}\",\n statusCount: \"计 {n}\",\n emptyRows: \"暂无数据\",\n emptyRowsHint: \"没有可显示的行\",\n paginationTotal: \"共 {n} 条\",\n paginationPage: \"第 {a} / {b} 页\",\n perPage: \"{n} 条/页\",\n pageFirst: \"首页\",\n pagePrev: \"上一页\",\n pageNext: \"下一页\",\n pageLast: \"末页\"\n} as const;\n\nexport type RgLocaleKey = keyof typeof DEFAULT_LOCALE;\nexport type RgLocale = Partial<Record<RgLocaleKey, string>>;\n\nexport const LOCALE_EN: RgLocale = {\n matchContains: \"Contains\",\n matchNotContains: \"Not Contains\",\n matchEquals: \"Equals\",\n matchNotEquals: \"Not Equals\",\n matchStartsWith: \"Starts With\",\n matchEndsWith: \"Ends With\",\n matchBlank: \"Blank\",\n matchNotBlank: \"Not Blank\",\n matchLessThan: \"Less Than\",\n matchLessThanOrEqual: \"≤\",\n matchGreaterThan: \"Greater Than\",\n matchGreaterThanOrEqual: \"≥\",\n matchInRange: \"In Range\",\n apply: \"Apply\",\n reset: \"Reset\",\n search: \"Search...\",\n emptySetLabel: \"(blank)\",\n selectedCount: \"{n} selected\",\n sortAsc: \"Ascending\",\n sortDesc: \"Descending\",\n clearSort: \"Clear Sort\",\n pinLeft: \"Pin Left\",\n pinRight: \"Pin Right\",\n clearPin: \"Unpin\",\n autoSize: \"Auto Fit\",\n hideColumn: \"Hide Column\",\n columnVisibility: \"Columns\",\n resetAll: \"Reset All\",\n autoSizeAll: \"Fit All\",\n columnSettings: \"Column Settings\",\n totalLabel: \"Total\",\n totalRowsLabel: \"{n} rows\",\n menuCopy: \"Copy\",\n menuPaste: \"Paste\",\n menuClearContents: \"Clear Contents\",\n loading: \"Loading...\",\n statusSelected: \"{n} selected\",\n statusSum: \"Sum {n}\",\n statusAvg: \"Avg {n}\",\n statusCount: \"Cnt {n}\",\n emptyRows: \"No Data\",\n emptyRowsHint: \"No rows to display\",\n paginationTotal: \"{n} items\",\n paginationPage: \"Page {a} / {b}\",\n perPage: \"{n} / page\",\n pageFirst: \"First\",\n pagePrev: \"Previous\",\n pageNext: \"Next\",\n pageLast: \"Last\"\n};\n\nconst MATCH_LOCALE_KEYS: Record<string, RgLocaleKey> = {\n contains: \"matchContains\",\n notContains: \"matchNotContains\",\n equals: \"matchEquals\",\n notEquals: \"matchNotEquals\",\n startsWith: \"matchStartsWith\",\n endsWith: \"matchEndsWith\",\n blank: \"matchBlank\",\n notBlank: \"matchNotBlank\",\n lessThan: \"matchLessThan\",\n lessThanOrEqual: \"matchLessThanOrEqual\",\n greaterThan: \"matchGreaterThan\",\n greaterThanOrEqual: \"matchGreaterThanOrEqual\",\n inRange: \"matchInRange\"\n};\n\nexport function matchLocaleKey(match: string): RgLocaleKey {\n return MATCH_LOCALE_KEYS[match] ?? (\"matchEquals\");\n}\n\nexport function formatText(template: string, n: number | string): string {\n return template.replace(\"{n}\", String(n));\n}\n\nexport function formatTwo(template: string, a: number | string, b: number | string): string {\n return template.replace(\"{a}\", String(a)).replace(\"{b}\", String(b));\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport type {\n ColumnFilter,\n DateFilterMatch,\n NumberFilterMatch,\n TextFilterMatch\n} from \"../types/colDef\";\nimport { el, clamp } from \"../lib/dom\";\nimport { matchLocaleKey } from \"../lib/locale\";\n\ntype FilterPopupContext = Pick<\n GridCore<any>,\n \"applyColumnFilter\" | \"getCellValue\" | \"getLocaleText\" | \"rowModel\"\n>;\n\nconst TEXT_MATCHES: TextFilterMatch[] = [\n \"contains\",\n \"notContains\",\n \"equals\",\n \"notEquals\",\n \"startsWith\",\n \"endsWith\",\n \"blank\",\n \"notBlank\"\n];\nconst NUMBER_MATCHES: NumberFilterMatch[] = [\n \"equals\",\n \"notEquals\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"inRange\",\n \"blank\",\n \"notBlank\"\n];\nconst DATE_MATCHES: DateFilterMatch[] = [\"equals\", \"notEquals\", \"lessThan\", \"greaterThan\", \"inRange\", \"blank\", \"notBlank\"];\n\nexport class FilterPopupService {\n private panel: HTMLElement | null = null;\n private openColId: string | null = null;\n\n constructor(private core: FilterPopupContext) {}\n\n toggle(column: Column, anchor: HTMLElement): void {\n if (this.openColId === column.id) {\n this.close();\n return;\n }\n this.close();\n this.open(column, anchor);\n }\n\n private docMouseDown = (e: MouseEvent): void => {\n if (this.panel && !this.panel.contains(e.target as Node)) this.close();\n };\n\n private docKeyDown = (e: KeyboardEvent): void => {\n if (e.key === \"Escape\") this.close();\n };\n\n private open(column: Column, anchor: HTMLElement): void {\n const filter = this.core.rowModel.getFilterModel()[column.id] ?? null;\n const type = filter?.type ?? column.filterType;\n const panel = el(\"div\", \"mach-filter-panel\");\n panel.setAttribute(\"role\", \"dialog\");\n panel.setAttribute(\"aria-label\", `${column.id} filter`);\n\n if (type === \"set\") this.buildSetBody(panel, column, filter);\n else this.buildConditionBody(panel, column, type, filter);\n\n const footer = el(\"div\", \"mach-filter-footer\");\n const resetBtn = el(\"button\", \"mach-filter-btn-reset\") as HTMLButtonElement;\n resetBtn.type = \"button\";\n resetBtn.textContent = this.core.getLocaleText(\"reset\");\n resetBtn.addEventListener(\"click\", () => {\n this.core.applyColumnFilter(column, null);\n this.close();\n });\n const applyBtn = el(\"button\", \"mach-filter-btn-apply\") as HTMLButtonElement;\n applyBtn.type = \"button\";\n applyBtn.textContent = this.core.getLocaleText(\"apply\");\n applyBtn.addEventListener(\"click\", () => {\n const next = this.readFilter(panel);\n this.core.applyColumnFilter(column, next);\n this.close();\n });\n footer.append(resetBtn, applyBtn);\n panel.appendChild(footer);\n\n document.body.appendChild(panel);\n this.panel = panel;\n this.openColId = column.id;\n\n const rect = anchor.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const left = clamp(rect.left, 8, window.innerWidth - panelRect.width - 8);\n let top = rect.bottom + 4;\n if (top + panelRect.height > window.innerHeight - 8) {\n top = Math.max(8, rect.top - panelRect.height - 4);\n }\n panel.style.left = `${left}px`;\n panel.style.top = `${top}px`;\n\n document.addEventListener(\"mousedown\", this.docMouseDown, true);\n document.addEventListener(\"keydown\", this.docKeyDown, true);\n const firstInput = panel.querySelector<HTMLInputElement>(\"input, select\");\n firstInput?.focus();\n }\n\n close(): void {\n if (!this.panel) return;\n this.panel.remove();\n this.panel = null;\n this.openColId = null;\n document.removeEventListener(\"mousedown\", this.docMouseDown, true);\n document.removeEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n destroy(): void {\n this.close();\n }\n\n private buildConditionBody(\n panel: HTMLElement,\n column: Column,\n type: \"text\" | \"number\" | \"date\",\n filter: ColumnFilter | null\n ): void {\n const matches = type === \"text\" ? TEXT_MATCHES : type === \"number\" ? NUMBER_MATCHES : DATE_MATCHES;\n const existing =\n filter && filter.type !== \"set\" && filter.conditions.length > 0 ? filter.conditions[0] : null;\n const currentMatch: TextFilterMatch | NumberFilterMatch | DateFilterMatch =\n existing?.match ?? (type === \"text\" ? \"contains\" : \"equals\");\n const isBlank = currentMatch === \"blank\" || currentMatch === \"notBlank\";\n\n const select = el(\"select\", \"mach-filter-select\") as HTMLSelectElement;\n for (const m of matches) {\n const option = document.createElement(\"option\");\n option.value = m;\n option.textContent = this.core.getLocaleText(matchLocaleKey(m));\n select.appendChild(option);\n }\n select.value = currentMatch;\n\n const valueInput = el(\"input\", \"mach-filter-input\") as HTMLInputElement;\n if (type === \"number\") valueInput.type = \"number\";\n if (type === \"date\") valueInput.type = \"date\";\n if (existing && existing.value != null && !isBlank) {\n valueInput.value = type === \"date\" ? String(existing.value).slice(0, 10) : String(existing.value);\n }\n\n const value2Input = el(\"input\", \"mach-filter-input mach-filter-input--second\") as HTMLInputElement;\n if (type === \"number\") value2Input.type = \"number\";\n if (type === \"date\") value2Input.type = \"date\";\n if (existing && \"value2\" in existing && existing.value2 != null) {\n value2Input.value = String(existing.value2).slice(0, 10);\n }\n value2Input.style.display = currentMatch === \"inRange\" ? \"\" : \"none\";\n\n select.addEventListener(\"change\", () => {\n const blank = select.value === \"blank\" || select.value === \"notBlank\";\n valueInput.style.display = blank ? \"none\" : \"\";\n value2Input.style.display = select.value === \"inRange\" ? \"\" : \"none\";\n });\n\n const enterApply = (e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n const next = this.readFilter(panel);\n this.core.applyColumnFilter(column, next);\n this.close();\n }\n };\n valueInput.addEventListener(\"keydown\", enterApply);\n value2Input.addEventListener(\"keydown\", enterApply);\n\n const body = el(\"div\", \"mach-filter-body\");\n body.append(select, valueInput, value2Input);\n panel.appendChild(body);\n panel.dataset.filterType = type;\n }\n\n private buildSetBody(panel: HTMLElement, column: Column, filter: ColumnFilter | null): void {\n const def = column.colDef;\n const params = def.filterParams;\n let values: (string | number | null)[];\n\n if (params?.values) {\n values = params.values;\n } else {\n const seen = new Set<string>();\n values = [];\n const nodes = this.core.rowModel.getAllNodes();\n const cap = Math.min(nodes.length, params?.maxValues ?? 500);\n for (let i = 0; i < cap; i++) {\n const v = this.core.getCellValue(nodes[i], column);\n const key = v == null ? \"__null__\" : String(v);\n if (seen.has(key)) continue;\n seen.add(key);\n values.push(v);\n }\n }\n\n const selected = new Set<string>(\n filter?.type === \"set\" ? filter.values.map((v) => (v == null ? \"__null__\" : String(v))) : values.map((v) => (v == null ? \"__null__\" : String(v)))\n );\n\n const search = el(\"input\", \"mach-filter-input mach-filter-input--search\") as HTMLInputElement;\n search.type = \"text\";\n search.placeholder = this.core.getLocaleText(\"search\");\n\n const list = el(\"div\", \"mach-filter-set-list\");\n const checkboxes: HTMLInputElement[] = [];\n const valueByKey = new Map<string, string | number | null>();\n\n const renderList = (query: string) => {\n list.textContent = \"\";\n checkboxes.length = 0;\n const q = query.trim().toLowerCase();\n for (const v of values) {\n const text = v == null ? this.core.getLocaleText(\"emptySetLabel\") : String(v);\n if (q && !text.toLowerCase().includes(q)) continue;\n const key = v == null ? \"__null__\" : String(v);\n valueByKey.set(key, v);\n const label = el(\"label\", \"mach-filter-set-item\");\n const cb = document.createElement(\"input\");\n cb.type = \"checkbox\";\n cb.checked = selected.has(key);\n cb.addEventListener(\"change\", () => {\n if (cb.checked) selected.add(key);\n else selected.delete(key);\n });\n const span = el(\"span\");\n span.textContent = text;\n label.append(cb, span);\n list.appendChild(label);\n checkboxes.push(cb);\n }\n };\n\n search.addEventListener(\"input\", () => renderList(search.value));\n renderList(\"\");\n panel.dataset.filterType = \"set\";\n panel.dataset.setValues = JSON.stringify([...valueByKey.entries()]);\n\n const updateSetValues = () => {\n const entries = [...valueByKey.entries()];\n panel.dataset.setValues = JSON.stringify(entries);\n };\n updateSetValues();\n\n const body = el(\"div\", \"mach-filter-body mach-filter-body--set\");\n body.append(search, list);\n panel.appendChild(body);\n }\n\n private readFilter(panel: HTMLElement): ColumnFilter | null {\n const type = panel.dataset.filterType;\n\n if (type === \"set\") {\n let entries: [string, string | number | null][] = [];\n try {\n entries = JSON.parse(panel.dataset.setValues ?? \"[]\");\n } catch {\n entries = [];\n }\n const selectedKeys = new Set<string>();\n panel.querySelectorAll<HTMLInputElement>(\".mach-filter-set-item input:checked\").forEach((cb) => {\n const item = cb.closest(\".mach-filter-set-item\")!;\n const span = item.querySelector(\"span\")!;\n const emptyLabel = this.core.getLocaleText(\"emptySetLabel\");\n const text = span.textContent === emptyLabel ? \"__null__\" : span.textContent ?? \"\";\n selectedKeys.add(text);\n });\n const picked = entries.filter(([key]) => selectedKeys.has(key)).map(([, v]) => v);\n if (picked.length === entries.length || picked.length === 0) return null;\n return { type: \"set\", values: picked };\n }\n\n const select = panel.querySelector<HTMLSelectElement>(\".mach-filter-select\");\n const inputs = panel.querySelectorAll<HTMLInputElement>(\".mach-filter-input\");\n const valueInput = inputs[0];\n const value2Input = inputs[1];\n if (!select || !valueInput) return null;\n\n const match = select.value;\n if (match === \"blank\" || match === \"notBlank\") {\n return { type, conditions: [{ match: match }] } as ColumnFilter;\n }\n const raw = valueInput.value;\n if (raw === \"\" && !(match === \"inRange\")) return null;\n\n if (type === \"number\") {\n const value = Number(raw);\n if (isNaN(value)) return null;\n if (match === \"inRange\") {\n const value2 = value2Input && value2Input.value !== \"\" ? Number(value2Input.value) : value;\n if (isNaN(value2)) return null;\n return { type: \"number\", conditions: [{ match: \"inRange\", value, value2 }] };\n }\n return { type: \"number\", conditions: [{ match: match as NumberFilterMatch, value }] };\n }\n\n if (type === \"date\") {\n const value = raw;\n if (match === \"inRange\") {\n const value2 = value2Input && value2Input.value !== \"\" ? value2Input.value : value;\n return { type: \"date\", conditions: [{ match: \"inRange\", value, value2 }] };\n }\n return { type: \"date\", conditions: [{ match: match as DateFilterMatch, value }] };\n }\n\n return { type: \"text\", conditions: [{ match: match as TextFilterMatch, value: raw }] };\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport { el, clamp } from \"../lib/dom\";\n\ntype ColumnMenuContext = Pick<\n GridCore<any>,\n \"columnModel\" | \"getApi\" | \"getLocaleText\" | \"options\" | \"skeleton\"\n>;\n\nexport class ColumnMenuService {\n private panel: HTMLElement | null = null;\n private openColId: string | null = null;\n private standaloneAnchor: HTMLElement | null = null;\n private searchText = \"\";\n\n constructor(private core: ColumnMenuContext) {}\n\n toggle(column: Column, anchor: HTMLElement): void {\n if (this.openColId === column.id) {\n this.close();\n return;\n }\n this.close();\n this.open(column, anchor);\n }\n\n openStandalone(anchor?: HTMLElement): void {\n this.close();\n const target =\n anchor ??\n (() => {\n const root = this.core.skeleton.root;\n const rect = root.getBoundingClientRect();\n const fake = document.createElement(\"div\");\n fake.style.position = \"fixed\";\n fake.style.left = `${rect.right - 16}px`;\n fake.style.top = `${rect.top + this.core.options.headerHeight}px`;\n fake.style.width = \"1px\";\n fake.style.height = \"1px\";\n document.body.appendChild(fake);\n this.standaloneAnchor = fake;\n return fake;\n })();\n this.open(null, target);\n }\n\n close(): void {\n if (this.standaloneAnchor) {\n this.standaloneAnchor.remove();\n this.standaloneAnchor = null;\n }\n this.panel?.remove();\n this.panel = null;\n this.openColId = null;\n document.removeEventListener(\"mousedown\", this.docMouseDown, true);\n document.removeEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n destroy(): void {\n this.close();\n }\n\n private docMouseDown = (e: MouseEvent): void => {\n if (this.panel && !this.panel.contains(e.target as Node)) this.close();\n };\n\n private docKeyDown = (e: KeyboardEvent): void => {\n if (e.key === \"Escape\") this.close();\n };\n\n private open(column: Column | null, anchor: HTMLElement): void {\n const api = this.core.getApi();\n const panel = el(\"div\", \"mach-filter-panel mach-column-panel\");\n panel.setAttribute(\"role\", column ? \"menu\" : \"dialog\");\n if (!column) {\n panel.setAttribute(\"aria-modal\", \"false\");\n panel.setAttribute(\"aria-label\", this.core.getLocaleText(\"columnSettings\"));\n }\n\n const title = el(\"div\", \"mach-column-panel-title\");\n title.textContent = column\n ? column.colDef.headerName ?? column.colDef.field ?? column.id\n : this.core.getLocaleText(\"columnSettings\");\n panel.appendChild(title);\n\n if (column && column.sortable) {\n const sortRow = el(\"div\", \"mach-column-panel-actions\");\n const makeSortBtn = (labelKey: \"sortAsc\" | \"sortDesc\" | \"clearSort\", dir: \"asc\" | \"desc\" | null) => {\n const btn = el(\"button\", \"mach-column-panel-btn\") as HTMLButtonElement;\n btn.type = \"button\";\n btn.textContent = this.core.getLocaleText(labelKey);\n btn.addEventListener(\"click\", () => {\n api.setSortModel(dir ? [{ colId: column.id, direction: dir }] : []);\n this.close();\n });\n return btn;\n };\n sortRow.append(makeSortBtn(\"sortAsc\", \"asc\"), makeSortBtn(\"sortDesc\", \"desc\"), makeSortBtn(\"clearSort\", null));\n panel.appendChild(sortRow);\n }\n\n const pinRow = el(\"div\", \"mach-column-panel-actions\");\n const makePinBtn = (labelKey: \"pinLeft\" | \"pinRight\" | \"clearPin\", pinned: \"left\" | \"right\" | null) => {\n const btn = el(\"button\", \"mach-column-panel-btn\") as HTMLButtonElement;\n btn.type = \"button\";\n btn.textContent = this.core.getLocaleText(labelKey);\n btn.addEventListener(\"click\", () => {\n if (column) api.setColumnPinned(column.id, pinned);\n this.close();\n });\n return btn;\n };\n if (column) {\n pinRow.append(makePinBtn(\"pinLeft\", \"left\"), makePinBtn(\"pinRight\", \"right\"), makePinBtn(\"clearPin\", null));\n panel.appendChild(pinRow);\n }\n\n const toolRow = el(\"div\", \"mach-column-panel-actions\");\n const fitBtn = el(\"button\", \"mach-column-panel-btn\") as HTMLButtonElement;\n fitBtn.type = \"button\";\n fitBtn.textContent = this.core.getLocaleText(\"autoSize\");\n fitBtn.addEventListener(\"click\", () => {\n if (column) api.autoSizeColumn(column.id);\n else api.autoSizeAllColumns();\n this.close();\n });\n const hideBtn = el(\"button\", \"mach-column-panel-btn\") as HTMLButtonElement;\n hideBtn.type = \"button\";\n hideBtn.textContent = this.core.getLocaleText(\"hideColumn\");\n hideBtn.addEventListener(\"click\", () => {\n if (column) api.setColumnVisibility(column.id, false);\n this.close();\n });\n if (column) {\n toolRow.append(fitBtn, hideBtn);\n panel.appendChild(toolRow);\n }\n\n const divider = el(\"div\", \"mach-column-panel-divider\");\n panel.appendChild(divider);\n\n const listTitle = el(\"div\", \"mach-column-panel-subtitle\");\n listTitle.textContent = this.core.getLocaleText(\"columnVisibility\");\n panel.appendChild(listTitle);\n\n if (!column) {\n const search = document.createElement(\"input\");\n search.type = \"search\";\n search.className = \"mach-column-workbench-search\";\n search.placeholder = this.core.getLocaleText(\"search\");\n search.setAttribute(\"aria-label\", this.core.getLocaleText(\"search\"));\n search.value = this.searchText;\n search.addEventListener(\"input\", () => {\n this.searchText = search.value.trim().toLocaleLowerCase();\n this.renderColumnList(list, true);\n });\n panel.appendChild(search);\n }\n\n const list = el(\"div\", \"mach-column-panel-list\");\n this.renderColumnList(list, !column);\n panel.appendChild(list);\n\n const footer = el(\"div\", \"mach-filter-footer\");\n const resetBtn = el(\"button\", \"mach-filter-btn-reset\") as HTMLButtonElement;\n resetBtn.type = \"button\";\n resetBtn.textContent = this.core.getLocaleText(\"resetAll\");\n resetBtn.addEventListener(\"click\", () => {\n api.resetColumnState();\n this.close();\n });\n const allFitBtn = el(\"button\", \"mach-filter-btn-apply\") as HTMLButtonElement;\n allFitBtn.type = \"button\";\n allFitBtn.textContent = this.core.getLocaleText(\"autoSizeAll\");\n allFitBtn.addEventListener(\"click\", () => {\n api.autoSizeAllColumns();\n this.close();\n });\n footer.append(resetBtn, allFitBtn);\n panel.appendChild(footer);\n\n document.body.appendChild(panel);\n this.panel = panel;\n this.openColId = column ? column.id : \"__standalone__\";\n\n const rect = anchor.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const left = clamp(rect.left, 8, window.innerWidth - panelRect.width - 8);\n let top = rect.bottom + 4;\n if (top + panelRect.height > window.innerHeight - 8) {\n top = Math.max(8, rect.top - panelRect.height - 4);\n }\n panel.style.left = `${left}px`;\n panel.style.top = `${top}px`;\n\n document.addEventListener(\"mousedown\", this.docMouseDown, true);\n document.addEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n private rebuildListStates(): void {\n if (!this.panel) return;\n const list = this.panel.querySelector<HTMLElement>(\".mach-column-panel-list\");\n if (list) this.renderColumnList(list, this.openColId === \"__standalone__\");\n }\n\n private renderColumnList(list: HTMLElement, workbench: boolean): void {\n const api = this.core.getApi();\n list.replaceChildren();\n const columns = this.core.columnModel.getColumns().filter((candidate) => {\n if (candidate.isDetailToggle) return false;\n if (!workbench || !this.searchText) return true;\n const label = candidate.colDef.headerName ?? candidate.colDef.field ?? candidate.id;\n return `${label} ${candidate.id}`.toLocaleLowerCase().includes(this.searchText);\n });\n for (const col of columns) {\n const row = el(\"div\", workbench ? \"mach-column-workbench-item\" : \"mach-filter-set-item\");\n const label = el(\"label\", \"mach-column-workbench-label\");\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.checked = !col.hide;\n checkbox.disabled = col.hasCheckbox;\n checkbox.addEventListener(\"change\", () => {\n api.setColumnVisibility(col.id, checkbox.checked);\n this.rebuildListStates();\n });\n const text = el(\"span\", \"mach-column-workbench-name\");\n text.textContent = col.colDef.headerName ?? col.colDef.field ?? col.id;\n text.title = `${text.textContent} (${col.id})`;\n label.append(checkbox, text);\n row.appendChild(label);\n\n if (workbench) {\n const pin = document.createElement(\"select\");\n pin.className = \"mach-column-workbench-pin\";\n pin.setAttribute(\"aria-label\", `${text.textContent} ${this.core.getLocaleText(\"clearPin\")}`);\n for (const [value, caption] of [\n [\"\", this.core.getLocaleText(\"clearPin\")],\n [\"left\", this.core.getLocaleText(\"pinLeft\")],\n [\"right\", this.core.getLocaleText(\"pinRight\")]\n ] as const) {\n const option = document.createElement(\"option\");\n option.value = value;\n option.textContent = caption;\n pin.appendChild(option);\n }\n pin.value = col.pinned ?? \"\";\n pin.addEventListener(\"change\", () => {\n api.setColumnPinned(col.id, pin.value === \"left\" || pin.value === \"right\" ? pin.value : null);\n this.rebuildListStates();\n });\n row.appendChild(pin);\n\n const siblings = this.core.columnModel.getColumns().filter((candidate) =>\n !candidate.hide &&\n candidate.parentGroup === col.parentGroup &&\n (col.parentGroup != null || candidate.pinned === col.pinned)\n );\n const position = siblings.indexOf(col);\n const move = (caption: string, next: number, disabled: boolean) => {\n const button = el(\"button\", \"mach-column-workbench-move\") as HTMLButtonElement;\n button.type = \"button\";\n button.textContent = caption;\n button.disabled = disabled || col.hide || !col.movable;\n button.addEventListener(\"click\", () => {\n api.moveColumn(col.id, next);\n this.rebuildListStates();\n });\n return button;\n };\n row.append(move(\"↑\", position - 1, position <= 0), move(\"↓\", position + 1, position < 0 || position >= siblings.length - 1));\n }\n list.appendChild(row);\n }\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport { el, clamp } from \"../lib/dom\";\n\ntype ContextMenuContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"clearRangeValues\"\n | \"columnModel\"\n | \"copyActiveRange\"\n | \"getApi\"\n | \"getCellValue\"\n | \"getLocaleText\"\n | \"options\"\n | \"pasteFromSystemClipboard\"\n | \"reportError\"\n | \"rowModel\"\n>;\n\nexport class ContextMenuService {\n private panel: HTMLElement | null = null;\n\n constructor(private core: ContextMenuContext) {}\n\n open(x: number, y: number, anchor?: { rowIndex: number; colId: string }): void {\n this.close();\n const core = this.core;\n let node: import(\"../types/row\").RowNode<any> | undefined;\n let anchorCol: Column | undefined;\n\n if (anchor) {\n node = core.rowModel.getDisplayedRow(anchor.rowIndex);\n anchorCol = core.columnModel.getColumn(anchor.colId);\n } else {\n const range = core.bodyRenderer.getNormalizedRangeOrFocus();\n if (!range) return;\n const flat = core.columnModel.getOrderedVisible();\n node = core.rowModel.getDisplayedRow(range.r1);\n anchorCol = flat[range.c1];\n }\n if (!node || !anchorCol) return;\n const anchorIndex = node.rowIndex;\n\n const panel = el(\"div\", \"mach-context-menu\");\n panel.setAttribute(\"role\", \"menu\");\n\n const customGetter = core.options.getContextMenuItems;\n if (customGetter) {\n let items;\n try {\n items = customGetter({\n data: node.data,\n node,\n api: core.getApi(),\n colId: anchorCol.id,\n value: core.getCellValue(node, anchorCol),\n rowIndex: anchorIndex\n });\n } catch (error) {\n core.reportError(error, \"getContextMenuItems\", { colId: anchorCol.id, rowId: node.id });\n return;\n }\n if (items === null || items === undefined) return;\n let hasEnabled = false;\n for (const item of items) {\n if (item.separator) {\n const sep = el(\"div\", \"mach-context-menu-separator\");\n panel.appendChild(sep);\n continue;\n }\n const btn = el(\"button\", \"mach-context-menu-item\") as HTMLButtonElement;\n btn.type = \"button\";\n btn.textContent = item.label ?? \"\";\n if (item.danger) btn.classList.add(\"mach-context-menu-item--danger\");\n if (item.disabled) {\n btn.disabled = true;\n } else {\n hasEnabled = true;\n btn.addEventListener(\"click\", () => {\n this.close();\n try {\n item.action?.();\n } catch (error) {\n core.reportError(error, \"contextMenu.action\", { colId: anchorCol.id, rowId: node.id });\n }\n });\n }\n panel.appendChild(btn);\n }\n if (!hasEnabled) {\n panel.remove();\n return;\n }\n this.attach(panel, x, y);\n return;\n }\n\n const copyBtn = el(\"button\", \"mach-context-menu-item\") as HTMLButtonElement;\n copyBtn.type = \"button\";\n copyBtn.textContent = core.getLocaleText(\"menuCopy\");\n copyBtn.addEventListener(\"click\", () => {\n void core.copyActiveRange();\n this.close();\n });\n panel.appendChild(copyBtn);\n\n if (!core.options.suppressClipboard) {\n const pasteBtn = el(\"button\", \"mach-context-menu-item\") as HTMLButtonElement;\n pasteBtn.type = \"button\";\n pasteBtn.textContent = core.getLocaleText(\"menuPaste\");\n pasteBtn.addEventListener(\"click\", () => {\n void core.pasteFromSystemClipboard();\n this.close();\n });\n panel.appendChild(pasteBtn);\n\n const clearBtn = el(\"button\", \"mach-context-menu-item\") as HTMLButtonElement;\n clearBtn.type = \"button\";\n clearBtn.textContent = core.getLocaleText(\"menuClearContents\");\n clearBtn.addEventListener(\"click\", () => {\n const active = core.bodyRenderer.getNormalizedRangeOrFocus();\n if (active) core.clearRangeValues(active);\n this.close();\n });\n panel.appendChild(clearBtn);\n }\n\n this.attach(panel, x, y);\n }\n\n private attach(panel: HTMLElement, x: number, y: number): void {\n document.body.appendChild(panel);\n this.panel = panel;\n const rect = panel.getBoundingClientRect();\n const left = clamp(x, 8, Math.max(8, window.innerWidth - rect.width - 8));\n const top = clamp(y, 8, Math.max(8, window.innerHeight - rect.height - 8));\n panel.style.left = `${left}px`;\n panel.style.top = `${top}px`;\n document.addEventListener(\"mousedown\", this.docMouseDown, true);\n document.addEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n close(): void {\n if (!this.panel) return;\n this.panel.remove();\n this.panel = null;\n document.removeEventListener(\"mousedown\", this.docMouseDown, true);\n document.removeEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n destroy(): void {\n this.close();\n }\n\n private docMouseDown = (e: MouseEvent): void => {\n if (this.panel && !this.panel.contains(e.target as Node)) this.close();\n };\n\n private docKeyDown = (e: KeyboardEvent): void => {\n if (e.key === \"Escape\") this.close();\n };\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport type { TooltipParams } from \"../types/params\";\nimport { el, clamp } from \"../lib/dom\";\nimport { formatCellValue } from \"../render/cellContent\";\n\ntype TooltipContext = Pick<\n GridCore<any>,\n | \"columnModel\"\n | \"getApi\"\n | \"getCellValue\"\n | \"isDestroyed\"\n | \"options\"\n | \"reportError\"\n | \"rowModel\"\n | \"skeleton\"\n>;\n\nexport class TooltipService {\n private panel: HTMLElement | null = null;\n private showTimer = 0;\n private hideTimer = 0;\n private currentCell: HTMLElement | null = null;\n\n constructor(private core: TooltipContext) {}\n\n init(): void {\n const body = this.core.skeleton.bodyEl;\n body.addEventListener(\"mouseover\", this.onMouseOver);\n body.addEventListener(\"mouseleave\", this.onBodyLeave);\n }\n\n destroy(): void {\n this.clearTimers();\n this.removePanel();\n const body = this.core.skeleton.bodyEl;\n body.removeEventListener(\"mouseover\", this.onMouseOver);\n body.removeEventListener(\"mouseleave\", this.onBodyLeave);\n this.currentCell = null;\n }\n\n hide(): void {\n this.clearTimers();\n this.removePanel();\n this.currentCell = null;\n }\n\n private clearTimers(): void {\n if (this.showTimer) {\n clearTimeout(this.showTimer);\n this.showTimer = 0;\n }\n if (this.hideTimer) {\n clearTimeout(this.hideTimer);\n this.hideTimer = 0;\n }\n }\n\n private removePanel(): void {\n if (!this.panel) return;\n this.panel.remove();\n this.panel = null;\n }\n\n private onMouseOver = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n if (!this.core.options.tooltipComponent) return;\n const target = e.target as HTMLElement;\n const cell = target.closest<HTMLElement>(\".mach-cell\");\n if (!cell || cell === this.currentCell) return;\n\n this.clearTimers();\n this.removePanel();\n this.currentCell = cell;\n\n const colId = cell.dataset.colId ?? \"\";\n const rowEl = cell.closest<HTMLElement>(\".mach-row\");\n const index = Number(rowEl?.dataset.index);\n const node = Number.isNaN(index) ? undefined : this.core.rowModel.getDisplayedRow(index);\n const column: Column | undefined = colId ? this.core.columnModel.getColumn(colId) : undefined;\n if (!node || !column || node.isDetail || node.isGroup) return;\n if (cell.classList.contains(\"mach-cell--editing\")) return;\n\n const value = this.core.getCellValue(node, column);\n const params: TooltipParams<any> = {\n data: node.data,\n node,\n api: this.core.getApi(),\n colId: column.id,\n value,\n formatted: formatCellValue(this.core, node, column),\n rowIndex: index\n };\n\n const getter = column.colDef.tooltipValueGetter;\n let fallback = params.formatted;\n if (getter) {\n try {\n fallback = getter({ ...params, colDef: column.colDef, column }) ?? params.formatted;\n } catch (error) {\n this.core.reportError(error, \"tooltipValueGetter\", { colId: column.id, rowId: node.id });\n }\n }\n if (!fallback && !column.colDef.tooltipValueGetter) return;\n\n this.showTimer = setTimeout(() => {\n if (this.core.isDestroyed() || this.currentCell !== cell) return;\n this.showPanel(cell, params);\n }, Math.max(0, this.core.options.tooltipShowDelay));\n };\n\n private onBodyLeave = (): void => {\n this.hide();\n };\n\n private showPanel(cell: HTMLElement, params: TooltipParams<any>): void {\n this.removePanel();\n const component = this.core.options.tooltipComponent;\n if (!component) return;\n\n const panel = el(\"div\", \"mach-tooltip\");\n panel.setAttribute(\"role\", \"tooltip\");\n let content: string | HTMLElement;\n try {\n content = component(params);\n } catch (err) {\n this.core.reportError(err, \"tooltipComponent\", { colId: params.colId, rowIndex: params.rowIndex });\n return;\n }\n if (typeof content === \"string\") {\n panel.textContent = content;\n } else {\n panel.appendChild(content);\n }\n\n document.body.appendChild(panel);\n this.panel = panel;\n const rect = cell.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const left = clamp(rect.left, 8, Math.max(8, window.innerWidth - panelRect.width - 8));\n let top = rect.bottom + 6;\n if (top + panelRect.height > window.innerHeight - 8) {\n top = Math.max(8, rect.top - panelRect.height - 6);\n }\n panel.style.left = `${left}px`;\n panel.style.top = `${top}px`;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { WatermarkConfig } from \"../types/options\";\n\ntype WatermarkContext = Pick<GridCore<any>, \"isDestroyed\" | \"options\" | \"skeleton\">;\n\nexport class WatermarkService {\n private overlay: HTMLElement | null = null;\n\n constructor(private core: WatermarkContext) {}\n\n init(): void {\n this.overlay = document.createElement(\"div\");\n this.overlay.className = \"mach-watermark\";\n this.overlay.setAttribute(\"aria-hidden\", \"true\");\n this.overlay.style.pointerEvents = \"none\";\n this.core.skeleton.root.appendChild(this.overlay);\n this.apply();\n }\n\n apply(): void {\n if (!this.overlay || this.core.isDestroyed()) return;\n const config = this.core.options.watermarkEnabled ? this.core.options.watermarkConfig : null;\n if (!config || !config.text) {\n this.overlay.style.display = \"none\";\n this.overlay.style.backgroundImage = \"\";\n return;\n }\n const url = this.buildTile(config);\n this.overlay.style.display = \"\";\n if (url) {\n this.overlay.style.backgroundImage = `url(${url})`;\n this.overlay.style.backgroundColor = \"\";\n } else {\n this.overlay.style.backgroundImage = \"\";\n }\n }\n\n private buildTile(config: WatermarkConfig): string | null {\n try {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n const fontSize = config.fontSize ?? 14;\n const gap = config.gap ?? 160;\n const angle = config.angle ?? -22;\n const color = config.color ?? (this.isDark() ? \"rgba(255,255,255,0.9)\" : \"rgba(31,55,88,0.9)\");\n const opacity = config.opacity ?? 0.06;\n\n ctx.font = `500 ${fontSize}px sans-serif`;\n const metrics = ctx.measureText(config.text);\n const textW = Math.ceil(metrics.width);\n\n const tile = Math.max(gap, textW + 40);\n canvas.width = tile;\n canvas.height = tile;\n\n const ctx2 = canvas.getContext(\"2d\")!;\n ctx2.clearRect(0, 0, tile, tile);\n ctx2.globalAlpha = opacity;\n ctx2.fillStyle = color;\n ctx2.font = `500 ${fontSize}px sans-serif`;\n ctx2.translate(tile / 2, tile / 2);\n ctx2.rotate((angle * Math.PI) / 180);\n ctx2.textAlign = \"center\";\n ctx2.textBaseline = \"middle\";\n ctx2.fillText(config.text, 0, 0);\n\n return canvas.toDataURL(\"image/png\");\n } catch {\n return null;\n }\n }\n\n private isDark(): boolean {\n return this.core.skeleton.root.classList.contains(\"mach-theme-dark\");\n }\n\n refresh(): void {\n this.apply();\n }\n\n destroy(): void {\n this.overlay?.remove();\n this.overlay = null;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\n\ntype UndoContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"columnModel\"\n | \"emit\"\n | \"options\"\n | \"rowModel\"\n | \"statusBarService\"\n | \"summaryRenderer\"\n | \"writeValue\"\n>;\n\nexport interface UndoEntry {\n nodeId: string;\n columnId: string;\n oldValue: any;\n newValue: any;\n}\n\nexport class UndoRedoService {\n private stack: UndoEntry[][] = [];\n private pointer = -1;\n private pending: UndoEntry[] | null = null;\n\n constructor(private core: UndoContext) {}\n\n beginBatch(): void {\n if (this.pending) return;\n this.pending = [];\n }\n\n endBatch(): void {\n if (!this.pending) return;\n const batch = this.pending;\n this.pending = null;\n if (batch.length > 0) this.push(batch);\n }\n\n cancelBatch(): void {\n this.pending = null;\n }\n\n record(entry: UndoEntry): void {\n if (this.pending) {\n this.pending.push(entry);\n return;\n }\n this.push([entry]);\n }\n\n private push(batch: UndoEntry[]): void {\n const maxSize = Math.max(0, this.core.options.undoStackSize);\n if (maxSize === 0) return;\n this.stack.length = this.pointer + 1;\n this.stack.push(batch);\n while (this.stack.length > maxSize) this.stack.shift();\n this.pointer = this.stack.length - 1;\n }\n\n trimToSize(): void {\n const maxSize = Math.max(0, this.core.options.undoStackSize);\n if (maxSize === 0) {\n this.clear();\n return;\n }\n while (this.stack.length > maxSize) {\n this.stack.shift();\n this.pointer--;\n }\n if (this.pointer < -1) this.pointer = -1;\n }\n\n canUndo(): boolean {\n return this.pointer >= 0;\n }\n\n canRedo(): boolean {\n return this.pointer < this.stack.length - 1;\n }\n\n undo(): boolean {\n if (!this.canUndo()) return false;\n this.apply(this.stack[this.pointer], false);\n this.pointer--;\n return true;\n }\n\n redo(): boolean {\n if (!this.canRedo()) return false;\n this.pointer++;\n this.apply(this.stack[this.pointer], true);\n return true;\n }\n\n private apply(batch: UndoEntry[], redo: boolean): void {\n const core = this.core;\n const refreshIndexes: number[] = [];\n for (const entry of batch) {\n const node = core.rowModel.getNodeById(entry.nodeId);\n const column = core.columnModel.getColumn(entry.columnId);\n if (!node || !column || node.data == null) continue;\n const value = redo ? entry.newValue : entry.oldValue;\n const replaced = redo ? entry.oldValue : entry.newValue;\n if (core.writeValue(node, column, value, replaced)) {\n core.bodyRenderer.invalidateRowHeight(node);\n core.bodyRenderer.queueFlash([node.rowIndex], [column.id]);\n if (node.rowIndex >= 0) refreshIndexes.push(node.rowIndex);\n core.emit(\"cellValueChanged\", {\n oldValue: replaced,\n newValue: value,\n rowNode: node,\n rowIndex: node.rowIndex,\n column,\n colDef: column.colDef,\n data: node.data\n });\n }\n }\n if (refreshIndexes.length > 0) core.bodyRenderer.refreshRows(refreshIndexes);\n core.summaryRenderer.refresh();\n core.statusBarService.refresh();\n }\n\n clear(): void {\n this.stack = [];\n this.pointer = -1;\n this.pending = null;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { GridChange } from \"../types/api\";\nimport type { CellValueChangedEvent } from \"../types/events\";\n\ntype ChangeTrackingContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"columnModel\"\n | \"emit\"\n | \"eventBus\"\n | \"getCellValue\"\n | \"rowModel\"\n | \"statusBarService\"\n | \"summaryRenderer\"\n | \"writeValue\"\n>;\n\ninterface CellChange {\n rowId: string;\n colId: string;\n originalValue: unknown;\n value: unknown;\n}\n\nexport class ChangeTrackingService<TData = any> {\n private changes = new Map<string, CellChange>();\n private rollingBack = false;\n private unsubscribe: (() => void) | null = null;\n\n constructor(private core: ChangeTrackingContext) {}\n\n init(): void {\n this.unsubscribe = this.core.eventBus.on(\"cellValueChanged\", (event) => {\n if (!this.rollingBack) this.record(event as CellValueChangedEvent<TData>);\n });\n }\n\n private record(event: CellValueChangedEvent<TData>): void {\n const key = `${event.rowNode.id}\\u0000${event.column.id}`;\n const existing = this.changes.get(key);\n const originalValue = existing?.originalValue ?? event.oldValue;\n if (Object.is(event.newValue, originalValue)) this.changes.delete(key);\n else {\n this.changes.set(key, {\n rowId: event.rowNode.id,\n colId: event.column.id,\n originalValue,\n value: event.newValue\n });\n }\n this.emitChanged();\n }\n\n getDirtyRowIds(): string[] {\n return [...new Set([...this.changes.values()].map((change) => change.rowId))];\n }\n\n getChanges(): GridChange<TData>[] {\n const byRow = new Map<string, GridChange<TData>>();\n for (const change of this.changes.values()) {\n const node = this.core.rowModel.getNodeById(change.rowId);\n if (!node?.data) continue;\n let row = byRow.get(change.rowId);\n if (!row) {\n row = { rowId: change.rowId, data: node.data, cells: [] };\n byRow.set(change.rowId, row);\n }\n row.cells.push({\n colId: change.colId,\n originalValue: change.originalValue,\n value: change.value\n });\n }\n return [...byRow.values()];\n }\n\n markSaved(rowIds?: readonly string[]): void {\n if (!rowIds) this.changes.clear();\n else {\n const ids = new Set(rowIds);\n for (const [key, change] of this.changes) {\n if (ids.has(change.rowId)) this.changes.delete(key);\n }\n }\n this.emitChanged();\n }\n\n acknowledge(saved: readonly GridChange<TData>[]): void {\n for (const row of saved) {\n for (const cell of row.cells) {\n const key = `${row.rowId}\\u0000${cell.colId}`;\n const current = this.changes.get(key);\n if (current) {\n if (Object.is(current.value, cell.value)) this.changes.delete(key);\n else current.originalValue = cell.value;\n continue;\n }\n const node = this.core.rowModel.getNodeById(row.rowId);\n const column = this.core.columnModel.getColumn(cell.colId);\n if (!node || !column || node.data == null) continue;\n const value = this.core.getCellValue(node, column);\n if (!Object.is(value, cell.value)) {\n this.changes.set(key, {\n rowId: row.rowId,\n colId: cell.colId,\n originalValue: cell.value,\n value\n });\n }\n }\n }\n this.emitChanged();\n }\n\n rollback(rowIds?: readonly string[]): boolean {\n const ids = rowIds ? new Set(rowIds) : null;\n const targets = [...this.changes.entries()].filter(([, change]) => !ids || ids.has(change.rowId));\n if (targets.length === 0) return false;\n const refresh = new Set<number>();\n const completed = new Set<string>();\n this.rollingBack = true;\n try {\n for (const [key, change] of targets) {\n const node = this.core.rowModel.getNodeById(change.rowId);\n const column = this.core.columnModel.getColumn(change.colId);\n if (!node || !column || node.data == null) continue;\n const current = this.core.getCellValue(node, column);\n if (Object.is(current, change.originalValue)) {\n completed.add(key);\n continue;\n }\n if (!this.core.writeValue(node, column, change.originalValue, current)) continue;\n completed.add(key);\n this.core.bodyRenderer.invalidateRowHeight(node);\n if (node.rowIndex >= 0) refresh.add(node.rowIndex);\n this.core.emit(\"cellValueChanged\", {\n oldValue: current,\n newValue: change.originalValue,\n rowNode: node,\n rowIndex: node.rowIndex,\n column,\n colDef: column.colDef,\n data: node.data\n });\n }\n } finally {\n this.rollingBack = false;\n }\n for (const key of completed) this.changes.delete(key);\n if (refresh.size > 0) this.core.bodyRenderer.refreshRows([...refresh]);\n this.core.summaryRenderer.refresh();\n this.core.statusBarService.refresh();\n this.emitChanged();\n return completed.size > 0;\n }\n\n clearRows(rowIds: readonly string[]): void {\n if (rowIds.length === 0) return;\n const ids = new Set(rowIds);\n for (const [key, change] of this.changes) {\n if (ids.has(change.rowId)) this.changes.delete(key);\n }\n this.emitChanged();\n }\n\n clear(): void {\n if (this.changes.size === 0) return;\n this.changes.clear();\n this.emitChanged();\n }\n\n destroy(): void {\n this.unsubscribe?.();\n this.unsubscribe = null;\n this.changes.clear();\n }\n\n private emitChanged(): void {\n this.core.emit(\"dirtyStateChanged\", { dirtyRowIds: this.getDirtyRowIds() });\n }\n}\n","import type { ColDef } from \"./colDef\";\nimport type { FilterModel, SortModel } from \"./colDef\";\nimport type { RowNode } from \"./row\";\nimport type { GridApi } from \"./api\";\nimport type { Column } from \"../services/column\";\n\nexport const EVENT_TYPES = [\n \"gridReady\",\n \"gridDestroyed\",\n \"modelUpdated\",\n \"cellClicked\",\n \"cellDoubleClicked\",\n \"cellContextMenu\",\n \"rowClicked\",\n \"rowDoubleClicked\",\n \"selectionChanged\",\n \"sortChanged\",\n \"filterChanged\",\n \"columnResized\",\n \"columnMoved\",\n \"columnVisibilityChanged\",\n \"cellValueChanged\",\n \"cellEditingStarted\",\n \"cellEditingStopped\",\n \"rowEditingStarted\",\n \"rowEditingStopped\",\n \"detailToggled\",\n \"treeChildrenLoaded\",\n \"treeChildrenLoadFailed\",\n \"rowDragEnd\",\n \"rangeSelectionChanged\",\n \"paginationChanged\",\n \"displayedColumnsChanged\",\n \"gridError\",\n \"dirtyStateChanged\"\n] as const;\n\nexport type GridEventType = (typeof EVENT_TYPES)[number];\n\nexport type GridErrorCode =\n | \"DATA_SOURCE_ERROR\"\n | \"DATA_INTEGRITY_ERROR\"\n | \"VALIDATION_ERROR\"\n | \"RENDERER_ERROR\"\n | \"EDITOR_ERROR\"\n | \"FEATURE_ERROR\"\n | \"STATE_ERROR\"\n | \"EVENT_HANDLER_ERROR\"\n | \"GRID_ERROR\";\n\nexport interface GridEventBase<TData = any> {\n type: GridEventType;\n api: GridApi<TData>;\n}\n\nexport interface GridReadyEvent<TData = any> extends GridEventBase<TData> {\n type: \"gridReady\";\n}\n\nexport interface GridDestroyedEvent<TData = any> extends GridEventBase<TData> {\n type: \"gridDestroyed\";\n}\n\nexport interface ModelUpdatedEvent<TData = any> extends GridEventBase<TData> {\n type: \"modelUpdated\";\n rowCount: number;\n}\n\nexport interface CellClickEvent<TData = any, TValue = any> extends GridEventBase<TData> {\n type: \"cellClicked\";\n event: MouseEvent;\n rowNode: RowNode<TData>;\n rowIndex: number;\n column: Column<TData>;\n colDef: ColDef<TData, TValue>;\n value: TValue;\n}\n\nexport interface CellDoubleClickEvent<TData = any, TValue = any> extends GridEventBase<TData> {\n type: \"cellDoubleClicked\";\n event: MouseEvent;\n rowNode: RowNode<TData>;\n rowIndex: number;\n column: Column<TData>;\n colDef: ColDef<TData, TValue>;\n value: TValue;\n}\n\nexport interface CellContextMenuEvent<TData = any, TValue = any> extends GridEventBase<TData> {\n type: \"cellContextMenu\";\n event: MouseEvent;\n rowNode: RowNode<TData>;\n rowIndex: number;\n column: Column<TData>;\n colDef: ColDef<TData, TValue>;\n value: TValue;\n}\n\nexport interface RowClickEvent<TData = any> extends GridEventBase<TData> {\n type: \"rowClicked\" | \"rowDoubleClicked\";\n event: MouseEvent;\n rowNode: RowNode<TData>;\n rowIndex: number;\n}\n\nexport interface SelectionChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"selectionChanged\";\n selectedNodes: RowNode<TData>[];\n selectedRows: TData[];\n}\n\nexport interface SortChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"sortChanged\";\n sortModel: SortModel;\n}\n\nexport interface FilterChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"filterChanged\";\n filterModel: FilterModel;\n}\n\nexport interface ColumnResizedEvent<TData = any> extends GridEventBase<TData> {\n type: \"columnResized\";\n colId: string;\n width: number;\n finished: boolean;\n}\n\nexport interface ColumnMovedEvent<TData = any> extends GridEventBase<TData> {\n type: \"columnMoved\";\n colId: string;\n toIndex: number;\n}\n\nexport interface ColumnVisibilityChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"columnVisibilityChanged\";\n colId: string;\n visible: boolean;\n}\n\nexport interface CellValueChangedEvent<TData = any, TValue = any> extends GridEventBase<TData> {\n type: \"cellValueChanged\";\n oldValue: TValue;\n newValue: TValue;\n rowNode: RowNode<TData>;\n rowIndex: number;\n column: Column<TData>;\n colDef: ColDef<TData, TValue>;\n data: TData;\n}\n\nexport interface CellEditingStartedEvent<TData = any> extends GridEventBase<TData> {\n type: \"cellEditingStarted\";\n rowIndex: number;\n colId: string;\n rowNode: RowNode<TData>;\n}\n\nexport interface CellEditingStoppedEvent<TData = any> extends GridEventBase<TData> {\n type: \"cellEditingStopped\";\n rowIndex: number;\n colId: string;\n rowNode: RowNode<TData>;\n oldValue: any;\n newValue: any;\n}\n\nexport interface RowEditChange {\n colId: string;\n oldValue: unknown;\n newValue: unknown;\n}\n\nexport interface RowEditingStartedEvent<TData = any> extends GridEventBase<TData> {\n type: \"rowEditingStarted\";\n rowIndex: number;\n rowNode: RowNode<TData>;\n data: TData;\n}\n\nexport interface RowEditingStoppedEvent<TData = any> extends GridEventBase<TData> {\n type: \"rowEditingStopped\";\n rowIndex: number;\n rowNode: RowNode<TData>;\n data: TData;\n cancelled: boolean;\n changes: RowEditChange[];\n}\n\nexport interface DetailToggledEvent<TData = any> extends GridEventBase<TData> {\n type: \"detailToggled\";\n rowId: string;\n rowNode: RowNode<TData>;\n expanded: boolean;\n}\n\nexport interface TreeChildrenLoadedEvent<TData = any> extends GridEventBase<TData> {\n type: \"treeChildrenLoaded\";\n rowId: string;\n rowNode: RowNode<TData>;\n children: readonly TData[];\n}\n\nexport interface TreeChildrenLoadFailedEvent<TData = any> extends GridEventBase<TData> {\n type: \"treeChildrenLoadFailed\";\n rowId: string;\n rowNode: RowNode<TData>;\n error: unknown;\n}\n\nexport interface GridCellRange {\n row1: number;\n row2: number;\n colId1: string;\n colId2: string;\n}\n\nexport interface RangeSelectionChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"rangeSelectionChanged\";\n range: GridCellRange | null;\n}\n\nexport interface RowDragEndEvent<TData = any> extends GridEventBase<TData> {\n type: \"rowDragEnd\";\n rowNode: RowNode<TData>;\n fromIndex: number;\n toIndex: number;\n}\n\nexport interface PaginationChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"paginationChanged\";\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n\nexport interface DisplayedColumnsChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"displayedColumnsChanged\";\n}\n\nexport interface GridErrorEvent<TData = any> extends GridEventBase<TData> {\n type: \"gridError\";\n code: GridErrorCode;\n error: unknown;\n source: string;\n context?: Record<string, unknown>;\n}\n\nexport interface DirtyStateChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"dirtyStateChanged\";\n dirtyRowIds: string[];\n}\n\nexport interface GridEventMap<TData = any> {\n gridReady: GridReadyEvent<TData>;\n gridDestroyed: GridDestroyedEvent<TData>;\n modelUpdated: ModelUpdatedEvent<TData>;\n cellClicked: CellClickEvent<TData>;\n cellDoubleClicked: CellDoubleClickEvent<TData>;\n cellContextMenu: CellContextMenuEvent<TData>;\n rowClicked: RowClickEvent<TData>;\n rowDoubleClicked: RowClickEvent<TData>;\n selectionChanged: SelectionChangedEvent<TData>;\n sortChanged: SortChangedEvent<TData>;\n filterChanged: FilterChangedEvent<TData>;\n columnResized: ColumnResizedEvent<TData>;\n columnMoved: ColumnMovedEvent<TData>;\n columnVisibilityChanged: ColumnVisibilityChangedEvent<TData>;\n cellValueChanged: CellValueChangedEvent<TData>;\n cellEditingStarted: CellEditingStartedEvent<TData>;\n cellEditingStopped: CellEditingStoppedEvent<TData>;\n rowEditingStarted: RowEditingStartedEvent<TData>;\n rowEditingStopped: RowEditingStoppedEvent<TData>;\n detailToggled: DetailToggledEvent<TData>;\n treeChildrenLoaded: TreeChildrenLoadedEvent<TData>;\n treeChildrenLoadFailed: TreeChildrenLoadFailedEvent<TData>;\n rowDragEnd: RowDragEndEvent<TData>;\n rangeSelectionChanged: RangeSelectionChangedEvent<TData>;\n paginationChanged: PaginationChangedEvent<TData>;\n displayedColumnsChanged: DisplayedColumnsChangedEvent<TData>;\n gridError: GridErrorEvent<TData>;\n dirtyStateChanged: DirtyStateChangedEvent<TData>;\n}\n\nexport type GridEventHandler<K extends GridEventType, TData = any> = (event: GridEventMap<TData>[K]) => void;\n\nexport type EventHandlerName<K extends GridEventType> = `on${Capitalize<K>}`;\n","export function escapeHtml(value: any): string {\n const s = value == null ? \"\" : String(value);\n return s\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nexport function downloadFile(filename: string, content: string, mime = \"text/plain;charset=utf-8\"): boolean {\n try {\n if (typeof document === \"undefined\" || typeof Blob === \"undefined\") return false;\n const a = document.createElement(\"a\");\n if (typeof URL !== \"undefined\" && typeof URL.createObjectURL === \"function\") {\n const blob = new Blob([content], { type: mime });\n const url = URL.createObjectURL(blob);\n a.href = url;\n a.download = filename;\n a.click();\n const revoke = typeof URL.revokeObjectURL === \"function\" ? URL.revokeObjectURL.bind(URL) : null;\n if (revoke) setTimeout(() => {\n try {\n revoke(url);\n } catch {\n void 0;\n }\n }, 0);\n } else {\n a.href = `data:${mime},${encodeURIComponent(content)}`;\n a.download = filename;\n a.click();\n }\n return true;\n } catch {\n return false;\n }\n}\n","const UNSAFE_PATH_SEGMENTS = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\n\nexport function isSafePath(path: string): boolean {\n if (typeof path !== \"string\" || path.length === 0) return false;\n const parts = path.split(\".\");\n return parts.every((part) => part.length > 0 && !UNSAFE_PATH_SEGMENTS.has(part));\n}\n\nexport function getByPath(obj: any, path: string): any {\n if (obj == null) return undefined;\n if (!isSafePath(path)) return undefined;\n const dot = path.indexOf(\".\");\n if (dot < 0) return obj[path];\n let cur = obj;\n let start = 0;\n while (start < path.length) {\n if (cur == null) return undefined;\n const idx = path.indexOf(\".\", start);\n if (idx < 0) {\n cur = cur[path.slice(start)];\n break;\n }\n cur = cur[path.slice(start, idx)];\n start = idx + 1;\n }\n return cur;\n}\n\nexport function setByPath(obj: any, path: string, value: any): boolean {\n if (obj == null || !isSafePath(path)) return false;\n const parts = path.split(\".\");\n let cur = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n if ((typeof cur !== \"object\" && typeof cur !== \"function\") || cur === null) return false;\n if (cur[parts[i]] == null) cur[parts[i]] = {};\n cur = cur[parts[i]];\n }\n if ((typeof cur !== \"object\" && typeof cur !== \"function\") || cur === null) return false;\n cur[parts[parts.length - 1]] = value;\n return true;\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { CsvExportParams, ImportCsvOptions, RowTransaction } from \"../types/api\";\nimport type { GridApi } from \"../types/api\";\nimport type { GridOptions } from \"../types/options\";\nimport type { ApplyGridStateOptions, GridState, GridStateSection } from \"../types/state\";\nimport type { Column } from \"./column\";\nimport { EVENT_TYPES } from \"../types/events\";\nimport type { ColDefOrGroup, ColumnState, FilterModel, SortModel } from \"../types/colDef\";\nimport { DEFAULT_COL_DEF, GRID_SIZE_PRESETS } from \"../core/resolveOptions\";\nimport { buildCsv } from \"../lib/csv\";\nimport { parseCsv, toTsv } from \"../lib/clipboard\";\nimport { escapeHtml } from \"../lib/download\";\nimport { setByPath } from \"../lib/path\";\nimport { formatCellValue } from \"../render/cellContent\";\n\ninterface OptionUpdateEffects {\n datasourceChanged: boolean;\n needsCellRefresh: boolean;\n needsColumnRebuild: boolean;\n needsHeaderRebuild: boolean;\n needsPoolRebuild: boolean;\n needsRelayout: boolean;\n needsRowRebuild: boolean;\n needsStateLoad: boolean;\n needsSummaryRefresh: boolean;\n stateToApply?: GridState;\n}\n\ninterface CsvFieldBinding {\n field: string;\n index: number;\n}\n\nfunction createOptionUpdateEffects(): OptionUpdateEffects {\n return {\n datasourceChanged: false,\n needsCellRefresh: false,\n needsColumnRebuild: false,\n needsHeaderRebuild: false,\n needsPoolRebuild: false,\n needsRelayout: false,\n needsRowRebuild: false,\n needsStateLoad: false,\n needsSummaryRefresh: false\n };\n}\n\nfunction hasOwnOption<T extends object>(options: T, key: PropertyKey): boolean {\n return Object.prototype.hasOwnProperty.call(options, key);\n}\n\nfunction normalizeFinite(value: unknown, min: number, integer = false): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < min) return undefined;\n return integer ? Math.floor(value) : value;\n}\n\nfunction changedFinite(\n value: unknown,\n current: number,\n min: number,\n integer = false\n): number | undefined {\n const normalized = normalizeFinite(value, min, integer);\n return normalized === undefined || normalized === current ? undefined : normalized;\n}\n\nfunction cloneSnapshotData<T>(data: T): T {\n try {\n if (typeof structuredClone === \"function\") return structuredClone(data);\n } catch {\n // Rows containing functions or platform objects fall back to a shallow snapshot.\n }\n if (Array.isArray(data)) return [...data] as T;\n if (data != null && typeof data === \"object\") return { ...data };\n return data;\n}\n\nexport class GridApiImpl<TData = any> implements GridApi<TData> {\n private measureCanvas: HTMLCanvasElement | null = null;\n private asyncTransactions: RowTransaction<TData>[] = [];\n private asyncTransactionTimer: ReturnType<typeof setTimeout> | null = null;\n private asyncTransactionResolvers: Array<() => void> = [];\n\n constructor(private core: GridCore<TData>) {}\n\n whenReady(): Promise<import(\"../types/api\").GridApi<TData>> {\n return this.core.whenReady();\n }\n\n setRowData(rows: TData[] | null | undefined): void {\n if (this.core.isDestroyed()) return;\n this.core.options.rowData = rows ?? [];\n if (this.core.rowModel.isInfinite) return;\n this.core.rowModel.setRowData(rows);\n this.core.bodyRenderer.onDataChanged();\n }\n\n applyTransaction(transaction: RowTransaction<TData>): void {\n if (this.core.isDestroyed() || this.core.rowModel.isInfinite) return;\n this.core.rowModel.applyTransaction(transaction);\n this.core.bodyRenderer.onDataChanged();\n }\n\n applyTransactionAsync(transaction: RowTransaction<TData>): Promise<void> {\n if (this.core.isDestroyed() || this.core.rowModel.isInfinite) return Promise.resolve();\n this.asyncTransactions.push(transaction);\n if (this.asyncTransactionTimer == null) {\n this.asyncTransactionTimer = setTimeout(\n () => this.flushAsyncTransactions(),\n this.core.options.asyncTransactionWaitMillis\n );\n }\n return new Promise((resolve) => this.asyncTransactionResolvers.push(resolve));\n }\n\n flushAsyncTransactions(): void {\n if (this.asyncTransactionTimer != null) clearTimeout(this.asyncTransactionTimer);\n this.asyncTransactionTimer = null;\n const transactions = this.asyncTransactions;\n const resolvers = this.asyncTransactionResolvers;\n this.asyncTransactions = [];\n this.asyncTransactionResolvers = [];\n if (transactions.length > 0 && !this.core.isDestroyed() && !this.core.rowModel.isInfinite) {\n this.core.rowModel.applyTransactions(transactions);\n this.core.bodyRenderer.onDataChanged();\n }\n for (const resolve of resolvers) resolve();\n }\n\n getColumnDefs(): ColDefOrGroup<TData>[] | null {\n return this.core.columnModel.getColumnDefs() as ColDefOrGroup<TData>[];\n }\n\n setColumnDefs(colDefs: ColDefOrGroup<TData>[] | null | undefined): void {\n if (this.core.isDestroyed()) return;\n this.core.options.columnDefs = colDefs ?? [];\n this.core.columnModel.setColumnDefs(colDefs);\n this.core.loadPersistedColumnState();\n this.core.onColumnsStructureChanged();\n if (this.core.rowModel.isInfinite) void this.core.rowModel.onServerParamsChanged();\n else {\n this.core.rowModel.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n }\n\n getColumnState(): ColumnState[] {\n return this.core.columnModel.getColumnState();\n }\n\n setColumnState(state: ColumnState[]): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.applyColumnState(state);\n this.core.onColumnsStructureChanged();\n this.core.applySortModel();\n this.core.persistColumnState();\n }\n\n resetColumnState(): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.resetColumnState();\n this.core.onColumnsStructureChanged();\n this.core.applySortModel();\n this.core.persistColumnState();\n }\n\n setColumnVisibility(colId: string, visible: boolean): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.setColumnVisibility(colId, visible);\n this.core.onColumnsStructureChanged();\n this.core.emit(\"columnVisibilityChanged\", { colId, visible });\n this.core.persistColumnState();\n }\n\n moveColumn(colId: string, toIndex: number): void {\n if (this.core.isDestroyed()) return;\n this.core.moveColumn(colId, toIndex);\n }\n\n setColumnPinned(colId: string, pinned: \"left\" | \"right\" | null): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.setColumnPinned(colId, pinned);\n this.core.onColumnsStructureChanged();\n this.core.persistColumnState();\n }\n\n sizeColumnsToFit(width?: number): void {\n if (this.core.isDestroyed()) return;\n const cols = this.core.columnModel.getOrderedVisible();\n if (cols.length === 0) return;\n const target = width ?? this.core.skeleton.measureViewportWidth();\n if (target <= 0) return;\n const total = cols.reduce((acc, c) => acc + c.currentWidth, 0);\n if (total <= 0) return;\n for (const col of cols) {\n this.core.columnModel.setColumnWidth(col, Math.max(30, Math.floor((col.currentWidth * target) / total)));\n }\n this.core.relayoutColumns();\n this.core.persistColumnState();\n }\n\n autoSizeColumn(colId: string, skipHeader = false): void {\n if (this.core.isDestroyed()) return;\n const column = this.core.columnModel.getColumn(colId);\n if (!column) return;\n\n if (this.autoSizeColumnInternal(column, skipHeader)) {\n this.core.relayoutColumns();\n this.core.persistColumnState();\n }\n }\n\n private autoSizeColumnInternal(\n column: Column<TData>,\n skipHeader: boolean\n ): boolean {\n\n if (column.hasCheckbox || column.isDetailToggle) {\n this.core.columnModel.setColumnWidth(column, column.isDetailToggle ? 38 : 46);\n return true;\n }\n\n this.measureCanvas ??= document.createElement(\"canvas\");\n const ctx = this.measureCanvas.getContext(\"2d\");\n if (!ctx) return false;\n const style = window.getComputedStyle(this.core.skeleton.root);\n ctx.font = `${style.fontStyle} ${style.fontWeight} ${style.fontSize} ${style.fontFamily}`;\n\n let maxWidth = 0;\n const consider = (text: string) => {\n if (!text) return;\n const w = ctx.measureText(text).width;\n if (w > maxWidth) maxWidth = w;\n };\n\n if (!skipHeader) {\n consider(column.colDef.headerName ?? column.colDef.field ?? column.id);\n }\n const nodes = this.core.rowModel.getAllNodes();\n const cap = Math.min(nodes.length, 2000);\n for (let i = 0; i < cap; i++) {\n consider(formatCellValue(this.core, nodes[i], column));\n }\n\n const extra = (column.sortable ? 20 : 0) + (column.filterable ? 28 : 0) + (this.core.options.columnMenu ? 22 : 0) + 28;\n this.core.columnModel.setColumnWidth(column, Math.ceil(maxWidth) + extra);\n return true;\n }\n\n autoSizeAllColumns(skipHeader?: boolean): void {\n if (this.core.isDestroyed()) return;\n let changed = false;\n for (const col of this.core.columnModel.getOrderedVisible()) {\n changed = this.autoSizeColumnInternal(col, skipHeader ?? false) || changed;\n }\n if (changed) {\n this.core.relayoutColumns();\n this.core.persistColumnState();\n }\n }\n\n getSortModel(): SortModel {\n return this.core.columnModel.getSortModel();\n }\n\n setSortModel(sortModel: SortModel | null): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.applySortModel(sortModel);\n this.core.applySortModel();\n }\n\n getFilterModel(): FilterModel {\n return this.core.rowModel.getFilterModel();\n }\n\n setFilterModel(filterModel: FilterModel | null): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.setFilterModel(filterModel);\n this.core.headerRenderer.refreshFilterIcons();\n this.core.emit(\"filterChanged\", { filterModel: this.core.rowModel.getFilterModel() });\n if (this.core.rowModel.isInfinite) {\n void this.core.rowModel.onServerParamsChanged();\n return;\n }\n this.core.rowModel.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n\n isColumnFilterPresent(colId: string): boolean {\n return Object.prototype.hasOwnProperty.call(this.core.rowModel.getFilterModel(), colId);\n }\n\n setQuickFilter(text: string | null | undefined): void {\n if (this.core.isDestroyed()) return;\n this.core.options.quickFilterText = text != null && text.trim() !== \"\" ? text : null;\n if (this.core.rowModel.setQuickFilter(text)) {\n this.core.applyQuickFilter();\n }\n }\n\n getQuickFilter(): string | null {\n return this.core.rowModel.getQuickFilter();\n }\n\n getRowSelection(): \"none\" | \"single\" | \"multiple\" {\n return this.core.options.rowSelection;\n }\n\n setRowSelection(mode: \"none\" | \"single\" | \"multiple\"): void {\n if (this.core.isDestroyed()) return;\n if (this.core.options.rowSelection === mode) return;\n this.core.options.rowSelection = mode;\n if (mode === \"none\") this.deselectAll();\n this.core.headerRenderer.build();\n this.core.bodyRenderer.rebuildPool();\n }\n\n getSelectedNodes() {\n return this.core.selectionService.getSelectedNodes();\n }\n\n getSelectedRows(): TData[] {\n return this.core.selectionService.getSelectedRows();\n }\n\n selectNodeById(nodeId: string, selected = true, clearOthers = true): void {\n this.core.selectionService.selectNodeById(nodeId, selected, clearOthers);\n }\n\n selectAll(filteredOnly = true): void {\n this.core.selectionService.selectAll(filteredOnly);\n }\n\n deselectAll(): void {\n this.core.selectionService.deselectAll();\n }\n\n getDisplayedRowCount(): number {\n return this.core.rowModel.getDisplayedRowCount();\n }\n\n getRowNode(rowIndex: number) {\n return this.core.rowModel.getDisplayedRow(rowIndex);\n }\n\n getNodeById(id: string) {\n return this.core.rowModel.getNodeById(id);\n }\n\n forEachNode(callback: (node: any, index: number) => void): void {\n this.core.rowModel.forEachNode(callback);\n }\n\n forEachNodeAfterFilterAndSort(callback: (node: any, index: number) => void): void {\n this.core.rowModel.forEachNodeAfterFilterAndSort(callback);\n }\n\n scrollToIndex(rowIndex: number, position: \"top\" | \"bottom\" | \"middle\" | \"nearest\" = \"top\"): void {\n this.core.bodyRenderer.scrollToIndex(rowIndex, position);\n }\n\n expandRow(rowId: string): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.expandRow(rowId);\n }\n\n collapseRow(rowId: string): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.collapseRow(rowId);\n }\n\n toggleDetailRow(rowId: string): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.toggleDetail(rowId);\n }\n\n isRowExpanded(rowId: string): boolean {\n return this.core.rowModel.isRowExpanded(rowId);\n }\n\n expandAllDetails(): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.expandAllDetails();\n }\n\n collapseAllDetails(): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.collapseAllDetails();\n }\n\n loadTreeChildren(rowId: string, options: { force?: boolean } = {}): Promise<readonly TData[]> {\n if (this.core.isDestroyed()) return Promise.resolve([]);\n return this.core.rowModel.loadTreeChildren(rowId, options.force === true);\n }\n\n retryTreeChildren(rowId: string): Promise<readonly TData[]> {\n return this.loadTreeChildren(rowId, { force: true });\n }\n\n isTreeRowLoading(rowId: string): boolean {\n return !this.core.isDestroyed() && this.core.rowModel.isTreeRowLoading(rowId);\n }\n\n toggleRowGroup(groupId: string): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.toggleGroup(groupId);\n }\n\n reorderRows(fromIndex: number, toIndex: number): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.reorderRowsByDisplayed(fromIndex, toIndex);\n }\n\n isGroupExpanded(groupId: string): boolean {\n return this.core.rowModel.isGroupExpanded(groupId);\n }\n\n expandAllGroups(): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.expandAllGroups();\n }\n\n collapseAllGroups(): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.collapseAllGroups();\n }\n\n setSelection(rows: TData[], clearOthers = true): void {\n if (this.core.isDestroyed()) return;\n const getRowId = this.core.options.getRowId;\n const changes: { node: any; selected: boolean }[] = [];\n for (const row of rows) {\n const node = getRowId\n ? this.core.rowModel.getNodeById(\n this.core.rowModel.resolveRowId(row, -1, `__missing_selection_${this.core.nextId()}`)\n )\n : this.core.rowModel.getAllNodes().find((n) => n.data === row);\n if (node) changes.push({ node, selected: true });\n }\n if (changes.length > 0) {\n this.core.selectionService.applySelectionPublic(changes, clearOthers);\n } else if (clearOthers) {\n this.deselectAll();\n }\n }\n\n getVisibleSelection(): TData[] {\n const selectedIds = new Set(this.core.selectionService.getSelectedNodes().map((n) => n.id));\n return this.core.rowModel\n .getDisplayedRows()\n .filter((n) => !n.isDetail && !n.isGroup && selectedIds.has(n.id))\n .map((n) => n.data!)\n .filter(Boolean);\n }\n\n getSelectedIds(): string[] {\n return this.core.selectionService.getSelectedIds();\n }\n\n undo(): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.undoService.undo();\n }\n\n redo(): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.undoService.redo();\n }\n\n canUndo(): boolean {\n return this.core.undoService.canUndo();\n }\n\n canRedo(): boolean {\n return this.core.undoService.canRedo();\n }\n\n getDirtyRowIds(): string[] {\n return this.core.changeTracker.getDirtyRowIds();\n }\n\n getChanges(): import(\"../types/api\").GridChange<TData>[] {\n return this.core.changeTracker.getChanges();\n }\n\n markChangesSaved(rowIds?: readonly string[]): void {\n this.core.changeTracker.markSaved(rowIds);\n }\n\n async saveChanges(\n handler: import(\"../types/api\").SaveChangesHandler<TData>,\n rowIds?: readonly string[]\n ): Promise<import(\"../types/api\").GridChange<TData>[]> {\n const ids = rowIds ? new Set(rowIds) : null;\n const snapshot = this.core.changeTracker.getChanges()\n .filter((change) => !ids || ids.has(change.rowId))\n .map((change) => ({\n ...change,\n data: cloneSnapshotData(change.data),\n cells: change.cells.map((cell) => ({ ...cell }))\n }));\n if (snapshot.length === 0) return [];\n const result = await handler(snapshot);\n const savedIds = result && typeof result === \"object\" && Array.isArray(result.savedRowIds)\n ? new Set(result.savedRowIds.map(String))\n : null;\n const saved = savedIds ? snapshot.filter((change) => savedIds.has(change.rowId)) : snapshot;\n if (!this.core.isDestroyed()) this.core.changeTracker.acknowledge(saved);\n return saved;\n }\n\n rollbackChanges(rowIds?: readonly string[]): boolean {\n return this.core.changeTracker.rollback(rowIds);\n }\n\n setPinnedTopRowData(rows: TData[] | null): void {\n if (this.core.isDestroyed()) return;\n this.core.options.pinnedTopRowData = rows ?? [];\n this.core.pinnedRowsRenderer.setTopData(this.core.options.pinnedTopRowData);\n }\n\n getPinnedTopRowData(): TData[] {\n return this.core.pinnedRowsRenderer.getTopData();\n }\n\n setPinnedBottomRowData(rows: TData[] | null): void {\n if (this.core.isDestroyed()) return;\n this.core.options.pinnedBottomRowData = rows ?? [];\n this.core.pinnedRowsRenderer.setBottomData(this.core.options.pinnedBottomRowData);\n }\n\n getPinnedBottomRowData(): TData[] {\n return this.core.pinnedRowsRenderer.getBottomData();\n }\n\n getRangeSelection(): import(\"../types/events\").GridCellRange | null {\n return this.core.bodyRenderer.getRangeSelection();\n }\n\n clearRangeSelection(): void {\n if (this.core.isDestroyed()) return;\n this.core.bodyRenderer.clearRangeSelection();\n }\n\n copyRangeToClipboard(): Promise<boolean> {\n if (this.core.isDestroyed()) return Promise.resolve(false);\n return this.core.copyActiveRange();\n }\n\n openColumnPanel(anchor?: HTMLElement): void {\n this.openColumnWorkbench(anchor);\n }\n\n openColumnWorkbench(anchor?: HTMLElement): void {\n if (this.core.isDestroyed()) return;\n this.core.columnMenu.openStandalone(anchor);\n }\n\n closeColumnWorkbench(): void {\n this.core.columnMenu.close();\n }\n\n getColumnWorkbenchItems(): import(\"../types/api\").ColumnWorkbenchItem[] {\n return this.core.columnModel.getColumns()\n .filter((column) => !column.isDetailToggle)\n .map((column) => ({\n colId: column.id,\n label: column.colDef.headerName ?? column.colDef.field ?? column.id,\n visible: !column.hide,\n pinned: column.pinned,\n width: column.currentWidth || column.manualWidth || column.colDef.width || 0,\n movable: column.movable,\n hideable: !column.hasCheckbox\n }));\n }\n\n refreshLayout(): void {\n if (this.core.isDestroyed()) return;\n this.core.relayout();\n this.core.bodyRenderer.syncScroll();\n }\n\n isInfinite(): boolean {\n return this.core.rowModel.isInfinite;\n }\n\n reload(): Promise<void> {\n if (this.core.isDestroyed()) return Promise.resolve();\n if (this.core.rowModel.isInfinite) {\n return this.core.rowModel.reloadInfinite();\n } else {\n this.core.rowModel.setRowData(this.core.options.rowData);\n this.core.bodyRenderer.onDataChanged();\n return Promise.resolve();\n }\n }\n\n paginationEnabled(): boolean {\n return this.core.rowModel.paginationActive;\n }\n\n setPaginationEnabled(enabled: boolean): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.setPaginationEnabled(enabled);\n }\n\n getPage(): number {\n return this.core.rowModel.getCurrentPage();\n }\n\n setPage(page: number): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.setPage(page);\n }\n\n getPageSize(): number {\n return this.core.options.paginationPageSize;\n }\n\n setPageSize(size: number): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.setPageSize(size);\n }\n\n getPageCount(): number {\n return this.core.rowModel.getPageCount();\n }\n\n getTotalRowCount(): number {\n return this.core.rowModel.getTotalRowCount();\n }\n\n importCsv(text: string, options: ImportCsvOptions = {}): boolean {\n if (this.core.isDestroyed() || !text) return false;\n const grid = parseCsv(text, options.separator ?? \",\");\n if (grid.length === 0) return false;\n const headerRow = grid[options.headerRowIndex ?? 0] ?? [];\n const body = grid.slice((options.headerRowIndex ?? 0) + 1).filter((r) => r.some((c) => c !== \"\"));\n const mode = options.mode ?? \"replace\";\n\n if (mode === \"paste\") {\n this.core.pasteText(toTsv(body, false), 0, 0);\n return true;\n }\n\n const columns = this.core.columnModel.getOrderedVisible().filter((column) => column.colDef.field);\n const fieldOrder = this.resolveCsvFieldOrder(headerRow, columns);\n const records = this.buildCsvRecords(body, fieldOrder, options);\n\n if (mode === \"append\") {\n this.core.rowModel.applyTransaction({ add: records as unknown as TData[] });\n } else {\n this.core.rowModel.setRowData(records as unknown as TData[]);\n }\n this.core.bodyRenderer.onDataChanged();\n return true;\n }\n\n private resolveCsvFieldOrder(headerRow: string[], columns: readonly Column[]): CsvFieldBinding[] {\n const byHeader = new Map<string, string>();\n for (const column of columns) {\n const field = column.colDef.field;\n if (!field) continue;\n byHeader.set(String(column.colDef.headerName ?? field), field);\n byHeader.set(field, field);\n }\n if (headerRow.length > 0) headerRow[0] = headerRow[0].replace(/^\\uFEFF/, \"\");\n const matched = headerRow\n .map((header, index) => ({ field: byHeader.get(String(header).trim()) ?? null, index }))\n .filter((entry): entry is { field: string; index: number } => entry.field != null);\n if (matched.length > 0) return matched;\n return columns.map((column, index) => ({ field: column.colDef.field!, index }));\n }\n\n private buildCsvRecords(\n rows: string[][],\n fieldOrder: CsvFieldBinding[],\n options: ImportCsvOptions\n ): Array<Record<string, any>> {\n return rows.map((row, rowIndex) => {\n const record: Record<string, any> = {};\n fieldOrder.forEach(({ field, index }) => {\n const raw = row[index];\n if (raw === undefined) return;\n const value = this.parseCsvValue(raw, field, rowIndex, index, options);\n if (!setByPath(record, field, value)) {\n this.core.reportError(new Error(`Unsafe CSV field: ${field}`), \"csv.import\", { field });\n }\n });\n return record;\n });\n }\n\n private parseCsvValue(\n raw: string,\n field: string,\n rowIndex: number,\n columnIndex: number,\n options: ImportCsvOptions\n ): any {\n if (options.parseValue) {\n try {\n return options.parseValue({ value: raw, field, rowIndex, columnIndex });\n } catch (error) {\n this.core.reportError(error, \"csv.parseValue\", { field, rowIndex, columnIndex });\n return raw;\n }\n }\n if (raw === \"\") return null;\n const isNumeric = /^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/.test(raw);\n const hasLeadingZero = /^[+-]?0\\d/.test(raw);\n return options.coerceNumbers !== false && isNumeric && !hasLeadingZero ? Number(raw) : raw;\n }\n\n print(options: import(\"../types/api\").PrintOptions = {}): boolean {\n if (this.core.isDestroyed()) return false;\n try {\n const win = window.open(\"\", \"_blank\", \"width=980,height=720\");\n if (!win) return false;\n const cols = this.core.columnModel\n .getOrderedVisible()\n .filter((c) => !c.hasCheckbox && !c.isDetailToggle && !c.colDef.rowDrag);\n const nodes = this.core.rowModel.getPipelineRows().filter((n) => !n.isDetail && !n.isGroup);\n const includeHeader = options.includeHeader !== false;\n const headerCells = includeHeader\n ? `<tr>${cols.map((c) => `<th>${escapeHtml(c.colDef.headerName ?? c.colDef.field ?? c.id)}</th>`).join(\"\")}</tr>`\n : \"\";\n const bodyRows = nodes\n .map(\n (node) =>\n `<tr>${cols\n .map((c) => {\n const v = formatCellValue(this.core, node, c);\n return `<td>${escapeHtml(v)}</td>`;\n })\n .join(\"\")}</tr>`\n )\n .join(\"\");\n const html =\n `<!doctype html><html><head><meta charset=\"utf-8\"><title>${escapeHtml(options.title ?? \"MachTable\")}</title>` +\n `<style>body{font-family:system-ui,\"PingFang SC\",\"Microsoft YaHei\",sans-serif;padding:20px}` +\n `h3{margin:0 0 12px;font-size:16px}` +\n `table{border-collapse:collapse;width:100%;font-size:12px}` +\n `th,td{border:1px solid #bbb;padding:5px 8px;text-align:left;word-break:break-all}` +\n `th{background:#f2f5f9;font-weight:600}` +\n `@page{margin:12mm}</style></head><body>` +\n `<h3>${escapeHtml(options.title ?? \"\")}</h3><table>${headerCells}${bodyRows}</table>` +\n `</body></html>`;\n win.document.write(html);\n win.document.close();\n win.focus();\n win.print();\n return true;\n } catch {\n return false;\n }\n }\n\n startEditingCell(params: { rowIndex: number; colId: string; keyPress?: string }): boolean {\n const column = this.core.columnModel.getColumn(params.colId);\n if (!column) return false;\n return this.core.editingService.start(params.rowIndex, column, params.keyPress ?? null);\n }\n\n startEditingRow(rowIndex: number): boolean {\n return this.core.editingService.startRow(rowIndex);\n }\n\n isRowEditing(rowIndex?: number): boolean {\n return this.core.editingService.isRowEditing(rowIndex);\n }\n\n stopEditing(cancel?: boolean): void {\n this.core.editingService.stop(cancel ?? false);\n }\n\n stopEditingAsync(cancel?: boolean): Promise<boolean> {\n return this.core.editingService.stopAsync(cancel ?? false);\n }\n\n stopEditingRow(cancel?: boolean): Promise<boolean> {\n return this.core.editingService.stopRowAsync(cancel ?? false);\n }\n\n refreshCells(): void {\n this.core.bodyRenderer.refreshAllCells();\n this.core.pinnedRowsRenderer.refresh();\n this.core.summaryRenderer.refresh();\n }\n\n getGridOption<K extends keyof GridOptions<TData>>(key: K): GridOptions<TData>[K] {\n return (this.core.options as unknown as GridOptions<TData>)[key];\n }\n\n setGridOption<K extends keyof GridOptions<TData>>(key: K, value: GridOptions<TData>[K]): void {\n this.updateOptions({ [key]: value });\n }\n\n updateOptions(options: Partial<GridOptions<TData>>): void {\n if (this.core.isDestroyed()) return;\n this.core.checkWarnings(options);\n const effects = createOptionUpdateEffects();\n const previousColumnMenu = this.core.options.columnMenu;\n\n this.updateSourceOptions(options, effects);\n this.updateDimensionOptions(options, effects);\n this.updateEditingOptions(options, effects);\n this.updateInteractionOptions(options, effects);\n this.updatePaginationOptions(options);\n this.updatePresentationOptions(options, effects);\n this.updateAccessibilityOptions(options, effects);\n this.updateRowModelOptions(options, effects);\n this.updateExtensionOptions(options, effects);\n this.updateDatasourceOptions(options, effects);\n this.applyOptionUpdateEffects(options, effects, previousColumnMenu);\n }\n\n private updateSourceOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (hasOwnOption(options, \"columnDefs\") && options.columnDefs !== resolved.columnDefs) {\n resolved.columnDefs = Array.isArray(options.columnDefs) ? options.columnDefs : [];\n effects.needsColumnRebuild = true;\n effects.needsRowRebuild = true;\n }\n if (hasOwnOption(options, \"rowData\")) {\n resolved.rowData = Array.isArray(options.rowData) ? options.rowData : [];\n effects.needsRowRebuild = true;\n }\n if (hasOwnOption(options, \"initialState\") && options.initialState) {\n resolved.initialState = options.initialState;\n effects.stateToApply = options.initialState;\n }\n this.updateEventHandlers(options);\n }\n\n private updateEventHandlers(options: Partial<GridOptions<TData>>): void {\n for (const eventType of EVENT_TYPES) {\n const key = `on${eventType.charAt(0).toUpperCase()}${eventType.slice(1)}` as keyof GridOptions<TData>;\n if (hasOwnOption(options, key)) Object.assign(this.core.options, { [key]: options[key] });\n }\n }\n\n private updateDimensionOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n const rowHeight = changedFinite(options.rowHeight, resolved.rowHeight, 1);\n const headerHeight = changedFinite(options.headerHeight, resolved.headerHeight, 1);\n const rowBuffer = changedFinite(options.rowBuffer, resolved.rowBuffer, 0, true);\n const detailHeight = changedFinite(options.detailRowHeight, resolved.detailRowHeight, 1);\n\n if (rowHeight !== undefined) {\n resolved.rowHeight = rowHeight;\n effects.needsRelayout = true;\n }\n if (headerHeight !== undefined) {\n resolved.headerHeight = headerHeight;\n effects.needsRelayout = true;\n effects.needsHeaderRebuild = true;\n }\n if (rowBuffer !== undefined) {\n resolved.rowBuffer = rowBuffer;\n effects.needsRelayout = true;\n }\n if (options.columnLayout != null && options.columnLayout !== resolved.columnLayout) {\n resolved.columnLayout = options.columnLayout === \"fit\" ? \"fit\" : \"normal\";\n effects.needsRelayout = true;\n }\n if (options.multiSort != null) resolved.multiSort = options.multiSort;\n if (detailHeight !== undefined) {\n resolved.detailRowHeight = detailHeight;\n this.core.bodyRenderer.applyContainerSizes();\n this.core.bodyRenderer.updateRange(true);\n }\n }\n\n private updateEditingOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (options.editType != null && options.editType !== resolved.editType) {\n this.core.editingService.stop(true);\n resolved.editType = options.editType === \"fullRow\" ? \"fullRow\" : \"cell\";\n effects.needsCellRefresh = true;\n }\n if (options.editableIndicator != null && options.editableIndicator !== resolved.editableIndicator) {\n resolved.editableIndicator =\n options.editableIndicator === \"always\" || options.editableIndicator === \"none\"\n ? options.editableIndicator\n : \"hover\";\n effects.needsCellRefresh = true;\n }\n if (hasOwnOption(options, \"rowEditValidator\")) resolved.rowEditValidator = options.rowEditValidator;\n if (options.singleClickEdit != null) resolved.singleClickEdit = options.singleClickEdit;\n if (options.manualSorting != null) resolved.manualSorting = options.manualSorting;\n if (options.manualFiltering != null) resolved.manualFiltering = options.manualFiltering;\n }\n\n private updateInteractionOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (options.locale != null && options.locale !== resolved.locale) {\n resolved.locale = options.locale;\n effects.needsHeaderRebuild = true;\n effects.needsCellRefresh = true;\n this.core.paginationBar.rebuild();\n this.core.statusBarService.rebuild();\n }\n if (options.indexOffset != null && options.indexOffset !== resolved.indexOffset) {\n resolved.indexOffset = options.indexOffset;\n effects.needsCellRefresh = true;\n }\n if (options.showSummary != null && options.showSummary !== resolved.showSummary) {\n resolved.showSummary = options.showSummary;\n effects.needsSummaryRefresh = true;\n effects.needsRelayout = true;\n }\n const undoStackSize = changedFinite(options.undoStackSize, resolved.undoStackSize, 0, true);\n if (undoStackSize !== undefined) {\n resolved.undoStackSize = undoStackSize;\n this.core.undoService.trimToSize();\n }\n const wait = normalizeFinite(options.asyncTransactionWaitMillis, 0, true);\n if (wait !== undefined) resolved.asyncTransactionWaitMillis = wait;\n this.updateDynamicRowHeight(options, effects);\n this.updateRangeAndFeedbackOptions(options);\n }\n\n private updateDynamicRowHeight(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n if (!hasOwnOption(options, \"getRowHeight\")) return;\n const changed = this.core.options.getRowHeight !== options.getRowHeight;\n this.core.options.getRowHeight = options.getRowHeight;\n if (changed) this.core.bodyRenderer.invalidateAllRowHeights();\n effects.needsRelayout = true;\n }\n\n private updateRangeAndFeedbackOptions(options: Partial<GridOptions<TData>>): void {\n const resolved = this.core.options;\n if (options.enableRangeSelection != null) {\n resolved.enableRangeSelection = options.enableRangeSelection;\n if (!options.enableRangeSelection) this.clearRangeSelection();\n }\n if (hasOwnOption(options, \"tooltipComponent\")) resolved.tooltipComponent = options.tooltipComponent;\n const tooltipDelay = normalizeFinite(options.tooltipShowDelay, 0);\n if (tooltipDelay !== undefined) resolved.tooltipShowDelay = tooltipDelay;\n if (options.flashCells != null) resolved.flashCells = options.flashCells;\n if (hasOwnOption(options, \"getContextMenuItems\")) {\n resolved.getContextMenuItems = options.getContextMenuItems;\n }\n if (options.theme != null && options.theme !== resolved.theme) {\n resolved.theme = options.theme;\n this.core.skeleton.applyTheme(options.theme);\n this.core.watermarkService.refresh();\n }\n }\n\n private updatePaginationOptions(options: Partial<GridOptions<TData>>): void {\n if (options.pagination === undefined) return;\n const resolved = this.core.options;\n const config = options.pagination;\n const enabled = config !== false && resolved.datasource == null;\n if (enabled !== resolved.paginationEnabled) this.core.rowModel.setPaginationEnabled(enabled);\n if (typeof config === \"object\" && config) this.updatePaginationConfig(config);\n if (resolved.paginationEnabled) this.core.rowModel.onPaginationOptionsChanged();\n this.core.paginationBar.rebuild();\n }\n\n private updatePaginationConfig(config: Exclude<GridOptions<TData>[\"pagination\"], boolean | undefined>): void {\n const resolved = this.core.options;\n resolved.paginationMode = config.mode === \"server\" ? \"server\" : \"client\";\n const page = normalizeFinite(config.page, 1, true);\n const total = normalizeFinite(config.total, 0, true);\n if (page !== undefined) resolved.paginationPage = page;\n if (total !== undefined) resolved.paginationTotal = total;\n if (config.pageSize != null) resolved.paginationPageSize = config.pageSize;\n if (config.pageSizeOptions != null) resolved.paginationPageSizeOptions = config.pageSizeOptions;\n if (config.showTotal != null) resolved.paginationShowTotal = config.showTotal;\n if (config.showPageSizeSelector != null) {\n resolved.paginationShowSizeSelector = config.showPageSizeSelector;\n }\n }\n\n private updatePresentationOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n this.updateWatermarkAndStatus(options, effects);\n this.updateSizePreset(options, effects);\n const resolved = this.core.options;\n if (options.stripedRows != null && options.stripedRows !== resolved.stripedRows) {\n resolved.stripedRows = options.stripedRows;\n this.core.skeleton.setStriped(options.stripedRows);\n }\n if (options.showCellBorders != null && options.showCellBorders !== resolved.showCellBorders) {\n resolved.showCellBorders = options.showCellBorders;\n this.core.skeleton.setCellBorders(options.showCellBorders);\n }\n }\n\n private updateWatermarkAndStatus(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (options.watermark !== undefined) {\n resolved.watermarkEnabled = options.watermark != null && options.watermark !== false;\n resolved.watermarkConfig =\n options.watermark == null || options.watermark === false\n ? null\n : options.watermark === true\n ? { text: \"MachTable\" }\n : options.watermark;\n this.core.watermarkService.refresh();\n }\n this.updateStatusOptions(options);\n if (hasOwnOption(options, \"summaryMethod\")) {\n resolved.summaryMethod = options.summaryMethod;\n effects.needsSummaryRefresh = true;\n }\n }\n\n private updateStatusOptions(options: Partial<GridOptions<TData>>): void {\n const resolved = this.core.options;\n if (options.suppressClipboard != null) resolved.suppressClipboard = options.suppressClipboard;\n if (options.contextMenu != null) resolved.contextMenu = options.contextMenu;\n if (options.columnMenu != null) resolved.columnMenu = options.columnMenu;\n if (options.fillHandle != null) resolved.fillHandle = options.fillHandle;\n if (options.statusBar !== undefined) {\n resolved.statusBarEnabled =\n options.statusBar === true || (typeof options.statusBar === \"object\" && options.statusBar != null);\n if (typeof options.statusBar === \"object\" && options.statusBar?.panels) {\n resolved.statusBarPanels = options.statusBar.panels;\n }\n this.core.statusBarService.rebuild();\n }\n }\n\n private updateSizePreset(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const { size } = options;\n if (size == null || !hasOwnOption(GRID_SIZE_PRESETS, size) || size === this.core.options.size) return;\n const preset = GRID_SIZE_PRESETS[size];\n this.core.options.size = size;\n this.core.options.rowHeight = options.rowHeight ?? preset.rowHeight;\n this.core.options.headerHeight = options.headerHeight ?? preset.headerHeight;\n this.core.skeleton.applySize(size);\n effects.needsRelayout = true;\n effects.needsHeaderRebuild = true;\n }\n\n private updateAccessibilityOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (options.suppressCellFocus != null) resolved.suppressCellFocus = options.suppressCellFocus;\n if (options.suppressRowHoverHighlight != null) {\n resolved.suppressRowHoverHighlight = options.suppressRowHoverHighlight;\n }\n if (options.suppressNoRowsOverlay != null) resolved.suppressNoRowsOverlay = options.suppressNoRowsOverlay;\n if (options.suppressHeaderFocus != null && options.suppressHeaderFocus !== resolved.suppressHeaderFocus) {\n resolved.suppressHeaderFocus = options.suppressHeaderFocus;\n effects.needsHeaderRebuild = true;\n }\n this.updateAriaLabels(options);\n this.updateOverlayOptions(options);\n }\n\n private updateAriaLabels(options: Partial<GridOptions<TData>>): void {\n const resolved = this.core.options;\n let changed = false;\n if (hasOwnOption(options, \"ariaLabel\")) {\n resolved.ariaLabel = options.ariaLabel ?? \"MachTable data grid\";\n changed = true;\n }\n if (hasOwnOption(options, \"ariaLabelledBy\")) {\n resolved.ariaLabelledBy = options.ariaLabelledBy ?? \"\";\n changed = true;\n }\n if (hasOwnOption(options, \"ariaDescribedBy\")) {\n resolved.ariaDescribedBy = options.ariaDescribedBy ?? \"\";\n changed = true;\n }\n if (changed) this.core.skeleton.applyAriaLabels(resolved);\n }\n\n private updateOverlayOptions(options: Partial<GridOptions<TData>>): void {\n const resolved = this.core.options;\n if (hasOwnOption(options, \"overlayNoRowsTemplate\")) {\n resolved.overlayNoRowsTemplate = options.overlayNoRowsTemplate ?? \"\";\n }\n if (hasOwnOption(options, \"overlayLoadingTemplate\")) {\n resolved.overlayLoadingTemplate = options.overlayLoadingTemplate ?? \"\";\n }\n if (options.allowUnsafeOverlayHtml != null) resolved.allowUnsafeOverlayHtml = options.allowUnsafeOverlayHtml;\n if (hasOwnOption(options, \"className\")) {\n resolved.className = options.className ?? \"\";\n this.core.skeleton.setCustomClass(resolved.className);\n }\n if (options.loading != null) resolved.loading = options.loading;\n }\n\n private updateRowModelOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n this.updateSelectionAndColumns(options, effects);\n this.updateHierarchyOptions(options, effects);\n const resolved = this.core.options;\n if (options.autoCheckedChildren != null) resolved.autoCheckedChildren = options.autoCheckedChildren;\n if (options.defaultExpandAll != null && options.defaultExpandAll !== resolved.defaultExpandAll) {\n resolved.defaultExpandAll = options.defaultExpandAll;\n effects.needsRowRebuild = true;\n }\n if (options.applyRowDrag != null) resolved.applyRowDrag = options.applyRowDrag;\n if (options.suppressWarnings != null) resolved.suppressWarnings = options.suppressWarnings;\n }\n\n private updateSelectionAndColumns(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (options.rowSelection != null && options.rowSelection !== resolved.rowSelection) {\n resolved.rowSelection = options.rowSelection;\n if (options.rowSelection === \"none\") this.deselectAll();\n effects.needsHeaderRebuild = true;\n effects.needsPoolRebuild = true;\n this.core.refreshAriaState();\n }\n if (options.quickFilterText !== undefined) this.setQuickFilter(options.quickFilterText);\n if (options.defaultColDef !== undefined && options.defaultColDef !== resolved.defaultColDef) {\n resolved.defaultColDef = { ...DEFAULT_COL_DEF, ...options.defaultColDef };\n effects.needsColumnRebuild = true;\n }\n if (hasOwnOption(options, \"columnTypes\") && options.columnTypes !== resolved.columnTypes) {\n resolved.columnTypes = options.columnTypes ?? {};\n effects.needsColumnRebuild = true;\n }\n if (hasOwnOption(options, \"getRowId\") && options.getRowId !== resolved.getRowId) {\n resolved.getRowId = options.getRowId;\n effects.needsRowRebuild = true;\n }\n }\n\n private updateHierarchyOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (options.masterDetail != null && options.masterDetail !== resolved.masterDetail) {\n resolved.masterDetail = options.masterDetail;\n effects.needsColumnRebuild = true;\n effects.needsRowRebuild = true;\n }\n if (options.detailToggleColumn != null && options.detailToggleColumn !== resolved.detailToggleColumn) {\n resolved.detailToggleColumn = options.detailToggleColumn;\n effects.needsColumnRebuild = true;\n }\n if (options.treeData != null && options.treeData !== resolved.treeData) {\n resolved.treeData = options.treeData;\n effects.needsRowRebuild = true;\n effects.needsColumnRebuild = true;\n this.core.refreshAriaState();\n }\n if (options.childrenKey != null && options.childrenKey !== resolved.childrenKey) {\n resolved.childrenKey = options.childrenKey;\n effects.needsRowRebuild = true;\n }\n if (hasOwnOption(options, \"isTreeRowExpandable\")) {\n resolved.isTreeRowExpandable = options.isTreeRowExpandable;\n effects.needsCellRefresh = true;\n }\n if (hasOwnOption(options, \"loadTreeChildren\")) {\n resolved.loadTreeChildren = options.loadTreeChildren;\n effects.needsCellRefresh = true;\n }\n }\n\n private updateExtensionOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (hasOwnOption(options, \"aggFuncs\")) {\n resolved.aggFuncs = options.aggFuncs;\n effects.needsRowRebuild = true;\n }\n if (hasOwnOption(options, \"components\")) {\n resolved.components = options.components;\n effects.needsCellRefresh = true;\n }\n if (hasOwnOption(options, \"actionPolicy\")) {\n resolved.actionPolicy = options.actionPolicy;\n effects.needsCellRefresh = true;\n }\n if (hasOwnOption(options, \"features\")) {\n resolved.features = Array.isArray(options.features) ? options.features : [];\n this.core.setFeatures(resolved.features);\n }\n if (hasOwnOption(options, \"columnStateStore\")) {\n resolved.columnStateStore = options.columnStateStore;\n effects.needsStateLoad = true;\n }\n if (hasOwnOption(options, \"columnStateKey\")) {\n resolved.columnStateKey = options.columnStateKey ?? null;\n effects.needsStateLoad = true;\n }\n }\n\n private updateDatasourceOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n const blockSize = normalizeFinite(options.blockSize, 1, true);\n const bufferRows = normalizeFinite(options.infiniteBufferRows, 0, true);\n const retryCount = normalizeFinite(options.datasourceRetryCount, 0, true);\n const retryDelay = normalizeFinite(options.datasourceRetryDelay, 0, true);\n if (blockSize !== undefined) resolved.blockSize = blockSize;\n if (bufferRows !== undefined) resolved.infiniteBufferRows = bufferRows;\n if (retryCount !== undefined) resolved.datasourceRetryCount = retryCount;\n if (retryDelay !== undefined) resolved.datasourceRetryDelay = retryDelay;\n this.updateDatasourceReference(options, effects);\n this.updatePinnedRows(options);\n }\n\n private updateDatasourceReference(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (hasOwnOption(options, \"datasource\") && options.datasource !== resolved.datasource) {\n resolved.datasource = options.datasource;\n resolved.paginationEnabled = options.datasource == null && resolved.paginationEnabled;\n effects.datasourceChanged = true;\n this.core.paginationBar.rebuild();\n }\n if (hasOwnOption(options, \"detailRowRenderer\")) {\n resolved.detailRowRenderer = options.detailRowRenderer;\n effects.needsCellRefresh = true;\n }\n if (hasOwnOption(options, \"isRowExpandable\")) {\n resolved.isRowExpandable = options.isRowExpandable;\n effects.needsCellRefresh = true;\n }\n }\n\n private updatePinnedRows(options: Partial<GridOptions<TData>>): void {\n const resolved = this.core.options;\n if (options.pinnedTopRowData !== undefined) {\n resolved.pinnedTopRowData = options.pinnedTopRowData ?? [];\n this.core.pinnedRowsRenderer.setTopData(resolved.pinnedTopRowData);\n }\n if (options.pinnedBottomRowData !== undefined) {\n resolved.pinnedBottomRowData = options.pinnedBottomRowData ?? [];\n this.core.pinnedRowsRenderer.setBottomData(resolved.pinnedBottomRowData);\n }\n }\n\n private applyOptionUpdateEffects(\n options: Partial<GridOptions<TData>>,\n effects: OptionUpdateEffects,\n previousColumnMenu: boolean\n ): void {\n const resolved = this.core.options;\n if (effects.needsColumnRebuild) {\n this.core.columnModel.setColumnDefs(resolved.columnDefs);\n this.core.onColumnsStructureChanged();\n effects.needsHeaderRebuild = false;\n effects.needsPoolRebuild = false;\n }\n if (effects.needsStateLoad) {\n this.core.loadPersistedColumnState();\n this.core.onColumnsStructureChanged();\n }\n this.applyRowUpdateEffect(effects);\n if (effects.needsRelayout) {\n this.core.skeleton.updateHeights(resolved.rowHeight, resolved.headerHeight);\n this.core.relayout();\n this.core.relayoutColumns(false);\n }\n if (options.columnMenu != null && options.columnMenu !== previousColumnMenu) {\n effects.needsHeaderRebuild = true;\n }\n if (effects.needsHeaderRebuild) this.core.headerRenderer.build();\n if (effects.needsPoolRebuild) this.core.bodyRenderer.rebuildPool();\n else if (effects.needsCellRefresh) this.refreshCells();\n if (effects.needsSummaryRefresh) this.core.summaryRenderer.refresh();\n if (effects.stateToApply) this.applyState(effects.stateToApply);\n this.core.bodyRenderer.refreshOverlays();\n }\n\n private applyRowUpdateEffect(effects: OptionUpdateEffects): void {\n if (effects.datasourceChanged) {\n void this.core.rowModel.onDatasourceChanged();\n return;\n }\n if (!effects.needsRowRebuild) return;\n if (this.core.rowModel.isInfinite) {\n void this.core.rowModel.onServerParamsChanged();\n return;\n }\n this.core.rowModel.setRowData(this.core.options.rowData);\n this.core.bodyRenderer.onDataChanged();\n }\n\n getDataAsCsv(params: CsvExportParams = {}): string {\n const cols = this.core.columnModel.getOrderedVisible().filter((c) => !c.hasCheckbox && !c.isDetailToggle);\n if (params.headersOnly) {\n return buildCsv(\n {\n getHeaderLabels: () => cols.map((c) => c.colDef.headerName ?? c.colDef.field ?? c.id),\n getRowValues: () => []\n },\n params\n );\n }\n const nodes = params.onlySelected\n ? this.core.selectionService.getSelectedNodes().slice().sort((a, b) => a.rowIndex - b.rowIndex)\n : params.onlyAllDisplayed\n ? this.core.rowModel.getDisplayedRows().filter((n) => !n.isDetail && !n.isGroup)\n : this.core.rowModel.getPipelineRows().filter((n) => !n.isDetail && !n.isGroup);\n\n return buildCsv({\n getHeaderLabels: () => cols.map((c) => c.colDef.headerName ?? c.colDef.field ?? c.id),\n getRowValues: () =>\n nodes.map((node) =>\n cols.map((c) => {\n const v = this.core.getCellValue(node, c);\n if (typeof v === \"number\") return v;\n return formatCellValue(this.core, node, c);\n })\n )\n }, params);\n }\n\n getState(): GridState {\n return {\n version: 1,\n columns: this.getColumnState(),\n sortModel: this.getSortModel(),\n filterModel: this.getFilterModel(),\n quickFilterText: this.getQuickFilter(),\n pagination: {\n enabled: this.paginationEnabled(),\n page: this.getPage(),\n pageSize: this.getPageSize()\n },\n selectedRowIds: this.getSelectedIds(),\n expandedRowIds: this.core.rowModel.getExpandedRowIds(),\n expandedGroupIds: this.core.rowModel.getExpandedGroupIds()\n };\n }\n\n applyState(state: GridState, options: ApplyGridStateOptions = {}): void {\n if (this.core.isDestroyed() || !state || state.version !== 1) return;\n const all: readonly GridStateSection[] = [\"columns\", \"sort\", \"filter\", \"pagination\", \"selection\", \"expansion\"];\n const sections = new Set(options.sections ?? all);\n this.core.editingService.stop(true);\n\n this.restoreStateSections(state, sections);\n this.refreshAfterStateRestore(state, sections);\n if (options.emitEvents !== false) this.emitStateEvents(sections);\n }\n\n private restoreStateSections(state: GridState, sections: ReadonlySet<GridStateSection>): void {\n if (sections.has(\"columns\")) this.core.columnModel.applyColumnState(state.columns ?? []);\n if (sections.has(\"sort\")) this.core.columnModel.applySortModel(state.sortModel ?? []);\n if (sections.has(\"filter\")) {\n this.core.rowModel.setFilterModel(state.filterModel ?? {});\n this.core.rowModel.setQuickFilter(state.quickFilterText);\n }\n if (sections.has(\"expansion\")) {\n this.core.rowModel.restoreExpansion(state.expandedRowIds ?? [], state.expandedGroupIds ?? []);\n }\n if (sections.has(\"pagination\") && state.pagination) {\n this.core.options.paginationEnabled = state.pagination.enabled && !this.core.rowModel.isInfinite;\n this.core.rowModel.restorePagination(state.pagination.page, state.pagination.pageSize);\n this.core.paginationBar.rebuild();\n }\n }\n\n private refreshAfterStateRestore(state: GridState, sections: ReadonlySet<GridStateSection>): void {\n if (sections.has(\"columns\")) this.core.onColumnsStructureChanged();\n if (this.core.rowModel.isInfinite) {\n void this.core.rowModel.onServerParamsChanged();\n } else {\n this.core.rowModel.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n this.core.headerRenderer.refreshSortIndicators();\n this.core.headerRenderer.refreshFilterIcons();\n if (sections.has(\"selection\")) this.core.selectionService.restoreSelection(state.selectedRowIds ?? []);\n this.core.persistColumnState();\n }\n\n private emitStateEvents(sections: ReadonlySet<GridStateSection>): void {\n if (sections.has(\"sort\")) this.core.emit(\"sortChanged\", { sortModel: this.getSortModel() });\n if (sections.has(\"filter\")) this.core.emit(\"filterChanged\", { filterModel: this.getFilterModel() });\n if (sections.has(\"pagination\")) {\n this.core.emit(\"paginationChanged\", {\n page: this.getPage(),\n pageSize: this.getPageSize(),\n pageCount: this.getPageCount(),\n total: this.getTotalRowCount()\n });\n }\n }\n\n getDiagnostics(): import(\"../types/api\").GridDiagnostics {\n return this.core.getDiagnostics();\n }\n\n setOverlay(type: \"loading\" | \"noRows\" | null): void {\n if (type === \"loading\") {\n this.core.skeleton.showOverlay(\n \"loading\",\n this.core.options.overlayLoadingTemplate,\n this.core.options.allowUnsafeOverlayHtml\n );\n } else if (type === \"noRows\") {\n const content = this.core.options.overlayNoRowsTemplate || this.core.buildDefaultEmptyState();\n this.core.skeleton.showOverlay(\"noRows\", content, this.core.options.allowUnsafeOverlayHtml);\n } else {\n this.core.skeleton.hideOverlay();\n }\n }\n\n hideOverlays(): void {\n this.core.skeleton.hideOverlay();\n }\n\n addEventListener<K extends import(\"../types/events\").GridEventType>(\n eventType: K,\n listener: (event: any) => void\n ): () => void {\n return this.core.eventBus.on(eventType, listener);\n }\n\n removeEventListener<K extends import(\"../types/events\").GridEventType>(\n eventType: K,\n listener: (event: any) => void\n ): void {\n this.core.eventBus.off(eventType, listener);\n }\n\n destroy(): void {\n if (this.asyncTransactionTimer != null) clearTimeout(this.asyncTransactionTimer);\n this.asyncTransactionTimer = null;\n this.asyncTransactions = [];\n const resolvers = this.asyncTransactionResolvers;\n this.asyncTransactionResolvers = [];\n for (const resolve of resolvers) resolve();\n this.core.destroy();\n }\n\n isDestroyed(): boolean {\n return this.core.isDestroyed();\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { GridSize, OverlayTemplate, ResolvedGridOptions, ThemeMode } from \"../types/options\";\nimport type { PaneType } from \"../services/columnModel\";\nimport { el } from \"../lib/dom\";\n\nconst SIZE_CLASSES: GridSize[] = [\"compact\", \"normal\", \"large\"];\ntype SkeletonContext = Pick<GridCore<any>, \"options\" | \"relayout\" | \"reportError\">;\n\nexport class GridSkeleton {\n root!: HTMLElement;\n headerEl!: HTMLElement;\n bodyEl!: HTMLElement;\n pinnedTopEl!: HTMLElement;\n pinnedBottomEl!: HTMLElement;\n headerRows: Record<PaneType, HTMLElement[]> = { left: [], center: [], right: [] };\n headerRowContainers: Record<PaneType, HTMLElement> = {} as Record<PaneType, HTMLElement>;\n bodyViewports!: Record<PaneType, HTMLElement>;\n rowContainers!: Record<PaneType, HTMLElement>;\n\n private headerPanes!: Record<PaneType, HTMLElement>;\n private bodyPanes!: Record<PaneType, HTMLElement>;\n private overlayWrapper!: HTMLElement;\n private overlayContent!: HTMLElement;\n private infiniteLoadingEl!: HTMLElement;\n private infiniteLoadingText!: HTMLElement;\n private currentOverlay: \"loading\" | \"noRows\" | null = null;\n private currentOverlayContent: OverlayTemplate | null = null;\n private currentOverlayAllowsHtml = false;\n private overlayCleanup: (() => void) | null = null;\n private customClassTokens: string[] = [];\n private resizeObserver: ResizeObserver | null = null;\n private headerDepth = 1;\n\n constructor(private core: SkeletonContext) {}\n\n init(container: HTMLElement, options: ResolvedGridOptions): void {\n const classes = [\"mach-root\", `mach-size--${options.size}`];\n if (options.stripedRows) classes.push(\"mach-striped\");\n if (options.showCellBorders) classes.push(\"mach-cell-borders\");\n this.root = el(\"div\", classes.join(\" \"));\n this.setCustomClass(options.className);\n this.root.style.setProperty(\"--mach-row-h\", `${options.rowHeight}px`);\n this.root.style.setProperty(\"--mach-header-h\", `${options.headerHeight}px`);\n this.root.setAttribute(\"role\", \"grid\");\n this.root.tabIndex = 0;\n this.applyAriaLabels(options);\n\n this.headerEl = el(\"div\", \"mach-header\");\n this.headerEl.setAttribute(\"role\", \"rowgroup\");\n this.headerRows = { left: [], center: [], right: [] };\n this.headerPanes = {} as Record<PaneType, HTMLElement>;\n this.headerRowContainers = {} as Record<PaneType, HTMLElement>;\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const paneEl = el(\"div\", `mach-pane mach-pane--${pane} mach-header-pane`);\n const rowsContainer = el(\"div\", \"mach-header-rows\");\n if (pane === \"center\") {\n const viewport = el(\"div\", \"mach-header-viewport\");\n viewport.appendChild(rowsContainer);\n paneEl.appendChild(viewport);\n } else {\n paneEl.appendChild(rowsContainer);\n }\n this.headerEl.appendChild(paneEl);\n this.headerPanes[pane] = paneEl;\n this.headerRowContainers[pane] = rowsContainer;\n }\n\n this.setHeaderRowCount(1);\n\n this.bodyEl = el(\"div\", \"mach-body\");\n this.pinnedTopEl = el(\"div\", \"mach-pinned-rows mach-pinned-rows--top\");\n this.pinnedTopEl.style.display = \"none\";\n this.pinnedBottomEl = el(\"div\", \"mach-pinned-rows mach-pinned-rows--bottom\");\n this.pinnedBottomEl.style.display = \"none\";\n this.bodyViewports = {} as Record<PaneType, HTMLElement>;\n this.rowContainers = {} as Record<PaneType, HTMLElement>;\n this.bodyPanes = {} as Record<PaneType, HTMLElement>;\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const paneEl = el(\"div\", `mach-pane mach-pane--${pane} mach-body-pane`);\n const viewport = el(\"div\", `mach-body-viewport${pane === \"center\" ? \" mach-body-viewport--scroll\" : \"\"}`);\n const container = el(\"div\", \"mach-row-container\");\n viewport.appendChild(container);\n paneEl.appendChild(viewport);\n this.bodyEl.appendChild(paneEl);\n this.bodyPanes[pane] = paneEl;\n this.bodyViewports[pane] = viewport;\n this.rowContainers[pane] = container;\n }\n\n this.overlayWrapper = el(\"div\", \"mach-overlay\");\n this.overlayWrapper.style.display = \"none\";\n this.overlayWrapper.setAttribute(\"role\", \"status\");\n this.overlayWrapper.setAttribute(\"aria-live\", \"polite\");\n this.overlayContent = el(\"div\", \"mach-overlay-content\");\n this.overlayWrapper.appendChild(this.overlayContent);\n\n this.infiniteLoadingEl = el(\"div\", \"mach-infinite-loading\");\n this.infiniteLoadingEl.style.display = \"none\";\n this.infiniteLoadingEl.appendChild(el(\"div\", \"mach-spinner\"));\n this.infiniteLoadingText = el(\"span\");\n this.infiniteLoadingEl.appendChild(this.infiniteLoadingText);\n\n this.root.append(\n this.headerEl,\n this.pinnedTopEl,\n this.bodyEl,\n this.pinnedBottomEl,\n this.overlayWrapper,\n this.infiniteLoadingEl\n );\n container.appendChild(this.root);\n\n if (typeof ResizeObserver !== \"undefined\") {\n this.resizeObserver = new ResizeObserver(() => this.core.relayout());\n this.resizeObserver.observe(this.root);\n }\n\n this.applyTheme(options.theme);\n }\n\n applyAriaLabels(options: Pick<ResolvedGridOptions, \"ariaLabel\" | \"ariaLabelledBy\" | \"ariaDescribedBy\">): void {\n if (options.ariaLabelledBy) {\n this.root.setAttribute(\"aria-labelledby\", options.ariaLabelledBy);\n this.root.removeAttribute(\"aria-label\");\n } else {\n this.root.removeAttribute(\"aria-labelledby\");\n this.root.setAttribute(\"aria-label\", options.ariaLabel);\n }\n if (options.ariaDescribedBy) this.root.setAttribute(\"aria-describedby\", options.ariaDescribedBy);\n else this.root.removeAttribute(\"aria-describedby\");\n }\n\n setHeaderRowCount(depth: number): void {\n this.headerDepth = depth;\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const container = this.headerRowContainers[pane];\n const rows = this.headerRows[pane];\n while (rows.length < depth) {\n const row = el(\"div\", \"mach-header-row\");\n row.setAttribute(\"role\", \"row\");\n row.setAttribute(\"aria-rowindex\", String(rows.length + 1));\n row.style.top = `${rows.length * this.core.options.headerHeight}px`;\n row.style.height = `${this.core.options.headerHeight}px`;\n container.appendChild(row);\n rows.push(row);\n }\n while (rows.length > depth) {\n rows.pop()!.remove();\n }\n }\n this.applyHeaderHeight();\n }\n\n getHeaderRowCount(): number {\n return this.headerDepth;\n }\n\n private applyHeaderHeight(): void {\n this.headerEl.style.height = `${this.headerDepth * this.core.options.headerHeight}px`;\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const rows = this.headerRows[pane];\n rows.forEach((row, i) => {\n row.style.top = `${i * this.core.options.headerHeight}px`;\n row.style.height = `${this.core.options.headerHeight}px`;\n });\n }\n }\n\n setPaneWidths(left: number, right: number): void {\n this.applyPaneWidth(\"left\", left);\n this.applyPaneWidth(\"right\", right);\n }\n\n private applyPaneWidth(pane: PaneType, width: number): void {\n const hp = this.headerPanes[pane];\n const bp = this.bodyPanes[pane];\n hp.style.width = `${width}px`;\n bp.style.width = `${width}px`;\n const hidden = width <= 0;\n hp.classList.toggle(\"mach-pane--hidden\", hidden);\n bp.classList.toggle(\"mach-pane--hidden\", hidden);\n }\n\n measureViewportWidth(): number {\n return this.bodyViewports.center.clientWidth;\n }\n\n updateHeights(rowHeight: number, headerHeight: number): void {\n this.root.style.setProperty(\"--mach-row-h\", `${rowHeight}px`);\n this.root.style.setProperty(\"--mach-header-h\", `${headerHeight}px`);\n this.applyHeaderHeight();\n }\n\n applySize(size: GridSize): void {\n for (const s of SIZE_CLASSES) {\n this.root.classList.toggle(`mach-size--${s}`, s === size);\n }\n }\n\n private themeUnsub: (() => void) | null = null;\n\n applyTheme(theme: ThemeMode): void {\n if (!this.root) return;\n this.themeUnsub?.();\n this.themeUnsub = null;\n const dark = theme === \"dark\" || (theme === \"auto\" && this.systemPrefersDark());\n this.root.classList.toggle(\"mach-theme-dark\", dark);\n\n if (theme === \"auto\" && typeof window !== \"undefined\" && typeof window.matchMedia === \"function\") {\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handler = () => this.root.classList.toggle(\"mach-theme-dark\", mq.matches);\n if (typeof mq.addEventListener === \"function\") {\n mq.addEventListener(\"change\", handler);\n this.themeUnsub = () => mq.removeEventListener(\"change\", handler);\n } else if (typeof mq.addListener === \"function\") {\n mq.addListener(handler);\n this.themeUnsub = () => mq.removeListener(handler);\n }\n }\n }\n\n private systemPrefersDark(): boolean {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return false;\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n }\n\n setStriped(on: boolean): void {\n this.root.classList.toggle(\"mach-striped\", on);\n }\n\n setCellBorders(on: boolean): void {\n this.root.classList.toggle(\"mach-cell-borders\", on);\n }\n\n setCustomClass(className: string | null | undefined): void {\n for (const token of this.customClassTokens) this.root.classList.remove(token);\n this.customClassTokens = [];\n for (const token of String(className ?? \"\").split(/\\s+/).filter(Boolean)) {\n if (this.root.classList.contains(token)) continue;\n this.root.classList.add(token);\n this.customClassTokens.push(token);\n }\n }\n\n showOverlay(type: \"loading\" | \"noRows\", content: OverlayTemplate, allowUnsafeHtml = false): void {\n if (\n this.currentOverlay === type &&\n this.currentOverlayContent === content &&\n this.currentOverlayAllowsHtml === allowUnsafeHtml\n ) return;\n this.currentOverlay = type;\n this.currentOverlayContent = content;\n this.currentOverlayAllowsHtml = allowUnsafeHtml;\n this.cleanupOverlayContent();\n this.overlayContent.replaceChildren();\n\n let resolved: import(\"../types/options\").OverlayContent;\n try {\n resolved = typeof content === \"function\" ? content() : content;\n } catch (error) {\n this.core.reportError(error, \"overlayTemplate\");\n resolved = \"\";\n }\n\n if (typeof resolved === \"object\" && resolved != null && \"el\" in resolved) {\n this.overlayContent.appendChild(resolved.el);\n this.overlayCleanup = resolved.destroy ?? null;\n } else if (resolved instanceof HTMLElement) {\n this.overlayContent.appendChild(resolved);\n } else if (resolved && allowUnsafeHtml) {\n this.overlayContent.innerHTML = resolved;\n } else if (resolved) {\n this.overlayContent.textContent = resolved;\n } else if (type === \"loading\") {\n const spinner = el(\"div\", \"mach-spinner\");\n spinner.setAttribute(\"aria-label\", \"loading\");\n this.overlayContent.appendChild(spinner);\n }\n this.overlayWrapper.style.display = \"\";\n this.root.setAttribute(\"aria-busy\", type === \"loading\" ? \"true\" : \"false\");\n }\n\n hideOverlay(): void {\n if (!this.currentOverlay) return;\n this.currentOverlay = null;\n this.currentOverlayContent = null;\n this.currentOverlayAllowsHtml = false;\n this.overlayWrapper.style.display = \"none\";\n this.cleanupOverlayContent();\n this.overlayContent.replaceChildren();\n this.root.setAttribute(\"aria-busy\", \"false\");\n }\n\n setInfiniteLoading(active: boolean, text: string): void {\n if (!this.infiniteLoadingEl) return;\n if (active) {\n if (this.infiniteLoadingText.textContent !== text) this.infiniteLoadingText.textContent = text;\n this.infiniteLoadingEl.style.display = \"\";\n this.root.setAttribute(\"aria-busy\", \"true\");\n } else {\n this.infiniteLoadingEl.style.display = \"none\";\n if (this.currentOverlay !== \"loading\") this.root.setAttribute(\"aria-busy\", \"false\");\n }\n }\n\n destroy(): void {\n this.themeUnsub?.();\n this.themeUnsub = null;\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.cleanupOverlayContent();\n this.root.remove();\n }\n\n private cleanupOverlayContent(): void {\n if (!this.overlayCleanup) return;\n const cleanup = this.overlayCleanup;\n this.overlayCleanup = null;\n try {\n cleanup();\n } catch (error) {\n this.core.reportError(error, \"overlayTemplate.destroy\");\n }\n }\n\n}\n","import type { ColumnFilter } from \"../types/colDef\";\n\nconst MATCH_LABELS: Record<string, string> = {\n contains: \"包含\",\n notContains: \"不包含\",\n equals: \"=\",\n notEquals: \"≠\",\n startsWith: \"开头\",\n endsWith: \"结尾\",\n blank: \"为空\",\n notBlank: \"非空\",\n lessThan: \"<\",\n lessThanOrEqual: \"≤\",\n greaterThan: \">\",\n greaterThanOrEqual: \"≥\",\n inRange: \"范围\"\n};\n\nexport function describeFilter(filter: ColumnFilter): string {\n if (!filter) return \"\";\n if (filter.type === \"set\") {\n const count = filter.values.length;\n return `已选 ${count} 项`;\n }\n const parts: string[] = [];\n for (const condition of filter.conditions) {\n const label = MATCH_LABELS[condition.match] ?? condition.match;\n const value = condition.value;\n const value2 = \"value2\" in condition ? condition.value2 : undefined;\n if (condition.match === \"blank\" || condition.match === \"notBlank\") {\n parts.push(label);\n } else if (condition.match === \"inRange\" && value != null) {\n parts.push(`${label} ${value}~${value2 ?? value}`);\n } else if (value != null && String(value) !== \"\") {\n parts.push(`${label} ${value}`);\n } else {\n parts.push(label);\n }\n }\n const operator = filter.operator === \"or\" ? \" 或 \" : \" 且 \";\n return parts.join(operator);\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"../services/column\";\nimport { ColumnGroup } from \"../services/columnGroup\";\nimport type { PaneType } from \"../services/columnModel\";\nimport { el, FILTER_ICON, SORT_ASC_ICON, SORT_DESC_ICON } from \"../lib/dom\";\nimport { describeFilter } from \"../lib/filterSummary\";\nimport { setHeaderDestroyer, takeHeaderDestroyer } from \"./runtimeState\";\n\ntype HeaderContext = Pick<\n GridCore<any>,\n | \"columnDragService\"\n | \"columnMenu\"\n | \"columnModel\"\n | \"cycleSort\"\n | \"emit\"\n | \"filterPopup\"\n | \"getApi\"\n | \"isDestroyed\"\n | \"moveColumn\"\n | \"options\"\n | \"relayoutColumns\"\n | \"reportError\"\n | \"resizeService\"\n | \"rowModel\"\n | \"selectionService\"\n | \"skeleton\"\n>;\n\ninterface HeaderCell {\n column: Column;\n el: HTMLElement;\n sortEl: HTMLElement;\n filterBtn?: HTMLButtonElement;\n filterTagEl?: HTMLElement;\n selectAllEl?: HTMLInputElement;\n}\n\ninterface GroupCell {\n group: ColumnGroup<any>;\n el: HTMLElement;\n}\n\ninterface PaneTree {\n column?: Column;\n group?: ColumnGroup<any>;\n level: number;\n children: PaneTree[];\n}\n\nexport class HeaderRenderer {\n private leafCells: HeaderCell[] = [];\n private groupCells: GroupCell[] = [];\n private paneTrees: Record<PaneType, PaneTree[]> = { left: [], center: [], right: [] };\n\n constructor(private core: HeaderContext) {}\n\n build(): void {\n for (const cell of this.leafCells) {\n const destroy = takeHeaderDestroyer(cell.el);\n if (destroy) {\n try {\n destroy();\n } catch (error) {\n this.core.reportError(error, \"headerComponent.destroy\", { colId: cell.column.id });\n }\n }\n }\n this.leafCells = [];\n this.groupCells = [];\n const depth = this.core.columnModel.getHeaderDepth();\n this.core.skeleton.setHeaderRowCount(depth);\n\n const paneOf = (col: Column): PaneType =>\n col.pinned === \"left\" ? \"left\" : col.pinned === \"right\" ? \"right\" : \"center\";\n\n const buildTree = (\n children: (ColumnGroup<any> | Column<any>)[],\n level: number,\n pane: PaneType\n ): PaneTree[] => {\n const out: PaneTree[] = [];\n for (const child of children) {\n if (child instanceof ColumnGroup) {\n const subtree = buildTree(child.children, level + 1, pane);\n if (subtree.length > 0) out.push({ group: child, level, children: subtree });\n } else {\n if (!child.hide && paneOf(child) === pane) {\n out.push({ column: child, level, children: [] });\n }\n }\n }\n return out;\n };\n\n const roots = this.core.columnModel.getRootChildren();\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n this.paneTrees[pane] = buildTree(roots, 0, pane);\n }\n\n const perRowHeight = this.core.options.headerHeight;\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const rows = this.core.skeleton.headerRows[pane];\n for (const row of rows) row.textContent = \"\";\n const appendCell = (tree: PaneTree) => {\n const row = rows[Math.min(tree.level, rows.length - 1)];\n if (tree.column) {\n const cell = this.createLeafCell(tree.column, depth - tree.level, perRowHeight);\n row.appendChild(cell.el);\n this.leafCells.push(cell);\n } else if (tree.group) {\n const cell = this.createGroupCell(tree.group);\n row.appendChild(cell);\n this.groupCells.push({ group: tree.group, el: cell });\n }\n for (const child of tree.children) appendCell(child);\n };\n for (const tree of this.paneTrees[pane]) appendCell(tree);\n }\n\n if (!this.core.options.suppressHeaderFocus) {\n this.leafCells.forEach((cell, index) => {\n cell.el.tabIndex = index === 0 ? 0 : -1;\n });\n }\n\n this.applyLayout();\n this.refreshSortIndicators();\n this.refreshFilterIcons();\n this.refreshSelectAllCheckbox();\n }\n\n private createLeafCell(column: Column, rowSpan: number, perRowHeight: number): HeaderCell {\n const colDef = column.colDef;\n const cellEl = el(\"div\", \"mach-header-cell mach-header-cell--leaf\");\n cellEl.dataset.colId = column.id;\n cellEl.setAttribute(\"role\", \"columnheader\");\n cellEl.style.height = `${rowSpan * perRowHeight}px`;\n\n if (typeof colDef.headerClass === \"string\") cellEl.classList.add(colDef.headerClass);\n else if (Array.isArray(colDef.headerClass)) cellEl.classList.add(...colDef.headerClass);\n if (colDef.headerTooltip) cellEl.setAttribute(\"title\", colDef.headerTooltip);\n\n const headerAlign = colDef.headerAlign ?? colDef.align;\n if (headerAlign === \"center\") cellEl.classList.add(\"mach-header-cell--center\");\n else if (headerAlign === \"right\") cellEl.classList.add(\"mach-header-cell--right\");\n\n if (!this.core.options.suppressHeaderFocus) {\n cellEl.tabIndex = -1;\n cellEl.addEventListener(\"mousedown\", () => this.focusHeaderCell(column));\n cellEl.addEventListener(\"keydown\", (e: KeyboardEvent) => this.onHeaderKeyDown(e, column));\n }\n\n let selectAllEl: HTMLInputElement | undefined;\n if (column.hasCheckbox && this.core.options.rowSelection === \"multiple\") {\n selectAllEl = document.createElement(\"input\");\n selectAllEl.type = \"checkbox\";\n selectAllEl.className = \"mach-select-all\";\n selectAllEl.setAttribute(\"aria-label\", \"select all rows\");\n selectAllEl.addEventListener(\"click\", (e) => e.stopPropagation());\n selectAllEl.addEventListener(\"change\", () => {\n if (selectAllEl!.checked) this.core.selectionService.selectAll(true);\n else this.core.selectionService.deselectAll();\n });\n cellEl.appendChild(selectAllEl);\n }\n\n const headerComponent = colDef.headerComponent;\n if (headerComponent) {\n let out: string | HTMLElement | { el: HTMLElement; destroy?: () => void } | null | undefined;\n try {\n out = headerComponent({ colDef, column, api: this.core.getApi() });\n } catch (err) {\n this.core.reportError(err, \"headerComponent\", { colId: column.id });\n out = null;\n }\n if (typeof out === \"string\") {\n const labelEl = el(\"span\", \"mach-header-label\");\n labelEl.textContent = out;\n cellEl.appendChild(labelEl);\n } else if (out instanceof HTMLElement) {\n const wrapper = el(\"span\", \"mach-header-label mach-header-label--custom\");\n wrapper.appendChild(out);\n cellEl.appendChild(wrapper);\n } else if (out && typeof out === \"object\" && out.el instanceof HTMLElement) {\n const wrapper = el(\"span\", \"mach-header-label mach-header-label--custom\");\n wrapper.appendChild(out.el);\n cellEl.appendChild(wrapper);\n setHeaderDestroyer(cellEl, out.destroy);\n } else {\n const labelEl = el(\"span\", \"mach-header-label\");\n labelEl.textContent = colDef.headerName ?? colDef.field ?? column.id;\n cellEl.appendChild(labelEl);\n }\n } else {\n const labelEl = el(\"span\", \"mach-header-label\");\n labelEl.textContent = colDef.headerName ?? colDef.field ?? column.id;\n cellEl.appendChild(labelEl);\n }\n\n const sortEl = el(\"span\", \"mach-sort-indicator\");\n cellEl.appendChild(sortEl);\n\n let filterBtn: HTMLButtonElement | undefined;\n let filterTagEl: HTMLElement | undefined;\n if (column.filterable) {\n filterBtn = document.createElement(\"button\");\n filterBtn.type = \"button\";\n filterBtn.className = \"mach-filter-btn\";\n filterBtn.setAttribute(\"aria-label\", `filter ${column.id}`);\n filterBtn.innerHTML = FILTER_ICON;\n filterBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.core.filterPopup.toggle(column, filterBtn!);\n });\n cellEl.appendChild(filterBtn);\n filterTagEl = el(\"span\", \"mach-filter-tag\");\n cellEl.appendChild(filterTagEl);\n }\n\n if (this.core.options.columnMenu) {\n const menuBtn = document.createElement(\"button\");\n menuBtn.type = \"button\";\n menuBtn.className = \"mach-menu-btn\";\n menuBtn.setAttribute(\"aria-label\", \"column menu\");\n menuBtn.textContent = \"⋯\";\n menuBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.core.columnMenu.toggle(column, menuBtn);\n });\n cellEl.appendChild(menuBtn);\n }\n\n if (column.resizable) {\n const resizeEl = el(\"div\", \"mach-header-resize\");\n resizeEl.addEventListener(\"pointerdown\", (e) => {\n if (e.button !== 0) return;\n e.preventDefault();\n e.stopPropagation();\n this.core.resizeService.startResize(e, column);\n });\n resizeEl.addEventListener(\"dblclick\", (e) => {\n e.stopPropagation();\n this.core.getApi().autoSizeColumn(column.id);\n });\n resizeEl.addEventListener(\"click\", (e) => e.stopPropagation());\n cellEl.appendChild(resizeEl);\n }\n\n cellEl.addEventListener(\"click\", (e) => {\n if (this.core.columnDragService.didDrag()) return;\n const target = e.target as HTMLElement;\n if (target.closest(\".mach-header-resize, .mach-filter-btn, .mach-select-all\")) return;\n if (column.sortable) this.core.cycleSort(column, e.shiftKey);\n });\n\n cellEl.addEventListener(\"pointerdown\", (e) => {\n if (e.button !== 0) return;\n const target = e.target as HTMLElement;\n if (target.closest(\".mach-header-resize, .mach-filter-btn, .mach-select-all\")) return;\n this.core.columnDragService.onPointerDown(e, column);\n });\n\n return { column, el: cellEl, sortEl, filterBtn, filterTagEl, selectAllEl };\n }\n\n private createGroupCell(group: ColumnGroup<any>): HTMLElement {\n const cellEl = el(\"div\", \"mach-header-cell mach-header-cell--group\");\n if (group.groupId) cellEl.dataset.groupId = group.groupId;\n cellEl.setAttribute(\"role\", \"columnheader\");\n const def = group.def;\n if (typeof def.headerClass === \"string\") cellEl.classList.add(def.headerClass);\n else if (Array.isArray(def.headerClass)) cellEl.classList.add(...def.headerClass);\n const labelEl = el(\"span\", \"mach-header-label mach-header-label--group\");\n labelEl.textContent = group.headerName;\n cellEl.appendChild(labelEl);\n return cellEl;\n }\n\n applyLayout(): void {\n let flatIndex = 1;\n const widths: Record<PaneType, number> = { left: 0, center: 0, right: 0 };\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const rows = this.core.skeleton.headerRows[pane];\n let x = 0;\n const leafLefts = new Map<string, number>();\n for (const cell of this.leafCells) {\n if (this.core.columnModel.paneOf(cell.column) !== pane) continue;\n leafLefts.set(cell.column.id, x);\n x += cell.column.currentWidth;\n }\n const perRowHeight = this.core.options.headerHeight;\n for (const cell of this.leafCells) {\n if (this.core.columnModel.paneOf(cell.column) !== pane) continue;\n const left = leafLefts.get(cell.column.id) ?? 0;\n cell.el.style.width = `${cell.column.currentWidth}px`;\n cell.el.style.left = `${left}px`;\n cell.el.setAttribute(\"aria-colindex\", String(flatIndex++));\n }\n\n for (const gc of this.groupCells) {\n const leaves = this.visiblePaneLeaves(gc.group, pane);\n if (leaves.length === 0) continue;\n const left = leafLefts.get(leaves[0].id) ?? 0;\n let width = 0;\n for (const leaf of leaves) width += leaf.currentWidth;\n gc.el.style.left = `${left}px`;\n gc.el.style.width = `${width}px`;\n gc.el.style.height = `${perRowHeight}px`;\n gc.el.setAttribute(\"aria-colspan\", String(leaves.length));\n }\n\n for (const row of rows) row.style.width = `${x}px`;\n widths[pane] = x;\n }\n this.core.skeleton.setPaneWidths(widths.left, widths.right);\n }\n\n private visiblePaneLeaves(group: ColumnGroup<any>, pane: PaneType): Column[] {\n return group\n .getLeafColumns()\n .filter((c) => !c.hide && this.core.columnModel.paneOf(c) === pane);\n }\n\n private onHeaderKeyDown(e: KeyboardEvent, column: Column): void {\n if (this.core.isDestroyed()) return;\n const resize = (delta: number): void => {\n const next = Math.max(\n column.colDef.minWidth ?? 40,\n column.currentWidth + delta\n );\n this.core.columnModel.setColumnWidth(column, next);\n this.core.relayoutColumns();\n this.core.emit(\"columnResized\", { colId: column.id, width: column.currentWidth, finished: true });\n e.preventDefault();\n };\n\n switch (true) {\n case e.key === \"Enter\" || e.key === \" \":\n if ((e.target as HTMLElement).closest(\".mach-header-resize, .mach-filter-btn, .mach-select-all\")) return;\n e.preventDefault();\n if (column.sortable) this.core.cycleSort(column, e.shiftKey);\n return;\n case e.altKey && (e.key === \"ArrowRight\" || e.key === \"ArrowLeft\"):\n if (!column.resizable) return;\n resize(e.key === \"ArrowRight\" ? 24 : -24);\n return;\n case e.ctrlKey && (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\"):\n if (!column.movable) return;\n e.preventDefault(); {\n const pane = this.core.columnModel.paneOf(column);\n const siblings = this.core.columnModel.getPaneColumns(pane);\n const from = siblings.indexOf(column);\n const to = e.key === \"ArrowRight\" ? Math.min(siblings.length - 1, from + 1) : Math.max(0, from - 1);\n if (to !== from) this.core.moveColumn(column.id, to);\n }\n return;\n case !e.altKey && !e.ctrlKey && !e.metaKey && (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\"):\n e.preventDefault(); {\n const current = this.leafCells.findIndex((cell) => cell.column.id === column.id);\n const next = e.key === \"ArrowRight\"\n ? Math.min(this.leafCells.length - 1, current + 1)\n : Math.max(0, current - 1);\n if (current >= 0) this.focusHeaderCell(this.leafCells[next].column);\n }\n return;\n case e.key === \"Home\" || e.key === \"End\":\n e.preventDefault();\n if (this.leafCells.length > 0) {\n this.focusHeaderCell(e.key === \"Home\" ? this.leafCells[0].column : this.leafCells[this.leafCells.length - 1].column);\n }\n return;\n }\n }\n\n private focusHeaderCell(column: Column): void {\n const target = this.leafCells.find((cell) => cell.column.id === column.id);\n if (!target) return;\n for (const cell of this.leafCells) cell.el.tabIndex = cell === target ? 0 : -1;\n target.el.focus({ preventScroll: true });\n }\n\n refreshSortIndicators(): void {\n const model = this.core.columnModel.getSortModel();\n const multi = model.length > 1;\n for (const hc of this.leafCells) {\n const idx = model.findIndex((s) => s.colId === hc.column.id);\n if (idx >= 0) {\n const dir = model[idx].direction;\n const badge = multi ? `<span class=\"mach-sort-badge\">${idx + 1}</span>` : \"\";\n hc.sortEl.innerHTML = (dir === \"asc\" ? SORT_ASC_ICON : SORT_DESC_ICON) + badge;\n hc.el.setAttribute(\"aria-sort\", dir === \"asc\" ? \"ascending\" : \"descending\");\n hc.el.classList.add(\"mach-header-cell--sorted\");\n } else {\n hc.sortEl.innerHTML = \"\";\n hc.el.removeAttribute(\"aria-sort\");\n hc.el.classList.remove(\"mach-header-cell--sorted\");\n }\n }\n }\n\n refreshFilterIcons(): void {\n const fm = this.core.rowModel.getFilterModel();\n for (const hc of this.leafCells) {\n if (!hc.filterBtn) continue;\n const filter = fm[hc.column.id];\n const active = filter != null;\n hc.filterBtn.classList.toggle(\"mach-filter-btn--active\", active);\n if (hc.filterTagEl) {\n const summary = active ? describeFilter(filter) : \"\";\n hc.filterTagEl.style.display = summary ? \"\" : \"none\";\n if (summary) hc.filterTagEl.textContent = summary;\n }\n }\n }\n\n refreshSelectAllCheckbox(): void {\n for (const hc of this.leafCells) {\n if (!hc.selectAllEl) continue;\n hc.selectAllEl.checked = this.core.selectionService.isSelectAllActive();\n hc.selectAllEl.indeterminate = this.core.selectionService.isSelectAllIndeterminate();\n }\n }\n\n destroy(): void {\n for (const cell of this.leafCells) {\n const destroy = takeHeaderDestroyer(cell.el);\n if (!destroy) continue;\n try {\n destroy();\n } catch (error) {\n console.error(\"[mach-table] headerComponent destroy error\", error);\n }\n }\n this.leafCells = [];\n this.groupCells = [];\n }\n}\n","export interface GridPoint {\n row: number;\n colIdx: number;\n}\n\nexport interface NormalizedRange {\n r1: number;\n c1: number;\n r2: number;\n c2: number;\n}\n\n/** Pure state model for range selection; DOM painting stays in BodyRenderer. */\nexport class RangeSelectionModel {\n private anchor: GridPoint | null = null;\n private end: GridPoint | null = null;\n private cache: NormalizedRange | null | false = false;\n private cacheRowCount = -1;\n private cacheColCount = -1;\n\n getAnchor(): GridPoint | null {\n return this.anchor;\n }\n\n getEnd(): GridPoint | null {\n return this.end;\n }\n\n hasAnchor(): boolean {\n return this.anchor != null;\n }\n\n start(point: GridPoint, extend: boolean): void {\n if (!extend || !this.anchor) this.anchor = { ...point };\n this.end = { ...point };\n this.invalidate();\n }\n\n ensureAnchor(point: GridPoint): boolean {\n if (this.anchor) return true;\n if (point.colIdx < 0) return false;\n this.anchor = { ...point };\n this.invalidate();\n return true;\n }\n\n setEnd(point: GridPoint): void {\n this.end = { ...point };\n this.invalidate();\n }\n\n clear(): void {\n this.anchor = null;\n this.end = null;\n this.invalidate();\n }\n\n invalidate(): void {\n this.cache = false;\n this.cacheRowCount = -1;\n this.cacheColCount = -1;\n }\n\n normalize(rowCount: number, colCount: number): NormalizedRange | null {\n if (\n this.cache !== false &&\n this.cacheRowCount === rowCount &&\n this.cacheColCount === colCount\n ) return this.cache;\n this.cacheRowCount = rowCount;\n this.cacheColCount = colCount;\n if (!this.anchor || !this.end || rowCount <= 0 || colCount <= 0) {\n this.cache = null;\n return null;\n }\n this.cache = {\n r1: Math.max(0, Math.min(this.anchor.row, this.end.row, rowCount - 1)),\n r2: Math.max(0, Math.min(Math.max(this.anchor.row, this.end.row), rowCount - 1)),\n c1: Math.max(0, Math.min(this.anchor.colIdx, this.end.colIdx, colCount - 1)),\n c2: Math.max(0, Math.min(Math.max(this.anchor.colIdx, this.end.colIdx), colCount - 1))\n };\n return this.cache;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport { el } from \"../lib/dom\";\nimport type { RowNode } from \"../types/row\";\n\ntype RowDragContext = Pick<GridCore<any>, \"emit\" | \"options\" | \"rowModel\" | \"skeleton\">;\n\ninterface RowDragState {\n node: RowNode<any>;\n startY: number;\n indicator: HTMLElement;\n targetIndex: number;\n active: boolean;\n}\n\n/** Owns row-drag global listeners, indicator DOM and completion semantics. */\nexport class RowDragController {\n private state: RowDragState | null = null;\n\n constructor(\n private core: RowDragContext,\n private getPositions: () => Float64Array\n ) {}\n\n start(event: PointerEvent, node: RowNode<any>): void {\n this.destroy();\n const indicator = el(\"div\", \"mach-row-drop-indicator\");\n this.core.skeleton.rowContainers.center.appendChild(indicator);\n this.state = {\n node,\n startY: event.clientY,\n indicator,\n targetIndex: -1,\n active: false\n };\n window.addEventListener(\"pointermove\", this.onMove);\n window.addEventListener(\"pointerup\", this.onUp);\n window.addEventListener(\"pointercancel\", this.onUp);\n }\n\n private onMove = (event: PointerEvent): void => {\n const drag = this.state;\n if (!drag) return;\n if (!drag.active) {\n if (Math.abs(event.clientY - drag.startY) < 5) return;\n drag.active = true;\n this.core.skeleton.root.classList.add(\"mach-root--row-dragging\");\n }\n\n const container = this.core.skeleton.rowContainers.center;\n const y = event.clientY - container.getBoundingClientRect().top;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const positions = this.getPositions();\n let targetIndex = rowCount;\n let indicatorY = positions[rowCount] ?? 0;\n for (let index = 0; index < rowCount; index++) {\n const node = this.core.rowModel.getDisplayedRow(index);\n if (!node || node.isDetail || node.isGroup) continue;\n const top = positions[index];\n const bottom = positions[index + 1];\n if (y < top + (bottom - top) / 2) {\n targetIndex = index;\n indicatorY = top;\n break;\n }\n }\n drag.targetIndex = targetIndex;\n drag.indicator.style.top = `${indicatorY}px`;\n };\n\n private onUp = (): void => {\n const drag = this.takeState();\n if (!drag || !drag.active || drag.targetIndex < 0) return;\n const from = drag.node.rowIndex;\n const to = Math.max(0, Math.min(drag.targetIndex, this.core.rowModel.getDisplayedRowCount()));\n if (from === to || from === to - 1) return;\n this.core.emit(\"rowDragEnd\", { rowNode: drag.node, fromIndex: from, toIndex: to });\n if (this.core.options.applyRowDrag && !this.core.rowModel.isTree) {\n this.core.rowModel.reorderRowsByDisplayed(from, to > from ? to - 1 : to);\n }\n };\n\n private takeState(): RowDragState | null {\n const drag = this.state;\n this.state = null;\n this.detachListeners();\n drag?.indicator.remove();\n return drag;\n }\n\n private detachListeners(): void {\n window.removeEventListener(\"pointermove\", this.onMove);\n window.removeEventListener(\"pointerup\", this.onUp);\n window.removeEventListener(\"pointercancel\", this.onUp);\n this.core.skeleton.root.classList.remove(\"mach-root--row-dragging\");\n }\n\n destroy(): void {\n this.takeState();\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { PaneType } from \"../services/columnModel\";\nimport type { Column } from \"../services/column\";\nimport { hasColumnType } from \"../core/resolveOptions\";\nimport type { RowNode } from \"../types/row\";\nimport { RangeSelectionModel, type NormalizedRange } from \"../services/rangeSelectionModel\";\nimport { RowDragController } from \"../services/rowDragController\";\nimport { el, clamp } from \"../lib/dom\";\nimport { renderCellContent, cleanupCellContent, applyCellClasses, applyCellStyle, formatCellValue, formatCellValueWith, defaultFormat } from \"./cellContent\";\nimport {\n getCellRuntimeState,\n setDetailDestroyer,\n takeDetailDestroyer\n} from \"./runtimeState\";\n\nconst PANES: PaneType[] = [\"left\", \"center\", \"right\"];\ntype BodyContext = Pick<\n GridCore<any>,\n | \"buildDefaultEmptyState\"\n | \"columnModel\"\n | \"contextMenuService\"\n | \"editingService\"\n | \"emit\"\n | \"getApi\"\n | \"getCellValue\"\n | \"gridId\"\n | \"isDestroyed\"\n | \"options\"\n | \"pinnedRowsRenderer\"\n | \"reportError\"\n | \"resolveCellRenderer\"\n | \"rowModel\"\n | \"selectionService\"\n | \"setCellValue\"\n | \"skeleton\"\n | \"summaryRenderer\"\n | \"toggleDetail\"\n | \"tooltipService\"\n | \"undoService\"\n>;\n\ninterface RowSlot {\n index: number;\n nodeId: string;\n kind: \"master\" | \"detail\";\n rows: Partial<Record<PaneType, HTMLElement>>;\n cells: Partial<Record<PaneType, HTMLElement[]>>;\n cellColIds: Partial<Record<PaneType, string[]>>;\n detailRow?: HTMLElement;\n}\n\nexport interface FocusedCell {\n rowIndex: number;\n colId: string;\n}\n\nfunction lowerBound(positions: Float64Array, y: number, count: number): number {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (positions[mid + 1] <= y) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\nexport class BodyRenderer {\n private pool: RowSlot[] = [];\n private poolSize = 0;\n private first = 0;\n private lastExcl = -1;\n private rafId = 0;\n private hoverIndex = -1;\n private positions = new Float64Array(1);\n private rangeSelection = new RangeSelectionModel();\n private rangeDragging = false;\n private colFirst = 0;\n private colLastExcl = Number.MAX_SAFE_INTEGER;\n focusedCell: FocusedCell | null = null;\n private rowDragController: RowDragController;\n\n constructor(private core: BodyContext) {\n this.rowDragController = new RowDragController(core, () => this.positions);\n }\n\n init(): void {\n const viewport = this.core.skeleton.bodyViewports.center;\n viewport.addEventListener(\"scroll\", this.onScroll, { passive: true });\n const body = this.core.skeleton.bodyEl;\n body.addEventListener(\"click\", this.onBodyClick);\n body.addEventListener(\"dblclick\", this.onBodyDblClick);\n body.addEventListener(\"contextmenu\", this.onContextMenu);\n body.addEventListener(\"mousedown\", this.onMouseDown);\n body.addEventListener(\"mouseover\", this.onMouseOver);\n body.addEventListener(\"mouseleave\", this.onMouseLeave);\n body.addEventListener(\"pointerdown\", this.onDragHandlePointerDown);\n window.addEventListener(\"mouseup\", this.onWindowMouseUp);\n }\n\n destroy(): void {\n cancelAnimationFrame(this.rafId);\n const viewport = this.core.skeleton.bodyViewports.center;\n viewport.removeEventListener(\"scroll\", this.onScroll);\n const body = this.core.skeleton.bodyEl;\n body.removeEventListener(\"click\", this.onBodyClick);\n body.removeEventListener(\"dblclick\", this.onBodyDblClick);\n body.removeEventListener(\"contextmenu\", this.onContextMenu);\n body.removeEventListener(\"mousedown\", this.onMouseDown);\n body.removeEventListener(\"mouseover\", this.onMouseOver);\n body.removeEventListener(\"mouseleave\", this.onMouseLeave);\n body.removeEventListener(\"pointerdown\", this.onDragHandlePointerDown);\n window.removeEventListener(\"mouseup\", this.onWindowMouseUp);\n this.cancelFillDrag();\n this.rowDragController.destroy();\n for (const slot of this.pool) {\n if (slot.detailRow) this.cleanupDetail(slot.detailRow);\n for (const pane of PANES) {\n for (const cell of slot.cells[pane] ?? []) {\n if (slot.index >= 0) this.core.editingService.releaseCell(slot.index, cell.dataset.colId ?? \"\", cell);\n cleanupCellContent(this.core, cell);\n }\n }\n }\n this.fillHandleEl?.remove();\n this.fillDragIndicator?.remove();\n }\n\n paneForColumn(column: Column): PaneType {\n return column.pinned === \"left\" ? \"left\" : column.pinned === \"right\" ? \"right\" : \"center\";\n }\n\n private onScroll = (): void => {\n if (this.rafId) return;\n this.rafId = requestAnimationFrame(() => {\n this.rafId = 0;\n this.syncScroll();\n });\n };\n\n syncScroll(): void {\n if (this.core.isDestroyed()) return;\n const sk = this.core.skeleton;\n const viewport = sk.bodyViewports.center;\n sk.headerRowContainers.center.style.transform = `translateX(${-viewport.scrollLeft}px)`;\n sk.rowContainers.left.style.transform = `translateY(${-viewport.scrollTop}px)`;\n sk.rowContainers.right.style.transform = `translateY(${-viewport.scrollTop}px)`;\n this.core.pinnedRowsRenderer.onScrollLeft(viewport.scrollLeft);\n this.core.tooltipService.hide();\n this.updateRange();\n this.core.rowModel.checkInfiniteScroll(this.lastExcl - 1);\n }\n\n private paneWidths(): Record<PaneType, number> {\n const widths: Record<PaneType, number> = { left: 0, center: 0, right: 0 };\n for (const pane of PANES) {\n widths[pane] = this.core.columnModel.getPaneColumns(pane).reduce((a, c) => a + c.currentWidth, 0);\n }\n return widths;\n }\n\n private positionsBuf = new Float64Array(new ArrayBuffer(64 * 8));\n private lastMinRowHeight = 0;\n private rowHeightCache = new WeakMap<RowNode<any>, number>();\n private pendingFlash: Array<[number, string]> = [];\n private measureCanvas: HTMLCanvasElement | null = null;\n\n applyContainerSizes(): void {\n const sk = this.core.skeleton;\n const widths = this.paneWidths();\n const viewport = sk.bodyViewports.center;\n const displayed = this.core.rowModel.getDisplayedRows();\n const rowCount = this.core.rowModel.getDisplayTotalCount();\n const positionedCount = Math.min(rowCount, displayed.length);\n const rowHeight = this.core.options.rowHeight;\n const detailHeight = this.core.options.detailRowHeight;\n const getRowHeight = this.core.options.getRowHeight;\n const api = this.core.getApi();\n\n if (this.positionsBuf.length < positionedCount + 1) {\n let cap = this.positionsBuf.length;\n while (cap < positionedCount + 1) cap *= 2;\n this.positionsBuf = new Float64Array(new ArrayBuffer(cap * 8));\n }\n const positions = this.positionsBuf;\n const autoHeightCols = this.core.options.masterDetail ? [] : this.collectAutoHeightColumns();\n let y = 0;\n let minH = rowHeight;\n for (let i = 0; i < positionedCount; i++) {\n positions[i] = y;\n const node = i < displayed.length ? displayed[i] : undefined;\n let h: number;\n if (node?.isDetail) {\n h = detailHeight;\n } else if (node && (getRowHeight || autoHeightCols.length > 0)) {\n const cached = this.rowHeightCache.get(node);\n if (cached !== undefined) {\n h = cached;\n } else {\n h = rowHeight;\n if (getRowHeight) {\n try {\n const requested = getRowHeight({ data: node.data, node, api });\n h = Number.isFinite(requested) ? Math.max(1, requested || rowHeight) : rowHeight;\n } catch (error) {\n this.core.reportError(error, \"getRowHeight\", { rowId: node.id });\n }\n }\n if (autoHeightCols.length > 0) {\n const measured = this.measureAutoHeight(node, autoHeightCols);\n if (measured > h) h = measured;\n }\n this.rowHeightCache.set(node, h);\n }\n if (h < minH) minH = h;\n } else {\n h = rowHeight;\n }\n y += h;\n }\n positions[positionedCount] = y;\n const totalHeight = y + Math.max(0, rowCount - positionedCount) * rowHeight;\n this.lastMinRowHeight = minH;\n this.positions = positions.subarray(0, positionedCount + 1);\n\n const centerAvailable = Math.max(0, viewport.clientWidth - widths.left - widths.right);\n const centerWidth = Math.max(widths.center, centerAvailable);\n\n for (const pane of PANES) {\n const container = sk.rowContainers[pane];\n container.style.height = `${totalHeight}px`;\n if (pane === \"center\") container.style.width = `${centerWidth}px`;\n }\n\n sk.root.setAttribute(\"aria-rowcount\", String(rowCount + sk.getHeaderRowCount()));\n }\n\n invalidateRowHeight(node: RowNode<any>): void {\n this.rowHeightCache.delete(node);\n }\n\n invalidateAllRowHeights(): void {\n this.rowHeightCache = new WeakMap();\n }\n\n private collectAutoHeightColumns(): Column[] {\n return this.core.columnModel.getOrderedVisible().filter((c) => c.colDef.autoHeight === true);\n }\n\n private get hasAnyAutoHeight(): boolean {\n return this.core.columnModel.getOrderedVisible().some((c) => c.colDef.autoHeight === true);\n }\n\n private measureAutoHeight(node: RowNode<any>, cols: Column[]): number {\n this.measureCanvas ??= document.createElement(\"canvas\");\n const ctx = this.measureCanvas.getContext(\"2d\");\n if (!ctx) return 0;\n const style = window.getComputedStyle(this.core.skeleton.root);\n const fontSize = parseFloat(style.fontSize) || 13;\n ctx.font = `${style.fontStyle} ${style.fontWeight} ${fontSize}px ${style.fontFamily}`;\n const padding = parseFloat(style.getPropertyValue(\"--mach-cell-padding\")) || 9;\n const lineHeight = Math.round(fontSize * 1.45);\n let maxLines = 1;\n\n for (const col of cols) {\n const text = formatCellValue(this.core, node, col);\n if (!text) continue;\n const availW = Math.max(10, col.currentWidth - padding * 2 - 2);\n let lines = 1;\n let w = 0;\n for (const ch of text) {\n const cw = ctx.measureText(ch).width;\n if (w > 0 && w + cw > availW) {\n lines++;\n w = cw;\n } else {\n w += cw;\n }\n if (lines >= 12) break;\n }\n if (lines > maxLines) maxLines = lines;\n }\n return maxLines * lineHeight + Math.round(padding * 0.9);\n }\n\n queueFlash(rowIndexes: number[], colIds: string[]): void {\n if (!this.core.options.flashCells) return;\n for (const rowIndex of rowIndexes) {\n for (const colId of colIds) this.pendingFlash.push([rowIndex, colId]);\n }\n }\n\n flushFlash(): void {\n if (this.pendingFlash.length === 0) return;\n const entries = this.pendingFlash;\n this.pendingFlash = [];\n for (const [rowIndex, colId] of entries) {\n const cell = this.getCellElement(rowIndex, colId);\n if (!cell) continue;\n cell.classList.remove(\"mach-cell--flash\");\n void cell.offsetWidth;\n cell.classList.add(\"mach-cell--flash\");\n const runtime = getCellRuntimeState(cell);\n const timer = runtime.flashTimer;\n if (timer) clearTimeout(timer);\n runtime.flashTimer = setTimeout(() => {\n cell.classList.remove(\"mach-cell--flash\");\n runtime.flashTimer = undefined;\n }, 800);\n }\n }\n\n relayout(): void {\n this.applyContainerSizes();\n const viewport = this.core.skeleton.bodyViewports.center;\n const rowHeight = this.core.options.rowHeight;\n let minRowHeight = rowHeight;\n if (this.core.options.masterDetail) {\n minRowHeight = Math.min(minRowHeight, this.core.options.detailRowHeight);\n }\n if (this.lastMinRowHeight > 0) {\n minRowHeight = Math.min(minRowHeight, this.lastMinRowHeight);\n }\n const visible = Math.ceil(viewport.clientHeight / Math.max(1, minRowHeight));\n const needed = visible + this.core.options.rowBuffer * 2 + 1;\n const colWindowChanged = this.computeColWindow();\n if (colWindowChanged) {\n for (const slot of this.pool) this.reconcilePaneCells(slot, \"center\");\n }\n if (needed > this.poolSize) this.growPool(needed);\n this.applyCellLayout();\n this.updateRange(true);\n this.refreshOverlays();\n }\n\n private growPool(needed: number): void {\n while (this.poolSize < needed) {\n const slot: RowSlot = { index: -1, nodeId: \"\", kind: \"master\", rows: {}, cells: {}, cellColIds: {} };\n const sk = this.core.skeleton;\n for (const pane of PANES) {\n const cols = this.core.columnModel.getPaneColumns(pane);\n if (cols.length === 0) continue;\n const row = el(\"div\", \"mach-row\");\n row.style.height = `${this.core.options.rowHeight}px`;\n row.setAttribute(\"role\", \"row\");\n row.style.display = \"none\";\n sk.rowContainers[pane].appendChild(row);\n slot.rows[pane] = row;\n slot.cells[pane] = [];\n slot.cellColIds[pane] = [];\n this.reconcilePaneCells(slot, pane);\n }\n if (this.core.options.masterDetail) {\n const detailRow = el(\"div\", \"mach-row mach-detail-row\");\n detailRow.style.height = `${this.core.options.detailRowHeight}px`;\n detailRow.setAttribute(\"role\", \"row\");\n detailRow.style.display = \"none\";\n sk.rowContainers.center.appendChild(detailRow);\n slot.detailRow = detailRow;\n }\n this.pool.push(slot);\n this.poolSize++;\n }\n }\n\n private activePaneColumns(pane: PaneType): Column[] {\n const cols = this.core.columnModel.getPaneColumns(pane);\n if (pane !== \"center\" || cols.length <= 20 || this.core.columnModel.hasColSpan()) return cols;\n return cols.slice(this.colFirst, this.colLastExcl);\n }\n\n private createCell(column: Column): HTMLElement {\n const cell = el(\"div\", \"mach-cell\");\n cell.dataset.colId = column.id;\n cell.setAttribute(\"role\", \"gridcell\");\n if (column.hasCheckbox) {\n const input = document.createElement(\"input\");\n input.type = this.core.options.rowSelection === \"single\" ? \"radio\" : \"checkbox\";\n input.className = \"mach-row-checkbox\";\n if (input.type === \"radio\") input.name = `mach-radio-${this.core.gridId}`;\n input.setAttribute(\"aria-label\", \"select row\");\n cell.appendChild(input);\n cell.classList.add(\"mach-cell--selection\");\n }\n return cell;\n }\n\n private reconcilePaneCells(slot: RowSlot, pane: PaneType): void {\n const row = slot.rows[pane];\n if (!row) return;\n const columns = this.activePaneColumns(pane);\n const existingCells = slot.cells[pane] ?? [];\n const existingIds = slot.cellColIds[pane] ?? [];\n if (existingIds.length === columns.length && existingIds.every((id, index) => id === columns[index].id)) return;\n\n const byId = new Map<string, HTMLElement>();\n existingIds.forEach((id, index) => byId.set(id, existingCells[index]));\n const nextCells: HTMLElement[] = [];\n const nextIds: string[] = [];\n for (const column of columns) {\n const cell = byId.get(column.id) ?? this.createCell(column);\n byId.delete(column.id);\n row.appendChild(cell);\n nextCells.push(cell);\n nextIds.push(column.id);\n }\n for (const cell of byId.values()) {\n if (slot.index >= 0) this.core.editingService.releaseCell(slot.index, cell.dataset.colId ?? \"\", cell);\n cleanupCellContent(this.core, cell);\n cell.remove();\n }\n slot.cells[pane] = nextCells;\n slot.cellColIds[pane] = nextIds;\n }\n\n rebuildPool(): void {\n this.treeColumnCache = undefined;\n this.invalidateRangeCache();\n for (const slot of this.pool) {\n if (slot.detailRow) this.cleanupDetail(slot.detailRow);\n for (const pane of PANES) {\n for (const cell of slot.cells[pane] ?? []) cleanupCellContent(this.core, cell);\n slot.rows[pane]?.remove();\n }\n slot.detailRow?.remove();\n }\n this.pool = [];\n this.poolSize = 0;\n this.first = 0;\n this.lastExcl = -1;\n this.relayout();\n }\n\n applyCellLayout(): void {\n const variableHeights =\n this.core.options.masterDetail ||\n this.core.options.getRowHeight != null ||\n this.hasAnyAutoHeight;\n for (const pane of PANES) {\n const allPaneCols = this.core.columnModel.getPaneColumns(pane);\n const cols = this.activePaneColumns(pane);\n let x = 0;\n const lefts: number[] = [];\n if (pane === \"center\" && cols.length > 0) {\n const first = allPaneCols.indexOf(cols[0]);\n for (let i = 0; i < first; i++) x += allPaneCols[i].currentWidth;\n }\n for (const col of cols) {\n lefts.push(x);\n x += col.currentWidth;\n }\n for (const slot of this.pool) {\n const cells = slot.cells[pane];\n const row = slot.rows[pane];\n if (!cells || !row) continue;\n if (!variableHeights) {\n row.style.height = `${this.core.options.rowHeight}px`;\n }\n for (let i = 0; i < cols.length && i < cells.length; i++) {\n cells[i].style.width = `${cols[i].currentWidth}px`;\n cells[i].style.left = `${lefts[i]}px`;\n cells[i].setAttribute(\"aria-colindex\", String(this.core.columnModel.getFlatIndex(cols[i].id) + 1));\n }\n }\n if (this.core.options.masterDetail) {\n for (const slot of this.pool) {\n slot.detailRow?.style.setProperty(\"--mach-detail-h\", `${this.core.options.detailRowHeight}px`);\n }\n }\n }\n }\n\n private computeColWindow(): boolean {\n const viewport = this.core.skeleton.bodyViewports.center;\n const cols = this.core.columnModel.getPaneColumns(\"center\");\n const prevFirst = this.colFirst;\n const prevLast = this.colLastExcl;\n let first = 0;\n let last = cols.length;\n\n if (cols.length > 20) {\n const width = viewport.clientWidth;\n let total = 0;\n for (const col of cols) total += col.currentWidth;\n if (width > 0 && total > width) {\n const scrollLeft = viewport.scrollLeft;\n let x = 0;\n for (let i = 0; i < cols.length; i++) {\n if (x + cols[i].currentWidth <= scrollLeft) first = i + 1;\n else break;\n x += cols[i].currentWidth;\n }\n let acc = x;\n for (let i = first; i < cols.length; i++) {\n acc += cols[i].currentWidth;\n if (acc >= scrollLeft + width) {\n last = i + 1;\n break;\n }\n }\n if (last > cols.length) last = cols.length;\n first = Math.max(0, first - 2);\n last = Math.min(cols.length, last + 2);\n }\n }\n\n this.colFirst = first;\n this.colLastExcl = last;\n return first !== prevFirst || last !== prevLast;\n }\n\n updateRange(force = false): void {\n const viewport = this.core.skeleton.bodyViewports.center;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const buffer = this.core.options.rowBuffer;\n const colWindowChanged = this.computeColWindow();\n if (colWindowChanged) {\n for (const slot of this.pool) this.reconcilePaneCells(slot, \"center\");\n this.applyCellLayout();\n }\n\n if (rowCount === 0) {\n for (const slot of this.pool) this.hideSlot(slot);\n this.first = 0;\n this.lastExcl = 0;\n return;\n }\n\n const scrollTop = viewport.scrollTop;\n const viewBottom = scrollTop + viewport.clientHeight;\n const firstVisible = lowerBound(this.positions, scrollTop, rowCount);\n let lastVisible = lowerBound(this.positions, viewBottom, rowCount) + 1;\n if (lastVisible > rowCount) lastVisible = rowCount;\n\n const first = clamp(firstVisible - buffer, 0, rowCount - 1);\n const lastExcl = clamp(lastVisible + buffer, 1, rowCount);\n\n if (!force && first === this.first && lastExcl === this.lastExcl) return;\n this.first = first;\n this.lastExcl = lastExcl;\n\n for (const slot of this.pool) {\n if (slot.index !== -1 && (slot.index < first || slot.index >= lastExcl)) {\n this.hideSlot(slot);\n }\n }\n\n for (let i = first; i < lastExcl; i++) {\n const node = this.core.rowModel.getDisplayedRow(i);\n const slot = this.pool[i % this.poolSize];\n if (!slot || !node) continue;\n if (!force && slot.index === i && slot.nodeId === node.id) {\n if (colWindowChanged && slot.kind === \"master\") {\n this.renderPaneCells(slot, node, \"center\");\n }\n continue;\n }\n this.assignSlot(slot, i);\n }\n }\n\n private hideSlot(slot: RowSlot): void {\n this.releaseSlotEditors(slot);\n if (this.focusedCell?.rowIndex === slot.index) {\n this.core.skeleton.root.removeAttribute(\"aria-activedescendant\");\n }\n slot.index = -1;\n slot.nodeId = \"\";\n slot.kind = \"master\";\n for (const pane of PANES) {\n const row = slot.rows[pane];\n if (row) row.style.display = \"none\";\n }\n if (slot.detailRow) {\n this.cleanupDetail(slot.detailRow);\n slot.detailRow.style.display = \"none\";\n }\n }\n\n private assignSlot(slot: RowSlot, index: number): void {\n if (slot.index >= 0 && slot.index !== index) this.releaseSlotEditors(slot);\n const node = this.core.rowModel.getDisplayedRow(index);\n if (!node) {\n this.hideSlot(slot);\n return;\n }\n slot.index = index;\n slot.nodeId = node.id;\n const y = this.positions[index];\n const h = this.positions[index + 1] - this.positions[index];\n\n if (node.isDetail) {\n slot.kind = \"detail\";\n for (const pane of PANES) {\n const row = slot.rows[pane];\n if (row) row.style.display = \"none\";\n }\n const detailRow = slot.detailRow;\n if (detailRow) {\n detailRow.style.display = \"\";\n detailRow.style.transform = `translateY(${y}px)`;\n detailRow.style.height = `${h}px`;\n detailRow.dataset.index = String(index);\n detailRow.setAttribute(\"aria-rowindex\", String(index + this.core.skeleton.getHeaderRowCount() + 1));\n this.renderDetailContent(detailRow, node);\n }\n return;\n }\n\n slot.kind = \"master\";\n if (slot.detailRow) slot.detailRow.style.display = \"none\";\n\n const isTreeRow = this.core.rowModel.isTree;\n const isGroupRow = node.isGroup === true;\n const hasTreeChildren = isTreeRow && this.core.rowModel.hasChildren(node.id);\n const isExpandable = isGroupRow || hasTreeChildren ||\n (this.core.options.masterDetail && this.core.rowModel.isRowExpandable(node));\n const expanded = isGroupRow\n ? this.core.rowModel.isGroupExpanded(node.id)\n : this.core.rowModel.isRowExpanded(node.id);\n const level = isGroupRow\n ? (node.groupLevel ?? 0) + 1\n : isTreeRow\n ? this.core.rowModel.getTreeDepth(node) + 1\n : null;\n\n for (const pane of PANES) {\n const row = slot.rows[pane];\n if (!row) continue;\n row.style.display = \"\";\n row.style.transform = `translateY(${y}px)`;\n row.style.height = `${h}px`;\n row.dataset.index = String(index);\n row.dataset.id = node.id;\n row.setAttribute(\"aria-rowindex\", String(index + this.core.skeleton.getHeaderRowCount() + 1));\n row.classList.toggle(\"mach-row--selected\", node.selected);\n row.classList.toggle(\"mach-row--hover\", this.hoverIndex === index && !this.core.options.suppressRowHoverHighlight);\n row.classList.toggle(\"mach-row--odd\", index % 2 === 1);\n row.setAttribute(\"aria-selected\", node.selected ? \"true\" : \"false\");\n if (isExpandable) row.setAttribute(\"aria-expanded\", expanded ? \"true\" : \"false\");\n else row.removeAttribute(\"aria-expanded\");\n if (level != null) row.setAttribute(\"aria-level\", String(level));\n else row.removeAttribute(\"aria-level\");\n\n this.renderPaneCells(slot, node, pane);\n }\n\n if (this.focusedCell && this.focusedCell.rowIndex === index) {\n this.applyFocusClass();\n }\n }\n\n private renderPaneCells(slot: RowSlot, node: RowNode<any>, pane: PaneType): void {\n const cols = this.activePaneColumns(pane);\n const cells = slot.cells[pane];\n if (!cells) return;\n const index = slot.index;\n const hasColSpan = pane === \"center\" && this.core.columnModel.hasColSpan();\n let coverage = 0;\n slot.rows[pane]?.classList.toggle(\"mach-row--editing\", this.core.editingService.isRowEditing(index));\n\n for (let i = 0; i < cols.length; i++) {\n const col = cols[i];\n const cell = cells[i];\n\n if (hasColSpan && coverage > 0) {\n coverage--;\n cleanupCellContent(this.core, cell);\n cell.setAttribute(\"aria-hidden\", \"true\");\n if (cell.style.display !== \"none\") cell.style.display = \"none\";\n continue;\n }\n\n if (cell.style.display === \"none\") cell.style.display = \"\";\n cell.removeAttribute(\"aria-hidden\");\n\n if (hasColSpan) {\n const span = this.resolveColSpan(node, col, index, cols.length - i);\n if (span > 1) {\n coverage = span - 1;\n this.applySpanWidth(cell, cols, i, span);\n } else {\n cell.removeAttribute(\"aria-colspan\");\n if (cell.style.width !== `${col.currentWidth}px`) cell.style.width = `${col.currentWidth}px`;\n }\n } else {\n cell.removeAttribute(\"aria-colspan\");\n }\n\n if (this.core.editingService.renderEditor(index, node, col, cell)) continue;\n this.renderCell(cell, node, col);\n this.applyRangeClass(cell, index, col);\n }\n }\n\n private resolveColSpan(node: RowNode<any>, column: Column, rowIndex: number, remaining: number): number {\n const fn = column.colDef.colSpan;\n if (!fn) return 1;\n try {\n const span = fn({\n api: this.core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value: this.core.getCellValue(node, column),\n rowIndex\n });\n return Math.max(1, Math.min(Math.round(span) || 1, remaining));\n } catch (error) {\n this.core.reportError(error, \"colSpan\", { colId: column.id, rowId: node.id });\n return 1;\n }\n }\n\n private applySpanWidth(cell: HTMLElement, cols: Column[], start: number, span: number): void {\n let w = 0;\n for (let i = start; i < start + span && i < cols.length; i++) w += cols[i].currentWidth;\n cell.style.width = `${w}px`;\n cell.setAttribute(\"aria-colspan\", String(span));\n }\n\n private renderDetailContent(row: HTMLElement, node: RowNode<any>): void {\n this.cleanupDetail(row);\n const master = node.masterId != null ? this.core.rowModel.getNodeById(node.masterId) : node;\n const container = el(\"div\", \"mach-detail\");\n row.appendChild(container);\n const renderer = this.core.options.detailRowRenderer;\n if (renderer) {\n const params = { data: node.data, node: master ?? node, api: this.core.getApi() };\n let out: string | HTMLElement | { el: HTMLElement; destroy?: () => void } | null | undefined;\n try {\n out = renderer(params);\n } catch (err) {\n this.core.reportError(err, \"detailRowRenderer\", { rowId: node.id });\n out = null;\n }\n if (typeof out === \"string\") {\n container.textContent = out;\n } else if (out instanceof HTMLElement) {\n container.appendChild(out);\n } else if (out && typeof out === \"object\" && out.el instanceof HTMLElement) {\n container.appendChild(out.el);\n setDetailDestroyer(row, out.destroy);\n }\n }\n }\n\n private cleanupDetail(row: HTMLElement): void {\n const destroy = takeDetailDestroyer(row);\n if (destroy) {\n try {\n destroy();\n } catch (err) {\n this.core.reportError(err, \"detailRowRenderer.destroy\");\n }\n }\n row.textContent = \"\";\n }\n\n private renderCell(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n cleanupCellContent(this.core, cell);\n cell.setAttribute(\"aria-readonly\", this.core.editingService.isEditable(node, column) ? \"false\" : \"true\");\n cell.removeAttribute(\"aria-expanded\");\n cell.removeAttribute(\"aria-level\");\n if (node.isGroup) {\n this.renderGroupCell(cell, node, column);\n return;\n }\n if (column.isDetailToggle) {\n const expanded = this.core.rowModel.isRowExpanded(node.id);\n const toggle = el(\"span\", `mach-detail-toggle${expanded ? \" mach-detail-toggle--open\" : \"\"}`);\n toggle.textContent = \"▶\";\n cell.replaceChildren(toggle);\n cell.classList.add(\"mach-cell--detail-toggle\");\n this.resetSpanStyle(cell);\n return;\n }\n if (column.hasCheckbox) {\n const input = cell.querySelector<HTMLInputElement>(\".mach-row-checkbox\");\n if (input) {\n input.checked = node.selected;\n input.indeterminate = this.core.selectionService.isIndeterminate(node.id);\n input.disabled = !this.core.selectionService.isSelectable(node);\n }\n if (cell.className !== \"mach-cell mach-cell--selection\") cell.className = \"mach-cell mach-cell--selection\";\n this.resetSpanStyle(cell);\n return;\n }\n if (column.colDef.rowDrag) {\n const handle = el(\"span\", \"mach-row-drag-handle\");\n handle.textContent = \"⠿\";\n cell.replaceChildren(handle);\n if (cell.className !== \"mach-cell mach-cell--drag\") cell.className = \"mach-cell mach-cell--drag\";\n this.resetSpanStyle(cell);\n return;\n }\n if (hasColumnType(column.colDef, \"index\") && !node.isDetail) {\n cell.textContent = String(this.core.rowModel.getRowSeq(node) + this.core.options.indexOffset);\n if (cell.className !== \"mach-cell mach-cell--index\") cell.className = \"mach-cell mach-cell--index\";\n this.applyCellSpanStyle(cell, node, column);\n return;\n }\n if (this.core.rowModel.isTree && this.getTreeColumn()?.id === column.id) {\n this.renderTreeCell(cell, node, column);\n return;\n }\n renderCellContent(this.core, cell, node, column);\n applyCellClasses(this.core, cell, node, column);\n applyCellStyle(this.core, cell, node, column);\n this.applyCellSpanStyle(cell, node, column);\n this.appendEditableIndicator(cell, node, column);\n }\n\n private appendEditableIndicator(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n if (\n this.core.options.editType !== \"cell\" ||\n this.core.options.editableIndicator === \"none\" ||\n !this.core.editingService.isEditable(node, column)\n ) return;\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = `mach-cell-edit-trigger mach-cell-edit-trigger--${this.core.options.editableIndicator}`;\n button.tabIndex = -1;\n button.title = \"Edit cell\";\n button.setAttribute(\"aria-label\", \"Edit cell\");\n button.innerHTML = '<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m10.8 2.7 2.5 2.5L5.5 13H3v-2.5z\"/><path d=\"m9.5 4 2.5 2.5\"/></svg>';\n button.addEventListener(\"mousedown\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n });\n button.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n this.setFocusedCell(node.rowIndex, column.id);\n this.core.editingService.start(node.rowIndex, column);\n });\n cell.appendChild(button);\n }\n\n private releaseSlotEditors(slot: RowSlot): void {\n if (slot.index < 0) return;\n for (const pane of PANES) {\n for (const cell of slot.cells[pane] ?? []) {\n this.core.editingService.releaseCell(slot.index, cell.dataset.colId ?? \"\", cell);\n }\n }\n }\n\n private treeColumnCache: Column | null | undefined;\n\n private getTreeColumn(): Column | null {\n if (this.treeColumnCache !== undefined) return this.treeColumnCache;\n this.treeColumnCache =\n this.core.columnModel.getOrderedVisible().find(\n (c) => !c.hasCheckbox && !c.isDetailToggle && !c.colDef.rowDrag && !hasColumnType(c.colDef, \"index\")\n ) ?? null;\n return this.treeColumnCache;\n }\n\n private renderTreeCell(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const expandable = this.core.rowModel.isRowExpandable(node);\n const depth = this.getNodeDepth(node);\n const indent = el(\"span\", \"mach-tree-indent\");\n indent.style.width = `${depth * 16}px`;\n const wrap = el(\"span\", \"mach-tree-cell\");\n wrap.appendChild(indent);\n if (expandable) {\n const expanded = this.core.rowModel.isRowExpanded(node.id);\n cell.setAttribute(\"aria-expanded\", expanded ? \"true\" : \"false\");\n cell.setAttribute(\"aria-level\", String(depth + 1));\n const stateClass = node.treeLoading\n ? \" mach-detail-toggle--loading\"\n : node.treeLoadError\n ? \" mach-detail-toggle--error\"\n : \"\";\n const toggle = el(\"span\", `mach-detail-toggle${expanded ? \" mach-detail-toggle--open\" : \"\"}${stateClass}`);\n if (node.treeLoadError) toggle.title = \"Retry loading children\";\n toggle.textContent = \"▶\";\n wrap.appendChild(toggle);\n } else {\n const spacer = el(\"span\", \"mach-tree-toggle-spacer\");\n wrap.appendChild(spacer);\n }\n const text = el(\"span\", \"mach-tree-text\");\n text.textContent = formatCellValueWith(this.core, node, column, this.core.getCellValue(node, column));\n wrap.appendChild(text);\n cell.replaceChildren(wrap);\n applyCellClasses(this.core, cell, node, column);\n }\n\n private getNodeDepth(node: RowNode<any>): number {\n return this.core.rowModel.getTreeDepth(node);\n }\n\n private resetSpanStyle(cell: HTMLElement): void {\n if (cell.style.height !== \"\") cell.style.height = \"\";\n if (cell.style.zIndex !== \"\") cell.style.zIndex = \"\";\n if (cell.style.display === \"none\") cell.style.display = \"\";\n cell.removeAttribute(\"aria-rowspan\");\n }\n\n private applyCellSpanStyle(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const spans = this.core.rowModel.getSpanInfo(column.id);\n if (!spans || node.isDetail) {\n this.resetSpanStyle(cell);\n return;\n }\n const idx = this.core.rowModel.getRowSeq(node) - 1;\n if (idx < 0 || idx >= spans.length) {\n this.resetSpanStyle(cell);\n return;\n }\n const value = spans[idx];\n if (value === -1) {\n cell.style.display = \"none\";\n cell.setAttribute(\"aria-hidden\", \"true\");\n return;\n }\n if (cell.style.display === \"none\") cell.style.display = \"\";\n cell.removeAttribute(\"aria-hidden\");\n if (value > 1) {\n const end = Math.min(idx + value, this.positions.length - 1);\n const height = this.positions[end] - this.positions[idx];\n cell.style.height = `${height > 0 ? height : value * this.core.options.rowHeight}px`;\n cell.style.zIndex = \"1\";\n cell.setAttribute(\"aria-rowspan\", String(value));\n } else {\n this.resetSpanStyle(cell);\n }\n }\n\n private renderGroupCell(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const base = \"mach-cell\";\n if (column.hasCheckbox) {\n const input = cell.querySelector<HTMLInputElement>(\".mach-row-checkbox\");\n if (input) {\n const state = this.core.selectionService.getGroupSelectionState(node);\n input.checked = state.all;\n input.indeterminate = state.some && !state.all;\n }\n if (cell.className !== `${base} mach-cell--selection`) cell.className = `${base} mach-cell--selection`;\n return;\n }\n if (column.isDetailToggle) {\n cell.textContent = \"\";\n if (cell.className !== base) cell.className = base;\n return;\n }\n const labelCol = this.core.columnModel.getGroupLabelColumn();\n if (labelCol && column.id === labelCol.id) {\n cell.setAttribute(\"aria-expanded\", this.core.rowModel.isGroupExpanded(node.id) ? \"true\" : \"false\");\n cell.setAttribute(\"aria-level\", String((node.groupLevel ?? 0) + 1));\n const wrap = el(\"span\", \"mach-group-label\");\n wrap.style.paddingLeft = `${(node.groupLevel ?? 0) * 16}px`;\n const toggle = el(\"span\", `mach-detail-toggle${this.core.rowModel.isGroupExpanded(node.id) ? \" mach-detail-toggle--open\" : \"\"}`);\n toggle.textContent = \"▶\";\n const text = el(\"span\", \"mach-group-text\");\n const groupCol = this.core.columnModel.getRowGroupColumns()[node.groupLevel ?? 0];\n const prefix = groupCol?.colDef.headerName ? `${groupCol.colDef.headerName}: ` : \"\";\n text.textContent = `${prefix}${node.groupKey ?? \"\"}`;\n const count = el(\"span\", \"mach-group-count\");\n count.textContent = `(${node.leafNodes?.length ?? 0})`;\n wrap.append(toggle, text, count);\n cell.replaceChildren(wrap);\n if (cell.className !== `${base} mach-cell--group`) cell.className = `${base} mach-cell--group`;\n return;\n }\n if (column.colDef.aggFunc && node.aggValues && Object.prototype.hasOwnProperty.call(node.aggValues, column.id)) {\n const value = node.aggValues[column.id];\n const formatted =\n column.colDef.valueFormatter != null\n ? formatCellValueWith(this.core, node, column, value)\n : defaultFormat(value);\n cell.textContent = formatted;\n if (cell.className !== `${base} mach-cell--num`) cell.className = `${base} mach-cell--num`;\n return;\n }\n cell.textContent = \"\";\n if (cell.className !== base) cell.className = base;\n }\n\n refreshRows(indexes: number[]): void {\n if (this.core.isDestroyed()) return;\n const seen = new Set<number>();\n for (const index of indexes) {\n if (index < 0 || seen.has(index)) continue;\n seen.add(index);\n const slot = this.pool[index % this.poolSize];\n if (!slot || slot.index !== index) continue;\n const node = this.core.rowModel.getDisplayedRow(index);\n if (!node) continue;\n if (slot.kind === \"detail\") {\n if (slot.detailRow) this.renderDetailContent(slot.detailRow, node);\n continue;\n }\n for (const pane of PANES) {\n const cells = slot.cells[pane];\n if (!cells) continue;\n this.renderPaneCells(slot, node, pane);\n }\n }\n this.applyFocusClass();\n this.flushFlash();\n }\n\n refreshAllCells(): void {\n if (this.core.isDestroyed()) return;\n for (const slot of this.pool) {\n if (slot.index < 0) continue;\n const node = this.core.rowModel.getDisplayedRow(slot.index);\n if (!node) continue;\n if (slot.kind === \"detail\") {\n if (slot.detailRow) this.renderDetailContent(slot.detailRow, node);\n continue;\n }\n for (const pane of PANES) {\n const cells = slot.cells[pane];\n if (!cells) continue;\n this.renderPaneCells(slot, node, pane);\n }\n }\n this.applyFocusClass();\n this.flushFlash();\n }\n\n onDataChanged(): void {\n if (this.core.isDestroyed()) return;\n if (this.focusedCell && this.focusedCell.rowIndex >= this.core.rowModel.getDisplayedRowCount()) {\n this.setFocusedCell(null, null);\n }\n this.invalidateRangeCache();\n this.applyContainerSizes();\n this.updateRange(true);\n this.updateFillHandle();\n this.refreshOverlays();\n this.core.summaryRenderer.refresh();\n }\n\n refreshOverlays(): void {\n const options = this.core.options;\n if (options.loading) {\n this.core.skeleton.showOverlay(\"loading\", options.overlayLoadingTemplate, options.allowUnsafeOverlayHtml);\n return;\n }\n if (this.core.rowModel.getDisplayedRowCount() === 0 && !options.suppressNoRowsOverlay) {\n const template = options.overlayNoRowsTemplate || this.core.buildDefaultEmptyState();\n this.core.skeleton.showOverlay(\"noRows\", template, options.allowUnsafeOverlayHtml);\n return;\n }\n this.core.skeleton.hideOverlay();\n }\n\n getCellElement(rowIndex: number, colId: string): HTMLElement | null {\n const column = this.core.columnModel.getColumn(colId);\n if (!column) return null;\n const pane = this.paneForColumn(column);\n const colIdx = this.pool[rowIndex % Math.max(1, this.poolSize)]?.cellColIds[pane]?.indexOf(column.id) ?? -1;\n if (colIdx < 0) return null;\n const slot = this.pool[rowIndex % this.poolSize];\n if (!slot || slot.index !== rowIndex || slot.kind !== \"master\") return null;\n return slot.cells[pane]?.[colIdx] ?? null;\n }\n\n private invalidateRangeCache(): void {\n this.rangeSelection.invalidate();\n }\n\n normalizedRange(): NormalizedRange | null {\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const colCount = this.core.columnModel.getOrderedVisible().length;\n return this.rangeSelection.normalize(rowCount, colCount);\n }\n\n getNormalizedRangeOrFocus(): NormalizedRange | null {\n const range = this.normalizedRange();\n if (range) return range;\n const focus = this.focusedCell;\n if (focus) {\n const ci = this.core.columnModel.getFlatIndex(focus.colId);\n if (ci >= 0) return { r1: focus.rowIndex, c1: ci, r2: focus.rowIndex, c2: ci };\n }\n return null;\n }\n\n getRangeSelection(): { row1: number; row2: number; colId1: string; colId2: string } | null {\n const range = this.normalizedRange();\n if (!range) return null;\n const flat = this.core.columnModel.getOrderedVisible();\n return {\n row1: range.r1,\n row2: range.r2,\n colId1: flat[range.c1]?.id ?? \"\",\n colId2: flat[range.c2]?.id ?? \"\"\n };\n }\n\n getPasteStart(): { row: number; colIdx: number } | null {\n const anchor = this.rangeSelection.getAnchor();\n if (anchor) {\n return { row: anchor.row, colIdx: anchor.colIdx };\n }\n const focus = this.getNormalizedRangeOrFocus();\n return focus ? { row: focus.r1, colIdx: focus.c1 } : null;\n }\n\n clearRangeSelection(): void {\n const old = this.normalizedRange();\n this.rangeSelection.clear();\n if (old) {\n this.refreshRowRange(old, null);\n this.updateFillHandle();\n this.core.emit(\"rangeSelectionChanged\", { range: null });\n }\n }\n\n private refreshRowRange(\n a: { r1: number; r2: number } | null,\n b: { r1: number; r2: number } | null\n ): void {\n const indexes: number[] = [];\n const collect = (r: { r1: number; r2: number } | null) => {\n if (!r) return;\n for (let i = r.r1; i <= r.r2; i++) indexes.push(i);\n };\n collect(a);\n collect(b);\n if (indexes.length > 0) this.refreshRows(indexes);\n }\n\n startRange(row: number, colIdx: number, extend: boolean): void {\n const old = this.normalizedRange();\n this.rangeSelection.start({ row, colIdx }, extend);\n const next = this.normalizedRange();\n this.refreshRowRange(old, next);\n this.updateFillHandle();\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n\n moveRangeEnd(row: number, colIdx: number): void {\n if (!this.rangeSelection.hasAnchor()) {\n const focus = this.focusedCell;\n if (!focus) return;\n const col = this.core.columnModel.getFlatIndex(focus.colId);\n if (!this.rangeSelection.ensureAnchor({ row: focus.rowIndex, colIdx: col })) return;\n }\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const colCount = this.core.columnModel.getOrderedVisible().length;\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({\n row: Math.max(0, Math.min(row, rowCount - 1)),\n colIdx: Math.max(0, Math.min(colIdx, colCount - 1))\n });\n const next = this.normalizedRange();\n this.refreshRowRange(old, next);\n this.updateFillHandle();\n const flat = this.core.columnModel.getOrderedVisible();\n const end = this.rangeSelection.getEnd();\n if (end && end.colIdx < flat.length) {\n this.setFocusedCell(end.row, flat[end.colIdx].id);\n }\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n\n private applyRangeClass(cell: HTMLElement, rowIndex: number, column: Column): void {\n const range = this.normalizedRange();\n if (!range) {\n if (cell.classList.contains(\"mach-cell--range\")) {\n cell.classList.remove(\"mach-cell--range\", \"mach-cell--range-top\", \"mach-cell--range-bottom\", \"mach-cell--range-left\", \"mach-cell--range-right\");\n }\n return;\n }\n const ci = this.core.columnModel.getFlatIndex(column.id);\n if (ci < 0) return;\n const inRange = rowIndex >= range.r1 && rowIndex <= range.r2 && ci >= range.c1 && ci <= range.c2;\n cell.classList.toggle(\"mach-cell--range\", inRange);\n if (inRange) {\n cell.classList.toggle(\"mach-cell--range-top\", rowIndex === range.r1);\n cell.classList.toggle(\"mach-cell--range-bottom\", rowIndex === range.r2);\n cell.classList.toggle(\"mach-cell--range-left\", ci === range.c1);\n cell.classList.toggle(\"mach-cell--range-right\", ci === range.c2);\n } else {\n cell.classList.remove(\"mach-cell--range-top\", \"mach-cell--range-bottom\", \"mach-cell--range-left\", \"mach-cell--range-right\");\n }\n }\n\n private fillHandleEl: HTMLElement | null = null;\n private fillDrag: {\n r1: number;\n r2: number;\n c1: number;\n c2: number;\n startX: number;\n startY: number;\n axis: \"h\" | \"v\" | null;\n active: boolean;\n } | null = null;\n private fillFromPointer = false;\n\n private ensureFillHandle(): HTMLElement {\n if (this.fillHandleEl) return this.fillHandleEl;\n const handle = el(\"div\", \"mach-fill-handle\");\n handle.style.display = \"none\";\n handle.addEventListener(\"pointerdown\", (e) => {\n this.fillFromPointer = true;\n this.onFillHandleDown(e);\n });\n handle.addEventListener(\"mousedown\", (e) => {\n if (this.fillFromPointer) return;\n this.onFillHandleDown(e);\n });\n this.core.skeleton.rowContainers.center.appendChild(handle);\n this.fillHandleEl = handle;\n return handle;\n }\n\n private updateFillHandle(): void {\n const handle = this.ensureFillHandle();\n const range = this.normalizedRange();\n if (\n !this.core.options.enableRangeSelection ||\n !this.core.options.fillHandle ||\n !range\n ) {\n handle.style.display = \"none\";\n return;\n }\n const cm = this.core.columnModel;\n const leftCount = cm.getPaneColumns(\"left\").length;\n const centerCols = cm.getPaneColumns(\"center\");\n if (range.c2 < leftCount || range.c2 >= leftCount + centerCols.length) {\n handle.style.display = \"none\";\n return;\n }\n const local = range.c2 - leftCount;\n let x = 0;\n for (let i = 0; i <= local && i < centerCols.length; i++) x += centerCols[i].currentWidth;\n const bottom = this.positions[Math.min(range.r2 + 1, this.positions.length - 1)] ?? (range.r2 + 1) * this.core.options.rowHeight;\n handle.style.display = \"\";\n handle.style.left = `${x - 4}px`;\n handle.style.top = `${bottom - 4}px`;\n }\n\n private onFillHandleDown(e: MouseEvent): void {\n if (this.core.isDestroyed() || e.button !== 0) return;\n const range = this.normalizedRange();\n if (!range) return;\n e.preventDefault();\n e.stopPropagation();\n this.fillDrag = {\n r1: range.r1,\n r2: range.r2,\n c1: range.c1,\n c2: range.c2,\n startX: e.clientX,\n startY: e.clientY,\n axis: null,\n active: false\n };\n window.addEventListener(\"pointermove\", this.onFillMove);\n window.addEventListener(\"mousemove\", this.onFillMove);\n window.addEventListener(\"pointerup\", this.onFillUp);\n window.addEventListener(\"mouseup\", this.onFillUp);\n window.addEventListener(\"pointercancel\", this.onFillUp);\n }\n\n private fillTargetRow(e: MouseEvent): number {\n const container = this.core.skeleton.rowContainers.center;\n const rect = container.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const row = lowerBound(this.positions, y, rowCount);\n return Math.max(this.fillDrag!.r2, Math.min(row, rowCount - 1));\n }\n\n private fillTargetCol(e: MouseEvent): number {\n const container = this.core.skeleton.rowContainers.center;\n const rect = container.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const cm = this.core.columnModel;\n const leftCount = cm.getPaneColumns(\"left\").length;\n const centerCols = cm.getPaneColumns(\"center\");\n let acc = 0;\n for (let i = 0; i < centerCols.length; i++) {\n if (x < acc + centerCols[i].currentWidth / 2) return leftCount + i;\n acc += centerCols[i].currentWidth;\n }\n return leftCount + centerCols.length - 1;\n }\n\n private fillDragIndicator: HTMLElement | null = null;\n\n private cancelFillDrag(): void {\n this.fillDrag = null;\n this.fillFromPointer = false;\n window.removeEventListener(\"pointermove\", this.onFillMove);\n window.removeEventListener(\"mousemove\", this.onFillMove);\n window.removeEventListener(\"pointerup\", this.onFillUp);\n window.removeEventListener(\"mouseup\", this.onFillUp);\n window.removeEventListener(\"pointercancel\", this.onFillUp);\n this.core.skeleton.root.classList.remove(\"mach-root--filling\");\n }\n\n private onFillMove = (e: Event): void => {\n const drag = this.fillDrag;\n if (!drag) return;\n const me = e as MouseEvent;\n if (typeof me.clientX !== \"number\") return;\n\n if (!drag.active) {\n const dx = Math.abs(me.clientX - drag.startX);\n const dy = Math.abs(me.clientY - drag.startY);\n if (dx < 4 && dy < 4) return;\n drag.active = true;\n drag.axis = dx >= dy ? \"h\" : \"v\";\n this.core.skeleton.root.classList.add(\"mach-root--filling\");\n }\n\n if (drag.axis === \"v\") {\n const target = this.fillTargetRow(me);\n const end = this.rangeSelection.getEnd();\n if (end && end.row !== target) {\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({ row: target, colIdx: end.colIdx });\n this.refreshRowRange(old, this.normalizedRange());\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n return;\n }\n\n const targetCol = Math.max(drag.c2 + 1, this.fillTargetCol(me));\n const end = this.rangeSelection.getEnd();\n if (end && end.colIdx !== targetCol) {\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({ row: end.row, colIdx: targetCol });\n this.refreshRowRange(old, this.normalizedRange());\n this.updateFillHandle();\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n };\n\n private fillHorizontal(\n r1: number,\n r2: number,\n c1: number,\n c2: number,\n targetEnd: number\n ): void {\n const flat = this.core.columnModel.getOrderedVisible();\n const changedRows = new Set<number>();\n this.core.undoService.beginBatch();\n try {\n for (let r = r1; r <= r2; r++) {\n const srcNode = this.core.rowModel.getDisplayedRow(r);\n if (!srcNode || srcNode.isDetail || srcNode.isGroup) continue;\n const sources: any[] = [];\n for (let c = c1; c <= c2; c++) {\n const col = flat[c];\n sources.push(col ? this.core.getCellValue(srcNode, col) : undefined);\n }\n const n = c2 - c1 + 1;\n const allNumeric =\n n > 1 && sources.every((v) => typeof v === \"number\" && !isNaN(v));\n const diff = allNumeric ? (sources[n - 1] - sources[0]) / (n - 1) : 0;\n const intPattern =\n !allNumeric || sources.every((v) => Number.isInteger(v));\n\n for (let t = c2 + 1; t <= targetEnd; t++) {\n const col = flat[t];\n if (!col || col.hasCheckbox || col.isDetailToggle || col.colDef.rowDrag) continue;\n if (!this.core.editingService.isEditable(srcNode, col)) continue;\n const colOffset = t - c1;\n let value: any;\n if (n === 1) {\n value = sources[0];\n } else if (allNumeric) {\n const steps = colOffset - (n - 1);\n value = sources[n - 1] + diff * steps;\n value = intPattern ? Math.round(value) : Math.round(value * 1e6) / 1e6;\n } else {\n value = sources[colOffset % n];\n }\n const old = this.core.getCellValue(srcNode, col);\n if (this.core.setCellValue(srcNode, col, value, old)) changedRows.add(r);\n }\n }\n } finally {\n this.core.undoService.endBatch();\n }\n\n if (changedRows.size > 0) {\n this.refreshRows([...changedRows]);\n this.core.summaryRenderer.refresh();\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n }\n\n private onFillUp = (e: Event): void => {\n const drag = this.fillDrag;\n if (!drag) return;\n const me = e as MouseEvent;\n\n const finish = (): void => {\n this.cancelFillDrag();\n };\n\n if (!drag.active) {\n finish();\n return;\n }\n\n if (drag.axis === \"h\") {\n const targetCol =\n typeof me.clientX === \"number\" ? Math.max(drag.c2 + 1, this.fillTargetCol(me)) : drag.c2 + 1;\n finish();\n if (targetCol > drag.c2) {\n this.fillHorizontal(drag.r1, drag.r2, drag.c1, drag.c2, targetCol);\n this.updateFillHandle();\n } else {\n const end = this.rangeSelection.getEnd();\n if (!end || end.colIdx === drag.c2) return;\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({ row: end.row, colIdx: drag.c2 });\n this.refreshRowRange(old, this.normalizedRange());\n }\n return;\n }\n\n const targetRow = typeof me.clientY === \"number\" ? this.fillTargetRow(me) : drag.r2;\n finish();\n if (targetRow > drag.r2) {\n this.fillValues(drag.r1, drag.r2, drag.c1, drag.c2, targetRow);\n this.updateFillHandle();\n } else {\n const end = this.rangeSelection.getEnd();\n if (!end || end.row === drag.r2) return;\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({ row: drag.r2, colIdx: end.colIdx });\n this.refreshRowRange(old, this.normalizedRange());\n }\n };\n\n private fillValues(r1: number, r2: number, c1: number, c2: number, targetEnd: number): void {\n const flat = this.core.columnModel.getOrderedVisible();\n const changedRows = new Set<number>();\n this.core.undoService.beginBatch();\n try {\n this.fillValuesInner(r1, r2, c1, c2, targetEnd, flat, changedRows);\n } finally {\n this.core.undoService.endBatch();\n }\n\n if (changedRows.size > 0) {\n this.refreshRows([...changedRows]);\n this.core.summaryRenderer.refresh();\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n }\n\n private fillValuesInner(\n r1: number,\n r2: number,\n c1: number,\n c2: number,\n targetEnd: number,\n flat: Column[],\n changedRows: Set<number>\n ): void {\n for (let c = c1; c <= c2; c++) {\n const col = flat[c];\n if (!col || col.hasCheckbox || col.isDetailToggle || col.colDef.rowDrag) continue;\n\n const sources: any[] = [];\n let allNumeric = r1 < r2;\n for (let r = r1; r <= r2; r++) {\n const node = this.core.rowModel.getDisplayedRow(r);\n if (!node) {\n allNumeric = false;\n sources.push(undefined);\n continue;\n }\n const v = this.core.getCellValue(node, col);\n sources.push(v);\n if (typeof v !== \"number\" || isNaN(v)) allNumeric = false;\n }\n if (sources[0] === undefined && sources.length === 1) continue;\n\n const n = r2 - r1 + 1;\n let diff = 0;\n let intPattern = true;\n if (allNumeric) {\n diff = (sources[n - 1] - sources[0]) / (n - 1);\n for (const v of sources) if (!Number.isInteger(v)) intPattern = false;\n }\n\n for (let r = r2 + 1; r <= targetEnd; r++) {\n const node = this.core.rowModel.getDisplayedRow(r);\n if (!node || node.isDetail || node.isGroup) continue;\n if (!this.core.editingService.isEditable(node, col)) continue;\n let value: any;\n if (n === 1) {\n value = sources[0];\n } else if (allNumeric) {\n const steps = r - r2;\n value = sources[n - 1] + diff * steps;\n value = intPattern ? Math.round(value) : Math.round(value * 1e6) / 1e6;\n } else {\n value = sources[(r - r1) % n];\n }\n const old = this.core.getCellValue(node, col);\n if (this.core.setCellValue(node, col, value, old)) changedRows.add(r);\n }\n }\n }\n\n setFocusedCell(rowIndex: number | null, colId: string | null): void {\n this.clearFocusClass();\n if (rowIndex == null || colId == null) {\n this.focusedCell = null;\n return;\n }\n this.focusedCell = { rowIndex, colId };\n this.applyFocusClass();\n this.ensureFocusedCellVisible();\n }\n\n private applyFocusClass(): void {\n if (!this.focusedCell) return;\n const cell = this.getCellElement(this.focusedCell.rowIndex, this.focusedCell.colId);\n if (cell) {\n const colIndex = Math.max(0, this.core.columnModel.getFlatIndex(this.focusedCell.colId));\n cell.id = `mach-grid-${this.core.gridId}-r${this.focusedCell.rowIndex}-c${colIndex}`;\n cell.classList.add(\"mach-cell--focus\");\n this.core.skeleton.root.setAttribute(\"aria-activedescendant\", cell.id);\n }\n }\n\n private clearFocusClass(): void {\n if (this.focusedCell) {\n const cell = this.getCellElement(this.focusedCell.rowIndex, this.focusedCell.colId);\n if (cell) {\n cell.classList.remove(\"mach-cell--focus\");\n cell.removeAttribute(\"id\");\n }\n }\n this.core.skeleton.root.removeAttribute(\"aria-activedescendant\");\n }\n\n private ensureFocusedCellVisible(): void {\n if (!this.focusedCell) return;\n this.scrollToIndex(this.focusedCell.rowIndex, \"nearest\");\n\n const column = this.core.columnModel.getColumn(this.focusedCell.colId);\n if (!column || column.pinned) return;\n const viewport = this.core.skeleton.bodyViewports.center;\n let x = 0;\n for (const col of this.core.columnModel.getPaneColumns(\"center\")) {\n if (col.id === column.id) break;\n x += col.currentWidth;\n }\n const left = viewport.scrollLeft;\n const width = viewport.clientWidth;\n if (x < left) viewport.scrollLeft = x;\n else if (x + column.currentWidth > left + width) {\n viewport.scrollLeft = x + column.currentWidth - width;\n }\n }\n\n scrollToIndex(rowIndex: number, position: \"top\" | \"bottom\" | \"middle\" | \"nearest\" = \"top\"): void {\n const viewport = this.core.skeleton.bodyViewports.center;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n if (rowCount === 0) return;\n const index = clamp(rowIndex, 0, rowCount - 1);\n const viewportHeight = viewport.clientHeight;\n const scrollTop = viewport.scrollTop;\n const rowTop = this.positions[index];\n const rowBottom = this.positions[index + 1];\n\n let target = scrollTop;\n if (position === \"top\") {\n target = rowTop;\n } else if (position === \"bottom\") {\n target = rowBottom - viewportHeight;\n } else if (position === \"middle\") {\n target = rowTop - (viewportHeight - (rowBottom - rowTop)) / 2;\n } else {\n if (rowTop < scrollTop) target = rowTop;\n else if (rowBottom > scrollTop + viewportHeight) target = rowBottom - viewportHeight;\n }\n\n const maxScroll = Math.max(0, this.positions[rowCount] - viewportHeight);\n viewport.scrollTop = clamp(target, 0, maxScroll);\n }\n\n private setHoverIndex(index: number): void {\n if (this.hoverIndex === index) return;\n const prev = this.hoverIndex;\n this.hoverIndex = index;\n this.toggleHover(prev, false);\n this.toggleHover(index, true);\n }\n\n private toggleHover(index: number, hover: boolean): void {\n if (index < 0) return;\n const slot = this.pool[index % this.poolSize];\n if (!slot || slot.index !== index || slot.kind !== \"master\") return;\n for (const pane of PANES) {\n slot.rows[pane]?.classList.toggle(\"mach-row--hover\", hover);\n }\n }\n\n focusGridRoot(): void {\n this.core.skeleton.root.focus({ preventScroll: true });\n }\n\n private resolveEventTarget(e: MouseEvent): { node: RowNode<any>; index: number; cellEl: HTMLElement | null } | null {\n const target = e.target as HTMLElement;\n const rowEl = target.closest<HTMLElement>(\".mach-row\");\n if (!rowEl) return null;\n const index = Number(rowEl.dataset.index);\n if (Number.isNaN(index)) return null;\n const node = this.core.rowModel.getDisplayedRow(index);\n if (!node) return null;\n const cellEl = target.closest<HTMLElement>(\".mach-cell\");\n return { node, index, cellEl };\n }\n\n private onBodyClick = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n const resolved = this.resolveEventTarget(e);\n if (!resolved) return;\n const { node, index, cellEl } = resolved;\n\n if (node.isGroup) {\n this.focusGridRoot();\n const checkbox = (e.target as HTMLElement).closest?.(\".mach-row-checkbox\");\n if (checkbox) {\n this.core.selectionService.setGroupSelected(node, !this.core.selectionService.getGroupSelectionState(node).all);\n return;\n }\n const labelCol = this.core.columnModel.getGroupLabelColumn();\n if (!labelCol || !cellEl || cellEl.dataset.colId === labelCol.id) {\n this.core.rowModel.toggleGroup(node.id);\n }\n return;\n }\n\n const target = e.target as HTMLElement;\n\n if (this.handleTreeToggleClick(target, node, cellEl)) return;\n\n const colId = cellEl?.dataset.colId ?? \"\";\n const column = colId ? this.core.columnModel.getColumn(colId) : undefined;\n\n if (column?.isDetailToggle && !node.isDetail) {\n this.focusGridRoot();\n this.core.toggleDetail(node.id);\n return;\n }\n\n if (node.isDetail) return;\n\n if (target.closest?.(\".mach-row-checkbox\")) {\n this.focusGridRoot();\n if (!this.core.options.suppressCellFocus) this.setFocusedCell(index, this.firstCheckboxColId());\n this.core.selectionService.onRowClick(node, e, true);\n return;\n }\n\n if (!cellEl || !column) return;\n\n this.focusGridRoot();\n if (!this.core.options.suppressCellFocus) this.setFocusedCell(index, colId);\n this.core.selectionService.onRowClick(node, e, false);\n\n const value = this.core.getCellValue(node, column);\n const event = this.core.emit(\"cellClicked\", {\n event: e,\n rowNode: node,\n rowIndex: index,\n column,\n colDef: column.colDef,\n value\n });\n column.colDef.onCellClick?.(event);\n this.core.emit(\"rowClicked\", { event: e, rowNode: node, rowIndex: index });\n\n const singleClick = this.core.options.singleClickEdit || column.colDef.singleClickEdit === true;\n if (singleClick && !node.isGroup && this.core.editingService.isEditable(node, column)) {\n this.core.editingService.start(index, column);\n }\n };\n\n private handleTreeToggleClick(target: HTMLElement, node: RowNode<any>, cell: HTMLElement | null): boolean {\n if (!this.core.rowModel.isTree || !target.closest(\".mach-detail-toggle\")) return false;\n const treeColumn = this.getTreeColumn();\n if (!treeColumn || cell?.dataset.colId !== treeColumn.id || !this.core.rowModel.isRowExpandable(node)) return false;\n this.focusGridRoot();\n if (node.treeLoadError) void this.core.rowModel.loadTreeChildren(node.id, true).catch(() => undefined);\n else this.core.rowModel.toggleDetail(node.id);\n return true;\n }\n\n private firstCheckboxColId(): string {\n for (const col of this.core.columnModel.getOrderedVisible()) {\n if (col.hasCheckbox) return col.id;\n }\n return this.core.columnModel.getOrderedVisible()[0]?.id ?? \"\";\n }\n\n private onBodyDblClick = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n const resolved = this.resolveEventTarget(e);\n if (!resolved) return;\n const { node, index, cellEl } = resolved;\n if (node.isDetail || node.isGroup || !cellEl) return;\n const colId = cellEl.dataset.colId ?? \"\";\n const column = this.core.columnModel.getColumn(colId);\n if (!column) return;\n\n const value = this.core.getCellValue(node, column);\n const event = this.core.emit(\"cellDoubleClicked\", {\n event: e,\n rowNode: node,\n rowIndex: index,\n column,\n colDef: column.colDef,\n value\n });\n column.colDef.onCellDoubleClick?.(event);\n this.core.emit(\"rowDoubleClicked\", { event: e, rowNode: node, rowIndex: index });\n\n if (this.core.editingService.isEditable(node, column)) {\n this.core.editingService.start(index, column);\n }\n };\n\n private onContextMenu = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n const resolved = this.resolveEventTarget(e);\n if (!resolved || resolved.node.isDetail || resolved.node.isGroup || !resolved.cellEl) return;\n const { node, index, cellEl } = resolved;\n const colId = cellEl.dataset.colId ?? \"\";\n const column = this.core.columnModel.getColumn(colId);\n if (!column) return;\n this.core.emit(\"cellContextMenu\", {\n event: e,\n rowNode: node,\n rowIndex: index,\n column,\n colDef: column.colDef,\n value: this.core.getCellValue(node, column)\n });\n if (this.core.options.contextMenu) {\n e.preventDefault();\n if (this.core.options.enableRangeSelection && !this.normalizedRange()) {\n const colIdx = this.core.columnModel.getFlatIndex(colId);\n if (colIdx >= 0) this.startRange(index, colIdx, false);\n }\n this.core.contextMenuService.open(e.clientX, e.clientY, { rowIndex: index, colId });\n }\n };\n\n private onMouseDown = (e: MouseEvent): void => {\n if (this.core.editingService.isCellEditing()) {\n this.core.editingService.stop(false);\n }\n if (this.core.options.enableRangeSelection && e.button === 0) {\n const resolved = this.resolveEventTarget(e);\n if (\n resolved &&\n !resolved.node.isDetail &&\n !resolved.node.isGroup &&\n resolved.cellEl &&\n !(e.target as HTMLElement).closest?.(\".mach-row-checkbox\")\n ) {\n const colIdx = this.core.columnModel.getFlatIndex(resolved.cellEl.dataset.colId ?? \"\");\n if (colIdx >= 0) {\n this.startRange(resolved.index, colIdx, e.shiftKey);\n this.rangeDragging = true;\n if (!e.shiftKey && !this.core.options.suppressCellFocus) {\n this.setFocusedCell(resolved.index, resolved.cellEl.dataset.colId ?? \"\");\n }\n }\n }\n }\n };\n\n private onWindowMouseUp = (): void => {\n this.rangeDragging = false;\n };\n\n private onMouseOver = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n const resolved = this.resolveEventTarget(e);\n if (this.rangeDragging) {\n if (resolved && !resolved.node.isDetail && !resolved.node.isGroup && resolved.cellEl) {\n const colIdx = this.core.columnModel.getFlatIndex(resolved.cellEl.dataset.colId ?? \"\");\n const end = this.rangeSelection.getEnd();\n if (colIdx >= 0 && end && (end.row !== resolved.index || end.colIdx !== colIdx)) {\n this.startRange(resolved.index, colIdx, true);\n }\n }\n }\n if (this.core.options.suppressRowHoverHighlight) return;\n if (!resolved || resolved.node.isDetail) return;\n this.setHoverIndex(resolved.index);\n };\n\n private onMouseLeave = (): void => {\n this.setHoverIndex(-1);\n };\n\n private onDragHandlePointerDown = (e: PointerEvent): void => {\n if (this.core.isDestroyed() || e.button !== 0) return;\n const target = e.target as HTMLElement;\n if (!target.closest(\".mach-row-drag-handle\")) return;\n const resolved = this.resolveEventTarget(e);\n if (!resolved || resolved.node.isDetail || resolved.node.isGroup) return;\n\n this.rowDragController.start(e, resolved.node);\n e.preventDefault();\n };\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { PaneType } from \"../services/columnModel\";\nimport { el } from \"../lib/dom\";\nimport { DEFAULT_LOCALE, formatText } from \"../lib/locale\";\n\ntype SummaryContext = Pick<\n GridCore<any>,\n \"columnModel\" | \"getCellValue\" | \"isDestroyed\" | \"options\" | \"reportError\" | \"rowModel\" | \"skeleton\"\n>;\n\nexport class SummaryRenderer {\n private footerEl: HTMLElement | null = null;\n private rows: Record<PaneType, HTMLElement> = { left: undefined!, center: undefined!, right: undefined! };\n private cellsByPane: Record<PaneType, HTMLElement[]> = { left: [], center: [], right: [] };\n\n constructor(private core: SummaryContext) {}\n\n init(): void {\n this.footerEl = el(\"div\", \"mach-footer\");\n this.footerEl.style.display = \"none\";\n this.footerEl.setAttribute(\"role\", \"row\");\n this.core.skeleton.root.appendChild(this.footerEl);\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const row = el(\"div\", `mach-footer-row mach-footer-row--${pane}`);\n row.style.height = `${this.core.options.rowHeight}px`;\n this.footerEl.appendChild(row);\n this.rows[pane] = row;\n }\n }\n\n setVisible(visible: boolean): void {\n if (!this.footerEl) return;\n this.footerEl.style.display = visible ? \"\" : \"none\";\n }\n\n refresh(): void {\n if (!this.footerEl || this.core.isDestroyed()) return;\n const show = this.core.options.showSummary;\n this.setVisible(show);\n if (!show) return;\n\n const method = this.core.options.summaryMethod;\n const masterRows = this.core.rowModel.getDisplayedRows().filter((n) => !n.isDetail && !n.isGroup);\n const locale = { ...DEFAULT_LOCALE, ...this.core.options.locale };\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const cols = this.core.columnModel.getPaneColumns(pane);\n const row = this.rows[pane];\n if (this.cellsByPane[pane].length !== cols.length) {\n row.textContent = \"\";\n this.cellsByPane[pane] = cols.map(() => {\n const cell = el(\"div\", \"mach-footer-cell\");\n cell.setAttribute(\"role\", \"cell\");\n row.appendChild(cell);\n return cell;\n });\n }\n let x = 0;\n cols.forEach((col, i) => {\n const cell = this.cellsByPane[pane][i];\n cell.style.left = `${x}px`;\n cell.style.width = `${col.currentWidth}px`;\n x += col.currentWidth;\n\n if (col.hasCheckbox || col.isDetailToggle || col.colDef.rowDrag) {\n cell.textContent = \"\";\n return;\n }\n if (method) {\n try {\n cell.textContent = method({\n colId: col.id,\n column: col,\n values: masterRows.map((node) => this.core.getCellValue(node, col))\n });\n } catch (error) {\n this.core.reportError(error, \"summaryMethod\", { colId: col.id });\n cell.textContent = \"\";\n }\n } else if (i === 0 && pane === \"left\") {\n cell.textContent = formatText(locale.totalRowsLabel, masterRows.length);\n } else {\n cell.textContent = \"\";\n }\n });\n }\n }\n\n destroy(): void {\n this.footerEl?.remove();\n this.footerEl = null;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport { el } from \"../lib/dom\";\nimport { DEFAULT_LOCALE, formatText, formatTwo } from \"../lib/locale\";\n\ntype PaginationContext = Pick<\n GridCore<any>,\n \"eventBus\" | \"isDestroyed\" | \"options\" | \"rowModel\" | \"skeleton\"\n>;\n\nexport class PaginationBar {\n private barEl: HTMLElement | null = null;\n private totalEl: HTMLElement | null = null;\n private pageEl: HTMLElement | null = null;\n private sizeSelect: HTMLSelectElement | null = null;\n private firstBtn: HTMLButtonElement | null = null;\n private prevBtn: HTMLButtonElement | null = null;\n private nextBtn: HTMLButtonElement | null = null;\n private lastBtn: HTMLButtonElement | null = null;\n private offs: (() => void)[] = [];\n\n constructor(private core: PaginationContext) {}\n\n init(): void {\n this.barEl = el(\"div\", \"mach-pagination\");\n this.barEl.style.display = \"none\";\n this.barEl.setAttribute(\"role\", \"navigation\");\n\n const mkBtn = (cls: string, label: string, text: string): HTMLButtonElement => {\n const btn = el(\"button\", `mach-pagination-btn ${cls}`) as HTMLButtonElement;\n btn.type = \"button\";\n btn.title = label;\n btn.setAttribute(\"aria-label\", label);\n btn.textContent = text;\n return btn;\n };\n\n this.totalEl = el(\"span\", \"mach-pagination-total\");\n this.firstBtn = mkBtn(\"mach-pagination-first\", this.t(\"pageFirst\"), \"«\");\n this.prevBtn = mkBtn(\"mach-pagination-prev\", this.t(\"pagePrev\"), \"‹\");\n this.pageEl = el(\"span\", \"mach-pagination-page\");\n this.nextBtn = mkBtn(\"mach-pagination-next\", this.t(\"pageNext\"), \"›\");\n this.lastBtn = mkBtn(\"mach-pagination-last\", this.t(\"pageLast\"), \"»\");\n\n this.firstBtn.addEventListener(\"click\", () => this.core.rowModel.setPage(1));\n this.prevBtn.addEventListener(\"click\", () => this.core.rowModel.setPage(this.core.rowModel.getCurrentPage() - 1));\n this.nextBtn.addEventListener(\"click\", () => this.core.rowModel.setPage(this.core.rowModel.getCurrentPage() + 1));\n this.lastBtn.addEventListener(\"click\", () => this.core.rowModel.setPage(this.core.rowModel.getPageCount()));\n\n this.barEl.append(this.totalEl, this.firstBtn, this.prevBtn, this.pageEl, this.nextBtn, this.lastBtn);\n\n if (this.core.options.paginationShowSizeSelector) {\n this.sizeSelect = document.createElement(\"select\");\n this.sizeSelect.className = \"mach-pagination-size\";\n this.sizeSelect.setAttribute(\"aria-label\", \"page size\");\n this.buildSizeOptions();\n this.sizeSelect.addEventListener(\"change\", () => {\n const size = Number(this.sizeSelect!.value);\n if (!Number.isNaN(size)) this.core.rowModel.setPageSize(size);\n });\n this.barEl.appendChild(this.sizeSelect);\n }\n\n this.core.skeleton.root.appendChild(this.barEl);\n\n this.offs.push(\n this.core.eventBus.on(\"modelUpdated\", () => this.refresh()),\n this.core.eventBus.on(\"paginationChanged\", () => this.refresh())\n );\n this.refresh();\n }\n\n private buildSizeOptions(): void {\n if (!this.sizeSelect) return;\n const options = this.core.options.paginationPageSizeOptions;\n const current = this.core.options.paginationPageSize;\n if (!options.includes(current)) {\n options.push(current);\n options.sort((a, b) => a - b);\n }\n this.sizeSelect.textContent = \"\";\n for (const size of options) {\n const option = document.createElement(\"option\");\n option.value = String(size);\n option.textContent = formatText(this.t(\"perPage\"), size);\n if (size === current) option.selected = true;\n this.sizeSelect.appendChild(option);\n }\n }\n\n private t(key: Parameters<GridCore<any>[\"getLocaleText\"]>[0]): string {\n return this.core.options.locale?.[key] ?? DEFAULT_LOCALE[key];\n }\n\n rebuild(): void {\n if (!this.barEl) return;\n if (this.sizeSelect && this.core.options.paginationShowSizeSelector) {\n this.buildSizeOptions();\n }\n this.refresh();\n }\n\n refresh(): void {\n if (!this.barEl || this.core.isDestroyed()) return;\n const rm = this.core.rowModel;\n const active = rm.paginationActive;\n const total = rm.getTotalRowCount();\n const visible = active && total > 0;\n this.barEl.style.display = visible ? \"\" : \"none\";\n if (!visible) return;\n\n const page = rm.getCurrentPage();\n const pageCount = rm.getPageCount();\n\n if (this.totalEl && this.core.options.paginationShowTotal) {\n const text = formatText(this.t(\"paginationTotal\"), total);\n if (this.totalEl.textContent !== text) this.totalEl.textContent = text;\n }\n if (this.pageEl) {\n const text = formatTwo(this.t(\"paginationPage\"), page, pageCount);\n if (this.pageEl.textContent !== text) this.pageEl.textContent = text;\n }\n if (this.firstBtn) this.firstBtn.disabled = page <= 1;\n if (this.prevBtn) this.prevBtn.disabled = page <= 1;\n if (this.nextBtn) this.nextBtn.disabled = page >= pageCount;\n if (this.lastBtn) this.lastBtn.disabled = page >= pageCount;\n if (this.sizeSelect && Number(this.sizeSelect.value) !== this.core.options.paginationPageSize) {\n this.sizeSelect.value = String(this.core.options.paginationPageSize);\n }\n }\n\n destroy(): void {\n for (const off of this.offs) off();\n this.offs = [];\n this.barEl?.remove();\n this.barEl = null;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { PaneType } from \"../services/columnModel\";\nimport type { RowNode } from \"../types/row\";\nimport { el } from \"../lib/dom\";\nimport { renderCellContent, cleanupCellContent, applyCellClasses, applyCellStyle } from \"./cellContent\";\n\ntype PinnedRowsContext = Pick<\n GridCore<any>,\n | \"columnModel\"\n | \"getApi\"\n | \"getCellValue\"\n | \"isDestroyed\"\n | \"options\"\n | \"relayout\"\n | \"reportError\"\n | \"resolveCellRenderer\"\n | \"skeleton\"\n>;\n\nconst PANES: PaneType[] = [\"left\", \"center\", \"right\"];\n\ninterface SideState {\n root: HTMLElement;\n segments: Record<PaneType, HTMLElement>;\n centerViewport: HTMLElement;\n rowWrappers: Record<PaneType, HTMLElement[]>;\n cells: Record<PaneType, HTMLElement[]>[];\n data: any[];\n}\n\nexport class PinnedRowsRenderer {\n private top: SideState | null = null;\n private bottom: SideState | null = null;\n\n constructor(private core: PinnedRowsContext) {}\n\n init(): void {\n this.top = this.createSide(this.core.skeleton.pinnedTopEl);\n this.bottom = this.createSide(this.core.skeleton.pinnedBottomEl);\n }\n\n private createSide(root: HTMLElement): SideState {\n const state: SideState = {\n root,\n segments: { left: el(\"div\"), center: el(\"div\"), right: el(\"div\") },\n centerViewport: el(\"div\", \"mach-pinned-viewport\"),\n rowWrappers: { left: [], center: [], right: [] },\n cells: [],\n data: []\n };\n for (const pane of PANES) {\n state.segments[pane].className = `mach-pinned-seg mach-pinned-seg--${pane}`;\n if (pane !== \"center\") state.segments[pane].classList.add(\"mach-pane--hidden\");\n if (pane === \"center\") {\n state.centerViewport.appendChild(state.segments[pane]);\n }\n }\n root.append(state.segments.left, state.centerViewport, state.segments.right);\n return state;\n }\n\n setData(top: any[] | null, bottom: any[] | null): void {\n if (this.core.isDestroyed() || !this.top || !this.bottom) return;\n this.top.data = top ?? [];\n this.bottom.data = bottom ?? [];\n this.rebuild();\n this.applyLayout();\n this.core.relayout();\n }\n\n setTopData(rows: any[] | null): void {\n if (this.core.isDestroyed() || !this.top) return;\n this.top.data = rows ?? [];\n this.rebuildSide(this.top, \"top\");\n this.applyLayout();\n this.core.relayout();\n }\n\n setBottomData(rows: any[] | null): void {\n if (this.core.isDestroyed() || !this.bottom) return;\n this.bottom.data = rows ?? [];\n this.rebuildSide(this.bottom, \"bottom\");\n this.applyLayout();\n this.core.relayout();\n }\n\n getTopData(): any[] {\n return this.top ? this.top.data.slice() : [];\n }\n\n getBottomData(): any[] {\n return this.bottom ? this.bottom.data.slice() : [];\n }\n\n rebuild(): void {\n if (!this.top || !this.bottom) return;\n this.rebuildSide(this.top, \"top\");\n this.rebuildSide(this.bottom, \"bottom\");\n }\n\n private rebuildSide(side: SideState, sideName: \"top\" | \"bottom\"): void {\n for (const row of side.cells) {\n for (const pane of PANES) {\n for (const cell of row[pane]) cleanupCellContent(this.core, cell);\n }\n }\n for (const pane of PANES) {\n for (const wrapper of side.rowWrappers[pane]) wrapper.remove();\n side.rowWrappers[pane] = [];\n }\n side.cells = [];\n side.root.style.display = side.data.length > 0 ? \"\" : \"none\";\n if (side.data.length === 0) return;\n\n const rowHeight = this.core.options.rowHeight;\n const cm = this.core.columnModel;\n\n side.data.forEach((data, i) => {\n const node: RowNode<any> = {\n id: `__pinned_${sideName}_${i}`,\n data,\n rowIndex: -1,\n selected: false\n };\n const cellsByPane = {} as Record<PaneType, HTMLElement[]>;\n for (const pane of PANES) {\n const wrapper = el(\"div\", \"mach-pinned-row\");\n wrapper.style.height = `${rowHeight}px`;\n wrapper.setAttribute(\"role\", \"row\");\n cellsByPane[pane] = [];\n for (const col of cm.getPaneColumns(pane)) {\n const cell = el(\"div\", \"mach-cell\");\n cell.dataset.colId = col.id;\n cell.setAttribute(\"role\", \"gridcell\");\n if (col.hasCheckbox) cell.classList.add(\"mach-cell--selection\");\n if (!col.hasCheckbox && !col.isDetailToggle && !col.colDef.rowDrag && col.colDef.type !== \"index\") {\n try {\n renderCellContent(this.core, cell, node, col);\n applyCellClasses(this.core, cell, node, col);\n applyCellStyle(this.core, cell, node, col);\n } catch (err) {\n this.core.reportError(err, \"pinnedRow.render\", { colId: col.id, side: sideName, rowIndex: i });\n }\n }\n wrapper.appendChild(cell);\n cellsByPane[pane].push(cell);\n }\n side.segments[pane].appendChild(wrapper);\n side.rowWrappers[pane].push(wrapper);\n }\n side.cells.push(cellsByPane);\n });\n }\n\n applyLayout(): void {\n if (!this.top || !this.bottom) return;\n const cm = this.core.columnModel;\n const widths: Record<PaneType, number> = { left: 0, center: 0, right: 0 };\n const lefts: Record<PaneType, number[]> = { left: [], center: [], right: [] };\n for (const pane of PANES) {\n let x = 0;\n for (const col of cm.getPaneColumns(pane)) {\n lefts[pane].push(x);\n x += col.currentWidth;\n }\n widths[pane] = x;\n }\n\n for (const side of [this.top, this.bottom]) {\n const hidden = side.data.length === 0;\n side.segments.left.classList.toggle(\"mach-pane--hidden\", hidden || widths.left <= 0);\n side.segments.right.classList.toggle(\"mach-pane--hidden\", hidden || widths.right <= 0);\n side.segments.left.style.width = `${widths.left}px`;\n side.segments.right.style.width = `${widths.right}px`;\n side.segments.center.style.width = `${widths.center}px`;\n side.cells.forEach((cellsByPane) => {\n let globalColOffset = 0;\n for (const pane of PANES) {\n const cols = cm.getPaneColumns(pane);\n cellsByPane[pane].forEach((cell, i) => {\n cell.style.width = `${cols[i].currentWidth}px`;\n cell.style.left = `${lefts[pane][i]}px`;\n cell.setAttribute(\"aria-colindex\", String(globalColOffset + i + 1));\n });\n globalColOffset += cols.length;\n }\n });\n }\n }\n\n onScrollLeft(scrollLeft: number): void {\n if (this.top) this.top.segments.center.style.transform = `translateX(${-scrollLeft}px)`;\n if (this.bottom) this.bottom.segments.center.style.transform = `translateX(${-scrollLeft}px)`;\n }\n\n refresh(): void {\n this.rebuild();\n this.applyLayout();\n }\n\n destroy(): void {\n for (const side of [this.top, this.bottom]) {\n if (!side) continue;\n for (const row of side.cells) {\n for (const pane of PANES) {\n for (const cell of row[pane]) cleanupCellContent(this.core, cell);\n }\n }\n }\n this.top = null;\n this.bottom = null;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport { el } from \"../lib/dom\";\nimport { DEFAULT_LOCALE, formatText, type RgLocaleKey } from \"../lib/locale\";\nimport type { StatusBarPanel } from \"../types/options\";\n\ntype AnyLocale = Record<string, string | undefined>;\ntype StatusBarContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"columnModel\"\n | \"eventBus\"\n | \"getCellValue\"\n | \"isDestroyed\"\n | \"options\"\n | \"rowModel\"\n | \"selectionService\"\n | \"skeleton\"\n>;\n\nexport class StatusBarService {\n private barEl: HTMLElement | null = null;\n private items: Partial<Record<StatusBarPanel, HTMLElement>> = {};\n private offs: (() => void)[] = [];\n\n constructor(private core: StatusBarContext) {}\n\n init(): void {\n this.barEl = el(\"div\", \"mach-statusbar\");\n this.barEl.style.display = \"none\";\n this.barEl.setAttribute(\"role\", \"status\");\n this.core.skeleton.root.appendChild(this.barEl);\n this.rebuild();\n\n this.offs.push(\n this.core.eventBus.on(\"modelUpdated\", () => this.refresh()),\n this.core.eventBus.on(\"selectionChanged\", () => this.refresh()),\n this.core.eventBus.on(\"rangeSelectionChanged\", () => this.refresh()),\n this.core.eventBus.on(\"cellValueChanged\", () => this.refresh())\n );\n }\n\n rebuild(): void {\n if (!this.barEl) return;\n this.barEl.textContent = \"\";\n this.items = {};\n const options = this.core.options;\n if (!options.statusBarEnabled) {\n this.barEl.style.display = \"none\";\n return;\n }\n for (const panel of options.statusBarPanels) {\n const item = el(\"span\", `mach-statusbar-item mach-statusbar-item--${panel}`);\n this.barEl.appendChild(item);\n this.items[panel] = item;\n }\n this.refresh();\n }\n\n refresh(): void {\n if (!this.barEl || this.core.isDestroyed()) return;\n const options = this.core.options;\n this.barEl.style.display = options.statusBarEnabled ? \"\" : \"none\";\n if (!options.statusBarEnabled) return;\n\n const locale: AnyLocale = { ...DEFAULT_LOCALE, ...options.locale };\n const text = (key: RgLocaleKey, value?: number | string): string => {\n const template = locale[key] ?? DEFAULT_LOCALE[key];\n return value === undefined ? template : formatText(template, typeof value === \"number\" ? value : parseFloat(String(value)) || 0);\n };\n\n if (this.items.rowCount) {\n const rm = this.core.rowModel;\n const total = rm.getDisplayTotalCount();\n const loaded = rm.paginationActive ? rm.getTotalRowCount() : rm.getDisplayedRowCount();\n const value =\n rm.isInfinite && total > loaded\n ? `${formatText(text(\"totalRowsLabel\"), loaded)} / ${total}`\n : formatText(text(\"totalRowsLabel\"), loaded);\n if (this.items.rowCount.textContent !== value) this.items.rowCount.textContent = value;\n }\n\n if (this.items.selectedRowCount) {\n const count = this.core.selectionService.getSelectedNodes().length;\n const value = formatText(text(\"statusSelected\"), count);\n if (this.items.selectedRowCount.textContent !== value) {\n this.items.selectedRowCount.textContent = value;\n }\n }\n\n if (this.items.rangeAggregate) {\n const range = this.core.bodyRenderer.normalizedRange();\n let value = \"\";\n if (range) {\n const flat = this.core.columnModel.getOrderedVisible();\n let sum = 0;\n let count = 0;\n for (let r = range.r1; r <= range.r2; r++) {\n const node = this.core.rowModel.getDisplayedRow(r);\n if (!node || node.isDetail || node.isGroup) continue;\n for (let c = range.c1; c <= range.c2; c++) {\n const col = flat[c];\n if (!col) continue;\n const v = this.core.getCellValue(node, col);\n if (typeof v === \"number\" && !isNaN(v)) {\n sum += v;\n count++;\n }\n }\n }\n if (count > 0) {\n const avg = Math.round((sum / count) * 100) / 100;\n const sumText = Number.isInteger(sum) ? String(sum) : String(Math.round(sum * 100) / 100);\n value = `${text(\"statusSum\", sumText)} · ${text(\"statusAvg\", String(avg))} · ${text(\"statusCount\", String(count))}`;\n }\n }\n if (this.items.rangeAggregate.textContent !== value) this.items.rangeAggregate.textContent = value;\n }\n }\n\n destroy(): void {\n for (const off of this.offs) off();\n this.offs = [];\n this.barEl?.remove();\n this.barEl = null;\n }\n}\n","import type { ColumnState } from \"../types/colDef\";\nimport type { ColumnStateStore } from \"../types/options\";\n\nexport interface ColumnStateStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nexport interface StoredColumnState {\n version: number;\n savedAt: number;\n columns: ColumnState[];\n}\n\nexport interface LocalColumnStateStoreOptions {\n /** Storage prefix. Separate applications or environments with different values. */\n namespace?: string;\n /** Schema version for migrations when column identifiers or meanings change. */\n version?: number;\n storage?: ColumnStateStorage;\n maxColumns?: number;\n migrate?(\n columns: readonly ColumnState[],\n fromVersion: number,\n toVersion: number\n ): ColumnState[] | null;\n onError?(error: unknown, operation: \"load\" | \"save\" | \"clear\", key: string): void;\n}\n\nexport interface ManagedColumnStateStore extends ColumnStateStore {\n clear(key: string): void;\n storageKey(key: string): string;\n}\n\nexport interface ColumnStateKeyParts {\n app?: string;\n tenant?: string | number;\n user?: string | number;\n route?: string;\n table: string;\n schema?: string | number;\n}\n\nfunction currentStorage(): ColumnStateStorage | null {\n try {\n return typeof localStorage === \"undefined\" ? null : localStorage;\n } catch {\n return null;\n }\n}\n\nfunction safeSegment(value: string | number): string {\n return encodeURIComponent(String(value).trim()).replace(/%/g, \"~\");\n}\n\n/** Builds a collision-resistant key for per-user/per-route table preferences. */\nexport function createColumnStateKey(parts: ColumnStateKeyParts): string {\n const segments: Array<[string, string | number | undefined]> = [\n [\"app\", parts.app],\n [\"tenant\", parts.tenant],\n [\"user\", parts.user],\n [\"route\", parts.route],\n [\"table\", parts.table],\n [\"schema\", parts.schema]\n ];\n return segments\n .filter((entry): entry is [string, string | number] => entry[1] !== undefined && String(entry[1]).trim() !== \"\")\n .map(([name, value]) => `${name}=${safeSegment(value)}`)\n .join(\";\");\n}\n\nfunction sanitizeColumnState(value: unknown, maxColumns: number): ColumnState[] | null {\n if (!Array.isArray(value) || value.length > maxColumns) return null;\n const result: ColumnState[] = [];\n const ids = new Set<string>();\n for (const item of value) {\n if (item == null || typeof item !== \"object\") continue;\n const source = item as Record<string, unknown>;\n if (typeof source.colId !== \"string\" || source.colId.length === 0 || source.colId.length > 256 || ids.has(source.colId)) continue;\n ids.add(source.colId);\n const state: ColumnState = { colId: source.colId };\n if (typeof source.hide === \"boolean\") state.hide = source.hide;\n if (typeof source.width === \"number\" && Number.isFinite(source.width) && source.width > 0) state.width = source.width;\n if (source.pinned === \"left\" || source.pinned === \"right\" || source.pinned === null) state.pinned = source.pinned;\n if (source.sort === \"asc\" || source.sort === \"desc\" || source.sort === null) state.sort = source.sort;\n if (source.sortIndex === null) state.sortIndex = null;\n else if (typeof source.sortIndex === \"number\" && Number.isInteger(source.sortIndex) && source.sortIndex >= 0) {\n state.sortIndex = source.sortIndex;\n }\n result.push(state);\n }\n return result;\n}\n\n/**\n * Creates a versioned local state adapter. Legacy array payloads are read as\n * version 0, so existing users can migrate without losing preferences.\n */\nexport function createLocalColumnStateStore(options: LocalColumnStateStoreOptions = {}): ManagedColumnStateStore {\n const namespace = (options.namespace ?? \"mach-table:col-state\").replace(/:+$/, \"\");\n const version = Math.max(1, Math.floor(options.version ?? 1));\n const maxColumns = Math.max(1, Math.floor(options.maxColumns ?? 1_000));\n const storageKey = (key: string): string => `${namespace}:${key}`;\n const report = (error: unknown, operation: \"load\" | \"save\" | \"clear\", key: string): void => {\n try { options.onError?.(error, operation, key); } catch { /* error observers must not break the grid */ }\n };\n\n return {\n storageKey,\n load(key) {\n try {\n const raw = (options.storage ?? currentStorage())?.getItem(storageKey(key));\n if (!raw) return null;\n const parsed: unknown = JSON.parse(raw);\n if (Array.isArray(parsed)) {\n const legacy = sanitizeColumnState(parsed, maxColumns);\n if (!legacy || !options.migrate) return legacy;\n return sanitizeColumnState(options.migrate(legacy, 0, version), maxColumns);\n }\n if (parsed == null || typeof parsed !== \"object\") return null;\n const envelope = parsed as Partial<StoredColumnState>;\n if (!Number.isInteger(envelope.version) || typeof envelope.version !== \"number\") return null;\n const columns = sanitizeColumnState(envelope.columns, maxColumns);\n if (!columns) return null;\n if (envelope.version === version) return columns;\n return options.migrate\n ? sanitizeColumnState(options.migrate(columns, envelope.version, version), maxColumns)\n : null;\n } catch (error) {\n report(error, \"load\", key);\n return null;\n }\n },\n save(key, state) {\n try {\n const columns = sanitizeColumnState(state, maxColumns);\n if (!columns) throw new TypeError(`[MachTable] Invalid column state for \"${key}\".`);\n const envelope: StoredColumnState = { version, savedAt: Date.now(), columns };\n (options.storage ?? currentStorage())?.setItem(storageKey(key), JSON.stringify(envelope));\n } catch (error) {\n report(error, \"save\", key);\n }\n },\n clear(key) {\n try {\n (options.storage ?? currentStorage())?.removeItem(storageKey(key));\n } catch (error) {\n report(error, \"clear\", key);\n }\n }\n };\n}\n\nconst defaultStore = createLocalColumnStateStore();\n\nexport function saveColumnState(key: string, state: ColumnState[]): void {\n void defaultStore.save(key, state);\n}\n\nexport function loadColumnState(key: string): ColumnState[] | null {\n return defaultStore.load(key) as ColumnState[] | null;\n}\n\nexport function clearColumnState(key: string): void {\n void defaultStore.clear(key);\n}\n","import type { CellRendererParams } from \"../types/params\";\nimport type { CellRendererFn } from \"../types/colDef\";\nimport type { ActionPolicyContext } from \"../types/options\";\n\nexport type TagVariant = \"success\" | \"warning\" | \"danger\" | \"info\" | \"neutral\";\n\nexport interface StatusTagConfig {\n variantMap?: Record<string, TagVariant>;\n labelMap?: Record<string, string>;\n}\n\nconst DEFAULT_STATUS_VARIANTS: Array<[RegExp, TagVariant]> = [\n [/^(success|ok|done|complete|completed|normal|active|enabled|启用|正常|完成|已完成|运行|运行中|在线|生效)$/i, \"success\"],\n [/^(warning|warn|hold|pending|standby|待机|待审核|暂停|预警|部分完成)$/i, \"warning\"],\n [/^(error|fail|failed|danger|fault|offline|disabled|故障|失败|错误|异常|停用|离线|断开)$/i, \"danger\"],\n [/^(info|processing|new|draft|进行中|新建|草稿|审批中|同步中)$/i, \"info\"]\n];\n\nexport function resolveTagVariant(value: any, variantMap?: Record<string, TagVariant>): TagVariant {\n const key = String(value ?? \"\");\n if (variantMap) {\n const exact = variantMap[key];\n if (exact) return exact;\n const lower = variantMap[key.toLowerCase()];\n if (lower) return lower;\n }\n for (const [pattern, variant] of DEFAULT_STATUS_VARIANTS) {\n if (pattern.test(key)) return variant;\n }\n return \"neutral\";\n}\n\nexport function createStatusTagRenderer(config: StatusTagConfig = {}): CellRendererFn {\n return (params: CellRendererParams) => {\n if (params.value == null || params.value === \"\") return \"\";\n const variant = resolveTagVariant(params.value, config.variantMap);\n const label = config.labelMap?.[String(params.value)] ?? (params.formatted || String(params.value));\n const tag = document.createElement(\"span\");\n tag.className = `mach-tag mach-tag--${variant}`;\n tag.textContent = label;\n return tag;\n };\n}\n\nexport interface ProgressConfig {\n showValue?: boolean;\n unit?: string;\n color?: string;\n}\n\nexport function createProgressBarRenderer(config: ProgressConfig = {}): CellRendererFn {\n return (params: CellRendererParams) => {\n const raw = Number(params.value);\n if (isNaN(raw)) return params.formatted;\n const pct = Math.max(0, Math.min(100, raw));\n const wrap = document.createElement(\"div\");\n wrap.className = \"mach-progress\";\n const track = document.createElement(\"div\");\n track.className = \"mach-progress__track\";\n const bar = document.createElement(\"div\");\n bar.className = \"mach-progress__bar\";\n bar.style.width = `${pct}%`;\n if (config.color) bar.style.background = config.color;\n track.appendChild(bar);\n wrap.appendChild(track);\n if (config.showValue !== false) {\n const label = document.createElement(\"span\");\n label.className = \"mach-progress__label\";\n label.textContent = `${Math.round(pct)}${config.unit ?? \"%\"}`;\n wrap.appendChild(label);\n }\n return wrap;\n };\n}\n\nexport function linkRenderer(params: CellRendererParams): string | HTMLElement {\n if (params.value == null || params.value === \"\") return \"\";\n const link = document.createElement(\"span\");\n link.className = \"mach-link\";\n link.textContent = params.formatted || String(params.value);\n return link;\n}\n\nconst ICON_PATHS: Record<string, string> = {\n edit: '<path d=\"M11.5 2.5l2 2L5 13H3v-2l8.5-8.5z\"/>',\n delete: '<path d=\"M3 5h10M6 5V3h4v2M5 5l.7 8h4.6L11 5\"/>',\n view: '<path d=\"M1.5 8s2.4-4.2 6.5-4.2S14.5 8 14.5 8s-2.4 4.2-6.5 4.2S1.5 8 1.5 8z\"/><circle cx=\"8\" cy=\"8\" r=\"1.8\"/>',\n copy: '<rect x=\"5\" y=\"5\" width=\"8\" height=\"8\" rx=\"1\"/><path d=\"M3 11V3h8\"/>',\n download: '<path d=\"M8 2v8m0 0l-3-3m3 3l3-3M2.5 13.5h11\"/>',\n refresh: '<path d=\"M13 3v4h-4M3 13V9h4\"/><path d=\"M13 7a5.5 5.5 0 00-9.7-2.6M3 9a5.5 5.5 0 009.7 2.6\"/>',\n close: '<path d=\"M3.5 3.5l9 9m0-9l-9 9\"/>',\n check: '<path d=\"M2.5 8.5l3.5 3.5 7.5-8\"/>',\n plus: '<path d=\"M8 2.5v11M2.5 8h11\"/>',\n search: '<circle cx=\"7\" cy=\"7\" r=\"4.5\"/><path d=\"M10.5 10.5L14 14\"/>',\n more: '<circle cx=\"3\" cy=\"8\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"8\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"13\" cy=\"8\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/>'\n};\n\nfunction iconSvg(name: string, size = 14): string {\n const path = ICON_PATHS[name] ?? \"\";\n return `<svg viewBox=\"0 0 16 16\" width=\"${size}\" height=\"${size}\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${path}</svg>`;\n}\n\nexport type ActionVariant = \"default\" | \"primary\" | \"warning\" | \"success\" | \"danger\";\nexport type ActionOverflowMode = \"menu\" | \"drawer\" | \"inline\";\n\nexport interface ActionItem<TData = any> {\n /** Stable identifier used by permission, telemetry and error policies. */\n id?: string;\n icon?: string;\n label?: string;\n title?: string;\n /** Backwards-compatible shorthand for variant=\"danger\". */\n danger?: boolean;\n variant?: ActionVariant;\n show?: (params: CellRendererParams<TData>) => boolean;\n disabled?: boolean | ((params: CellRendererParams<TData>) => boolean);\n loading?: boolean | ((params: CellRendererParams<TData>) => boolean);\n /** One or more UI permissions. Access is resolved by GridOptions.actionPolicy. */\n permission?: string | readonly string[];\n /** Ask for confirmation before running. A string becomes the confirmation message. */\n confirm?: boolean | string | ((params: CellRendererParams<TData>) => boolean | string | Promise<boolean | string>);\n onClick: (params: CellRendererParams<TData>) => unknown | Promise<unknown>;\n}\n\nexport interface ActionButtonsConfig<TData = any> {\n actions: ActionItem<TData>[];\n max?: number;\n /** menu is compact, drawer suits touch/complex actions, inline never renders an ellipsis. */\n overflow?: ActionOverflowMode;\n moreLabel?: string;\n drawerTitle?: string;\n}\n\nexport interface RowActionsConfig<TData = any> extends Omit<ActionButtonsConfig<TData>, \"actions\"> {\n onView?: (params: CellRendererParams<TData>) => unknown | Promise<unknown>;\n onDelete?: (params: CellRendererParams<TData>) => unknown | Promise<unknown>;\n /** Set false when this table has no full-row edit workflow. */\n edit?: boolean;\n extraActions?: ActionItem<TData>[];\n labels?: Partial<Record<\"view\" | \"edit\" | \"delete\" | \"save\" | \"cancel\", string>>;\n permissions?: Partial<Record<\"view\" | \"edit\" | \"delete\", string | readonly string[]>>;\n /** Defaults to the translated delete label when true. */\n confirmDelete?: boolean | string | ((params: CellRendererParams<TData>) => boolean | string | Promise<boolean | string>);\n}\n\nlet openActionSurface: HTMLElement | null = null;\nlet openActionAnchor: HTMLElement | null = null;\n\nfunction closeActionSurface(restoreFocus = false): void {\n openActionSurface?.remove();\n openActionSurface = null;\n if (openActionAnchor) {\n openActionAnchor.setAttribute(\"aria-expanded\", \"false\");\n if (restoreFocus && openActionAnchor.isConnected) openActionAnchor.focus({ preventScroll: true });\n }\n openActionAnchor = null;\n document.removeEventListener(\"mousedown\", onActionSurfaceOutside, true);\n document.removeEventListener(\"keydown\", onActionSurfaceKeyDown, true);\n}\n\nfunction onActionSurfaceOutside(event: MouseEvent): void {\n if (\n openActionSurface &&\n !openActionSurface.contains(event.target as Node) &&\n !openActionAnchor?.contains(event.target as Node)\n ) closeActionSurface();\n}\n\nfunction onActionSurfaceKeyDown(event: KeyboardEvent): void {\n if (!openActionSurface) return;\n if (event.key === \"Escape\") {\n event.preventDefault();\n closeActionSurface(true);\n return;\n }\n const buttons = [...openActionSurface.querySelectorAll<HTMLButtonElement>(\"button:not(:disabled)\")];\n if (buttons.length === 0) return;\n if (event.key === \"Tab\") {\n const current = buttons.indexOf(document.activeElement as HTMLButtonElement);\n if ((!event.shiftKey && current === buttons.length - 1) || (event.shiftKey && current <= 0)) {\n event.preventDefault();\n buttons[event.shiftKey ? buttons.length - 1 : 0].focus();\n }\n return;\n }\n if (event.key !== \"ArrowDown\" && event.key !== \"ArrowUp\") return;\n event.preventDefault();\n const current = buttons.indexOf(document.activeElement as HTMLButtonElement);\n const delta = event.key === \"ArrowDown\" ? 1 : -1;\n buttons[(current + delta + buttons.length) % buttons.length].focus();\n}\n\ninterface SurfaceItem {\n label: string;\n icon?: string;\n variant?: ActionVariant;\n disabled?: boolean;\n pick: (button: HTMLButtonElement) => void;\n}\n\nfunction makeSurfaceButton(item: SurfaceItem, className: string): HTMLButtonElement {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = className;\n if (item.variant && item.variant !== \"default\") button.classList.add(`${className}--${item.variant}`);\n button.disabled = item.disabled === true;\n if (item.icon && ICON_PATHS[item.icon]) button.innerHTML = `${iconSvg(item.icon, 16)}<span>${item.label}</span>`;\n else button.textContent = item.label;\n button.addEventListener(\"click\", () => item.pick(button));\n return button;\n}\n\nfunction showActionMenu(anchor: HTMLElement, items: SurfaceItem[]): void {\n closeActionSurface();\n const menu = document.createElement(\"div\");\n menu.className = \"mach-context-menu mach-action-menu\";\n menu.setAttribute(\"role\", \"menu\");\n for (const item of items) {\n const button = makeSurfaceButton(item, \"mach-context-menu-item\");\n button.setAttribute(\"role\", \"menuitem\");\n menu.appendChild(button);\n }\n document.body.appendChild(menu);\n const rect = anchor.getBoundingClientRect();\n const menuRect = menu.getBoundingClientRect();\n menu.style.left = `${Math.min(Math.max(8, rect.left), window.innerWidth - menuRect.width - 8)}px`;\n menu.style.top = `${Math.min(rect.bottom + 4, window.innerHeight - menuRect.height - 8)}px`;\n openActionSurface = menu;\n openActionAnchor = anchor;\n anchor.setAttribute(\"aria-expanded\", \"true\");\n document.addEventListener(\"mousedown\", onActionSurfaceOutside, true);\n document.addEventListener(\"keydown\", onActionSurfaceKeyDown, true);\n menu.querySelector<HTMLButtonElement>(\"button:not(:disabled)\")?.focus({ preventScroll: true });\n}\n\nfunction showActionDrawer(anchor: HTMLElement, title: string, items: SurfaceItem[]): void {\n closeActionSurface();\n const backdrop = document.createElement(\"div\");\n backdrop.className = \"mach-action-drawer-backdrop\";\n const drawer = document.createElement(\"section\");\n drawer.className = \"mach-action-drawer\";\n drawer.setAttribute(\"role\", \"dialog\");\n drawer.setAttribute(\"aria-modal\", \"true\");\n drawer.setAttribute(\"aria-label\", title);\n const header = document.createElement(\"header\");\n header.className = \"mach-action-drawer__header\";\n const heading = document.createElement(\"strong\");\n heading.textContent = title;\n const close = document.createElement(\"button\");\n close.type = \"button\";\n close.className = \"mach-action-drawer__close\";\n close.setAttribute(\"aria-label\", \"Close\");\n close.title = \"Close\";\n close.innerHTML = iconSvg(\"close\", 16);\n close.addEventListener(\"click\", () => closeActionSurface(true));\n header.append(heading, close);\n const body = document.createElement(\"div\");\n body.className = \"mach-action-drawer__body\";\n for (const item of items) body.appendChild(makeSurfaceButton(item, \"mach-action-drawer__item\"));\n drawer.append(header, body);\n backdrop.appendChild(drawer);\n backdrop.addEventListener(\"mousedown\", (event) => {\n if (event.target === backdrop) closeActionSurface(true);\n });\n document.body.appendChild(backdrop);\n openActionSurface = backdrop;\n openActionAnchor = anchor;\n anchor.setAttribute(\"aria-expanded\", \"true\");\n document.addEventListener(\"keydown\", onActionSurfaceKeyDown, true);\n drawer.querySelector<HTMLButtonElement>(\"button:not(:disabled)\")?.focus({ preventScroll: true });\n}\n\nfunction resolveActionFlag<TData>(\n flag: boolean | ((params: CellRendererParams<TData>) => boolean) | undefined,\n params: CellRendererParams<TData>\n): boolean {\n if (typeof flag === \"function\") {\n try { return flag(params); } catch { return false; }\n }\n return flag === true;\n}\n\nfunction actionVariant(action: ActionItem): ActionVariant {\n return action.danger ? \"danger\" : (action.variant ?? \"default\");\n}\n\nfunction actionPermissions<TData>(action: ActionItem<TData>): readonly string[] {\n if (!action.permission) return [];\n return typeof action.permission === \"string\" ? [action.permission] : action.permission;\n}\n\nfunction actionContext<TData>(\n action: ActionItem<TData>,\n params: CellRendererParams<TData>,\n message?: string\n): ActionPolicyContext<TData> {\n return {\n ...(action.id ? { actionId: action.id } : {}),\n permissions: actionPermissions(action),\n ...(message ? { message } : {}),\n params\n };\n}\n\nfunction reportActionError<TData>(\n error: unknown,\n action: ActionItem<TData>,\n params: CellRendererParams<TData>\n): void {\n const policy = params.api.getGridOption(\"actionPolicy\");\n try {\n if (policy?.onError) policy.onError(error, actionContext(action, params));\n else console.error(\"[mach-table] action handler failed\", error);\n } catch (policyError) {\n console.error(\"[mach-table] action error policy failed\", policyError, error);\n }\n}\n\nfunction canAccessAction<TData>(action: ActionItem<TData>, params: CellRendererParams<TData>): boolean {\n const permissions = actionPermissions(action);\n if (permissions.length === 0) return true;\n const policy = params.api.getGridOption(\"actionPolicy\");\n if (!policy?.canAccess) return true;\n try {\n return policy.canAccess(actionContext(action, params));\n } catch (error) {\n reportActionError(error, action, params);\n return false;\n }\n}\n\nexport function createActionButtonsRenderer<TData = any>(config: ActionButtonsConfig<TData>): CellRendererFn {\n const max = Math.max(0, config.max ?? 3);\n const overflowMode = config.overflow ?? \"menu\";\n return (params: CellRendererParams<TData>) => {\n const visible = config.actions.filter((action) => {\n if (!canAccessAction(action, params)) return false;\n if (!action.show) return true;\n try { return action.show(params); } catch { return false; }\n });\n if (visible.length === 0) return \"\";\n\n const wrap = document.createElement(\"div\");\n wrap.className = \"mach-actions\";\n const shown = overflowMode === \"inline\" ? visible : visible.slice(0, max);\n const overflow = overflowMode === \"inline\" ? [] : visible.slice(max);\n\n const run = (action: ActionItem<TData>, button: HTMLButtonElement): void => {\n if (resolveActionFlag(action.disabled, params)) return;\n button.disabled = true;\n button.classList.add(\"mach-action-btn--loading\");\n const execute = async (): Promise<void> => {\n if (action.confirm != null && action.confirm !== false) {\n const request = typeof action.confirm === \"function\" ? await action.confirm(params) : action.confirm;\n if (request === false) return;\n const message = typeof request === \"string\" ? request : (action.label ?? action.title ?? \"Confirm action\");\n const policy = params.api.getGridOption(\"actionPolicy\");\n const approved = policy?.confirm\n ? await policy.confirm(actionContext(action, params, message))\n : typeof window !== \"undefined\" && typeof window.confirm === \"function\"\n ? window.confirm(message)\n : false;\n if (!approved) return;\n }\n await action.onClick(params);\n };\n void execute().catch((error) => reportActionError(error, action, params)).finally(() => {\n if (!button.isConnected) return;\n button.disabled = resolveActionFlag(action.disabled, params) || resolveActionFlag(action.loading, params);\n button.classList.toggle(\"mach-action-btn--loading\", resolveActionFlag(action.loading, params));\n });\n };\n\n for (const action of shown) {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = \"mach-action-btn\";\n const variant = actionVariant(action);\n if (variant !== \"default\") button.classList.add(`mach-action-btn--${variant}`);\n const title = action.title ?? action.label ?? \"Action\";\n button.title = title;\n button.setAttribute(\"aria-label\", title);\n button.disabled = resolveActionFlag(action.disabled, params);\n if (resolveActionFlag(action.loading, params)) {\n button.disabled = true;\n button.classList.add(\"mach-action-btn--loading\");\n }\n if (action.icon && ICON_PATHS[action.icon]) {\n button.innerHTML = iconSvg(action.icon);\n button.classList.add(\"mach-action-btn--icon\");\n } else {\n button.textContent = action.label ?? title;\n }\n button.addEventListener(\"mousedown\", (event) => event.stopPropagation());\n button.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n run(action, button);\n });\n wrap.appendChild(button);\n }\n\n if (overflow.length > 0) {\n const more = document.createElement(\"button\");\n more.type = \"button\";\n more.className = \"mach-action-btn mach-action-btn--icon\";\n const moreLabel = config.moreLabel ?? \"More actions\";\n more.title = moreLabel;\n more.setAttribute(\"aria-label\", moreLabel);\n more.setAttribute(\"aria-haspopup\", overflowMode === \"drawer\" ? \"dialog\" : \"menu\");\n more.setAttribute(\"aria-expanded\", \"false\");\n more.innerHTML = `${iconSvg(\"more\", 16)}<span class=\"mach-sr-only\">⋯</span>`;\n more.addEventListener(\"mousedown\", (event) => event.stopPropagation());\n more.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n const items = overflow.map((action): SurfaceItem => ({\n label: action.label ?? action.title ?? \"Action\",\n icon: action.icon,\n variant: actionVariant(action),\n disabled: resolveActionFlag(action.disabled, params) || resolveActionFlag(action.loading, params),\n pick: (button) => {\n closeActionSurface();\n run(action, button);\n }\n }));\n if (overflowMode === \"drawer\") showActionDrawer(more, config.drawerTitle ?? moreLabel, items);\n else showActionMenu(more, items);\n });\n wrap.appendChild(more);\n }\n\n return {\n el: wrap,\n destroy: () => {\n if (openActionAnchor && wrap.contains(openActionAnchor)) closeActionSurface();\n }\n };\n };\n}\n\nexport function createRowActionsRenderer<TData = any>(config: RowActionsConfig<TData> = {}): CellRendererFn {\n return (params: CellRendererParams<TData>) => {\n const labels = {\n view: config.labels?.view ?? \"View\",\n edit: config.labels?.edit ?? \"Edit row\",\n delete: config.labels?.delete ?? \"Delete\",\n save: config.labels?.save ?? \"Save row\",\n cancel: config.labels?.cancel ?? \"Cancel row edit\"\n };\n if (params.api.isRowEditing(params.rowIndex)) {\n return createActionButtonsRenderer<TData>({\n actions: [\n { icon: \"check\", title: labels.save, variant: \"primary\", onClick: () => params.api.stopEditingRow(false).then(() => undefined) },\n { icon: \"close\", title: labels.cancel, onClick: () => params.api.stopEditingRow(true).then(() => undefined) }\n ],\n overflow: \"inline\"\n })(params);\n }\n\n const actions: ActionItem<TData>[] = [];\n if (config.onView) actions.push({\n id: \"view\",\n icon: \"view\",\n title: labels.view,\n variant: \"primary\",\n ...(config.permissions?.view ? { permission: config.permissions.view } : {}),\n onClick: config.onView\n });\n if (config.edit !== false) {\n actions.push({\n id: \"edit\",\n icon: \"edit\",\n title: labels.edit,\n variant: \"warning\",\n ...(config.permissions?.edit ? { permission: config.permissions.edit } : {}),\n onClick: () => { params.api.startEditingRow(params.rowIndex); }\n });\n }\n if (config.onDelete) actions.push({\n id: \"delete\",\n icon: \"delete\",\n title: labels.delete,\n variant: \"danger\",\n ...(config.permissions?.delete ? { permission: config.permissions.delete } : {}),\n ...(config.confirmDelete ? { confirm: config.confirmDelete === true ? labels.delete : config.confirmDelete } : {}),\n onClick: config.onDelete\n });\n actions.push(...(config.extraActions ?? []));\n return createActionButtonsRenderer<TData>({\n actions,\n max: config.max,\n overflow: config.overflow ?? \"drawer\",\n moreLabel: config.moreLabel,\n drawerTitle: config.drawerTitle\n })(params);\n };\n}\n\nexport const presetStatusTagRenderer = createStatusTagRenderer();\nexport const presetProgressBarRenderer = createProgressBarRenderer();\n\nexport function registerBuiltinRenderers(register: (name: string, fn: CellRendererFn) => void): void {\n register(\"statusTag\", presetStatusTagRenderer);\n register(\"progressBar\", presetProgressBarRenderer);\n register(\"link\", linkRenderer);\n}\n","import type { CellRendererFn, CellEditorFactory } from \"../types/colDef\";\n\nconst cellRenderers = new Map<string, CellRendererFn>();\nconst cellEditors = new Map<string, CellEditorFactory>();\n\nexport function registerCellRenderer(name: string, renderer: CellRendererFn): () => void {\n const previous = cellRenderers.get(name);\n cellRenderers.set(name, renderer);\n return () => {\n if (cellRenderers.get(name) !== renderer) return;\n if (previous) cellRenderers.set(name, previous);\n else cellRenderers.delete(name);\n };\n}\n\nexport function getCellRenderer(name: string): CellRendererFn | undefined {\n return cellRenderers.get(name);\n}\n\nexport function registerCellEditor(name: string, editor: CellEditorFactory): () => void {\n const previous = cellEditors.get(name);\n cellEditors.set(name, editor);\n return () => {\n if (cellEditors.get(name) !== editor) return;\n if (previous) cellEditors.set(name, previous);\n else cellEditors.delete(name);\n };\n}\n\nexport function getCellEditor(name: string): CellEditorFactory | undefined {\n return cellEditors.get(name);\n}\n\n/** Register a built-in without replacing an application override. */\nexport function ensureCellRenderer(name: string, renderer: CellRendererFn): void {\n if (!cellRenderers.has(name)) cellRenderers.set(name, renderer);\n}\n\nexport function clearComponentRegistries(): void {\n cellRenderers.clear();\n cellEditors.clear();\n}\n","import type { ColDef, ColDefGroup, ColDefOrGroup } from \"../types/colDef\";\nimport { isColDefGroup } from \"../types/colDef\";\nimport { isSafePath } from \"./path\";\n\nexport function validateColumnDefs(defs: (ColDef<any> | ColDefGroup<any>)[] | null | undefined): string[] {\n if (!defs || defs.length === 0) return [];\n const issues: string[] = [];\n const seenIds = new Map<string, number>();\n let leafIndex = 0;\n\n const walk = (list: ColDefOrGroup<any>[], depth: number): void => {\n for (const def of list) {\n if (isColDefGroup(def)) {\n if (!Array.isArray(def.children) || def.children.length === 0) {\n issues.push(`列分组 \"${def.headerName ?? def.groupId ?? \"?\"}\" 的 children 为空`);\n continue;\n }\n walk(def.children, depth + 1);\n continue;\n }\n leafIndex++;\n const id = def.colId ?? def.field ?? `col_${leafIndex}`;\n seenIds.set(id, (seenIds.get(id) ?? 0) + 1);\n\n if (def.field && !isSafePath(def.field)) {\n issues.push(`列 \"${id}\" 的 field 路径不安全或无效,已禁止读取和写入`);\n }\n\n if (!def.field && !def.valueGetter && !def.checkboxSelection && !def.autoRowSpan && !def.rowSpan) {\n issues.push(`列 \"${id}\" 既无 field 也无 valueGetter,将始终显示空值(纯工具列请忽略此提示)`);\n }\n if (def.width != null && def.minWidth != null && def.width < def.minWidth) {\n issues.push(`列 \"${id}\" 的 width(${def.width}) 小于 minWidth(${def.minWidth}),将按 minWidth 渲染`);\n }\n if (def.width != null && def.maxWidth != null && def.width > def.maxWidth) {\n issues.push(`列 \"${id}\" 的 width(${def.width}) 大于 maxWidth(${def.maxWidth}),将按 maxWidth 渲染`);\n }\n }\n };\n\n walk(defs, 0);\n for (const [id, count] of seenIds) {\n if (count > 1) issues.push(`存在 ${count} 个重复的 colId/field \"${id}\",已自动加后缀区分,建议显式命名 colId`);\n }\n return issues;\n}\n","import type { GridOptions } from \"../types/options\";\nimport type { GridEventType } from \"../types/events\";\n\nexport type GridOptionValueKind =\n | \"array\"\n | \"boolean\"\n | \"boolean-object\"\n | \"function\"\n | \"number\"\n | \"object\"\n | \"string\"\n | \"unknown\";\n\nexport type GridOptionUpdateMode = \"columnDefs\" | \"options\" | \"quickFilter\" | \"rowData\";\n\nexport interface GridOptionMetadata {\n /** Runtime value category used by framework adapters. */\n kind: GridOptionValueKind;\n /** How a changed framework prop is forwarded to GridApi. */\n update: GridOptionUpdateMode;\n}\n\ntype EventOptionKey = `on${Capitalize<GridEventType>}`;\nexport type GridOptionKey = Exclude<keyof GridOptions<any>, EventOptionKey>;\n\n/**\n * Runtime single source of truth for every non-event GridOptions property.\n *\n * The mapped `satisfies` type intentionally makes adding a GridOptions field a\n * compile error until its adapter/update behavior is declared here.\n */\nexport const GRID_OPTION_META = {\n columnDefs: { kind: \"array\", update: \"columnDefs\" },\n rowData: { kind: \"array\", update: \"rowData\" },\n defaultColDef: { kind: \"object\", update: \"options\" },\n columnTypes: { kind: \"object\", update: \"options\" },\n getRowId: { kind: \"function\", update: \"options\" },\n rowHeight: { kind: \"number\", update: \"options\" },\n headerHeight: { kind: \"number\", update: \"options\" },\n rowBuffer: { kind: \"number\", update: \"options\" },\n columnLayout: { kind: \"string\", update: \"options\" },\n rowSelection: { kind: \"string\", update: \"options\" },\n multiSort: { kind: \"boolean\", update: \"options\" },\n size: { kind: \"string\", update: \"options\" },\n stripedRows: { kind: \"boolean\", update: \"options\" },\n showCellBorders: { kind: \"boolean\", update: \"options\" },\n theme: { kind: \"string\", update: \"options\" },\n quickFilterText: { kind: \"string\", update: \"quickFilter\" },\n masterDetail: { kind: \"boolean\", update: \"options\" },\n detailRowHeight: { kind: \"number\", update: \"options\" },\n detailRowRenderer: { kind: \"function\", update: \"options\" },\n isRowExpandable: { kind: \"function\", update: \"options\" },\n detailToggleColumn: { kind: \"boolean\", update: \"options\" },\n columnMenu: { kind: \"boolean\", update: \"options\" },\n columnStateKey: { kind: \"string\", update: \"options\" },\n columnStateStore: { kind: \"object\", update: \"options\" },\n aggFuncs: { kind: \"object\", update: \"options\" },\n components: { kind: \"object\", update: \"options\" },\n actionPolicy: { kind: \"object\", update: \"options\" },\n features: { kind: \"array\", update: \"options\" },\n initialState: { kind: \"object\", update: \"options\" },\n locale: { kind: \"object\", update: \"options\" },\n editType: { kind: \"string\", update: \"options\" },\n editableIndicator: { kind: \"string\", update: \"options\" },\n rowEditValidator: { kind: \"function\", update: \"options\" },\n singleClickEdit: { kind: \"boolean\", update: \"options\" },\n manualSorting: { kind: \"boolean\", update: \"options\" },\n manualFiltering: { kind: \"boolean\", update: \"options\" },\n showSummary: { kind: \"boolean\", update: \"options\" },\n summaryMethod: { kind: \"function\", update: \"options\" },\n treeData: { kind: \"boolean\", update: \"options\" },\n childrenKey: { kind: \"string\", update: \"options\" },\n isTreeRowExpandable: { kind: \"function\", update: \"options\" },\n loadTreeChildren: { kind: \"function\", update: \"options\" },\n autoCheckedChildren: { kind: \"boolean\", update: \"options\" },\n defaultExpandAll: { kind: \"boolean\", update: \"options\" },\n indexOffset: { kind: \"number\", update: \"options\" },\n applyRowDrag: { kind: \"boolean\", update: \"options\" },\n undoStackSize: { kind: \"number\", update: \"options\" },\n asyncTransactionWaitMillis: { kind: \"number\", update: \"options\" },\n getRowHeight: { kind: \"function\", update: \"options\" },\n pinnedTopRowData: { kind: \"array\", update: \"options\" },\n pinnedBottomRowData: { kind: \"array\", update: \"options\" },\n pagination: { kind: \"boolean-object\", update: \"options\" },\n watermark: { kind: \"boolean-object\", update: \"options\" },\n suppressWarnings: { kind: \"boolean\", update: \"options\" },\n enableRangeSelection: { kind: \"boolean\", update: \"options\" },\n suppressClipboard: { kind: \"boolean\", update: \"options\" },\n contextMenu: { kind: \"boolean\", update: \"options\" },\n getContextMenuItems: { kind: \"function\", update: \"options\" },\n tooltipComponent: { kind: \"function\", update: \"options\" },\n tooltipShowDelay: { kind: \"number\", update: \"options\" },\n flashCells: { kind: \"boolean\", update: \"options\" },\n fillHandle: { kind: \"boolean\", update: \"options\" },\n statusBar: { kind: \"boolean-object\", update: \"options\" },\n datasource: { kind: \"object\", update: \"options\" },\n blockSize: { kind: \"number\", update: \"options\" },\n infiniteBufferRows: { kind: \"number\", update: \"options\" },\n datasourceRetryCount: { kind: \"number\", update: \"options\" },\n datasourceRetryDelay: { kind: \"number\", update: \"options\" },\n suppressCellFocus: { kind: \"boolean\", update: \"options\" },\n suppressRowHoverHighlight: { kind: \"boolean\", update: \"options\" },\n suppressNoRowsOverlay: { kind: \"boolean\", update: \"options\" },\n suppressHeaderFocus: { kind: \"boolean\", update: \"options\" },\n ariaLabel: { kind: \"string\", update: \"options\" },\n ariaLabelledBy: { kind: \"string\", update: \"options\" },\n ariaDescribedBy: { kind: \"string\", update: \"options\" },\n loading: { kind: \"boolean\", update: \"options\" },\n overlayNoRowsTemplate: { kind: \"unknown\", update: \"options\" },\n overlayLoadingTemplate: { kind: \"unknown\", update: \"options\" },\n allowUnsafeOverlayHtml: { kind: \"boolean\", update: \"options\" },\n className: { kind: \"string\", update: \"options\" }\n} as const satisfies { [K in GridOptionKey]: GridOptionMetadata };\n\nexport const GRID_OPTION_KEYS = Object.freeze(Object.keys(GRID_OPTION_META) as GridOptionKey[]);\n\nexport const DIRECT_GRID_OPTION_KEYS = Object.freeze(\n GRID_OPTION_KEYS.filter((key) => GRID_OPTION_META[key].update === \"options\")\n);\n","import { GRID_OPTION_KEYS } from \"../core/gridOptionMetadata\";\nimport { EVENT_TYPES } from \"../types/events\";\nimport type { GridOptions } from \"../types/options\";\n\nexport type GridValidationCode =\n | \"UNKNOWN_OPTION\"\n | \"INVALID_OPTION_VALUE\"\n | \"OPTION_CONFLICT\"\n | \"MISSING_STABLE_ROW_ID\";\n\nexport interface GridValidationIssue {\n code: GridValidationCode;\n message: string;\n option?: string;\n suggestion?: string;\n}\n\nconst EVENT_OPTION_KEYS = EVENT_TYPES.map((type) => `on${type.charAt(0).toUpperCase()}${type.slice(1)}`);\nconst KNOWN_OPTIONS = new Set<string>([...GRID_OPTION_KEYS, ...EVENT_OPTION_KEYS]);\n\nfunction editDistance(a: string, b: string): number {\n if (a === b) return 0;\n if (a.length === 0) return b.length;\n if (b.length === 0) return a.length;\n let previous = Array.from({ length: b.length + 1 }, (_, index) => index);\n for (let row = 1; row <= a.length; row++) {\n const current = [row];\n for (let column = 1; column <= b.length; column++) {\n current[column] = Math.min(\n current[column - 1] + 1,\n previous[column] + 1,\n previous[column - 1] + (a[row - 1] === b[column - 1] ? 0 : 1)\n );\n }\n previous = current;\n }\n return previous[b.length];\n}\n\nfunction closestOption(input: string): string | undefined {\n let closest: string | undefined;\n let distance = Number.POSITIVE_INFINITY;\n for (const candidate of KNOWN_OPTIONS) {\n const next = editDistance(input.toLowerCase(), candidate.toLowerCase());\n if (next < distance) {\n distance = next;\n closest = candidate;\n }\n }\n const threshold = Math.max(2, Math.floor(input.length * 0.3));\n return distance <= threshold ? closest : undefined;\n}\n\n/** Runtime validation for JavaScript, JSON/schema driven and dynamic options. */\nexport function validateGridOptions(options: Partial<GridOptions<any>> | Record<string, unknown>): GridValidationIssue[] {\n const source = options as Record<string, unknown>;\n const issues: GridValidationIssue[] = [];\n for (const option of Object.keys(source)) {\n if (KNOWN_OPTIONS.has(option)) continue;\n const suggestion = closestOption(option);\n issues.push({\n code: \"UNKNOWN_OPTION\",\n option,\n ...(suggestion ? { suggestion } : {}),\n message: suggestion\n ? `未知 GridOption \"${option}\",是否想使用 \"${suggestion}\"?`\n : `未知 GridOption \"${option}\",该值不会生效`\n });\n }\n\n const pagination = source.pagination;\n if (pagination != null && typeof pagination !== \"boolean\" && typeof pagination !== \"object\") {\n issues.push({ code: \"INVALID_OPTION_VALUE\", option: \"pagination\", message: \"pagination 必须是 boolean 或配置对象\" });\n }\n if (source.datasource != null && pagination !== undefined && pagination !== false) {\n issues.push({\n code: \"OPTION_CONFLICT\",\n option: \"pagination\",\n message: \"datasource 顺序无限模式与 pagination 不能同时启用;普通服务端分页请使用 pagination.mode='server'\"\n });\n }\n if (pagination && typeof pagination === \"object\") {\n const config = pagination as Record<string, unknown>;\n if (config.mode === \"server\" && typeof source.getRowId !== \"function\") {\n issues.push({\n code: \"MISSING_STABLE_ROW_ID\",\n option: \"getRowId\",\n message: \"服务端分页建议提供稳定 getRowId,否则跨页选择与增量更新无法可靠保持\"\n });\n }\n if (config.mode === \"server\" && config.total !== undefined && (\n typeof config.total !== \"number\" || !Number.isFinite(config.total) || config.total < 0\n )) {\n issues.push({\n code: \"INVALID_OPTION_VALUE\",\n option: \"pagination.total\",\n message: \"服务端分页 total 必须是非负有限数\"\n });\n }\n }\n if (source.treeData === true && source.masterDetail === true) {\n issues.push({\n code: \"OPTION_CONFLICT\",\n option: \"masterDetail\",\n message: \"treeData 与 masterDetail 不能同时启用,主从明细将被忽略\"\n });\n }\n return issues;\n}\n","import { EventBus } from \"./eventBus\";\nimport { resolveOptions } from \"./resolveOptions\";\nimport { ColumnModel } from \"../services/columnModel\";\nimport { RowModel } from \"../services/rowModel\";\nimport { SelectionService } from \"../services/selectionService\";\nimport { ResizeService } from \"../services/resizeService\";\nimport { ColumnDragService } from \"../services/columnDragService\";\nimport { KeyboardService } from \"../services/keyboardService\";\nimport { EditingService } from \"../services/editingService\";\nimport { FilterPopupService } from \"../services/filterPopup\";\nimport { ColumnMenuService } from \"../services/columnMenuService\";\nimport { ContextMenuService } from \"../services/contextMenuService\";\nimport { TooltipService } from \"../services/tooltipService\";\nimport { WatermarkService } from \"../services/watermarkService\";\nimport { UndoRedoService } from \"../services/undoRedoService\";\nimport { ChangeTrackingService } from \"../services/changeTrackingService\";\nimport { GridApiImpl } from \"../services/gridApi\";\nimport { GridSkeleton } from \"../render/skeleton\";\nimport { HeaderRenderer } from \"../render/headerRenderer\";\nimport { BodyRenderer } from \"../render/bodyRenderer\";\nimport { SummaryRenderer } from \"../render/summaryRenderer\";\nimport { PaginationBar } from \"../render/paginationBar\";\nimport { PinnedRowsRenderer } from \"../render/pinnedRowsRenderer\";\nimport { StatusBarService } from \"../render/statusBarService\";\nimport { getByPath, setByPath } from \"../lib/path\";\nimport { loadColumnState, saveColumnState } from \"../lib/columnStateStore\";\nimport { registerBuiltinRenderers } from \"../lib/presetRenderers\";\nimport {\n ensureCellRenderer,\n getCellEditor,\n getCellRenderer\n} from \"../lib/componentRegistry\";\nimport { validateColumnDefs } from \"../lib/validateDefs\";\nimport { validateGridOptions } from \"../lib/validateOptions\";\nimport { toTsv, parseTsv, writeClipboard } from \"../lib/clipboard\";\nimport { formatCellValueWith } from \"../render/cellContent\";\nimport { DEFAULT_LOCALE, type RgLocale, type RgLocaleKey } from \"../lib/locale\";\nimport packageJson from \"../../package.json\";\nimport type { ResolvedGridOptions } from \"../types/options\";\nimport type { GridApi, GridDiagnosticError, GridDiagnostics } from \"../types/api\";\nimport type { GridFeature, GridFeatureContext, GridOptions } from \"../types/options\";\nimport type { Column } from \"../services/column\";\nimport type { RowNode } from \"../types/row\";\nimport type { GridErrorCode, GridEventMap, GridEventType } from \"../types/events\";\nimport type {\n CellEditorFactory,\n CellRendererFn,\n ColumnFilter,\n ColumnState,\n ColDef,\n ColDefGroup\n} from \"../types/colDef\";\n\nconst DATA_SOURCE_ERROR_PREFIXES = [\"datasource\", \"treeData\"] as const;\n\ntype ColumnStateLike = ColumnState;\n\nlet gridUid = 0;\nfunction ensureBuiltinRenderers(): void {\n registerBuiltinRenderers(ensureCellRenderer);\n}\n\nexport class GridCore<TData = any> {\n readonly gridId: number;\n readonly options: ResolvedGridOptions<TData>;\n readonly eventBus: EventBus<GridEventMap<TData>>;\n readonly skeleton: GridSkeleton;\n readonly columnModel: ColumnModel;\n readonly rowModel: RowModel<TData>;\n readonly selectionService: SelectionService;\n readonly headerRenderer: HeaderRenderer;\n readonly bodyRenderer: BodyRenderer;\n readonly resizeService: ResizeService;\n readonly columnDragService: ColumnDragService;\n readonly keyboardService: KeyboardService;\n readonly editingService: EditingService;\n readonly undoService: UndoRedoService;\n readonly changeTracker: ChangeTrackingService<TData>;\n readonly filterPopup: FilterPopupService;\n readonly columnMenu: ColumnMenuService;\n readonly contextMenuService: ContextMenuService;\n readonly tooltipService: TooltipService;\n readonly watermarkService: WatermarkService;\n readonly paginationBar: PaginationBar;\n readonly pinnedRowsRenderer: PinnedRowsRenderer;\n readonly summaryRenderer: SummaryRenderer;\n readonly statusBarService: StatusBarService;\n readonly api: GridApi<TData>;\n\n private destroyed = false;\n private autoIdCounter = 0;\n private readyRafId = 0;\n private readySettled = false;\n private readonly readyPromise: Promise<GridApi<TData>>;\n private readonly resolveReady: (api: GridApi<TData>) => void;\n private lastColumnLayoutSignature = \"\";\n private activeFeatures = new Map<string, { feature: GridFeature<TData>; cleanups: Array<() => void> }>();\n private recentErrors: GridDiagnosticError[] = [];\n\n constructor(container: HTMLElement, options: GridOptions<TData>) {\n let settleReady!: (api: GridApi<TData>) => void;\n this.readyPromise = new Promise((resolve) => {\n settleReady = resolve;\n });\n this.resolveReady = settleReady;\n this.gridId = ++gridUid;\n ensureBuiltinRenderers();\n this.options = resolveOptions(options);\n this.eventBus = new EventBus<GridEventMap<TData>>((error, eventType) => {\n if (eventType === \"gridError\") console.error(\"[mach-table] error in gridError listener\", error);\n else this.reportError(error, \"eventBus.listener\", { eventType });\n });\n\n this.columnModel = new ColumnModel(this);\n this.rowModel = new RowModel<TData>(this);\n this.selectionService = new SelectionService(this);\n this.skeleton = new GridSkeleton(this);\n this.headerRenderer = new HeaderRenderer(this);\n this.bodyRenderer = new BodyRenderer(this);\n this.resizeService = new ResizeService(this);\n this.columnDragService = new ColumnDragService(this);\n this.keyboardService = new KeyboardService(this);\n this.editingService = new EditingService(this);\n this.undoService = new UndoRedoService(this);\n this.filterPopup = new FilterPopupService(this);\n this.columnMenu = new ColumnMenuService(this);\n this.contextMenuService = new ContextMenuService(this);\n this.tooltipService = new TooltipService(this);\n this.watermarkService = new WatermarkService(this);\n this.paginationBar = new PaginationBar(this);\n this.pinnedRowsRenderer = new PinnedRowsRenderer(this);\n this.summaryRenderer = new SummaryRenderer(this);\n this.statusBarService = new StatusBarService(this);\n this.api = new GridApiImpl<TData>(this);\n this.changeTracker = new ChangeTrackingService<TData>(this);\n\n try {\n this.changeTracker.init();\n this.skeleton.init(container, this.options);\n this.watermarkService.init();\n this.bodyRenderer.init();\n this.keyboardService.init();\n this.tooltipService.init();\n this.paginationBar.init();\n this.summaryRenderer.init();\n this.statusBarService.init();\n this.pinnedRowsRenderer.init();\n\n this.rowModel.restorePagination(this.options.paginationPage, this.options.paginationPageSize);\n this.columnModel.setColumnDefs(this.options.columnDefs);\n this.refreshAriaState();\n this.validateDefs(this.options.columnDefs);\n this.checkWarnings(options);\n this.loadPersistedColumnState();\n this.headerRenderer.build();\n if (this.options.datasource) {\n void this.rowModel.startInfinite();\n } else {\n this.rowModel.setRowData(this.options.rowData);\n }\n if (this.options.initialState) this.api.applyState(this.options.initialState, { emitEvents: false });\n this.relayout();\n this.pinnedRowsRenderer.setData(this.options.pinnedTopRowData, this.options.pinnedBottomRowData);\n this.setFeatures(this.options.features);\n\n this.readyRafId = requestAnimationFrame(() => {\n this.readyRafId = 0;\n if (!this.destroyed) this.emit(\"gridReady\", {});\n this.settleReady();\n });\n } catch (error) {\n this.reportError(error, \"grid.constructor\");\n this.destroy();\n throw error;\n }\n }\n\n getApi(): GridApi<TData> {\n return this.api;\n }\n\n whenReady(): Promise<GridApi<TData>> {\n return this.readyPromise;\n }\n\n private settleReady(): void {\n if (this.readySettled) return;\n this.readySettled = true;\n this.resolveReady(this.api);\n }\n\n resolveCellRenderer(name: string): CellRendererFn | undefined {\n const local = this.options.components?.cellRenderers?.[name];\n if (local) return local;\n let renderer = getCellRenderer(name);\n if (!renderer) {\n // `clearComponentRegistries` is public for test/HMR isolation; built-ins\n // must remain recoverable for already-created and future grids.\n ensureBuiltinRenderers();\n renderer = getCellRenderer(name);\n }\n return renderer;\n }\n\n resolveCellEditor(name: string): CellEditorFactory | undefined {\n return this.options.components?.cellEditors?.[name] ?? getCellEditor(name);\n }\n\n setFeatures(features: readonly GridFeature<TData>[] | null | undefined): void {\n this.destroyFeatures();\n if (this.destroyed) return;\n\n for (const feature of features ?? []) {\n const key = typeof feature?.key === \"string\" ? feature.key.trim() : \"\";\n if (!key) {\n this.reportError(new Error(\"GridFeature.key must be a non-empty string\"), \"feature.setup\");\n continue;\n }\n if (this.activeFeatures.has(key)) {\n this.reportError(new Error(`Duplicate GridFeature key: ${key}`), \"feature.setup\", { key });\n continue;\n }\n const cleanups: Array<() => void> = [];\n const manage = (cleanup: () => void): (() => void) => {\n let active = true;\n const once = () => {\n if (!active) return;\n active = false;\n cleanup();\n };\n cleanups.push(once);\n return once;\n };\n const context: GridFeatureContext<TData> = {\n api: this.api,\n root: this.skeleton.root,\n getOptions: () => this.options,\n addEventListener: (type, listener) => manage(this.eventBus.on(type, listener)),\n onCleanup: (cleanup) => { manage(cleanup); },\n addManagedDomListener: (target, type, listener, listenerOptions) => {\n target.addEventListener(type, listener, listenerOptions);\n return manage(() => target.removeEventListener(type, listener, listenerOptions));\n },\n setManagedTimeout: (handler, delayMs) => {\n const id = setTimeout(handler, Math.max(0, delayMs));\n manage(() => clearTimeout(id));\n return id;\n },\n createAbortController: () => {\n const controller = new AbortController();\n manage(() => controller.abort());\n return controller;\n },\n reportError: (error, source, details) => this.reportError(error, `feature.${source}`, details)\n };\n try {\n const cleanup = feature.setup(context);\n if (typeof cleanup === \"function\") manage(cleanup);\n this.activeFeatures.set(key, { feature, cleanups });\n } catch (error) {\n for (const cleanup of cleanups.reverse()) {\n try { cleanup(); } catch (cleanupError) {\n this.reportError(cleanupError, \"feature.cleanup\", { key });\n }\n }\n this.reportError(error, \"feature.setup\", { key });\n }\n }\n }\n\n private destroyFeatures(): void {\n const entries = [...this.activeFeatures.entries()].reverse();\n this.activeFeatures.clear();\n for (const [key, active] of entries) {\n for (const cleanup of active.cleanups.reverse()) {\n try {\n cleanup();\n } catch (error) {\n this.reportError(error, \"feature.cleanup\", { key });\n }\n }\n try {\n active.feature.destroy?.();\n } catch (error) {\n this.reportError(error, \"feature.destroy\", { key });\n }\n }\n }\n\n isDestroyed(): boolean {\n return this.destroyed;\n }\n\n nextId(): number {\n return ++this.autoIdCounter;\n }\n\n getCellValue(node: RowNode<any>, column: Column): any {\n const def = column.colDef;\n if (def.valueGetter) {\n try {\n return def.valueGetter({\n api: this.api,\n colDef: def,\n column,\n node,\n data: node.data\n });\n } catch (error) {\n this.reportError(error, \"valueGetter\", { colId: column.id, rowId: node.id });\n return undefined;\n }\n }\n if (def.field) return getByPath(node.data, def.field);\n return undefined;\n }\n\n getLocaleText(key: RgLocaleKey): string {\n const locale: RgLocale = this.options.locale;\n return locale[key] ?? DEFAULT_LOCALE[key];\n }\n\n writeValue(node: RowNode<any>, column: Column, newValue: any, oldValue?: any): boolean {\n const colDef = column.colDef;\n if (colDef.valueSetter) {\n try {\n return colDef.valueSetter({\n oldValue,\n newValue,\n data: node.data!,\n node,\n colDef,\n column,\n api: this.api\n });\n } catch (error) {\n this.reportError(error, \"valueSetter\", { colId: column.id, rowId: node.id });\n return false;\n }\n }\n if (colDef.field) return setByPath(node.data, colDef.field, newValue);\n return false;\n }\n\n setCellValue(node: RowNode<any>, column: Column, newValue: any, oldValue: any): boolean {\n if (newValue === undefined || newValue === oldValue) return false;\n const colDef = column.colDef;\n\n let changed: boolean;\n if (colDef.valueSetter) {\n try {\n changed = colDef.valueSetter({\n oldValue,\n newValue,\n data: node.data!,\n node,\n colDef,\n column,\n api: this.api\n });\n } catch (error) {\n this.reportError(error, \"valueSetter\", { colId: column.id, rowId: node.id });\n return false;\n }\n } else if (colDef.field) {\n changed = setByPath(node.data, colDef.field, newValue);\n } else {\n return false;\n }\n\n if (changed) this.notifyCellValueChanged(node, column, oldValue, newValue);\n return changed;\n }\n\n /** Emits the shared value-change side effects after a caller has written data transactionally. */\n notifyCellValueChanged(node: RowNode<any>, column: Column, oldValue: any, newValue: any): void {\n this.bodyRenderer.invalidateRowHeight(node);\n this.bodyRenderer.queueFlash([node.rowIndex], [column.id]);\n this.emit(\"cellValueChanged\", {\n oldValue,\n newValue,\n rowNode: node,\n rowIndex: node.rowIndex,\n column,\n colDef: column.colDef,\n data: node.data!\n });\n this.undoService.record({ nodeId: node.id, columnId: column.id, oldValue, newValue });\n }\n\n buildRangeTsv(range: { r1: number; c1: number; r2: number; c2: number }): string {\n const flat = this.columnModel.getOrderedVisible();\n const cols = flat.slice(range.c1, range.c2 + 1);\n const rows: string[][] = [];\n for (let r = range.r1; r <= range.r2; r++) {\n const node = this.rowModel.getDisplayedRow(r);\n rows.push(\n cols.map((col) => {\n if (!node || node.isDetail || node.isGroup) return \"\";\n return formatCellValueWith(this, node, col, this.getCellValue(node, col));\n })\n );\n }\n return toTsv(rows);\n }\n\n copyActiveRange(): Promise<boolean> {\n const range = this.bodyRenderer.getNormalizedRangeOrFocus();\n if (!range) return Promise.resolve(false);\n return writeClipboard(this.buildRangeTsv(range));\n }\n\n clearRangeValues(range: { r1: number; c1: number; r2: number; c2: number }): void {\n if (this.destroyed) return;\n const flat = this.columnModel.getOrderedVisible();\n const changedRows = new Set<number>();\n this.undoService.beginBatch();\n try {\n for (let r = range.r1; r <= range.r2; r++) {\n const node = this.rowModel.getDisplayedRow(r);\n if (!node || node.isDetail || node.isGroup) continue;\n for (let c = range.c1; c <= range.c2; c++) {\n const col = flat[c];\n if (!col || col.hasCheckbox || col.isDetailToggle || col.colDef.rowDrag) continue;\n if (!this.editingService.isEditable(node, col)) continue;\n const old = this.getCellValue(node, col);\n if (this.setCellValue(node, col, null, old)) changedRows.add(r);\n }\n }\n } finally {\n this.undoService.endBatch();\n }\n if (changedRows.size > 0) {\n this.bodyRenderer.refreshRows([...changedRows]);\n this.summaryRenderer.refresh();\n }\n }\n\n pasteText(text: string, startRow: number, startColIdx: number): void {\n if (this.destroyed) return;\n const grid = parseTsv(text);\n if (grid.length === 0) return;\n const flat = this.columnModel.getOrderedVisible();\n const rowCount = this.rowModel.getDisplayedRowCount();\n const changedRows = new Set<number>();\n let r = startRow;\n\n this.undoService.beginBatch();\n try {\n for (const line of grid) {\n while (r < rowCount) {\n const node = this.rowModel.getDisplayedRow(r);\n if (node && !node.isDetail && !node.isGroup) break;\n r++;\n }\n if (r >= rowCount) break;\n const node = this.rowModel.getDisplayedRow(r)!;\n let c = startColIdx;\n for (const token of line) {\n while (c < flat.length) {\n const skip = flat[c] && (flat[c].hasCheckbox || flat[c].isDetailToggle || flat[c].colDef.rowDrag);\n if (!skip) break;\n c++;\n }\n if (c >= flat.length) break;\n const col = flat[c];\n if (this.editingService.isEditable(node, col)) {\n const old = this.getCellValue(node, col);\n let value: any = token;\n if (token === \"\") {\n value = null;\n } else if (typeof old === \"number\" && !isNaN(Number(token))) {\n value = Number(token);\n }\n if (this.setCellValue(node, col, value, old)) changedRows.add(r);\n }\n c++;\n }\n r++;\n }\n } finally {\n this.undoService.endBatch();\n }\n\n if (changedRows.size > 0) {\n this.bodyRenderer.refreshRows([...changedRows]);\n this.summaryRenderer.refresh();\n }\n }\n\n pasteFromSystemClipboard(): Promise<void> {\n const start = this.bodyRenderer.getPasteStart();\n if (!start) return Promise.resolve();\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.readText) {\n return navigator.clipboard\n .readText()\n .then((text) => {\n if (text) this.pasteText(text, start.row, start.colIdx);\n })\n .catch(() => undefined);\n }\n } catch {\n void 0;\n }\n return Promise.resolve();\n }\n\n refreshSummary(): void {\n this.summaryRenderer.refresh();\n }\n\n emit<K extends GridEventType>(type: K, extra?: Partial<GridEventMap<TData>[K]>): GridEventMap<TData>[K] {\n const event = { type, api: this.api, ...extra } as GridEventMap<TData>[K];\n this.eventBus.emit(type, event);\n const handlerKey = (\"on\" + type.charAt(0).toUpperCase() + type.slice(1)) as keyof ResolvedGridOptions<TData>;\n const handler = this.options[handlerKey] as unknown as\n | ((event: GridEventMap<TData>[K]) => void)\n | undefined;\n if (typeof handler === \"function\") {\n try {\n handler(event);\n } catch (error) {\n if (type === \"gridError\") console.error(\"[mach-table] error in onGridError\", error);\n else this.reportError(error, `eventHandler.${String(handlerKey)}`, { eventType: type });\n }\n }\n return event;\n }\n\n reportError(error: unknown, source: string, context?: Record<string, unknown>): void {\n const code = this.errorCodeFor(source, error);\n const message = error instanceof Error ? error.message : String(error);\n this.recentErrors.push({ code, source, message, timestamp: Date.now(), ...(context ? { context } : {}) });\n if (this.recentErrors.length > 50) this.recentErrors.splice(0, this.recentErrors.length - 50);\n console.error(`[mach-table] ${code} (${source})`, error);\n if (this.destroyed) return;\n this.emit(\"gridError\", { code, error, source, context });\n }\n\n private errorCodeFor(source: string, error: unknown): GridErrorCode {\n if (DATA_SOURCE_ERROR_PREFIXES.some((prefix) => source.startsWith(prefix))) return \"DATA_SOURCE_ERROR\";\n const message = error instanceof Error ? error.message : String(error);\n if (source === \"getRowId\" || message.includes(\"Duplicate row id\")) return \"DATA_INTEGRITY_ERROR\";\n if (source === \"validate\") return \"VALIDATION_ERROR\";\n if (\n source.toLowerCase().includes(\"renderer\") ||\n source === \"valueFormatter\" ||\n source === \"cellStyle\" ||\n source === \"cellClass\"\n ) return \"RENDERER_ERROR\";\n if (source.toLowerCase().includes(\"editor\") || source === \"editable\") return \"EDITOR_ERROR\";\n if (source.startsWith(\"feature.\")) return \"FEATURE_ERROR\";\n if (source.startsWith(\"columnState.\")) return \"STATE_ERROR\";\n if (source.startsWith(\"eventBus.\") || source.startsWith(\"eventHandler.\")) return \"EVENT_HANDLER_ERROR\";\n return \"GRID_ERROR\";\n }\n\n getDiagnostics(): GridDiagnostics {\n return {\n gridId: this.gridId,\n version: packageJson.version,\n destroyed: this.destroyed,\n infinite: this.rowModel.isInfinite,\n loading: this.rowModel.isLoadingInfinite() || this.options.loading,\n rowCount: this.rowModel.getDisplayTotalCount(),\n renderedRowCount: this.skeleton.bodyEl.querySelectorAll(\".mach-row[data-index]\").length,\n columnCount: this.columnModel.getColumns().length,\n selectedRowCount: this.selectionService.getSelectedNodes().length,\n dirtyRowCount: this.changeTracker.getDirtyRowIds().length,\n recentErrors: this.recentErrors.map((entry) => ({\n ...entry,\n ...(entry.context ? { context: { ...entry.context } } : {})\n }))\n };\n }\n\n cycleSort(column: Column, additive: boolean): void {\n this.columnModel.cycleSort(column, additive);\n this.applySortModel();\n }\n\n applySortModel(): void {\n this.headerRenderer.refreshSortIndicators();\n this.emit(\"sortChanged\", { sortModel: this.columnModel.getSortModel() });\n this.persistColumnState();\n if (this.rowModel.isInfinite) {\n void this.rowModel.onServerParamsChanged();\n return;\n }\n this.rowModel.refreshPipeline();\n this.bodyRenderer.onDataChanged();\n }\n\n applyColumnFilter(column: Column, filter: ColumnFilter | null): void {\n const model = this.rowModel.getFilterModel();\n if (filter) model[column.id] = filter;\n else delete model[column.id];\n this.rowModel.setFilterModel(model);\n this.headerRenderer.refreshFilterIcons();\n this.emit(\"filterChanged\", { filterModel: this.rowModel.getFilterModel() });\n if (this.rowModel.isInfinite) {\n void this.rowModel.onServerParamsChanged();\n return;\n }\n this.rowModel.refreshPipeline();\n this.bodyRenderer.onDataChanged();\n }\n\n applyQuickFilter(): void {\n this.emit(\"filterChanged\", { filterModel: this.rowModel.getFilterModel() });\n if (this.rowModel.isInfinite) {\n void this.rowModel.onServerParamsChanged();\n return;\n }\n this.rowModel.refreshPipeline();\n this.bodyRenderer.onDataChanged();\n }\n\n moveColumn(colId: string, toIndex: number): void {\n if (!this.columnModel.moveColumn(colId, toIndex)) return;\n this.onColumnsStructureChanged();\n this.emit(\"columnMoved\", { colId, toIndex });\n this.persistColumnState();\n }\n\n toggleDetail(rowId: string): boolean {\n return this.rowModel.toggleDetail(rowId);\n }\n\n private stateLoadToken = 0;\n\n loadPersistedColumnState(): void {\n const token = ++this.stateLoadToken;\n if (!this.options.columnStateKey) return;\n let saved: ColumnStateLike[] | null | Promise<ColumnStateLike[] | null>;\n try {\n saved = this.options.columnStateStore\n ? this.options.columnStateStore.load(this.options.columnStateKey)\n : loadColumnState(this.options.columnStateKey);\n } catch (error) {\n this.reportError(error, \"columnState.load\");\n return;\n }\n if (saved == null) return;\n if (!Array.isArray(saved)) {\n Promise.resolve(saved)\n .then((states) => {\n if (this.destroyed || token !== this.stateLoadToken || !states || states.length === 0) return;\n this.columnModel.applyColumnState(states);\n if (this.rowModel.isInfinite) void this.rowModel.onServerParamsChanged();\n else this.rowModel.refreshPipeline();\n this.onColumnsStructureChanged();\n })\n .catch((error) => this.reportError(error, \"columnState.load\"));\n return;\n }\n if (saved.length > 0) {\n this.columnModel.applyColumnState(saved);\n }\n }\n\n persistColumnState(): void {\n if (!this.options.columnStateKey || this.destroyed) return;\n const state = this.columnModel.getColumnState();\n try {\n const result = this.options.columnStateStore\n ? this.options.columnStateStore.save(this.options.columnStateKey, state)\n : saveColumnState(this.options.columnStateKey, state);\n if (result && typeof result.catch === \"function\") {\n void result.catch((error) => this.reportError(error, \"columnState.save\"));\n }\n } catch (error) {\n this.reportError(error, \"columnState.save\");\n }\n }\n\n buildDefaultEmptyState(): HTMLElement {\n const locale = this.options.locale ?? {};\n const title = locale.emptyRows ?? DEFAULT_LOCALE.emptyRows;\n const hint = locale.emptyRowsHint ?? DEFAULT_LOCALE.emptyRowsHint;\n const empty = document.createElement(\"div\");\n empty.className = \"mach-empty\";\n\n const icon = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n icon.setAttribute(\"class\", \"mach-empty__icon\");\n icon.setAttribute(\"viewBox\", \"0 0 96 84\");\n icon.setAttribute(\"width\", \"96\");\n icon.setAttribute(\"height\", \"84\");\n icon.setAttribute(\"fill\", \"none\");\n icon.setAttribute(\"aria-hidden\", \"true\");\n // Static library-owned SVG only; user-controlled text is assigned via textContent below.\n icon.innerHTML =\n '<rect x=\"8\" y=\"10\" width=\"68\" height=\"56\" rx=\"6\" fill=\"#eaf3fe\"/>' +\n '<rect x=\"8\" y=\"10\" width=\"68\" height=\"12\" rx=\"6\" fill=\"#d5e8fd\"/>' +\n '<rect x=\"8\" y=\"19\" width=\"68\" height=\"3\" fill=\"#d5e8fd\"/>' +\n '<g stroke=\"#bcd7f8\" stroke-width=\"2.4\" stroke-linecap=\"round\">' +\n '<line x1=\"16\" y1=\"32\" x2=\"68\" y2=\"32\"/><line x1=\"16\" y1=\"42\" x2=\"60\" y2=\"42\"/>' +\n '<line x1=\"16\" y1=\"52\" x2=\"64\" y2=\"52\"/></g>' +\n '<circle cx=\"66\" cy=\"52\" r=\"15\" fill=\"#ffffff\" stroke=\"#8fbdf5\" stroke-width=\"3\"/>' +\n '<line x1=\"77\" y1=\"63\" x2=\"86\" y2=\"72\" stroke=\"#8fbdf5\" stroke-width=\"4\" stroke-linecap=\"round\"/>' +\n '<line x1=\"60\" y1=\"52\" x2=\"72\" y2=\"52\" stroke=\"#bcd7f8\" stroke-width=\"2.6\" stroke-linecap=\"round\"/>';\n\n const titleEl = document.createElement(\"div\");\n titleEl.className = \"mach-empty__title\";\n titleEl.textContent = title;\n const hintEl = document.createElement(\"div\");\n hintEl.className = \"mach-empty__hint\";\n hintEl.textContent = hint;\n empty.append(icon, titleEl, hintEl);\n return empty;\n }\n\n private lastValidatedDefs: unknown = null;\n private issuedWarningSignatures = new Set<string>();\n\n checkWarnings(inputOptions?: Partial<GridOptions<any>> | Record<string, unknown>): void {\n if (this.options.suppressWarnings || this.destroyed) return;\n if (inputOptions) {\n for (const issue of validateGridOptions(inputOptions)) {\n const signature = `${issue.code}:${issue.option ?? \"\"}:${issue.message}`;\n if (this.issuedWarningSignatures.has(signature)) continue;\n this.issuedWarningSignatures.add(signature);\n console.warn(`[mach-table:${issue.code}] ${issue.message}`);\n }\n }\n if (this.options.treeData) {\n if (this.columnModel.getRowGroupColumns().length > 0) {\n console.warn(\"[mach-table] treeData 与 rowGroup 不支持同时启用,行分组已被忽略\");\n }\n }\n }\n\n validateDefs(defs: (ColDef<any> | ColDefGroup<any>)[] | null | undefined): void {\n if (this.options.suppressWarnings || this.destroyed) return;\n if (this.lastValidatedDefs === defs) return;\n this.lastValidatedDefs = defs;\n for (const issue of validateColumnDefs(defs)) {\n if (this.issuedWarningSignatures.has(issue)) continue;\n this.issuedWarningSignatures.add(issue);\n console.warn(`[mach-table] ${issue}`);\n }\n }\n\n onColumnsStructureChanged(): void {\n this.checkWarnings();\n this.validateDefs(this.columnModel.getColumnDefs());\n this.bodyRenderer.invalidateAllRowHeights();\n this.headerRenderer.build();\n this.bodyRenderer.rebuildPool();\n this.relayout();\n this.pinnedRowsRenderer.rebuild();\n this.summaryRenderer.refresh();\n this.emit(\"displayedColumnsChanged\", {});\n }\n\n relayout(): void {\n if (this.destroyed) return;\n this.refreshAriaState();\n this.columnModel.computeLayout(this.skeleton.measureViewportWidth());\n const widthSignature = this.columnModel.getOrderedVisible()\n .map((column) => `${column.id}:${column.currentWidth}`)\n .join(\"|\");\n if (this.lastColumnLayoutSignature && widthSignature !== this.lastColumnLayoutSignature) {\n this.bodyRenderer.invalidateAllRowHeights();\n }\n this.lastColumnLayoutSignature = widthSignature;\n this.skeleton.root.setAttribute(\"aria-colcount\", String(this.columnModel.getOrderedVisible().length));\n this.headerRenderer.applyLayout();\n this.bodyRenderer.relayout();\n this.pinnedRowsRenderer.applyLayout();\n this.summaryRenderer.refresh();\n }\n\n refreshAriaState(): void {\n if (!this.skeleton.root) return;\n const treeGrid = this.options.treeData || this.columnModel.getRowGroupColumns().length > 0;\n this.skeleton.root.setAttribute(\"role\", treeGrid ? \"treegrid\" : \"grid\");\n if (this.options.rowSelection === \"multiple\") {\n this.skeleton.root.setAttribute(\"aria-multiselectable\", \"true\");\n } else {\n this.skeleton.root.removeAttribute(\"aria-multiselectable\");\n }\n const editable = this.columnModel.getOrderedVisible().some((column) => Boolean(column.colDef.editable));\n if (editable) this.skeleton.root.removeAttribute(\"aria-readonly\");\n else this.skeleton.root.setAttribute(\"aria-readonly\", \"true\");\n }\n\n relayoutColumns(invalidateRowHeights = true): void {\n if (this.destroyed) return;\n this.columnModel.computeLayout(this.skeleton.measureViewportWidth());\n if (invalidateRowHeights) this.bodyRenderer.invalidateAllRowHeights();\n this.headerRenderer.applyLayout();\n this.bodyRenderer.applyContainerSizes();\n this.bodyRenderer.applyCellLayout();\n this.bodyRenderer.updateRange(true);\n this.pinnedRowsRenderer.applyLayout();\n this.summaryRenderer.refresh();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n if (this.readyRafId) cancelAnimationFrame(this.readyRafId);\n this.readyRafId = 0;\n this.settleReady();\n const safely = (source: string, fn: () => void): void => {\n try {\n fn();\n } catch (error) {\n console.error(`[mach-table] ${source} destroy error`, error);\n }\n };\n safely(\"grid event\", () => this.emit(\"gridDestroyed\", {}));\n safely(\"features\", () => this.destroyFeatures());\n safely(\"changeTracker\", () => this.changeTracker.destroy());\n safely(\"rowModel\", () => this.rowModel.destroy());\n safely(\"editingService\", () => this.editingService.destroy());\n safely(\"keyboardService\", () => this.keyboardService.destroy());\n safely(\"filterPopup\", () => this.filterPopup.destroy());\n safely(\"columnMenu\", () => this.columnMenu.destroy());\n safely(\"contextMenu\", () => this.contextMenuService.destroy());\n safely(\"tooltip\", () => this.tooltipService.destroy());\n safely(\"watermark\", () => this.watermarkService.destroy());\n safely(\"pagination\", () => this.paginationBar.destroy());\n safely(\"columnDrag\", () => this.columnDragService.destroy());\n safely(\"resize\", () => this.resizeService.destroy());\n safely(\"bodyRenderer\", () => this.bodyRenderer.destroy());\n safely(\"headerRenderer\", () => this.headerRenderer.destroy());\n safely(\"pinnedRowsRenderer\", () => this.pinnedRowsRenderer.destroy());\n safely(\"summaryRenderer\", () => this.summaryRenderer.destroy());\n safely(\"statusBar\", () => this.statusBarService.destroy());\n safely(\"skeleton\", () => this.skeleton.destroy());\n this.eventBus.clear();\n }\n}\n","import { GridCore } from \"./gridCore\";\nimport type { GridApi, GridOptions } from \"../types\";\n\nexport function createGrid<TData = any>(container: HTMLElement, options: GridOptions<TData> = {}): GridApi<TData> {\n if (!container) {\n throw new Error(\"[mach-table] createGrid requires a container element\");\n }\n if (typeof document === \"undefined\") {\n throw new Error(\"[mach-table] createGrid can only be used in a browser environment\");\n }\n const core = new GridCore<TData>(container, options);\n return core.getApi();\n}\n","import type { ColDef, ColDefGroup } from \"../types/colDef\";\n\nexport type GridSchemaFieldType = \"string\" | \"number\" | \"date\" | \"select\" | \"boolean\";\n\nexport interface SchemaSelectOption {\n label: string;\n value: string | number;\n}\n\nexport interface GridSchemaField {\n field: string;\n title?: string;\n type?: GridSchemaFieldType;\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n flex?: number;\n pinned?: \"left\" | \"right\";\n editable?: boolean;\n sortable?: boolean;\n filterable?: boolean;\n resizable?: boolean;\n hidden?: boolean;\n options?: SchemaSelectOption[];\n format?: \"date\" | \"datetime\";\n cellClass?: string | string[];\n}\n\nexport interface GridSchemaGroup {\n title: string;\n fields: string[];\n}\n\nexport interface GridSchema {\n fields: GridSchemaField[];\n groups?: GridSchemaGroup[];\n}\n\nfunction booleanFormatter(p: { value: any }): string {\n if (p.value === true) return \"是\";\n if (p.value === false) return \"否\";\n return \"\";\n}\n\nfunction dateFormatter(format: \"date\" | \"datetime\" | undefined): (p: { value: any }) => string {\n return (p) => {\n if (p.value == null || p.value === \"\") return \"\";\n const text = p.value instanceof Date ? p.value.toISOString() : String(p.value);\n return format === \"datetime\" ? text.slice(0, 16).replace(\"T\", \" \") : text.slice(0, 10);\n };\n}\n\nfunction selectFormatter(options: SchemaSelectOption[]): (p: { value: any }) => string {\n return (p) => {\n if (p.value == null) return \"\";\n const hit = options.find((o) => o.value === p.value);\n return hit ? hit.label : String(p.value);\n };\n}\n\nfunction fieldToColDef(field: GridSchemaField): ColDef<any> {\n const type = field.type ?? \"string\";\n const colDef: ColDef<any> = {\n colId: field.field,\n field: field.field,\n headerName: field.title ?? field.field,\n width: field.width,\n minWidth: field.minWidth,\n maxWidth: field.maxWidth,\n flex: field.flex,\n pinned: field.pinned ?? undefined,\n hide: field.hidden ?? false,\n editable: field.editable ?? false,\n sortable: field.sortable ?? true,\n resizable: field.resizable ?? true,\n filter: field.filterable === false ? false : type === \"number\" ? \"number\" : type === \"date\" ? \"date\" : type === \"select\" ? \"set\" : \"text\",\n cellClass: field.cellClass\n };\n\n if (type === \"number\") {\n colDef.type = \"rightAligned\";\n } else if (type === \"date\") {\n colDef.valueFormatter = dateFormatter(field.format);\n } else if (type === \"boolean\") {\n colDef.valueFormatter = booleanFormatter;\n colDef.filter = field.filterable === false ? false : \"set\";\n } else if (type === \"select\") {\n const options = field.options ?? [];\n colDef.valueFormatter = selectFormatter(options);\n if (field.editable) {\n colDef.cellEditor = \"select\";\n colDef.cellEditorParams = { values: options.map((o) => o.value) };\n }\n }\n\n return colDef;\n}\n\nexport function buildColDefsFromSchema<TData = any>(\n schema: GridSchema\n): (ColDef<TData> | ColDefGroup<TData>)[] {\n const byField = new Map(schema.fields.map((f) => [f.field, f]));\n const used = new Set<string>();\n const result: (ColDef<TData> | ColDefGroup<TData>)[] = [];\n\n for (const field of schema.fields) {\n if (used.has(field.field)) continue;\n const grouped = (schema.groups ?? []).some((g) => g.fields.includes(field.field));\n if (!grouped) {\n result.push(fieldToColDef(field));\n used.add(field.field);\n }\n }\n\n for (const group of schema.groups ?? []) {\n const children: ColDef<TData>[] = [];\n for (const fieldName of group.fields) {\n const field = byField.get(fieldName);\n if (!field || used.has(fieldName)) continue;\n children.push(fieldToColDef(field));\n used.add(fieldName);\n }\n if (children.length > 0) {\n result.push({ headerName: group.title, children });\n }\n }\n\n return result;\n}\n","import type { ColDef } from \"../types/colDef\";\nimport type { ActionButtonsConfig, RowActionsConfig } from \"./presetRenderers\";\nimport { createActionButtonsRenderer, createRowActionsRenderer } from \"./presetRenderers\";\n\nconst NO_INTERACT = {\n sortable: false,\n resizable: false,\n movable: false,\n filter: false,\n suppressSizeToFit: true\n} as const;\n\nexport function selectionColumn<TData = any>(overrides: Partial<ColDef<TData>> = {}): ColDef<TData> {\n return {\n colId: \"sel\",\n headerName: \"\",\n width: 46,\n pinned: \"left\",\n checkboxSelection: true,\n ...NO_INTERACT,\n ...overrides\n };\n}\n\nexport function indexColumn<TData = any>(overrides: Partial<ColDef<TData>> = {}): ColDef<TData> {\n return {\n colId: \"idx\",\n headerName: \"#\",\n type: \"index\",\n width: 60,\n pinned: \"left\",\n ...NO_INTERACT,\n ...overrides\n };\n}\n\nexport function dragColumn<TData = any>(overrides: Partial<ColDef<TData>> = {}): ColDef<TData> {\n return {\n colId: \"drag\",\n headerName: \"\",\n rowDrag: true,\n width: 40,\n ...NO_INTERACT,\n ...overrides\n };\n}\n\nexport function actionsColumn<TData = any>(\n config: ActionButtonsConfig<TData> & { width?: number; pinned?: \"left\" | \"right\" } = { actions: [] }\n): ColDef<TData> {\n const { width, pinned, ...rendererConfig } = config;\n const count = rendererConfig.actions?.length ?? 0;\n const shown = rendererConfig.overflow === \"inline\" ? count : Math.min(count, rendererConfig.max ?? 3);\n const hasMore = rendererConfig.overflow !== \"inline\" && count > shown;\n const defaultWidth = Math.max(1, shown) * 26 + (hasMore ? 26 : 0) + 10;\n return {\n colId: \"op\",\n headerName: \"操作\",\n width: width ?? Math.max(64, defaultWidth),\n pinned: pinned ?? \"right\",\n cellRenderer: createActionButtonsRenderer(rendererConfig),\n ...NO_INTERACT,\n cellRendererParams: undefined\n };\n}\n\nexport function rowActionsColumn<TData = any>(\n config: RowActionsConfig<TData> & { width?: number; pinned?: \"left\" | \"right\" } = {}\n): ColDef<TData> {\n const { width, pinned, ...rendererConfig } = config;\n const count =\n (rendererConfig.onView ? 1 : 0) +\n (rendererConfig.edit === false ? 0 : 1) +\n (rendererConfig.onDelete ? 1 : 0) +\n (rendererConfig.extraActions?.length ?? 0);\n const shown = rendererConfig.overflow === \"inline\" ? count : Math.min(count, rendererConfig.max ?? 3);\n const hasMore = rendererConfig.overflow !== \"inline\" && count > shown;\n const defaultWidth = Math.max(2, shown) * 26 + (hasMore ? 26 : 0) + 10;\n return {\n colId: \"op\",\n headerName: \"操作\",\n width: width ?? Math.max(72, defaultWidth),\n pinned: pinned ?? \"right\",\n cellRenderer: createRowActionsRenderer(rendererConfig),\n ...NO_INTERACT,\n cellRendererParams: undefined\n };\n}\n","import type { ColDef, ColDefGroup } from \"../types/colDef\";\n\ntype Callable = (...args: never[]) => unknown;\ntype Primitive = string | number | boolean | bigint | symbol | null | undefined | Date | Callable;\ntype Depth = 0 | 1 | 2 | 3 | 4;\ntype Previous = { 0: 0; 1: 0; 2: 1; 3: 2; 4: 3 };\n\nexport type FieldPath<T, D extends Depth = 4> = D extends 0\n ? never\n : T extends Primitive\n ? never\n : {\n [K in keyof T & string]: NonNullable<T[K]> extends Primitive | readonly unknown[]\n ? K\n : K | `${K}.${FieldPath<NonNullable<T[K]>, Previous[D]>}`;\n }[keyof T & string];\n\nexport type FieldPathValue<T, P extends string> = P extends keyof T\n ? T[P]\n : P extends `${infer Head}.${infer Tail}`\n ? Head extends keyof T\n ? FieldPathValue<NonNullable<T[Head]>, Tail>\n : unknown\n : unknown;\n\nexport interface ColumnHelper<TData> {\n accessor<TPath extends FieldPath<TData>>(\n field: TPath,\n definition?: Omit<ColDef<TData, FieldPathValue<TData, TPath>>, \"field\">\n ): ColDef<TData, FieldPathValue<TData, TPath>>;\n display<TValue = unknown>(\n definition: Omit<ColDef<TData, TValue>, \"field\"> & Required<Pick<ColDef<TData, TValue>, \"colId\">>\n ): ColDef<TData, TValue>;\n group(definition: ColDefGroup<TData>): ColDefGroup<TData>;\n}\n\n/** Creates strongly typed column definitions without repeating TData/TValue. */\nexport function createColumnHelper<TData>(): ColumnHelper<TData> {\n return {\n accessor: (field, definition = {}) => ({ ...definition, field }),\n display: (definition) => ({ ...definition }),\n group: (definition) => ({ ...definition, children: [...definition.children] })\n };\n}\n\n/** Identity helper that retains literal types while checking GridOptions elsewhere. */\nexport function defineColumns<TData>(columns: readonly (ColDef<TData> | ColDefGroup<TData>)[]): (ColDef<TData> | ColDefGroup<TData>)[] {\n return [...columns];\n}\n","import type { GridOptions } from \"../types/options\";\n\nfunction mergeSwitchableObject<T extends object>(\n base: boolean | T | undefined,\n next: boolean | T | undefined\n): boolean | T | undefined {\n if (next === undefined) return base;\n if (typeof next !== \"object\" || next === null || typeof base !== \"object\" || base === null) return next;\n return { ...base, ...next };\n}\n\nfunction composeHandlers(base: unknown, next: unknown): unknown {\n if (typeof base !== \"function\") return next;\n if (typeof next !== \"function\") return base;\n return (...args: unknown[]) => {\n let firstError: unknown;\n try {\n base(...args);\n } catch (error) {\n firstError = error;\n }\n try {\n next(...args);\n } catch (error) {\n firstError ??= error;\n }\n if (firstError !== undefined) throw firstError;\n };\n}\n\nfunction mergeOptions<TData>(base: GridOptions<TData>, next: Partial<GridOptions<TData>>): GridOptions<TData> {\n const merged: GridOptions<TData> = {\n ...base,\n ...next,\n features: next.features ?? base.features\n };\n if (base.defaultColDef || next.defaultColDef) {\n merged.defaultColDef = { ...base.defaultColDef, ...next.defaultColDef };\n }\n if (base.locale || next.locale) {\n merged.locale = { ...base.locale, ...next.locale };\n }\n if (base.components || next.components) {\n merged.components = {\n cellRenderers: { ...base.components?.cellRenderers, ...next.components?.cellRenderers },\n cellEditors: { ...base.components?.cellEditors, ...next.components?.cellEditors }\n };\n }\n if (base.columnTypes || next.columnTypes) {\n const columnTypes: Record<string, Record<string, unknown>> = {};\n for (const name of new Set([...Object.keys(base.columnTypes ?? {}), ...Object.keys(next.columnTypes ?? {})])) {\n columnTypes[name] = {\n ...(base.columnTypes?.[name] as Record<string, unknown> | undefined),\n ...(next.columnTypes?.[name] as Record<string, unknown> | undefined)\n };\n }\n merged.columnTypes = columnTypes;\n }\n if (base.aggFuncs || next.aggFuncs) {\n merged.aggFuncs = { ...base.aggFuncs, ...next.aggFuncs };\n }\n merged.pagination = mergeSwitchableObject(base.pagination, next.pagination);\n merged.statusBar = mergeSwitchableObject(base.statusBar, next.statusBar);\n merged.watermark = mergeSwitchableObject(base.watermark, next.watermark);\n\n for (const key of new Set([...Object.keys(base), ...Object.keys(next)])) {\n if (!/^on[A-Z]/.test(key)) continue;\n const previousHandler = (base as Record<string, unknown>)[key];\n const nextHandler = (next as Record<string, unknown>)[key];\n if (typeof previousHandler === \"function\" && typeof nextHandler === \"function\") {\n (merged as Record<string, unknown>)[key] = composeHandlers(previousHandler, nextHandler);\n }\n }\n return merged;\n}\n\n/** Merges reusable defaults left-to-right with nested defaults handled safely. */\nexport function createMachTablePreset<TData>(\n ...sources: readonly Partial<GridOptions<TData>>[]\n): GridOptions<TData> {\n return sources.reduce<GridOptions<TData>>(mergeOptions, {});\n}\n\n/** Recommended defaults for editable enterprise back-office screens. */\nexport function createEnterprisePreset<TData>(\n overrides: Partial<GridOptions<TData>> = {}\n): GridOptions<TData> {\n return createMachTablePreset<TData>({\n defaultColDef: { sortable: true, resizable: true, movable: true, filter: true },\n rowSelection: \"multiple\",\n columnMenu: true,\n contextMenu: true,\n enableRangeSelection: true,\n fillHandle: true,\n statusBar: true,\n stripedRows: true\n }, overrides);\n}\n\n/** Compile-time helper for a reusable partial preset. */\nexport function defineMachTablePreset<TData>(\n preset: Partial<GridOptions<TData>>\n): Partial<GridOptions<TData>> {\n return preset;\n}\n\n/** Compile-time helper for reusable, typed grid option objects. */\nexport function defineGridOptions<TData>(options: GridOptions<TData>): GridOptions<TData> {\n return options;\n}\n","import type { ColDef, CellRendererFn } from \"../types/colDef\";\n\nexport type BusinessColumnType =\n | \"text\"\n | \"number\"\n | \"integer\"\n | \"money\"\n | \"percent\"\n | \"percentage\"\n | \"date\"\n | \"datetime\"\n | \"boolean\"\n | \"status\"\n | \"link\";\n\nexport interface BusinessColumnTypeOptions {\n locale?: string | readonly string[];\n currency?: string;\n currencyDisplay?: \"symbol\" | \"narrowSymbol\" | \"code\" | \"name\";\n timeZone?: string;\n emptyText?: string;\n invalidText?: string;\n trueText?: string;\n falseText?: string;\n maximumFractionDigits?: number;\n}\n\nfunction present(value: unknown): boolean {\n return value !== null && value !== undefined && value !== \"\";\n}\n\nfunction numeric(value: unknown): number | null {\n if (!present(value)) return null;\n const result = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(result) ? result : null;\n}\n\nfunction safeNumberFormat(\n locale: string | readonly string[] | undefined,\n options: Intl.NumberFormatOptions\n): Intl.NumberFormat {\n try {\n return new Intl.NumberFormat(locale as string | string[] | undefined, options);\n } catch {\n return new Intl.NumberFormat(undefined, options);\n }\n}\n\nfunction safeDateFormat(\n locale: string | readonly string[] | undefined,\n options: Intl.DateTimeFormatOptions\n): Intl.DateTimeFormat {\n try {\n return new Intl.DateTimeFormat(locale as string | string[] | undefined, options);\n } catch {\n const portable = { ...options };\n delete portable.timeZone;\n return new Intl.DateTimeFormat(undefined, portable);\n }\n}\n\nfunction parseDate(value: unknown): Date | null {\n if (!present(value)) return null;\n const date = value instanceof Date ? value : new Date(value as string | number);\n return Number.isFinite(date.getTime()) ? date : null;\n}\n\n/**\n * Production-oriented semantic column types. Register once in\n * `mach-table.config.ts`, then pages only declare `type: \"money\"` etc.\n */\nexport function createBusinessColumnTypes<TData = any>(\n options: BusinessColumnTypeOptions = {}\n): Readonly<Record<BusinessColumnType, Partial<ColDef<TData>>>> {\n const empty = options.emptyText ?? \"\";\n const invalid = options.invalidText ?? \"—\";\n const numberFormat = safeNumberFormat(options.locale, {\n maximumFractionDigits: options.maximumFractionDigits ?? 2\n });\n const integerFormat = safeNumberFormat(options.locale, { maximumFractionDigits: 0 });\n const moneyFormat = safeNumberFormat(options.locale, {\n style: \"currency\",\n currency: options.currency ?? \"CNY\",\n currencyDisplay: options.currencyDisplay ?? \"symbol\",\n maximumFractionDigits: options.maximumFractionDigits ?? 2\n });\n const fractionPercentFormat = safeNumberFormat(options.locale, {\n style: \"percent\",\n maximumFractionDigits: options.maximumFractionDigits ?? 2\n });\n const dateFormat = safeDateFormat(options.locale, {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n ...(options.timeZone ? { timeZone: options.timeZone } : {})\n });\n const dateTimeFormat = safeDateFormat(options.locale, {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n ...(options.timeZone ? { timeZone: options.timeZone } : {})\n });\n\n const formatNumber = (formatter: Intl.NumberFormat, scale = 1) => ({ value }: { value: unknown }): string => {\n if (!present(value)) return empty;\n const parsed = numeric(value);\n return parsed == null ? invalid : formatter.format(parsed * scale);\n };\n const formatDate = (formatter: Intl.DateTimeFormat) => ({ value }: { value: unknown }): string => {\n if (!present(value)) return empty;\n const parsed = parseDate(value);\n return parsed == null ? invalid : formatter.format(parsed);\n };\n\n return Object.freeze({\n text: { align: \"left\", filter: \"text\" },\n number: {\n align: \"right\",\n filter: \"number\",\n cellEditor: \"number\",\n valueFormatter: formatNumber(numberFormat)\n },\n integer: {\n align: \"right\",\n filter: \"number\",\n cellEditor: \"number\",\n valueFormatter: formatNumber(integerFormat)\n },\n money: {\n align: \"right\",\n filter: \"number\",\n cellEditor: \"number\",\n valueFormatter: formatNumber(moneyFormat)\n },\n /** Fraction input: 0.125 is displayed as 12.5%. */\n percent: {\n align: \"right\",\n filter: \"number\",\n cellEditor: \"number\",\n valueFormatter: formatNumber(fractionPercentFormat)\n },\n /** Whole-number input: 12.5 is displayed as 12.5%. */\n percentage: {\n align: \"right\",\n filter: \"number\",\n cellEditor: \"number\",\n valueFormatter: formatNumber(fractionPercentFormat, 0.01)\n },\n date: {\n align: \"center\",\n filter: \"date\",\n cellEditor: \"date\",\n valueFormatter: formatDate(dateFormat)\n },\n datetime: {\n align: \"center\",\n filter: \"date\",\n valueFormatter: formatDate(dateTimeFormat)\n },\n boolean: {\n align: \"center\",\n filter: \"set\",\n valueFormatter: ({ value }) => value === true\n ? (options.trueText ?? \"是\")\n : value === false\n ? (options.falseText ?? \"否\")\n : empty\n },\n status: { filter: \"set\", cellRenderer: \"statusTag\" },\n link: { filter: \"text\", cellRenderer: \"link\" }\n });\n}\n\nexport type DictionaryKey = string | number;\n\nexport interface DictionaryEntry<TKey extends DictionaryKey = DictionaryKey> {\n value: TKey;\n label: string;\n}\n\nexport interface CachedDictionaryOptions<TKey extends DictionaryKey = DictionaryKey> {\n load(keys: readonly TKey[], signal: AbortSignal): Promise<readonly DictionaryEntry<TKey>[]>;\n ttlMs?: number;\n maxSize?: number;\n batchDelayMs?: number;\n onError?(error: unknown, keys: readonly TKey[]): void;\n}\n\nexport interface CachedDictionary<TKey extends DictionaryKey = DictionaryKey> {\n get(key: TKey): string | undefined;\n resolve(key: TKey): Promise<string | undefined>;\n resolveMany(keys: readonly TKey[]): Promise<ReadonlyMap<TKey, string>>;\n prime(entries: readonly DictionaryEntry<TKey>[]): void;\n invalidate(keys?: readonly TKey[]): void;\n destroy(): void;\n readonly size: number;\n}\n\ninterface DictionaryCacheValue<TKey extends DictionaryKey> {\n key: TKey;\n label: string;\n expiresAt: number;\n}\n\nfunction dictionaryId(key: DictionaryKey): string {\n return `${typeof key}:${String(key)}`;\n}\n\n/** Batched, de-duplicated TTL/LRU dictionary resolver for code-to-label fields. */\nexport function createCachedDictionary<TKey extends DictionaryKey = DictionaryKey>(\n options: CachedDictionaryOptions<TKey>\n): CachedDictionary<TKey> {\n const ttlMs = Math.max(0, options.ttlMs ?? 5 * 60_000);\n const maxSize = Math.max(1, Math.floor(options.maxSize ?? 2_000));\n const delay = Math.max(0, options.batchDelayMs ?? 0);\n const cache = new Map<string, DictionaryCacheValue<TKey>>();\n const queued = new Map<string, TKey>();\n const waiting = new Map<string, Array<{ resolve(value: string | undefined): void; reject(error: unknown): void }>>();\n let timer: ReturnType<typeof setTimeout> | null = null;\n let controller: AbortController | null = null;\n let destroyed = false;\n\n const get = (key: TKey): string | undefined => {\n const id = dictionaryId(key);\n const hit = cache.get(id);\n if (!hit) return undefined;\n if (hit.expiresAt < Date.now()) {\n cache.delete(id);\n return undefined;\n }\n cache.delete(id);\n cache.set(id, hit);\n return hit.label;\n };\n\n const prime = (entries: readonly DictionaryEntry<TKey>[]): void => {\n const expiresAt = ttlMs === 0 ? Number.POSITIVE_INFINITY : Date.now() + ttlMs;\n for (const entry of entries) {\n const id = dictionaryId(entry.value);\n cache.delete(id);\n cache.set(id, { key: entry.value, label: String(entry.label), expiresAt });\n }\n while (cache.size > maxSize) cache.delete(cache.keys().next().value as string);\n };\n\n const flush = async (): Promise<void> => {\n timer = null;\n if (destroyed || queued.size === 0) return;\n const entries = [...queued.entries()];\n queued.clear();\n const keys = entries.map(([, key]) => key);\n const active = new AbortController();\n controller = active;\n try {\n const loaded = await options.load(keys, active.signal);\n if (destroyed || active.signal.aborted) return;\n prime(loaded);\n for (const [id, key] of entries) {\n const value = get(key);\n for (const waiter of waiting.get(id) ?? []) waiter.resolve(value);\n waiting.delete(id);\n }\n } catch (error) {\n if (!active.signal.aborted) options.onError?.(error, keys);\n for (const [id] of entries) {\n for (const waiter of waiting.get(id) ?? []) waiter.reject(error);\n waiting.delete(id);\n }\n } finally {\n if (controller === active) controller = null;\n if (!destroyed && queued.size > 0 && timer == null) timer = setTimeout(() => { void flush(); }, delay);\n }\n };\n\n const resolve = (key: TKey): Promise<string | undefined> => {\n const cached = get(key);\n if (cached !== undefined) return Promise.resolve(cached);\n if (destroyed) return Promise.reject(new Error(\"[MachTable] Dictionary resolver has been destroyed.\"));\n const id = dictionaryId(key);\n queued.set(id, key);\n const promise = new Promise<string | undefined>((resolveValue, reject) => {\n const list = waiting.get(id) ?? [];\n list.push({ resolve: resolveValue, reject });\n waiting.set(id, list);\n });\n if (timer == null && controller == null) timer = setTimeout(() => { void flush(); }, delay);\n return promise;\n };\n\n return {\n get,\n resolve,\n async resolveMany(keys) {\n const labels = await Promise.all(keys.map(async (key) => [key, await resolve(key)] as const));\n return new Map(labels.filter((entry): entry is readonly [TKey, string] => entry[1] !== undefined));\n },\n prime,\n invalidate(keys) {\n if (!keys) cache.clear();\n else for (const key of keys) cache.delete(dictionaryId(key));\n },\n destroy() {\n destroyed = true;\n if (timer != null) clearTimeout(timer);\n timer = null;\n controller?.abort();\n controller = null;\n const error = new Error(\"[MachTable] Dictionary resolver has been destroyed.\");\n for (const waiters of waiting.values()) for (const waiter of waiters) waiter.reject(error);\n waiting.clear();\n queued.clear();\n cache.clear();\n },\n get size() {\n return cache.size;\n }\n };\n}\n\nexport interface DictionaryRendererOptions {\n loadingText?: string;\n emptyText?: string;\n fallback?: (value: DictionaryKey) => string;\n}\n\n/** Async-safe renderer backed by createCachedDictionary; stale pooled cells are not mutated. */\nexport function createDictionaryRenderer<TKey extends DictionaryKey = DictionaryKey>(\n dictionary: CachedDictionary<TKey>,\n options: DictionaryRendererOptions = {}\n): CellRendererFn {\n return (params) => {\n if (!present(params.value)) return options.emptyText ?? \"\";\n const key = params.value as TKey;\n const fallback = options.fallback?.(key) ?? String(key);\n const cached = dictionary.get(key);\n if (cached !== undefined) return cached;\n const element = document.createElement(\"span\");\n element.className = \"mach-dictionary-value mach-dictionary-value--loading\";\n element.textContent = options.loadingText ?? fallback;\n let active = true;\n void dictionary.resolve(key).then((label) => {\n if (!active || !element.isConnected) return;\n element.textContent = label ?? fallback;\n element.classList.remove(\"mach-dictionary-value--loading\");\n }).catch(() => {\n if (!active || !element.isConnected) return;\n element.textContent = fallback;\n element.classList.remove(\"mach-dictionary-value--loading\");\n element.classList.add(\"mach-dictionary-value--error\");\n });\n return { el: element, destroy: () => { active = false; } };\n };\n}\n"],"mappings":"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","names":["index_exports","__export","BUILTIN_AGG_FUNCS","Column","DEFAULT_LOCALE","DIRECT_GRID_OPTION_KEYS","EVENT_TYPES","EventBus","GRID_OPTION_KEYS","GRID_OPTION_META","GRID_SIZE_PRESETS","GridCore","LOCALE_EN","actionsColumn","buildColDefsFromSchema","clearColumnState","clearComponentRegistries","computeColumnWidths","createActionButtonsRenderer","createAggResolver","createBusinessColumnTypes","createCachedDictionary","createColumnHelper","createColumnStateKey","createDictionaryRenderer","createEnterprisePreset","createGrid","createLocalColumnStateStore","createMachTablePreset","createProgressBarRenderer","createRowActionsRenderer","createStatusTagRenderer","defaultComparator","defineColumns","defineGridOptions","defineMachTablePreset","describeFilter","downloadFile","dragColumn","escapeHtml","evaluateColumnFilter","fitColumnWidths","formatText","formatTwo","getByPath","getCellEditor","getCellRenderer","indexColumn","isColDefGroup","isSafePath","linkRenderer","loadColumnState","matchLocaleKey","parseCsv","parseDelimited","parseTsv","registerBuiltinRenderers","registerCellEditor","registerCellRenderer","resolveTagVariant","rowActionsColumn","sanitizeFormulaCell","saveColumnState","selectionColumn","setByPath","sortNodes","toTsv","validateGridOptions","version","__toCommonJS","package_default","EventBus","onListenerError","type","listener","set","off","event","payload","err","DEFAULT_COL_DEF","GRID_SIZE_PRESETS","finiteAtLeast","value","fallback","min","integer","resolveSize","resolveTheme","options","resolvePageSizeOptions","pageSize","requested","values","left","right","resolveDataAndLayout","size","preset","resolveAppearance","resolveEditingAndHistory","resolveHierarchy","resolvePagination","config","resolveWatermark","resolveInteraction","resolveDatasource","resolveAccessibility","OPTIONAL_OPTION_KEYS","copyOptionalOptions","source","target","key","copyEventHandlers","resolveOptions","userOptions","resolved","columnTypeNames","type","name","hasColumnType","colDef","mergeColDef","defaults","columnTypes","typedDefaults","definition","Column","id","colDef","p","f","ColumnGroup","_ColumnGroup","groupId","def","out","child","isColDefGroup","def","clampWidth","w","input","min","max","computeColumnWidths","cols","availableWidth","widths","c","flexCols","flexTotal","i","f","total","extra","pass","remainingFlex","remainingTotal","consumed","k","share","before","used","stillFlexible","_index","fitColumnWidths","column","active","_column","index","remainingWidth","weightTotal","constrained","target","fitted","drift","sum","width","candidate","DETAIL_TOGGLE_COL_ID","ColumnModel","core","colDefs","prev","c","defaults","usedIds","build","list","parent","level","def","i","isColDefGroup","groupId","group","ColumnGroup","colDef","id","uniqueId","suffix","column","Column","mergeColDef","p","toggleCol","max","s","initial","children","out","child","visible","colId","pane","ordered","viewportWidth","pinnedTotal","clampWidth","available","scalable","fixed","fixedTotal","scalableInputs","scalableWidth","widths","fitColumnWidths","computeColumnWidths","index","width","toIndex","inScope","container","siblings","from","target","leafSlots","idx","slotIdx","pinned","sortIndex","state","states","stateById","nextSort","a","b","direction","orderById","paneOfCol","current","sorted","slots","sortModel","additive","model","next","textOf","value","evaluateTextFilter","conditions","operator","v","results","c","fv","evaluateNumberFilter","isBlank","n","f","toTime","t","evaluateDateFilter","f2","evaluateSetFilter","filterValues","evaluateColumnFilter","filter","doesNodePassFilters","node","columns","filterModel","quickFilter","getCellValue","colId","column","tokens","token","collator","defaultComparator","valueA","valueB","aEmpty","bEmpty","a","b","sortNodes","nodes","sortModel","columns","getCellValue","colById","c","comparators","directions","item","column","defaultComparator","decorated","node","s","a","b","i","r","d","numeric","values","v","BUILTIN_AGG_FUNCS","acc","nums","createAggResolver","custom","merged","name","readChildren","data","key","value","RowModel","core","index","fallback","getRowId","id","error","detailRows","v","start","end","datasource","blockSize","stop","seq","controller","resolve","settled","attempt","done","reason","runAttempt","attemptSettled","failAttempt","delay","request","rows","lastRow","received","wasEmpty","node","lastVisibleIndex","loaded","buffer","childrenKey","next","roots","byId","childIds","autoSeq","buildNode","depth","parentId","children","list","child","force","loader","childId","pending","parent","removed","stack","replacedIds","reserved","seenObjects","nested","transaction","refresh","touched","externallyReplacedIds","removeIds","removeRefs","collect","cur","kids","kid","drop","remaining","n","startIndex","added","i","transactions","walk","root","filterModel","before","text","columns","getCellValue","column","doesNodePassFilters","sortModel","sortNodes","groupCols","withDetails","size","pageCount","slice","page","silent","firstVisible","pageSize","enabled","passCache","filterPresent","nodePasses","cached","pass","out","nodes","ordered","childNodes","spanColumns","c","masters","m","col","arr","span","defaultComparator","k","colId","aggResolve","createAggResolver","aggCols","computeAgg","leaves","values","fn","leaf","build","level","parentPath","groups","order","raw","bucket","a","b","display","groupId","groupNode","checkTree","check","rowIds","groupIds","expanded","changed","fromIndex","toIndex","fromNode","toNode","fromAllIdx","toAllIdx","idx","insertAt","callback","SelectionService","core","id","node","column","check","error","n","ids","requested","changes","preserveIds","existing","groupNode","leaves","selectableCount","count","leaf","selected","clearOthers","nodeId","event","fromCheckbox","mode","single","multi","anchor","start","end","i","row","filteredOnly","selectable","total","acc","clearAll","before","c","isTree","keep","targets","changedIds","prevSelected","prevIndeterminate","refreshIndexes","touched","isSel","out","walk","childId","evaluate","childIds","all","some","state","root","el","tag","className","attrs","e","key","clamp","v","min","max","FILTER_ICON","SORT_ASC_ICON","SORT_DESC_ICON","ResizeService","core","active","def","min","max","clamp","current","column","handle","startWidth","minWidth","DRAG_THRESHOLD","ColumnDragService","core","pending","dragging","column","value","cellEl","indicator","el","pane","cssEscape","rowRect","cols","fromIndex","x","target","indicatorX","acc","i","mid","csvEscape","value","separator","s","sanitizeFormulaCell","buildCsv","accessor","params","includeHeader","protectFormulas","lines","l","row","v","body","escapeCell","value","protectFormulas","safe","sanitizeFormulaCell","s","toTsv","rows","row","parseTsv","text","parseDelimited","parseCsv","separator","cell","inQuotes","ch","fallbackCopyText","ta","writeClipboard","NAVIGATION_KEYS","MOVEMENT_KEYS","KeyboardService","core","range","text","dt","writeClipboard","start","rowIndex","colId","dir","cols","c","rowCount","i","row","guard","node","key","body","columns","focus","colIdx","column","position","moved","columnCount","current","candidate","viewport","pageRows","direction","target","down","next","baseInput","type","value","input","inferEditorType","selectValues","createEditor","column","keyPress","def","name","timeMatch","values","select","v","option","match","cellStates","detailDestroyers","headerDestroyers","getCellRuntimeState","element","state","peekCellRuntimeState","setDetailDestroyer","destroy","takeDetailDestroyer","setHeaderDestroyer","takeHeaderDestroyer","defaultFormat","value","cleanupCellContent","core","cell","state","peekCellRuntimeState","destroy","error","formatCellValue","node","column","formatter","out","formatCellValueWith","applyCellStyle","rule","getCellRuntimeState","prevKeys","key","styles","keys","renderCellContent","formatted","rendererDef","renderer","params","result","tooltip","tooltipGetter","applyCellClasses","classes","align","hasColumnType","hadFocus","hadEditing","className","CHECK_PATH","CLOSE_PATH","createEditButton","kind","label","button","event","EditingService","core","current","next","stopped","rowIndex","colId","node","column","editable","error","keyPress","cell","oldValue","editor","cleanupCellContent","shell","controls","confirmButton","cancelButton","keydown","preferredColId","drafts","row","first","target","draft","editing","cancel","newValue","validation","token","task","result","changed","results","invalid","rowErrors","cancelled","changes","applied","rollbackFailed","previous","input","value","def","params","createEditor","validate","validator","values","errors","message","firstMessage","editorEl","clear","busy","mounted","removeCellState","currentIndex","direction","offset","DEFAULT_LOCALE","LOCALE_EN","MATCH_LOCALE_KEYS","matchLocaleKey","match","formatText","template","n","formatTwo","a","b","TEXT_MATCHES","NUMBER_MATCHES","DATE_MATCHES","FilterPopupService","core","column","anchor","filter","type","panel","el","footer","resetBtn","applyBtn","next","rect","panelRect","left","clamp","top","matches","existing","currentMatch","isBlank","select","option","matchLocaleKey","valueInput","value2Input","blank","enterApply","e","body","params","values","seen","nodes","cap","i","v","key","selected","search","list","checkboxes","valueByKey","renderList","query","q","text","label","cb","span","entries","selectedKeys","emptyLabel","picked","inputs","match","raw","value","value2","ColumnMenuService","core","column","anchor","target","rect","fake","api","panel","el","title","sortRow","makeSortBtn","labelKey","dir","btn","pinRow","makePinBtn","pinned","toolRow","fitBtn","hideBtn","divider","listTitle","search","list","footer","resetBtn","allFitBtn","panelRect","left","clamp","top","workbench","columns","candidate","col","row","label","checkbox","text","pin","value","caption","option","siblings","position","move","next","disabled","button","ContextMenuService","core","x","y","anchor","node","anchorCol","range","flat","anchorIndex","panel","el","customGetter","items","error","hasEnabled","item","sep","btn","copyBtn","pasteBtn","clearBtn","active","rect","left","clamp","top","TooltipService","core","cell","colId","rowEl","index","node","column","value","params","formatCellValue","getter","fallback","error","body","component","panel","el","content","err","rect","panelRect","left","clamp","top","WatermarkService","core","config","url","canvas","ctx","fontSize","gap","angle","color","opacity","metrics","textW","tile","ctx2","UndoRedoService","core","batch","entry","maxSize","redo","refreshIndexes","node","column","value","replaced","ChangeTrackingService","core","event","key","originalValue","change","byRow","node","row","rowIds","ids","saved","cell","current","column","value","targets","refresh","completed","EVENT_TYPES","escapeHtml","value","downloadFile","filename","content","mime","a","blob","url","revoke","UNSAFE_PATH_SEGMENTS","isSafePath","path","part","getByPath","obj","cur","start","idx","setByPath","value","parts","i","createOptionUpdateEffects","hasOwnOption","options","key","normalizeFinite","value","min","integer","changedFinite","current","normalized","cloneSnapshotData","data","GridApiImpl","core","rows","transaction","resolve","transactions","resolvers","colDefs","state","colId","visible","toIndex","pinned","width","cols","target","total","acc","c","col","skipHeader","column","ctx","style","maxWidth","consider","text","w","nodes","cap","i","formatCellValue","extra","changed","sortModel","filterModel","mode","nodeId","selected","clearOthers","filteredOnly","rowIndex","id","callback","position","rowId","groupId","fromIndex","getRowId","changes","row","node","n","selectedIds","rowIds","handler","ids","snapshot","change","cell","result","savedIds","saved","anchor","enabled","page","size","grid","parseCsv","headerRow","body","r","toTsv","columns","fieldOrder","records","byHeader","field","matched","header","index","entry","record","raw","setByPath","columnIndex","error","isNumeric","hasLeadingZero","win","headerCells","escapeHtml","bodyRows","v","html","params","cancel","effects","previousColumnMenu","resolved","eventType","EVENT_TYPES","rowHeight","headerHeight","rowBuffer","detailHeight","undoStackSize","wait","tooltipDelay","config","GRID_SIZE_PRESETS","preset","DEFAULT_COL_DEF","blockSize","bufferRows","retryCount","retryDelay","buildCsv","a","b","all","sections","type","content","listener","SIZE_CLASSES","GridSkeleton","core","container","options","classes","el","pane","paneEl","rowsContainer","viewport","depth","rows","row","i","left","right","width","hp","bp","hidden","rowHeight","headerHeight","size","s","theme","dark","mq","handler","on","className","token","type","content","allowUnsafeHtml","resolved","error","spinner","active","text","cleanup","MATCH_LABELS","describeFilter","filter","parts","condition","label","value","value2","operator","HeaderRenderer","core","cell","destroy","takeHeaderDestroyer","error","depth","paneOf","col","buildTree","children","level","pane","out","child","ColumnGroup","subtree","roots","perRowHeight","rows","row","appendCell","tree","index","column","rowSpan","colDef","cellEl","el","headerAlign","e","selectAllEl","headerComponent","err","labelEl","wrapper","setHeaderDestroyer","sortEl","filterBtn","filterTagEl","FILTER_ICON","menuBtn","resizeEl","group","def","flatIndex","widths","x","leafLefts","left","gc","leaves","width","leaf","c","resize","delta","next","siblings","from","to","current","target","model","multi","hc","idx","s","dir","badge","SORT_ASC_ICON","SORT_DESC_ICON","fm","filter","active","summary","describeFilter","RangeSelectionModel","point","extend","rowCount","colCount","RowDragController","core","getPositions","event","drag","container","y","rowCount","positions","targetIndex","indicatorY","index","node","top","bottom","from","to","indicator","el","PANES","lowerBound","positions","y","count","lo","hi","mid","BodyRenderer","core","RangeSelectionModel","drag","me","dx","dy","target","end","old","targetCol","finish","targetRow","resolved","node","index","cellEl","labelCol","colId","column","value","event","colIdx","RowDragController","body","slot","pane","cell","cleanupCellContent","sk","viewport","widths","a","c","displayed","rowCount","positionedCount","rowHeight","detailHeight","getRowHeight","api","cap","autoHeightCols","minH","i","h","cached","requested","error","measured","totalHeight","centerAvailable","centerWidth","container","cols","ctx","style","fontSize","padding","lineHeight","maxLines","col","text","formatCellValue","availW","lines","w","ch","cw","rowIndexes","colIds","rowIndex","entries","runtime","getCellRuntimeState","timer","minRowHeight","needed","row","el","detailRow","input","columns","existingCells","existingIds","id","byId","nextCells","nextIds","variableHeights","allPaneCols","x","lefts","first","cells","prevFirst","prevLast","last","width","total","scrollLeft","acc","force","buffer","colWindowChanged","scrollTop","viewBottom","firstVisible","lastVisible","clamp","lastExcl","isTreeRow","isGroupRow","hasTreeChildren","isExpandable","expanded","level","hasColSpan","coverage","span","remaining","fn","start","master","renderer","params","out","err","setDetailDestroyer","destroy","takeDetailDestroyer","toggle","handle","hasColumnType","renderCellContent","applyCellClasses","applyCellStyle","button","expandable","depth","indent","wrap","stateClass","spacer","formatCellValueWith","spans","idx","height","base","state","groupCol","prefix","formatted","defaultFormat","indexes","seen","options","template","colCount","range","focus","ci","flat","anchor","b","collect","r","extend","next","inRange","e","cm","leftCount","centerCols","local","bottom","rect","r1","r2","c1","c2","targetEnd","changedRows","srcNode","sources","n","allNumeric","v","diff","intPattern","t","colOffset","steps","colIndex","left","position","viewportHeight","rowTop","rowBottom","maxScroll","prev","hover","rowEl","treeColumn","SummaryRenderer","core","el","pane","row","visible","show","method","masterRows","locale","DEFAULT_LOCALE","cols","cell","x","col","i","node","error","formatText","PaginationBar","core","el","mkBtn","cls","label","text","btn","size","options","current","a","b","option","formatText","key","DEFAULT_LOCALE","rm","active","total","visible","page","pageCount","formatTwo","off","PANES","PinnedRowsRenderer","core","root","state","el","pane","top","bottom","rows","side","sideName","row","cell","cleanupCellContent","wrapper","rowHeight","cm","data","node","cellsByPane","col","renderCellContent","applyCellClasses","applyCellStyle","err","widths","lefts","x","hidden","globalColOffset","cols","i","scrollLeft","StatusBarService","core","el","options","panel","item","locale","DEFAULT_LOCALE","text","key","value","template","formatText","rm","total","loaded","count","range","flat","sum","r","node","c","col","v","avg","sumText","off","currentStorage","safeSegment","value","createColumnStateKey","parts","entry","name","sanitizeColumnState","maxColumns","result","ids","item","source","state","createLocalColumnStateStore","options","namespace","version","storageKey","key","report","error","operation","raw","parsed","legacy","envelope","columns","defaultStore","saveColumnState","loadColumnState","clearColumnState","DEFAULT_STATUS_VARIANTS","resolveTagVariant","value","variantMap","key","exact","lower","pattern","variant","createStatusTagRenderer","config","params","label","tag","createProgressBarRenderer","raw","pct","wrap","track","bar","linkRenderer","link","ICON_PATHS","iconSvg","name","size","path","openActionSurface","openActionAnchor","closeActionSurface","restoreFocus","onActionSurfaceOutside","onActionSurfaceKeyDown","event","buttons","current","delta","makeSurfaceButton","item","className","button","showActionMenu","anchor","items","menu","rect","menuRect","showActionDrawer","title","backdrop","drawer","header","heading","close","body","resolveActionFlag","flag","actionVariant","action","actionPermissions","actionContext","message","reportActionError","error","policy","policyError","canAccessAction","createActionButtonsRenderer","max","overflowMode","visible","shown","overflow","run","request","more","moreLabel","createRowActionsRenderer","labels","actions","presetStatusTagRenderer","presetProgressBarRenderer","registerBuiltinRenderers","register","cellRenderers","cellEditors","registerCellRenderer","name","renderer","previous","getCellRenderer","registerCellEditor","editor","getCellEditor","ensureCellRenderer","clearComponentRegistries","validateColumnDefs","defs","issues","seenIds","leafIndex","walk","list","depth","def","isColDefGroup","id","isSafePath","count","GRID_OPTION_META","GRID_OPTION_KEYS","DIRECT_GRID_OPTION_KEYS","key","EVENT_OPTION_KEYS","EVENT_TYPES","type","KNOWN_OPTIONS","GRID_OPTION_KEYS","editDistance","a","b","previous","_","index","row","current","column","closestOption","input","closest","distance","candidate","next","threshold","validateGridOptions","options","source","issues","option","suggestion","pagination","config","DATA_SOURCE_ERROR_PREFIXES","gridUid","ensureBuiltinRenderers","registerBuiltinRenderers","ensureCellRenderer","GridCore","container","options","settleReady","resolve","resolveOptions","EventBus","error","eventType","ColumnModel","RowModel","SelectionService","GridSkeleton","HeaderRenderer","BodyRenderer","ResizeService","ColumnDragService","KeyboardService","EditingService","UndoRedoService","FilterPopupService","ColumnMenuService","ContextMenuService","TooltipService","WatermarkService","PaginationBar","PinnedRowsRenderer","SummaryRenderer","StatusBarService","GridApiImpl","ChangeTrackingService","name","local","renderer","getCellRenderer","getCellEditor","features","feature","key","cleanups","manage","cleanup","active","once","context","type","listener","target","listenerOptions","handler","delayMs","id","controller","source","details","cleanupError","entries","node","column","def","getByPath","DEFAULT_LOCALE","newValue","oldValue","colDef","setByPath","changed","range","cols","rows","r","col","formatCellValueWith","toTsv","writeClipboard","flat","changedRows","c","old","text","startRow","startColIdx","grid","parseTsv","rowCount","line","token","value","start","extra","event","handlerKey","code","message","prefix","package_default","entry","additive","filter","model","colId","toIndex","rowId","saved","loadColumnState","states","state","result","saveColumnState","locale","title","hint","empty","icon","titleEl","hintEl","inputOptions","issue","validateGridOptions","signature","defs","validateColumnDefs","widthSignature","treeGrid","invalidateRowHeights","safely","fn","createGrid","container","options","GridCore","booleanFormatter","p","dateFormatter","format","text","selectFormatter","options","hit","fieldToColDef","field","type","colDef","o","buildColDefsFromSchema","schema","byField","f","used","result","g","group","children","fieldName","NO_INTERACT","selectionColumn","overrides","indexColumn","dragColumn","actionsColumn","config","width","pinned","rendererConfig","count","shown","hasMore","defaultWidth","createActionButtonsRenderer","rowActionsColumn","createRowActionsRenderer","createColumnHelper","field","definition","defineColumns","columns","mergeSwitchableObject","base","next","composeHandlers","args","firstError","error","mergeOptions","merged","columnTypes","name","key","previousHandler","nextHandler","createMachTablePreset","sources","createEnterprisePreset","overrides","defineMachTablePreset","preset","defineGridOptions","options","present","value","numeric","result","safeNumberFormat","locale","options","safeDateFormat","portable","parseDate","date","createBusinessColumnTypes","empty","invalid","numberFormat","integerFormat","moneyFormat","fractionPercentFormat","dateFormat","dateTimeFormat","formatNumber","formatter","scale","parsed","formatDate","dictionaryId","key","createCachedDictionary","ttlMs","maxSize","delay","cache","queued","waiting","timer","controller","destroyed","get","id","hit","prime","entries","expiresAt","entry","flush","keys","active","loaded","waiter","error","resolve","cached","promise","resolveValue","reject","list","labels","waiters","createDictionaryRenderer","dictionary","params","fallback","element","label","version","package_default"]}
|