@acorex/charts 21.0.0-next.6 → 21.0.0-next.61
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/bar-chart/index.d.ts +67 -7
- package/donut-chart/index.d.ts +46 -8
- package/fesm2022/acorex-charts-bar-chart.mjs +342 -124
- package/fesm2022/acorex-charts-bar-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-chart-legend.mjs +5 -5
- package/fesm2022/acorex-charts-chart-legend.mjs.map +1 -1
- package/fesm2022/acorex-charts-chart-tooltip.mjs +4 -4
- package/fesm2022/acorex-charts-chart-tooltip.mjs.map +1 -1
- package/fesm2022/acorex-charts-donut-chart.mjs +298 -200
- package/fesm2022/acorex-charts-donut-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-gauge-chart.mjs +93 -68
- package/fesm2022/acorex-charts-gauge-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-hierarchy-chart.mjs +22 -16
- package/fesm2022/acorex-charts-hierarchy-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-line-chart.mjs +295 -153
- package/fesm2022/acorex-charts-line-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts.mjs +93 -7
- package/fesm2022/acorex-charts.mjs.map +1 -1
- package/gauge-chart/index.d.ts +10 -7
- package/hierarchy-chart/index.d.ts +4 -5
- package/index.d.ts +43 -4
- package/line-chart/index.d.ts +70 -7
- package/package.json +1 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-charts-line-chart.mjs","sources":["../tmp-esm2022/line-chart/lib/line-chart.config.js","../tmp-esm2022/line-chart/lib/line-chart.component.js","../tmp-esm2022/line-chart/acorex-charts-line-chart.js"],"sourcesContent":["import { AX_GLOBAL_CONFIG } from '@acorex/core/config';\nimport { InjectionToken, inject } from '@angular/core';\nimport { set } from 'lodash-es';\nexport const AXLineChartDefaultConfig = {\n margins: {\n top: 20,\n right: 25,\n bottom: 40,\n left: 50,\n },\n showXAxis: true,\n showYAxis: true,\n showGrid: true,\n showVerticalGrid: false,\n yAxisStartsAtZero: true,\n axisPadding: 5,\n showTooltip: true,\n lineWidth: 2,\n showPoints: true,\n pointRadius: 4,\n smoothLine: false,\n fillArea: false,\n fillOpacity: 20,\n showCrosshair: false,\n animationDuration: 1000,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All series are hidden',\n allHiddenHelp: 'Click legend items to show series in the chart',\n noDataIcon: 'fa-light fa-chart-line',\n allHiddenIcon: 'fa-light fa-eye-slash',\n },\n};\nexport const AX_LINE_CHART_CONFIG = new InjectionToken('AX_LINE_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => {\n const global = inject(AX_GLOBAL_CONFIG);\n set(global, 'chart.lineChart', AXLineChartDefaultConfig);\n return AXLineChartDefaultConfig;\n },\n});\nexport function lineChartConfig(config = {}) {\n const result = {\n ...AXLineChartDefaultConfig,\n ...config,\n };\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1jaGFydC5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvbGluZS1jaGFydC9zcmMvbGliL2xpbmUtY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHaEMsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQXNCO0lBQ3pELE9BQU8sRUFBRTtRQUNQLEdBQUcsRUFBRSxFQUFFO1FBQ1AsS0FBSyxFQUFFLEVBQUU7UUFDVCxNQUFNLEVBQUUsRUFBRTtRQUNWLElBQUksRUFBRSxFQUFFO0tBQ1Q7SUFDRCxTQUFTLEVBQUUsSUFBSTtJQUNmLFNBQVMsRUFBRSxJQUFJO0lBQ2YsUUFBUSxFQUFFLElBQUk7SUFDZCxnQkFBZ0IsRUFBRSxLQUFLO0lBQ3ZCLGlCQUFpQixFQUFFLElBQUk7SUFDdkIsV0FBVyxFQUFFLENBQUM7SUFDZCxXQUFXLEVBQUUsSUFBSTtJQUNqQixTQUFTLEVBQUUsQ0FBQztJQUNaLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxDQUFDO0lBQ2QsVUFBVSxFQUFFLEtBQUs7SUFDakIsUUFBUSxFQUFFLEtBQUs7SUFDZixXQUFXLEVBQUUsRUFBRTtJQUNmLGFBQWEsRUFBRSxLQUFLO0lBQ3BCLGlCQUFpQixFQUFFLElBQUk7SUFDdkIsZUFBZSxFQUFFLFdBQVc7SUFDNUIsUUFBUSxFQUFFO1FBQ1IsTUFBTSxFQUFFLG1CQUFtQjtRQUMzQixVQUFVLEVBQUUsMENBQTBDO1FBQ3RELFNBQVMsRUFBRSx1QkFBdUI7UUFDbEMsYUFBYSxFQUFFLGdEQUFnRDtRQUMvRCxVQUFVLEVBQUUsd0JBQXdCO1FBQ3BDLGFBQWEsRUFBRSx1QkFBdUI7S0FDdkM7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxjQUFjLENBQW9CLHNCQUFzQixFQUFFO0lBQ2hHLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDWixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN4QyxHQUFHLENBQUMsTUFBTSxFQUFFLGlCQUFpQixFQUFFLHdCQUF3QixDQUFDLENBQUM7UUFDekQsT0FBTyx3QkFBd0IsQ0FBQztJQUNsQyxDQUFDO0NBQ0YsQ0FBQyxDQUFDO0FBSUgsTUFBTSxVQUFVLGVBQWUsQ0FBQyxTQUFpQyxFQUFFO0lBQ2pFLE1BQU0sTUFBTSxHQUFHO1FBQ2IsR0FBRyx3QkFBd0I7UUFDM0IsR0FBRyxNQUFNO0tBQ1YsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWF9HTE9CQUxfQ09ORklHIH0gZnJvbSAnQGFjb3JleC9jb3JlL2NvbmZpZyc7XG5pbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQVhMaW5lQ2hhcnRPcHRpb24gfSBmcm9tICcuL2xpbmUtY2hhcnQudHlwZSc7XG5cbmV4cG9ydCBjb25zdCBBWExpbmVDaGFydERlZmF1bHRDb25maWc6IEFYTGluZUNoYXJ0T3B0aW9uID0ge1xuICBtYXJnaW5zOiB7XG4gICAgdG9wOiAyMCxcbiAgICByaWdodDogMjUsXG4gICAgYm90dG9tOiA0MCxcbiAgICBsZWZ0OiA1MCxcbiAgfSxcbiAgc2hvd1hBeGlzOiB0cnVlLFxuICBzaG93WUF4aXM6IHRydWUsXG4gIHNob3dHcmlkOiB0cnVlLFxuICBzaG93VmVydGljYWxHcmlkOiBmYWxzZSxcbiAgeUF4aXNTdGFydHNBdFplcm86IHRydWUsXG4gIGF4aXNQYWRkaW5nOiA1LFxuICBzaG93VG9vbHRpcDogdHJ1ZSxcbiAgbGluZVdpZHRoOiAyLFxuICBzaG93UG9pbnRzOiB0cnVlLFxuICBwb2ludFJhZGl1czogNCxcbiAgc21vb3RoTGluZTogZmFsc2UsXG4gIGZpbGxBcmVhOiBmYWxzZSxcbiAgZmlsbE9wYWNpdHk6IDIwLFxuICBzaG93Q3Jvc3NoYWlyOiBmYWxzZSxcbiAgYW5pbWF0aW9uRHVyYXRpb246IDEwMDAsXG4gIGFuaW1hdGlvbkVhc2luZzogJ2N1YmljLW91dCcsXG4gIG1lc3NhZ2VzOiB7XG4gICAgbm9EYXRhOiAnTm8gZGF0YSBhdmFpbGFibGUnLFxuICAgIG5vRGF0YUhlbHA6ICdQbGVhc2UgcHJvdmlkZSBkYXRhIHRvIGRpc3BsYXkgdGhlIGNoYXJ0JyxcbiAgICBhbGxIaWRkZW46ICdBbGwgc2VyaWVzIGFyZSBoaWRkZW4nLFxuICAgIGFsbEhpZGRlbkhlbHA6ICdDbGljayBsZWdlbmQgaXRlbXMgdG8gc2hvdyBzZXJpZXMgaW4gdGhlIGNoYXJ0JyxcbiAgICBub0RhdGFJY29uOiAnZmEtbGlnaHQgZmEtY2hhcnQtbGluZScsXG4gICAgYWxsSGlkZGVuSWNvbjogJ2ZhLWxpZ2h0IGZhLWV5ZS1zbGFzaCcsXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgQVhfTElORV9DSEFSVF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48QVhMaW5lQ2hhcnRPcHRpb24+KCdBWF9MSU5FX0NIQVJUX0NPTkZJRycsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiB7XG4gICAgY29uc3QgZ2xvYmFsID0gaW5qZWN0KEFYX0dMT0JBTF9DT05GSUcpO1xuICAgIHNldChnbG9iYWwsICdjaGFydC5saW5lQ2hhcnQnLCBBWExpbmVDaGFydERlZmF1bHRDb25maWcpO1xuICAgIHJldHVybiBBWExpbmVDaGFydERlZmF1bHRDb25maWc7XG4gIH0sXG59KTtcblxuZXhwb3J0IHR5cGUgUGFydGlhbExpbmVDaGFydENvbmZpZyA9IFBhcnRpYWw8QVhMaW5lQ2hhcnRPcHRpb24+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGluZUNoYXJ0Q29uZmlnKGNvbmZpZzogUGFydGlhbExpbmVDaGFydENvbmZpZyA9IHt9KTogQVhMaW5lQ2hhcnRPcHRpb24ge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgLi4uQVhMaW5lQ2hhcnREZWZhdWx0Q29uZmlnLFxuICAgIC4uLmNvbmZpZyxcbiAgfTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==","import { NXComponent } from '@acorex/cdk/common';\nimport { AX_CHART_COLOR_PALETTE, computeTooltipPosition, getChartColor } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { AXPlatform } from '@acorex/core/platform';\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal, viewChild, ViewEncapsulation, } from '@angular/core';\nimport { AX_LINE_CHART_CONFIG } from './line-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * Line Chart Component for rendering data as lines with interactive hover effects and animations\n */\nexport class AXLineChartComponent extends NXComponent {\n data = input([], ...(ngDevMode ? [{ debugName: \"data\" }] : []));\n options = input({}, ...(ngDevMode ? [{ debugName: \"options\" }] : []));\n pointClick = output();\n chartContainerEl = viewChild.required('chartContainer');\n d3;\n svg;\n chart;\n xScale;\n yScale;\n xAxis;\n yAxis;\n width;\n height;\n margin = { top: 20, right: 25, bottom: 40, left: 50 };\n _tooltipVisible = signal(false, ...(ngDevMode ? [{ debugName: \"_tooltipVisible\" }] : []));\n _tooltipPosition = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: \"_tooltipPosition\" }] : []));\n _tooltipData = signal({\n title: '',\n value: '0',\n percentage: '0%',\n color: '',\n }, ...(ngDevMode ? [{ debugName: \"_tooltipData\" }] : []));\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\n hiddenSeries = new Set();\n _fullNormalizedData = [];\n tooltipVisible = this._tooltipVisible.asReadonly();\n tooltipPosition = this._tooltipPosition.asReadonly();\n tooltipData = this._tooltipData.asReadonly();\n // Inject configuration\n configToken = inject(AX_LINE_CHART_CONFIG);\n // Inject the chart colors\n chartColors = inject(AX_CHART_COLOR_PALETTE);\n // Inject AXPlatform\n platform = inject(AXPlatform);\n effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n // Messages with defaults\n effectiveMessages = computed(() => {\n const defaultMessages = {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All series are hidden',\n allHiddenHelp: 'Click legend items to show series in the chart',\n noDataIcon: 'fa-light fa-chart-line',\n allHiddenIcon: 'fa-light fa-eye-slash',\n };\n return {\n ...defaultMessages,\n ...this.effectiveOptions().messages,\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveMessages\" }] : []));\n // Tooltip gap in pixels for consistent spacing\n TOOLTIP_GAP = 10;\n ngOnInit() {\n this.loadD3();\n }\n #effect = effect(() => {\n const rawData = this.data();\n if (Array.isArray(rawData)) {\n this._fullNormalizedData = rawData.map((s, i) => ({ ...s, originalIndex: i }));\n }\n else if (rawData && 'data' in rawData) {\n this._fullNormalizedData = [{ ...rawData, originalIndex: 0 }];\n }\n else {\n this._fullNormalizedData = [];\n }\n this.effectiveOptions();\n if (this._rendered()) {\n this.updateChart();\n }\n }, ...(ngDevMode ? [{ debugName: \"#effect\" }] : []));\n ngAfterViewInit() {\n this._initialized.set(true);\n if (this.d3 && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n }\n ngOnDestroy() {\n this.cleanupChart();\n }\n // AXChartLegendCompatible Implementation\n getLegendItems() {\n const totalSum = this._fullNormalizedData.reduce((sum, series) => {\n return sum + series.data.reduce((sSum, p) => sSum + p.y, 0);\n }, 0);\n return this._fullNormalizedData.map((series) => {\n const seriesSum = series.data.reduce((sum, p) => sum + p.y, 0);\n const percentage = totalSum > 0 ? (seriesSum / totalSum) * 100 : 0;\n return {\n id: series.id || series.label || `series-${series.originalIndex}`,\n name: series.label || `Series ${series.originalIndex + 1}`,\n value: seriesSum,\n color: series.lineColor || getChartColor(series.originalIndex, this.chartColors),\n hidden: this.hiddenSeries.has(series.id || series.label || `series-${series.originalIndex}`),\n percentage: parseFloat(percentage.toFixed(2)),\n };\n });\n }\n highlightSegment(id) {\n if (!this.svg)\n return;\n const allSeriesGroups = this.svg.selectAll('g.ax-line-chart-series');\n const allPointsGroups = this.svg.selectAll('g.ax-line-chart-points');\n if (id === null) {\n allSeriesGroups.classed('ax-chart-dimmed', false).style('opacity', 1);\n allPointsGroups.classed('ax-chart-dimmed', false).style('opacity', 1);\n allSeriesGroups\n .selectAll('.ax-line-chart-line')\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? 2)\n .classed('ax-chart-highlighted-path', false);\n allPointsGroups\n .selectAll('circle.ax-line-chart-point')\n .attr('r', this.effectiveOptions().pointRadius ?? 4)\n .classed('ax-chart-highlighted-point', false);\n return;\n }\n allSeriesGroups.classed('ax-chart-dimmed', true).style('opacity', 0.3);\n allPointsGroups.classed('ax-chart-dimmed', true).style('opacity', 0.3);\n const targetSeriesGroup = this.svg.selectAll(`g.ax-line-chart-series[data-series-identifier=\"${id}\"]`);\n const targetPointsGroup = this.svg.selectAll(`g.ax-line-chart-points[data-series-identifier=\"${id}\"]`);\n targetSeriesGroup.classed('ax-chart-dimmed', false).style('opacity', 1);\n targetPointsGroup.classed('ax-chart-dimmed', false).style('opacity', 1);\n targetSeriesGroup\n .selectAll('.ax-line-chart-line')\n .attr('stroke-width', (this.effectiveOptions().lineWidth ?? 2) * 1.5)\n .classed('ax-chart-highlighted-path', true);\n targetPointsGroup\n .selectAll('circle.ax-line-chart-point')\n .attr('r', (this.effectiveOptions().pointRadius ?? 4) * 1.5)\n .classed('ax-chart-highlighted-point', true);\n }\n toggleSegment(id) {\n const seriesId = id;\n if (this.hiddenSeries.has(seriesId)) {\n this.hiddenSeries.delete(seriesId);\n }\n else {\n this.hiddenSeries.add(seriesId);\n }\n this.updateChart();\n return !this.hiddenSeries.has(seriesId);\n }\n async loadD3() {\n try {\n this.d3 = await import('d3');\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n }\n catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n createChart() {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement)\n return;\n const containerElement = this.chartContainerEl().nativeElement;\n const allSeriesData = this._fullNormalizedData;\n // Clear previous SVG and any empty-state messages (preserve tooltip component)\n this.d3\n .select(containerElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n if (allSeriesData.length === 0 || allSeriesData.every((series) => !series.data || series.data.length === 0)) {\n this.showNoDataMessage(containerElement);\n return;\n }\n const visibleDataForRendering = allSeriesData.filter((series) => !this.hiddenSeries.has(series.id || series.label || `series-${series.originalIndex}`));\n if (visibleDataForRendering.length === 0) {\n // All data is present, but all series are hidden by the legend\n this.showAllSeriesHiddenMessage(containerElement);\n // Still setup basic SVG and chart group for consistency if needed, or return\n // For now, we will show the message and return, as scales/axes can't be drawn.\n return;\n }\n // Scales should be based on potentially visible data to avoid errors with empty domains\n // If all are hidden, scales might become an issue. Let's use all data for scales,\n // and rendering will handle visibility.\n const dataForScales = allSeriesData.flatMap((s) => s.data).length > 0 ? allSeriesData : [{ data: [{ x: 0, y: 0 }] }];\n const chartOptions = this.effectiveOptions();\n this.setupDimensions(containerElement, chartOptions);\n // Use allSeriesData for domain calculation to keep scales consistent even if some series are hidden\n // but filter out series with no data points for scale calculation.\n const dataForScaleSetup = allSeriesData.filter((s) => s.data && s.data.length > 0);\n if (dataForScaleSetup.length === 0) {\n // If after filtering, there's no data with points (e.g. all series have empty data arrays)\n this.showNoDataMessage(containerElement);\n return;\n }\n this.setupScales(dataForScaleSetup);\n this.createAxes(chartOptions);\n this.renderLines(allSeriesData); // RenderLines will handle hiding based on hiddenSeries\n }\n updateChart() {\n this.createChart();\n }\n cleanupChart() {\n if (this.svg) {\n this.d3?.select(this.chartContainerEl()?.nativeElement).selectAll('svg').remove();\n this.svg = null;\n this.chart = null;\n }\n this._tooltipVisible.set(false);\n }\n setupDimensions(containerElement, options) {\n this.calculateMargins(options, containerElement.clientWidth);\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n const minDim = Math.min(200, containerWidth, containerHeight);\n if (options.width && options.height) {\n this.width = options.width - this.margin.left - this.margin.right;\n this.height = options.height - this.margin.top - this.margin.bottom;\n }\n else {\n this.width = Math.max(containerWidth, minDim) - this.margin.left - this.margin.right;\n this.height = Math.max(containerHeight, minDim) - this.margin.top - this.margin.bottom;\n }\n this.width = Math.max(this.width, 100);\n this.height = Math.max(this.height, 100);\n const totalWidth = this.width + this.margin.left + this.margin.right;\n const totalHeight = this.height + this.margin.top + this.margin.bottom;\n const svg = this.d3\n .select(containerElement)\n .append('svg')\n .attr('width', totalWidth)\n .attr('height', totalHeight)\n .attr('viewBox', `0 0 ${totalWidth} ${totalHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet')\n .attr('style', `\n width: ${totalWidth}px;\n height: ${totalHeight}px;\n max-width: 100%;\n max-height: 100%;\n overflow: visible;\n `);\n this.svg = svg;\n this.chart = this.svg.append('g').attr('transform', `translate(${this.margin.left},${this.margin.top})`);\n }\n calculateMargins(options, containerWidth) {\n this.margin = {\n top: options.margins?.top ?? 20,\n right: options.margins?.right ?? 25,\n bottom: options.margins?.bottom ?? 40,\n left: options.margins?.left ?? 50,\n };\n const allDataPoints = this._fullNormalizedData.flatMap((series) => series.data);\n if (allDataPoints.length > 0) {\n const allNumericX = allDataPoints.every((d) => typeof d.x === 'number');\n if (!allNumericX) {\n const visibleSeries = this._fullNormalizedData.filter((s) => !this.hiddenSeries.has(s.id || s.label || `series-${s.originalIndex}`));\n const allXValues = new Set(visibleSeries.flatMap((series) => series.data.map((d) => String(d.x))));\n const labelCount = allXValues.size;\n if (labelCount > 0 && containerWidth > 0) {\n const workingWidth = containerWidth - this.margin.left - this.margin.right;\n if (workingWidth > 0) {\n const availableWidthPerLabel = workingWidth / labelCount;\n const labels = Array.from(allXValues);\n const longestLabel = labels.reduce((a, b) => (a.length > b.length ? a : b), '');\n const estimatedFontSize = Math.max(11, Math.min(15, Math.round(workingWidth / 45)));\n const estimatedLongestLabelWidth = longestLabel.length * estimatedFontSize * 0.6;\n if (estimatedLongestLabelWidth > availableWidthPerLabel) {\n const requiredExtraMargin = estimatedLongestLabelWidth * Math.sin(Math.PI / 4) + 10;\n this.margin.bottom += Math.min(60, requiredExtraMargin);\n }\n }\n }\n }\n }\n if (options.xAxisLabel) {\n const xLabelLength = options.xAxisLabel.length;\n const extraBottomMargin = Math.min(20, Math.max(10, xLabelLength * 0.8));\n this.margin.bottom = Math.max(this.margin.bottom, 40 + extraBottomMargin);\n }\n if (options.yAxisLabel) {\n const yLabelLength = options.yAxisLabel.length;\n const extraLeftMargin = Math.min(20, Math.max(10, yLabelLength * 0.8));\n this.margin.left = Math.max(this.margin.left, 50 + extraLeftMargin);\n }\n if (options.showXAxis !== false) {\n this.margin.bottom = Math.max(this.margin.bottom, 45);\n }\n if (options.showYAxis !== false) {\n this.margin.left = Math.max(this.margin.left, 55);\n }\n }\n setupScales(data) {\n // Expects already filtered data for scales\n const chartOptions = this.effectiveOptions();\n const padding = chartOptions.axisPadding ?? 0;\n const paddingMultiplier = padding / 100;\n // Ensure data is not empty for scale domain calculation\n const allDataPoints = data.length > 0 ? data.flatMap((series) => series.data) : [{ x: 0, y: 0 }];\n if (allDataPoints.length === 0) {\n // Should ideally not happen if createChart filters correctly\n allDataPoints.push({ x: 0, y: 0 }); // Default fallback to prevent crash with empty domain\n }\n const allNumericX = allDataPoints.every((d) => typeof d.x === 'number');\n if (allNumericX) {\n const xMin = this.d3.min(allDataPoints, (d) => d.x) ?? 0;\n const xMax = this.d3.max(allDataPoints, (d) => d.x) ?? 0;\n if (xMin === xMax) {\n this.xScale = this.d3\n .scaleLinear()\n .domain([xMin - 1, xMax + 1])\n .range([0, this.width]);\n }\n else {\n this.xScale = this.d3.scaleLinear().domain([xMin, xMax]).range([0, this.width]);\n }\n }\n else {\n this.xScale = this.d3\n .scaleBand()\n .domain(allDataPoints.map((d) => String(d.x)))\n .range([0, this.width])\n .paddingInner(0.2)\n .paddingOuter(0);\n }\n const yAxisStartsAtZero = chartOptions.yAxisStartsAtZero !== false;\n let yMin = this.d3.min(allDataPoints, (d) => d.y) ?? 0;\n if (yAxisStartsAtZero) {\n yMin = Math.min(0, yMin);\n }\n const yMax = this.d3.max(allDataPoints, (d) => d.y) ?? 0;\n const yRange = yMax - yMin;\n this.yScale = this.d3\n .scaleLinear()\n .domain([yMin, yMax + yRange * paddingMultiplier])\n .nice()\n .range([this.height, 0]);\n }\n createAxes(options) {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n const isBandScale = this.xScale.bandwidth !== undefined;\n const isRtl = this.platform.isRtl();\n const axesGroup = this.chart.append('g').attr('class', 'ax-line-chart-axes');\n if (showXAxis) {\n this.xAxis = axesGroup\n .append('g')\n .attr('class', 'ax-line-chart-axis-x')\n .attr('transform', `translate(0,${this.height})`)\n .call(this.d3.axisBottom(this.xScale).tickSize(5).tickPadding(8));\n // Style the x-axis path and lines\n this.xAxis.selectAll('path').attr('stroke', 'rgba(var(--ax-comp-line-chart-axis-color), 0.2)');\n this.xAxis\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.2)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n const dynamicXAxisTickFontSize = Math.max(11, Math.min(15, Math.round(this.width / 45)));\n const xAxisTicks = this.xAxis\n .selectAll('text')\n .style('font-size', `${dynamicXAxisTickFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-line-chart-labels-color), 0.7)');\n // Automatically rotate labels if they are likely to overlap\n if (isBandScale && this.xScale.domain().length > 0) {\n const step = this.xScale.step();\n const longestLabel = this.xScale.domain().reduce((a, b) => (a.length > b.length ? a : b), '');\n // Using 0.6 as a better estimate for char width-to-height ratio\n const estimatedLongestLabelWidth = longestLabel.length * dynamicXAxisTickFontSize * 0.6;\n if (estimatedLongestLabelWidth > step) {\n xAxisTicks\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end')\n .attr('dx', '-0.8em')\n .attr('dy', '0.15em');\n }\n }\n if (options.xAxisLabel) {\n const labelY = this.height + this.margin.bottom * 0.7;\n axesGroup\n .append('text')\n .attr('class', 'ax-line-chart-axis-label ax-x-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('x', this.width / 2)\n .attr('y', labelY)\n .attr('transform', 'translate(0, 5)')\n .attr('style', `\n font-size: 14px;\n font-weight: 500;\n fill: rgb(var(--ax-comp-line-chart-text-color));\n pointer-events: none;\n `)\n .text(options.xAxisLabel);\n }\n }\n if (showYAxis) {\n this.yAxis = axesGroup\n .append('g')\n .attr('class', 'ax-line-chart-axis-y')\n .call(this.d3.axisLeft(this.yScale).tickSize(5).tickPadding(8));\n // Style the y-axis path and lines\n this.yAxis.selectAll('path').attr('stroke', 'rgba(var(--ax-comp-line-chart-axis-color), 0.2)');\n this.yAxis\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.2)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n const dynamicYAxisTickFontSize = Math.max(11, Math.min(15, Math.round(this.height / 30)));\n const yTickTexts = this.yAxis.selectAll('text').attr('style', `\n font-size: ${dynamicYAxisTickFontSize}px;\n font-weight: 400;\n fill: rgba(var(--ax-comp-line-chart-labels-color), 0.7);\n `);\n if (isRtl) {\n yTickTexts.attr('text-anchor', 'start');\n }\n if (options.yAxisLabel) {\n const labelX = -this.height / 2;\n const labelY = -this.margin.left * 0.8;\n axesGroup\n .append('text')\n .attr('class', 'ax-line-chart-axis-label ax-y-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('transform', 'rotate(-90) translate(-5, 0)')\n .attr('x', labelX)\n .attr('y', labelY)\n .attr('style', `\n font-size: 14px;\n font-weight: 500;\n fill: rgb(var(--ax-comp-line-chart-text-color));\n pointer-events: none;\n `)\n .text(options.yAxisLabel);\n }\n }\n if (showGrid) {\n const gridGroup = this.chart\n .append('g')\n .attr('class', 'ax-line-chart-grid-container')\n .attr('pointer-events', 'none');\n const yGrid = gridGroup\n .append('g')\n .attr('class', 'ax-line-chart-grid')\n .call(this.d3\n .axisLeft(this.yScale)\n .tickSize(-this.width)\n .tickFormat(() => '')\n .tickValues(this.yScale.ticks()));\n // Style the grid path and lines\n yGrid.selectAll('path').attr('stroke-width', '0');\n yGrid\n .selectAll('.tick')\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.2)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n if (options.showVerticalGrid) {\n const xGrid = gridGroup\n .append('g')\n .attr('class', 'ax-line-chart-grid-vertical')\n .attr('transform', `translate(0,${this.height})`)\n .call(this.d3\n .axisBottom(this.xScale)\n .tickSize(-this.height)\n .tickFormat(() => '')\n .tickValues(isBandScale ? undefined : this.xScale.ticks()));\n // Style the vertical grid path and lines\n xGrid.selectAll('path').attr('stroke-width', '0');\n xGrid\n .selectAll('.tick')\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.15)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n }\n }\n }\n renderLines(allSeriesData) {\n const isBandScale = this.xScale.bandwidth !== undefined;\n const getX = (d) => {\n if (isBandScale) {\n return this.xScale(String(d.x)) + this.xScale.bandwidth() / 2;\n }\n else {\n return this.xScale(d.x);\n }\n };\n const lineGenerator = this.d3\n .line()\n .x(getX)\n .y((d) => this.yScale(d.y));\n if (this.effectiveOptions().smoothLine !== false) {\n lineGenerator.curve(this.d3.curveMonotoneX);\n }\n const areaGenerator = this.d3\n .area()\n .x(getX)\n .y0(this.height)\n .y1((d) => this.yScale(d.y));\n if (this.effectiveOptions().smoothLine !== false) {\n areaGenerator.curve(this.d3.curveMonotoneX);\n }\n this.svg.attr('class', 'ax-line-chart-animating');\n const allSeriesGroup = this.chart\n .append('g')\n .attr('class', 'ax-line-chart-all-series')\n .attr('pointer-events', 'none');\n const allPointsGroup = this.chart\n .append('g')\n .attr('class', 'ax-line-chart-all-points')\n .attr('pointer-events', 'none');\n if (this.effectiveOptions().showCrosshair === true) {\n this.chart.append('g').attr('class', 'ax-line-chart-crosshair').attr('pointer-events', 'none');\n }\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = this.getEasingFunction(this.effectiveOptions().animationEasing);\n allSeriesData.forEach((series) => {\n const seriesIdentifier = series.id || series.label || `series-${series.originalIndex}`;\n if (this.hiddenSeries.has(seriesIdentifier)) {\n this.chart.selectAll(`.ax-line-chart-series[data-series-identifier=\"${seriesIdentifier}\"]`).remove();\n this.chart.selectAll(`.ax-line-chart-points[data-series-identifier=\"${seriesIdentifier}\"]`).remove();\n return;\n }\n if (!series.data || series.data.length === 0)\n return;\n const seriesGroup = allSeriesGroup\n .append('g')\n .attr('class', `ax-line-chart-series ax-line-chart-series-${series.originalIndex}`)\n .attr('data-series-identifier', seriesIdentifier)\n .attr('pointer-events', 'none');\n const lineColor = series.lineColor || getChartColor(series.originalIndex, this.chartColors);\n const fillColor = series.fillColor || lineColor;\n const line = seriesGroup\n .append('path')\n .datum(series.data)\n .attr('class', 'ax-line-chart-line')\n .attr('stroke', lineColor)\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? 2)\n .attr('stroke-linejoin', 'round')\n .attr('stroke-linecap', 'round')\n .attr('d', lineGenerator)\n .attr('fill', 'none')\n .attr('style', 'transition: stroke-width 0.3s ease;')\n .attr('pointer-events', 'none');\n line\n .on('mouseenter', () => {\n line\n .transition()\n .duration(150)\n .attr('stroke-width', (this.effectiveOptions().lineWidth ?? 2) * 1.5);\n })\n .on('mouseleave', () => {\n line\n .transition()\n .duration(150)\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? 2);\n });\n const totalLength = line.node().getTotalLength();\n line\n .attr('stroke-dasharray', totalLength + ' ' + totalLength)\n .attr('stroke-dashoffset', totalLength)\n .transition()\n .duration(animationDuration)\n .ease(animationEasing)\n .attr('stroke-dashoffset', 0)\n .on('end', function () {\n line.attr('pointer-events', 'all');\n });\n if (this.effectiveOptions().fillArea) {\n const area = seriesGroup\n .append('path')\n .datum(series.data)\n .attr('class', 'ax-line-chart-area')\n .attr('fill', fillColor)\n .attr('opacity', 0)\n .attr('d', areaGenerator)\n .attr('style', 'transition: opacity 0.3s ease;')\n .attr('pointer-events', 'none');\n area\n .on('mouseenter', () => {\n area\n .transition()\n .duration(150)\n .attr('opacity', ((this.effectiveOptions().fillOpacity ?? 20) / 100) * 1.5);\n })\n .on('mouseleave', () => {\n area\n .transition()\n .duration(150)\n .attr('opacity', (this.effectiveOptions().fillOpacity ?? 20) / 100);\n });\n area\n .transition()\n .duration(animationDuration)\n .ease(animationEasing)\n .attr('opacity', (this.effectiveOptions().fillOpacity ?? 20) / 100)\n .on('end', function () {\n area.attr('pointer-events', 'all');\n });\n }\n });\n if (this.effectiveOptions().showPoints !== false) {\n const pointMap = new Map();\n allSeriesData.forEach((series) => {\n const seriesIdentifier = series.id || series.label || `series-${series.originalIndex}`;\n if (this.hiddenSeries.has(seriesIdentifier) || !series.data || series.data.length === 0) {\n return;\n }\n const lineColor = series.lineColor || getChartColor(series.originalIndex, this.chartColors);\n const maxPoints = 100;\n const pointData = series.data.length > maxPoints ? this.getReducedDataPoints(series.data, maxPoints) : series.data;\n pointData.forEach((point) => {\n const x = getX(point);\n const y = this.yScale(point.y);\n const key = `${Math.round(x * 10) / 10},${Math.round(y * 10) / 10}`;\n if (!pointMap.has(key)) {\n pointMap.set(key, []);\n }\n pointMap.get(key)?.push({ point, series, originalIndex: series.originalIndex });\n });\n });\n let animationCounter = 0;\n const totalVisibleSeriesCount = allSeriesData.filter((s) => !this.hiddenSeries.has(s.id || s.label || `series-${s.originalIndex}`) && s.data && s.data.length > 0).length;\n allSeriesData.forEach((series) => {\n const seriesIdentifier = series.id || series.label || `series-${series.originalIndex}`;\n if (this.hiddenSeries.has(seriesIdentifier) || !series.data || series.data.length === 0) {\n return;\n }\n const lineColor = series.lineColor || getChartColor(series.originalIndex, this.chartColors);\n const pointsGroup = allPointsGroup\n .append('g')\n .attr('class', `ax-line-chart-points ax-line-chart-points-${series.originalIndex}`)\n .attr('data-series-identifier', seriesIdentifier)\n .attr('pointer-events', 'none');\n pointsGroup\n .on('mouseenter', () => this.handlePointGroupEnter(series.originalIndex, lineColor))\n .on('mouseleave', () => this.handlePointGroupLeave());\n const maxPoints = 100;\n const pointData = series.data.length > maxPoints ? this.getReducedDataPoints(series.data, maxPoints) : series.data;\n pointsGroup\n .selectAll('circle')\n .data(pointData)\n .enter()\n .append('circle')\n .attr('class', 'ax-line-chart-point')\n .attr('cx', getX)\n .attr('cy', (d) => this.yScale(d.y))\n .attr('r', 0)\n .attr('fill', lineColor)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1)\n .attr('data-x', (d) => d.x)\n .attr('data-y', (d) => d.y)\n .style('cursor', 'pointer')\n .attr('pointer-events', 'none')\n .on('mouseenter', (event, d) => {\n const x = getX(d);\n const y = this.yScale(d.y);\n const key = `${Math.round(x * 10) / 10},${Math.round(y * 10) / 10}`;\n const overlappingPoints = pointMap.get(key) || [];\n if (overlappingPoints.length > 1) {\n this.handleOverlappingPointsHover(event, overlappingPoints);\n }\n else {\n this.handlePointHover(event, d, series, series.originalIndex);\n }\n this.d3\n .select(event.target)\n .transition()\n .duration(150)\n .attr('r', (this.effectiveOptions().pointRadius ?? 4) * 1.5)\n .attr('stroke-width', 2)\n .attr('stroke', `rgb(var(--ax-comp-line-chart-bg-color))`);\n })\n .on('mousemove', (event) => this.updateTooltipPosition(event))\n .on('mouseleave', (event) => {\n this._tooltipVisible.set(false);\n this.d3\n .select(event.target)\n .transition()\n .duration(150)\n .attr('r', this.effectiveOptions().pointRadius ?? 4)\n .attr('stroke-width', 1)\n .attr('stroke', '#fff');\n })\n .on('click', (event, d) => {\n const x = getX(d);\n const y = this.yScale(d.y);\n const key = `${Math.round(x * 10) / 10},${Math.round(y * 10) / 10}`;\n const overlappingPoints = pointMap.get(key) || [];\n if (overlappingPoints.length > 1) {\n overlappingPoints.forEach(({ point, series }) => {\n this.handlePointClick(event, point, series);\n });\n }\n else {\n this.handlePointClick(event, d, series);\n }\n })\n .transition()\n .delay((d, i) => i * Math.min(50, (animationDuration || 0) * 0.05) + (animationDuration || 0) * 0.5)\n .duration((animationDuration || 0) * 0.3)\n .ease(animationEasing)\n .attr('r', this.effectiveOptions().pointRadius ?? 4)\n .on('end', (d, i, nodes) => {\n if (i === nodes.length - 1) {\n animationCounter++;\n if (animationCounter >= totalVisibleSeriesCount) {\n this.enablePointerEventsAfterAnimation();\n }\n }\n });\n });\n }\n else {\n setTimeout(() => {\n this.enablePointerEventsAfterAnimation();\n }, animationDuration || 0 + 100);\n }\n }\n enablePointerEventsAfterAnimation() {\n if (!this.chart || !this.svg)\n return;\n this.chart.selectAll('.ax-line-chart-all-series').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-series').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-line').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-area').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-all-points').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-points').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-point').attr('pointer-events', 'all');\n this.svg.classed('ax-line-chart-animating', false);\n }\n handlePointGroupEnter(originalIndex, color) {\n this.chart\n .select(`.ax-line-chart-series-${originalIndex} .ax-line-chart-line`)\n .transition()\n .duration(150)\n .attr('stroke-width', (this.effectiveOptions().lineWidth ?? 2) * 1.5);\n }\n handlePointGroupLeave() {\n this.chart\n .selectAll('.ax-line-chart-line')\n .transition()\n .duration(150)\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? 2);\n if (this.effectiveOptions().showCrosshair === true) {\n this.chart.select('.ax-line-chart-crosshair').selectAll('*').remove();\n }\n }\n getReducedDataPoints(data, maxPoints) {\n if (data.length <= maxPoints)\n return data;\n const result = [];\n const step = Math.ceil(data.length / maxPoints);\n for (let i = 0; i < data.length; i += step) {\n result.push(data[i]);\n }\n if (result[result.length - 1] !== data[data.length - 1]) {\n result.push(data[data.length - 1]);\n }\n return result;\n }\n handlePointHover(event, dataPoint, series, originalIndex) {\n if (this.effectiveOptions().showTooltip !== false) {\n const color = series.lineColor || getChartColor(originalIndex, this.chartColors);\n this._tooltipData.set({\n title: dataPoint.tooltipLabel || series.tooltipLabel || series.label || `Series ${originalIndex + 1}`,\n value: dataPoint.y.toString(),\n color: color,\n });\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n if (this.effectiveOptions().showCrosshair === true) {\n this.showCrosshairLines(dataPoint);\n }\n }\n }\n showCrosshairLines(dataPoint) {\n const isBandScale = this.xScale.bandwidth !== undefined;\n let x;\n if (isBandScale) {\n x = this.xScale(String(dataPoint.x)) + this.xScale.bandwidth() / 2;\n }\n else {\n x = this.xScale(dataPoint.x);\n }\n const y = this.yScale(dataPoint.y);\n let crosshairGroup = this.chart.select('.ax-line-chart-crosshair');\n if (crosshairGroup.empty()) {\n crosshairGroup = this.chart.append('g').attr('class', 'ax-line-chart-crosshair').attr('pointer-events', 'none');\n }\n crosshairGroup.selectAll('*').remove();\n crosshairGroup\n .append('line')\n .attr('class', 'ax-line-chart-crosshair-vertical')\n .attr('x1', x)\n .attr('y1', 0)\n .attr('x2', x)\n .attr('y2', this.height)\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.5)')\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '3,3')\n .attr('opacity', 0.7)\n .attr('pointer-events', 'none');\n crosshairGroup\n .append('line')\n .attr('class', 'ax-line-chart-crosshair-horizontal')\n .attr('x1', 0)\n .attr('y1', y)\n .attr('x2', this.width)\n .attr('y2', y)\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.5)')\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '3,3')\n .attr('opacity', 0.7)\n .attr('pointer-events', 'none');\n }\n updateTooltipPosition(event) {\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl)\n return;\n const rect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = computeTooltipPosition(rect, tooltipRect, event.clientX, event.clientY, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n }\n // computeTooltipPosition moved to shared chart utils\n handlePointClick(event, dataPoint, series) {\n this.pointClick.emit({\n series: series, // series still refers to the full series data with originalIndex\n point: dataPoint,\n event: {\n nativeEvent: event,\n sender: this,\n },\n });\n }\n showNoDataMessage(containerElement) {\n // Remove only chart SVG and previous empty-state messages to avoid removing tooltip\n this.d3\n .select(containerElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n const messageContainer = this.d3\n .select(containerElement)\n .append('div')\n .attr('class', 'ax-line-chart-no-data-message')\n .style('position', 'absolute')\n .style('left', '50%')\n .style('top', '50%')\n .style('transform', 'translate(-50%, -50%)');\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-no-data-icon')\n .style('opacity', '0.6')\n .style('margin-bottom', '0.75rem')\n .html(`<i class=\"${this.effectiveMessages().noDataIcon} fa-2x\"></i>`);\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-no-data-text')\n .style('font-size', '1rem')\n .style('font-weight', '600')\n .style('margin-bottom', '0.5rem')\n .text(this.effectiveMessages().noData);\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-no-data-help')\n .style('font-size', '0.8rem')\n .style('opacity', '0.6')\n .text(this.effectiveMessages().noDataHelp);\n }\n showAllSeriesHiddenMessage(containerElement) {\n // Remove only chart SVG and previous empty-state messages to avoid removing tooltip\n this.d3\n .select(containerElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n const messageContainer = this.d3\n .select(containerElement)\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-message') // Different class\n .style('position', 'absolute')\n .style('left', '50%')\n .style('top', '50%')\n .style('transform', 'translate(-50%, -50%)');\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-icon')\n .style('opacity', '0.6')\n .style('margin-bottom', '0.75rem')\n .html(`<i class=\"${this.effectiveMessages().allHiddenIcon} fa-2x\"></i>`); // Different icon\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-text')\n .style('font-size', '1rem')\n .style('font-weight', '600')\n .style('margin-bottom', '0.5rem')\n .text(this.effectiveMessages().allHidden);\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-help')\n .style('font-size', '0.8rem')\n .style('opacity', '0.6')\n .text(this.effectiveMessages().allHiddenHelp);\n }\n handleOverlappingPointsHover(event, overlappingPoints) {\n if (this.effectiveOptions().showTooltip === false)\n return;\n const tooltipData = {\n title: overlappingPoints.map(({ series }) => series.label),\n value: overlappingPoints[0].point.y.toString(),\n color: overlappingPoints.map(({ series }) => series.lineColor || getChartColor(series.originalIndex, this.chartColors)),\n };\n this._tooltipData.set(tooltipData);\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n if (this.effectiveOptions().showCrosshair === true && overlappingPoints.length > 0) {\n this.showCrosshairLines(overlappingPoints[0].point);\n }\n }\n getEasingFunction(easing) {\n switch (easing) {\n case 'linear':\n return this.d3.easeLinear;\n case 'ease':\n return this.d3.easePolyInOut;\n case 'ease-in':\n return this.d3.easePolyIn;\n case 'ease-out':\n return this.d3.easePolyOut;\n case 'ease-in-out':\n return this.d3.easePolyInOut;\n case 'cubic':\n return this.d3.easeCubic;\n case 'cubic-in':\n return this.d3.easeCubicIn;\n case 'cubic-out':\n return this.d3.easeCubicOut;\n case 'cubic-in-out':\n return this.d3.easeCubicInOut;\n default:\n return this.d3.easeCubicOut;\n }\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXLineChartComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.3\", type: AXLineChartComponent, isStandalone: true, selector: \"ax-line-chart\", inputs: { data: { classPropertyName: \"data\", publicName: \"data\", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: \"options\", publicName: \"options\", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pointClick: \"pointClick\" }, viewQueries: [{ propertyName: \"chartContainerEl\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-line-chart\\\" #chartContainer>\\n <!-- Shared tooltip component -->\\n <ax-chart-tooltip\\n [visible]=\\\"tooltipVisible()\\\"\\n [position]=\\\"tooltipPosition()\\\"\\n [data]=\\\"tooltipData()\\\"\\n [showPercentage]=\\\"false\\\"\\n ></ax-chart-tooltip>\\n</div>\\n\", styles: [\"ax-line-chart{display:block;width:100%;height:100%;min-height:200px;--ax-comp-line-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-axis-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-bg-color: 0, 0, 0, 0;--ax-comp-line-chart-text-color: var(--ax-sys-color-on-lightest-surface)}ax-line-chart .ax-line-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;overflow:hidden;color:rgba(var(--ax-comp-line-chart-text-color));background-color:rgb(var(--ax-comp-line-chart-bg-color))}ax-line-chart .ax-line-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}ax-line-chart .ax-line-chart svg g:has(text){font-family:inherit}ax-line-chart .ax-line-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-line-chart-bg-color));padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-help{font-size:.8rem;opacity:.6}\\n\"], dependencies: [{ kind: \"component\", type: AXChartTooltipComponent, selector: \"ax-chart-tooltip\", inputs: [\"data\", \"position\", \"visible\", \"showPercentage\", \"style\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXLineChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-line-chart', standalone: true, encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-line-chart\\\" #chartContainer>\\n <!-- Shared tooltip component -->\\n <ax-chart-tooltip\\n [visible]=\\\"tooltipVisible()\\\"\\n [position]=\\\"tooltipPosition()\\\"\\n [data]=\\\"tooltipData()\\\"\\n [showPercentage]=\\\"false\\\"\\n ></ax-chart-tooltip>\\n</div>\\n\", styles: [\"ax-line-chart{display:block;width:100%;height:100%;min-height:200px;--ax-comp-line-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-axis-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-bg-color: 0, 0, 0, 0;--ax-comp-line-chart-text-color: var(--ax-sys-color-on-lightest-surface)}ax-line-chart .ax-line-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;overflow:hidden;color:rgba(var(--ax-comp-line-chart-text-color));background-color:rgb(var(--ax-comp-line-chart-bg-color))}ax-line-chart .ax-line-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}ax-line-chart .ax-line-chart svg g:has(text){font-family:inherit}ax-line-chart .ax-line-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-line-chart-bg-color));padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-help{font-size:.8rem;opacity:.6}\\n\"] }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1jaGFydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvbGluZS1jaGFydC9zcmMvbGliL2xpbmUtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2xpbmUtY2hhcnQvc3JjL2xpYi9saW5lLWNoYXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsc0JBQXNCLEVBQXdCLHNCQUFzQixFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJILE9BQU8sRUFBRSx1QkFBdUIsRUFBc0IsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFbkQsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFFTixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFHM0Q7O0dBRUc7QUFVSCxNQUFNLE9BQU8sb0JBQ1gsU0FBUSxXQUFXO0lBR25CLElBQUksR0FBRyxLQUFLLENBQW1CLEVBQUUsZ0RBQUMsQ0FBQztJQUNuQyxPQUFPLEdBQUcsS0FBSyxDQUFvQixFQUFFLG1EQUFDLENBQUM7SUFDdkMsVUFBVSxHQUFHLE1BQU0sRUFBOEIsQ0FBQztJQUVqQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUE2QixnQkFBZ0IsQ0FBQyxDQUFDO0lBQzNGLEVBQUUsQ0FBdUI7SUFFM0IsR0FBRyxDQUFPO0lBQ1YsS0FBSyxD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LElBQUksaUJBQ0QsaUJBQWlCLENBQUMsSUFBSSxXQUM1QixDQUFDLHVCQUF1QixDQUFDLG1CQUNqQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTlhDb21wb25lbnQgfSBmcm9tICdAYWNvcmV4L2Nkay9jb21tb24nO1xuaW1wb3J0IHsgQVhfQ0hBUlRfQ09MT1JfUEFMRVRURSwgQVhDaGFydENvbXBvbmVudEJhc2UsIGNvbXB1dGVUb29sdGlwUG9zaXRpb24sIGdldENoYXJ0Q29sb3IgfSBmcm9tICdAYWNvcmV4L2NoYXJ0cyc7XG5pbXBvcnQgeyBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZSwgQVhDaGFydExlZ2VuZEl0ZW0gfSBmcm9tICdAYWNvcmV4L2NoYXJ0cy9jaGFydC1sZWdlbmQnO1xuaW1wb3J0IHsgQVhDaGFydFRvb2x0aXBDb21wb25lbnQsIEFYQ2hhcnRUb29sdGlwRGF0YSB9IGZyb20gJ0BhY29yZXgvY2hhcnRzL2NoYXJ0LXRvb2x0aXAnO1xuaW1wb3J0IHsgQVhQbGF0Zm9ybSB9IGZyb20gJ0BhY29yZXgvY29yZS9wbGF0Zm9ybSc7XG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIEVsZW1lbnRSZWYsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBWF9MSU5FX0NIQVJUX0NPTkZJRyB9IGZyb20gJy4vbGluZS1jaGFydC5jb25maWcnO1xuaW1wb3J0IHsgQVhMaW5lQ2hhcnREYXRhLCBBWExpbmVDaGFydE9wdGlvbiwgQVhMaW5lQ2hhcnRQb2ludENsaWNrRXZlbnQsIEFYTGluZUNoYXJ0VmFsdWUgfSBmcm9tICcuL2xpbmUtY2hhcnQudHlwZSc7XG5cbi8qKlxuICogTGluZSBDaGFydCBDb21wb25lbnQgZm9yIHJlbmRlcmluZyBkYXRhIGFzIGxpbmVzIHdpdGggaW50ZXJhY3RpdmUgaG92ZXIgZWZmZWN0cyBhbmQgYW5pbWF0aW9uc1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdheC1saW5lLWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xpbmUtY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9saW5lLWNoYXJ0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtBWENoYXJ0VG9vbHRpcENvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBWExpbmVDaGFydENvbXBvbmVudFxuICBleHRlbmRzIE5YQ29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlLCBBWENoYXJ0Q29tcG9uZW50QmFzZVxue1xuICBkYXRhID0gaW5wdXQ8QVhMaW5lQ2hhcnRWYWx1ZT4oW10pO1xuICBvcHRpb25zID0gaW5wdXQ8QVhMaW5lQ2hhcnRPcHRpb24+KHt9KTtcbiAgcG9pbnRDbGljayA9IG91dHB1dDxBWExpbmVDaGFydFBvaW50Q2xpY2tFdmVudD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0Q29udGFpbmVyRWwgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjaGFydENvbnRhaW5lcicpO1xuICBwcm90ZWN0ZWQgZDMhOiB0eXBlb2YgaW1wb3J0KCdkMycpO1xuXG4gIHByaXZhdGUgc3ZnITogYW55O1xuICBwcml2YXRlIGNoYXJ0ITogYW55O1xuICBwcml2YXRlIHhTY2FsZSE6IGFueTtcbiAgcHJpdmF0ZSB5U2NhbGUhOiBhbnk7XG4gIHByaXZhdGUgeEF4aXMhOiBhbnk7XG4gIHByaXZhdGUgeUF4aXMhOiBhbnk7XG5cbiAgcHJpdmF0ZSB3aWR0aCE6IG51bWJlcjtcbiAgcHJpdmF0ZSBoZWlnaHQhOiBudW1iZXI7XG4gIHByaXZhdGUgbWFyZ2luID0geyB0b3A6IDIwLCByaWdodDogMjUsIGJvdHRvbTogNDAsIGxlZnQ6IDUwIH07XG5cbiAgcHJpdmF0ZSBfdG9vbHRpcFZpc2libGUgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF90b29sdGlwUG9zaXRpb24gPSBzaWduYWwoeyB4OiAwLCB5OiAwIH0pO1xuICBwcml2YXRlIF90b29sdGlwRGF0YSA9IHNpZ25hbDxBWENoYXJ0VG9vbHRpcERhdGE+KHtcbiAgICB0aXRsZTogJycsXG4gICAgdmFsdWU6ICcwJyxcbiAgICBwZXJjZW50YWdlOiAnMCUnLFxuICAgIGNvbG9yOiAnJyxcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9yZW5kZXJlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgaGlkZGVuU2VyaWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgX2Z1bGxOb3JtYWxpemVkRGF0YTogKEFYTGluZUNoYXJ0RGF0YSAmIHsgb3JpZ2luYWxJbmRleDogbnVtYmVyIH0pW10gPSBbXTtcblxuICBwcm90ZWN0ZWQgdG9vbHRpcFZpc2libGUgPSB0aGlzLl90b29sdGlwVmlzaWJsZS5hc1JlYWRvbmx5KCk7XG4gIHByb3RlY3RlZCB0b29sdGlwUG9zaXRpb24gPSB0aGlzLl90b29sdGlwUG9zaXRpb24uYXNSZWFkb25seSgpO1xuICBwcm90ZWN0ZWQgdG9vbHRpcERhdGEgPSB0aGlzLl90b29sdGlwRGF0YS5hc1JlYWRvbmx5KCk7XG5cbiAgLy8gSW5qZWN0IGNvbmZpZ3VyYXRpb25cbiAgcHJpdmF0ZSBjb25maWdUb2tlbiA9IGluamVjdChBWF9MSU5FX0NIQVJUX0NPTkZJRyk7XG5cbiAgLy8gSW5qZWN0IHRoZSBjaGFydCBjb2xvcnNcbiAgcHJpdmF0ZSBjaGFydENvbG9ycyA9IGluamVjdChBWF9DSEFSVF9DT0xPUl9QQUxFVFRFKTtcblxuICAvLyBJbmplY3QgQVhQbGF0Zm9ybVxuICBwcml2YXRlIHBsYXRmb3JtID0gaW5qZWN0KEFYUGxhdGZvcm0pO1xuXG4gIHByb3RlY3RlZCBlZmZlY3RpdmVPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmNvbmZpZ1Rva2VuLFxuICAgICAgLi4udGhpcy5vcHRpb25zKCksXG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gTWVzc2FnZXMgd2l0aCBkZWZhdWx0c1xuICBwcm90ZWN0ZWQgZWZmZWN0aXZlTWVzc2FnZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdE1lc3NhZ2VzID0ge1xuICAgICAgbm9EYXRhOiAnTm8gZGF0YSBhdmFpbGFibGUnLFxuICAgICAgbm9EYXRhSGVscDogJ1BsZWFzZSBwcm92aWRlIGRhdGEgdG8gZGlzcGxheSB0aGUgY2hhcnQnLFxuICAgICAgYWxsSGlkZGVuOiAnQWxsIHNlcmllcyBhcmUgaGlkZGVuJyxcbiAgICAgIGFsbEhpZGRlbkhlbHA6ICdDbGljayBsZWdlbmQgaXRlbXMgdG8gc2hvdyBzZXJpZXMgaW4gdGhlIGNoYXJ0JyxcbiAgICAgIG5vRGF0YUljb246ICdmYS1saWdodCBmYS1jaGFydC1saW5lJyxcbiAgICAgIGFsbEhpZGRlbkljb246ICdmYS1saWdodCBmYS1leWUtc2xhc2gnLFxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZmF1bHRNZXNzYWdlcyxcbiAgICAgIC4uLnRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLm1lc3NhZ2VzLFxuICAgIH07XG4gIH0pO1xuXG4gIC8vIFRvb2x0aXAgZ2FwIGluIHBpeGVscyBmb3IgY29uc2lzdGVudCBzcGFjaW5nXG4gIHByaXZhdGUgcmVhZG9ubHkgVE9PTFRJUF9HQVAgPSAxMDtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWREMygpO1xuICB9XG5cbiAgI2VmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgcmF3RGF0YSA9IHRoaXMuZGF0YSgpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJhd0RhdGEpKSB7XG4gICAgICB0aGlzLl9mdWxsTm9ybWFsaXplZERhdGEgPSByYXdEYXRhLm1hcCgocywgaSkgPT4gKHsgLi4ucywgb3JpZ2luYWxJbmRleDogaSB9KSk7XG4gICAgfSBlbHNlIGlmIChyYXdEYXRhICYmICdkYXRhJyBpbiByYXdEYXRhKSB7XG4gICAgICB0aGlzLl9mdWxsTm9ybWFsaXplZERhdGEgPSBbeyAuLi5yYXdEYXRhLCBvcmlnaW5hbEluZGV4OiAwIH1dO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9mdWxsTm9ybWFsaXplZERhdGEgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG5cbiAgICBpZiAodGhpcy5fcmVuZGVyZWQoKSkge1xuICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2luaXRpYWxpemVkLnNldCh0cnVlKTtcbiAgICBpZiAodGhpcy5kMyAmJiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKSkge1xuICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgdGhpcy5fcmVuZGVyZWQuc2V0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cENoYXJ0KCk7XG4gIH1cblxuICAvLyBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZSBJbXBsZW1lbnRhdGlvblxuICBnZXRMZWdlbmRJdGVtcygpOiBBWENoYXJ0TGVnZW5kSXRlbVtdIHtcbiAgICBjb25zdCB0b3RhbFN1bSA9IHRoaXMuX2Z1bGxOb3JtYWxpemVkRGF0YS5yZWR1Y2UoKHN1bSwgc2VyaWVzKSA9PiB7XG4gICAgICByZXR1cm4gc3VtICsgc2VyaWVzLmRhdGEucmVkdWNlKChzU3VtLCBwKSA9PiBzU3VtICsgcC55LCAwKTtcbiAgICB9LCAwKTtcblxuICAgIHJldHVybiB0aGlzLl9mdWxsTm9ybWFsaXplZERhdGEubWFwKChzZXJpZXMpID0+IHtcbiAgICAgIGNvbnN0IHNlcmllc1N1bSA9IHNlcmllcy5kYXRhLnJlZHVjZSgoc3VtLCBwKSA9PiBzdW0gKyBwLnksIDApO1xuICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRvdGFsU3VtID4gMCA/IChzZXJpZXNTdW0gLyB0b3RhbFN1bSkgKiAxMDAgOiAwO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHNlcmllcy5pZCB8fCBzZXJpZXMubGFiZWwgfHwgYHNlcmllcy0ke3Nlcmllcy5vcmlnaW5hbEluZGV4fWAsXG4gICAgICAgIG5hbWU6IHNlcmllcy5sYWJlbCB8fCBgU2VyaWVzICR7c2VyaWVzLm9yaWdpbmFsSW5kZXggKyAxfWAsXG4gICAgICAgIHZhbHVlOiBzZXJpZXNTdW0sXG4gICAgICAgIGNvbG9yOiBzZXJpZXMubGluZUNvbG9yIHx8IGdldENoYXJ0Q29sb3Ioc2VyaWVzLm9yaWdpbmFsSW5kZXgsIHRoaXMuY2hhcnRDb2xvcnMpLFxuICAgICAgICBoaWRkZW46IHRoaXMuaGlkZGVuU2VyaWVzLmhhcyhzZXJpZXMuaWQgfHwgc2VyaWVzLmxhYmVsIHx8IGBzZXJpZXMtJHtzZXJpZXMub3JpZ2luYWxJbmRleH1gKSxcbiAgICAgICAgcGVyY2VudGFnZTogcGFyc2VGbG9hdChwZXJjZW50YWdlLnRvRml4ZWQoMikpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGhpZ2hsaWdodFNlZ21lbnQoaWQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICBjb25zdCBhbGxTZXJpZXNHcm91cHMgPSB0aGlzLnN2Zy5zZWxlY3RBbGwoJ2cuYXgtbGluZS1jaGFydC1zZXJpZXMnKTtcbiAgICBjb25zdCBhbGxQb2ludHNHcm91cHMgPSB0aGlzLnN2Zy5zZWxlY3RBbGwoJ2cuYXgtbGluZS1jaGFydC1wb2ludHMnKTtcblxuICAgIGlmIChpZCA9PT0gbnVsbCkge1xuICAgICAgYWxsU2VyaWVzR3JvdXBzLmNsYXNzZWQoJ2F4LWNoYXJ0LWRpbW1lZCcsIGZhbHNlKS5zdHlsZSgnb3BhY2l0eScsIDEpO1xuICAgICAgYWxsUG9pbnRzR3JvdXBzLmNsYXNzZWQoJ2F4LWNoYXJ0LWRpbW1lZCcsIGZhbHNlKS5zdHlsZSgnb3BhY2l0eScsIDEpO1xuXG4gICAgICBhbGxTZXJpZXNHcm91cHNcbiAgICAgICAgLnNlbGVjdEFsbCgnLmF4LWxpbmUtY2hhcnQtbGluZScpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5saW5lV2lkdGggPz8gMilcbiAgICAgICAgLmNsYXNzZWQoJ2F4LWNoYXJ0LWhpZ2hsaWdodGVkLXBhdGgnLCBmYWxzZSk7XG4gICAgICBhbGxQb2ludHNHcm91cHNcbiAgICAgICAgLnNlbGVjdEFsbCgnY2lyY2xlLmF4LWxpbmUtY2hhcnQtcG9pbnQnKVxuICAgICAgICAuYXR0cigncicsIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnBvaW50UmFkaXVzID8/IDQpXG4gICAgICAgIC5jbGFzc2VkKCdheC1jaGFydC1oaWdobGlnaHRlZC1wb2ludCcsIGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhbGxTZXJpZXNHcm91cHMuY2xhc3NlZCgnYXgtY2hhcnQtZGltbWVkJywgdHJ1ZSkuc3R5bGUoJ29wYWNpdHknLCAwLjMpO1xuICAgIGFsbFBvaW50c0dyb3Vwcy5jbGFzc2VkKCdheC1jaGFydC1kaW1tZWQnLCB0cnVlKS5zdHlsZSgnb3BhY2l0eScsIDAuMyk7XG5cbiAgICBjb25zdCB0YXJnZXRTZXJpZXNHcm91cCA9IHRoaXMuc3ZnLnNlbGVjdEFsbChgZy5heC1saW5lLWNoYXJ0LXNlcmllc1tkYXRhLXNlcmllcy1pZGVudGlmaWVyPVwiJHtpZH1cIl1gKTtcbiAgICBjb25zdCB0YXJnZXRQb2ludHNHcm91cCA9IHRoaXMuc3ZnLnNlbGVjdEFsbChgZy5heC1saW5lLWNoYXJ0LXBvaW50c1tkYXRhLXNlcmllcy1pZGVudGlmaWVyPVwiJHtpZH1cIl1gKTtcblxuICAgIHRhcmdldFNlcmllc0dyb3VwLmNsYXNzZWQoJ2F4LWNoYXJ0LWRpbW1lZCcsIGZhbHNlKS5zdHlsZSgnb3BhY2l0eScsIDEpO1xuICAgIHRhcmdldFBvaW50c0dyb3VwLmNsYXNzZWQoJ2F4LWNoYXJ0LWRpbW1lZCcsIGZhbHNlKS5zdHlsZSgnb3BhY2l0eScsIDEpO1xuXG4gICAgdGFyZ2V0U2VyaWVzR3JvdXBcbiAgICAgIC5zZWxlY3RBbGwoJy5heC1saW5lLWNoYXJ0LWxpbmUnKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5saW5lV2lkdGggPz8gMikgKiAxLjUpXG4gICAgICAuY2xhc3NlZCgnYXgtY2hhcnQtaGlnaGxpZ2h0ZWQtcGF0aCcsIHRydWUpO1xuXG4gICAgdGFyZ2V0UG9pbnRzR3JvdXBcbiAgICAgIC5zZWxlY3RBbGwoJ2NpcmNsZS5heC1saW5lLWNoYXJ0LXBvaW50JylcbiAgICAgIC5hdHRyKCdyJywgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnBvaW50UmFkaXVzID8/IDQpICogMS41KVxuICAgICAgLmNsYXNzZWQoJ2F4LWNoYXJ0LWhpZ2hsaWdodGVkLXBvaW50JywgdHJ1ZSk7XG4gIH1cblxuICB0b2dnbGVTZWdtZW50KGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZXJpZXNJZCA9IGlkO1xuICAgIGlmICh0aGlzLmhpZGRlblNlcmllcy5oYXMoc2VyaWVzSWQpKSB7XG4gICAgICB0aGlzLmhpZGRlblNlcmllcy5kZWxldGUoc2VyaWVzSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhpZGRlblNlcmllcy5hZGQoc2VyaWVzSWQpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gICAgcmV0dXJuICF0aGlzLmhpZGRlblNlcmllcy5oYXMoc2VyaWVzSWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGxvYWREMygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5kMyA9IGF3YWl0IGltcG9ydCgnZDMnKTtcbiAgICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCgpICYmIHRoaXMuY2hhcnRDb250YWluZXJFbCgpKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWQuc2V0KHRydWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBEMy5qczonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNyZWF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kMyB8fCAhdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGFsbFNlcmllc0RhdGEgPSB0aGlzLl9mdWxsTm9ybWFsaXplZERhdGE7XG5cbiAgICAvLyBDbGVhciBwcmV2aW91cyBTVkcgYW5kIGFueSBlbXB0eS1zdGF0ZSBtZXNzYWdlcyAocHJlc2VydmUgdG9vbHRpcCBjb21wb25lbnQpXG4gICAgdGhpcy5kM1xuICAgICAgLnNlbGVjdChjb250YWluZXJFbGVtZW50KVxuICAgICAgLnNlbGVjdEFsbCgnc3ZnLCAuYXgtbGluZS1jaGFydC1uby1kYXRhLW1lc3NhZ2UsIC5heC1saW5lLWNoYXJ0LWFsbC1oaWRkZW4tbWVzc2FnZScpXG4gICAgICAucmVtb3ZlKCk7XG5cbiAgICBpZiAoYWxsU2VyaWVzRGF0YS5sZW5ndGggPT09IDAgfHwgYWxsU2VyaWVzRGF0YS5ldmVyeSgoc2VyaWVzKSA9PiAhc2VyaWVzLmRhdGEgfHwgc2VyaWVzLmRhdGEubGVuZ3RoID09PSAwKSkge1xuICAgICAgdGhpcy5zaG93Tm9EYXRhTWVzc2FnZShjb250YWluZXJFbGVtZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aXNpYmxlRGF0YUZvclJlbmRlcmluZyA9IGFsbFNlcmllc0RhdGEuZmlsdGVyKFxuICAgICAgKHNlcmllcykgPT4gIXRoaXMuaGlkZGVuU2VyaWVzLmhhcyhzZXJpZXMuaWQgfHwgc2VyaWVzLmxhYmVsIHx8IGBzZXJpZXMtJHtzZXJpZXMub3JpZ2luYWxJbmRleH1gKSxcbiAgICApO1xuXG4gICAgaWYgKHZpc2libGVEYXRhRm9yUmVuZGVyaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gQWxsIGRhdGEgaXMgcHJlc2VudCwgYnV0IGFsbCBzZXJpZXMgYXJlIGhpZGRlbiBieSB0aGUgbGVnZW5kXG4gICAgICB0aGlzLnNob3dBbGxTZXJpZXNIaWRkZW5NZXNzYWdlKGNvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgLy8gU3RpbGwgc2V0dXAgYmFzaWMgU1ZHIGFuZCBjaGFydCBncm91cCBmb3IgY29uc2lzdGVuY3kgaWYgbmVlZGVkLCBvciByZXR1cm5cbiAgICAgIC8vIEZvciBub3csIHdlIHdpbGwgc2hvdyB0aGUgbWVzc2FnZSBhbmQgcmV0dXJuLCBhcyBzY2FsZXMvYXhlcyBjYW4ndCBiZSBkcmF3bi5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTY2FsZXMgc2hvdWxkIGJlIGJhc2VkIG9uIHBvdGVudGlhbGx5IHZpc2libGUgZGF0YSB0byBhdm9pZCBlcnJvcnMgd2l0aCBlbXB0eSBkb21haW5zXG4gICAgLy8gSWYgYWxsIGFyZSBoaWRkZW4sIHNjYWxlcyBtaWdodCBiZWNvbWUgYW4gaXNzdWUuIExldCdzIHVzZSBhbGwgZGF0YSBmb3Igc2NhbGVzLFxuICAgIC8vIGFuZCByZW5kZXJpbmcgd2lsbCBoYW5kbGUgdmlzaWJpbGl0eS5cbiAgICBjb25zdCBkYXRhRm9yU2NhbGVzID1cbiAgICAgIGFsbFNlcmllc0RhdGEuZmxhdE1hcCgocykgPT4gcy5kYXRhKS5sZW5ndGggPiAwID8gYWxsU2VyaWVzRGF0YSA6IFt7IGRhdGE6IFt7IHg6IDAsIHk6IDAgfV0gfV07XG5cbiAgICBjb25zdCBjaGFydE9wdGlvbnMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcbiAgICB0aGlzLnNldHVwRGltZW5zaW9ucyhjb250YWluZXJFbGVtZW50LCBjaGFydE9wdGlvbnMpO1xuICAgIC8vIFVzZSBhbGxTZXJpZXNEYXRhIGZvciBkb21haW4gY2FsY3VsYXRpb24gdG8ga2VlcCBzY2FsZXMgY29uc2lzdGVudCBldmVuIGlmIHNvbWUgc2VyaWVzIGFyZSBoaWRkZW5cbiAgICAvLyBidXQgZmlsdGVyIG91dCBzZXJpZXMgd2l0aCBubyBkYXRhIHBvaW50cyBmb3Igc2NhbGUgY2FsY3VsYXRpb24uXG4gICAgY29uc3QgZGF0YUZvclNjYWxlU2V0dXAgPSBhbGxTZXJpZXNEYXRhLmZpbHRlcigocykgPT4gcy5kYXRhICYmIHMuZGF0YS5sZW5ndGggPiAwKTtcbiAgICBpZiAoZGF0YUZvclNjYWxlU2V0dXAubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBJZiBhZnRlciBmaWx0ZXJpbmcsIHRoZXJlJ3Mgbm8gZGF0YSB3aXRoIHBvaW50cyAoZS5nLiBhbGwgc2VyaWVzIGhhdmUgZW1wdHkgZGF0YSBhcnJheXMpXG4gICAgICB0aGlzLnNob3dOb0RhdGFNZXNzYWdlKGNvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldHVwU2NhbGVzKGRhdGFGb3JTY2FsZVNldHVwKTtcbiAgICB0aGlzLmNyZWF0ZUF4ZXMoY2hhcnRPcHRpb25zKTtcbiAgICB0aGlzLnJlbmRlckxpbmVzKGFsbFNlcmllc0RhdGEpOyAvLyBSZW5kZXJMaW5lcyB3aWxsIGhhbmRsZSBoaWRpbmcgYmFzZWQgb24gaGlkZGVuU2VyaWVzXG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICB9XG5cbiAgcHVibGljIGNsZWFudXBDaGFydCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdmcpIHtcbiAgICAgIHRoaXMuZDM/LnNlbGVjdCh0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkuc2VsZWN0QWxsKCdzdmcnKS5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3ZnID0gbnVsbDtcbiAgICAgIHRoaXMuY2hhcnQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cERpbWVuc2lvbnMoY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM6IEFYTGluZUNoYXJ0T3B0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5jYWxjdWxhdGVNYXJnaW5zKG9wdGlvbnMsIGNvbnRhaW5lckVsZW1lbnQuY2xpZW50V2lkdGgpO1xuXG4gICAgY29uc3QgY29udGFpbmVyV2lkdGggPSBjb250YWluZXJFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lckVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IG1pbkRpbSA9IE1hdGgubWluKDIwMCwgY29udGFpbmVyV2lkdGgsIGNvbnRhaW5lckhlaWdodCk7XG5cbiAgICBpZiAob3B0aW9ucy53aWR0aCAmJiBvcHRpb25zLmhlaWdodCkge1xuICAgICAgdGhpcy53aWR0aCA9IG9wdGlvbnMud2lkdGggLSB0aGlzLm1hcmdpbi5sZWZ0IC0gdGhpcy5tYXJnaW4ucmlnaHQ7XG4gICAgICB0aGlzLmhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0IC0gdGhpcy5tYXJnaW4udG9wIC0gdGhpcy5tYXJnaW4uYm90dG9tO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLndpZHRoID0gTWF0aC5tYXgoY29udGFpbmVyV2lkdGgsIG1pbkRpbSkgLSB0aGlzLm1hcmdpbi5sZWZ0IC0gdGhpcy5tYXJnaW4ucmlnaHQ7XG4gICAgICB0aGlzLmhlaWdodCA9IE1hdGgubWF4KGNvbnRhaW5lckhlaWdodCwgbWluRGltKSAtIHRoaXMubWFyZ2luLnRvcCAtIHRoaXMubWFyZ2luLmJvdHRvbTtcbiAgICB9XG5cbiAgICB0aGlzLndpZHRoID0gTWF0aC5tYXgodGhpcy53aWR0aCwgMTAwKTtcbiAgICB0aGlzLmhlaWdodCA9IE1hdGgubWF4KHRoaXMuaGVpZ2h0LCAxMDApO1xuXG4gICAgY29uc3QgdG90YWxXaWR0aCA9IHRoaXMud2lkdGggKyB0aGlzLm1hcmdpbi5sZWZ0ICsgdGhpcy5tYXJnaW4ucmlnaHQ7XG4gICAgY29uc3QgdG90YWxIZWlnaHQgPSB0aGlzLmhlaWdodCArIHRoaXMubWFyZ2luLnRvcCArIHRoaXMubWFyZ2luLmJvdHRvbTtcblxuICAgIGNvbnN0IHN2ZyA9IHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoY29udGFpbmVyRWxlbWVudClcbiAgICAgIC5hcHBlbmQoJ3N2ZycpXG4gICAgICAuYXR0cignd2lkdGgnLCB0b3RhbFdpZHRoKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsIHRvdGFsSGVpZ2h0KVxuICAgICAgLmF0dHIoJ3ZpZXdCb3gnLCBgMCAwICR7dG90YWxXaWR0aH0gJHt0b3RhbEhlaWdodH1gKVxuICAgICAgLmF0dHIoJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLCAneE1pZFlNaWQgbWVldCcpXG4gICAgICAuYXR0cihcbiAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgYFxuICAgICAgICB3aWR0aDogJHt0b3RhbFdpZHRofXB4O1xuICAgICAgICBoZWlnaHQ6ICR7dG90YWxIZWlnaHR9cHg7XG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgbWF4LWhlaWdodDogMTAwJTtcbiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgICBgLFxuICAgICAgKTtcblxuICAgIHRoaXMuc3ZnID0gc3ZnO1xuICAgIHRoaXMuY2hhcnQgPSB0aGlzLnN2Zy5hcHBlbmQoJ2cnKS5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7dGhpcy5tYXJnaW4ubGVmdH0sJHt0aGlzLm1hcmdpbi50b3B9KWApO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVNYXJnaW5zKG9wdGlvbnM6IEFYTGluZUNoYXJ0T3B0aW9uLCBjb250YWluZXJXaWR0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5tYXJnaW4gPSB7XG4gICAgICB0b3A6IG9wdGlvbnMubWFyZ2lucz8udG9wID8/IDIwLFxuICAgICAgcmlnaHQ6IG9wdGlvbnMubWFyZ2lucz8ucmlnaHQgPz8gMjUsXG4gICAgICBib3R0b206IG9wdGlvbnMubWFyZ2lucz8uYm90dG9tID8/IDQwLFxuICAgICAgbGVmdDogb3B0aW9ucy5tYXJnaW5zPy5sZWZ0ID8/IDUwLFxuICAgIH07XG5cbiAgICBjb25zdCBhbGxEYXRhUG9pbnRzID0gdGhpcy5fZnVsbE5vcm1hbGl6ZWREYXRhLmZsYXRNYXAoKHNlcmllcykgPT4gc2VyaWVzLmRhdGEpO1xuICAgIGlmIChhbGxEYXRhUG9pbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGFsbE51bWVyaWNYID0gYWxsRGF0YVBvaW50cy5ldmVyeSgoZCkgPT4gdHlwZW9mIGQueCA9PT0gJ251bWJlcicpO1xuXG4gICAgICBpZiAoIWFsbE51bWVyaWNYKSB7XG4gICAgICAgIGNvbnN0IHZpc2libGVTZXJpZXMgPSB0aGlzLl9mdWxsTm9ybWFsaXplZERhdGEuZmlsdGVyKFxuICAgICAgICAgIChzKSA9PiAhdGhpcy5oaWRkZW5TZXJpZXMuaGFzKHMuaWQgfHwgcy5sYWJlbCB8fCBgc2VyaWVzLSR7cy5vcmlnaW5hbEluZGV4fWApLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBhbGxYVmFsdWVzID0gbmV3IFNldCh2aXNpYmxlU2VyaWVzLmZsYXRNYXAoKHNlcmllcykgPT4gc2VyaWVzLmRhdGEubWFwKChkKSA9PiBTdHJpbmcoZC54KSkpKTtcbiAgICAgICAgY29uc3QgbGFiZWxDb3VudCA9IGFsbFhWYWx1ZXMuc2l6ZTtcblxuICAgICAgICBpZiAobGFiZWxDb3VudCA+IDAgJiYgY29udGFpbmVyV2lkdGggPiAwKSB7XG4gICAgICAgICAgY29uc3Qgd29ya2luZ1dpZHRoID0gY29udGFpbmVyV2lkdGggLSB0aGlzLm1hcmdpbi5sZWZ0IC0gdGhpcy5tYXJnaW4ucmlnaHQ7XG4gICAgICAgICAgaWYgKHdvcmtpbmdXaWR0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoUGVyTGFiZWwgPSB3b3JraW5nV2lkdGggLyBsYWJlbENvdW50O1xuICAgICAgICAgICAgY29uc3QgbGFiZWxzID0gQXJyYXkuZnJvbShhbGxYVmFsdWVzKTtcbiAgICAgICAgICAgIGNvbnN0IGxvbmdlc3RMYWJlbCA9IGxhYmVscy5yZWR1Y2UoKGEsIGIpID0+IChhLmxlbmd0aCA+IGIubGVuZ3RoID8gYSA6IGIpLCAnJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGVzdGltYXRlZEZvbnRTaXplID0gTWF0aC5tYXgoMTEsIE1hdGgubWluKDE1LCBNYXRoLnJvdW5kKHdvcmtpbmdXaWR0aCAvIDQ1KSkpO1xuICAgICAgICAgICAgY29uc3QgZXN0aW1hdGVkTG9uZ2VzdExhYmVsV2lkdGggPSBsb25nZXN0TGFiZWwubGVuZ3RoICogZXN0aW1hdGVkRm9udFNpemUgKiAwLjY7XG5cbiAgICAgICAgICAgIGlmIChlc3RpbWF0ZWRMb25nZXN0TGFiZWxXaWR0aCA+IGF2YWlsYWJsZVdpZHRoUGVyTGFiZWwpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRFeHRyYU1hcmdpbiA9IGVzdGltYXRlZExvbmdlc3RMYWJlbFdpZHRoICogTWF0aC5zaW4oTWF0aC5QSSAvIDQpICsgMTA7XG4gICAgICAgICAgICAgIHRoaXMubWFyZ2luLmJvdHRvbSArPSBNYXRoLm1pbig2MCwgcmVxdWlyZWRFeHRyYU1hcmdpbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMueEF4aXNMYWJlbCkge1xuICAgICAgY29uc3QgeExhYmVsTGVuZ3RoID0gb3B0aW9ucy54QXhpc0xhYmVsLmxlbmd0aDtcbiAgICAgIGNvbnN0IGV4dHJhQm90dG9tTWFyZ2luID0gTWF0aC5taW4oMjAsIE1hdGgubWF4KDEwLCB4TGFiZWxMZW5ndGggKiAwLjgpKTtcbiAgICAgIHRoaXMubWFyZ2luLmJvdHRvbSA9IE1hdGgubWF4KHRoaXMubWFyZ2luLmJvdHRvbSwgNDAgKyBleHRyYUJvdHRvbU1hcmdpbik7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMueUF4aXNMYWJlbCkge1xuICAgICAgY29uc3QgeUxhYmVsTGVuZ3RoID0gb3B0aW9ucy55QXhpc0xhYmVsLmxlbmd0aDtcbiAgICAgIGNvbnN0IGV4dHJhTGVmdE1hcmdpbiA9IE1hdGgubWluKDIwLCBNYXRoLm1heCgxMCwgeUxhYmVsTGVuZ3RoICogMC44KSk7XG4gICAgICB0aGlzLm1hcmdpbi5sZWZ0ID0gTWF0aC5tYXgodGhpcy5tYXJnaW4ubGVmdCwgNTAgKyBleHRyYUxlZnRNYXJnaW4pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNob3dYQXhpcyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMubWFyZ2luLmJvdHRvbSA9IE1hdGgubWF4KHRoaXMubWFyZ2luLmJvdHRvbSwgNDUpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNob3dZQXhpcyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMubWFyZ2luLmxlZnQgPSBNYXRoLm1heCh0aGlzLm1hcmdpbi5sZWZ0LCA1NSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFNjYWxlcyhkYXRhOiAoQVhMaW5lQ2hhcnREYXRhICYgeyBvcmlnaW5hbEluZGV4OiBudW1iZXIgfSlbXSk6IHZvaWQge1xuICAgIC8vIEV4cGVjdHMgYWxyZWFkeSBmaWx0ZXJlZCBkYXRhIGZvciBzY2FsZXNcbiAgICBjb25zdCBjaGFydE9wdGlvbnMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcbiAgICBjb25zdCBwYWRkaW5nID0gY2hhcnRPcHRpb25zLmF4aXNQYWRkaW5nID8/IDA7XG4gICAgY29uc3QgcGFkZGluZ011bHRpcGxpZXIgPSBwYWRkaW5nIC8gMTAwO1xuXG4gICAgLy8gRW5zdXJlIGRhdGEgaXMgbm90IGVtcHR5IGZvciBzY2FsZSBkb21haW4gY2FsY3VsYXRpb25cbiAgICBjb25zdCBhbGxEYXRhUG9pbnRzID0gZGF0YS5sZW5ndGggPiAwID8gZGF0YS5mbGF0TWFwKChzZXJpZXMpID0+IHNlcmllcy5kYXRhKSA6IFt7IHg6IDAsIHk6IDAgfV07XG4gICAgaWYgKGFsbERhdGFQb2ludHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBTaG91bGQgaWRlYWxseSBub3QgaGFwcGVuIGlmIGNyZWF0ZUNoYXJ0IGZpbHRlcnMgY29ycmVjdGx5XG4gICAgICBhbGxEYXRhUG9pbnRzLnB1c2goeyB4OiAwLCB5OiAwIH0pOyAvLyBEZWZhdWx0IGZhbGxiYWNrIHRvIHByZXZlbnQgY3Jhc2ggd2l0aCBlbXB0eSBkb21haW5cbiAgICB9XG5cbiAgICBjb25zdCBhbGxOdW1lcmljWCA9IGFsbERhdGFQb2ludHMuZXZlcnkoKGQpID0+IHR5cGVvZiBkLnggPT09ICdudW1iZXInKTtcblxuICAgIGlmIChhbGxOdW1lcmljWCkge1xuICAgICAgY29uc3QgeE1pbiA9IHRoaXMuZDMubWluKGFsbERhdGFQb2ludHMsIChkKSA9PiBkLnggYXMgbnVtYmVyKSA/PyAwO1xuICAgICAgY29uc3QgeE1heCA9IHRoaXMuZDMubWF4KGFsbERhdGFQb2ludHMsIChkKSA9PiBkLnggYXMgbnVtYmVyKSA/PyAwO1xuXG4gICAgICBpZiAoeE1pbiA9PT0geE1heCkge1xuICAgICAgICB0aGlzLnhTY2FsZSA9IHRoaXMuZDNcbiAgICAgICAgICAuc2NhbGVMaW5lYXIoKVxuICAgICAgICAgIC5kb21haW4oW3hNaW4gLSAxLCB4TWF4ICsgMV0pXG4gICAgICAgICAgLnJhbmdlKFswLCB0aGlzLndpZHRoXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnhTY2FsZSA9IHRoaXMuZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oW3hNaW4sIHhNYXhdKS5yYW5nZShbMCwgdGhpcy53aWR0aF0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnhTY2FsZSA9IHRoaXMuZDNcbiAgICAgICAgLnNjYWxlQmFuZCgpXG4gICAgICAgIC5kb21haW4oYWxsRGF0YVBvaW50cy5tYXAoKGQpID0+IFN0cmluZyhkLngpKSlcbiAgICAgICAgLnJhbmdlKFswLCB0aGlzLndpZHRoXSlcbiAgICAgICAgLnBhZGRpbmdJbm5lcigwLjIpXG4gICAgICAgIC5wYWRkaW5nT3V0ZXIoMCk7XG4gICAgfVxuXG4gICAgY29uc3QgeUF4aXNTdGFydHNBdFplcm8gPSBjaGFydE9wdGlvbnMueUF4aXNTdGFydHNBdFplcm8gIT09IGZhbHNlO1xuICAgIGxldCB5TWluID0gdGhpcy5kMy5taW4oYWxsRGF0YVBvaW50cywgKGQpID0+IGQueSkgPz8gMDtcbiAgICBpZiAoeUF4aXNTdGFydHNBdFplcm8pIHtcbiAgICAgIHlNaW4gPSBNYXRoLm1pbigwLCB5TWluKTtcbiAgICB9XG4gICAgY29uc3QgeU1heCA9IHRoaXMuZDMubWF4KGFsbERhdGFQb2ludHMsIChkKSA9PiBkLnkpID8/IDA7XG4gICAgY29uc3QgeVJhbmdlID0geU1heCAtIHlNaW47XG5cbiAgICB0aGlzLnlTY2FsZSA9IHRoaXMuZDNcbiAgICAgIC5zY2FsZUxpbmVhcigpXG4gICAgICAuZG9tYWluKFt5TWluLCB5TWF4ICsgeVJhbmdlICogcGFkZGluZ011bHRpcGxpZXJdKVxuICAgICAgLm5pY2UoKVxuICAgICAgLnJhbmdlKFt0aGlzLmhlaWdodCwgMF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVBeGVzKG9wdGlvbnM6IEFYTGluZUNoYXJ0T3B0aW9uKTogdm9pZCB7XG4gICAgY29uc3Qgc2hvd1hBeGlzID0gb3B0aW9ucy5zaG93WEF4aXMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHNob3dZQXhpcyA9IG9wdGlvbnMuc2hvd1lBeGlzICE9PSBmYWxzZTtcbiAgICBjb25zdCBzaG93R3JpZCA9IG9wdGlvbnMuc2hvd0dyaWQgIT09IGZhbHNlO1xuICAgIGNvbnN0IGlzQmFuZFNjYWxlID0gdGhpcy54U2NhbGUuYmFuZHdpZHRoICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgaXNSdGwgPSB0aGlzLnBsYXRmb3JtLmlzUnRsKCk7XG4gICAgY29uc3QgYXhlc0dyb3VwID0gdGhpcy5jaGFydC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWF4ZXMnKTtcblxuICAgIGlmIChzaG93WEF4aXMpIHtcbiAgICAgIHRoaXMueEF4aXMgPSBheGVzR3JvdXBcbiAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWF4aXMteCcpXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHt0aGlzLmhlaWdodH0pYClcbiAgICAgICAgLmNhbGwodGhpcy5kMy5heGlzQm90dG9tKHRoaXMueFNjYWxlKS50aWNrU2l6ZSg1KS50aWNrUGFkZGluZyg4KSk7XG5cbiAgICAgIC8vIFN0eWxlIHRoZSB4LWF4aXMgcGF0aCBhbmQgbGluZXNcbiAgICAgIHRoaXMueEF4aXMuc2VsZWN0QWxsKCdwYXRoJykuYXR0cignc3Ryb2tlJywgJ3JnYmEodmFyKC0tYXgtY29tcC1saW5lLWNoYXJ0LWF4aXMtY29sb3IpLCAwLjIpJyk7XG5cbiAgICAgIHRoaXMueEF4aXNcbiAgICAgICAgLnNlbGVjdEFsbCgnbGluZScpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAncmdiYSh2YXIoLS1heC1jb21wLWxpbmUtY2hhcnQtZ3JpZC1saW5lcy1jb2xvciksIDAuMiknKVxuICAgICAgICAuYXR0cignc3Ryb2tlLWRhc2hhcnJheScsICcyLDInKVxuICAgICAgICAuYXR0cignc3Ryb2tlLW9wYWNpdHknLCAnMC41Jyk7XG5cbiAgICAgIGNvbnN0IGR5bmFtaWNYQXhpc1RpY2tGb250U2l6ZSA9IE1hdGgubWF4KDExLCBNYXRoLm1pbigxNSwgTWF0aC5yb3VuZCh0aGlzLndpZHRoIC8gNDUpKSk7XG4gICAgICBjb25zdCB4QXhpc1RpY2tzID0gdGhpcy54QXhpc1xuICAgICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcbiAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHtkeW5hbWljWEF4aXNUaWNrRm9udFNpemV9cHhgKVxuICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzQwMCcpXG4gICAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2JhKHZhcigtLWF4LWNvbXAtbGluZS1jaGFydC1sYWJlbHMtY29sb3IpLCAwLjcpJyk7XG5cbiAgICAgIC8vIEF1dG9tYXRpY2FsbHkgcm90YXRlIGxhYmVscyBpZiB0aGV5IGFyZSBsaWtlbHkgdG8gb3ZlcmxhcFxuICAgICAgaWYgKGlzQmFuZFNjYWxlICYmIHRoaXMueFNjYWxlLmRvbWFpbigpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgc3RlcCA9IHRoaXMueFNjYWxlLnN0ZXAoKTtcbiAgICAgICAgY29uc3QgbG9uZ2VzdExhYmVsID0gdGhpcy54U2NhbGUuZG9tYWluKCkucmVkdWNlKChhLCBiKSA9PiAoYS5sZW5ndGggPiBiLmxlbmd0aCA/IGEgOiBiKSwgJycpO1xuICAgICAgICAvLyBVc2luZyAwLjYgYXMgYSBiZXR0ZXIgZXN0aW1hdGUgZm9yIGNoYXIgd2lkdGgtdG8taGVpZ2h0IHJhdGlvXG4gICAgICAgIGNvbnN0IGVzdGltYXRlZExvbmdlc3RMYWJlbFdpZHRoID0gbG9uZ2VzdExhYmVsLmxlbmd0aCAqIGR5bmFtaWNYQXhpc1RpY2tGb250U2l6ZSAqIDAuNjtcblxuICAgICAgICBpZiAoZXN0aW1hdGVkTG9uZ2VzdExhYmVsV2lkdGggPiBzdGVwKSB7XG4gICAgICAgICAgeEF4aXNUaWNrc1xuICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoLTQ1KScpXG4gICAgICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ2VuZCcpXG4gICAgICAgICAgICAuYXR0cignZHgnLCAnLTAuOGVtJylcbiAgICAgICAgICAgIC5hdHRyKCdkeScsICcwLjE1ZW0nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy54QXhpc0xhYmVsKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsWSA9IHRoaXMuaGVpZ2h0ICsgdGhpcy5tYXJnaW4uYm90dG9tICogMC43O1xuXG4gICAgICAgIGF4ZXNHcm91cFxuICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWF4aXMtbGFiZWwgYXgteC1heGlzLWxhYmVsJylcbiAgICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgICAgICAuYXR0cignZG9taW5hbnQtYmFzZWxpbmUnLCAnbWlkZGxlJylcbiAgICAgICAgICAuYXR0cigneCcsIHRoaXMud2lkdGggLyAyKVxuICAgICAgICAgIC5hdHRyKCd5JywgbGFiZWxZKVxuICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsIDUpJylcbiAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICBgXG4gICAgICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICAgICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgICAgICAgZmlsbDogcmdiKHZhcigtLWF4LWNvbXAtbGluZS1jaGFydC10ZXh0LWNvbG9yKSk7XG4gICAgICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgICBgLFxuICAgICAgICAgIClcbiAgICAgICAgICAudGV4dChvcHRpb25zLnhBeGlzTGFiZWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG93WUF4aXMpIHtcbiAgICAgIHRoaXMueUF4aXMgPSBheGVzR3JvdXBcbiAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWF4aXMteScpXG4gICAgICAgIC5jYWxsKHRoaXMuZDMuYXhpc0xlZnQodGhpcy55U2NhbGUpLnRpY2tTaXplKDUpLnRpY2tQYWRkaW5nKDgpKTtcblxuICAgICAgLy8gU3R5bGUgdGhlIHktYXhpcyBwYXRoIGFuZCBsaW5lc1xuICAgICAgdGhpcy55QXhpcy5zZWxlY3RBbGwoJ3BhdGgnKS5hdHRyKCdzdHJva2UnLCAncmdiYSh2YXIoLS1heC1jb21wLWxpbmUtY2hhcnQtYXhpcy1jb2xvciksIDAuMiknKTtcblxuICAgICAgdGhpcy55QXhpc1xuICAgICAgICAuc2VsZWN0QWxsKCdsaW5lJylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsICdyZ2JhKHZhcigtLWF4LWNvbXAtbGluZS1jaGFydC1ncmlkLWxpbmVzLWNvbG9yKSwgMC4yKScpXG4gICAgICAgIC5hdHRyKCdzdHJva2UtZGFzaGFycmF5JywgJzIsMicpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utb3BhY2l0eScsICcwLjUnKTtcblxuICAgICAgY29uc3QgZHluYW1pY1lBeGlzVGlja0ZvbnRTaXplID0gTWF0aC5tYXgoMTEsIE1hdGgubWluKDE1LCBNYXRoLnJvdW5kKHRoaXMuaGVpZ2h0IC8gMzApKSk7XG4gICAgICBjb25zdCB5VGlja1RleHRzID0gdGhpcy55QXhpcy5zZWxlY3RBbGwoJ3RleHQnKS5hdHRyKFxuICAgICAgICAnc3R5bGUnLFxuICAgICAgICBgXG4gICAgICAgICAgZm9udC1zaXplOiAke2R5bmFtaWNZQXhpc1RpY2tGb250U2l6ZX1weDtcbiAgICAgICAgICBmb250LXdlaWdodDogNDAwO1xuICAgICAgICAgIGZpbGw6IHJnYmEodmFyKC0tYXgtY29tcC1saW5lLWNoYXJ0LWxhYmVscy1jb2xvciksIDAuNyk7XG4gICAgICAgIGAsXG4gICAgICApO1xuXG4gICAgICBpZiAoaXNSdGwpIHtcbiAgICAgICAgeVRpY2tUZXh0cy5hdHRyKCd0ZXh0LWFuY2hvcicsICdzdGFydCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy55QXhpc0xhYmVsKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsWCA9IC10aGlzLmhlaWdodCAvIDI7XG4gICAgICAgIGNvbnN0IGxhYmVsWSA9IC10aGlzLm1hcmdpbi5sZWZ0ICogMC44O1xuXG4gICAgICAgIGF4ZXNHcm91cFxuICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWF4aXMtbGFiZWwgYXgteS1heGlzLWxhYmVsJylcbiAgICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgICAgICAuYXR0cignZG9taW5hbnQtYmFzZWxpbmUnLCAnbWlkZGxlJylcbiAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3JvdGF0ZSgtOTApIHRyYW5zbGF0ZSgtNSwgMCknKVxuICAgICAgICAgIC5hdHRyKCd4JywgbGFiZWxYKVxuICAgICAgICAgIC5hdHRyKCd5JywgbGFiZWxZKVxuICAgICAgICAgIC5hdHRyKFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICAgICAgICBmaWxsOiByZ2IodmFyKC0tYXgtY29tcC1saW5lLWNoYXJ0LXRleHQtY29sb3IpKTtcbiAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICAgIGAsXG4gICAgICAgICAgKVxuICAgICAgICAgIC50ZXh0KG9wdGlvbnMueUF4aXNMYWJlbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dHcmlkKSB7XG4gICAgICBjb25zdCBncmlkR3JvdXAgPSB0aGlzLmNoYXJ0XG4gICAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1ncmlkLWNvbnRhaW5lcicpXG4gICAgICAgIC5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7XG5cbiAgICAgIGNvbnN0IHlHcmlkID0gZ3JpZEdyb3VwXG4gICAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1ncmlkJylcbiAgICAgICAgLmNhbGwoXG4gICAgICAgICAgdGhpcy5kM1xuICAgICAgICAgICAgLmF4aXNMZWZ0KHRoaXMueVNjYWxlKVxuICAgICAgICAgICAgLnRpY2tTaXplKC10aGlzLndpZHRoKVxuICAgICAgICAgICAgLnRpY2tGb3JtYXQoKCkgPT4gJycpXG4gICAgICAgICAgICAudGlja1ZhbHVlcyh0aGlzLnlTY2FsZS50aWNrcygpKSxcbiAgICAgICAgKTtcblxuICAgICAgLy8gU3R5bGUgdGhlIGdyaWQgcGF0aCBhbmQgbGluZXNcbiAgICAgIHlHcmlkLnNlbGVjdEFsbCgncGF0aCcpLmF0dHIoJ3N0cm9rZS13aWR0aCcsICcwJyk7XG5cbiAgICAgIHlHcmlkXG4gICAgICAgIC5zZWxlY3RBbGwoJy50aWNrJylcbiAgICAgICAgLnNlbGVjdEFsbCgnbGluZScpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAncmdiYSh2YXIoLS1heC1jb21wLWxpbmUtY2hhcnQtZ3JpZC1saW5lcy1jb2xvciksIDAuMiknKVxuICAgICAgICAuYXR0cignc3Ryb2tlLWRhc2hhcnJheScsICcyLDInKVxuICAgICAgICAuYXR0cignc3Ryb2tlLW9wYWNpdHknLCAnMC41Jyk7XG5cbiAgICAgIGlmIChvcHRpb25zLnNob3dWZXJ0aWNhbEdyaWQpIHtcbiAgICAgICAgY29uc3QgeEdyaWQgPSBncmlkR3JvdXBcbiAgICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1ncmlkLXZlcnRpY2FsJylcbiAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7dGhpcy5oZWlnaHR9KWApXG4gICAgICAgICAgLmNhbGwoXG4gICAgICAgICAgICB0aGlzLmQzXG4gICAgICAgICAgICAgIC5heGlzQm90dG9tKHRoaXMueFNjYWxlKVxuICAgICAgICAgICAgICAudGlja1NpemUoLXRoaXMuaGVpZ2h0KVxuICAgICAgICAgICAgICAudGlja0Zvcm1hdCgoKSA9PiAnJylcbiAgICAgICAgICAgICAgLnRpY2tWYWx1ZXMoaXNCYW5kU2NhbGUgPyB1bmRlZmluZWQgOiB0aGlzLnhTY2FsZS50aWNrcygpKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgIC8vIFN0eWxlIHRoZSB2ZXJ0aWNhbCBncmlkIHBhdGggYW5kIGxpbmVzXG4gICAgICAgIHhHcmlkLnNlbGVjdEFsbCgncGF0aCcpLmF0dHIoJ3N0cm9rZS13aWR0aCcsICcwJyk7XG5cbiAgICAgICAgeEdyaWRcbiAgICAgICAgICAuc2VsZWN0QWxsKCcudGljaycpXG4gICAgICAgICAgLnNlbGVjdEFsbCgnbGluZScpXG4gICAgICAgICAgLmF0dHIoJ3N0cm9rZScsICdyZ2JhKHZhcigtLWF4LWNvbXAtbGluZS1jaGFydC1ncmlkLWxpbmVzLWNvbG9yKSwgMC4xNSknKVxuICAgICAgICAgIC5hdHRyKCdzdHJva2UtZGFzaGFycmF5JywgJzIsMicpXG4gICAgICAgICAgLmF0dHIoJ3N0cm9rZS1vcGFjaXR5JywgJzAuNScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyTGluZXMoYWxsU2VyaWVzRGF0YTogKEFYTGluZUNoYXJ0RGF0YSAmIHsgb3JpZ2luYWxJbmRleDogbnVtYmVyIH0pW10pOiB2b2lkIHtcbiAgICBjb25zdCBpc0JhbmRTY2FsZSA9IHRoaXMueFNjYWxlLmJhbmR3aWR0aCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZ2V0WCA9IChkOiB7IHg6IG51bWJlciB8IHN0cmluZzsgeTogbnVtYmVyIH0pID0+IHtcbiAgICAgIGlmIChpc0JhbmRTY2FsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy54U2NhbGUoU3RyaW5nKGQueCkpICsgdGhpcy54U2NhbGUuYmFuZHdpZHRoKCkgLyAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueFNjYWxlKGQueCBhcyBudW1iZXIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBsaW5lR2VuZXJhdG9yID0gdGhpcy5kM1xuICAgICAgLmxpbmU8eyB4OiBudW1iZXIgfCBzdHJpbmc7IHk6IG51bWJlciB9PigpXG4gICAgICAueChnZXRYKVxuICAgICAgLnkoKGQpID0+IHRoaXMueVNjYWxlKGQueSkpO1xuXG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNtb290aExpbmUgIT09IGZhbHNlKSB7XG4gICAgICBsaW5lR2VuZXJhdG9yLmN1cnZlKHRoaXMuZDMuY3VydmVNb25vdG9uZVgpO1xuICAgIH1cblxuICAgIGNvbnN0IGFyZWFHZW5lcmF0b3IgPSB0aGlzLmQzXG4gICAgICAuYXJlYTx7IHg6IG51bWJlciB8IHN0cmluZzsgeTogbnVtYmVyIH0+KClcbiAgICAgIC54KGdldFgpXG4gICAgICAueTAodGhpcy5oZWlnaHQpXG4gICAgICAueTEoKGQpID0+IHRoaXMueVNjYWxlKGQueSkpO1xuXG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNtb290aExpbmUgIT09IGZhbHNlKSB7XG4gICAgICBhcmVhR2VuZXJhdG9yLmN1cnZlKHRoaXMuZDMuY3VydmVNb25vdG9uZVgpO1xuICAgIH1cblxuICAgIHRoaXMuc3ZnLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtYW5pbWF0aW5nJyk7XG5cbiAgICBjb25zdCBhbGxTZXJpZXNHcm91cCA9IHRoaXMuY2hhcnRcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtYWxsLXNlcmllcycpXG4gICAgICAuYXR0cigncG9pbnRlci1ldmVudHMnLCAnbm9uZScpO1xuXG4gICAgY29uc3QgYWxsUG9pbnRzR3JvdXAgPSB0aGlzLmNoYXJ0XG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWFsbC1wb2ludHMnKVxuICAgICAgLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcblxuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93Q3Jvc3NoYWlyID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmNoYXJ0LmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtY3Jvc3NoYWlyJykuYXR0cigncG9pbnRlci1ldmVudHMnLCAnbm9uZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGFuaW1hdGlvbkR1cmF0aW9uID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYW5pbWF0aW9uRHVyYXRpb247XG4gICAgY29uc3QgYW5pbWF0aW9uRWFzaW5nID0gdGhpcy5nZXRFYXNpbmdGdW5jdGlvbih0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5hbmltYXRpb25FYXNpbmcpO1xuXG4gICAgYWxsU2VyaWVzRGF0YS5mb3JFYWNoKChzZXJpZXMpID0+IHtcbiAgICAgIGNvbnN0IHNlcmllc0lkZW50aWZpZXIgPSBzZXJpZXMuaWQgfHwgc2VyaWVzLmxhYmVsIHx8IGBzZXJpZXMtJHtzZXJpZXMub3JpZ2luYWxJbmRleH1gO1xuXG4gICAgICBpZiAodGhpcy5oaWRkZW5TZXJpZXMuaGFzKHNlcmllc0lkZW50aWZpZXIpKSB7XG4gICAgICAgIHRoaXMuY2hhcnQuc2VsZWN0QWxsKGAuYXgtbGluZS1jaGFydC1zZXJpZXNbZGF0YS1zZXJpZXMtaWRlbnRpZmllcj1cIiR7c2VyaWVzSWRlbnRpZmllcn1cIl1gKS5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5jaGFydC5zZWxlY3RBbGwoYC5heC1saW5lLWNoYXJ0LXBvaW50c1tkYXRhLXNlcmllcy1pZGVudGlmaWVyPVwiJHtzZXJpZXNJZGVudGlmaWVyfVwiXWApLnJlbW92ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIXNlcmllcy5kYXRhIHx8IHNlcmllcy5kYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzZXJpZXNHcm91cCA9IGFsbFNlcmllc0dyb3VwXG4gICAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCBgYXgtbGluZS1jaGFydC1zZXJpZXMgYXgtbGluZS1jaGFydC1zZXJpZXMtJHtzZXJpZXMub3JpZ2luYWxJbmRleH1gKVxuICAgICAgICAuYXR0cignZGF0YS1zZXJpZXMtaWRlbnRpZmllcicsIHNlcmllc0lkZW50aWZpZXIpXG4gICAgICAgIC5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7XG5cbiAgICAgIGNvbnN0IGxpbmVDb2xvciA9IHNlcmllcy5saW5lQ29sb3IgfHwgZ2V0Q2hhcnRDb2xvcihzZXJpZXMub3JpZ2luYWxJbmRleCwgdGhpcy5jaGFydENvbG9ycyk7XG4gICAgICBjb25zdCBmaWxsQ29sb3IgPSBzZXJpZXMuZmlsbENvbG9yIHx8IGxpbmVDb2xvcjtcblxuICAgICAgY29uc3QgbGluZSA9IHNlcmllc0dyb3VwXG4gICAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgICAuZGF0dW0oc2VyaWVzLmRhdGEpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWxpbmUnKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgbGluZUNvbG9yKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkubGluZVdpZHRoID8/IDIpXG4gICAgICAgIC5hdHRyKCdzdHJva2UtbGluZWpvaW4nLCAncm91bmQnKVxuICAgICAgICAuYXR0cignc3Ryb2tlLWxpbmVjYXAnLCAncm91bmQnKVxuICAgICAgICAuYXR0cignZCcsIGxpbmVHZW5lcmF0b3IgYXMgYW55KVxuICAgICAgICAuYXR0cignZmlsbCcsICdub25lJylcbiAgICAgICAgLmF0dHIoJ3N0eWxlJywgJ3RyYW5zaXRpb246IHN0cm9rZS13aWR0aCAwLjNzIGVhc2U7JylcbiAgICAgICAgLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcblxuICAgICAgbGluZVxuICAgICAgICAub24oJ21vdXNlZW50ZXInLCAoKSA9PiB7XG4gICAgICAgICAgbGluZVxuICAgICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgICAgLmR1cmF0aW9uKDE1MClcbiAgICAgICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkubGluZVdpZHRoID8/IDIpICogMS41KTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgICAgIGxpbmVcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgICAgIC5kdXJhdGlvbigxNTApXG4gICAgICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkubGluZVdpZHRoID8/IDIpO1xuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgdG90YWxMZW5ndGggPSBsaW5lLm5vZGUoKS5nZXRUb3RhbExlbmd0aCgpO1xuICAgICAgbGluZVxuICAgICAgICAuYXR0cignc3Ryb2tlLWRhc2hhcnJheScsIHRvdGFsTGVuZ3RoICsgJyAnICsgdG90YWxMZW5ndGgpXG4gICAgICAgIC5hdHRyKCdzdHJva2UtZGFzaG9mZnNldCcsIHRvdGFsTGVuZ3RoKVxuICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgICAgLmVhc2UoYW5pbWF0aW9uRWFzaW5nKVxuICAgICAgICAuYXR0cignc3Ryb2tlLWRhc2hvZmZzZXQnLCAwKVxuICAgICAgICAub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBsaW5lLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ2FsbCcpO1xuICAgICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmZpbGxBcmVhKSB7XG4gICAgICAgIGNvbnN0IGFyZWEgPSBzZXJpZXNHcm91cFxuICAgICAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgICAgIC5kYXR1bShzZXJpZXMuZGF0YSlcbiAgICAgICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1hcmVhJylcbiAgICAgICAgICAuYXR0cignZmlsbCcsIGZpbGxDb2xvcilcbiAgICAgICAgICAuYXR0cignb3BhY2l0eScsIDApXG4gICAgICAgICAgLmF0dHIoJ2QnLCBhcmVhR2VuZXJhdG9yKVxuICAgICAgICAgIC5hdHRyKCdzdHlsZScsICd0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgZWFzZTsnKVxuICAgICAgICAgIC5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7XG5cbiAgICAgICAgYXJlYVxuICAgICAgICAgIC5vbignbW91c2VlbnRlcicsICgpID0+IHtcbiAgICAgICAgICAgIGFyZWFcbiAgICAgICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgICAgICAuZHVyYXRpb24oMTUwKVxuICAgICAgICAgICAgICAuYXR0cignb3BhY2l0eScsICgodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuZmlsbE9wYWNpdHkgPz8gMjApIC8gMTAwKSAqIDEuNSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAub24oJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICAgICAgICBhcmVhXG4gICAgICAgICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgICAgICAgLmR1cmF0aW9uKDE1MClcbiAgICAgICAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuZmlsbE9wYWNpdHkgPz8gMjApIC8gMTAwKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICBhcmVhXG4gICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgICAgICAuZWFzZShhbmltYXRpb25FYXNpbmcpXG4gICAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuZmlsbE9wYWNpdHkgPz8gMjApIC8gMTAwKVxuICAgICAgICAgIC5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgYXJlYS5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdhbGwnKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93UG9pbnRzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgcG9pbnRNYXAgPSBuZXcgTWFwPFxuICAgICAgICBzdHJpbmcsXG4gICAgICAgIEFycmF5PHsgcG9pbnQ6IGFueTsgc2VyaWVzOiBBWExpbmVDaGFydERhdGEgJiB7IG9yaWdpbmFsSW5kZXg6IG51bWJlciB9OyBvcmlnaW5hbEluZGV4OiBudW1iZXIgfT5cbiAgICAgID4oKTtcblxuICAgICAgYWxsU2VyaWVzRGF0YS5mb3JFYWNoKChzZXJpZXMpID0+IHtcbiAgICAgICAgY29uc3Qgc2VyaWVzSWRlbnRpZmllciA9IHNlcmllcy5pZCB8fCBzZXJpZXMubGFiZWwgfHwgYHNlcmllcy0ke3Nlcmllcy5vcmlnaW5hbEluZGV4fWA7XG4gICAgICAgIGlmICh0aGlzLmhpZGRlblNlcmllcy5oYXMoc2VyaWVzSWRlbnRpZmllcikgfHwgIXNlcmllcy5kYXRhIHx8IHNlcmllcy5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpbmVDb2xvciA9IHNlcmllcy5saW5lQ29sb3IgfHwgZ2V0Q2hhcnRDb2xvcihzZXJpZXMub3JpZ2luYWxJbmRleCwgdGhpcy5jaGFydENvbG9ycyk7XG4gICAgICAgIGNvbnN0IG1heFBvaW50cyA9IDEwMDtcbiAgICAgICAgY29uc3QgcG9pbnREYXRhID1cbiAgICAgICAgICBzZXJpZXMuZGF0YS5sZW5ndGggPiBtYXhQb2ludHMgPyB0aGlzLmdldFJlZHVjZWREYXRhUG9pbnRzKHNlcmllcy5kYXRhLCBtYXhQb2ludHMpIDogc2VyaWVzLmRhdGE7XG5cbiAgICAgICAgcG9pbnREYXRhLmZvckVhY2goKHBvaW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgeCA9IGdldFgocG9pbnQpO1xuICAgICAgICAgIGNvbnN0IHkgPSB0aGlzLnlTY2FsZShwb2ludC55KTtcbiAgICAgICAgICBjb25zdCBrZXkgPSBgJHtNYXRoLnJvdW5kKHggKiAxMCkgLyAxMH0sJHtNYXRoLnJvdW5kKHkgKiAxMCkgLyAxMH1gO1xuXG4gICAgICAgICAgaWYgKCFwb2ludE1hcC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgcG9pbnRNYXAuc2V0KGtleSwgW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwb2ludE1hcC5nZXQoa2V5KT8ucHVzaCh7IHBvaW50LCBzZXJpZXMsIG9yaWdpbmFsSW5kZXg6IHNlcmllcy5vcmlnaW5hbEluZGV4IH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgYW5pbWF0aW9uQ291bnRlciA9IDA7XG4gICAgICBjb25zdCB0b3RhbFZpc2libGVTZXJpZXNDb3VudCA9IGFsbFNlcmllc0RhdGEuZmlsdGVyKFxuICAgICAgICAocykgPT4gIXRoaXMuaGlkZGVuU2VyaWVzLmhhcyhzLmlkIHx8IHMubGFiZWwgfHwgYHNlcmllcy0ke3Mub3JpZ2luYWxJbmRleH1gKSAmJiBzLmRhdGEgJiYgcy5kYXRhLmxlbmd0aCA+IDAsXG4gICAgICApLmxlbmd0aDtcblxuICAgICAgYWxsU2VyaWVzRGF0YS5mb3JFYWNoKChzZXJpZXMpID0+IHtcbiAgICAgICAgY29uc3Qgc2VyaWVzSWRlbnRpZmllciA9IHNlcmllcy5pZCB8fCBzZXJpZXMubGFiZWwgfHwgYHNlcmllcy0ke3Nlcmllcy5vcmlnaW5hbEluZGV4fWA7XG4gICAgICAgIGlmICh0aGlzLmhpZGRlblNlcmllcy5oYXMoc2VyaWVzSWRlbnRpZmllcikgfHwgIXNlcmllcy5kYXRhIHx8IHNlcmllcy5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpbmVDb2xvciA9IHNlcmllcy5saW5lQ29sb3IgfHwgZ2V0Q2hhcnRDb2xvcihzZXJpZXMub3JpZ2luYWxJbmRleCwgdGhpcy5jaGFydENvbG9ycyk7XG4gICAgICAgIGNvbnN0IHBvaW50c0dyb3VwID0gYWxsUG9pbnRzR3JvdXBcbiAgICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgICAuYXR0cignY2xhc3MnLCBgYXgtbGluZS1jaGFydC1wb2ludHMgYXgtbGluZS1jaGFydC1wb2ludHMtJHtzZXJpZXMub3JpZ2luYWxJbmRleH1gKVxuICAgICAgICAgIC5hdHRyKCdkYXRhLXNlcmllcy1pZGVudGlmaWVyJywgc2VyaWVzSWRlbnRpZmllcilcbiAgICAgICAgICAuYXR0cigncG9pbnRlci1ldmVudHMnLCAnbm9uZScpO1xuXG4gICAgICAgIHBvaW50c0dyb3VwXG4gICAgICAgICAgLm9uKCdtb3VzZWVudGVyJywgKCkgPT4gdGhpcy5oYW5kbGVQb2ludEdyb3VwRW50ZXIoc2VyaWVzLm9yaWdpbmFsSW5kZXgsIGxpbmVDb2xvcikpXG4gICAgICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4gdGhpcy5oYW5kbGVQb2ludEdyb3VwTGVhdmUoKSk7XG5cbiAgICAgICAgY29uc3QgbWF4UG9pbnRzID0gMTAwO1xuICAgICAgICBjb25zdCBwb2ludERhdGEgPVxuICAgICAgICAgIHNlcmllcy5kYXRhLmxlbmd0aCA+IG1heFBvaW50cyA/IHRoaXMuZ2V0UmVkdWNlZERhdGFQb2ludHMoc2VyaWVzLmRhdGEsIG1heFBvaW50cykgOiBzZXJpZXMuZGF0YTtcblxuICAgICAgICBwb2ludHNHcm91cFxuICAgICAgICAgIC5zZWxlY3RBbGwoJ2NpcmNsZScpXG4gICAgICAgICAgLmRhdGEocG9pbnREYXRhKVxuICAgICAgICAgIC5lbnRlcigpXG4gICAgICAgICAgLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1wb2ludCcpXG4gICAgICAgICAgLmF0dHIoJ2N4JywgZ2V0WClcbiAgICAgICAgICAuYXR0cignY3knLCAoZCkgPT4gdGhpcy55U2NhbGUoZC55KSlcbiAgICAgICAgICAuYXR0cigncicsIDApXG4gICAgICAgICAgLmF0dHIoJ2ZpbGwnLCBsaW5lQ29sb3IpXG4gICAgICAgICAgLmF0dHIoJ3N0cm9rZScsICcjZmZmJylcbiAgICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgMSlcbiAgICAgICAgICAuYXR0cignZGF0YS14JywgKGQpID0+IGQueClcbiAgICAgICAgICAuYXR0cignZGF0YS15JywgKGQpID0+IGQueSlcbiAgICAgICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJylcbiAgICAgICAgICAuYXR0cigncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXG4gICAgICAgICAgLm9uKCdtb3VzZWVudGVyJywgKGV2ZW50OiBNb3VzZUV2ZW50LCBkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHggPSBnZXRYKGQpO1xuICAgICAgICAgICAgY29uc3QgeSA9IHRoaXMueVNjYWxlKGQueSk7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBgJHtNYXRoLnJvdW5kKHggKiAxMCkgLyAxMH0sJHtNYXRoLnJvdW5kKHkgKiAxMCkgLyAxMH1gO1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxhcHBpbmdQb2ludHMgPSBwb2ludE1hcC5nZXQoa2V5KSB8fCBbXTtcblxuICAgICAgICAgICAgaWYgKG92ZXJsYXBwaW5nUG9pbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVPdmVybGFwcGluZ1BvaW50c0hvdmVyKGV2ZW50LCBvdmVybGFwcGluZ1BvaW50cyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZVBvaW50SG92ZXIoZXZlbnQsIGQsIHNlcmllcywgc2VyaWVzLm9yaWdpbmFsSW5kZXgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmQzXG4gICAgICAgICAgICAgIC5zZWxlY3QoZXZlbnQudGFyZ2V0IGFzIFNWR0NpcmNsZUVsZW1lbnQpXG4gICAgICAgICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgICAgICAgLmR1cmF0aW9uKDE1MClcbiAgICAgICAgICAgICAgLmF0dHIoJ3InLCAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkucG9pbnRSYWRpdXMgPz8gNCkgKiAxLjUpXG4gICAgICAgICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAyKVxuICAgICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgYHJnYih2YXIoLS1heC1jb21wLWxpbmUtY2hhcnQtYmctY29sb3IpKWApO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9uKCdtb3VzZW1vdmUnLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KSlcbiAgICAgICAgICAub24oJ21vdXNlbGVhdmUnLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmQzXG4gICAgICAgICAgICAgIC5zZWxlY3QoZXZlbnQudGFyZ2V0IGFzIFNWR0NpcmNsZUVsZW1lbnQpXG4gICAgICAgICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgICAgICAgLmR1cmF0aW9uKDE1MClcbiAgICAgICAgICAgICAgLmF0dHIoJ3InLCB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5wb2ludFJhZGl1cyA/PyA0KVxuICAgICAgICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgMSlcbiAgICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZScsICcjZmZmJyk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAub24oJ2NsaWNrJywgKGV2ZW50OiBNb3VzZUV2ZW50LCBkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHggPSBnZXRYKGQpO1xuICAgICAgICAgICAgY29uc3QgeSA9IHRoaXMueVNjYWxlKGQueSk7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBgJHtNYXRoLnJvdW5kKHggKiAxMCkgLyAxMH0sJHtNYXRoLnJvdW5kKHkgKiAxMCkgLyAxMH1gO1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxhcHBpbmdQb2ludHMgPSBwb2ludE1hcC5nZXQoa2V5KSB8fCBbXTtcblxuICAgICAgICAgICAgaWYgKG92ZXJsYXBwaW5nUG9pbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgb3ZlcmxhcHBpbmdQb2ludHMuZm9yRWFjaCgoeyBwb2ludCwgc2VyaWVzIH0pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVBvaW50Q2xpY2soZXZlbnQsIHBvaW50LCBzZXJpZXMpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlUG9pbnRDbGljayhldmVudCwgZCwgc2VyaWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgICAuZGVsYXkoXG4gICAgICAgICAgICAoZDogYW55LCBpOiBudW1iZXIpID0+IGkgKiBNYXRoLm1pbig1MCwgKGFuaW1hdGlvbkR1cmF0aW9uIHx8IDApICogMC4wNSkgKyAoYW5pbWF0aW9uRHVyYXRpb24gfHwgMCkgKiAwLjUsXG4gICAgICAgICAgKVxuICAgICAgICAgIC5kdXJhdGlvbigoYW5pbWF0aW9uRHVyYXRpb24gfHwgMCkgKiAwLjMpXG4gICAgICAgICAgLmVhc2UoYW5pbWF0aW9uRWFzaW5nKVxuICAgICAgICAgIC5hdHRyKCdyJywgdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkucG9pbnRSYWRpdXMgPz8gNClcbiAgICAgICAgICAub24oJ2VuZCcsIChkLCBpLCBub2RlcykgPT4ge1xuICAgICAgICAgICAgaWYgKGkgPT09IG5vZGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgYW5pbWF0aW9uQ291bnRlcisrO1xuICAgICAgICAgICAgICBpZiAoYW5pbWF0aW9uQ291bnRlciA+PSB0b3RhbFZpc2libGVTZXJpZXNDb3VudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlUG9pbnRlckV2ZW50c0FmdGVyQW5pbWF0aW9uKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbmFibGVQb2ludGVyRXZlbnRzQWZ0ZXJBbmltYXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgYW5pbWF0aW9uRHVyYXRpb24gfHwgMCArIDEwMCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGVQb2ludGVyRXZlbnRzQWZ0ZXJBbmltYXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNoYXJ0IHx8ICF0aGlzLnN2ZykgcmV0dXJuO1xuICAgIHRoaXMuY2hhcnQuc2VsZWN0QWxsKCcuYXgtbGluZS1jaGFydC1hbGwtc2VyaWVzJykuYXR0cigncG9pbnRlci1ldmVudHMnLCAnYWxsJyk7XG4gICAgdGhpcy5jaGFydC5zZWxlY3RBbGwoJy5heC1saW5lLWNoYXJ0LXNlcmllcycpLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ2FsbCcpO1xuICAgIHRoaXMuY2hhcnQuc2VsZWN0QWxsKCcuYXgtbGluZS1jaGFydC1saW5lJykuYXR0cigncG9pbnRlci1ldmVudHMnLCAnYWxsJyk7XG4gICAgdGhpcy5jaGFydC5zZWxlY3RBbGwoJy5heC1saW5lLWNoYXJ0LWFyZWEnKS5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdhbGwnKTtcbiAgICB0aGlzLmNoYXJ0LnNlbGVjdEFsbCgnLmF4LWxpbmUtY2hhcnQtYWxsLXBvaW50cycpLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ2FsbCcpO1xuICAgIHRoaXMuY2hhcnQuc2VsZWN0QWxsKCcuYXgtbGluZS1jaGFydC1wb2ludHMnKS5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdhbGwnKTtcbiAgICB0aGlzLmNoYXJ0LnNlbGVjdEFsbCgnLmF4LWxpbmUtY2hhcnQtcG9pbnQnKS5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdhbGwnKTtcbiAgICB0aGlzLnN2Zy5jbGFzc2VkKCdheC1saW5lLWNoYXJ0LWFuaW1hdGluZycsIGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUG9pbnRHcm91cEVudGVyKG9yaWdpbmFsSW5kZXg6IG51bWJlciwgY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY2hhcnRcbiAgICAgIC5zZWxlY3QoYC5heC1saW5lLWNoYXJ0LXNlcmllcy0ke29yaWdpbmFsSW5kZXh9IC5heC1saW5lLWNoYXJ0LWxpbmVgKVxuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKDE1MClcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkubGluZVdpZHRoID8/IDIpICogMS41KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUG9pbnRHcm91cExlYXZlKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhcnRcbiAgICAgIC5zZWxlY3RBbGwoJy5heC1saW5lLWNoYXJ0LWxpbmUnKVxuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKDE1MClcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5saW5lV2lkdGggPz8gMik7XG5cbiAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd0Nyb3NzaGFpciA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5jaGFydC5zZWxlY3QoJy5heC1saW5lLWNoYXJ0LWNyb3NzaGFpcicpLnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVkdWNlZERhdGFQb2ludHMoXG4gICAgZGF0YTogQXJyYXk8eyB4OiBudW1iZXIgfCBzdHJpbmc7IHk6IG51bWJlciB9PixcbiAgICBtYXhQb2ludHM6IG51bWJlcixcbiAgKTogQXJyYXk8eyB4OiBudW1iZXIgfCBzdHJpbmc7IHk6IG51bWJlciB9PiB7XG4gICAgaWYgKGRhdGEubGVuZ3RoIDw9IG1heFBvaW50cykgcmV0dXJuIGRhdGE7XG4gICAgY29uc3QgcmVzdWx0OiBBcnJheTx7IHg6IG51bWJlciB8IHN0cmluZzsgeTogbnVtYmVyIH0+ID0gW107XG4gICAgY29uc3Qgc3RlcCA9IE1hdGguY2VpbChkYXRhLmxlbmd0aCAvIG1heFBvaW50cyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArPSBzdGVwKSB7XG4gICAgICByZXN1bHQucHVzaChkYXRhW2ldKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gIT09IGRhdGFbZGF0YS5sZW5ndGggLSAxXSkge1xuICAgICAgcmVzdWx0LnB1c2goZGF0YVtkYXRhLmxlbmd0aCAtIDFdKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUG9pbnRIb3ZlcihcbiAgICBldmVudDogTW91c2VFdmVudCxcbiAgICBkYXRhUG9pbnQ6IEFYTGluZUNoYXJ0RGF0YVsnZGF0YSddW251bWJlcl0sXG4gICAgc2VyaWVzOiBBWExpbmVDaGFydERhdGEgJiB7IG9yaWdpbmFsSW5kZXg6IG51bWJlciB9LFxuICAgIG9yaWdpbmFsSW5kZXg6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgY29sb3IgPSBzZXJpZXMubGluZUNvbG9yIHx8IGdldENoYXJ0Q29sb3Iob3JpZ2luYWxJbmRleCwgdGhpcy5jaGFydENvbG9ycyk7XG5cbiAgICAgIHRoaXMuX3Rvb2x0aXBEYXRhLnNldCh7XG4gICAgICAgIHRpdGxlOiBkYXRhUG9pbnQudG9vbHRpcExhYmVsIHx8IHNlcmllcy50b29sdGlwTGFiZWwgfHwgc2VyaWVzLmxhYmVsIHx8IGBTZXJpZXMgJHtvcmlnaW5hbEluZGV4ICsgMX1gLFxuICAgICAgICB2YWx1ZTogZGF0YVBvaW50LnkudG9TdHJpbmcoKSxcbiAgICAgICAgY29sb3I6IGNvbG9yLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldCh0cnVlKTtcbiAgICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcblxuICAgICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dDcm9zc2hhaXIgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5zaG93Q3Jvc3NoYWlyTGluZXMoZGF0YVBvaW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3dDcm9zc2hhaXJMaW5lcyhkYXRhUG9pbnQ6IHsgeDogbnVtYmVyIHwgc3RyaW5nOyB5OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGNvbnN0IGlzQmFuZFNjYWxlID0gdGhpcy54U2NhbGUuYmFuZHdpZHRoICE9PSB1bmRlZmluZWQ7XG5cbiAgICBsZXQgeDogbnVtYmVyO1xuICAgIGlmIChpc0JhbmRTY2FsZSkge1xuICAgICAgeCA9IHRoaXMueFNjYWxlKFN0cmluZyhkYXRhUG9pbnQueCkpICsgdGhpcy54U2NhbGUuYmFuZHdpZHRoKCkgLyAyO1xuICAgIH0gZWxzZSB7XG4gICAgICB4ID0gdGhpcy54U2NhbGUoZGF0YVBvaW50LnggYXMgbnVtYmVyKTtcbiAgICB9XG4gICAgY29uc3QgeSA9IHRoaXMueVNjYWxlKGRhdGFQb2ludC55KTtcblxuICAgIGxldCBjcm9zc2hhaXJHcm91cCA9IHRoaXMuY2hhcnQuc2VsZWN0KCcuYXgtbGluZS1jaGFydC1jcm9zc2hhaXInKTtcbiAgICBpZiAoY3Jvc3NoYWlyR3JvdXAuZW1wdHkoKSkge1xuICAgICAgY3Jvc3NoYWlyR3JvdXAgPSB0aGlzLmNoYXJ0LmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtY3Jvc3NoYWlyJykuYXR0cigncG9pbnRlci1ldmVudHMnLCAnbm9uZScpO1xuICAgIH1cblxuICAgIGNyb3NzaGFpckdyb3VwLnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpO1xuXG4gICAgY3Jvc3NoYWlyR3JvdXBcbiAgICAgIC5hcHBlbmQoJ2xpbmUnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtY3Jvc3NoYWlyLXZlcnRpY2FsJylcbiAgICAgIC5hdHRyKCd4MScsIHgpXG4gICAgICAuYXR0cigneTEnLCAwKVxuICAgICAgLmF0dHIoJ3gyJywgeClcbiAgICAgIC5hdHRyKCd5MicsIHRoaXMuaGVpZ2h0KVxuICAgICAgLmF0dHIoJ3N0cm9rZScsICdyZ2JhKHZhcigtLWF4LWNvbXAtbGluZS1jaGFydC1ncmlkLWxpbmVzLWNvbG9yKSwgMC41KScpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgMSlcbiAgICAgIC5hdHRyKCdzdHJva2UtZGFzaGFycmF5JywgJzMsMycpXG4gICAgICAuYXR0cignb3BhY2l0eScsIDAuNylcbiAgICAgIC5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7XG5cbiAgICBjcm9zc2hhaXJHcm91cFxuICAgICAgLmFwcGVuZCgnbGluZScpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1jcm9zc2hhaXItaG9yaXpvbnRhbCcpXG4gICAgICAuYXR0cigneDEnLCAwKVxuICAgICAgLmF0dHIoJ3kxJywgeSlcbiAgICAgIC5hdHRyKCd4MicsIHRoaXMud2lkdGgpXG4gICAgICAuYXR0cigneTInLCB5KVxuICAgICAgLmF0dHIoJ3N0cm9rZScsICdyZ2JhKHZhcigtLWF4LWNvbXAtbGluZS1jaGFydC1ncmlkLWxpbmVzLWNvbG9yKSwgMC41KScpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgMSlcbiAgICAgIC5hdHRyKCdzdHJva2UtZGFzaGFycmF5JywgJzMsMycpXG4gICAgICAuYXR0cignb3BhY2l0eScsIDAuNylcbiAgICAgIC5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lckVsID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFjb250YWluZXJFbCkgcmV0dXJuO1xuICAgIGNvbnN0IHJlY3QgPSBjb250YWluZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB0b29sdGlwRWwgPSBjb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcuY2hhcnQtdG9vbHRpcCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBjb25zdCB0b29sdGlwUmVjdCA9IHRvb2x0aXBFbCA/IHRvb2x0aXBFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG51bGw7XG4gICAgY29uc3QgcG9zID0gY29tcHV0ZVRvb2x0aXBQb3NpdGlvbihyZWN0LCB0b29sdGlwUmVjdCwgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgdGhpcy5UT09MVElQX0dBUCk7XG4gICAgdGhpcy5fdG9vbHRpcFBvc2l0aW9uLnNldChwb3MpO1xuICB9XG5cbiAgLy8gY29tcHV0ZVRvb2x0aXBQb3NpdGlvbiBtb3ZlZCB0byBzaGFyZWQgY2hhcnQgdXRpbHNcblxuICBwcml2YXRlIGhhbmRsZVBvaW50Q2xpY2soXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgZGF0YVBvaW50OiBBWExpbmVDaGFydERhdGFbJ2RhdGEnXVtudW1iZXJdLFxuICAgIHNlcmllczogQVhMaW5lQ2hhcnREYXRhICYgeyBvcmlnaW5hbEluZGV4OiBudW1iZXIgfSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5wb2ludENsaWNrLmVtaXQoe1xuICAgICAgc2VyaWVzOiBzZXJpZXMsIC8vIHNlcmllcyBzdGlsbCByZWZlcnMgdG8gdGhlIGZ1bGwgc2VyaWVzIGRhdGEgd2l0aCBvcmlnaW5hbEluZGV4XG4gICAgICBwb2ludDogZGF0YVBvaW50LFxuICAgICAgZXZlbnQ6IHtcbiAgICAgICAgbmF0aXZlRXZlbnQ6IGV2ZW50LFxuICAgICAgICBzZW5kZXI6IHRoaXMsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93Tm9EYXRhTWVzc2FnZShjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBvbmx5IGNoYXJ0IFNWRyBhbmQgcHJldmlvdXMgZW1wdHktc3RhdGUgbWVzc2FnZXMgdG8gYXZvaWQgcmVtb3ZpbmcgdG9vbHRpcFxuICAgIHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoY29udGFpbmVyRWxlbWVudClcbiAgICAgIC5zZWxlY3RBbGwoJ3N2ZywgLmF4LWxpbmUtY2hhcnQtbm8tZGF0YS1tZXNzYWdlLCAuYXgtbGluZS1jaGFydC1hbGwtaGlkZGVuLW1lc3NhZ2UnKVxuICAgICAgLnJlbW92ZSgpO1xuICAgIGNvbnN0IG1lc3NhZ2VDb250YWluZXIgPSB0aGlzLmQzXG4gICAgICAuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtbm8tZGF0YS1tZXNzYWdlJylcbiAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgLnN0eWxlKCdsZWZ0JywgJzUwJScpXG4gICAgICAuc3R5bGUoJ3RvcCcsICc1MCUnKVxuICAgICAgLnN0eWxlKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKC01MCUsIC01MCUpJyk7XG5cbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtbm8tZGF0YS1pY29uJylcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwLjYnKVxuICAgICAgLnN0eWxlKCdtYXJnaW4tYm90dG9tJywgJzAuNzVyZW0nKVxuICAgICAgLmh0bWwoYDxpIGNsYXNzPVwiJHt0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCkubm9EYXRhSWNvbn0gZmEtMnhcIj48L2k+YCk7XG5cbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtbm8tZGF0YS10ZXh0JylcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJzFyZW0nKVxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc2MDAnKVxuICAgICAgLnN0eWxlKCdtYXJnaW4tYm90dG9tJywgJzAuNXJlbScpXG4gICAgICAudGV4dCh0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCkubm9EYXRhKTtcblxuICAgIG1lc3NhZ2VDb250YWluZXJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1uby1kYXRhLWhlbHAnKVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnMC44cmVtJylcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwLjYnKVxuICAgICAgLnRleHQodGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLm5vRGF0YUhlbHApO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93QWxsU2VyaWVzSGlkZGVuTWVzc2FnZShjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBvbmx5IGNoYXJ0IFNWRyBhbmQgcHJldmlvdXMgZW1wdHktc3RhdGUgbWVzc2FnZXMgdG8gYXZvaWQgcmVtb3ZpbmcgdG9vbHRpcFxuICAgIHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoY29udGFpbmVyRWxlbWVudClcbiAgICAgIC5zZWxlY3RBbGwoJ3N2ZywgLmF4LWxpbmUtY2hhcnQtbm8tZGF0YS1tZXNzYWdlLCAuYXgtbGluZS1jaGFydC1hbGwtaGlkZGVuLW1lc3NhZ2UnKVxuICAgICAgLnJlbW92ZSgpO1xuICAgIGNvbnN0IG1lc3NhZ2VDb250YWluZXIgPSB0aGlzLmQzXG4gICAgICAuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtYWxsLWhpZGRlbi1tZXNzYWdlJykgLy8gRGlmZmVyZW50IGNsYXNzXG4gICAgICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcbiAgICAgIC5zdHlsZSgnbGVmdCcsICc1MCUnKVxuICAgICAgLnN0eWxlKCd0b3AnLCAnNTAlJylcbiAgICAgIC5zdHlsZSgndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKScpO1xuXG4gICAgbWVzc2FnZUNvbnRhaW5lclxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWFsbC1oaWRkZW4taWNvbicpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAnMC42JylcbiAgICAgIC5zdHlsZSgnbWFyZ2luLWJvdHRvbScsICcwLjc1cmVtJylcbiAgICAgIC5odG1sKGA8aSBjbGFzcz1cIiR7dGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLmFsbEhpZGRlbkljb259IGZhLTJ4XCI+PC9pPmApOyAvLyBEaWZmZXJlbnQgaWNvblxuXG4gICAgbWVzc2FnZUNvbnRhaW5lclxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWFsbC1oaWRkZW4tdGV4dCcpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxcmVtJylcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNjAwJylcbiAgICAgIC5zdHlsZSgnbWFyZ2luLWJvdHRvbScsICcwLjVyZW0nKVxuICAgICAgLnRleHQodGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLmFsbEhpZGRlbik7XG5cbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtYWxsLWhpZGRlbi1oZWxwJylcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJzAuOHJlbScpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAnMC42JylcbiAgICAgIC50ZXh0KHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKS5hbGxIaWRkZW5IZWxwKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlT3ZlcmxhcHBpbmdQb2ludHNIb3ZlcihcbiAgICBldmVudDogTW91c2VFdmVudCxcbiAgICBvdmVybGFwcGluZ1BvaW50czogQXJyYXk8e1xuICAgICAgcG9pbnQ6IGFueTtcbiAgICAgIHNlcmllczogQVhMaW5lQ2hhcnREYXRhICYgeyBvcmlnaW5hbEluZGV4OiBudW1iZXIgfTtcbiAgICAgIG9yaWdpbmFsSW5kZXg6IG51bWJlcjtcbiAgICB9PixcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgdG9vbHRpcERhdGE6IEFYQ2hhcnRUb29sdGlwRGF0YSA9IHtcbiAgICAgIHRpdGxlOiBvdmVybGFwcGluZ1BvaW50cy5tYXAoKHsgc2VyaWVzIH0pID0+IHNlcmllcy5sYWJlbCksXG4gICAgICB2YWx1ZTogb3ZlcmxhcHBpbmdQb2ludHNbMF0ucG9pbnQueS50b1N0cmluZygpLFxuICAgICAgY29sb3I6IG92ZXJsYXBwaW5nUG9pbnRzLm1hcChcbiAgICAgICAgKHsgc2VyaWVzIH0pID0+IHNlcmllcy5saW5lQ29sb3IgfHwgZ2V0Q2hhcnRDb2xvcihzZXJpZXMub3JpZ2luYWxJbmRleCwgdGhpcy5jaGFydENvbG9ycyksXG4gICAgICApLFxuICAgIH07XG5cbiAgICB0aGlzLl90b29sdGlwRGF0YS5zZXQodG9vbHRpcERhdGEpO1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldCh0cnVlKTtcbiAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG5cbiAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd0Nyb3NzaGFpciA9PT0gdHJ1ZSAmJiBvdmVybGFwcGluZ1BvaW50cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNob3dDcm9zc2hhaXJMaW5lcyhvdmVybGFwcGluZ1BvaW50c1swXS5wb2ludCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFYXNpbmdGdW5jdGlvbihlYXNpbmc/OiBzdHJpbmcpOiBhbnkge1xuICAgIHN3aXRjaCAoZWFzaW5nKSB7XG4gICAgICBjYXNlICdsaW5lYXInOlxuICAgICAgICByZXR1cm4gdGhpcy5kMy5lYXNlTGluZWFyO1xuICAgICAgY2FzZSAnZWFzZSc6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VQb2x5SW5PdXQ7XG4gICAgICBjYXNlICdlYXNlLWluJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZDMuZWFzZVBvbHlJbjtcbiAgICAgIGNhc2UgJ2Vhc2Utb3V0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZDMuZWFzZVBvbHlPdXQ7XG4gICAgICBjYXNlICdlYXNlLWluLW91dCc6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VQb2x5SW5PdXQ7XG4gICAgICBjYXNlICdjdWJpYyc6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VDdWJpYztcbiAgICAgIGNhc2UgJ2N1YmljLWluJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZDMuZWFzZUN1YmljSW47XG4gICAgICBjYXNlICdjdWJpYy1vdXQnOlxuICAgICAgICByZXR1cm4gdGhpcy5kMy5lYXNlQ3ViaWNPdXQ7XG4gICAgICBjYXNlICdjdWJpYy1pbi1vdXQnOlxuICAgICAgICByZXR1cm4gdGhpcy5kMy5lYXNlQ3ViaWNJbk91dDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VDdWJpY091dDtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJheC1saW5lLWNoYXJ0XCIgI2NoYXJ0Q29udGFpbmVyPlxuICA8IS0tIFNoYXJlZCB0b29sdGlwIGNvbXBvbmVudCAtLT5cbiAgPGF4LWNoYXJ0LXRvb2x0aXBcbiAgICBbdmlzaWJsZV09XCJ0b29sdGlwVmlzaWJsZSgpXCJcbiAgICBbcG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uKClcIlxuICAgIFtkYXRhXT1cInRvb2x0aXBEYXRhKClcIlxuICAgIFtzaG93UGVyY2VudGFnZV09XCJmYWxzZVwiXG4gID48L2F4LWNoYXJ0LXRvb2x0aXA+XG48L2Rpdj5cbiJdfQ==","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1saW5lLWNoYXJ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2xpbmUtY2hhcnQvc3JjL2Fjb3JleC1jaGFydHMtbGluZS1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-charts-line-chart.mjs","sources":["../../../../packages/charts/line-chart/src/lib/line-chart.config.ts","../../../../packages/charts/line-chart/src/lib/line-chart.component.ts","../../../../packages/charts/line-chart/src/lib/line-chart.component.html","../../../../packages/charts/line-chart/src/acorex-charts-line-chart.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { AXLineChartOption } from './line-chart.type';\n\nexport const AXLineChartDefaultConfig: AXLineChartOption = {\n margins: {\n top: 20,\n right: 25,\n bottom: 40,\n left: 50,\n },\n showXAxis: true,\n showYAxis: true,\n showGrid: true,\n showVerticalGrid: false,\n yAxisStartsAtZero: true,\n axisPadding: 5,\n showTooltip: true,\n lineWidth: 2,\n showPoints: true,\n pointRadius: 4,\n smoothLine: false,\n fillArea: false,\n fillOpacity: 20,\n showCrosshair: false,\n animationDuration: 1000,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All series are hidden',\n allHiddenHelp: 'Click legend items to show series in the chart',\n noDataIcon: 'fa-light fa-chart-line',\n allHiddenIcon: 'fa-light fa-eye-slash',\n },\n};\n\nexport const AX_LINE_CHART_CONFIG = new InjectionToken<AXLineChartOption>('AX_LINE_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXLineChartDefaultConfig,\n});\n\nexport type PartialLineChartConfig = Partial<AXLineChartOption>;\n\nexport function lineChartConfig(config: PartialLineChartConfig = {}): AXLineChartOption {\n const result = {\n ...AXLineChartDefaultConfig,\n ...config,\n };\n return result;\n}\n","import {\n AX_CHART_COLOR_PALETTE,\n AXChartComponent,\n AXChartComponentBase,\n computeTooltipPosition,\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 AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n OnInit,\n output,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport type * as d3 from 'd3';\nimport { AX_LINE_CHART_CONFIG } from './line-chart.config';\nimport { AXLineChartData, AXLineChartOption, AXLineChartPointClickEvent, AXLineChartValue } from './line-chart.type';\n\n/**\n * Line Chart Component for rendering data as lines with interactive hover effects and animations\n */\n@Component({\n selector: 'ax-line-chart',\n templateUrl: './line-chart.component.html',\n styleUrls: ['./line-chart.component.scss'],\n standalone: true,\n encapsulation: ViewEncapsulation.None,\n imports: [AXChartTooltipComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXLineChartComponent\n extends AXChartComponent\n implements OnInit, AfterViewInit, OnDestroy, AXChartLegendCompatible, AXChartComponentBase\n{\n data = input<AXLineChartValue>([]);\n options = input<AXLineChartOption>({});\n pointClick = output<AXLineChartPointClickEvent>();\n\n private readonly chartContainerEl = viewChild.required<ElementRef<HTMLDivElement>>('chartContainer');\n protected d3!: typeof import('d3');\n\n private svg!: d3.Selection<SVGSVGElement, unknown, null, undefined>;\n private chart!: d3.Selection<SVGGElement, unknown, null, undefined>;\n private xScale!: d3.ScaleLinear<number, number> | d3.ScaleBand<string>;\n private yScale!: d3.ScaleLinear<number, number>;\n private xAxis!: d3.Selection<SVGGElement, unknown, null, undefined>;\n private yAxis!: d3.Selection<SVGGElement, unknown, null, undefined>;\n\n private width!: number;\n private height!: number;\n private margin = { top: 20, right: 25, bottom: 40, left: 50 };\n\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 private _initialized = signal(false);\n private _rendered = signal(false);\n private hiddenSeries = new Set<string>();\n private _fullNormalizedData: (AXLineChartData & { originalIndex: number })[] = [];\n\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_LINE_CHART_CONFIG);\n\n // Inject the chart colors\n private chartColors = inject(AX_CHART_COLOR_PALETTE);\n\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 series are hidden',\n allHiddenHelp: 'Click legend items to show series in the chart',\n noDataIcon: 'fa-light fa-chart-line',\n allHiddenIcon: 'fa-light fa-eye-slash',\n };\n return {\n ...defaultMessages,\n ...this.effectiveOptions().messages,\n };\n });\n\n // Layout & Dimensions\n private readonly MIN_DIMENSION = 100;\n private readonly MIN_CONTAINER_DIMENSION = 200;\n private readonly DEFAULT_MARGIN_TOP = 20;\n private readonly DEFAULT_MARGIN_RIGHT = 25;\n private readonly DEFAULT_MARGIN_BOTTOM = 40;\n private readonly DEFAULT_MARGIN_LEFT = 50;\n private readonly MIN_MARGIN_BOTTOM = 45;\n private readonly MIN_MARGIN_LEFT = 55;\n private readonly MAX_EXTRA_MARGIN = 60;\n\n // Styling & Visual\n private readonly DEFAULT_LINE_WIDTH = 2;\n private readonly DEFAULT_POINT_RADIUS = 4;\n private readonly DEFAULT_FILL_OPACITY = 20;\n private readonly LINE_HIGHLIGHT_MULTIPLIER = 1.5;\n private readonly POINT_HIGHLIGHT_MULTIPLIER = 1.5;\n private readonly POINT_STROKE_WIDTH = 1;\n private readonly POINT_HOVER_STROKE_WIDTH = 2;\n private readonly GRID_DASH_ARRAY = '2,2';\n private readonly CROSSHAIR_DASH_ARRAY = '3,3';\n private readonly CROSSHAIR_OPACITY = 0.7;\n\n // Animation\n private readonly HOVER_TRANSITION_DURATION = 150;\n private readonly ANIMATION_END_BUFFER = 100;\n private readonly POINT_ANIMATION_DELAY_MS = 50;\n private readonly POINT_ANIMATION_DELAY_RATIO = 0.5;\n private readonly POINT_ANIMATION_DURATION_RATIO = 0.3;\n\n // Text & Labels\n private readonly AXIS_LABEL_FONT_SIZE = 14;\n private readonly CHAR_WIDTH_RATIO = 0.6;\n private readonly FONT_WIDTH_MULTIPLIER = 0.6;\n private readonly MAX_LABEL_LENGTH = 20;\n private readonly MIN_FONT_SIZE_X = 11;\n private readonly MAX_FONT_SIZE_X = 15;\n private readonly MIN_FONT_SIZE_Y = 11;\n private readonly MAX_FONT_SIZE_Y = 15;\n private readonly FONT_PADDING = 10;\n private readonly Y_AXIS_PADDING = 10;\n\n // Data & Performance\n private readonly MAX_POINTS_TO_RENDER = 100;\n private readonly POINT_COORDINATE_PRECISION = 10;\n private readonly MANY_ITEMS_THRESHOLD = 20;\n private readonly VERY_MANY_ITEMS_THRESHOLD = 50;\n\n // Tooltip\n private readonly TOOLTIP_GAP = 10;\n\n /**\n * Normalizes input data to consistent array format with originalIndex\n */\n private normalizeData(rawData: AXLineChartValue): (AXLineChartData & { originalIndex: number })[] {\n if (Array.isArray(rawData)) {\n return rawData.map((s, i) => ({ ...s, originalIndex: i }));\n }\n if (rawData && 'data' in rawData) {\n return [{ ...rawData, originalIndex: 0 }];\n }\n return [];\n }\n\n /**\n * Gets unique identifier for a series\n */\n private getSeriesIdentifier(series: AXLineChartData & { originalIndex: number }): string {\n return series.id || series.label || `series-${series.originalIndex}`;\n }\n\n /**\n * Calculates dynamic font size based on available space\n */\n private calculateDynamicFontSize(dimension: number, divisor: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, Math.round(dimension / divisor)));\n }\n\n /**\n * Creates a unique key for point coordinates (for overlap detection)\n */\n private createPointKey(x: number, y: number): string {\n const precision = this.POINT_COORDINATE_PRECISION;\n return `${Math.round(x * precision) / precision},${Math.round(y * precision) / precision}`;\n }\n\n /**\n * Removes series elements from the chart\n */\n private removeSeriesElements(seriesIdentifier: string): void {\n this.chart.selectAll(`.ax-line-chart-series[data-series-identifier=\"${seriesIdentifier}\"]`).remove();\n this.chart.selectAll(`.ax-line-chart-points[data-series-identifier=\"${seriesIdentifier}\"]`).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 * Calculates maximum width needed for Y-axis tick labels\n */\n private calculateMaxYAxisTickLabelWidth(): number {\n const allSeriesData = this._fullNormalizedData.filter((s) => !this.hiddenSeries.has(this.getSeriesIdentifier(s)));\n\n let maxValue = 0;\n let minValue = 0;\n\n for (const series of allSeriesData) {\n if (series.data && series.data.length > 0) {\n for (const point of series.data) {\n if (typeof point.y === 'number') {\n maxValue = Math.max(maxValue, point.y);\n minValue = Math.min(minValue, point.y);\n }\n }\n }\n }\n\n // Check both max and min (for negative values)\n const maxAbsValue = Math.max(Math.abs(maxValue), Math.abs(minValue));\n const tickLabelText = Number.isFinite(maxAbsValue) ? formatLargeNumber(maxAbsValue) : '00000';\n\n return tickLabelText.length * this.AXIS_LABEL_FONT_SIZE * this.FONT_WIDTH_MULTIPLIER + this.FONT_PADDING;\n }\n\n ngOnInit(): void {\n this.loadD3();\n }\n\n #effect = effect(() => {\n this._fullNormalizedData = this.normalizeData(this.data());\n this.effectiveOptions();\n\n if (this._rendered()) {\n this.updateChart();\n }\n });\n\n ngAfterViewInit(): void {\n this._initialized.set(true);\n if (this.d3 && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n }\n\n ngOnDestroy(): void {\n this.cleanupChart();\n }\n\n // AXChartLegendCompatible Implementation\n getLegendItems(): AXChartLegendItem[] {\n const totalSum = this._fullNormalizedData.reduce((sum, series) => {\n return sum + series.data.reduce((sSum, p) => sSum + p.y, 0);\n }, 0);\n\n return this._fullNormalizedData.map((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n const seriesSum = series.data.reduce((sum, p) => sum + p.y, 0);\n const percentage = totalSum > 0 ? (seriesSum / totalSum) * 100 : 0;\n return {\n id: seriesIdentifier,\n name: series.label || `Series ${series.originalIndex + 1}`,\n value: seriesSum,\n color: series.lineColor || getChartColor(series.originalIndex, this.chartColors),\n hidden: this.hiddenSeries.has(seriesIdentifier),\n percentage: parseFloat(percentage.toFixed(2)),\n };\n });\n }\n\n highlightSegment(id: string | null): void {\n if (!this.svg) return;\n\n const allSeriesGroups = this.svg.selectAll('g.ax-line-chart-series');\n const allPointsGroups = this.svg.selectAll('g.ax-line-chart-points');\n\n if (id === null) {\n allSeriesGroups.classed('ax-chart-dimmed', false).style('opacity', 1);\n allPointsGroups.classed('ax-chart-dimmed', false).style('opacity', 1);\n\n allSeriesGroups\n .selectAll('.ax-line-chart-line')\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH)\n .classed('ax-chart-highlighted-path', false);\n allPointsGroups\n .selectAll('circle.ax-line-chart-point')\n .attr('r', this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS)\n .classed('ax-chart-highlighted-point', false);\n return;\n }\n\n allSeriesGroups.classed('ax-chart-dimmed', true).style('opacity', 0.3);\n allPointsGroups.classed('ax-chart-dimmed', true).style('opacity', 0.3);\n\n const targetSeriesGroup = this.svg.selectAll(`g.ax-line-chart-series[data-series-identifier=\"${id}\"]`);\n const targetPointsGroup = this.svg.selectAll(`g.ax-line-chart-points[data-series-identifier=\"${id}\"]`);\n\n targetSeriesGroup.classed('ax-chart-dimmed', false).style('opacity', 1);\n targetPointsGroup.classed('ax-chart-dimmed', false).style('opacity', 1);\n\n targetSeriesGroup\n .selectAll('.ax-line-chart-line')\n .attr(\n 'stroke-width',\n (this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH) * this.LINE_HIGHLIGHT_MULTIPLIER,\n )\n .classed('ax-chart-highlighted-path', true);\n\n targetPointsGroup\n .selectAll('circle.ax-line-chart-point')\n .attr('r', (this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS) * this.POINT_HIGHLIGHT_MULTIPLIER)\n .classed('ax-chart-highlighted-path', true);\n }\n\n toggleSegment(id: string): boolean {\n if (this.hiddenSeries.has(id)) {\n this.hiddenSeries.delete(id);\n } else {\n this.hiddenSeries.add(id);\n }\n this.updateChart();\n return !this.hiddenSeries.has(id);\n }\n\n protected async loadD3(): Promise<void> {\n try {\n this.d3 = await import('d3');\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 public createChart(): void {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement) return;\n\n const containerElement = this.chartContainerEl().nativeElement;\n const allSeriesData = this._fullNormalizedData;\n\n // Clear previous SVG and any empty-state messages (preserve tooltip component)\n this.d3\n .select(containerElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n\n if (allSeriesData.length === 0 || allSeriesData.every((series) => !series.data || series.data.length === 0)) {\n this.showNoDataMessage(containerElement);\n return;\n }\n\n const visibleDataForRendering = allSeriesData.filter(\n (series) => !this.hiddenSeries.has(this.getSeriesIdentifier(series)),\n );\n\n if (visibleDataForRendering.length === 0) {\n // All data is present, but all series are hidden by the legend\n this.showAllSeriesHiddenMessage(containerElement);\n // Still setup basic SVG and chart group for consistency if needed, or return\n // For now, we will show the message and return, as scales/axes can't be drawn.\n return;\n }\n\n const chartOptions = this.effectiveOptions();\n this.setupDimensions(containerElement, chartOptions);\n\n // Use allSeriesData for domain calculation to keep scales consistent\n const dataForScaleSetup = allSeriesData.filter((s) => s.data && s.data.length > 0);\n if (dataForScaleSetup.length === 0) {\n this.showNoDataMessage(containerElement);\n return;\n }\n this.setupScales(dataForScaleSetup);\n this.createAxes(chartOptions);\n this.renderLines(allSeriesData); // RenderLines will handle hiding based on hiddenSeries\n }\n\n public updateChart(): void {\n this.createChart();\n }\n\n public cleanupChart(): void {\n if (this.svg) {\n this.d3?.select(this.chartContainerEl()?.nativeElement).selectAll('svg').remove();\n this.svg = null;\n this.chart = null;\n }\n this._tooltipVisible.set(false);\n }\n\n private setupDimensions(containerElement: HTMLElement, options: AXLineChartOption): void {\n this.calculateMargins(options, containerElement.clientWidth);\n\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n const minDim = Math.min(this.MIN_CONTAINER_DIMENSION, containerWidth, containerHeight);\n\n if (options.width && options.height) {\n this.width = options.width - this.margin.left - this.margin.right;\n this.height = options.height - this.margin.top - this.margin.bottom;\n } else {\n this.width = Math.max(containerWidth, minDim) - this.margin.left - this.margin.right;\n this.height = Math.max(containerHeight, minDim) - this.margin.top - this.margin.bottom;\n }\n\n this.width = Math.max(this.width, this.MIN_DIMENSION);\n this.height = Math.max(this.height, this.MIN_DIMENSION);\n\n const totalWidth = this.width + this.margin.left + this.margin.right;\n const totalHeight = this.height + this.margin.top + this.margin.bottom;\n\n const svg = this.d3\n .select(containerElement)\n .append('svg')\n .attr('width', totalWidth)\n .attr('height', totalHeight)\n .attr('viewBox', `0 0 ${totalWidth} ${totalHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet')\n .attr(\n 'style',\n `\n width: ${totalWidth}px;\n height: ${totalHeight}px;\n max-width: 100%;\n max-height: 100%;\n overflow: visible;\n `,\n );\n\n this.svg = svg;\n this.chart = this.svg.append('g').attr('transform', `translate(${this.margin.left},${this.margin.top})`);\n }\n\n private calculateMargins(options: AXLineChartOption, containerWidth: number): void {\n this.margin = {\n top: options.margins?.top ?? this.DEFAULT_MARGIN_TOP,\n right: options.margins?.right ?? this.DEFAULT_MARGIN_RIGHT,\n bottom: options.margins?.bottom ?? this.DEFAULT_MARGIN_BOTTOM,\n left: options.margins?.left ?? this.DEFAULT_MARGIN_LEFT,\n };\n\n const allDataPoints = this._fullNormalizedData.flatMap((series) => series.data);\n if (allDataPoints.length > 0) {\n const allNumericX = allDataPoints.every((d) => typeof d.x === 'number');\n\n if (!allNumericX) {\n const visibleSeries = this._fullNormalizedData.filter(\n (s) => !this.hiddenSeries.has(this.getSeriesIdentifier(s)),\n );\n const allXValues = new Set(visibleSeries.flatMap((series) => series.data.map((d) => String(d.x))));\n const labelCount = allXValues.size;\n\n if (labelCount > 0 && containerWidth > 0) {\n const workingWidth = containerWidth - this.margin.left - this.margin.right;\n if (workingWidth > 0) {\n const availableWidthPerLabel = workingWidth / labelCount;\n const labels = Array.from(allXValues);\n const longestLabel = labels.reduce((a, b) => (a.length > b.length ? a : b), '');\n\n const estimatedFontSize = this.calculateDynamicFontSize(\n workingWidth,\n 45,\n this.MIN_FONT_SIZE_X,\n this.MAX_FONT_SIZE_X,\n );\n\n // Account for label truncation in width calculation\n const maxLabelLength = labelCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n const effectiveLabelLength = Math.min(longestLabel.length, maxLabelLength);\n const estimatedLongestLabelWidth = effectiveLabelLength * estimatedFontSize * this.CHAR_WIDTH_RATIO;\n\n if (estimatedLongestLabelWidth > availableWidthPerLabel) {\n // Calculate diagonal height when rotated -45 degrees\n const diagonalHeight = estimatedLongestLabelWidth * Math.sin(Math.PI / 4);\n const requiredExtraMargin = diagonalHeight + 15; // Extra padding for safety\n this.margin.bottom += Math.min(this.MAX_EXTRA_MARGIN, requiredExtraMargin);\n }\n }\n }\n }\n }\n\n if (options.xAxisLabel) {\n const xLabelLength = options.xAxisLabel.length;\n const extraBottomMargin = Math.min(20, Math.max(10, xLabelLength * 0.8));\n this.margin.bottom = Math.max(this.margin.bottom, 40 + extraBottomMargin);\n }\n\n if (options.yAxisLabel) {\n // Calculate space needed for Y-axis: tick labels + padding + title\n const maxTickLabelWidth = this.calculateMaxYAxisTickLabelWidth();\n const yAxisTitleThickness = 20; // Height of rotated title text\n const yAxisTitlePadding = this.Y_AXIS_PADDING;\n const totalYAxisWidth = maxTickLabelWidth + yAxisTitlePadding + yAxisTitleThickness;\n\n this.margin.left = Math.max(this.margin.left, totalYAxisWidth);\n } else if (options.showYAxis !== false) {\n // Just tick labels, no title\n const maxTickLabelWidth = this.calculateMaxYAxisTickLabelWidth();\n this.margin.left = Math.max(this.margin.left, maxTickLabelWidth + 10);\n }\n\n if (options.showXAxis !== false) {\n this.margin.bottom = Math.max(this.margin.bottom, this.MIN_MARGIN_BOTTOM);\n }\n\n if (options.showYAxis !== false) {\n this.margin.left = Math.max(this.margin.left, this.MIN_MARGIN_LEFT);\n }\n }\n\n private setupScales(data: (AXLineChartData & { originalIndex: number })[]): void {\n // Expects already filtered data for scales\n const chartOptions = this.effectiveOptions();\n const padding = chartOptions.axisPadding ?? 0;\n const paddingMultiplier = padding / 100;\n\n // Ensure data is not empty for scale domain calculation\n const allDataPoints = data.length > 0 ? data.flatMap((series) => series.data) : [{ x: 0, y: 0 }];\n if (allDataPoints.length === 0) {\n // Should ideally not happen if createChart filters correctly\n allDataPoints.push({ x: 0, y: 0 }); // Default fallback to prevent crash with empty domain\n }\n\n const allNumericX = allDataPoints.every((d) => typeof d.x === 'number');\n\n if (allNumericX) {\n const xMax = this.d3.max(allDataPoints, (d) => d.x as number) ?? 0;\n\n if (xMax === 0) {\n // If all values are 0, show -1 to 1 range\n this.xScale = this.d3\n .scaleLinear()\n .domain([-1, 1])\n .range([0, this.width]);\n } else {\n // Always start X axis from 0 for numeric data\n this.xScale = this.d3.scaleLinear().domain([0, xMax]).range([0, this.width]);\n }\n } else {\n this.xScale = this.d3\n .scaleBand()\n .domain(allDataPoints.map((d) => String(d.x)))\n .range([0, this.width])\n .paddingInner(0.2)\n .paddingOuter(0);\n }\n\n const yAxisStartsAtZero = chartOptions.yAxisStartsAtZero !== false;\n let yMin = this.d3.min(allDataPoints, (d) => d.y) ?? 0;\n if (yAxisStartsAtZero) {\n yMin = Math.min(0, yMin);\n }\n const yMax = this.d3.max(allDataPoints, (d) => d.y) ?? 0;\n const yRange = yMax - yMin;\n\n this.yScale = this.d3\n .scaleLinear()\n .domain([yMin, yMax + yRange * paddingMultiplier])\n .nice()\n .range([this.height, 0]);\n }\n\n private createAxes(options: AXLineChartOption): void {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n const isBandScale = this.xScale.bandwidth !== undefined;\n const isRtl = document.documentElement.dir === 'rtl' || document.body.dir === 'rtl';\n const axesGroup = this.chart.append('g').attr('class', 'ax-line-chart-axes');\n\n if (showXAxis) {\n let xAxisGenerator;\n let itemCount = 0;\n\n if (isBandScale) {\n // Band scale (categorical data)\n itemCount = this.xScale.domain().length;\n\n // Smart tick reduction for many items (like bar chart)\n let tickValues: string[] = this.xScale.domain() as string[];\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n // Show every 5th tick for 50+ items\n tickValues = tickValues.filter((_d, i) => i % 5 === 0);\n } else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n // Show every 2nd tick for 20-50 items\n tickValues = tickValues.filter((_d, i) => i % 2 === 0);\n }\n\n xAxisGenerator = this.d3\n .axisBottom(this.xScale)\n .tickValues(tickValues)\n .tickSize(5)\n .tickPadding(8)\n .tickFormat((d: d3.AxisDomain) => {\n const label = String(d);\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 } else {\n // Linear scale (numeric data)\n // Let D3 determine optimal tick count, but ensure we show reasonable number\n // Calculate optimal tick count based on width\n const optimalTickCount = Math.min(12, Math.max(5, Math.floor(this.width / 80)));\n\n xAxisGenerator = this.d3\n .axisBottom(this.xScale)\n .ticks(optimalTickCount)\n .tickSize(5)\n .tickPadding(8)\n .tickFormat((d: d3.AxisDomain) => {\n // Format numbers nicely\n const num = Number(d);\n if (Number.isInteger(num)) {\n return String(num);\n }\n return num.toFixed(1);\n });\n\n itemCount = optimalTickCount;\n }\n\n this.xAxis = axesGroup\n .append('g')\n .attr('class', 'ax-line-chart-axis-x')\n .attr('transform', `translate(0,${this.height})`)\n .call(xAxisGenerator);\n\n // Style the x-axis path and lines\n this.xAxis.selectAll('path').attr('stroke', 'rgba(var(--ax-comp-line-chart-axis-color), 0.2)');\n\n this.xAxis\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.2)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n\n const dynamicXAxisTickFontSize = this.calculateDynamicFontSize(\n this.width,\n 45,\n this.MIN_FONT_SIZE_X,\n this.MAX_FONT_SIZE_X,\n );\n const xAxisTicks = this.xAxis\n .selectAll('text')\n .style('font-size', `${dynamicXAxisTickFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-line-chart-labels-color), 0.7)');\n\n // Automatically rotate labels if they are likely to overlap (only for band scale)\n let labelsAreRotated = false;\n if (isBandScale && this.xScale.bandwidth && this.xScale.domain().length > 0) {\n const step = this.xScale.step();\n const longestLabel = this.xScale.domain().reduce((a, b) => (a.length > b.length ? a : b), '');\n // Using char width ratio constant for better estimate\n const estimatedLongestLabelWidth = longestLabel.length * dynamicXAxisTickFontSize * this.CHAR_WIDTH_RATIO;\n\n if (estimatedLongestLabelWidth > step) {\n labelsAreRotated = true;\n xAxisTicks\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end')\n .attr('dx', '-0.8em')\n .attr('dy', '0.15em');\n }\n }\n\n // Only show X-axis title if labels are NOT rotated and item count is reasonable\n // This prevents overlap with rotated labels and improves readability\n const shouldShowXAxisTitle = options.xAxisLabel && !labelsAreRotated && itemCount <= this.MANY_ITEMS_THRESHOLD;\n\n if (shouldShowXAxisTitle) {\n axesGroup\n .append('text')\n .attr('class', 'ax-line-chart-axis-label ax-x-axis-label')\n .attr('text-anchor', 'middle')\n .attr('x', this.width / 2)\n .attr('y', this.height + this.margin.bottom - 5)\n .attr('direction', 'ltr')\n .attr(\n 'style',\n `\n font-size: 14px;\n font-weight: 500;\n fill: rgb(var(--ax-comp-line-chart-text-color));\n pointer-events: none;\n `,\n )\n .text(options.xAxisLabel);\n }\n }\n\n if (showYAxis) {\n // Create Y axis with smart number formatting\n const yAxisGenerator = this.d3\n .axisLeft(this.yScale)\n .tickSize(5)\n .tickPadding(8)\n .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 with large numbers\n const maxValue = this.yScale.domain()[1];\n if (maxValue > 1e6) {\n yAxisGenerator.ticks(6); // Fewer ticks for millions+\n } else if (maxValue > 1e3) {\n yAxisGenerator.ticks(8);\n }\n\n this.yAxis = axesGroup.append('g').attr('class', 'ax-line-chart-axis-y').call(yAxisGenerator);\n\n // Style the y-axis path and lines\n this.yAxis.selectAll('path').attr('stroke', 'rgba(var(--ax-comp-line-chart-axis-color), 0.2)');\n\n this.yAxis\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.2)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n\n const dynamicYAxisTickFontSize = this.calculateDynamicFontSize(\n this.height,\n 30,\n this.MIN_FONT_SIZE_Y,\n this.MAX_FONT_SIZE_Y,\n );\n const yTickTexts = this.yAxis.selectAll('text').attr(\n 'style',\n `\n font-size: ${dynamicYAxisTickFontSize}px;\n font-weight: 400;\n fill: rgba(var(--ax-comp-line-chart-labels-color), 0.7);\n `,\n );\n\n if (isRtl) {\n yTickTexts.attr('text-anchor', 'start');\n }\n\n if (options.yAxisLabel) {\n // Calculate proper position for Y-axis title\n // Position it to the left of the tick labels with proper spacing\n const maxTickLabelWidth = this.calculateMaxYAxisTickLabelWidth();\n const padding = this.Y_AXIS_PADDING;\n\n // Position title to the left of the tick labels\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-line-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 .attr(\n 'style',\n `\n font-size: 14px;\n font-weight: 500;\n fill: rgb(var(--ax-comp-line-chart-text-color));\n pointer-events: none;\n `,\n )\n .text(options.yAxisLabel);\n }\n }\n\n if (showGrid) {\n const gridGroup = this.chart\n .append('g')\n .attr('class', 'ax-line-chart-grid-container')\n .attr('pointer-events', 'none');\n\n const yGrid = gridGroup\n .append('g')\n .attr('class', 'ax-line-chart-grid')\n .call(\n this.d3\n .axisLeft(this.yScale)\n .tickSize(-this.width)\n .tickFormat(() => '')\n .tickValues(this.yScale.ticks()),\n );\n\n // Style the grid path and lines\n yGrid.selectAll('path').attr('stroke-width', '0');\n\n yGrid\n .selectAll('.tick')\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.2)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n\n if (options.showVerticalGrid) {\n const xGrid = gridGroup\n .append('g')\n .attr('class', 'ax-line-chart-grid-vertical')\n .attr('transform', `translate(0,${this.height})`)\n .call(\n this.d3\n .axisBottom(this.xScale)\n .tickSize(-this.height)\n .tickFormat(() => '')\n .tickValues(isBandScale ? undefined : this.xScale.ticks()),\n );\n\n // Style the vertical grid path and lines\n xGrid.selectAll('path').attr('stroke-width', '0');\n\n xGrid\n .selectAll('.tick')\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.15)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n }\n }\n }\n\n private renderLines(allSeriesData: (AXLineChartData & { originalIndex: number })[]): void {\n const isBandScale = this.xScale.bandwidth !== undefined;\n\n const getX = (d: { x: number | string; y: number }) => {\n if (isBandScale) {\n return this.xScale(String(d.x)) + this.xScale.bandwidth() / 2;\n } else {\n return this.xScale(d.x as number);\n }\n };\n\n const lineGenerator = this.d3\n .line<{ x: number | string; y: number }>()\n .x(getX)\n .y((d) => this.yScale(d.y)) as d3.Line<{ x: number | string; y: number }>;\n\n if (this.effectiveOptions().smoothLine !== false) {\n lineGenerator.curve(this.d3.curveMonotoneX);\n }\n\n const areaGenerator = this.d3\n .area<{ x: number | string; y: number }>()\n .x(getX)\n .y0(this.height)\n .y1((d) => this.yScale(d.y));\n\n if (this.effectiveOptions().smoothLine !== false) {\n areaGenerator.curve(this.d3.curveMonotoneX);\n }\n\n this.svg.attr('class', 'ax-line-chart-animating');\n\n const allSeriesGroup = this.chart\n .append('g')\n .attr('class', 'ax-line-chart-all-series')\n .attr('pointer-events', 'none');\n\n const allPointsGroup = this.chart\n .append('g')\n .attr('class', 'ax-line-chart-all-points')\n .attr('pointer-events', 'none');\n\n if (this.effectiveOptions().showCrosshair === true) {\n this.chart.append('g').attr('class', 'ax-line-chart-crosshair').attr('pointer-events', 'none');\n }\n\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n\n allSeriesData.forEach((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n\n if (this.hiddenSeries.has(seriesIdentifier)) {\n this.removeSeriesElements(seriesIdentifier);\n return;\n }\n if (!series.data || series.data.length === 0) return;\n\n const seriesGroup = allSeriesGroup\n .append('g')\n .attr('class', `ax-line-chart-series ax-line-chart-series-${series.originalIndex}`)\n .attr('data-series-identifier', seriesIdentifier)\n .attr('pointer-events', 'none');\n\n const lineColor = series.lineColor || getChartColor(series.originalIndex, this.chartColors);\n const fillColor = series.fillColor || lineColor;\n\n const line = seriesGroup\n .append('path')\n .datum(series.data)\n .attr('class', 'ax-line-chart-line')\n .attr('stroke', lineColor)\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH)\n .attr('stroke-linejoin', 'round')\n .attr('stroke-linecap', 'round')\n .attr('d', lineGenerator)\n .attr('fill', 'none')\n .attr('style', 'transition: stroke-width 0.3s ease;')\n .attr('pointer-events', 'none');\n\n line\n .on('mouseenter', () => {\n line\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr(\n 'stroke-width',\n (this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH) * this.LINE_HIGHLIGHT_MULTIPLIER,\n );\n })\n .on('mouseleave', () => {\n line\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH);\n });\n\n const totalLength = line.node().getTotalLength();\n line\n .attr('stroke-dasharray', totalLength + ' ' + totalLength)\n .attr('stroke-dashoffset', totalLength)\n .transition()\n .duration(animationDuration)\n .ease(animationEasing)\n .attr('stroke-dashoffset', 0)\n .on('end', function () {\n line.attr('pointer-events', 'all');\n });\n\n if (this.effectiveOptions().fillArea) {\n const area = seriesGroup\n .append('path')\n .datum(series.data)\n .attr('class', 'ax-line-chart-area')\n .attr('fill', fillColor)\n .attr('opacity', 0)\n .attr('d', areaGenerator)\n .attr('style', 'transition: opacity 0.3s ease;')\n .attr('pointer-events', 'none');\n\n area\n .on('mouseenter', () => {\n area\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('opacity', ((this.effectiveOptions().fillOpacity ?? 20) / 100) * 1.5);\n })\n .on('mouseleave', () => {\n area\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('opacity', (this.effectiveOptions().fillOpacity ?? 20) / 100);\n });\n\n area\n .transition()\n .duration(animationDuration)\n .ease(animationEasing)\n .attr('opacity', (this.effectiveOptions().fillOpacity ?? 20) / 100)\n .on('end', function () {\n area.attr('pointer-events', 'all');\n });\n }\n });\n\n if (this.effectiveOptions().showPoints !== false) {\n const pointMap = new Map<\n string,\n Array<{\n point: { x: number | string; y: number };\n series: AXLineChartData & { originalIndex: number };\n originalIndex: number;\n }>\n >();\n\n allSeriesData.forEach((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n if (this.hiddenSeries.has(seriesIdentifier) || !series.data || series.data.length === 0) {\n return;\n }\n\n const pointData = this.getReducedDataPoints(series.data, this.MAX_POINTS_TO_RENDER);\n\n pointData.forEach((point) => {\n const x = getX(point);\n const y = this.yScale(point.y);\n const key = this.createPointKey(x, y);\n\n if (!pointMap.has(key)) {\n pointMap.set(key, []);\n }\n pointMap.get(key)?.push({ point, series, originalIndex: series.originalIndex });\n });\n });\n\n let animationCounter = 0;\n const totalVisibleSeriesCount = allSeriesData.filter(\n (s) => !this.hiddenSeries.has(this.getSeriesIdentifier(s)) && s.data && s.data.length > 0,\n ).length;\n\n allSeriesData.forEach((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n if (this.hiddenSeries.has(seriesIdentifier) || !series.data || series.data.length === 0) {\n return;\n }\n\n const lineColor = series.lineColor || getChartColor(series.originalIndex, this.chartColors);\n const pointsGroup = allPointsGroup\n .append('g')\n .attr('class', `ax-line-chart-points ax-line-chart-points-${series.originalIndex}`)\n .attr('data-series-identifier', seriesIdentifier)\n .attr('pointer-events', 'none');\n\n pointsGroup\n .on('mouseenter', () => this.handlePointGroupEnter(series.originalIndex))\n .on('mouseleave', () => this.handlePointGroupLeave());\n\n const pointData = this.getReducedDataPoints(series.data, this.MAX_POINTS_TO_RENDER);\n\n pointsGroup\n .selectAll('circle')\n .data(pointData)\n .enter()\n .append('circle')\n .attr('class', 'ax-line-chart-point')\n .attr('cx', getX)\n .attr('cy', (d) => this.yScale(d.y))\n .attr('r', 0)\n .attr('fill', lineColor)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1)\n .attr('data-x', (d) => d.x)\n .attr('data-y', (d) => d.y)\n .style('cursor', 'pointer')\n .attr('pointer-events', 'none')\n .on('mouseenter', (event: MouseEvent, d: { x: number | string; y: number }) => {\n const x = getX(d);\n const y = this.yScale(d.y);\n const key = this.createPointKey(x, y);\n const overlappingPoints = pointMap.get(key) || [];\n\n if (overlappingPoints.length > 1) {\n this.handleOverlappingPointsHover(event, overlappingPoints);\n } else {\n this.handlePointHover(event, d, series, series.originalIndex);\n }\n\n this.d3\n .select(event.target as SVGCircleElement)\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('r', (this.effectiveOptions().pointRadius ?? 4) * 1.5)\n .attr('stroke-width', 2)\n .attr('stroke', `rgb(var(--ax-comp-line-chart-bg-color))`);\n })\n .on('mousemove', (event: MouseEvent) => this.updateTooltipPosition(event))\n .on('mouseleave', (event: MouseEvent) => {\n this._tooltipVisible.set(false);\n this.d3\n .select(event.target as SVGCircleElement)\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('r', this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS)\n .attr('stroke-width', 1)\n .attr('stroke', '#fff');\n })\n .on('click', (event: MouseEvent, d: { x: number | string; y: number }) => {\n const x = getX(d);\n const y = this.yScale(d.y);\n const key = this.createPointKey(x, y);\n const overlappingPoints = pointMap.get(key) || [];\n\n if (overlappingPoints.length > 1) {\n overlappingPoints.forEach(({ point, series }) => {\n this.handlePointClick(event, point, series);\n });\n } else {\n this.handlePointClick(event, d, series);\n }\n })\n .transition()\n .delay(\n (_d: { x: number | string; y: number }, i: number) =>\n i * Math.min(this.POINT_ANIMATION_DELAY_MS, (animationDuration || 0) * 0.05) +\n (animationDuration || 0) * this.POINT_ANIMATION_DELAY_RATIO,\n )\n .duration((animationDuration || 0) * this.POINT_ANIMATION_DURATION_RATIO)\n .ease(animationEasing)\n .attr('r', this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS)\n .on('end', (d, i, nodes) => {\n if (i === nodes.length - 1) {\n animationCounter++;\n if (animationCounter >= totalVisibleSeriesCount) {\n this.enablePointerEventsAfterAnimation();\n }\n }\n });\n });\n } else {\n setTimeout(() => this.enablePointerEventsAfterAnimation(), (animationDuration || 0) + this.ANIMATION_END_BUFFER);\n }\n }\n\n private enablePointerEventsAfterAnimation(): void {\n if (!this.chart || !this.svg) return;\n this.chart.selectAll('.ax-line-chart-all-series').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-series').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-line').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-area').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-all-points').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-points').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-point').attr('pointer-events', 'all');\n this.svg.classed('ax-line-chart-animating', false);\n }\n\n private handlePointGroupEnter(originalIndex: number): void {\n this.chart\n .select(`.ax-line-chart-series-${originalIndex} .ax-line-chart-line`)\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr(\n 'stroke-width',\n (this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH) * this.LINE_HIGHLIGHT_MULTIPLIER,\n );\n }\n\n private handlePointGroupLeave(): void {\n this.chart\n .selectAll('.ax-line-chart-line')\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH);\n\n if (this.effectiveOptions().showCrosshair === true) {\n this.chart.select('.ax-line-chart-crosshair').selectAll('*').remove();\n }\n }\n\n private getReducedDataPoints(\n data: Array<{ x: number | string; y: number }>,\n maxPoints: number,\n ): Array<{ x: number | string; y: number }> {\n if (data.length <= maxPoints) return data;\n const result: Array<{ x: number | string; y: number }> = [];\n const step = Math.ceil(data.length / maxPoints);\n for (let i = 0; i < data.length; i += step) {\n result.push(data[i]);\n }\n if (result[result.length - 1] !== data[data.length - 1]) {\n result.push(data[data.length - 1]);\n }\n return result;\n }\n\n private handlePointHover(\n event: MouseEvent,\n dataPoint: AXLineChartData['data'][number],\n series: AXLineChartData & { originalIndex: number },\n originalIndex: number,\n ): void {\n if (this.effectiveOptions().showTooltip !== false) {\n const color = series.lineColor || getChartColor(originalIndex, this.chartColors);\n\n this._tooltipData.set({\n title: dataPoint.tooltipLabel || series.tooltipLabel || series.label || `Series ${originalIndex + 1}`,\n value: formatLargeNumber(dataPoint.y),\n color: color,\n });\n\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n\n if (this.effectiveOptions().showCrosshair === true) {\n this.showCrosshairLines(dataPoint);\n }\n }\n }\n\n private showCrosshairLines(dataPoint: { x: number | string; y: number }): void {\n const isBandScale = this.xScale.bandwidth !== undefined;\n\n let x: number;\n if (isBandScale) {\n x = this.xScale(String(dataPoint.x)) + this.xScale.bandwidth() / 2;\n } else {\n x = this.xScale(dataPoint.x as number);\n }\n const y = this.yScale(dataPoint.y);\n\n let crosshairGroup = this.chart.select('.ax-line-chart-crosshair');\n if (crosshairGroup.empty()) {\n crosshairGroup = this.chart.append('g').attr('class', 'ax-line-chart-crosshair').attr('pointer-events', 'none');\n }\n\n crosshairGroup.selectAll('*').remove();\n\n crosshairGroup\n .append('line')\n .attr('class', 'ax-line-chart-crosshair-vertical')\n .attr('x1', x)\n .attr('y1', 0)\n .attr('x2', x)\n .attr('y2', this.height)\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.5)')\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '3,3')\n .attr('opacity', 0.7)\n .attr('pointer-events', 'none');\n\n crosshairGroup\n .append('line')\n .attr('class', 'ax-line-chart-crosshair-horizontal')\n .attr('x1', 0)\n .attr('y1', y)\n .attr('x2', this.width)\n .attr('y2', y)\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.5)')\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '3,3')\n .attr('opacity', 0.7)\n .attr('pointer-events', 'none');\n }\n\n private updateTooltipPosition(event: MouseEvent): void {\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl) return;\n const rect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip') as HTMLElement | null;\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = computeTooltipPosition(rect, tooltipRect, event.clientX, event.clientY, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n }\n\n // computeTooltipPosition moved to shared chart utils\n\n private handlePointClick(\n event: MouseEvent,\n dataPoint: AXLineChartData['data'][number],\n series: AXLineChartData & { originalIndex: number },\n ): void {\n this.pointClick.emit({\n series: series, // series still refers to the full series data with originalIndex\n point: dataPoint,\n event: {\n nativeEvent: event,\n sender: this,\n },\n });\n }\n\n private showNoDataMessage(containerElement: HTMLElement): void {\n // Remove only chart SVG and previous empty-state messages to avoid removing tooltip\n this.d3\n .select(containerElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n const messageContainer = this.d3\n .select(containerElement)\n .append('div')\n .attr('class', 'ax-line-chart-no-data-message')\n .style('position', 'absolute')\n .style('left', '50%')\n .style('top', '50%')\n .style('transform', 'translate(-50%, -50%)');\n\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-no-data-icon')\n .style('opacity', '0.6')\n .style('margin-bottom', '0.75rem')\n .html(`<i class=\"${this.effectiveMessages().noDataIcon} fa-2x\"></i>`);\n\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-no-data-text')\n .style('font-size', '1rem')\n .style('font-weight', '600')\n .style('margin-bottom', '0.5rem')\n .text(this.effectiveMessages().noData);\n\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-no-data-help')\n .style('font-size', '0.8rem')\n .style('opacity', '0.6')\n .text(this.effectiveMessages().noDataHelp);\n }\n\n private showAllSeriesHiddenMessage(containerElement: HTMLElement): void {\n // Remove only chart SVG and previous empty-state messages to avoid removing tooltip\n this.d3\n .select(containerElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n const messageContainer = this.d3\n .select(containerElement)\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-message') // Different class\n .style('position', 'absolute')\n .style('left', '50%')\n .style('top', '50%')\n .style('transform', 'translate(-50%, -50%)');\n\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-icon')\n .style('opacity', '0.6')\n .style('margin-bottom', '0.75rem')\n .html(`<i class=\"${this.effectiveMessages().allHiddenIcon} fa-2x\"></i>`); // Different icon\n\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-text')\n .style('font-size', '1rem')\n .style('font-weight', '600')\n .style('margin-bottom', '0.5rem')\n .text(this.effectiveMessages().allHidden);\n\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-help')\n .style('font-size', '0.8rem')\n .style('opacity', '0.6')\n .text(this.effectiveMessages().allHiddenHelp);\n }\n\n private handleOverlappingPointsHover(\n event: MouseEvent,\n overlappingPoints: Array<{\n point: { x: number | string; y: number };\n series: AXLineChartData & { originalIndex: number };\n originalIndex: number;\n }>,\n ): void {\n if (this.effectiveOptions().showTooltip === false) return;\n\n const tooltipData: AXChartTooltipData = {\n title: overlappingPoints.map(({ series }) => series.label),\n value: formatLargeNumber(overlappingPoints[0].point.y),\n color: overlappingPoints.map(\n ({ series }) => series.lineColor || getChartColor(series.originalIndex, this.chartColors),\n ),\n };\n\n this._tooltipData.set(tooltipData);\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n\n if (this.effectiveOptions().showCrosshair === true && overlappingPoints.length > 0) {\n this.showCrosshairLines(overlappingPoints[0].point);\n }\n }\n}\n","<div class=\"ax-line-chart\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"false\"\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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"}
|