@acorex/charts 21.0.1-next.46 → 21.0.1-next.48
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/fesm2022/acorex-charts-bar-chart.mjs +23 -13
- package/fesm2022/acorex-charts-bar-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-chart-tooltip.mjs +11 -2
- package/fesm2022/acorex-charts-chart-tooltip.mjs.map +1 -1
- package/fesm2022/acorex-charts-donut-chart.mjs +68 -92
- package/fesm2022/acorex-charts-donut-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-gauge-chart.mjs +23 -14
- package/fesm2022/acorex-charts-gauge-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-line-chart.mjs +23 -7
- package/fesm2022/acorex-charts-line-chart.mjs.map +1 -1
- package/package.json +1 -1
- package/types/acorex-charts-bar-chart.d.ts +2 -4
- package/types/acorex-charts-chart-tooltip.d.ts +1 -0
- package/types/acorex-charts-donut-chart.d.ts +9 -10
- package/types/acorex-charts-gauge-chart.d.ts +2 -4
- package/types/acorex-charts-line-chart.d.ts +2 -0
|
@@ -111,6 +111,8 @@ class AXBarChartComponent extends AXChartComponent {
|
|
|
111
111
|
percentage: '0%',
|
|
112
112
|
color: '',
|
|
113
113
|
}, ...(ngDevMode ? [{ debugName: "_tooltipData" }] : []));
|
|
114
|
+
_tooltipRafId = null;
|
|
115
|
+
_pendingTooltipCoords = null;
|
|
114
116
|
// Signals for component state
|
|
115
117
|
_initialized = signal(false, ...(ngDevMode ? [{ debugName: "_initialized" }] : []));
|
|
116
118
|
_rendered = signal(false, ...(ngDevMode ? [{ debugName: "_rendered" }] : []));
|
|
@@ -272,9 +274,13 @@ class AXBarChartComponent extends AXChartComponent {
|
|
|
272
274
|
* Cleans up chart resources
|
|
273
275
|
*/
|
|
274
276
|
cleanupChart() {
|
|
277
|
+
if (this._tooltipRafId != null) {
|
|
278
|
+
cancelAnimationFrame(this._tooltipRafId);
|
|
279
|
+
this._tooltipRafId = null;
|
|
280
|
+
}
|
|
281
|
+
this._pendingTooltipCoords = null;
|
|
275
282
|
const container = this.chartContainerEl()?.nativeElement;
|
|
276
283
|
if (container) {
|
|
277
|
-
// Only remove chart SVG and message containers to preserve tooltip component
|
|
278
284
|
this.d3?.select(container).selectAll('svg, .ax-chart-message-container').remove();
|
|
279
285
|
}
|
|
280
286
|
this.svg = undefined;
|
|
@@ -934,20 +940,24 @@ class AXBarChartComponent extends AXChartComponent {
|
|
|
934
940
|
this._tooltipVisible.set(true);
|
|
935
941
|
}
|
|
936
942
|
}
|
|
937
|
-
/**
|
|
938
|
-
* Updates tooltip position based on mouse coordinates
|
|
939
|
-
* Enhanced to handle overflow issues by positioning tooltips more intelligently
|
|
940
|
-
*/
|
|
941
943
|
updateTooltipPosition(event) {
|
|
942
|
-
|
|
943
|
-
if (
|
|
944
|
+
this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };
|
|
945
|
+
if (this._tooltipRafId != null)
|
|
944
946
|
return;
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
947
|
+
this._tooltipRafId = requestAnimationFrame(() => {
|
|
948
|
+
this._tooltipRafId = null;
|
|
949
|
+
const coords = this._pendingTooltipCoords;
|
|
950
|
+
if (!coords)
|
|
951
|
+
return;
|
|
952
|
+
const containerEl = this.chartContainerEl()?.nativeElement;
|
|
953
|
+
if (!containerEl)
|
|
954
|
+
return;
|
|
955
|
+
const containerRect = containerEl.getBoundingClientRect();
|
|
956
|
+
const tooltipEl = containerEl.querySelector('.chart-tooltip');
|
|
957
|
+
const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;
|
|
958
|
+
const pos = this.computeEnhancedTooltipPosition(containerRect, tooltipRect, coords.x, coords.y);
|
|
959
|
+
this._tooltipPosition.set(pos);
|
|
960
|
+
});
|
|
951
961
|
}
|
|
952
962
|
/**
|
|
953
963
|
* Enhanced tooltip positioning that considers chart boundaries and prevents overflow
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-charts-bar-chart.mjs","sources":["../../../../packages/charts/bar-chart/src/lib/bar-chart.config.ts","../../../../packages/charts/bar-chart/src/lib/bar-chart.component.ts","../../../../packages/charts/bar-chart/src/lib/bar-chart.component.html","../../../../packages/charts/bar-chart/src/acorex-charts-bar-chart.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { AXBarChartOption } from './bar-chart.type';\n\nexport const AXBarChartDefaultConfig: AXBarChartOption = {\n showXAxis: true,\n showYAxis: true,\n showGrid: true,\n showDataLabels: true,\n showTooltip: true,\n rotateXAxisLabels: 'auto',\n barWidth: 80,\n cornerRadius: 4,\n animationDuration: 800,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All bars are hidden',\n allHiddenHelp: 'Click on legend items to show bars',\n noDataIcon: 'fa-light fa-chart-column',\n allHiddenIcon: 'fa-light fa-eye-slash',\n },\n};\n\nexport const AX_BAR_CHART_CONFIG = new InjectionToken<AXBarChartOption>('AX_BAR_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXBarChartDefaultConfig,\n});\n\nexport type PartialBarChartConfig = Partial<AXBarChartOption>;\n\nexport function barChartConfig(config: PartialBarChartConfig = {}): AXBarChartOption {\n const result = {\n ...AXBarChartDefaultConfig,\n ...config,\n };\n return result;\n}\n","import {\n AX_CHART_COLOR_PALETTE,\n AXChartComponent,\n AXChartComponentBase,\n formatLargeNumber,\n getChartColor,\n getEasingFunction,\n} from '@acorex/charts';\nimport { AXChartLegendCompatible, AXChartLegendItem } from '@acorex/charts/chart-legend';\nimport { AXChartTooltipComponent, AXChartTooltipData } from '@acorex/charts/chart-tooltip';\n\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n output,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AX_BAR_CHART_CONFIG } from './bar-chart.config';\nimport {\n AXBarChartClickEvent,\n AXBarChartClusteredData,\n AXBarChartData,\n AXBarChartOption,\n AXBarChartValue,\n} from './bar-chart.type';\n\n/**\n * Bar Chart Component\n * Renders data as vertical bars with interactive hover effects and animations\n */\n@Component({\n selector: 'ax-bar-chart',\n templateUrl: './bar-chart.component.html',\n styleUrls: ['./bar-chart.component.scss'],\n encapsulation: ViewEncapsulation.None,\n imports: [AXChartTooltipComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXBarChartComponent\n extends AXChartComponent\n implements OnDestroy, AXChartLegendCompatible, AXChartComponentBase\n{\n // Inputs\n /** Chart data input */\n data = input<AXBarChartValue>([] as AXBarChartValue);\n\n /** Chart options input */\n options = input<AXBarChartOption>({});\n\n // Outputs\n /** Emitted when a bar is clicked */\n barClick = output<AXBarChartClickEvent>();\n\n // Chart container reference\n private readonly chartContainerEl = viewChild.required<ElementRef<HTMLDivElement>>('chartContainer');\n\n // D3 reference - loaded asynchronously\n protected d3!: typeof import('d3');\n\n // Chart elements - using proper D3 types\n private svg!: ReturnType<typeof import('d3').select<SVGSVGElement, unknown>>;\n private chart!: ReturnType<typeof import('d3').select<SVGGElement, unknown>>;\n private xScale!: ReturnType<typeof import('d3').scaleBand<string>>;\n private yScale!: ReturnType<typeof import('d3').scaleLinear<number, number>>;\n private xSubScale!: ReturnType<typeof import('d3').scaleBand<string>>;\n private xAxis!: ReturnType<typeof import('d3').select<SVGGElement, unknown>>;\n private yAxis!: ReturnType<typeof import('d3').select<SVGGElement, unknown>>;\n\n // Chart dimensions\n private width!: number;\n private height!: number;\n private margin = { top: 0, right: 0, bottom: 0, left: 0 };\n\n // Constants for layout calculations\n private readonly CHAR_WIDTH_RATIO = 0.65;\n private readonly TOOLTIP_GAP = 10;\n private readonly AXIS_TICK_PADDING = 10;\n private readonly Y_AXIS_TITLE_THICKNESS = 14;\n private readonly Y_AXIS_TITLE_PADDING = 14;\n private readonly X_AXIS_TITLE_FONT_SIZE = 14;\n private readonly X_AXIS_TITLE_GAP = 14;\n private readonly X_AXIS_TITLE_BLOCK_HEIGHT = 24;\n private readonly TOP_EDGE_PADDING = 6;\n private readonly FALLBACK_PLOT_HEIGHT = 240;\n private readonly MIN_PLOT_HEIGHT = 120;\n private readonly MIN_TOTAL_WIDTH = 200;\n private readonly OUTER_PADDING_CLUSTERED = 0.2;\n private readonly INNER_PADDING_CLUSTERED = 0.1;\n private readonly MIN_PADDING = 0.1;\n private readonly HOVER_TRANSITION_DURATION = 150;\n private readonly DEFAULT_ANIMATION_DELAY = 50;\n private readonly LABEL_ANIMATION_DELAY = 100;\n private readonly MIN_TOP_SPACE_FOR_LABEL = 20;\n private readonly LABEL_OFFSET = 8;\n private readonly ROTATION_TOLERANCE_SMALL_DATASET = 1.4;\n private readonly SMALL_DATASET_THRESHOLD = 6;\n private readonly Y_AXIS_PADDING = 20;\n private readonly TICK_AREA_PADDING = 6;\n private readonly TICK_AREA_GAP = 8;\n private readonly DEFAULT_FONT_SIZE = 13;\n private readonly FONT_WIDTH_MULTIPLIER = 0.6;\n private readonly FONT_PADDING = 8;\n private readonly MAX_LABEL_LENGTH = 20;\n private readonly MIN_FONT_SIZE_X_AXIS = 8;\n private readonly MAX_FONT_SIZE_X_AXIS = 14;\n private readonly MIN_FONT_SIZE_Y_AXIS = 9;\n private readonly MAX_FONT_SIZE_Y_AXIS = 15;\n private readonly MANY_ITEMS_THRESHOLD = 20;\n private readonly VERY_MANY_ITEMS_THRESHOLD = 50;\n\n // Animation state\n private _initialAnimationComplete = signal(false);\n\n // Tooltip state\n private _tooltipVisible = signal(false);\n private _tooltipPosition = signal({ x: 0, y: 0 });\n private _tooltipData = signal<AXChartTooltipData>({\n title: '',\n value: '0',\n percentage: '0%',\n color: '',\n });\n\n // Signals for component state\n private _initialized = signal(false);\n private _rendered = signal(false);\n\n // Tooltip accessors\n protected tooltipVisible = this._tooltipVisible.asReadonly();\n protected tooltipPosition = this._tooltipPosition.asReadonly();\n protected tooltipData = this._tooltipData.asReadonly();\n\n // Inject configuration\n private configToken = inject(AX_BAR_CHART_CONFIG);\n\n // Inject the chart colors\n private chartColors = inject(AX_CHART_COLOR_PALETTE);\n\n // Inject AXPlatform\n // Removed unused AXPlatform injection\n\n // Configuration with defaults\n protected effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n });\n\n // Messages with defaults\n protected effectiveMessages = computed(() => {\n const defaultMessages = {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All bars are hidden',\n allHiddenHelp: 'Click on legend items to show bars',\n noDataIcon: 'fa-light fa-chart-column',\n allHiddenIcon: 'fa-light fa-eye-slash',\n };\n return {\n ...defaultMessages,\n ...this.effectiveOptions().messages,\n };\n });\n\n // Track hidden bars and series\n private readonly hiddenBars = new Set<string>();\n private readonly hiddenSeries = new Set<string>();\n\n // Computed values for better performance\n private readonly isClusteredMode = computed(() => {\n const value = this.data();\n return Array.isArray(value) && value.length > 0 && 'chartData' in value[0];\n });\n\n private readonly visibleData = computed(() => {\n const value = this.data() || [];\n if (this.isClusteredMode()) {\n return value as AXBarChartClusteredData[];\n }\n return (value as AXBarChartData[]).filter((d) => !this.hiddenBars.has(d.id));\n });\n\n private readonly hasVisibleData = computed(() => {\n const value = this.data();\n if (!Array.isArray(value) || value.length === 0) return false;\n\n if (this.isClusteredMode()) {\n const groups = value as AXBarChartClusteredData[];\n const seriesLabels = this.getClusterSeriesLabels(groups);\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n return groups.some((g) => visibleSeries.some((_, idx) => !!g.chartData[idx]));\n }\n\n return (value as AXBarChartData[]).some((d) => !this.hiddenBars.has(d.id));\n });\n\n // Type guard helper\n private isClusteredData(value: AXBarChartValue): value is AXBarChartClusteredData[] {\n return Array.isArray(value) && value.length > 0 && 'chartData' in value[0];\n }\n\n private getClusterSeriesLabels(groups: AXBarChartClusteredData[]): string[] {\n return groups[0]?.chartData?.map((d) => d.label) ?? [];\n }\n\n constructor() {\n super();\n // Dynamically load D3 and initialize the chart when the component is ready\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\n // Create chart after D3 is loaded and container is available\n if (this.d3 && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n });\n\n // Watch for changes to redraw the chart\n effect(() => {\n // Access inputs to track them\n this.data();\n this.effectiveOptions();\n\n // Only update if already rendered\n if (this._rendered()) {\n this.updateChart();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.cleanupChart();\n }\n\n /**\n * Loads D3.js dynamically\n */\n protected async loadD3(): Promise<void> {\n try {\n this.d3 = await import('d3');\n // If container is ready, create chart\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n } catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n\n /**\n * Creates the bar chart SVG and renders all elements\n */\n public createChart(): void {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement) return;\n\n const containerElement = this.chartContainerEl().nativeElement;\n const inputValue = (this.data() || []) as AXBarChartValue;\n const isClustered = this.isClusteredData(inputValue);\n\n // Use computed visibility\n const hasAnyVisible = this.hasVisibleData();\n const visibleSingleData = isClustered ? [] : (this.visibleData() as AXBarChartData[]);\n const groupedData = isClustered ? (inputValue as AXBarChartClusteredData[]) : [];\n\n // Clear existing chart SVG and messages (do not remove tooltip component)\n this.d3.select(containerElement).selectAll('svg, .ax-chart-message-container').remove();\n\n // Early return if no data\n if (!Array.isArray(inputValue) || inputValue.length === 0) {\n this.showNoDataMessage(containerElement);\n return;\n }\n\n // Early return if all bars are hidden\n if (!hasAnyVisible) {\n this.showAllBarsHiddenMessage(containerElement);\n return;\n }\n\n // Get options and setup dimensions\n const chartOptions = this.effectiveOptions();\n this.setupDimensions(containerElement, chartOptions);\n\n // Create scales and axes and render based on mode\n if (isClustered) {\n this.setupScalesClustered(groupedData);\n this.createAxesClustered(chartOptions, groupedData);\n this.renderBarsClustered(groupedData);\n } else {\n this.setupScales(visibleSingleData);\n this.createAxes(chartOptions);\n this.renderBars(visibleSingleData);\n }\n }\n\n /**\n * Updates the chart when inputs change\n */\n public updateChart(): void {\n this.createChart();\n }\n\n /**\n * Cleans up chart resources\n */\n public cleanupChart(): void {\n const container = this.chartContainerEl()?.nativeElement;\n if (container) {\n // Only remove chart SVG and message containers to preserve tooltip component\n this.d3?.select(container).selectAll('svg, .ax-chart-message-container').remove();\n }\n this.svg = undefined!;\n this.chart = undefined!;\n this._tooltipVisible.set(false);\n }\n\n /**\n * Sets up chart dimensions and creates SVG with responsive attributes\n */\n private setupDimensions(containerElement: HTMLElement, options: AXBarChartOption): void {\n // Remove outer margins; calculate only internal paddings for axes and labels\n this.margin = { top: 0, right: 0, bottom: 0, left: 0 };\n\n // Get container dimensions\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n\n // Axis visibility\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n\n // Internal left padding for Y-axis ticks/labels/title\n const yAxisTitleThickness = options.yAxisLabel ? this.Y_AXIS_TITLE_THICKNESS : 0;\n const yAxisTitlePadding = options.yAxisLabel ? this.Y_AXIS_TITLE_PADDING : 0;\n const leftPaddingForYAxis = showYAxis\n ? this.calculateMaxYAxisTickLabelWidth() + this.AXIS_TICK_PADDING + yAxisTitlePadding + yAxisTitleThickness\n : 0;\n\n // Estimate internal bottom padding for X-axis ticks/labels/title\n let bottomPaddingForXAxis = 0;\n if (showXAxis) {\n const raw = (this.data() || []) as AXBarChartValue;\n const isClustered = this.isClusteredData(raw);\n const barCount = isClustered ? (raw as AXBarChartClusteredData[]).length : (raw as AXBarChartData[]).length;\n const longestLabel = (() => {\n if (isClustered) {\n const groups = raw as AXBarChartClusteredData[];\n return groups.reduce((acc, g) => (acc.length > (g.label?.length ?? 0) ? acc : (g.label ?? '')), '');\n }\n const flat = (raw as AXBarChartData[]) || [];\n return flat.reduce((a, b) => (a.length > b.label.length ? a : b.label), '');\n })();\n\n const baseWidth = options.width ?? containerWidth;\n const workingWidth = Math.max(1, baseWidth - leftPaddingForYAxis);\n const dynamicFontSize = Math.max(10, Math.min(14, Math.round(workingWidth / 50)));\n\n // Use truncated label length for calculation (same logic as actual rendering)\n const maxLabelLength = barCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n const effectiveLabelLength = Math.min(longestLabel.length, maxLabelLength);\n const estimatedLongestLabelWidth = effectiveLabelLength * dynamicFontSize * 0.65;\n\n const availableWidthPerBar = barCount > 0 ? workingWidth / barCount : workingWidth;\n const rotateOption = typeof options.rotateXAxisLabels === 'boolean' ? options.rotateXAxisLabels : undefined;\n const willRotate = this.shouldLabelsRotate(rotateOption, estimatedLongestLabelWidth, availableWidthPerBar);\n\n const tickAreaHeight = willRotate\n ? estimatedLongestLabelWidth * Math.SQRT1_2 + dynamicFontSize * Math.SQRT1_2 + this.TICK_AREA_PADDING\n : dynamicFontSize + this.TICK_AREA_PADDING + 2;\n const gapBelowTicks = options.xAxisLabel && !willRotate ? this.X_AXIS_TITLE_GAP : 0;\n const titleBlockHeight = options.xAxisLabel && !willRotate ? this.X_AXIS_TITLE_BLOCK_HEIGHT : 0;\n bottomPaddingForXAxis = tickAreaHeight + gapBelowTicks + titleBlockHeight;\n }\n\n // Determine plotting dimensions with sensible fallbacks\n const baseWidth = options.width ?? containerWidth;\n const totalWidth = Math.max(this.MIN_TOTAL_WIDTH, baseWidth > 0 ? baseWidth : this.MIN_TOTAL_WIDTH);\n const plotWidth = Math.max(0, totalWidth - leftPaddingForYAxis);\n\n const plotHeight = this.calculatePlotHeight(options.height, containerHeight, bottomPaddingForXAxis);\n\n this.width = plotWidth;\n this.height = plotHeight;\n\n // Create SVG with explicit pixel dimensions to avoid collapse\n const totalHeight = this.height + bottomPaddingForXAxis + this.TOP_EDGE_PADDING;\n\n const svg = this.d3\n .select(containerElement)\n .append('svg')\n .attr('width', '100%')\n .attr('height', String(totalHeight))\n .attr('viewBox', `0 0 ${totalWidth} ${totalHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n\n this.svg = svg;\n\n // Create chart group translated by internal paddings (no external margins)\n this.chart = this.svg\n .append('g')\n .attr('class', 'chart-content')\n .attr('transform', `translate(${leftPaddingForYAxis},${this.TOP_EDGE_PADDING})`);\n }\n\n /**\n * Calculates plot height based on options and container dimensions\n */\n private calculatePlotHeight(\n optionHeight: number | undefined,\n containerHeight: number,\n bottomPadding: number,\n ): number {\n if (optionHeight && optionHeight > 0) {\n return Math.max(this.MIN_PLOT_HEIGHT, optionHeight - bottomPadding);\n }\n if (containerHeight > 0) {\n return Math.max(this.MIN_PLOT_HEIGHT, containerHeight - bottomPadding, this.FALLBACK_PLOT_HEIGHT);\n }\n return this.FALLBACK_PLOT_HEIGHT;\n }\n\n /**\n * Determines if X-axis labels should rotate\n */\n private shouldLabelsRotate(\n rotateOption: boolean | undefined,\n estimatedWidth: number,\n availableWidth: number,\n ): boolean {\n if (rotateOption === true) return true;\n if (rotateOption === false) return false;\n return estimatedWidth > availableWidth;\n }\n\n /**\n * Creates x and y scales for the chart\n */\n private setupScales(data: AXBarChartData[]): void {\n // Get the bar width percentage (default 60%)\n const barWidthPercent = this.effectiveOptions().barWidth ?? 0.6;\n // Calculate padding based on barWidth (inverse relationship)\n const padding = Math.max(this.MIN_PADDING, 1 - barWidthPercent);\n\n // Create x scale (band scale for categorical data)\n this.xScale = this.d3\n .scaleBand()\n .domain(data.map((d) => d.id))\n .range([0, this.width])\n .padding(padding);\n\n // Create y scale (linear scale for values)\n // Support negative values by calculating min/max\n const minValue = this.d3.min(data, (d) => d.value) || 0;\n const maxValue = this.d3.max(data, (d) => d.value) || 0;\n\n this.yScale = this.d3\n .scaleLinear()\n .domain([Math.min(0, minValue), Math.max(0, maxValue)])\n .nice()\n .range([this.height, 0]);\n }\n\n /**\n * Creates x and y scales for clustered charts\n */\n private setupScalesClustered(groups: AXBarChartClusteredData[]): void {\n const seriesLabels = this.getClusterSeriesLabels(groups);\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n\n // Outer band for clusters\n this.xScale = this.d3\n .scaleBand()\n .domain(groups.map((g) => g.id))\n .range([0, this.width])\n .padding(this.OUTER_PADDING_CLUSTERED);\n\n // Inner band for series\n this.xSubScale = this.d3\n .scaleBand()\n .domain(visibleSeries)\n .range([0, this.xScale.bandwidth()])\n .padding(this.INNER_PADDING_CLUSTERED);\n\n // Y scale across all visible values (support negative values)\n const allVisibleValues: number[] = [];\n for (const g of groups) {\n visibleSeries.forEach((_, idx) => {\n const item = g.chartData[idx];\n if (item && typeof item.value === 'number') allVisibleValues.push(item.value);\n });\n }\n const yMin = this.d3.min(allVisibleValues) || 0;\n const yMax = this.d3.max(allVisibleValues) || 0;\n\n this.yScale = this.d3\n .scaleLinear()\n .domain([Math.min(0, yMin), Math.max(0, yMax)])\n .nice()\n .range([this.height, 0]);\n }\n\n /**\n * Creates x and y axes with grid lines\n */\n private createAxes(options: AXBarChartOption): void {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n\n const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n\n if (showXAxis) {\n this.createXAxis(axesGroup, options);\n }\n\n if (showYAxis) {\n this.createYAxis(axesGroup, options);\n }\n\n if (showGrid) {\n this.createGridLines();\n }\n }\n\n private createXAxis(\n axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n options: AXBarChartOption,\n ): void {\n const visibleDataForTicks = (this.data() || []).filter((d) => !this.isBarHidden(d.id));\n const idToLabel = new Map<string, string>(visibleDataForTicks.map((d) => [d.id, d.label]));\n this.buildXAxisCommon(axesGroup, idToLabel, options);\n }\n\n private createYAxis(\n axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n options: AXBarChartOption,\n ): void {\n // Create Y axis with smart number formatting\n const yAxisGenerator = this.d3.axisLeft(this.yScale).tickFormat((value: number | { valueOf(): number }) => {\n const numValue = typeof value === 'number' ? value : value.valueOf();\n return formatLargeNumber(numValue);\n });\n\n // Reduce tick count for better readability\n const maxValue = this.yScale.domain()[1];\n if (maxValue > 1e6) {\n yAxisGenerator.ticks(6); // Fewer ticks for large numbers\n } else if (maxValue > 1e3) {\n yAxisGenerator.ticks(8);\n }\n\n this.yAxis = axesGroup.append('g').attr('class', 'ax-bar-chart-axis-y').call(yAxisGenerator);\n\n // Style the axis text\n const dynamicFontSize = this.getYAxisTickFontSizeBasedOnHeight();\n this.yAxis\n .selectAll('text')\n .style('font-size', `${dynamicFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)')\n .attr('text-anchor', 'end')\n .attr('direction', 'ltr');\n\n // Style axis lines\n this.yAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n\n // Add Y axis title\n if (options.yAxisLabel) {\n this.createYAxisTitle(axesGroup, options.yAxisLabel);\n }\n }\n\n private shouldRotateXAxisLabels(idToLabel: Map<string, string>, fontSize: number): boolean {\n const options = this.effectiveOptions();\n\n // Check if user explicitly set rotation option\n if (options.rotateXAxisLabels === true) return true;\n if (options.rotateXAxisLabels === false) return false;\n\n // If 'auto' or undefined, use intelligent calculation\n if (this.xScale.domain().length === 0) return false;\n\n const step = this.xScale.step();\n const labels = Array.from(idToLabel.values());\n const longestLabel = labels.reduce((a, b) => (a.length > b.length ? a : b), '');\n const estimatedWidth = longestLabel.length * fontSize * this.CHAR_WIDTH_RATIO;\n\n // Heuristic: avoid rotation when there are few categories even if estimation is slightly larger\n const domainCount = this.xScale.domain().length;\n if (domainCount <= this.SMALL_DATASET_THRESHOLD) {\n return estimatedWidth > step * this.ROTATION_TOLERANCE_SMALL_DATASET;\n }\n\n return estimatedWidth > step;\n }\n\n private createXAxisTitle(\n axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n title: string,\n tickAreaHeight: number,\n gapBelowTicks = this.TICK_AREA_GAP,\n ): void {\n // Title positioned directly below tick area with a consistent gap\n const labelY = this.height + tickAreaHeight + gapBelowTicks;\n\n axesGroup\n .append('text')\n .attr('class', 'ax-bar-chart-axis-label ax-x-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'hanging') // Align to top of text for better positioning\n .attr('x', this.width / 2)\n .attr('y', labelY)\n .attr('direction', 'ltr')\n .style('font-size', `${this.X_AXIS_TITLE_FONT_SIZE}px`)\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(title);\n }\n\n private createYAxisTitle(axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>, title: string): void {\n // Calculate the exact position for Y-axis title\n // Y-axis tick labels use text-anchor: end, so they extend LEFT of the Y-axis line\n // Y-axis is at X = 0 within the chart group\n // Chart group is translated by (margin.left, margin.top)\n // So Y-axis is at X = margin.left in SVG coordinates\n\n const maxTickLabelWidth = this.calculateMaxYAxisTickLabelWidth();\n const padding = this.Y_AXIS_PADDING;\n\n // Position title to the left of the tick labels\n // Since text-anchor: end aligns the text to the Y-axis, we need to go further left\n const labelY = -maxTickLabelWidth - padding;\n\n // Center the title vertically\n const labelX = -this.height / 2;\n\n axesGroup\n .append('text')\n .attr('class', 'ax-bar-chart-axis-label ax-y-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('transform', 'rotate(-90)')\n .attr('x', labelX)\n .attr('y', labelY)\n .attr('direction', 'ltr')\n .style('font-size', '14px')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(title);\n }\n\n private calculateMaxYAxisTickLabelWidth(): number {\n // Calculate the maximum width needed for Y-axis tick labels\n const raw = (this.data() || []) as AXBarChartValue;\n const isClustered = this.isClusteredData(raw);\n\n let maxValue = 0;\n if (isClustered) {\n const groups = raw as AXBarChartClusteredData[];\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n\n for (const g of groups) {\n visibleSeries.forEach((_, idx) => {\n const item = g.chartData[idx];\n if (item && typeof item.value === 'number') maxValue = Math.max(maxValue, item.value);\n });\n }\n } else {\n const visibleData = (raw as AXBarChartData[]).filter((d) => !this.isBarHidden(d.id));\n maxValue = visibleData.reduce((acc, d) => (d.value > acc ? d.value : acc), 0);\n }\n\n // Use formatted number for width calculation\n const tickLabelText = Number.isFinite(maxValue) ? formatLargeNumber(maxValue) : '00000';\n return tickLabelText.length * this.DEFAULT_FONT_SIZE * this.FONT_WIDTH_MULTIPLIER + this.FONT_PADDING;\n }\n\n private createGridLines(): void {\n this.chart\n .append('g')\n .attr('class', 'ax-bar-chart-grid')\n .call(\n this.d3\n .axisLeft(this.yScale)\n .tickSize(-this.width)\n .tickFormat(() => ''),\n )\n .selectAll('line')\n .style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))')\n .style('stroke-opacity', 0.2);\n\n // Remove unneeded elements from grid\n this.chart.select('.ax-bar-chart-grid').selectAll('path, text').remove();\n }\n\n /**\n * Creates axes for clustered charts\n */\n private createAxesClustered(options: AXBarChartOption, groups: AXBarChartClusteredData[]): void {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n\n const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n\n if (showXAxis) {\n this.createXAxisClustered(axesGroup, options, groups);\n }\n\n if (showYAxis) {\n this.createYAxis(axesGroup, options);\n }\n\n if (showGrid) {\n this.createGridLines();\n }\n }\n\n private createXAxisClustered(\n axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n options: AXBarChartOption,\n groups: AXBarChartClusteredData[],\n ): void {\n const idToLabel = new Map<string, string>(groups.map((g) => [g.id, g.label]));\n this.buildXAxisCommon(axesGroup, idToLabel, options);\n }\n\n /**\n * Renders the bars with animations\n */\n private renderBars(data: AXBarChartData[]): void {\n // Filter out hidden bars\n const visibleData = data.filter((d) => !this.isBarHidden(d.id));\n const originalFullData = (this.data() as AXBarChartData[]) || [];\n\n // Reset animation state\n this._initialAnimationComplete.set(false);\n\n // Get corner radius from options\n const radius = this.effectiveOptions().cornerRadius;\n\n // Get animation options\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n\n // Create a container for all bars\n const barsContainer = this.chart.append('g').attr('class', 'ax-bar-chart-bars-container');\n\n // Create groups for each bar to handle transformations\n const barGroups = barsContainer\n .selectAll('.ax-bar-chart-bar-group')\n .data(visibleData)\n .enter()\n .append('g')\n .style('cursor', 'pointer')\n .attr('class', 'ax-bar-chart-bar-group');\n\n // Add bars inside groups\n const bars = barGroups\n .append('path')\n .attr('class', 'ax-bar-chart-bar')\n .attr('d', (d: AXBarChartData) => {\n const x = this.xScale(d.id);\n const width = this.xScale.bandwidth();\n const y = this.height - 0.5; // initial height is zero\n return `M${x},${y} L${x},${y} L${x + width},${y} L${x + width},${y} Z`;\n })\n .attr('fill', (d: AXBarChartData) => {\n // Find the index of the current bar (d) in the original data array\n const originalIndex = originalFullData.findIndex((item) => item.id === d.id);\n // Use the original color if provided, otherwise get color from palette using original index\n // Fallback to index 0 if not found, though this shouldn't happen with valid data.\n return d.color || this.getColor(originalIndex !== -1 ? originalIndex : 0);\n });\n\n // Add data labels if they're enabled\n if (this.effectiveOptions().showDataLabels !== false) {\n barGroups\n .append('text')\n .attr('class', 'ax-bar-chart-data-label')\n .attr('text-anchor', 'middle')\n .attr('x', (d: AXBarChartData) => this.xScale(d.id) + this.xScale.bandwidth() / 2)\n .attr('y', this.height) // Start from bottom for animation\n .style('font-size', 'clamp(8px, 2vmin, 12px)')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-data-labels-color))')\n .style('opacity', 0) // Start invisible for animation\n .text((d: AXBarChartData) => {\n // Format large numbers in data labels\n return d.value >= 1000 ? formatLargeNumber(d.value) : d.value;\n });\n\n // Animate data labels with smart positioning to avoid clipping\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n barGroups\n .selectAll('.ax-bar-chart-data-label')\n .transition()\n .duration(animationDuration)\n .delay((d: AXBarChartData, i: number) => i * animationDelay + this.LABEL_ANIMATION_DELAY)\n .attr('y', (d: AXBarChartData) => {\n const barTop = this.yScale(d.value);\n\n // If bar is near the top (100% or close), position label inside the bar\n if (barTop < this.MIN_TOP_SPACE_FOR_LABEL) {\n return barTop + this.LABEL_OFFSET;\n }\n\n // Otherwise, position above the bar\n return barTop - this.LABEL_OFFSET;\n })\n .attr('data-inside-bar', (d: AXBarChartData) => {\n const barTop = this.yScale(d.value);\n return barTop < this.MIN_TOP_SPACE_FOR_LABEL ? 'true' : 'false';\n })\n .style('opacity', 1)\n .ease(animationEasing);\n }\n\n // Set up event handlers on each group\n barGroups\n .on('mouseenter', (event: MouseEvent, d: AXBarChartData) => {\n // Only apply hover effects if initial animation is complete\n if (!this._initialAnimationComplete()) return;\n\n const barEl = this.d3.select(event.currentTarget).select('path');\n\n // Standard hover effect - darken the bar slightly and add a subtle shadow\n barEl\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .style('filter', 'brightness(0.7) drop-shadow(0 0 2px rgba(0,0,0,0.1))');\n\n this.handleBarHover(event, d);\n })\n .on('mousemove', (event: MouseEvent) => {\n // Only update tooltip if initial animation is complete\n if (this._initialAnimationComplete()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', (event: MouseEvent) => {\n // Only apply hover effects if initial animation is complete\n if (!this._initialAnimationComplete()) return;\n\n const barEl = this.d3.select(event.currentTarget).select('path');\n\n // Remove hover effect\n barEl.transition().duration(this.HOVER_TRANSITION_DURATION).style('filter', null);\n\n this._tooltipVisible.set(false);\n })\n .on('click', (event: MouseEvent, d: AXBarChartData) => {\n // Only trigger click events if initial animation is complete\n if (this._initialAnimationComplete()) {\n this.handleBarClick(event, d);\n }\n });\n\n // Add animation\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n bars\n .transition()\n .duration(animationDuration)\n .delay((d: AXBarChartData, i: number) => i * animationDelay)\n .attrTween('d', (d: AXBarChartData) => {\n const x = this.xScale(d.id);\n const width = this.xScale.bandwidth();\n const finalHeight = this.height - this.yScale(d.value);\n\n return (t: number) => {\n const currentHeight = finalHeight * t;\n const currentY = this.height - currentHeight;\n const bottomY = this.height - 0.5; // Add small gap to prevent overlap with x-axis\n\n if (radius > 0 && currentHeight > 0) {\n // Limit radius to prevent it from exceeding half the bar width\n const effectiveRadius = Math.min(radius, width / 2);\n return `M${x},${bottomY} L${x},${currentY + effectiveRadius} Q${x},${currentY} ${x + effectiveRadius},${currentY} L${x + width - effectiveRadius},${currentY} Q${x + width},${currentY} ${x + width},${currentY + effectiveRadius} L${x + width},${bottomY} Z`;\n } else {\n return `M${x},${bottomY} L${x},${currentY} L${x + width},${currentY} L${x + width},${bottomY} Z`;\n }\n };\n })\n .ease(animationEasing) // Use the configured easing function\n .end() // Wait for all animations to complete\n .then(() => {\n // Mark animation as complete to enable hover effects\n this._initialAnimationComplete.set(true);\n });\n }\n\n /**\n * Renders bars for clustered charts\n */\n private renderBarsClustered(groups: AXBarChartClusteredData[]): void {\n const seriesLabels = this.getClusterSeriesLabels(groups);\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n\n this._initialAnimationComplete.set(false);\n\n const radius = this.effectiveOptions().cornerRadius;\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n\n const barsContainer = this.chart.append('g').attr('class', 'ax-bar-chart-bars-container');\n\n const groupSel = barsContainer\n .selectAll('.ax-bar-chart-group')\n .data(groups)\n .enter()\n .append('g')\n .attr('class', 'ax-bar-chart-group')\n .attr('transform', (g: AXBarChartClusteredData) => `translate(${this.xScale(g.id)},0)`);\n\n type ClusteredBarDatum = { group: AXBarChartClusteredData; seriesLabel: string; seriesIndex: number };\n\n const barGroups = groupSel\n .selectAll('.ax-bar-chart-bar-group')\n .data((g: AXBarChartClusteredData) =>\n visibleSeries.map((label, idx): ClusteredBarDatum => ({ group: g, seriesLabel: label, seriesIndex: idx })),\n )\n .enter()\n .append('g')\n .style('cursor', 'pointer')\n .attr('class', 'ax-bar-chart-bar-group');\n\n const bars = barGroups\n .append('path')\n .attr('class', 'ax-bar-chart-bar')\n .attr('data-series', (d: ClusteredBarDatum) => d.seriesLabel)\n .attr('d', (d: ClusteredBarDatum) => {\n const x = this.xSubScale(d.seriesLabel);\n const width = this.xSubScale.bandwidth();\n const y = this.height - 0.5;\n return `M${x},${y} L${x},${y} L${x + width},${y} L${x + width},${y} Z`;\n })\n .attr('fill', (d: ClusteredBarDatum) => {\n const item = d.group.chartData[d.seriesIndex];\n return item?.color || this.getColor(d.seriesIndex);\n });\n\n if (this.effectiveOptions().showDataLabels !== false) {\n barGroups\n .append('text')\n .attr('class', 'ax-bar-chart-data-label')\n .attr('text-anchor', 'middle')\n .attr('x', (d: ClusteredBarDatum) => (this.xSubScale(d.seriesLabel) || 0) + this.xSubScale.bandwidth() / 2)\n .attr('y', this.height)\n .style('font-size', 'clamp(8px, 2vmin, 12px)')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-data-labels-color))')\n .style('opacity', 0)\n .text((d: ClusteredBarDatum) => {\n const value = d.group.chartData[d.seriesIndex]?.value;\n if (value === undefined) return '';\n // Format large numbers in data labels\n return value >= 1000 ? formatLargeNumber(value) : value;\n });\n\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n barGroups\n .selectAll('.ax-bar-chart-data-label')\n .transition()\n .duration(animationDuration)\n .delay((_d: unknown, i: number) => i * animationDelay + this.LABEL_ANIMATION_DELAY)\n .attr('y', (d: ClusteredBarDatum) => {\n const item = d.group.chartData[d.seriesIndex];\n if (!item) return this.height;\n\n const barTop = this.yScale(item.value);\n\n // If bar is near the top (100% or close), position label inside the bar\n if (barTop < this.MIN_TOP_SPACE_FOR_LABEL) {\n return barTop + this.LABEL_OFFSET;\n }\n\n // Otherwise, position above the bar\n return barTop - this.LABEL_OFFSET;\n })\n .attr('data-inside-bar', (d: ClusteredBarDatum) => {\n const item = d.group.chartData[d.seriesIndex];\n if (!item) return 'false';\n\n const barTop = this.yScale(item.value);\n return barTop < this.MIN_TOP_SPACE_FOR_LABEL ? 'true' : 'false';\n })\n .style('opacity', 1)\n .ease(animationEasing);\n }\n\n barGroups\n .on('mouseenter', (event: MouseEvent, d: ClusteredBarDatum) => {\n if (!this._initialAnimationComplete()) return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n barEl\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .style('filter', 'brightness(0.7) drop-shadow(0 0 2px rgba(0,0,0,0.1))');\n const item = d.group.chartData[d.seriesIndex];\n if (item) this.handleBarHover(event, item, d.group);\n })\n .on('mousemove', (event: MouseEvent) => {\n if (this._initialAnimationComplete()) this.updateTooltipPosition(event);\n })\n .on('mouseleave', (event: MouseEvent) => {\n if (!this._initialAnimationComplete()) return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n barEl.transition().duration(this.HOVER_TRANSITION_DURATION).style('filter', null);\n this._tooltipVisible.set(false);\n })\n .on('click', (event: MouseEvent, d: ClusteredBarDatum) => {\n if (!this._initialAnimationComplete()) return;\n const item = d.group.chartData[d.seriesIndex];\n if (item) this.handleBarClick(event, item);\n });\n\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n bars\n .transition()\n .duration(animationDuration)\n .delay((_d: unknown, i: number) => i * animationDelay)\n .attrTween('d', (d: ClusteredBarDatum) => {\n const x = this.xSubScale(d.seriesLabel);\n const width = this.xSubScale.bandwidth();\n const item = d.group.chartData[d.seriesIndex];\n const finalHeight = item ? this.height - this.yScale(item.value) : 0;\n\n return (t: number) => {\n const currentHeight = finalHeight * t;\n const currentY = this.height - currentHeight;\n const bottomY = this.height - 0.5; // Add small gap to prevent overlap with x-axis\n\n if (radius > 0 && currentHeight > 0) {\n // Limit radius to prevent it from exceeding half the bar width\n const effectiveRadius = Math.min(radius, width / 2);\n return `M${x},${bottomY} L${x},${currentY + effectiveRadius} Q${x},${currentY} ${x + effectiveRadius},${currentY} L${x + width - effectiveRadius},${currentY} Q${x + width},${currentY} ${x + width},${currentY + effectiveRadius} L${x + width},${bottomY} Z`;\n } else {\n return `M${x},${bottomY} L${x},${currentY} L${x + width},${currentY} L${x + width},${bottomY} Z`;\n }\n };\n })\n .ease(animationEasing)\n .end()\n .then(() => this._initialAnimationComplete.set(true));\n }\n\n /**\n * Gets the appropriate D3 easing function based on the option string\n */\n // getEasingFunction moved to shared chart utils\n\n /**\n * Handles bar hover event and shows tooltip\n */\n private handleBarHover(event: MouseEvent, datum: AXBarChartData, group?: { id: string; label: string }): void {\n if (this.effectiveOptions().showTooltip !== false) {\n const dataValue = this.data() as AXBarChartValue;\n const isClustered = this.isClusteredData(dataValue);\n const flatData: AXBarChartData[] = isClustered\n ? (dataValue as AXBarChartClusteredData[]).flatMap((g) => g.chartData)\n : (dataValue as AXBarChartData[]) || [];\n const index = flatData.findIndex((item) => item.id === datum.id && item.label === datum.label);\n const color = datum.color || this.getColor(index !== -1 ? index : 0);\n\n // Calculate percentage of total\n const total = isClustered\n ? (dataValue as AXBarChartClusteredData[]).reduce(\n (sum, g) => sum + g.chartData.reduce((s, it) => s + it.value, 0),\n 0,\n )\n : (flatData as AXBarChartData[]).reduce((sum, item) => sum + item.value, 0);\n const percentage = total > 0 ? ((datum.value / total) * 100).toFixed(1) : '0';\n\n this._tooltipData.set({\n title: group ? `${datum.tooltipLabel || datum.label} — ${group.label}` : datum.tooltipLabel || datum.label,\n value: formatLargeNumber(datum.value),\n percentage: `${percentage}%`,\n color: color,\n });\n\n this.updateTooltipPosition(event);\n this._tooltipVisible.set(true);\n }\n }\n\n /**\n * Updates tooltip position based on mouse coordinates\n * Enhanced to handle overflow issues by positioning tooltips more intelligently\n */\n private updateTooltipPosition(event: MouseEvent): void {\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl) return;\n const containerRect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip') as HTMLElement | null;\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n\n // Enhanced positioning logic for better tooltip placement\n const pos = this.computeEnhancedTooltipPosition(containerRect, tooltipRect, event.clientX, event.clientY);\n this._tooltipPosition.set(pos);\n }\n\n /**\n * Enhanced tooltip positioning that considers chart boundaries and prevents overflow\n */\n private computeEnhancedTooltipPosition(\n containerRect: DOMRect,\n tooltipRect: DOMRect | null,\n clientX: number,\n clientY: number,\n ): { x: number; y: number } {\n const cursorX = clientX - containerRect.left;\n const cursorY = clientY - containerRect.top;\n\n if (!tooltipRect) {\n // Default positioning when tooltip dimensions are unknown\n return {\n x: Math.min(cursorX + this.TOOLTIP_GAP, containerRect.width - this.TOOLTIP_GAP),\n y: Math.max(this.TOOLTIP_GAP, Math.min(cursorY, containerRect.height - this.TOOLTIP_GAP)),\n };\n }\n\n // Calculate available space in each direction\n const spaceRight = containerRect.width - cursorX;\n const spaceLeft = cursorX;\n const spaceBelow = containerRect.height - cursorY;\n const spaceAbove = cursorY;\n\n // Determine best horizontal position\n let x: number;\n if (spaceRight >= tooltipRect.width + this.TOOLTIP_GAP) {\n // Position to the right of cursor\n x = cursorX + this.TOOLTIP_GAP;\n } else if (spaceLeft >= tooltipRect.width + this.TOOLTIP_GAP) {\n // Position to the left of cursor\n x = cursorX - tooltipRect.width - this.TOOLTIP_GAP;\n } else {\n // Center horizontally if neither side has enough space\n x = Math.max(\n this.TOOLTIP_GAP,\n Math.min(\n (containerRect.width - tooltipRect.width) / 2,\n containerRect.width - tooltipRect.width - this.TOOLTIP_GAP,\n ),\n );\n }\n\n // Calculate best vertical position\n let y: number;\n if (spaceBelow >= tooltipRect.height + this.TOOLTIP_GAP) {\n // Position below cursor\n y = cursorY + this.TOOLTIP_GAP;\n } else if (spaceAbove >= tooltipRect.height + this.TOOLTIP_GAP) {\n // Position above cursor\n y = cursorY - tooltipRect.height - this.TOOLTIP_GAP;\n } else {\n // Center vertically if neither direction has enough space\n y = Math.max(\n this.TOOLTIP_GAP,\n Math.min(\n (containerRect.height - tooltipRect.height) / 2,\n containerRect.height - tooltipRect.height - this.TOOLTIP_GAP,\n ),\n );\n }\n\n // Ensure tooltip stays within container bounds\n x = Math.max(this.TOOLTIP_GAP, Math.min(x, containerRect.width - tooltipRect.width - this.TOOLTIP_GAP));\n y = Math.max(this.TOOLTIP_GAP, Math.min(y, containerRect.height - tooltipRect.height - this.TOOLTIP_GAP));\n\n return { x, y };\n }\n\n /**\n * Handles bar click event\n */\n private handleBarClick(event: MouseEvent, datum: AXBarChartData): void {\n this.barClick.emit({ item: datum, event: { nativeEvent: event, sender: this } });\n }\n\n /**\n * Shows a message when no data is available\n */\n private showNoDataMessage(containerElement: HTMLElement): void {\n this.clearChartArea(containerElement);\n this.showMessage(\n containerElement,\n this.effectiveMessages().noDataIcon,\n this.effectiveMessages().noData,\n this.effectiveMessages().noDataHelp,\n 'ax-bar-chart-no-data-message',\n );\n }\n\n /**\n * Shows a message when all bars are hidden\n */\n private showAllBarsHiddenMessage(containerElement: HTMLElement): void {\n this.clearChartArea(containerElement);\n this.showMessage(\n containerElement,\n this.effectiveMessages().allHiddenIcon,\n this.effectiveMessages().allHidden,\n this.effectiveMessages().allHiddenHelp,\n 'ax-bar-chart-no-data-message',\n );\n }\n\n /**\n * Gets the color for a bar based on its index\n */\n protected getColor(index: number): string {\n return getChartColor(index, this.chartColors);\n }\n\n /**\n * Checks if a bar is hidden\n */\n protected isBarHidden(id: string): boolean {\n return this.hiddenBars.has(id);\n }\n\n /**\n * Implementation of AXChartLegendCompatible interface\n * Returns legend items based on the chart data\n */\n getLegendItems(): AXChartLegendItem[] {\n const value = (this.data() || []) as AXBarChartValue;\n if (this.isClusteredData(value)) {\n const groups = value as AXBarChartClusteredData[];\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const total = groups.reduce(\n (sum, g) => sum + g.chartData.reduce((s, it) => s + (typeof it.value === 'number' ? it.value : 0), 0),\n 0,\n );\n return seriesLabels.map((label, index) => {\n const seriesTotal = groups.reduce((s, g) => {\n const item = g.chartData[index];\n const v = item && typeof item.value === 'number' ? item.value : 0;\n return s + v;\n }, 0);\n const percentage = total > 0 ? (seriesTotal / total) * 100 : 0;\n const firstItem = groups[0]?.chartData[index];\n return {\n id: label,\n name: label || `Series ${index + 1}`,\n value: seriesTotal,\n percentage,\n color: firstItem?.color || this.getColor(index),\n hidden: this.hiddenSeries.has(label),\n };\n });\n }\n\n const flat = value as AXBarChartData[];\n const total = flat.reduce((sum, item) => sum + (typeof item.value === 'number' ? item.value : 0), 0);\n return flat.map((item, index) => {\n const val = typeof item.value === 'number' ? item.value : 0;\n const percentage = total > 0 ? (val / total) * 100 : 0;\n return {\n id: item.id,\n name: item.label || `Item ${index + 1}`,\n value: item.value,\n percentage,\n color: item.color || this.getColor(index),\n hidden: this.isBarHidden(item.id),\n };\n });\n }\n\n /**\n * Implementation of AXChartLegendCompatible interface\n * Highlights a specific bar by ID\n */\n highlightSegment(id: string | null): void {\n if (!this.svg) return;\n\n const value = (this.data() || []) as AXBarChartValue;\n const isClustered = this.isClusteredData(value);\n\n const resetAll = () => {\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .classed('ax-bar-chart-highlighted', false)\n .classed('ax-bar-chart-dimmed', false)\n .attr('opacity', 1)\n .attr('filter', null)\n .attr('stroke', null)\n .attr('stroke-width', null)\n .attr('stroke-opacity', null);\n };\n\n if (id === null) {\n resetAll();\n return;\n }\n\n if (!isClustered) {\n if (this.isBarHidden(id as string)) {\n resetAll();\n return;\n }\n const targetBar = this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((d: unknown) => (d as AXBarChartData | undefined)?.id === id);\n if (targetBar.empty()) return;\n const isCurrentlyHighlighted = targetBar.classed('ax-bar-chart-highlighted');\n if (isCurrentlyHighlighted) {\n resetAll();\n } else {\n resetAll();\n targetBar\n .classed('ax-bar-chart-highlighted', true)\n .attr('filter', 'drop-shadow(0 0 4px rgba(0, 0, 0, 0.3))')\n .attr('stroke', '#000')\n .attr('stroke-width', '1px')\n .attr('stroke-opacity', '0.3')\n .style('transition', 'all 0.2s ease-in-out');\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((d: unknown) => (d as AXBarChartData | undefined)?.id !== id)\n .classed('ax-bar-chart-dimmed', true)\n .attr('opacity', 0.5)\n .style('transition', 'opacity 0.2s ease-in-out');\n }\n return;\n }\n\n const targetBars = this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((_d: unknown, i: number, nodes: SVGPathElement[]) => {\n const node = nodes[i];\n return node.getAttribute('data-series') === id;\n });\n if (targetBars.empty()) return;\n const isHighlighted = targetBars.classed('ax-bar-chart-highlighted');\n if (isHighlighted) {\n resetAll();\n } else {\n resetAll();\n targetBars\n .classed('ax-bar-chart-highlighted', true)\n .attr('filter', 'drop-shadow(0 0 4px rgba(0, 0, 0, 0.3))')\n .attr('stroke', '#000')\n .attr('stroke-width', '1px')\n .attr('stroke-opacity', '0.3')\n .style('transition', 'all 0.2s ease-in-out');\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((_d: unknown, i: number, nodes: SVGPathElement[]) => nodes[i].getAttribute('data-series') !== id)\n .classed('ax-bar-chart-dimmed', true)\n .attr('opacity', 0.5)\n .style('transition', 'opacity 0.2s ease-in-out');\n }\n }\n\n /**\n * Implementation of AXChartLegendCompatible interface\n * Toggles visibility of a bar by ID\n * @returns New visibility state (true = visible, false = hidden)\n */\n toggleSegment(id: string): boolean {\n const value = (this.data() || []) as AXBarChartValue;\n const isClustered = this.isClusteredData(value);\n\n if (!isClustered) {\n const wasAllHidden =\n (value as AXBarChartData[]).length > 0 && (value as AXBarChartData[]).every((d) => this.isBarHidden(d.id));\n if (this.hiddenBars.has(id)) {\n this.hiddenBars.delete(id);\n if (wasAllHidden) {\n if (this.chartContainerEl()?.nativeElement) {\n this.d3\n ?.select(this.chartContainerEl().nativeElement)\n .selectAll('svg, .ax-chart-message-container')\n .remove();\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n } else {\n this.updateChart();\n }\n } else {\n this.hiddenBars.add(id);\n this.updateChart();\n }\n return !this.hiddenBars.has(id);\n }\n\n // Clustered mode: toggle series by label\n const groups = value as AXBarChartClusteredData[];\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const seriesCount = seriesLabels.length;\n const wasAllHidden = seriesCount > 0 && this.hiddenSeries.size >= seriesCount;\n\n if (this.hiddenSeries.has(id)) {\n this.hiddenSeries.delete(id);\n if (wasAllHidden) {\n if (this.chartContainerEl()?.nativeElement) {\n this.d3?.select(this.chartContainerEl().nativeElement).selectAll('svg, .ax-chart-message-container').remove();\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n } else {\n this.updateChart();\n }\n } else {\n this.hiddenSeries.add(id);\n this.updateChart();\n }\n\n return !this.hiddenSeries.has(id);\n }\n\n // ===== Helper utilities for modularity and maintainability =====\n\n private getContainerElement(): HTMLElement | null {\n return this.chartContainerEl()?.nativeElement ?? null;\n }\n\n private clearChartArea(containerElement: HTMLElement): void {\n this.d3.select(containerElement).selectAll('svg, .ax-chart-message-container').remove();\n }\n\n /**\n * Truncates long labels with ellipsis\n */\n private truncateLabel(label: string, maxLength: number = this.MAX_LABEL_LENGTH): string {\n if (label.length <= maxLength) return label;\n return label.substring(0, maxLength - 1) + '…';\n }\n\n /**\n * Gets adaptive font size for X-axis based on width and item count\n */\n private getXAxisTickFontSizeBasedOnWidth(): number {\n const itemCount = this.xScale.domain().length;\n const baseSize = Math.round(this.width / 50);\n\n // Reduce font size for many items\n let adjustedSize = baseSize;\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n adjustedSize = Math.round(baseSize * 0.7);\n } else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n adjustedSize = Math.round(baseSize * 0.85);\n }\n\n return Math.max(this.MIN_FONT_SIZE_X_AXIS, Math.min(this.MAX_FONT_SIZE_X_AXIS, adjustedSize));\n }\n\n /**\n * Gets adaptive font size for Y-axis based on height\n */\n private getYAxisTickFontSizeBasedOnHeight(): number {\n const baseSize = Math.round(this.height / 30);\n return Math.max(this.MIN_FONT_SIZE_Y_AXIS, Math.min(this.MAX_FONT_SIZE_Y_AXIS, baseSize));\n }\n\n private buildXAxisCommon(\n axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n idToLabel: Map<string, string>,\n options: AXBarChartOption,\n ): void {\n const itemCount = this.xScale.domain().length;\n\n // Smart tick reduction for many items\n let tickValues = this.xScale.domain();\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n // Show every 5th tick\n tickValues = tickValues.filter((_d, i) => i % 5 === 0);\n } else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n // Show every 2nd tick\n tickValues = tickValues.filter((_d, i) => i % 2 === 0);\n }\n\n const axis = this.d3\n .axisBottom(this.xScale)\n .tickValues(tickValues)\n .tickFormat((id: string) => {\n const label = idToLabel.get(id) ?? String(id);\n // Truncate long labels intelligently\n const maxLength = itemCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n return this.truncateLabel(label, maxLength);\n });\n\n this.xAxis = axesGroup\n .append('g')\n .attr('class', 'ax-bar-chart-axis-x')\n .attr('transform', `translate(0,${this.height})`)\n .call(axis);\n\n const dynamicFontSize = this.getXAxisTickFontSizeBasedOnWidth();\n const xAxisTicks = this.xAxis\n .selectAll('text')\n .style('font-size', `${dynamicFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)')\n .attr('direction', 'ltr');\n\n const isRotated = this.shouldRotateXAxisLabels(idToLabel, dynamicFontSize);\n if (isRotated) {\n xAxisTicks.attr('transform', 'rotate(-45)').style('text-anchor', 'end').attr('dx', '-0.8em').attr('dy', '0.15em');\n }\n\n this.xAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n\n if (options.xAxisLabel && !isRotated) {\n const tickNodes = (this.xAxis.selectAll('text').nodes() || []) as SVGTextElement[];\n const measuredTickHeight =\n tickNodes.length > 0\n ? Math.max(\n ...tickNodes.map((n) => {\n try {\n return n?.getBBox?.()?.height ?? dynamicFontSize;\n } catch {\n return dynamicFontSize;\n }\n }),\n )\n : dynamicFontSize;\n const tickAreaHeight = measuredTickHeight + this.TICK_AREA_PADDING;\n const gapBelowTicks = this.X_AXIS_TITLE_GAP;\n this.createXAxisTitle(axesGroup, options.xAxisLabel, tickAreaHeight, gapBelowTicks);\n }\n }\n\n // computeTooltipPosition moved to shared chart utils\n\n private showMessage(\n containerElement: HTMLElement,\n iconClass: string,\n text: string,\n helpText: string,\n specificClass: string,\n ): void {\n const container = this.d3\n .select(containerElement)\n .append('div')\n .attr('class', `ax-chart-message-container ax-bar-chart-message-background ${specificClass}`);\n\n container\n .append('div')\n .attr('class', 'ax-chart-message-icon ax-bar-chart-no-data-icon')\n .html(`<i class=\"${iconClass} fa-2x\"></i>`);\n\n container.append('div').attr('class', 'ax-chart-message-text ax-bar-chart-no-data-text').text(text);\n\n container.append('div').attr('class', 'ax-chart-message-help ax-bar-chart-no-data-help').text(helpText);\n }\n}\n","<div class=\"ax-bar-chart\" role=\"img\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"true\"\n ></ax-chart-tooltip>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAGO,MAAM,uBAAuB,GAAqB;AACvD,IAAA,SAAS,EAAE,IAAI;AACf,IAAA,SAAS,EAAE,IAAI;AACf,IAAA,QAAQ,EAAE,IAAI;AACd,IAAA,cAAc,EAAE,IAAI;AACpB,IAAA,WAAW,EAAE,IAAI;AACjB,IAAA,iBAAiB,EAAE,MAAM;AACzB,IAAA,QAAQ,EAAE,EAAE;AACZ,IAAA,YAAY,EAAE,CAAC;AACf,IAAA,iBAAiB,EAAE,GAAG;AACtB,IAAA,eAAe,EAAE,WAAW;AAC5B,IAAA,QAAQ,EAAE;AACR,QAAA,MAAM,EAAE,mBAAmB;AAC3B,QAAA,UAAU,EAAE,0CAA0C;AACtD,QAAA,SAAS,EAAE,qBAAqB;AAChC,QAAA,aAAa,EAAE,oCAAoC;AACnD,QAAA,UAAU,EAAE,0BAA0B;AACtC,QAAA,aAAa,EAAE,uBAAuB;AACvC,KAAA;;MAGU,mBAAmB,GAAG,IAAI,cAAc,CAAmB,qBAAqB,EAAE;AAC7F,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,MAAM,uBAAuB;AACvC,CAAA;AAIK,SAAU,cAAc,CAAC,MAAA,GAAgC,EAAE,EAAA;AAC/D,IAAA,MAAM,MAAM,GAAG;AACb,QAAA,GAAG,uBAAuB;AAC1B,QAAA,GAAG,MAAM;KACV;AACD,IAAA,OAAO,MAAM;AACf;;ACFA;;;AAGG;AASG,MAAO,mBACX,SAAQ,gBAAgB,CAAA;;;AAKxB,IAAA,IAAI,GAAG,KAAK,CAAkB,EAAqB,gDAAC;;AAGpD,IAAA,OAAO,GAAG,KAAK,CAAmB,EAAE,mDAAC;;;IAIrC,QAAQ,GAAG,MAAM,EAAwB;;AAGxB,IAAA,gBAAgB,GAAG,SAAS,CAAC,QAAQ,CAA6B,gBAAgB,CAAC;;AAG1F,IAAA,EAAE;;AAGJ,IAAA,GAAG;AACH,IAAA,KAAK;AACL,IAAA,MAAM;AACN,IAAA,MAAM;AACN,IAAA,SAAS;AACT,IAAA,KAAK;AACL,IAAA,KAAK;;AAGL,IAAA,KAAK;AACL,IAAA,MAAM;AACN,IAAA,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;;IAGxC,gBAAgB,GAAG,IAAI;IACvB,WAAW,GAAG,EAAE;IAChB,iBAAiB,GAAG,EAAE;IACtB,sBAAsB,GAAG,EAAE;IAC3B,oBAAoB,GAAG,EAAE;IACzB,sBAAsB,GAAG,EAAE;IAC3B,gBAAgB,GAAG,EAAE;IACrB,yBAAyB,GAAG,EAAE;IAC9B,gBAAgB,GAAG,CAAC;IACpB,oBAAoB,GAAG,GAAG;IAC1B,eAAe,GAAG,GAAG;IACrB,eAAe,GAAG,GAAG;IACrB,uBAAuB,GAAG,GAAG;IAC7B,uBAAuB,GAAG,GAAG;IAC7B,WAAW,GAAG,GAAG;IACjB,yBAAyB,GAAG,GAAG;IAC/B,uBAAuB,GAAG,EAAE;IAC5B,qBAAqB,GAAG,GAAG;IAC3B,uBAAuB,GAAG,EAAE;IAC5B,YAAY,GAAG,CAAC;IAChB,gCAAgC,GAAG,GAAG;IACtC,uBAAuB,GAAG,CAAC;IAC3B,cAAc,GAAG,EAAE;IACnB,iBAAiB,GAAG,CAAC;IACrB,aAAa,GAAG,CAAC;IACjB,iBAAiB,GAAG,EAAE;IACtB,qBAAqB,GAAG,GAAG;IAC3B,YAAY,GAAG,CAAC;IAChB,gBAAgB,GAAG,EAAE;IACrB,oBAAoB,GAAG,CAAC;IACxB,oBAAoB,GAAG,EAAE;IACzB,oBAAoB,GAAG,CAAC;IACxB,oBAAoB,GAAG,EAAE;IACzB,oBAAoB,GAAG,EAAE;IACzB,yBAAyB,GAAG,EAAE;;AAGvC,IAAA,yBAAyB,GAAG,MAAM,CAAC,KAAK,qEAAC;;AAGzC,IAAA,eAAe,GAAG,MAAM,CAAC,KAAK,2DAAC;AAC/B,IAAA,gBAAgB,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,4DAAC;IACzC,YAAY,GAAG,MAAM,CAAqB;AAChD,QAAA,KAAK,EAAE,EAAE;AACT,QAAA,KAAK,EAAE,GAAG;AACV,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,KAAK,EAAE,EAAE;AACV,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;AAGM,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;AAC5B,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,qDAAC;;AAGvB,IAAA,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;AAClD,IAAA,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;AACpD,IAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;;AAG9C,IAAA,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC;;AAGzC,IAAA,WAAW,GAAG,MAAM,CAAC,sBAAsB,CAAC;;;;AAM1C,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;QACzC,OAAO;YACL,GAAG,IAAI,CAAC,WAAW;YACnB,GAAG,IAAI,CAAC,OAAO,EAAE;SAClB;AACH,IAAA,CAAC,4DAAC;;AAGQ,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;AAC1C,QAAA,MAAM,eAAe,GAAG;AACtB,YAAA,MAAM,EAAE,mBAAmB;AAC3B,YAAA,UAAU,EAAE,0CAA0C;AACtD,YAAA,SAAS,EAAE,qBAAqB;AAChC,YAAA,aAAa,EAAE,oCAAoC;AACnD,YAAA,UAAU,EAAE,0BAA0B;AACtC,YAAA,aAAa,EAAE,uBAAuB;SACvC;QACD,OAAO;AACL,YAAA,GAAG,eAAe;AAClB,YAAA,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,QAAQ;SACpC;AACH,IAAA,CAAC,6DAAC;;AAGe,IAAA,UAAU,GAAG,IAAI,GAAG,EAAU;AAC9B,IAAA,YAAY,GAAG,IAAI,GAAG,EAAU;;AAGhC,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AAC/C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE;AACzB,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,IAAI,KAAK,CAAC,CAAC,CAAC;AAC5E,IAAA,CAAC,2DAAC;AAEe,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;AAC/B,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;AAC1B,YAAA,OAAO,KAAkC;QAC3C;QACA,OAAQ,KAA0B,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC9E,IAAA,CAAC,uDAAC;AAEe,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AAC9C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE;AACzB,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AAE7D,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YAC1B,MAAM,MAAM,GAAG,KAAkC;YACjD,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC;YACxD,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC3E,YAAA,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/E;QAEA,OAAQ,KAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC5E,IAAA,CAAC,0DAAC;;AAGM,IAAA,eAAe,CAAC,KAAsB,EAAA;AAC5C,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,IAAI,KAAK,CAAC,CAAC,CAAC;IAC5E;AAEQ,IAAA,sBAAsB,CAAC,MAAiC,EAAA;QAC9D,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;IACxD;AAEA,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;;QAEP,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YAC3B,IAAI,CAAC,MAAM,EAAE;;YAEb,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;gBACtC,IAAI,CAAC,WAAW,EAAE;AAClB,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAC1B;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;;YAEV,IAAI,CAAC,IAAI,EAAE;YACX,IAAI,CAAC,gBAAgB,EAAE;;AAGvB,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;gBACpB,IAAI,CAAC,WAAW,EAAE;YACpB;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA;;AAEG;AACO,IAAA,MAAM,MAAM,GAAA;AACpB,QAAA,IAAI;YACF,IAAI,CAAC,EAAE,GAAG,MAAM,OAAO,IAAI,CAAC;;YAE5B,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;gBAClD,IAAI,CAAC,WAAW,EAAE;AAClB,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAC1B;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC;QAC/C;IACF;AAEA;;AAEG;IACI,WAAW,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa;YAAE;QAEzD,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,aAAa;QAC9D,MAAM,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAoB;QACzD,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;;AAGpD,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE;AAC3C,QAAA,MAAM,iBAAiB,GAAG,WAAW,GAAG,EAAE,GAAI,IAAI,CAAC,WAAW,EAAuB;QACrF,MAAM,WAAW,GAAG,WAAW,GAAI,UAAwC,GAAG,EAAE;;AAGhF,QAAA,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC,MAAM,EAAE;;AAGvF,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;AACzD,YAAA,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC;YACxC;QACF;;QAGA,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,IAAI,CAAC,wBAAwB,CAAC,gBAAgB,CAAC;YAC/C;QACF;;AAGA,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAC5C,QAAA,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,YAAY,CAAC;;QAGpD,IAAI,WAAW,EAAE;AACf,YAAA,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC;AACtC,YAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,WAAW,CAAC;AACnD,YAAA,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC;QACvC;aAAO;AACL,YAAA,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC;AACnC,YAAA,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;AAC7B,YAAA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;QACpC;IACF;AAEA;;AAEG;IACI,WAAW,GAAA;QAChB,IAAI,CAAC,WAAW,EAAE;IACpB;AAEA;;AAEG;IACI,YAAY,GAAA;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa;QACxD,IAAI,SAAS,EAAE;;AAEb,YAAA,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC,MAAM,EAAE;QACnF;AACA,QAAA,IAAI,CAAC,GAAG,GAAG,SAAU;AACrB,QAAA,IAAI,CAAC,KAAK,GAAG,SAAU;AACvB,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;IACjC;AAEA;;AAEG;IACK,eAAe,CAAC,gBAA6B,EAAE,OAAyB,EAAA;;QAE9E,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;;AAGtD,QAAA,MAAM,cAAc,GAAG,gBAAgB,CAAC,WAAW;AACnD,QAAA,MAAM,eAAe,GAAG,gBAAgB,CAAC,YAAY;;AAGrD,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK;AAC7C,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK;;AAG7C,QAAA,MAAM,mBAAmB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,sBAAsB,GAAG,CAAC;AAChF,QAAA,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,oBAAoB,GAAG,CAAC;QAC5E,MAAM,mBAAmB,GAAG;AAC1B,cAAE,IAAI,CAAC,+BAA+B,EAAE,GAAG,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,GAAG;cACtF,CAAC;;QAGL,IAAI,qBAAqB,GAAG,CAAC;QAC7B,IAAI,SAAS,EAAE;YACb,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAoB;YAClD,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;AAC7C,YAAA,MAAM,QAAQ,GAAG,WAAW,GAAI,GAAiC,CAAC,MAAM,GAAI,GAAwB,CAAC,MAAM;AAC3G,YAAA,MAAM,YAAY,GAAG,CAAC,MAAK;gBACzB,IAAI,WAAW,EAAE;oBACf,MAAM,MAAM,GAAG,GAAgC;AAC/C,oBAAA,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;gBACrG;AACA,gBAAA,MAAM,IAAI,GAAI,GAAwB,IAAI,EAAE;AAC5C,gBAAA,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;YAC7E,CAAC,GAAG;AAEJ,YAAA,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,cAAc;AACjD,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,mBAAmB,CAAC;YACjE,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC;;AAGjF,YAAA,MAAM,cAAc,GAAG,QAAQ,GAAG,IAAI,CAAC,oBAAoB,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB;AACxF,YAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC;AAC1E,YAAA,MAAM,0BAA0B,GAAG,oBAAoB,GAAG,eAAe,GAAG,IAAI;AAEhF,YAAA,MAAM,oBAAoB,GAAG,QAAQ,GAAG,CAAC,GAAG,YAAY,GAAG,QAAQ,GAAG,YAAY;AAClF,YAAA,MAAM,YAAY,GAAG,OAAO,OAAO,CAAC,iBAAiB,KAAK,SAAS,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS;AAC3G,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,0BAA0B,EAAE,oBAAoB,CAAC;YAE1G,MAAM,cAAc,GAAG;AACrB,kBAAE,0BAA0B,GAAG,IAAI,CAAC,OAAO,GAAG,eAAe,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;kBAClF,eAAe,GAAG,IAAI,CAAC,iBAAiB,GAAG,CAAC;AAChD,YAAA,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB,GAAG,CAAC;AACnF,YAAA,MAAM,gBAAgB,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,yBAAyB,GAAG,CAAC;AAC/F,YAAA,qBAAqB,GAAG,cAAc,GAAG,aAAa,GAAG,gBAAgB;QAC3E;;AAGA,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,cAAc;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC;AACnG,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,mBAAmB,CAAC;AAE/D,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,qBAAqB,CAAC;AAEnG,QAAA,IAAI,CAAC,KAAK,GAAG,SAAS;AACtB,QAAA,IAAI,CAAC,MAAM,GAAG,UAAU;;QAGxB,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAAC,gBAAgB;AAE/E,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC;aACd,MAAM,CAAC,gBAAgB;aACvB,MAAM,CAAC,KAAK;AACZ,aAAA,IAAI,CAAC,OAAO,EAAE,MAAM;AACpB,aAAA,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC;aAClC,IAAI,CAAC,SAAS,EAAE,CAAA,IAAA,EAAO,UAAU,CAAA,CAAA,EAAI,WAAW,EAAE;AAClD,aAAA,IAAI,CAAC,qBAAqB,EAAE,eAAe,CAAC;AAE/C,QAAA,IAAI,CAAC,GAAG,GAAG,GAAG;;AAGd,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;aACf,MAAM,CAAC,GAAG;AACV,aAAA,IAAI,CAAC,OAAO,EAAE,eAAe;aAC7B,IAAI,CAAC,WAAW,EAAE,CAAA,UAAA,EAAa,mBAAmB,CAAA,CAAA,EAAI,IAAI,CAAC,gBAAgB,CAAA,CAAA,CAAG,CAAC;IACpF;AAEA;;AAEG;AACK,IAAA,mBAAmB,CACzB,YAAgC,EAChC,eAAuB,EACvB,aAAqB,EAAA;AAErB,QAAA,IAAI,YAAY,IAAI,YAAY,GAAG,CAAC,EAAE;AACpC,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,YAAY,GAAG,aAAa,CAAC;QACrE;AACA,QAAA,IAAI,eAAe,GAAG,CAAC,EAAE;AACvB,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,eAAe,GAAG,aAAa,EAAE,IAAI,CAAC,oBAAoB,CAAC;QACnG;QACA,OAAO,IAAI,CAAC,oBAAoB;IAClC;AAEA;;AAEG;AACK,IAAA,kBAAkB,CACxB,YAAiC,EACjC,cAAsB,EACtB,cAAsB,EAAA;QAEtB,IAAI,YAAY,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI;QACtC,IAAI,YAAY,KAAK,KAAK;AAAE,YAAA,OAAO,KAAK;QACxC,OAAO,cAAc,GAAG,cAAc;IACxC;AAEA;;AAEG;AACK,IAAA,WAAW,CAAC,IAAsB,EAAA;;QAExC,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,QAAQ,IAAI,GAAG;;AAE/D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,eAAe,CAAC;;AAG/D,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AAChB,aAAA,SAAS;AACT,aAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;aAC5B,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;aACrB,OAAO,CAAC,OAAO,CAAC;;;QAInB,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;AAEvD,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AAChB,aAAA,WAAW;aACX,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACrD,aAAA,IAAI;aACJ,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5B;AAEA;;AAEG;AACK,IAAA,oBAAoB,CAAC,MAAiC,EAAA;QAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC;QACxD,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAG3E,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AAChB,aAAA,SAAS;AACT,aAAA,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;aAC9B,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;AACrB,aAAA,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC;;AAGxC,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACnB,aAAA,SAAS;aACT,MAAM,CAAC,aAAa;aACpB,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;AAClC,aAAA,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC;;QAGxC,MAAM,gBAAgB,GAAa,EAAE;AACrC,QAAA,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE;YACtB,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,KAAI;gBAC/B,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC;AAC7B,gBAAA,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;AAAE,oBAAA,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AAC/E,YAAA,CAAC,CAAC;QACJ;AACA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC;AAC/C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC;AAE/C,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AAChB,aAAA,WAAW;aACX,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7C,aAAA,IAAI;aACJ,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5B;AAEA;;AAEG;AACK,IAAA,UAAU,CAAC,OAAyB,EAAA;AAC1C,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK;AAC7C,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK;AAC7C,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,KAAK;AAE3C,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC;QAE3E,IAAI,SAAS,EAAE;AACb,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC;QACtC;QAEA,IAAI,SAAS,EAAE;AACb,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC;QACtC;QAEA,IAAI,QAAQ,EAAE;YACZ,IAAI,CAAC,eAAe,EAAE;QACxB;IACF;IAEQ,WAAW,CACjB,SAAkE,EAClE,OAAyB,EAAA;AAEzB,QAAA,MAAM,mBAAmB,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAiB,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1F,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC;IACtD;IAEQ,WAAW,CACjB,SAAkE,EAClE,OAAyB,EAAA;;AAGzB,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,KAAqC,KAAI;AACxG,YAAA,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE;AACpE,YAAA,OAAO,iBAAiB,CAAC,QAAQ,CAAC;AACpC,QAAA,CAAC,CAAC;;QAGF,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACxC,QAAA,IAAI,QAAQ,GAAG,GAAG,EAAE;AAClB,YAAA,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B;AAAO,aAAA,IAAI,QAAQ,GAAG,GAAG,EAAE;AACzB,YAAA,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QACzB;QAEA,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;;AAG5F,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,iCAAiC,EAAE;AAChE,QAAA,IAAI,CAAC;aACF,SAAS,CAAC,MAAM;AAChB,aAAA,KAAK,CAAC,WAAW,EAAE,CAAA,EAAG,eAAe,IAAI;AACzC,aAAA,KAAK,CAAC,aAAa,EAAE,KAAK;AAC1B,aAAA,KAAK,CAAC,MAAM,EAAE,kDAAkD;AAChE,aAAA,IAAI,CAAC,aAAa,EAAE,KAAK;AACzB,aAAA,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;;AAG3B,QAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,gDAAgD,CAAC;;AAGpG,QAAA,IAAI,OAAO,CAAC,UAAU,EAAE;YACtB,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC;QACtD;IACF;IAEQ,uBAAuB,CAAC,SAA8B,EAAE,QAAgB,EAAA;AAC9E,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE;;AAGvC,QAAA,IAAI,OAAO,CAAC,iBAAiB,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI;AACnD,QAAA,IAAI,OAAO,CAAC,iBAAiB,KAAK,KAAK;AAAE,YAAA,OAAO,KAAK;;QAGrD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;QAEnD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;AAC7C,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;QAC/E,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,gBAAgB;;QAG7E,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM;AAC/C,QAAA,IAAI,WAAW,IAAI,IAAI,CAAC,uBAAuB,EAAE;AAC/C,YAAA,OAAO,cAAc,GAAG,IAAI,GAAG,IAAI,CAAC,gCAAgC;QACtE;QAEA,OAAO,cAAc,GAAG,IAAI;IAC9B;IAEQ,gBAAgB,CACtB,SAAkE,EAClE,KAAa,EACb,cAAsB,EACtB,aAAa,GAAG,IAAI,CAAC,aAAa,EAAA;;QAGlC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,cAAc,GAAG,aAAa;QAE3D;aACG,MAAM,CAAC,MAAM;AACb,aAAA,IAAI,CAAC,OAAO,EAAE,yCAAyC;AACvD,aAAA,IAAI,CAAC,aAAa,EAAE,QAAQ;AAC5B,aAAA,IAAI,CAAC,mBAAmB,EAAE,SAAS,CAAC;aACpC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC;AACxB,aAAA,IAAI,CAAC,GAAG,EAAE,MAAM;AAChB,aAAA,IAAI,CAAC,WAAW,EAAE,KAAK;aACvB,KAAK,CAAC,WAAW,EAAE,CAAA,EAAG,IAAI,CAAC,sBAAsB,IAAI;AACrD,aAAA,KAAK,CAAC,aAAa,EAAE,KAAK;AAC1B,aAAA,KAAK,CAAC,MAAM,EAAE,gDAAgD;aAC9D,IAAI,CAAC,KAAK,CAAC;IAChB;IAEQ,gBAAgB,CAAC,SAAkE,EAAE,KAAa,EAAA;;;;;;AAOxG,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,+BAA+B,EAAE;AAChE,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc;;;AAInC,QAAA,MAAM,MAAM,GAAG,CAAC,iBAAiB,GAAG,OAAO;;QAG3C,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAE/B;aACG,MAAM,CAAC,MAAM;AACb,aAAA,IAAI,CAAC,OAAO,EAAE,yCAAyC;AACvD,aAAA,IAAI,CAAC,aAAa,EAAE,QAAQ;AAC5B,aAAA,IAAI,CAAC,mBAAmB,EAAE,QAAQ;AAClC,aAAA,IAAI,CAAC,WAAW,EAAE,aAAa;AAC/B,aAAA,IAAI,CAAC,GAAG,EAAE,MAAM;AAChB,aAAA,IAAI,CAAC,GAAG,EAAE,MAAM;AAChB,aAAA,IAAI,CAAC,WAAW,EAAE,KAAK;AACvB,aAAA,KAAK,CAAC,WAAW,EAAE,MAAM;AACzB,aAAA,KAAK,CAAC,aAAa,EAAE,KAAK;AAC1B,aAAA,KAAK,CAAC,MAAM,EAAE,gDAAgD;aAC9D,IAAI,CAAC,KAAK,CAAC;IAChB;IAEQ,+BAA+B,GAAA;;QAErC,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAoB;QAClD,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;QAE7C,IAAI,QAAQ,GAAG,CAAC;QAChB,IAAI,WAAW,EAAE;YACf,MAAM,MAAM,GAAG,GAAgC;YAC/C,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,GAAG,EAAE;YACjF,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAE3E,YAAA,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE;gBACtB,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,KAAI;oBAC/B,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC;AAC7B,oBAAA,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;wBAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;AACvF,gBAAA,CAAC,CAAC;YACJ;QACF;aAAO;YACL,MAAM,WAAW,GAAI,GAAwB,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACpF,YAAA,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/E;;AAGA,QAAA,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,iBAAiB,CAAC,QAAQ,CAAC,GAAG,OAAO;AACvF,QAAA,OAAO,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,YAAY;IACvG;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC;aACF,MAAM,CAAC,GAAG;AACV,aAAA,IAAI,CAAC,OAAO,EAAE,mBAAmB;aACjC,IAAI,CACH,IAAI,CAAC;AACF,aAAA,QAAQ,CAAC,IAAI,CAAC,MAAM;AACpB,aAAA,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK;AACpB,aAAA,UAAU,CAAC,MAAM,EAAE,CAAC;aAExB,SAAS,CAAC,MAAM;AAChB,aAAA,KAAK,CAAC,QAAQ,EAAE,gDAAgD;AAChE,aAAA,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC;;AAG/B,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE;IAC1E;AAEA;;AAEG;IACK,mBAAmB,CAAC,OAAyB,EAAE,MAAiC,EAAA;AACtF,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK;AAC7C,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK;AAC7C,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,KAAK;AAE3C,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC;QAE3E,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC;QACvD;QAEA,IAAI,SAAS,EAAE;AACb,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC;QACtC;QAEA,IAAI,QAAQ,EAAE;YACZ,IAAI,CAAC,eAAe,EAAE;QACxB;IACF;AAEQ,IAAA,oBAAoB,CAC1B,SAAkE,EAClE,OAAyB,EACzB,MAAiC,EAAA;QAEjC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAiB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7E,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC;IACtD;AAEA;;AAEG;AACK,IAAA,UAAU,CAAC,IAAsB,EAAA;;QAEvC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,gBAAgB,GAAI,IAAI,CAAC,IAAI,EAAuB,IAAI,EAAE;;AAGhE,QAAA,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC;;QAGzC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,YAAY;;QAGnD,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,iBAAiB;AACnE,QAAA,MAAM,eAAe,GAAG,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,eAAe,CAAC;;AAG3F,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,6BAA6B,CAAC;;QAGzF,MAAM,SAAS,GAAG;aACf,SAAS,CAAC,yBAAyB;aACnC,IAAI,CAAC,WAAW;AAChB,aAAA,KAAK;aACL,MAAM,CAAC,GAAG;AACV,aAAA,KAAK,CAAC,QAAQ,EAAE,SAAS;AACzB,aAAA,IAAI,CAAC,OAAO,EAAE,wBAAwB,CAAC;;QAG1C,MAAM,IAAI,GAAG;aACV,MAAM,CAAC,MAAM;AACb,aAAA,IAAI,CAAC,OAAO,EAAE,kBAAkB;AAChC,aAAA,IAAI,CAAC,GAAG,EAAE,CAAC,CAAiB,KAAI;YAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;YACrC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;YAC5B,OAAO,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,KAAK,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,EAAA,EAAK,CAAC,GAAG,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,EAAA,EAAK,CAAC,GAAG,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,EAAA,CAAI;AACxE,QAAA,CAAC;AACA,aAAA,IAAI,CAAC,MAAM,EAAE,CAAC,CAAiB,KAAI;;AAElC,YAAA,MAAM,aAAa,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;;;YAG5E,OAAO,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,KAAK,CAAC,CAAC,GAAG,aAAa,GAAG,CAAC,CAAC;AAC3E,QAAA,CAAC,CAAC;;QAGJ,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC,cAAc,KAAK,KAAK,EAAE;YACpD;iBACG,MAAM,CAAC,MAAM;AACb,iBAAA,IAAI,CAAC,OAAO,EAAE,yBAAyB;AACvC,iBAAA,IAAI,CAAC,aAAa,EAAE,QAAQ;iBAC5B,IAAI,CAAC,GAAG,EAAE,CAAC,CAAiB,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC;iBAChF,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;AACtB,iBAAA,KAAK,CAAC,WAAW,EAAE,yBAAyB;AAC5C,iBAAA,KAAK,CAAC,aAAa,EAAE,KAAK;AAC1B,iBAAA,KAAK,CAAC,MAAM,EAAE,iDAAiD;AAC/D,iBAAA,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;AACnB,iBAAA,IAAI,CAAC,CAAC,CAAiB,KAAI;;gBAE1B,OAAO,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK;AAC/D,YAAA,CAAC,CAAC;;AAGJ,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,cAAc,IAAI,IAAI,CAAC,uBAAuB;YAC7F;iBACG,SAAS,CAAC,0BAA0B;AACpC,iBAAA,UAAU;iBACV,QAAQ,CAAC,iBAAiB;AAC1B,iBAAA,KAAK,CAAC,CAAC,CAAiB,EAAE,CAAS,KAAK,CAAC,GAAG,cAAc,GAAG,IAAI,CAAC,qBAAqB;AACvF,iBAAA,IAAI,CAAC,GAAG,EAAE,CAAC,CAAiB,KAAI;gBAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;;AAGnC,gBAAA,IAAI,MAAM,GAAG,IAAI,CAAC,uBAAuB,EAAE;AACzC,oBAAA,OAAO,MAAM,GAAG,IAAI,CAAC,YAAY;gBACnC;;AAGA,gBAAA,OAAO,MAAM,GAAG,IAAI,CAAC,YAAY;AACnC,YAAA,CAAC;AACA,iBAAA,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAiB,KAAI;gBAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AACnC,gBAAA,OAAO,MAAM,GAAG,IAAI,CAAC,uBAAuB,GAAG,MAAM,GAAG,OAAO;AACjE,YAAA,CAAC;AACA,iBAAA,KAAK,CAAC,SAAS,EAAE,CAAC;iBAClB,IAAI,CAAC,eAAe,CAAC;QAC1B;;QAGA;aACG,EAAE,CAAC,YAAY,EAAE,CAAC,KAAiB,EAAE,CAAiB,KAAI;;AAEzD,YAAA,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBAAE;AAEvC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;;YAGhE;AACG,iBAAA,UAAU;AACV,iBAAA,QAAQ,CAAC,IAAI,CAAC,yBAAyB;AACvC,iBAAA,KAAK,CAAC,QAAQ,EAAE,sDAAsD,CAAC;AAE1E,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;AAC/B,QAAA,CAAC;AACA,aAAA,EAAE,CAAC,WAAW,EAAE,CAAC,KAAiB,KAAI;;AAErC,YAAA,IAAI,IAAI,CAAC,yBAAyB,EAAE,EAAE;AACpC,gBAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;YACnC;AACF,QAAA,CAAC;AACA,aAAA,EAAE,CAAC,YAAY,EAAE,CAAC,KAAiB,KAAI;;AAEtC,YAAA,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBAAE;AAEvC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;;AAGhE,YAAA,KAAK,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC;AAEjF,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AACjC,QAAA,CAAC;aACA,EAAE,CAAC,OAAO,EAAE,CAAC,KAAiB,EAAE,CAAiB,KAAI;;AAEpD,YAAA,IAAI,IAAI,CAAC,yBAAyB,EAAE,EAAE;AACpC,gBAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/B;AACF,QAAA,CAAC,CAAC;;AAGJ,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,cAAc,IAAI,IAAI,CAAC,uBAAuB;QAC7F;AACG,aAAA,UAAU;aACV,QAAQ,CAAC,iBAAiB;aAC1B,KAAK,CAAC,CAAC,CAAiB,EAAE,CAAS,KAAK,CAAC,GAAG,cAAc;AAC1D,aAAA,SAAS,CAAC,GAAG,EAAE,CAAC,CAAiB,KAAI;YACpC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;AACrC,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;YAEtD,OAAO,CAAC,CAAS,KAAI;AACnB,gBAAA,MAAM,aAAa,GAAG,WAAW,GAAG,CAAC;AACrC,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,aAAa;gBAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;gBAElC,IAAI,MAAM,GAAG,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE;;AAEnC,oBAAA,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC;oBACnD,OAAO,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,OAAO,KAAK,CAAC,CAAA,CAAA,EAAI,QAAQ,GAAG,eAAe,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,QAAQ,IAAI,CAAC,GAAG,eAAe,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,EAAK,CAAC,GAAG,KAAK,GAAG,eAAe,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,EAAK,CAAC,GAAG,KAAK,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,CAAC,GAAG,KAAK,CAAA,CAAA,EAAI,QAAQ,GAAG,eAAe,CAAA,EAAA,EAAK,CAAC,GAAG,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,EAAA,CAAI;gBAChQ;qBAAO;oBACL,OAAO,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,OAAO,KAAK,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,EAAK,CAAC,GAAG,KAAK,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,EAAK,CAAC,GAAG,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,EAAA,CAAI;gBAClG;AACF,YAAA,CAAC;AACH,QAAA,CAAC;AACA,aAAA,IAAI,CAAC,eAAe,CAAC;aACrB,GAAG,EAAE;aACL,IAAI,CAAC,MAAK;;AAET,YAAA,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1C,QAAA,CAAC,CAAC;IACN;AAEA;;AAEG;AACK,IAAA,mBAAmB,CAAC,MAAiC,EAAA;QAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC;QACxD,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAE3E,QAAA,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC;QAEzC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,YAAY;QACnD,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,iBAAiB;AACnE,QAAA,MAAM,eAAe,GAAG,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,eAAe,CAAC;AAE3F,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,6BAA6B,CAAC;QAEzF,MAAM,QAAQ,GAAG;aACd,SAAS,CAAC,qBAAqB;aAC/B,IAAI,CAAC,MAAM;AACX,aAAA,KAAK;aACL,MAAM,CAAC,GAAG;AACV,aAAA,IAAI,CAAC,OAAO,EAAE,oBAAoB;AAClC,aAAA,IAAI,CAAC,WAAW,EAAE,CAAC,CAA0B,KAAK,CAAA,UAAA,EAAa,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA,GAAA,CAAK,CAAC;QAIzF,MAAM,SAAS,GAAG;aACf,SAAS,CAAC,yBAAyB;AACnC,aAAA,IAAI,CAAC,CAAC,CAA0B,KAC/B,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,MAAyB,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;AAE3G,aAAA,KAAK;aACL,MAAM,CAAC,GAAG;AACV,aAAA,KAAK,CAAC,QAAQ,EAAE,SAAS;AACzB,aAAA,IAAI,CAAC,OAAO,EAAE,wBAAwB,CAAC;QAE1C,MAAM,IAAI,GAAG;aACV,MAAM,CAAC,MAAM;AACb,aAAA,IAAI,CAAC,OAAO,EAAE,kBAAkB;aAChC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAoB,KAAK,CAAC,CAAC,WAAW;AAC3D,aAAA,IAAI,CAAC,GAAG,EAAE,CAAC,CAAoB,KAAI;YAClC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE;AACxC,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG;YAC3B,OAAO,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,KAAK,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,EAAA,EAAK,CAAC,GAAG,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,EAAA,EAAK,CAAC,GAAG,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,EAAA,CAAI;AACxE,QAAA,CAAC;AACA,aAAA,IAAI,CAAC,MAAM,EAAE,CAAC,CAAoB,KAAI;AACrC,YAAA,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;AAC7C,YAAA,OAAO,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;AACpD,QAAA,CAAC,CAAC;QAEJ,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC,cAAc,KAAK,KAAK,EAAE;YACpD;iBACG,MAAM,CAAC,MAAM;AACb,iBAAA,IAAI,CAAC,OAAO,EAAE,yBAAyB;AACvC,iBAAA,IAAI,CAAC,aAAa,EAAE,QAAQ;AAC5B,iBAAA,IAAI,CAAC,GAAG,EAAE,CAAC,CAAoB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC;AACzG,iBAAA,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM;AACrB,iBAAA,KAAK,CAAC,WAAW,EAAE,yBAAyB;AAC5C,iBAAA,KAAK,CAAC,aAAa,EAAE,KAAK;AAC1B,iBAAA,KAAK,CAAC,MAAM,EAAE,iDAAiD;AAC/D,iBAAA,KAAK,CAAC,SAAS,EAAE,CAAC;AAClB,iBAAA,IAAI,CAAC,CAAC,CAAoB,KAAI;AAC7B,gBAAA,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,KAAK;gBACrD,IAAI,KAAK,KAAK,SAAS;AAAE,oBAAA,OAAO,EAAE;;AAElC,gBAAA,OAAO,KAAK,IAAI,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,KAAK;AACzD,YAAA,CAAC,CAAC;AAEJ,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,cAAc,IAAI,IAAI,CAAC,uBAAuB;YAC7F;iBACG,SAAS,CAAC,0BAA0B;AACpC,iBAAA,UAAU;iBACV,QAAQ,CAAC,iBAAiB;AAC1B,iBAAA,KAAK,CAAC,CAAC,EAAW,EAAE,CAAS,KAAK,CAAC,GAAG,cAAc,GAAG,IAAI,CAAC,qBAAqB;AACjF,iBAAA,IAAI,CAAC,GAAG,EAAE,CAAC,CAAoB,KAAI;AAClC,gBAAA,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;AAC7C,gBAAA,IAAI,CAAC,IAAI;oBAAE,OAAO,IAAI,CAAC,MAAM;gBAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;;AAGtC,gBAAA,IAAI,MAAM,GAAG,IAAI,CAAC,uBAAuB,EAAE;AACzC,oBAAA,OAAO,MAAM,GAAG,IAAI,CAAC,YAAY;gBACnC;;AAGA,gBAAA,OAAO,MAAM,GAAG,IAAI,CAAC,YAAY;AACnC,YAAA,CAAC;AACA,iBAAA,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAoB,KAAI;AAChD,gBAAA,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;AAC7C,gBAAA,IAAI,CAAC,IAAI;AAAE,oBAAA,OAAO,OAAO;gBAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AACtC,gBAAA,OAAO,MAAM,GAAG,IAAI,CAAC,uBAAuB,GAAG,MAAM,GAAG,OAAO;AACjE,YAAA,CAAC;AACA,iBAAA,KAAK,CAAC,SAAS,EAAE,CAAC;iBAClB,IAAI,CAAC,eAAe,CAAC;QAC1B;QAEA;aACG,EAAE,CAAC,YAAY,EAAE,CAAC,KAAiB,EAAE,CAAoB,KAAI;AAC5D,YAAA,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBAAE;AACvC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;YAChE;AACG,iBAAA,UAAU;AACV,iBAAA,QAAQ,CAAC,IAAI,CAAC,yBAAyB;AACvC,iBAAA,KAAK,CAAC,QAAQ,EAAE,sDAAsD,CAAC;AAC1E,YAAA,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;AAC7C,YAAA,IAAI,IAAI;gBAAE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;AACrD,QAAA,CAAC;AACA,aAAA,EAAE,CAAC,WAAW,EAAE,CAAC,KAAiB,KAAI;YACrC,IAAI,IAAI,CAAC,yBAAyB,EAAE;AAAE,gBAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;AACzE,QAAA,CAAC;AACA,aAAA,EAAE,CAAC,YAAY,EAAE,CAAC,KAAiB,KAAI;AACtC,YAAA,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBAAE;AACvC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;AAChE,YAAA,KAAK,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC;AACjF,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AACjC,QAAA,CAAC;aACA,EAAE,CAAC,OAAO,EAAE,CAAC,KAAiB,EAAE,CAAoB,KAAI;AACvD,YAAA,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBAAE;AACvC,YAAA,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;AAC7C,YAAA,IAAI,IAAI;AAAE,gBAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC;AAC5C,QAAA,CAAC,CAAC;AAEJ,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,cAAc,IAAI,IAAI,CAAC,uBAAuB;QAC7F;AACG,aAAA,UAAU;aACV,QAAQ,CAAC,iBAAiB;aAC1B,KAAK,CAAC,CAAC,EAAW,EAAE,CAAS,KAAK,CAAC,GAAG,cAAc;AACpD,aAAA,SAAS,CAAC,GAAG,EAAE,CAAC,CAAoB,KAAI;YACvC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE;AACxC,YAAA,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;YAC7C,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAEpE,OAAO,CAAC,CAAS,KAAI;AACnB,gBAAA,MAAM,aAAa,GAAG,WAAW,GAAG,CAAC;AACrC,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,aAAa;gBAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;gBAElC,IAAI,MAAM,GAAG,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE;;AAEnC,oBAAA,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC;oBACnD,OAAO,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,OAAO,KAAK,CAAC,CAAA,CAAA,EAAI,QAAQ,GAAG,eAAe,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,QAAQ,IAAI,CAAC,GAAG,eAAe,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,EAAK,CAAC,GAAG,KAAK,GAAG,eAAe,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,EAAK,CAAC,GAAG,KAAK,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,CAAC,GAAG,KAAK,CAAA,CAAA,EAAI,QAAQ,GAAG,eAAe,CAAA,EAAA,EAAK,CAAC,GAAG,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,EAAA,CAAI;gBAChQ;qBAAO;oBACL,OAAO,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,OAAO,KAAK,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,EAAK,CAAC,GAAG,KAAK,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,EAAK,CAAC,GAAG,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,EAAA,CAAI;gBAClG;AACF,YAAA,CAAC;AACH,QAAA,CAAC;aACA,IAAI,CAAC,eAAe;AACpB,aAAA,GAAG;AACH,aAAA,IAAI,CAAC,MAAM,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzD;AAEA;;AAEG;;AAGH;;AAEG;AACK,IAAA,cAAc,CAAC,KAAiB,EAAE,KAAqB,EAAE,KAAqC,EAAA;QACpG,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC,WAAW,KAAK,KAAK,EAAE;AACjD,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAqB;YAChD,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;YACnD,MAAM,QAAQ,GAAqB;AACjC,kBAAG,SAAuC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS;AACrE,kBAAG,SAA8B,IAAI,EAAE;YACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC;YAC9F,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;;YAGpE,MAAM,KAAK,GAAG;AACZ,kBAAG,SAAuC,CAAC,MAAM,CAC7C,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,EAChE,CAAC;kBAEF,QAA6B,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AAC7E,YAAA,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,IAAI,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;AAE7E,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;gBACpB,KAAK,EAAE,KAAK,GAAG,CAAA,EAAG,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,CAAA,GAAA,EAAM,KAAK,CAAC,KAAK,CAAA,CAAE,GAAG,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK;AAC1G,gBAAA,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC;gBACrC,UAAU,EAAE,CAAA,EAAG,UAAU,CAAA,CAAA,CAAG;AAC5B,gBAAA,KAAK,EAAE,KAAK;AACb,aAAA,CAAC;AAEF,YAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;AACjC,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC;IACF;AAEA;;;AAGG;AACK,IAAA,qBAAqB,CAAC,KAAiB,EAAA;QAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa;AAC1D,QAAA,IAAI,CAAC,WAAW;YAAE;AAClB,QAAA,MAAM,aAAa,GAAG,WAAW,CAAC,qBAAqB,EAAE;QACzD,MAAM,SAAS,GAAG,WAAW,CAAC,aAAa,CAAC,gBAAgB,CAAuB;AACnF,QAAA,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC,qBAAqB,EAAE,GAAG,IAAI;;AAGxE,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,8BAA8B,CAAC,aAAa,EAAE,WAAW,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;AACzG,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC;IAChC;AAEA;;AAEG;AACK,IAAA,8BAA8B,CACpC,aAAsB,EACtB,WAA2B,EAC3B,OAAe,EACf,OAAe,EAAA;AAEf,QAAA,MAAM,OAAO,GAAG,OAAO,GAAG,aAAa,CAAC,IAAI;AAC5C,QAAA,MAAM,OAAO,GAAG,OAAO,GAAG,aAAa,CAAC,GAAG;QAE3C,IAAI,CAAC,WAAW,EAAE;;YAEhB,OAAO;AACL,gBAAA,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC;gBAC/E,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;aAC1F;QACH;;AAGA,QAAA,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,GAAG,OAAO;QAChD,MAAM,SAAS,GAAG,OAAO;AACzB,QAAA,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,GAAG,OAAO;QACjD,MAAM,UAAU,GAAG,OAAO;;AAG1B,QAAA,IAAI,CAAS;QACb,IAAI,UAAU,IAAI,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;;AAEtD,YAAA,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,WAAW;QAChC;aAAO,IAAI,SAAS,IAAI,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;;YAE5D,CAAC,GAAG,OAAO,GAAG,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW;QACpD;aAAO;;AAEL,YAAA,CAAC,GAAG,IAAI,CAAC,GAAG,CACV,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,GAAG,CACN,CAAC,aAAa,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,CAAC,EAC7C,aAAa,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAC3D,CACF;QACH;;AAGA,QAAA,IAAI,CAAS;QACb,IAAI,UAAU,IAAI,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE;;AAEvD,YAAA,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,WAAW;QAChC;aAAO,IAAI,UAAU,IAAI,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE;;YAE9D,CAAC,GAAG,OAAO,GAAG,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW;QACrD;aAAO;;AAEL,YAAA,CAAC,GAAG,IAAI,CAAC,GAAG,CACV,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,GAAG,CACN,CAAC,aAAa,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,IAAI,CAAC,EAC/C,aAAa,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAC7D,CACF;QACH;;AAGA,QAAA,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;AACvG,QAAA,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;AAEzG,QAAA,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE;IACjB;AAEA;;AAEG;IACK,cAAc,CAAC,KAAiB,EAAE,KAAqB,EAAA;QAC7D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;IAClF;AAEA;;AAEG;AACK,IAAA,iBAAiB,CAAC,gBAA6B,EAAA;AACrD,QAAA,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC;AACrC,QAAA,IAAI,CAAC,WAAW,CACd,gBAAgB,EAChB,IAAI,CAAC,iBAAiB,EAAE,CAAC,UAAU,EACnC,IAAI,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAC/B,IAAI,CAAC,iBAAiB,EAAE,CAAC,UAAU,EACnC,8BAA8B,CAC/B;IACH;AAEA;;AAEG;AACK,IAAA,wBAAwB,CAAC,gBAA6B,EAAA;AAC5D,QAAA,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC;AACrC,QAAA,IAAI,CAAC,WAAW,CACd,gBAAgB,EAChB,IAAI,CAAC,iBAAiB,EAAE,CAAC,aAAa,EACtC,IAAI,CAAC,iBAAiB,EAAE,CAAC,SAAS,EAClC,IAAI,CAAC,iBAAiB,EAAE,CAAC,aAAa,EACtC,8BAA8B,CAC/B;IACH;AAEA;;AAEG;AACO,IAAA,QAAQ,CAAC,KAAa,EAAA;QAC9B,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC;IAC/C;AAEA;;AAEG;AACO,IAAA,WAAW,CAAC,EAAU,EAAA;QAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;IAChC;AAEA;;;AAGG;IACH,cAAc,GAAA;QACZ,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAoB;AACpD,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE;YAC/B,MAAM,MAAM,GAAG,KAAkC;YACjD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,GAAG,EAAE;YACjF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CACzB,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC,KAAK,KAAK,QAAQ,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EACrG,CAAC,CACF;YACD,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;gBACvC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;oBACzC,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC;oBAC/B,MAAM,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;oBACjE,OAAO,CAAC,GAAG,CAAC;gBACd,CAAC,EAAE,CAAC,CAAC;AACL,gBAAA,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,WAAW,GAAG,KAAK,IAAI,GAAG,GAAG,CAAC;gBAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC;gBAC7C,OAAO;AACL,oBAAA,EAAE,EAAE,KAAK;AACT,oBAAA,IAAI,EAAE,KAAK,IAAI,UAAU,KAAK,GAAG,CAAC,CAAA,CAAE;AACpC,oBAAA,KAAK,EAAE,WAAW;oBAClB,UAAU;oBACV,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAC/C,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;iBACrC;AACH,YAAA,CAAC,CAAC;QACJ;QAEA,MAAM,IAAI,GAAG,KAAyB;AACtC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QACpG,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AAC9B,YAAA,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;AAC3D,YAAA,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,IAAI,GAAG,GAAG,CAAC;YACtD,OAAO;gBACL,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,CAAA,KAAA,EAAQ,KAAK,GAAG,CAAC,CAAA,CAAE;gBACvC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU;gBACV,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACzC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;aAClC;AACH,QAAA,CAAC,CAAC;IACJ;AAEA;;;AAGG;AACH,IAAA,gBAAgB,CAAC,EAAiB,EAAA;QAChC,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;QAEf,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAoB;QACpD,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;QAE/C,MAAM,QAAQ,GAAG,MAAK;AACpB,YAAA,IAAI,CAAC;iBACF,SAAS,CAAC,mBAAmB;AAC7B,iBAAA,OAAO,CAAC,0BAA0B,EAAE,KAAK;AACzC,iBAAA,OAAO,CAAC,qBAAqB,EAAE,KAAK;AACpC,iBAAA,IAAI,CAAC,SAAS,EAAE,CAAC;AACjB,iBAAA,IAAI,CAAC,QAAQ,EAAE,IAAI;AACnB,iBAAA,IAAI,CAAC,QAAQ,EAAE,IAAI;AACnB,iBAAA,IAAI,CAAC,cAAc,EAAE,IAAI;AACzB,iBAAA,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC;AACjC,QAAA,CAAC;AAED,QAAA,IAAI,EAAE,KAAK,IAAI,EAAE;AACf,YAAA,QAAQ,EAAE;YACV;QACF;QAEA,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,EAAY,CAAC,EAAE;AAClC,gBAAA,QAAQ,EAAE;gBACV;YACF;AACA,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC;iBACpB,SAAS,CAAC,mBAAmB;AAC7B,iBAAA,MAAM,CAAC,CAAC,CAAU,KAAM,CAAgC,EAAE,EAAE,KAAK,EAAE,CAAC;YACvE,IAAI,SAAS,CAAC,KAAK,EAAE;gBAAE;YACvB,MAAM,sBAAsB,GAAG,SAAS,CAAC,OAAO,CAAC,0BAA0B,CAAC;YAC5E,IAAI,sBAAsB,EAAE;AAC1B,gBAAA,QAAQ,EAAE;YACZ;iBAAO;AACL,gBAAA,QAAQ,EAAE;gBACV;AACG,qBAAA,OAAO,CAAC,0BAA0B,EAAE,IAAI;AACxC,qBAAA,IAAI,CAAC,QAAQ,EAAE,yCAAyC;AACxD,qBAAA,IAAI,CAAC,QAAQ,EAAE,MAAM;AACrB,qBAAA,IAAI,CAAC,cAAc,EAAE,KAAK;AAC1B,qBAAA,IAAI,CAAC,gBAAgB,EAAE,KAAK;AAC5B,qBAAA,KAAK,CAAC,YAAY,EAAE,sBAAsB,CAAC;AAC9C,gBAAA,IAAI,CAAC;qBACF,SAAS,CAAC,mBAAmB;qBAC7B,MAAM,CAAC,CAAC,CAAU,KAAM,CAAgC,EAAE,EAAE,KAAK,EAAE;AACnE,qBAAA,OAAO,CAAC,qBAAqB,EAAE,IAAI;AACnC,qBAAA,IAAI,CAAC,SAAS,EAAE,GAAG;AACnB,qBAAA,KAAK,CAAC,YAAY,EAAE,0BAA0B,CAAC;YACpD;YACA;QACF;AAEA,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC;aACrB,SAAS,CAAC,mBAAmB;aAC7B,MAAM,CAAC,CAAC,EAAW,EAAE,CAAS,EAAE,KAAuB,KAAI;AAC1D,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,EAAE;AAChD,QAAA,CAAC,CAAC;QACJ,IAAI,UAAU,CAAC,KAAK,EAAE;YAAE;QACxB,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC,0BAA0B,CAAC;QACpE,IAAI,aAAa,EAAE;AACjB,YAAA,QAAQ,EAAE;QACZ;aAAO;AACL,YAAA,QAAQ,EAAE;YACV;AACG,iBAAA,OAAO,CAAC,0BAA0B,EAAE,IAAI;AACxC,iBAAA,IAAI,CAAC,QAAQ,EAAE,yCAAyC;AACxD,iBAAA,IAAI,CAAC,QAAQ,EAAE,MAAM;AACrB,iBAAA,IAAI,CAAC,cAAc,EAAE,KAAK;AAC1B,iBAAA,IAAI,CAAC,gBAAgB,EAAE,KAAK;AAC5B,iBAAA,KAAK,CAAC,YAAY,EAAE,sBAAsB,CAAC;AAC9C,YAAA,IAAI,CAAC;iBACF,SAAS,CAAC,mBAAmB;iBAC7B,MAAM,CAAC,CAAC,EAAW,EAAE,CAAS,EAAE,KAAuB,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,EAAE;AACvG,iBAAA,OAAO,CAAC,qBAAqB,EAAE,IAAI;AACnC,iBAAA,IAAI,CAAC,SAAS,EAAE,GAAG;AACnB,iBAAA,KAAK,CAAC,YAAY,EAAE,0BAA0B,CAAC;QACpD;IACF;AAEA;;;;AAIG;AACH,IAAA,aAAa,CAAC,EAAU,EAAA;QACtB,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAoB;QACpD,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;QAE/C,IAAI,CAAC,WAAW,EAAE;YAChB,MAAM,YAAY,GACf,KAA0B,CAAC,MAAM,GAAG,CAAC,IAAK,KAA0B,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5G,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AAC3B,gBAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,IAAI,YAAY,EAAE;AAChB,oBAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,EAAE;AAC1C,wBAAA,IAAI,CAAC;8BACD,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,aAAa;6BAC7C,SAAS,CAAC,kCAAkC;AAC5C,6BAAA,MAAM,EAAE;wBACX,UAAU,CAAC,MAAK;4BACd,IAAI,CAAC,WAAW,EAAE;wBACpB,CAAC,EAAE,CAAC,CAAC;oBACP;gBACF;qBAAO;oBACL,IAAI,CAAC,WAAW,EAAE;gBACpB;YACF;iBAAO;AACL,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,WAAW,EAAE;YACpB;YACA,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC;;QAGA,MAAM,MAAM,GAAG,KAAkC;QACjD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,GAAG,EAAE;AACjF,QAAA,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM;AACvC,QAAA,MAAM,YAAY,GAAG,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,WAAW;QAE7E,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,IAAI,YAAY,EAAE;AAChB,gBAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,EAAE;oBAC1C,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC,MAAM,EAAE;oBAC7G,UAAU,CAAC,MAAK;wBACd,IAAI,CAAC,WAAW,EAAE;oBACpB,CAAC,EAAE,CAAC,CAAC;gBACP;YACF;iBAAO;gBACL,IAAI,CAAC,WAAW,EAAE;YACpB;QACF;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,EAAE;QACpB;QAEA,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;IACnC;;IAIQ,mBAAmB,GAAA;QACzB,OAAO,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,IAAI,IAAI;IACvD;AAEQ,IAAA,cAAc,CAAC,gBAA6B,EAAA;AAClD,QAAA,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC,MAAM,EAAE;IACzF;AAEA;;AAEG;AACK,IAAA,aAAa,CAAC,KAAa,EAAE,SAAA,GAAoB,IAAI,CAAC,gBAAgB,EAAA;AAC5E,QAAA,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS;AAAE,YAAA,OAAO,KAAK;AAC3C,QAAA,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,GAAG;IAChD;AAEA;;AAEG;IACK,gCAAgC,GAAA;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM;AAC7C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;;QAG5C,IAAI,YAAY,GAAG,QAAQ;AAC3B,QAAA,IAAI,SAAS,GAAG,IAAI,CAAC,yBAAyB,EAAE;YAC9C,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC;QAC3C;AAAO,aAAA,IAAI,SAAS,GAAG,IAAI,CAAC,oBAAoB,EAAE;YAChD,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC5C;AAEA,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC;IAC/F;AAEA;;AAEG;IACK,iCAAiC,GAAA;AACvC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;AAC7C,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;IAC3F;AAEQ,IAAA,gBAAgB,CACtB,SAAkE,EAClE,SAA8B,EAC9B,OAAyB,EAAA;QAEzB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM;;QAG7C,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AACrC,QAAA,IAAI,SAAS,GAAG,IAAI,CAAC,yBAAyB,EAAE;;AAE9C,YAAA,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxD;AAAO,aAAA,IAAI,SAAS,GAAG,IAAI,CAAC,oBAAoB,EAAE;;AAEhD,YAAA,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxD;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC;AACf,aAAA,UAAU,CAAC,IAAI,CAAC,MAAM;aACtB,UAAU,CAAC,UAAU;AACrB,aAAA,UAAU,CAAC,CAAC,EAAU,KAAI;AACzB,YAAA,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC;;AAE7C,YAAA,MAAM,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC,oBAAoB,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB;YACpF,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC;AAC7C,QAAA,CAAC,CAAC;QAEJ,IAAI,CAAC,KAAK,GAAG;aACV,MAAM,CAAC,GAAG;AACV,aAAA,IAAI,CAAC,OAAO,EAAE,qBAAqB;aACnC,IAAI,CAAC,WAAW,EAAE,CAAA,YAAA,EAAe,IAAI,CAAC,MAAM,GAAG;aAC/C,IAAI,CAAC,IAAI,CAAC;AAEb,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,gCAAgC,EAAE;AAC/D,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC;aACrB,SAAS,CAAC,MAAM;AAChB,aAAA,KAAK,CAAC,WAAW,EAAE,CAAA,EAAG,eAAe,IAAI;AACzC,aAAA,KAAK,CAAC,aAAa,EAAE,KAAK;AAC1B,aAAA,KAAK,CAAC,MAAM,EAAE,kDAAkD;AAChE,aAAA,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;QAE3B,MAAM,SAAS,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,eAAe,CAAC;QAC1E,IAAI,SAAS,EAAE;AACb,YAAA,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;QACnH;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,gDAAgD,CAAC;AAEpG,QAAA,IAAI,OAAO,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE;AACpC,YAAA,MAAM,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAqB;AAClF,YAAA,MAAM,kBAAkB,GACtB,SAAS,CAAC,MAAM,GAAG;AACjB,kBAAE,IAAI,CAAC,GAAG,CACN,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AACrB,oBAAA,IAAI;wBACF,OAAO,CAAC,EAAE,OAAO,IAAI,EAAE,MAAM,IAAI,eAAe;oBAClD;AAAE,oBAAA,MAAM;AACN,wBAAA,OAAO,eAAe;oBACxB;AACF,gBAAA,CAAC,CAAC;kBAEJ,eAAe;AACrB,YAAA,MAAM,cAAc,GAAG,kBAAkB,GAAG,IAAI,CAAC,iBAAiB;AAClE,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB;AAC3C,YAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,UAAU,EAAE,cAAc,EAAE,aAAa,CAAC;QACrF;IACF;;IAIQ,WAAW,CACjB,gBAA6B,EAC7B,SAAiB,EACjB,IAAY,EACZ,QAAgB,EAChB,aAAqB,EAAA;AAErB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC;aACpB,MAAM,CAAC,gBAAgB;aACvB,MAAM,CAAC,KAAK;AACZ,aAAA,IAAI,CAAC,OAAO,EAAE,8DAA8D,aAAa,CAAA,CAAE,CAAC;QAE/F;aACG,MAAM,CAAC,KAAK;AACZ,aAAA,IAAI,CAAC,OAAO,EAAE,iDAAiD;AAC/D,aAAA,IAAI,CAAC,CAAA,UAAA,EAAa,SAAS,CAAA,YAAA,CAAc,CAAC;AAE7C,QAAA,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,iDAAiD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAEnG,QAAA,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,iDAAiD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;IACzG;uGA3+CW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/ChC,8RASA,EAAA,MAAA,EAAA,CAAA,+iDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDmCY,uBAAuB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAGtB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAR/B,SAAS;+BACE,cAAc,EAAA,aAAA,EAGT,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B,CAAC,uBAAuB,CAAC,EAAA,eAAA,EACjB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,8RAAA,EAAA,MAAA,EAAA,CAAA,+iDAAA,CAAA,EAAA;mVAkBoC,gBAAgB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE/DrG;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"acorex-charts-bar-chart.mjs","sources":["../../../../packages/charts/bar-chart/src/lib/bar-chart.config.ts","../../../../packages/charts/bar-chart/src/lib/bar-chart.component.ts","../../../../packages/charts/bar-chart/src/lib/bar-chart.component.html","../../../../packages/charts/bar-chart/src/acorex-charts-bar-chart.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { AXBarChartOption } from './bar-chart.type';\n\nexport const AXBarChartDefaultConfig: AXBarChartOption = {\n showXAxis: true,\n showYAxis: true,\n showGrid: true,\n showDataLabels: true,\n showTooltip: true,\n rotateXAxisLabels: 'auto',\n barWidth: 80,\n cornerRadius: 4,\n animationDuration: 800,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All bars are hidden',\n allHiddenHelp: 'Click on legend items to show bars',\n noDataIcon: 'fa-light fa-chart-column',\n allHiddenIcon: 'fa-light fa-eye-slash',\n },\n};\n\nexport const AX_BAR_CHART_CONFIG = new InjectionToken<AXBarChartOption>('AX_BAR_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXBarChartDefaultConfig,\n});\n\nexport type PartialBarChartConfig = Partial<AXBarChartOption>;\n\nexport function barChartConfig(config: PartialBarChartConfig = {}): AXBarChartOption {\n const result = {\n ...AXBarChartDefaultConfig,\n ...config,\n };\n return result;\n}\n","import {\n AX_CHART_COLOR_PALETTE,\n AXChartComponent,\n AXChartComponentBase,\n formatLargeNumber,\n getChartColor,\n getEasingFunction,\n} from '@acorex/charts';\nimport { AXChartLegendCompatible, AXChartLegendItem } from '@acorex/charts/chart-legend';\nimport { AXChartTooltipComponent, AXChartTooltipData } from '@acorex/charts/chart-tooltip';\n\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n output,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AX_BAR_CHART_CONFIG } from './bar-chart.config';\nimport {\n AXBarChartClickEvent,\n AXBarChartClusteredData,\n AXBarChartData,\n AXBarChartOption,\n AXBarChartValue,\n} from './bar-chart.type';\n\n/**\n * Bar Chart Component\n * Renders data as vertical bars with interactive hover effects and animations\n */\n@Component({\n selector: 'ax-bar-chart',\n templateUrl: './bar-chart.component.html',\n styleUrls: ['./bar-chart.component.scss'],\n encapsulation: ViewEncapsulation.None,\n imports: [AXChartTooltipComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXBarChartComponent\n extends AXChartComponent\n implements OnDestroy, AXChartLegendCompatible, AXChartComponentBase\n{\n // Inputs\n /** Chart data input */\n data = input<AXBarChartValue>([] as AXBarChartValue);\n\n /** Chart options input */\n options = input<AXBarChartOption>({});\n\n // Outputs\n /** Emitted when a bar is clicked */\n barClick = output<AXBarChartClickEvent>();\n\n // Chart container reference\n private readonly chartContainerEl = viewChild.required<ElementRef<HTMLDivElement>>('chartContainer');\n\n // D3 reference - loaded asynchronously\n protected d3!: typeof import('d3');\n\n // Chart elements - using proper D3 types\n private svg!: ReturnType<typeof import('d3').select<SVGSVGElement, unknown>>;\n private chart!: ReturnType<typeof import('d3').select<SVGGElement, unknown>>;\n private xScale!: ReturnType<typeof import('d3').scaleBand<string>>;\n private yScale!: ReturnType<typeof import('d3').scaleLinear<number, number>>;\n private xSubScale!: ReturnType<typeof import('d3').scaleBand<string>>;\n private xAxis!: ReturnType<typeof import('d3').select<SVGGElement, unknown>>;\n private yAxis!: ReturnType<typeof import('d3').select<SVGGElement, unknown>>;\n\n // Chart dimensions\n private width!: number;\n private height!: number;\n private margin = { top: 0, right: 0, bottom: 0, left: 0 };\n\n // Constants for layout calculations\n private readonly CHAR_WIDTH_RATIO = 0.65;\n private readonly TOOLTIP_GAP = 10;\n private readonly AXIS_TICK_PADDING = 10;\n private readonly Y_AXIS_TITLE_THICKNESS = 14;\n private readonly Y_AXIS_TITLE_PADDING = 14;\n private readonly X_AXIS_TITLE_FONT_SIZE = 14;\n private readonly X_AXIS_TITLE_GAP = 14;\n private readonly X_AXIS_TITLE_BLOCK_HEIGHT = 24;\n private readonly TOP_EDGE_PADDING = 6;\n private readonly FALLBACK_PLOT_HEIGHT = 240;\n private readonly MIN_PLOT_HEIGHT = 120;\n private readonly MIN_TOTAL_WIDTH = 200;\n private readonly OUTER_PADDING_CLUSTERED = 0.2;\n private readonly INNER_PADDING_CLUSTERED = 0.1;\n private readonly MIN_PADDING = 0.1;\n private readonly HOVER_TRANSITION_DURATION = 150;\n private readonly DEFAULT_ANIMATION_DELAY = 50;\n private readonly LABEL_ANIMATION_DELAY = 100;\n private readonly MIN_TOP_SPACE_FOR_LABEL = 20;\n private readonly LABEL_OFFSET = 8;\n private readonly ROTATION_TOLERANCE_SMALL_DATASET = 1.4;\n private readonly SMALL_DATASET_THRESHOLD = 6;\n private readonly Y_AXIS_PADDING = 20;\n private readonly TICK_AREA_PADDING = 6;\n private readonly TICK_AREA_GAP = 8;\n private readonly DEFAULT_FONT_SIZE = 13;\n private readonly FONT_WIDTH_MULTIPLIER = 0.6;\n private readonly FONT_PADDING = 8;\n private readonly MAX_LABEL_LENGTH = 20;\n private readonly MIN_FONT_SIZE_X_AXIS = 8;\n private readonly MAX_FONT_SIZE_X_AXIS = 14;\n private readonly MIN_FONT_SIZE_Y_AXIS = 9;\n private readonly MAX_FONT_SIZE_Y_AXIS = 15;\n private readonly MANY_ITEMS_THRESHOLD = 20;\n private readonly VERY_MANY_ITEMS_THRESHOLD = 50;\n\n // Animation state\n private _initialAnimationComplete = signal(false);\n\n // Tooltip state\n private _tooltipVisible = signal(false);\n private _tooltipPosition = signal({ x: 0, y: 0 });\n private _tooltipData = signal<AXChartTooltipData>({\n title: '',\n value: '0',\n percentage: '0%',\n color: '',\n });\n private _tooltipRafId: number | null = null;\n private _pendingTooltipCoords: { x: number; y: number } | null = null;\n\n // Signals for component state\n private _initialized = signal(false);\n private _rendered = signal(false);\n\n // Tooltip accessors\n protected tooltipVisible = this._tooltipVisible.asReadonly();\n protected tooltipPosition = this._tooltipPosition.asReadonly();\n protected tooltipData = this._tooltipData.asReadonly();\n\n // Inject configuration\n private configToken = inject(AX_BAR_CHART_CONFIG);\n\n // Inject the chart colors\n private chartColors = inject(AX_CHART_COLOR_PALETTE);\n\n // Inject AXPlatform\n // Removed unused AXPlatform injection\n\n // Configuration with defaults\n protected effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n });\n\n // Messages with defaults\n protected effectiveMessages = computed(() => {\n const defaultMessages = {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All bars are hidden',\n allHiddenHelp: 'Click on legend items to show bars',\n noDataIcon: 'fa-light fa-chart-column',\n allHiddenIcon: 'fa-light fa-eye-slash',\n };\n return {\n ...defaultMessages,\n ...this.effectiveOptions().messages,\n };\n });\n\n // Track hidden bars and series\n private readonly hiddenBars = new Set<string>();\n private readonly hiddenSeries = new Set<string>();\n\n // Computed values for better performance\n private readonly isClusteredMode = computed(() => {\n const value = this.data();\n return Array.isArray(value) && value.length > 0 && 'chartData' in value[0];\n });\n\n private readonly visibleData = computed(() => {\n const value = this.data() || [];\n if (this.isClusteredMode()) {\n return value as AXBarChartClusteredData[];\n }\n return (value as AXBarChartData[]).filter((d) => !this.hiddenBars.has(d.id));\n });\n\n private readonly hasVisibleData = computed(() => {\n const value = this.data();\n if (!Array.isArray(value) || value.length === 0) return false;\n\n if (this.isClusteredMode()) {\n const groups = value as AXBarChartClusteredData[];\n const seriesLabels = this.getClusterSeriesLabels(groups);\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n return groups.some((g) => visibleSeries.some((_, idx) => !!g.chartData[idx]));\n }\n\n return (value as AXBarChartData[]).some((d) => !this.hiddenBars.has(d.id));\n });\n\n // Type guard helper\n private isClusteredData(value: AXBarChartValue): value is AXBarChartClusteredData[] {\n return Array.isArray(value) && value.length > 0 && 'chartData' in value[0];\n }\n\n private getClusterSeriesLabels(groups: AXBarChartClusteredData[]): string[] {\n return groups[0]?.chartData?.map((d) => d.label) ?? [];\n }\n\n constructor() {\n super();\n // Dynamically load D3 and initialize the chart when the component is ready\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\n // Create chart after D3 is loaded and container is available\n if (this.d3 && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n });\n\n // Watch for changes to redraw the chart\n effect(() => {\n // Access inputs to track them\n this.data();\n this.effectiveOptions();\n\n // Only update if already rendered\n if (this._rendered()) {\n this.updateChart();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.cleanupChart();\n }\n\n /**\n * Loads D3.js dynamically\n */\n protected async loadD3(): Promise<void> {\n try {\n this.d3 = await import('d3');\n // If container is ready, create chart\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n } catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n\n /**\n * Creates the bar chart SVG and renders all elements\n */\n public createChart(): void {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement) return;\n\n const containerElement = this.chartContainerEl().nativeElement;\n const inputValue = (this.data() || []) as AXBarChartValue;\n const isClustered = this.isClusteredData(inputValue);\n\n // Use computed visibility\n const hasAnyVisible = this.hasVisibleData();\n const visibleSingleData = isClustered ? [] : (this.visibleData() as AXBarChartData[]);\n const groupedData = isClustered ? (inputValue as AXBarChartClusteredData[]) : [];\n\n // Clear existing chart SVG and messages (do not remove tooltip component)\n this.d3.select(containerElement).selectAll('svg, .ax-chart-message-container').remove();\n\n // Early return if no data\n if (!Array.isArray(inputValue) || inputValue.length === 0) {\n this.showNoDataMessage(containerElement);\n return;\n }\n\n // Early return if all bars are hidden\n if (!hasAnyVisible) {\n this.showAllBarsHiddenMessage(containerElement);\n return;\n }\n\n // Get options and setup dimensions\n const chartOptions = this.effectiveOptions();\n this.setupDimensions(containerElement, chartOptions);\n\n // Create scales and axes and render based on mode\n if (isClustered) {\n this.setupScalesClustered(groupedData);\n this.createAxesClustered(chartOptions, groupedData);\n this.renderBarsClustered(groupedData);\n } else {\n this.setupScales(visibleSingleData);\n this.createAxes(chartOptions);\n this.renderBars(visibleSingleData);\n }\n }\n\n /**\n * Updates the chart when inputs change\n */\n public updateChart(): void {\n this.createChart();\n }\n\n /**\n * Cleans up chart resources\n */\n public cleanupChart(): void {\n if (this._tooltipRafId != null) {\n cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = null;\n }\n this._pendingTooltipCoords = null;\n\n const container = this.chartContainerEl()?.nativeElement;\n if (container) {\n this.d3?.select(container).selectAll('svg, .ax-chart-message-container').remove();\n }\n this.svg = undefined!;\n this.chart = undefined!;\n this._tooltipVisible.set(false);\n }\n\n /**\n * Sets up chart dimensions and creates SVG with responsive attributes\n */\n private setupDimensions(containerElement: HTMLElement, options: AXBarChartOption): void {\n // Remove outer margins; calculate only internal paddings for axes and labels\n this.margin = { top: 0, right: 0, bottom: 0, left: 0 };\n\n // Get container dimensions\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n\n // Axis visibility\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n\n // Internal left padding for Y-axis ticks/labels/title\n const yAxisTitleThickness = options.yAxisLabel ? this.Y_AXIS_TITLE_THICKNESS : 0;\n const yAxisTitlePadding = options.yAxisLabel ? this.Y_AXIS_TITLE_PADDING : 0;\n const leftPaddingForYAxis = showYAxis\n ? this.calculateMaxYAxisTickLabelWidth() + this.AXIS_TICK_PADDING + yAxisTitlePadding + yAxisTitleThickness\n : 0;\n\n // Estimate internal bottom padding for X-axis ticks/labels/title\n let bottomPaddingForXAxis = 0;\n if (showXAxis) {\n const raw = (this.data() || []) as AXBarChartValue;\n const isClustered = this.isClusteredData(raw);\n const barCount = isClustered ? (raw as AXBarChartClusteredData[]).length : (raw as AXBarChartData[]).length;\n const longestLabel = (() => {\n if (isClustered) {\n const groups = raw as AXBarChartClusteredData[];\n return groups.reduce((acc, g) => (acc.length > (g.label?.length ?? 0) ? acc : (g.label ?? '')), '');\n }\n const flat = (raw as AXBarChartData[]) || [];\n return flat.reduce((a, b) => (a.length > b.label.length ? a : b.label), '');\n })();\n\n const baseWidth = options.width ?? containerWidth;\n const workingWidth = Math.max(1, baseWidth - leftPaddingForYAxis);\n const dynamicFontSize = Math.max(10, Math.min(14, Math.round(workingWidth / 50)));\n\n // Use truncated label length for calculation (same logic as actual rendering)\n const maxLabelLength = barCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n const effectiveLabelLength = Math.min(longestLabel.length, maxLabelLength);\n const estimatedLongestLabelWidth = effectiveLabelLength * dynamicFontSize * 0.65;\n\n const availableWidthPerBar = barCount > 0 ? workingWidth / barCount : workingWidth;\n const rotateOption = typeof options.rotateXAxisLabels === 'boolean' ? options.rotateXAxisLabels : undefined;\n const willRotate = this.shouldLabelsRotate(rotateOption, estimatedLongestLabelWidth, availableWidthPerBar);\n\n const tickAreaHeight = willRotate\n ? estimatedLongestLabelWidth * Math.SQRT1_2 + dynamicFontSize * Math.SQRT1_2 + this.TICK_AREA_PADDING\n : dynamicFontSize + this.TICK_AREA_PADDING + 2;\n const gapBelowTicks = options.xAxisLabel && !willRotate ? this.X_AXIS_TITLE_GAP : 0;\n const titleBlockHeight = options.xAxisLabel && !willRotate ? this.X_AXIS_TITLE_BLOCK_HEIGHT : 0;\n bottomPaddingForXAxis = tickAreaHeight + gapBelowTicks + titleBlockHeight;\n }\n\n // Determine plotting dimensions with sensible fallbacks\n const baseWidth = options.width ?? containerWidth;\n const totalWidth = Math.max(this.MIN_TOTAL_WIDTH, baseWidth > 0 ? baseWidth : this.MIN_TOTAL_WIDTH);\n const plotWidth = Math.max(0, totalWidth - leftPaddingForYAxis);\n\n const plotHeight = this.calculatePlotHeight(options.height, containerHeight, bottomPaddingForXAxis);\n\n this.width = plotWidth;\n this.height = plotHeight;\n\n // Create SVG with explicit pixel dimensions to avoid collapse\n const totalHeight = this.height + bottomPaddingForXAxis + this.TOP_EDGE_PADDING;\n\n const svg = this.d3\n .select(containerElement)\n .append('svg')\n .attr('width', '100%')\n .attr('height', String(totalHeight))\n .attr('viewBox', `0 0 ${totalWidth} ${totalHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n\n this.svg = svg;\n\n // Create chart group translated by internal paddings (no external margins)\n this.chart = this.svg\n .append('g')\n .attr('class', 'chart-content')\n .attr('transform', `translate(${leftPaddingForYAxis},${this.TOP_EDGE_PADDING})`);\n }\n\n /**\n * Calculates plot height based on options and container dimensions\n */\n private calculatePlotHeight(\n optionHeight: number | undefined,\n containerHeight: number,\n bottomPadding: number,\n ): number {\n if (optionHeight && optionHeight > 0) {\n return Math.max(this.MIN_PLOT_HEIGHT, optionHeight - bottomPadding);\n }\n if (containerHeight > 0) {\n return Math.max(this.MIN_PLOT_HEIGHT, containerHeight - bottomPadding, this.FALLBACK_PLOT_HEIGHT);\n }\n return this.FALLBACK_PLOT_HEIGHT;\n }\n\n /**\n * Determines if X-axis labels should rotate\n */\n private shouldLabelsRotate(\n rotateOption: boolean | undefined,\n estimatedWidth: number,\n availableWidth: number,\n ): boolean {\n if (rotateOption === true) return true;\n if (rotateOption === false) return false;\n return estimatedWidth > availableWidth;\n }\n\n /**\n * Creates x and y scales for the chart\n */\n private setupScales(data: AXBarChartData[]): void {\n // Get the bar width percentage (default 60%)\n const barWidthPercent = this.effectiveOptions().barWidth ?? 0.6;\n // Calculate padding based on barWidth (inverse relationship)\n const padding = Math.max(this.MIN_PADDING, 1 - barWidthPercent);\n\n // Create x scale (band scale for categorical data)\n this.xScale = this.d3\n .scaleBand()\n .domain(data.map((d) => d.id))\n .range([0, this.width])\n .padding(padding);\n\n // Create y scale (linear scale for values)\n // Support negative values by calculating min/max\n const minValue = this.d3.min(data, (d) => d.value) || 0;\n const maxValue = this.d3.max(data, (d) => d.value) || 0;\n\n this.yScale = this.d3\n .scaleLinear()\n .domain([Math.min(0, minValue), Math.max(0, maxValue)])\n .nice()\n .range([this.height, 0]);\n }\n\n /**\n * Creates x and y scales for clustered charts\n */\n private setupScalesClustered(groups: AXBarChartClusteredData[]): void {\n const seriesLabels = this.getClusterSeriesLabels(groups);\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n\n // Outer band for clusters\n this.xScale = this.d3\n .scaleBand()\n .domain(groups.map((g) => g.id))\n .range([0, this.width])\n .padding(this.OUTER_PADDING_CLUSTERED);\n\n // Inner band for series\n this.xSubScale = this.d3\n .scaleBand()\n .domain(visibleSeries)\n .range([0, this.xScale.bandwidth()])\n .padding(this.INNER_PADDING_CLUSTERED);\n\n // Y scale across all visible values (support negative values)\n const allVisibleValues: number[] = [];\n for (const g of groups) {\n visibleSeries.forEach((_, idx) => {\n const item = g.chartData[idx];\n if (item && typeof item.value === 'number') allVisibleValues.push(item.value);\n });\n }\n const yMin = this.d3.min(allVisibleValues) || 0;\n const yMax = this.d3.max(allVisibleValues) || 0;\n\n this.yScale = this.d3\n .scaleLinear()\n .domain([Math.min(0, yMin), Math.max(0, yMax)])\n .nice()\n .range([this.height, 0]);\n }\n\n /**\n * Creates x and y axes with grid lines\n */\n private createAxes(options: AXBarChartOption): void {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n\n const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n\n if (showXAxis) {\n this.createXAxis(axesGroup, options);\n }\n\n if (showYAxis) {\n this.createYAxis(axesGroup, options);\n }\n\n if (showGrid) {\n this.createGridLines();\n }\n }\n\n private createXAxis(\n axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n options: AXBarChartOption,\n ): void {\n const visibleDataForTicks = (this.data() || []).filter((d) => !this.isBarHidden(d.id));\n const idToLabel = new Map<string, string>(visibleDataForTicks.map((d) => [d.id, d.label]));\n this.buildXAxisCommon(axesGroup, idToLabel, options);\n }\n\n private createYAxis(\n axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n options: AXBarChartOption,\n ): void {\n // Create Y axis with smart number formatting\n const yAxisGenerator = this.d3.axisLeft(this.yScale).tickFormat((value: number | { valueOf(): number }) => {\n const numValue = typeof value === 'number' ? value : value.valueOf();\n return formatLargeNumber(numValue);\n });\n\n // Reduce tick count for better readability\n const maxValue = this.yScale.domain()[1];\n if (maxValue > 1e6) {\n yAxisGenerator.ticks(6); // Fewer ticks for large numbers\n } else if (maxValue > 1e3) {\n yAxisGenerator.ticks(8);\n }\n\n this.yAxis = axesGroup.append('g').attr('class', 'ax-bar-chart-axis-y').call(yAxisGenerator);\n\n // Style the axis text\n const dynamicFontSize = this.getYAxisTickFontSizeBasedOnHeight();\n this.yAxis\n .selectAll('text')\n .style('font-size', `${dynamicFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)')\n .attr('text-anchor', 'end')\n .attr('direction', 'ltr');\n\n // Style axis lines\n this.yAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n\n // Add Y axis title\n if (options.yAxisLabel) {\n this.createYAxisTitle(axesGroup, options.yAxisLabel);\n }\n }\n\n private shouldRotateXAxisLabels(idToLabel: Map<string, string>, fontSize: number): boolean {\n const options = this.effectiveOptions();\n\n // Check if user explicitly set rotation option\n if (options.rotateXAxisLabels === true) return true;\n if (options.rotateXAxisLabels === false) return false;\n\n // If 'auto' or undefined, use intelligent calculation\n if (this.xScale.domain().length === 0) return false;\n\n const step = this.xScale.step();\n const labels = Array.from(idToLabel.values());\n const longestLabel = labels.reduce((a, b) => (a.length > b.length ? a : b), '');\n const estimatedWidth = longestLabel.length * fontSize * this.CHAR_WIDTH_RATIO;\n\n // Heuristic: avoid rotation when there are few categories even if estimation is slightly larger\n const domainCount = this.xScale.domain().length;\n if (domainCount <= this.SMALL_DATASET_THRESHOLD) {\n return estimatedWidth > step * this.ROTATION_TOLERANCE_SMALL_DATASET;\n }\n\n return estimatedWidth > step;\n }\n\n private createXAxisTitle(\n axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n title: string,\n tickAreaHeight: number,\n gapBelowTicks = this.TICK_AREA_GAP,\n ): void {\n // Title positioned directly below tick area with a consistent gap\n const labelY = this.height + tickAreaHeight + gapBelowTicks;\n\n axesGroup\n .append('text')\n .attr('class', 'ax-bar-chart-axis-label ax-x-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'hanging') // Align to top of text for better positioning\n .attr('x', this.width / 2)\n .attr('y', labelY)\n .attr('direction', 'ltr')\n .style('font-size', `${this.X_AXIS_TITLE_FONT_SIZE}px`)\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(title);\n }\n\n private createYAxisTitle(axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>, title: string): void {\n // Calculate the exact position for Y-axis title\n // Y-axis tick labels use text-anchor: end, so they extend LEFT of the Y-axis line\n // Y-axis is at X = 0 within the chart group\n // Chart group is translated by (margin.left, margin.top)\n // So Y-axis is at X = margin.left in SVG coordinates\n\n const maxTickLabelWidth = this.calculateMaxYAxisTickLabelWidth();\n const padding = this.Y_AXIS_PADDING;\n\n // Position title to the left of the tick labels\n // Since text-anchor: end aligns the text to the Y-axis, we need to go further left\n const labelY = -maxTickLabelWidth - padding;\n\n // Center the title vertically\n const labelX = -this.height / 2;\n\n axesGroup\n .append('text')\n .attr('class', 'ax-bar-chart-axis-label ax-y-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('transform', 'rotate(-90)')\n .attr('x', labelX)\n .attr('y', labelY)\n .attr('direction', 'ltr')\n .style('font-size', '14px')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(title);\n }\n\n private calculateMaxYAxisTickLabelWidth(): number {\n // Calculate the maximum width needed for Y-axis tick labels\n const raw = (this.data() || []) as AXBarChartValue;\n const isClustered = this.isClusteredData(raw);\n\n let maxValue = 0;\n if (isClustered) {\n const groups = raw as AXBarChartClusteredData[];\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n\n for (const g of groups) {\n visibleSeries.forEach((_, idx) => {\n const item = g.chartData[idx];\n if (item && typeof item.value === 'number') maxValue = Math.max(maxValue, item.value);\n });\n }\n } else {\n const visibleData = (raw as AXBarChartData[]).filter((d) => !this.isBarHidden(d.id));\n maxValue = visibleData.reduce((acc, d) => (d.value > acc ? d.value : acc), 0);\n }\n\n // Use formatted number for width calculation\n const tickLabelText = Number.isFinite(maxValue) ? formatLargeNumber(maxValue) : '00000';\n return tickLabelText.length * this.DEFAULT_FONT_SIZE * this.FONT_WIDTH_MULTIPLIER + this.FONT_PADDING;\n }\n\n private createGridLines(): void {\n this.chart\n .append('g')\n .attr('class', 'ax-bar-chart-grid')\n .call(\n this.d3\n .axisLeft(this.yScale)\n .tickSize(-this.width)\n .tickFormat(() => ''),\n )\n .selectAll('line')\n .style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))')\n .style('stroke-opacity', 0.2);\n\n // Remove unneeded elements from grid\n this.chart.select('.ax-bar-chart-grid').selectAll('path, text').remove();\n }\n\n /**\n * Creates axes for clustered charts\n */\n private createAxesClustered(options: AXBarChartOption, groups: AXBarChartClusteredData[]): void {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n\n const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n\n if (showXAxis) {\n this.createXAxisClustered(axesGroup, options, groups);\n }\n\n if (showYAxis) {\n this.createYAxis(axesGroup, options);\n }\n\n if (showGrid) {\n this.createGridLines();\n }\n }\n\n private createXAxisClustered(\n axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n options: AXBarChartOption,\n groups: AXBarChartClusteredData[],\n ): void {\n const idToLabel = new Map<string, string>(groups.map((g) => [g.id, g.label]));\n this.buildXAxisCommon(axesGroup, idToLabel, options);\n }\n\n /**\n * Renders the bars with animations\n */\n private renderBars(data: AXBarChartData[]): void {\n // Filter out hidden bars\n const visibleData = data.filter((d) => !this.isBarHidden(d.id));\n const originalFullData = (this.data() as AXBarChartData[]) || [];\n\n // Reset animation state\n this._initialAnimationComplete.set(false);\n\n // Get corner radius from options\n const radius = this.effectiveOptions().cornerRadius;\n\n // Get animation options\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n\n // Create a container for all bars\n const barsContainer = this.chart.append('g').attr('class', 'ax-bar-chart-bars-container');\n\n // Create groups for each bar to handle transformations\n const barGroups = barsContainer\n .selectAll('.ax-bar-chart-bar-group')\n .data(visibleData)\n .enter()\n .append('g')\n .style('cursor', 'pointer')\n .attr('class', 'ax-bar-chart-bar-group');\n\n // Add bars inside groups\n const bars = barGroups\n .append('path')\n .attr('class', 'ax-bar-chart-bar')\n .attr('d', (d: AXBarChartData) => {\n const x = this.xScale(d.id);\n const width = this.xScale.bandwidth();\n const y = this.height - 0.5; // initial height is zero\n return `M${x},${y} L${x},${y} L${x + width},${y} L${x + width},${y} Z`;\n })\n .attr('fill', (d: AXBarChartData) => {\n // Find the index of the current bar (d) in the original data array\n const originalIndex = originalFullData.findIndex((item) => item.id === d.id);\n // Use the original color if provided, otherwise get color from palette using original index\n // Fallback to index 0 if not found, though this shouldn't happen with valid data.\n return d.color || this.getColor(originalIndex !== -1 ? originalIndex : 0);\n });\n\n // Add data labels if they're enabled\n if (this.effectiveOptions().showDataLabels !== false) {\n barGroups\n .append('text')\n .attr('class', 'ax-bar-chart-data-label')\n .attr('text-anchor', 'middle')\n .attr('x', (d: AXBarChartData) => this.xScale(d.id) + this.xScale.bandwidth() / 2)\n .attr('y', this.height) // Start from bottom for animation\n .style('font-size', 'clamp(8px, 2vmin, 12px)')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-data-labels-color))')\n .style('opacity', 0) // Start invisible for animation\n .text((d: AXBarChartData) => {\n // Format large numbers in data labels\n return d.value >= 1000 ? formatLargeNumber(d.value) : d.value;\n });\n\n // Animate data labels with smart positioning to avoid clipping\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n barGroups\n .selectAll('.ax-bar-chart-data-label')\n .transition()\n .duration(animationDuration)\n .delay((d: AXBarChartData, i: number) => i * animationDelay + this.LABEL_ANIMATION_DELAY)\n .attr('y', (d: AXBarChartData) => {\n const barTop = this.yScale(d.value);\n\n // If bar is near the top (100% or close), position label inside the bar\n if (barTop < this.MIN_TOP_SPACE_FOR_LABEL) {\n return barTop + this.LABEL_OFFSET;\n }\n\n // Otherwise, position above the bar\n return barTop - this.LABEL_OFFSET;\n })\n .attr('data-inside-bar', (d: AXBarChartData) => {\n const barTop = this.yScale(d.value);\n return barTop < this.MIN_TOP_SPACE_FOR_LABEL ? 'true' : 'false';\n })\n .style('opacity', 1)\n .ease(animationEasing);\n }\n\n // Set up event handlers on each group\n barGroups\n .on('mouseenter', (event: MouseEvent, d: AXBarChartData) => {\n // Only apply hover effects if initial animation is complete\n if (!this._initialAnimationComplete()) return;\n\n const barEl = this.d3.select(event.currentTarget).select('path');\n\n // Standard hover effect - darken the bar slightly and add a subtle shadow\n barEl\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .style('filter', 'brightness(0.7) drop-shadow(0 0 2px rgba(0,0,0,0.1))');\n\n this.handleBarHover(event, d);\n })\n .on('mousemove', (event: MouseEvent) => {\n // Only update tooltip if initial animation is complete\n if (this._initialAnimationComplete()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', (event: MouseEvent) => {\n // Only apply hover effects if initial animation is complete\n if (!this._initialAnimationComplete()) return;\n\n const barEl = this.d3.select(event.currentTarget).select('path');\n\n // Remove hover effect\n barEl.transition().duration(this.HOVER_TRANSITION_DURATION).style('filter', null);\n\n this._tooltipVisible.set(false);\n })\n .on('click', (event: MouseEvent, d: AXBarChartData) => {\n // Only trigger click events if initial animation is complete\n if (this._initialAnimationComplete()) {\n this.handleBarClick(event, d);\n }\n });\n\n // Add animation\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n bars\n .transition()\n .duration(animationDuration)\n .delay((d: AXBarChartData, i: number) => i * animationDelay)\n .attrTween('d', (d: AXBarChartData) => {\n const x = this.xScale(d.id);\n const width = this.xScale.bandwidth();\n const finalHeight = this.height - this.yScale(d.value);\n\n return (t: number) => {\n const currentHeight = finalHeight * t;\n const currentY = this.height - currentHeight;\n const bottomY = this.height - 0.5; // Add small gap to prevent overlap with x-axis\n\n if (radius > 0 && currentHeight > 0) {\n // Limit radius to prevent it from exceeding half the bar width\n const effectiveRadius = Math.min(radius, width / 2);\n return `M${x},${bottomY} L${x},${currentY + effectiveRadius} Q${x},${currentY} ${x + effectiveRadius},${currentY} L${x + width - effectiveRadius},${currentY} Q${x + width},${currentY} ${x + width},${currentY + effectiveRadius} L${x + width},${bottomY} Z`;\n } else {\n return `M${x},${bottomY} L${x},${currentY} L${x + width},${currentY} L${x + width},${bottomY} Z`;\n }\n };\n })\n .ease(animationEasing) // Use the configured easing function\n .end() // Wait for all animations to complete\n .then(() => {\n // Mark animation as complete to enable hover effects\n this._initialAnimationComplete.set(true);\n });\n }\n\n /**\n * Renders bars for clustered charts\n */\n private renderBarsClustered(groups: AXBarChartClusteredData[]): void {\n const seriesLabels = this.getClusterSeriesLabels(groups);\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n\n this._initialAnimationComplete.set(false);\n\n const radius = this.effectiveOptions().cornerRadius;\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n\n const barsContainer = this.chart.append('g').attr('class', 'ax-bar-chart-bars-container');\n\n const groupSel = barsContainer\n .selectAll('.ax-bar-chart-group')\n .data(groups)\n .enter()\n .append('g')\n .attr('class', 'ax-bar-chart-group')\n .attr('transform', (g: AXBarChartClusteredData) => `translate(${this.xScale(g.id)},0)`);\n\n type ClusteredBarDatum = { group: AXBarChartClusteredData; seriesLabel: string; seriesIndex: number };\n\n const barGroups = groupSel\n .selectAll('.ax-bar-chart-bar-group')\n .data((g: AXBarChartClusteredData) =>\n visibleSeries.map((label, idx): ClusteredBarDatum => ({ group: g, seriesLabel: label, seriesIndex: idx })),\n )\n .enter()\n .append('g')\n .style('cursor', 'pointer')\n .attr('class', 'ax-bar-chart-bar-group');\n\n const bars = barGroups\n .append('path')\n .attr('class', 'ax-bar-chart-bar')\n .attr('data-series', (d: ClusteredBarDatum) => d.seriesLabel)\n .attr('d', (d: ClusteredBarDatum) => {\n const x = this.xSubScale(d.seriesLabel);\n const width = this.xSubScale.bandwidth();\n const y = this.height - 0.5;\n return `M${x},${y} L${x},${y} L${x + width},${y} L${x + width},${y} Z`;\n })\n .attr('fill', (d: ClusteredBarDatum) => {\n const item = d.group.chartData[d.seriesIndex];\n return item?.color || this.getColor(d.seriesIndex);\n });\n\n if (this.effectiveOptions().showDataLabels !== false) {\n barGroups\n .append('text')\n .attr('class', 'ax-bar-chart-data-label')\n .attr('text-anchor', 'middle')\n .attr('x', (d: ClusteredBarDatum) => (this.xSubScale(d.seriesLabel) || 0) + this.xSubScale.bandwidth() / 2)\n .attr('y', this.height)\n .style('font-size', 'clamp(8px, 2vmin, 12px)')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-data-labels-color))')\n .style('opacity', 0)\n .text((d: ClusteredBarDatum) => {\n const value = d.group.chartData[d.seriesIndex]?.value;\n if (value === undefined) return '';\n // Format large numbers in data labels\n return value >= 1000 ? formatLargeNumber(value) : value;\n });\n\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n barGroups\n .selectAll('.ax-bar-chart-data-label')\n .transition()\n .duration(animationDuration)\n .delay((_d: unknown, i: number) => i * animationDelay + this.LABEL_ANIMATION_DELAY)\n .attr('y', (d: ClusteredBarDatum) => {\n const item = d.group.chartData[d.seriesIndex];\n if (!item) return this.height;\n\n const barTop = this.yScale(item.value);\n\n // If bar is near the top (100% or close), position label inside the bar\n if (barTop < this.MIN_TOP_SPACE_FOR_LABEL) {\n return barTop + this.LABEL_OFFSET;\n }\n\n // Otherwise, position above the bar\n return barTop - this.LABEL_OFFSET;\n })\n .attr('data-inside-bar', (d: ClusteredBarDatum) => {\n const item = d.group.chartData[d.seriesIndex];\n if (!item) return 'false';\n\n const barTop = this.yScale(item.value);\n return barTop < this.MIN_TOP_SPACE_FOR_LABEL ? 'true' : 'false';\n })\n .style('opacity', 1)\n .ease(animationEasing);\n }\n\n barGroups\n .on('mouseenter', (event: MouseEvent, d: ClusteredBarDatum) => {\n if (!this._initialAnimationComplete()) return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n barEl\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .style('filter', 'brightness(0.7) drop-shadow(0 0 2px rgba(0,0,0,0.1))');\n const item = d.group.chartData[d.seriesIndex];\n if (item) this.handleBarHover(event, item, d.group);\n })\n .on('mousemove', (event: MouseEvent) => {\n if (this._initialAnimationComplete()) this.updateTooltipPosition(event);\n })\n .on('mouseleave', (event: MouseEvent) => {\n if (!this._initialAnimationComplete()) return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n barEl.transition().duration(this.HOVER_TRANSITION_DURATION).style('filter', null);\n this._tooltipVisible.set(false);\n })\n .on('click', (event: MouseEvent, d: ClusteredBarDatum) => {\n if (!this._initialAnimationComplete()) return;\n const item = d.group.chartData[d.seriesIndex];\n if (item) this.handleBarClick(event, item);\n });\n\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n bars\n .transition()\n .duration(animationDuration)\n .delay((_d: unknown, i: number) => i * animationDelay)\n .attrTween('d', (d: ClusteredBarDatum) => {\n const x = this.xSubScale(d.seriesLabel);\n const width = this.xSubScale.bandwidth();\n const item = d.group.chartData[d.seriesIndex];\n const finalHeight = item ? this.height - this.yScale(item.value) : 0;\n\n return (t: number) => {\n const currentHeight = finalHeight * t;\n const currentY = this.height - currentHeight;\n const bottomY = this.height - 0.5; // Add small gap to prevent overlap with x-axis\n\n if (radius > 0 && currentHeight > 0) {\n // Limit radius to prevent it from exceeding half the bar width\n const effectiveRadius = Math.min(radius, width / 2);\n return `M${x},${bottomY} L${x},${currentY + effectiveRadius} Q${x},${currentY} ${x + effectiveRadius},${currentY} L${x + width - effectiveRadius},${currentY} Q${x + width},${currentY} ${x + width},${currentY + effectiveRadius} L${x + width},${bottomY} Z`;\n } else {\n return `M${x},${bottomY} L${x},${currentY} L${x + width},${currentY} L${x + width},${bottomY} Z`;\n }\n };\n })\n .ease(animationEasing)\n .end()\n .then(() => this._initialAnimationComplete.set(true));\n }\n\n /**\n * Gets the appropriate D3 easing function based on the option string\n */\n // getEasingFunction moved to shared chart utils\n\n /**\n * Handles bar hover event and shows tooltip\n */\n private handleBarHover(event: MouseEvent, datum: AXBarChartData, group?: { id: string; label: string }): void {\n if (this.effectiveOptions().showTooltip !== false) {\n const dataValue = this.data() as AXBarChartValue;\n const isClustered = this.isClusteredData(dataValue);\n const flatData: AXBarChartData[] = isClustered\n ? (dataValue as AXBarChartClusteredData[]).flatMap((g) => g.chartData)\n : (dataValue as AXBarChartData[]) || [];\n const index = flatData.findIndex((item) => item.id === datum.id && item.label === datum.label);\n const color = datum.color || this.getColor(index !== -1 ? index : 0);\n\n // Calculate percentage of total\n const total = isClustered\n ? (dataValue as AXBarChartClusteredData[]).reduce(\n (sum, g) => sum + g.chartData.reduce((s, it) => s + it.value, 0),\n 0,\n )\n : (flatData as AXBarChartData[]).reduce((sum, item) => sum + item.value, 0);\n const percentage = total > 0 ? ((datum.value / total) * 100).toFixed(1) : '0';\n\n this._tooltipData.set({\n title: group ? `${datum.tooltipLabel || datum.label} — ${group.label}` : datum.tooltipLabel || datum.label,\n value: formatLargeNumber(datum.value),\n percentage: `${percentage}%`,\n color: color,\n });\n\n this.updateTooltipPosition(event);\n this._tooltipVisible.set(true);\n }\n }\n\n private updateTooltipPosition(event: MouseEvent): void {\n this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n if (this._tooltipRafId != null) return;\n this._tooltipRafId = requestAnimationFrame(() => {\n this._tooltipRafId = null;\n const coords = this._pendingTooltipCoords;\n if (!coords) return;\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl) return;\n const containerRect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip') as HTMLElement | null;\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = this.computeEnhancedTooltipPosition(containerRect, tooltipRect, coords.x, coords.y);\n this._tooltipPosition.set(pos);\n });\n }\n\n /**\n * Enhanced tooltip positioning that considers chart boundaries and prevents overflow\n */\n private computeEnhancedTooltipPosition(\n containerRect: DOMRect,\n tooltipRect: DOMRect | null,\n clientX: number,\n clientY: number,\n ): { x: number; y: number } {\n const cursorX = clientX - containerRect.left;\n const cursorY = clientY - containerRect.top;\n\n if (!tooltipRect) {\n // Default positioning when tooltip dimensions are unknown\n return {\n x: Math.min(cursorX + this.TOOLTIP_GAP, containerRect.width - this.TOOLTIP_GAP),\n y: Math.max(this.TOOLTIP_GAP, Math.min(cursorY, containerRect.height - this.TOOLTIP_GAP)),\n };\n }\n\n // Calculate available space in each direction\n const spaceRight = containerRect.width - cursorX;\n const spaceLeft = cursorX;\n const spaceBelow = containerRect.height - cursorY;\n const spaceAbove = cursorY;\n\n // Determine best horizontal position\n let x: number;\n if (spaceRight >= tooltipRect.width + this.TOOLTIP_GAP) {\n // Position to the right of cursor\n x = cursorX + this.TOOLTIP_GAP;\n } else if (spaceLeft >= tooltipRect.width + this.TOOLTIP_GAP) {\n // Position to the left of cursor\n x = cursorX - tooltipRect.width - this.TOOLTIP_GAP;\n } else {\n // Center horizontally if neither side has enough space\n x = Math.max(\n this.TOOLTIP_GAP,\n Math.min(\n (containerRect.width - tooltipRect.width) / 2,\n containerRect.width - tooltipRect.width - this.TOOLTIP_GAP,\n ),\n );\n }\n\n // Calculate best vertical position\n let y: number;\n if (spaceBelow >= tooltipRect.height + this.TOOLTIP_GAP) {\n // Position below cursor\n y = cursorY + this.TOOLTIP_GAP;\n } else if (spaceAbove >= tooltipRect.height + this.TOOLTIP_GAP) {\n // Position above cursor\n y = cursorY - tooltipRect.height - this.TOOLTIP_GAP;\n } else {\n // Center vertically if neither direction has enough space\n y = Math.max(\n this.TOOLTIP_GAP,\n Math.min(\n (containerRect.height - tooltipRect.height) / 2,\n containerRect.height - tooltipRect.height - this.TOOLTIP_GAP,\n ),\n );\n }\n\n // Ensure tooltip stays within container bounds\n x = Math.max(this.TOOLTIP_GAP, Math.min(x, containerRect.width - tooltipRect.width - this.TOOLTIP_GAP));\n y = Math.max(this.TOOLTIP_GAP, Math.min(y, containerRect.height - tooltipRect.height - this.TOOLTIP_GAP));\n\n return { x, y };\n }\n\n /**\n * Handles bar click event\n */\n private handleBarClick(event: MouseEvent, datum: AXBarChartData): void {\n this.barClick.emit({ item: datum, event: { nativeEvent: event, sender: this } });\n }\n\n /**\n * Shows a message when no data is available\n */\n private showNoDataMessage(containerElement: HTMLElement): void {\n this.clearChartArea(containerElement);\n this.showMessage(\n containerElement,\n this.effectiveMessages().noDataIcon,\n this.effectiveMessages().noData,\n this.effectiveMessages().noDataHelp,\n 'ax-bar-chart-no-data-message',\n );\n }\n\n /**\n * Shows a message when all bars are hidden\n */\n private showAllBarsHiddenMessage(containerElement: HTMLElement): void {\n this.clearChartArea(containerElement);\n this.showMessage(\n containerElement,\n this.effectiveMessages().allHiddenIcon,\n this.effectiveMessages().allHidden,\n this.effectiveMessages().allHiddenHelp,\n 'ax-bar-chart-no-data-message',\n );\n }\n\n /**\n * Gets the color for a bar based on its index\n */\n protected getColor(index: number): string {\n return getChartColor(index, this.chartColors);\n }\n\n /**\n * Checks if a bar is hidden\n */\n protected isBarHidden(id: string): boolean {\n return this.hiddenBars.has(id);\n }\n\n /**\n * Implementation of AXChartLegendCompatible interface\n * Returns legend items based on the chart data\n */\n getLegendItems(): AXChartLegendItem[] {\n const value = (this.data() || []) as AXBarChartValue;\n if (this.isClusteredData(value)) {\n const groups = value as AXBarChartClusteredData[];\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const total = groups.reduce(\n (sum, g) => sum + g.chartData.reduce((s, it) => s + (typeof it.value === 'number' ? it.value : 0), 0),\n 0,\n );\n return seriesLabels.map((label, index) => {\n const seriesTotal = groups.reduce((s, g) => {\n const item = g.chartData[index];\n const v = item && typeof item.value === 'number' ? item.value : 0;\n return s + v;\n }, 0);\n const percentage = total > 0 ? (seriesTotal / total) * 100 : 0;\n const firstItem = groups[0]?.chartData[index];\n return {\n id: label,\n name: label || `Series ${index + 1}`,\n value: seriesTotal,\n percentage,\n color: firstItem?.color || this.getColor(index),\n hidden: this.hiddenSeries.has(label),\n };\n });\n }\n\n const flat = value as AXBarChartData[];\n const total = flat.reduce((sum, item) => sum + (typeof item.value === 'number' ? item.value : 0), 0);\n return flat.map((item, index) => {\n const val = typeof item.value === 'number' ? item.value : 0;\n const percentage = total > 0 ? (val / total) * 100 : 0;\n return {\n id: item.id,\n name: item.label || `Item ${index + 1}`,\n value: item.value,\n percentage,\n color: item.color || this.getColor(index),\n hidden: this.isBarHidden(item.id),\n };\n });\n }\n\n /**\n * Implementation of AXChartLegendCompatible interface\n * Highlights a specific bar by ID\n */\n highlightSegment(id: string | null): void {\n if (!this.svg) return;\n\n const value = (this.data() || []) as AXBarChartValue;\n const isClustered = this.isClusteredData(value);\n\n const resetAll = () => {\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .classed('ax-bar-chart-highlighted', false)\n .classed('ax-bar-chart-dimmed', false)\n .attr('opacity', 1)\n .attr('filter', null)\n .attr('stroke', null)\n .attr('stroke-width', null)\n .attr('stroke-opacity', null);\n };\n\n if (id === null) {\n resetAll();\n return;\n }\n\n if (!isClustered) {\n if (this.isBarHidden(id as string)) {\n resetAll();\n return;\n }\n const targetBar = this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((d: unknown) => (d as AXBarChartData | undefined)?.id === id);\n if (targetBar.empty()) return;\n const isCurrentlyHighlighted = targetBar.classed('ax-bar-chart-highlighted');\n if (isCurrentlyHighlighted) {\n resetAll();\n } else {\n resetAll();\n targetBar\n .classed('ax-bar-chart-highlighted', true)\n .attr('filter', 'drop-shadow(0 0 4px rgba(0, 0, 0, 0.3))')\n .attr('stroke', '#000')\n .attr('stroke-width', '1px')\n .attr('stroke-opacity', '0.3')\n .style('transition', 'all 0.2s ease-in-out');\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((d: unknown) => (d as AXBarChartData | undefined)?.id !== id)\n .classed('ax-bar-chart-dimmed', true)\n .attr('opacity', 0.5)\n .style('transition', 'opacity 0.2s ease-in-out');\n }\n return;\n }\n\n const targetBars = this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((_d: unknown, i: number, nodes: SVGPathElement[]) => {\n const node = nodes[i];\n return node.getAttribute('data-series') === id;\n });\n if (targetBars.empty()) return;\n const isHighlighted = targetBars.classed('ax-bar-chart-highlighted');\n if (isHighlighted) {\n resetAll();\n } else {\n resetAll();\n targetBars\n .classed('ax-bar-chart-highlighted', true)\n .attr('filter', 'drop-shadow(0 0 4px rgba(0, 0, 0, 0.3))')\n .attr('stroke', '#000')\n .attr('stroke-width', '1px')\n .attr('stroke-opacity', '0.3')\n .style('transition', 'all 0.2s ease-in-out');\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((_d: unknown, i: number, nodes: SVGPathElement[]) => nodes[i].getAttribute('data-series') !== id)\n .classed('ax-bar-chart-dimmed', true)\n .attr('opacity', 0.5)\n .style('transition', 'opacity 0.2s ease-in-out');\n }\n }\n\n /**\n * Implementation of AXChartLegendCompatible interface\n * Toggles visibility of a bar by ID\n * @returns New visibility state (true = visible, false = hidden)\n */\n toggleSegment(id: string): boolean {\n const value = (this.data() || []) as AXBarChartValue;\n const isClustered = this.isClusteredData(value);\n\n if (!isClustered) {\n const wasAllHidden =\n (value as AXBarChartData[]).length > 0 && (value as AXBarChartData[]).every((d) => this.isBarHidden(d.id));\n if (this.hiddenBars.has(id)) {\n this.hiddenBars.delete(id);\n if (wasAllHidden) {\n if (this.chartContainerEl()?.nativeElement) {\n this.d3\n ?.select(this.chartContainerEl().nativeElement)\n .selectAll('svg, .ax-chart-message-container')\n .remove();\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n } else {\n this.updateChart();\n }\n } else {\n this.hiddenBars.add(id);\n this.updateChart();\n }\n return !this.hiddenBars.has(id);\n }\n\n // Clustered mode: toggle series by label\n const groups = value as AXBarChartClusteredData[];\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const seriesCount = seriesLabels.length;\n const wasAllHidden = seriesCount > 0 && this.hiddenSeries.size >= seriesCount;\n\n if (this.hiddenSeries.has(id)) {\n this.hiddenSeries.delete(id);\n if (wasAllHidden) {\n if (this.chartContainerEl()?.nativeElement) {\n this.d3?.select(this.chartContainerEl().nativeElement).selectAll('svg, .ax-chart-message-container').remove();\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n } else {\n this.updateChart();\n }\n } else {\n this.hiddenSeries.add(id);\n this.updateChart();\n }\n\n return !this.hiddenSeries.has(id);\n }\n\n // ===== Helper utilities for modularity and maintainability =====\n\n private getContainerElement(): HTMLElement | null {\n return this.chartContainerEl()?.nativeElement ?? null;\n }\n\n private clearChartArea(containerElement: HTMLElement): void {\n this.d3.select(containerElement).selectAll('svg, .ax-chart-message-container').remove();\n }\n\n /**\n * Truncates long labels with ellipsis\n */\n private truncateLabel(label: string, maxLength: number = this.MAX_LABEL_LENGTH): string {\n if (label.length <= maxLength) return label;\n return label.substring(0, maxLength - 1) + '…';\n }\n\n /**\n * Gets adaptive font size for X-axis based on width and item count\n */\n private getXAxisTickFontSizeBasedOnWidth(): number {\n const itemCount = this.xScale.domain().length;\n const baseSize = Math.round(this.width / 50);\n\n // Reduce font size for many items\n let adjustedSize = baseSize;\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n adjustedSize = Math.round(baseSize * 0.7);\n } else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n adjustedSize = Math.round(baseSize * 0.85);\n }\n\n return Math.max(this.MIN_FONT_SIZE_X_AXIS, Math.min(this.MAX_FONT_SIZE_X_AXIS, adjustedSize));\n }\n\n /**\n * Gets adaptive font size for Y-axis based on height\n */\n private getYAxisTickFontSizeBasedOnHeight(): number {\n const baseSize = Math.round(this.height / 30);\n return Math.max(this.MIN_FONT_SIZE_Y_AXIS, Math.min(this.MAX_FONT_SIZE_Y_AXIS, baseSize));\n }\n\n private buildXAxisCommon(\n axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n idToLabel: Map<string, string>,\n options: AXBarChartOption,\n ): void {\n const itemCount = this.xScale.domain().length;\n\n // Smart tick reduction for many items\n let tickValues = this.xScale.domain();\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n // Show every 5th tick\n tickValues = tickValues.filter((_d, i) => i % 5 === 0);\n } else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n // Show every 2nd tick\n tickValues = tickValues.filter((_d, i) => i % 2 === 0);\n }\n\n const axis = this.d3\n .axisBottom(this.xScale)\n .tickValues(tickValues)\n .tickFormat((id: string) => {\n const label = idToLabel.get(id) ?? String(id);\n // Truncate long labels intelligently\n const maxLength = itemCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n return this.truncateLabel(label, maxLength);\n });\n\n this.xAxis = axesGroup\n .append('g')\n .attr('class', 'ax-bar-chart-axis-x')\n .attr('transform', `translate(0,${this.height})`)\n .call(axis);\n\n const dynamicFontSize = this.getXAxisTickFontSizeBasedOnWidth();\n const xAxisTicks = this.xAxis\n .selectAll('text')\n .style('font-size', `${dynamicFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)')\n .attr('direction', 'ltr');\n\n const isRotated = this.shouldRotateXAxisLabels(idToLabel, dynamicFontSize);\n if (isRotated) {\n xAxisTicks.attr('transform', 'rotate(-45)').style('text-anchor', 'end').attr('dx', '-0.8em').attr('dy', '0.15em');\n }\n\n this.xAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n\n if (options.xAxisLabel && !isRotated) {\n const tickNodes = (this.xAxis.selectAll('text').nodes() || []) as SVGTextElement[];\n const measuredTickHeight =\n tickNodes.length > 0\n ? Math.max(\n ...tickNodes.map((n) => {\n try {\n return n?.getBBox?.()?.height ?? dynamicFontSize;\n } catch {\n return dynamicFontSize;\n }\n }),\n )\n : dynamicFontSize;\n const tickAreaHeight = measuredTickHeight + this.TICK_AREA_PADDING;\n const gapBelowTicks = this.X_AXIS_TITLE_GAP;\n this.createXAxisTitle(axesGroup, options.xAxisLabel, tickAreaHeight, gapBelowTicks);\n }\n }\n\n // computeTooltipPosition moved to shared chart utils\n\n private showMessage(\n containerElement: HTMLElement,\n iconClass: string,\n text: string,\n helpText: string,\n specificClass: string,\n ): void {\n const container = this.d3\n .select(containerElement)\n .append('div')\n .attr('class', `ax-chart-message-container ax-bar-chart-message-background ${specificClass}`);\n\n container\n .append('div')\n .attr('class', 'ax-chart-message-icon ax-bar-chart-no-data-icon')\n .html(`<i class=\"${iconClass} fa-2x\"></i>`);\n\n container.append('div').attr('class', 'ax-chart-message-text ax-bar-chart-no-data-text').text(text);\n\n container.append('div').attr('class', 'ax-chart-message-help ax-bar-chart-no-data-help').text(helpText);\n }\n}\n","<div class=\"ax-bar-chart\" role=\"img\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"true\"\n ></ax-chart-tooltip>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|