@acorex/charts 21.0.2-next.28 → 21.0.2-next.29

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.
Files changed (31) hide show
  1. package/{types/acorex-charts-bar-chart.d.ts → bar-chart/index.d.ts} +1 -2
  2. package/{types/acorex-charts-donut-chart.d.ts → donut-chart/index.d.ts} +1 -2
  3. package/fesm2022/acorex-charts-bar-chart.mjs +4 -4
  4. package/fesm2022/acorex-charts-bar-chart.mjs.map +1 -1
  5. package/fesm2022/acorex-charts-chart-legend.mjs +5 -5
  6. package/fesm2022/acorex-charts-chart-legend.mjs.map +1 -1
  7. package/fesm2022/acorex-charts-chart-tooltip.mjs +4 -4
  8. package/fesm2022/acorex-charts-chart-tooltip.mjs.map +1 -1
  9. package/fesm2022/acorex-charts-donut-chart.mjs +4 -4
  10. package/fesm2022/acorex-charts-donut-chart.mjs.map +1 -1
  11. package/fesm2022/acorex-charts-funnel-chart.mjs +7 -5
  12. package/fesm2022/acorex-charts-funnel-chart.mjs.map +1 -1
  13. package/fesm2022/acorex-charts-gauge-chart.mjs +4 -4
  14. package/fesm2022/acorex-charts-gauge-chart.mjs.map +1 -1
  15. package/fesm2022/acorex-charts-heatmap-chart.mjs +4 -4
  16. package/fesm2022/acorex-charts-heatmap-chart.mjs.map +1 -1
  17. package/fesm2022/acorex-charts-hierarchy-chart.mjs +6 -5
  18. package/fesm2022/acorex-charts-hierarchy-chart.mjs.map +1 -1
  19. package/fesm2022/acorex-charts-line-chart.mjs +8 -5
  20. package/fesm2022/acorex-charts-line-chart.mjs.map +1 -1
  21. package/fesm2022/acorex-charts.mjs +3 -3
  22. package/fesm2022/acorex-charts.mjs.map +1 -1
  23. package/{types/acorex-charts-funnel-chart.d.ts → funnel-chart/index.d.ts} +1 -2
  24. package/{types/acorex-charts-gauge-chart.d.ts → gauge-chart/index.d.ts} +1 -2
  25. package/{types/acorex-charts-heatmap-chart.d.ts → heatmap-chart/index.d.ts} +1 -2
  26. package/{types/acorex-charts-hierarchy-chart.d.ts → hierarchy-chart/index.d.ts} +2 -3
  27. package/{types/acorex-charts-line-chart.d.ts → line-chart/index.d.ts} +1 -2
  28. package/package.json +12 -12
  29. /package/{types/acorex-charts-chart-legend.d.ts → chart-legend/index.d.ts} +0 -0
  30. /package/{types/acorex-charts-chart-tooltip.d.ts → chart-tooltip/index.d.ts} +0 -0
  31. /package/{types/acorex-charts.d.ts → index.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-charts-bar-chart.mjs","sources":["../../../../packages/charts/bar-chart/src/lib/bar-chart.config.ts","../../../../packages/charts/bar-chart/src/lib/bar-chart.component.ts","../../../../packages/charts/bar-chart/src/lib/bar-chart.component.html","../../../../packages/charts/bar-chart/src/acorex-charts-bar-chart.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { AXBarChartOption } from './bar-chart.type';\n\nexport const AXBarChartDefaultConfig: AXBarChartOption = {\n showXAxis: true,\n showYAxis: true,\n showGrid: true,\n showDataLabels: true,\n showTooltip: true,\n rotateXAxisLabels: 'auto',\n barWidth: 80,\n cornerRadius: 4,\n animationDuration: 800,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All bars are hidden',\n allHiddenHelp: 'Click on legend items to show bars',\n noDataIcon: 'fa-light fa-chart-column',\n allHiddenIcon: 'fa-light fa-eye-slash',\n },\n};\n\nexport const AX_BAR_CHART_CONFIG = new InjectionToken<AXBarChartOption>('AX_BAR_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXBarChartDefaultConfig,\n});\n\nexport type PartialBarChartConfig = Partial<AXBarChartOption>;\n\nexport function barChartConfig(config: PartialBarChartConfig = {}): AXBarChartOption {\n const result = {\n ...AXBarChartDefaultConfig,\n ...config,\n };\n return result;\n}\n","import {\n AX_CHART_COLOR_PALETTE,\n AXChartComponent,\n AXChartComponentBase,\n formatLargeNumber,\n getChartColor,\n getEasingFunction,\n} from '@acorex/charts';\nimport { AXChartLegendCompatible, AXChartLegendItem } from '@acorex/charts/chart-legend';\nimport { AXChartTooltipComponent, AXChartTooltipData } from '@acorex/charts/chart-tooltip';\n\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n output,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AX_BAR_CHART_CONFIG } from './bar-chart.config';\nimport {\n AXBarChartClickEvent,\n AXBarChartClusteredData,\n AXBarChartData,\n AXBarChartOption,\n AXBarChartValue,\n} from './bar-chart.type';\n\n/**\n * Bar Chart Component\n * Renders data as vertical bars with interactive hover effects and animations\n */\n@Component({\n selector: 'ax-bar-chart',\n templateUrl: './bar-chart.component.html',\n styleUrls: ['./bar-chart.component.css'],\n encapsulation: ViewEncapsulation.None,\n imports: [AXChartTooltipComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXBarChartComponent\n extends AXChartComponent\n implements OnDestroy, AXChartLegendCompatible, AXChartComponentBase\n{\n // Inputs\n /** Chart data input */\n data = input<AXBarChartValue>([] as AXBarChartValue);\n\n /** Chart options input */\n options = input<AXBarChartOption>({});\n\n // Outputs\n /** Emitted when a bar is clicked */\n barClick = output<AXBarChartClickEvent>();\n\n // Chart container reference\n private readonly chartContainerEl = viewChild.required<ElementRef<HTMLDivElement>>('chartContainer');\n\n // D3 reference - loaded asynchronously\n protected d3!: typeof import('d3');\n\n // Chart elements - using proper D3 types\n private svg!: ReturnType<typeof import('d3').select<SVGSVGElement, unknown>>;\n private chart!: ReturnType<typeof import('d3').select<SVGGElement, unknown>>;\n private xScale!: ReturnType<typeof import('d3').scaleBand<string>>;\n private yScale!: ReturnType<typeof import('d3').scaleLinear<number, number>>;\n private xSubScale!: ReturnType<typeof import('d3').scaleBand<string>>;\n private xAxis!: ReturnType<typeof import('d3').select<SVGGElement, unknown>>;\n private yAxis!: ReturnType<typeof import('d3').select<SVGGElement, unknown>>;\n\n // Chart dimensions\n private width!: number;\n private height!: number;\n private margin = { top: 0, right: 0, bottom: 0, left: 0 };\n\n // Constants for layout calculations\n private readonly CHAR_WIDTH_RATIO = 0.65;\n private readonly TOOLTIP_GAP = 10;\n private readonly AXIS_TICK_PADDING = 10;\n private readonly Y_AXIS_TITLE_THICKNESS = 14;\n private readonly Y_AXIS_TITLE_PADDING = 14;\n private readonly X_AXIS_TITLE_FONT_SIZE = 14;\n private readonly X_AXIS_TITLE_GAP = 14;\n private readonly X_AXIS_TITLE_BLOCK_HEIGHT = 24;\n private readonly TOP_EDGE_PADDING = 8;\n private readonly BOTTOM_EDGE_PADDING = 8;\n private readonly HORIZONTAL_EDGE_PADDING = 12;\n private readonly FALLBACK_PLOT_HEIGHT = 240;\n private readonly MIN_PLOT_HEIGHT = 120;\n private readonly MIN_TOTAL_WIDTH = 200;\n private readonly OUTER_PADDING_CLUSTERED = 0.2;\n private readonly INNER_PADDING_CLUSTERED = 0.1;\n private readonly MIN_PADDING = 0.1;\n private readonly HOVER_TRANSITION_DURATION = 150;\n private readonly DEFAULT_ANIMATION_DELAY = 50;\n private readonly LABEL_ANIMATION_DELAY = 100;\n private readonly MIN_TOP_SPACE_FOR_LABEL = 20;\n private readonly LABEL_OFFSET = 8;\n private readonly ROTATION_TOLERANCE_SMALL_DATASET = 1.4;\n private readonly SMALL_DATASET_THRESHOLD = 6;\n private readonly Y_AXIS_PADDING = 20;\n private readonly TICK_AREA_PADDING = 6;\n private readonly TICK_AREA_GAP = 8;\n private readonly DEFAULT_FONT_SIZE = 13;\n private readonly FONT_WIDTH_MULTIPLIER = 0.6;\n private readonly FONT_PADDING = 8;\n private readonly MAX_LABEL_LENGTH = 20;\n private readonly MIN_FONT_SIZE_X_AXIS = 8;\n private readonly MAX_FONT_SIZE_X_AXIS = 14;\n private readonly MIN_FONT_SIZE_Y_AXIS = 9;\n private readonly MAX_FONT_SIZE_Y_AXIS = 15;\n private readonly MANY_ITEMS_THRESHOLD = 20;\n private readonly VERY_MANY_ITEMS_THRESHOLD = 50;\n\n // Animation state\n private _initialAnimationComplete = signal(false);\n\n // Tooltip state\n private _tooltipVisible = signal(false);\n private _tooltipPosition = signal({ x: 0, y: 0 });\n private _tooltipData = signal<AXChartTooltipData>({\n title: '',\n value: '0',\n percentage: '0%',\n color: '',\n });\n private _tooltipRafId: number | null = null;\n private _pendingTooltipCoords: { x: number; y: number } | null = null;\n\n // Signals for component state\n private _initialized = signal(false);\n private _rendered = signal(false);\n\n // Tooltip accessors\n protected tooltipVisible = this._tooltipVisible.asReadonly();\n protected tooltipPosition = this._tooltipPosition.asReadonly();\n protected tooltipData = this._tooltipData.asReadonly();\n\n // Inject configuration\n private configToken = inject(AX_BAR_CHART_CONFIG);\n\n // Inject the chart colors\n private chartColors = inject(AX_CHART_COLOR_PALETTE);\n\n // Inject AXPlatform\n // Removed unused AXPlatform injection\n\n // Configuration with defaults\n protected effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n });\n\n // Messages with defaults\n protected effectiveMessages = computed(() => {\n const defaultMessages = {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All bars are hidden',\n allHiddenHelp: 'Click on legend items to show bars',\n noDataIcon: 'fa-light fa-chart-column',\n allHiddenIcon: 'fa-light fa-eye-slash',\n };\n return {\n ...defaultMessages,\n ...this.effectiveOptions().messages,\n };\n });\n\n // Track hidden bars and series\n private readonly hiddenBars = new Set<string>();\n private readonly hiddenSeries = new Set<string>();\n\n // Computed values for better performance\n private readonly isClusteredMode = computed(() => {\n const value = this.data();\n return Array.isArray(value) && value.length > 0 && 'chartData' in value[0];\n });\n\n private readonly visibleData = computed(() => {\n const value = this.data() || [];\n if (this.isClusteredMode()) {\n return value as AXBarChartClusteredData[];\n }\n return (value as AXBarChartData[]).filter((d) => !this.hiddenBars.has(d.id));\n });\n\n private readonly hasVisibleData = computed(() => {\n const value = this.data();\n if (!Array.isArray(value) || value.length === 0) return false;\n\n if (this.isClusteredMode()) {\n const groups = value as AXBarChartClusteredData[];\n const seriesLabels = this.getClusterSeriesLabels(groups);\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n return groups.some((g) => visibleSeries.some((_, idx) => !!g.chartData[idx]));\n }\n\n return (value as AXBarChartData[]).some((d) => !this.hiddenBars.has(d.id));\n });\n\n // Type guard helper\n private isClusteredData(value: AXBarChartValue): value is AXBarChartClusteredData[] {\n return Array.isArray(value) && value.length > 0 && 'chartData' in value[0];\n }\n\n private getClusterSeriesLabels(groups: AXBarChartClusteredData[]): string[] {\n return groups[0]?.chartData?.map((d) => d.label) ?? [];\n }\n\n constructor() {\n super();\n // Dynamically load D3 and initialize the chart when the component is ready\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\n // Create chart after D3 is loaded and container is available\n if (this.d3 && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n });\n\n // Watch for changes to redraw the chart\n effect(() => {\n // Access inputs to track them\n this.data();\n this.effectiveOptions();\n\n // Only update if already rendered\n if (this._rendered()) {\n this.updateChart();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.cleanupChart();\n }\n\n /**\n * Loads D3.js dynamically\n */\n protected async loadD3(): Promise<void> {\n try {\n this.d3 = await import('d3');\n // If container is ready, create chart\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n } catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n\n /**\n * Creates the bar chart SVG and renders all elements\n */\n public createChart(): void {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement) return;\n\n const containerElement = this.chartContainerEl().nativeElement;\n const inputValue = (this.data() || []) as AXBarChartValue;\n const isClustered = this.isClusteredData(inputValue);\n\n // Use computed visibility\n const hasAnyVisible = this.hasVisibleData();\n const visibleSingleData = isClustered ? [] : (this.visibleData() as AXBarChartData[]);\n const groupedData = isClustered ? (inputValue as AXBarChartClusteredData[]) : [];\n\n // Clear existing chart SVG and messages (do not remove tooltip component)\n this.d3.select(containerElement).selectAll('svg, .ax-chart-message-container').remove();\n\n // Early return if no data\n if (!Array.isArray(inputValue) || inputValue.length === 0) {\n this.showNoDataMessage(containerElement);\n return;\n }\n\n // Early return if all bars are hidden\n if (!hasAnyVisible) {\n this.showAllBarsHiddenMessage(containerElement);\n return;\n }\n\n // Get options and setup dimensions\n const chartOptions = this.effectiveOptions();\n this.setupDimensions(containerElement, chartOptions);\n\n // Create scales and axes and render based on mode\n if (isClustered) {\n this.setupScalesClustered(groupedData);\n this.createAxesClustered(chartOptions, groupedData);\n this.renderBarsClustered(groupedData);\n } else {\n this.setupScales(visibleSingleData);\n this.createAxes(chartOptions);\n this.renderBars(visibleSingleData);\n }\n }\n\n /**\n * Updates the chart when inputs change\n */\n public updateChart(): void {\n this.createChart();\n }\n\n /**\n * Cleans up chart resources\n */\n public cleanupChart(): void {\n if (this._tooltipRafId != null) {\n cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = null;\n }\n this._pendingTooltipCoords = null;\n\n const container = this.chartContainerEl()?.nativeElement;\n if (container) {\n this.d3?.select(container).selectAll('svg, .ax-chart-message-container').remove();\n }\n this.svg = undefined!;\n this.chart = undefined!;\n this._tooltipVisible.set(false);\n }\n\n /**\n * Sets up chart dimensions and creates SVG with responsive attributes\n */\n private setupDimensions(containerElement: HTMLElement, options: AXBarChartOption): void {\n // Remove outer margins; calculate only internal paddings for axes and labels\n this.margin = { top: 0, right: 0, bottom: 0, left: 0 };\n\n // Get container dimensions\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n\n // Axis visibility\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n\n // Internal left padding for Y-axis ticks/labels/title\n const yAxisTitleThickness = options.yAxisLabel ? this.Y_AXIS_TITLE_THICKNESS : 0;\n const yAxisTitlePadding = options.yAxisLabel ? this.Y_AXIS_TITLE_PADDING : 0;\n const leftPaddingForYAxis = showYAxis\n ? this.calculateMaxYAxisTickLabelWidth() + this.AXIS_TICK_PADDING + yAxisTitlePadding + yAxisTitleThickness\n : 0;\n const leftInnerPadding = leftPaddingForYAxis + this.HORIZONTAL_EDGE_PADDING;\n const rightInnerPadding = this.HORIZONTAL_EDGE_PADDING;\n\n // Estimate internal bottom padding for X-axis ticks/labels/title\n let bottomPaddingForXAxis = 0;\n if (showXAxis) {\n const raw = (this.data() || []) as AXBarChartValue;\n const isClustered = this.isClusteredData(raw);\n const barCount = isClustered ? (raw as AXBarChartClusteredData[]).length : (raw as AXBarChartData[]).length;\n const longestLabel = (() => {\n if (isClustered) {\n const groups = raw as AXBarChartClusteredData[];\n return groups.reduce((acc, g) => (acc.length > (g.label?.length ?? 0) ? acc : (g.label ?? '')), '');\n }\n const flat = (raw as AXBarChartData[]) || [];\n return flat.reduce((a, b) => (a.length > b.label.length ? a : b.label), '');\n })();\n\n const baseWidth = options.width ?? containerWidth;\n const workingWidth = Math.max(1, baseWidth - leftInnerPadding - rightInnerPadding);\n const dynamicFontSize = Math.max(10, Math.min(14, Math.round(workingWidth / 50)));\n\n // Use truncated label length for calculation (same logic as actual rendering)\n const maxLabelLength = barCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n const effectiveLabelLength = Math.min(longestLabel.length, maxLabelLength);\n const estimatedLongestLabelWidth = effectiveLabelLength * dynamicFontSize * 0.65;\n\n const availableWidthPerBar = barCount > 0 ? workingWidth / barCount : workingWidth;\n const rotateOption = typeof options.rotateXAxisLabels === 'boolean' ? options.rotateXAxisLabels : undefined;\n const willRotate = this.shouldLabelsRotate(rotateOption, estimatedLongestLabelWidth, availableWidthPerBar);\n\n const tickAreaHeight = willRotate\n ? estimatedLongestLabelWidth * Math.SQRT1_2 + dynamicFontSize * Math.SQRT1_2 + this.TICK_AREA_PADDING\n : dynamicFontSize + this.TICK_AREA_PADDING + 2;\n const gapBelowTicks = options.xAxisLabel && !willRotate ? this.X_AXIS_TITLE_GAP : 0;\n const titleBlockHeight = options.xAxisLabel && !willRotate ? this.X_AXIS_TITLE_BLOCK_HEIGHT : 0;\n bottomPaddingForXAxis = tickAreaHeight + gapBelowTicks + titleBlockHeight;\n }\n\n // Determine plotting dimensions with sensible fallbacks\n const baseWidth = options.width ?? containerWidth;\n const totalWidth = Math.max(this.MIN_TOTAL_WIDTH, baseWidth > 0 ? baseWidth : this.MIN_TOTAL_WIDTH);\n const plotWidth = Math.max(0, totalWidth - leftInnerPadding - rightInnerPadding);\n\n const plotHeight = this.calculatePlotHeight(options.height, containerHeight, bottomPaddingForXAxis);\n\n this.width = plotWidth;\n this.height = plotHeight;\n\n // Create SVG with explicit pixel dimensions to avoid collapse\n const totalHeight = this.height + bottomPaddingForXAxis + this.TOP_EDGE_PADDING + this.BOTTOM_EDGE_PADDING;\n\n const svg = this.d3\n .select(containerElement)\n .append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${totalWidth} ${totalHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n\n this.svg = svg;\n\n // Create chart group translated by internal paddings (no external margins)\n this.chart = this.svg\n .append('g')\n .attr('class', 'chart-content')\n .attr('transform', `translate(${leftInnerPadding},${this.TOP_EDGE_PADDING})`);\n }\n\n /**\n * Calculates plot height based on options and container dimensions\n */\n private calculatePlotHeight(\n optionHeight: number | undefined,\n containerHeight: number,\n bottomPadding: number,\n ): number {\n if (optionHeight && optionHeight > 0) {\n return Math.max(this.MIN_PLOT_HEIGHT, optionHeight - bottomPadding);\n }\n if (containerHeight > 0) {\n return Math.max(this.MIN_PLOT_HEIGHT, containerHeight - bottomPadding, this.FALLBACK_PLOT_HEIGHT);\n }\n return this.FALLBACK_PLOT_HEIGHT;\n }\n\n /**\n * Determines if X-axis labels should rotate\n */\n private shouldLabelsRotate(\n rotateOption: boolean | undefined,\n estimatedWidth: number,\n availableWidth: number,\n ): boolean {\n if (rotateOption === true) return true;\n if (rotateOption === false) return false;\n return estimatedWidth > availableWidth;\n }\n\n /**\n * Creates x and y scales for the chart\n */\n private setupScales(data: AXBarChartData[]): void {\n // Get the bar width percentage (default 60%)\n const barWidthPercent = this.effectiveOptions().barWidth ?? 0.6;\n // Calculate padding based on barWidth (inverse relationship)\n const padding = Math.max(this.MIN_PADDING, 1 - barWidthPercent);\n\n // Create x scale (band scale for categorical data)\n this.xScale = this.d3\n .scaleBand()\n .domain(data.map((d) => d.id))\n .range([0, this.width])\n .padding(padding);\n\n // Create y scale (linear scale for values)\n // Support negative values by calculating min/max\n const minValue = this.d3.min(data, (d) => d.value) || 0;\n const maxValue = this.d3.max(data, (d) => d.value) || 0;\n\n this.yScale = this.d3\n .scaleLinear()\n .domain([Math.min(0, minValue), Math.max(0, maxValue)])\n .nice()\n .range([this.height, 0]);\n }\n\n /**\n * Creates x and y scales for clustered charts\n */\n private setupScalesClustered(groups: AXBarChartClusteredData[]): void {\n const seriesLabels = this.getClusterSeriesLabels(groups);\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n\n // Outer band for clusters\n this.xScale = this.d3\n .scaleBand()\n .domain(groups.map((g) => g.id))\n .range([0, this.width])\n .padding(this.OUTER_PADDING_CLUSTERED);\n\n // Inner band for series\n this.xSubScale = this.d3\n .scaleBand()\n .domain(visibleSeries)\n .range([0, this.xScale.bandwidth()])\n .padding(this.INNER_PADDING_CLUSTERED);\n\n // Y scale across all visible values (support negative values)\n const allVisibleValues: number[] = [];\n for (const g of groups) {\n visibleSeries.forEach((_, idx) => {\n const item = g.chartData[idx];\n if (item && typeof item.value === 'number') allVisibleValues.push(item.value);\n });\n }\n const yMin = this.d3.min(allVisibleValues) || 0;\n const yMax = this.d3.max(allVisibleValues) || 0;\n\n this.yScale = this.d3\n .scaleLinear()\n .domain([Math.min(0, yMin), Math.max(0, yMax)])\n .nice()\n .range([this.height, 0]);\n }\n\n /**\n * Creates x and y axes with grid lines\n */\n private createAxes(options: AXBarChartOption): void {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n\n const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n\n if (showXAxis) {\n this.createXAxis(axesGroup, options);\n }\n\n if (showYAxis) {\n this.createYAxis(axesGroup, options);\n }\n\n if (showGrid) {\n this.createGridLines();\n }\n }\n\n private createXAxis(\n axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n options: AXBarChartOption,\n ): void {\n const visibleDataForTicks = (this.data() || []).filter((d) => !this.isBarHidden(d.id));\n const idToLabel = new Map<string, string>(visibleDataForTicks.map((d) => [d.id, d.label]));\n this.buildXAxisCommon(axesGroup, idToLabel, options);\n }\n\n private createYAxis(\n axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n options: AXBarChartOption,\n ): void {\n // Create Y axis with smart number formatting\n const yAxisGenerator = this.d3.axisLeft(this.yScale).tickFormat((value: number | { valueOf(): number }) => {\n const numValue = typeof value === 'number' ? value : value.valueOf();\n return formatLargeNumber(numValue);\n });\n\n // Reduce tick count for better readability\n const maxValue = this.yScale.domain()[1];\n if (maxValue > 1e6) {\n yAxisGenerator.ticks(6); // Fewer ticks for large numbers\n } else if (maxValue > 1e3) {\n yAxisGenerator.ticks(8);\n }\n\n this.yAxis = axesGroup.append('g').attr('class', 'ax-bar-chart-axis-y').call(yAxisGenerator);\n\n // Style the axis text\n const dynamicFontSize = this.getYAxisTickFontSizeBasedOnHeight();\n this.yAxis\n .selectAll('text')\n .style('font-size', `${dynamicFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)')\n .attr('text-anchor', 'end')\n .attr('direction', 'ltr');\n\n // Style axis lines\n this.yAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n\n // Add Y axis title\n if (options.yAxisLabel) {\n this.createYAxisTitle(axesGroup, options.yAxisLabel);\n }\n }\n\n private shouldRotateXAxisLabels(idToLabel: Map<string, string>, fontSize: number): boolean {\n const options = this.effectiveOptions();\n\n // Check if user explicitly set rotation option\n if (options.rotateXAxisLabels === true) return true;\n if (options.rotateXAxisLabels === false) return false;\n\n // If 'auto' or undefined, use intelligent calculation\n if (this.xScale.domain().length === 0) return false;\n\n const step = this.xScale.step();\n const labels = Array.from(idToLabel.values());\n const longestLabel = labels.reduce((a, b) => (a.length > b.length ? a : b), '');\n const estimatedWidth = longestLabel.length * fontSize * this.CHAR_WIDTH_RATIO;\n\n // Heuristic: avoid rotation when there are few categories even if estimation is slightly larger\n const domainCount = this.xScale.domain().length;\n if (domainCount <= this.SMALL_DATASET_THRESHOLD) {\n return estimatedWidth > step * this.ROTATION_TOLERANCE_SMALL_DATASET;\n }\n\n return estimatedWidth > step;\n }\n\n private createXAxisTitle(\n axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n title: string,\n tickAreaHeight: number,\n gapBelowTicks = this.TICK_AREA_GAP,\n ): void {\n // Title positioned directly below tick area with a consistent gap\n const labelY = this.height + tickAreaHeight + gapBelowTicks;\n\n axesGroup\n .append('text')\n .attr('class', 'ax-bar-chart-axis-label ax-x-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'hanging') // Align to top of text for better positioning\n .attr('x', this.width / 2)\n .attr('y', labelY)\n .attr('direction', 'ltr')\n .style('font-size', `${this.X_AXIS_TITLE_FONT_SIZE}px`)\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(title);\n }\n\n private createYAxisTitle(axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>, title: string): void {\n // Calculate the exact position for Y-axis title\n // Y-axis tick labels use text-anchor: end, so they extend LEFT of the Y-axis line\n // Y-axis is at X = 0 within the chart group\n // Chart group is translated by (margin.left, margin.top)\n // So Y-axis is at X = margin.left in SVG coordinates\n\n const maxTickLabelWidth = this.calculateMaxYAxisTickLabelWidth();\n const padding = this.Y_AXIS_PADDING;\n\n // Position title to the left of the tick labels\n // Since text-anchor: end aligns the text to the Y-axis, we need to go further left\n const labelY = -maxTickLabelWidth - padding;\n\n // Center the title vertically\n const labelX = -this.height / 2;\n\n axesGroup\n .append('text')\n .attr('class', 'ax-bar-chart-axis-label ax-y-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('transform', 'rotate(-90)')\n .attr('x', labelX)\n .attr('y', labelY)\n .attr('direction', 'ltr')\n .style('font-size', '14px')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(title);\n }\n\n private calculateMaxYAxisTickLabelWidth(): number {\n // Calculate the maximum width needed for Y-axis tick labels\n const raw = (this.data() || []) as AXBarChartValue;\n const isClustered = this.isClusteredData(raw);\n\n let maxValue = 0;\n if (isClustered) {\n const groups = raw as AXBarChartClusteredData[];\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n\n for (const g of groups) {\n visibleSeries.forEach((_, idx) => {\n const item = g.chartData[idx];\n if (item && typeof item.value === 'number') maxValue = Math.max(maxValue, item.value);\n });\n }\n } else {\n const visibleData = (raw as AXBarChartData[]).filter((d) => !this.isBarHidden(d.id));\n maxValue = visibleData.reduce((acc, d) => (d.value > acc ? d.value : acc), 0);\n }\n\n // Use formatted number for width calculation\n const tickLabelText = Number.isFinite(maxValue) ? formatLargeNumber(maxValue) : '00000';\n return tickLabelText.length * this.DEFAULT_FONT_SIZE * this.FONT_WIDTH_MULTIPLIER + this.FONT_PADDING;\n }\n\n private createGridLines(): void {\n this.chart\n .append('g')\n .attr('class', 'ax-bar-chart-grid')\n .call(\n this.d3\n .axisLeft(this.yScale)\n .tickSize(-this.width)\n .tickFormat(() => ''),\n )\n .selectAll('line')\n .style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))')\n .style('stroke-opacity', 0.2);\n\n // Remove unneeded elements from grid\n this.chart.select('.ax-bar-chart-grid').selectAll('path, text').remove();\n }\n\n /**\n * Creates axes for clustered charts\n */\n private createAxesClustered(options: AXBarChartOption, groups: AXBarChartClusteredData[]): void {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n\n const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n\n if (showXAxis) {\n this.createXAxisClustered(axesGroup, options, groups);\n }\n\n if (showYAxis) {\n this.createYAxis(axesGroup, options);\n }\n\n if (showGrid) {\n this.createGridLines();\n }\n }\n\n private createXAxisClustered(\n axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n options: AXBarChartOption,\n groups: AXBarChartClusteredData[],\n ): void {\n const idToLabel = new Map<string, string>(groups.map((g) => [g.id, g.label]));\n this.buildXAxisCommon(axesGroup, idToLabel, options);\n }\n\n /**\n * Renders the bars with animations\n */\n private renderBars(data: AXBarChartData[]): void {\n // Filter out hidden bars\n const visibleData = data.filter((d) => !this.isBarHidden(d.id));\n const originalFullData = (this.data() as AXBarChartData[]) || [];\n\n // Reset animation state\n this._initialAnimationComplete.set(false);\n\n // Get corner radius from options\n const radius = this.effectiveOptions().cornerRadius;\n\n // Get animation options\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n\n // Create a container for all bars\n const barsContainer = this.chart.append('g').attr('class', 'ax-bar-chart-bars-container');\n\n // Create groups for each bar to handle transformations\n const barGroups = barsContainer\n .selectAll('.ax-bar-chart-bar-group')\n .data(visibleData)\n .enter()\n .append('g')\n .style('cursor', 'pointer')\n .attr('class', 'ax-bar-chart-bar-group');\n\n // Add bars inside groups\n const bars = barGroups\n .append('path')\n .attr('class', 'ax-bar-chart-bar')\n .attr('d', (d: AXBarChartData) => {\n const x = this.xScale(d.id);\n const width = this.xScale.bandwidth();\n const y = this.height - 0.5; // initial height is zero\n return `M${x},${y} L${x},${y} L${x + width},${y} L${x + width},${y} Z`;\n })\n .attr('fill', (d: AXBarChartData) => {\n // Find the index of the current bar (d) in the original data array\n const originalIndex = originalFullData.findIndex((item) => item.id === d.id);\n // Use the original color if provided, otherwise get color from palette using original index\n // Fallback to index 0 if not found, though this shouldn't happen with valid data.\n return d.color || this.getColor(originalIndex !== -1 ? originalIndex : 0);\n });\n\n // Add data labels if they're enabled\n if (this.effectiveOptions().showDataLabels !== false) {\n barGroups\n .append('text')\n .attr('class', 'ax-bar-chart-data-label')\n .attr('text-anchor', 'middle')\n .attr('x', (d: AXBarChartData) => this.xScale(d.id) + this.xScale.bandwidth() / 2)\n .attr('y', this.height) // Start from bottom for animation\n .style('font-size', 'clamp(8px, 2vmin, 12px)')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-data-labels-color))')\n .style('opacity', 0) // Start invisible for animation\n .text((d: AXBarChartData) => {\n // Format large numbers in data labels\n return d.value >= 1000 ? formatLargeNumber(d.value) : d.value;\n });\n\n // Animate data labels with smart positioning to avoid clipping\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n barGroups\n .selectAll('.ax-bar-chart-data-label')\n .transition()\n .duration(animationDuration)\n .delay((d: AXBarChartData, i: number) => i * animationDelay + this.LABEL_ANIMATION_DELAY)\n .attr('y', (d: AXBarChartData) => {\n const barTop = this.yScale(d.value);\n\n // If bar is near the top (100% or close), position label inside the bar\n if (barTop < this.MIN_TOP_SPACE_FOR_LABEL) {\n return barTop + this.LABEL_OFFSET;\n }\n\n // Otherwise, position above the bar\n return barTop - this.LABEL_OFFSET;\n })\n .attr('data-inside-bar', (d: AXBarChartData) => {\n const barTop = this.yScale(d.value);\n return barTop < this.MIN_TOP_SPACE_FOR_LABEL ? 'true' : 'false';\n })\n .style('opacity', 1)\n .ease(animationEasing);\n }\n\n // Set up event handlers on each group\n barGroups\n .on('mouseenter', (event: MouseEvent, d: AXBarChartData) => {\n // Only apply hover effects if initial animation is complete\n if (!this._initialAnimationComplete()) return;\n\n const barEl = this.d3.select(event.currentTarget).select('path');\n\n // Standard hover effect - darken the bar slightly and add a subtle shadow\n barEl\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .style('filter', 'brightness(0.7) drop-shadow(0 0 2px rgba(0,0,0,0.1))');\n\n this.handleBarHover(event, d);\n })\n .on('mousemove', (event: MouseEvent) => {\n // Only update tooltip if initial animation is complete\n if (this._initialAnimationComplete()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', (event: MouseEvent) => {\n // Only apply hover effects if initial animation is complete\n if (!this._initialAnimationComplete()) return;\n\n const barEl = this.d3.select(event.currentTarget).select('path');\n\n // Remove hover effect\n barEl.transition().duration(this.HOVER_TRANSITION_DURATION).style('filter', null);\n\n this._tooltipVisible.set(false);\n })\n .on('click', (event: MouseEvent, d: AXBarChartData) => {\n // Only trigger click events if initial animation is complete\n if (this._initialAnimationComplete()) {\n this.handleBarClick(event, d);\n }\n });\n\n // Add animation\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n bars\n .transition()\n .duration(animationDuration)\n .delay((d: AXBarChartData, i: number) => i * animationDelay)\n .attrTween('d', (d: AXBarChartData) => {\n const x = this.xScale(d.id);\n const width = this.xScale.bandwidth();\n const finalHeight = this.height - this.yScale(d.value);\n\n return (t: number) => {\n const currentHeight = finalHeight * t;\n const currentY = this.height - currentHeight;\n const bottomY = this.height - 0.5; // Add small gap to prevent overlap with x-axis\n\n if (radius > 0 && currentHeight > 0) {\n // Limit radius to prevent it from exceeding half the bar width\n const effectiveRadius = Math.min(radius, width / 2);\n return `M${x},${bottomY} L${x},${currentY + effectiveRadius} Q${x},${currentY} ${x + effectiveRadius},${currentY} L${x + width - effectiveRadius},${currentY} Q${x + width},${currentY} ${x + width},${currentY + effectiveRadius} L${x + width},${bottomY} Z`;\n } else {\n return `M${x},${bottomY} L${x},${currentY} L${x + width},${currentY} L${x + width},${bottomY} Z`;\n }\n };\n })\n .ease(animationEasing) // Use the configured easing function\n .end() // Wait for all animations to complete\n .then(() => {\n // Mark animation as complete to enable hover effects\n this._initialAnimationComplete.set(true);\n });\n }\n\n /**\n * Renders bars for clustered charts\n */\n private renderBarsClustered(groups: AXBarChartClusteredData[]): void {\n const seriesLabels = this.getClusterSeriesLabels(groups);\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n\n this._initialAnimationComplete.set(false);\n\n const radius = this.effectiveOptions().cornerRadius;\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n\n const barsContainer = this.chart.append('g').attr('class', 'ax-bar-chart-bars-container');\n\n const groupSel = barsContainer\n .selectAll('.ax-bar-chart-group')\n .data(groups)\n .enter()\n .append('g')\n .attr('class', 'ax-bar-chart-group')\n .attr('transform', (g: AXBarChartClusteredData) => `translate(${this.xScale(g.id)},0)`);\n\n type ClusteredBarDatum = { group: AXBarChartClusteredData; seriesLabel: string; seriesIndex: number };\n\n const barGroups = groupSel\n .selectAll('.ax-bar-chart-bar-group')\n .data((g: AXBarChartClusteredData) =>\n visibleSeries.map((label, idx): ClusteredBarDatum => ({ group: g, seriesLabel: label, seriesIndex: idx })),\n )\n .enter()\n .append('g')\n .style('cursor', 'pointer')\n .attr('class', 'ax-bar-chart-bar-group');\n\n const bars = barGroups\n .append('path')\n .attr('class', 'ax-bar-chart-bar')\n .attr('data-series', (d: ClusteredBarDatum) => d.seriesLabel)\n .attr('d', (d: ClusteredBarDatum) => {\n const x = this.xSubScale(d.seriesLabel);\n const width = this.xSubScale.bandwidth();\n const y = this.height - 0.5;\n return `M${x},${y} L${x},${y} L${x + width},${y} L${x + width},${y} Z`;\n })\n .attr('fill', (d: ClusteredBarDatum) => {\n const item = d.group.chartData[d.seriesIndex];\n return item?.color || this.getColor(d.seriesIndex);\n });\n\n if (this.effectiveOptions().showDataLabels !== false) {\n barGroups\n .append('text')\n .attr('class', 'ax-bar-chart-data-label')\n .attr('text-anchor', 'middle')\n .attr('x', (d: ClusteredBarDatum) => (this.xSubScale(d.seriesLabel) || 0) + this.xSubScale.bandwidth() / 2)\n .attr('y', this.height)\n .style('font-size', 'clamp(8px, 2vmin, 12px)')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-data-labels-color))')\n .style('opacity', 0)\n .text((d: ClusteredBarDatum) => {\n const value = d.group.chartData[d.seriesIndex]?.value;\n if (value === undefined) return '';\n // Format large numbers in data labels\n return value >= 1000 ? formatLargeNumber(value) : value;\n });\n\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n barGroups\n .selectAll('.ax-bar-chart-data-label')\n .transition()\n .duration(animationDuration)\n .delay((_d: unknown, i: number) => i * animationDelay + this.LABEL_ANIMATION_DELAY)\n .attr('y', (d: ClusteredBarDatum) => {\n const item = d.group.chartData[d.seriesIndex];\n if (!item) return this.height;\n\n const barTop = this.yScale(item.value);\n\n // If bar is near the top (100% or close), position label inside the bar\n if (barTop < this.MIN_TOP_SPACE_FOR_LABEL) {\n return barTop + this.LABEL_OFFSET;\n }\n\n // Otherwise, position above the bar\n return barTop - this.LABEL_OFFSET;\n })\n .attr('data-inside-bar', (d: ClusteredBarDatum) => {\n const item = d.group.chartData[d.seriesIndex];\n if (!item) return 'false';\n\n const barTop = this.yScale(item.value);\n return barTop < this.MIN_TOP_SPACE_FOR_LABEL ? 'true' : 'false';\n })\n .style('opacity', 1)\n .ease(animationEasing);\n }\n\n barGroups\n .on('mouseenter', (event: MouseEvent, d: ClusteredBarDatum) => {\n if (!this._initialAnimationComplete()) return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n barEl\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .style('filter', 'brightness(0.7) drop-shadow(0 0 2px rgba(0,0,0,0.1))');\n const item = d.group.chartData[d.seriesIndex];\n if (item) this.handleBarHover(event, item, d.group);\n })\n .on('mousemove', (event: MouseEvent) => {\n if (this._initialAnimationComplete()) this.updateTooltipPosition(event);\n })\n .on('mouseleave', (event: MouseEvent) => {\n if (!this._initialAnimationComplete()) return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n barEl.transition().duration(this.HOVER_TRANSITION_DURATION).style('filter', null);\n this._tooltipVisible.set(false);\n })\n .on('click', (event: MouseEvent, d: ClusteredBarDatum) => {\n if (!this._initialAnimationComplete()) return;\n const item = d.group.chartData[d.seriesIndex];\n if (item) this.handleBarClick(event, item);\n });\n\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n bars\n .transition()\n .duration(animationDuration)\n .delay((_d: unknown, i: number) => i * animationDelay)\n .attrTween('d', (d: ClusteredBarDatum) => {\n const x = this.xSubScale(d.seriesLabel);\n const width = this.xSubScale.bandwidth();\n const item = d.group.chartData[d.seriesIndex];\n const finalHeight = item ? this.height - this.yScale(item.value) : 0;\n\n return (t: number) => {\n const currentHeight = finalHeight * t;\n const currentY = this.height - currentHeight;\n const bottomY = this.height - 0.5; // Add small gap to prevent overlap with x-axis\n\n if (radius > 0 && currentHeight > 0) {\n // Limit radius to prevent it from exceeding half the bar width\n const effectiveRadius = Math.min(radius, width / 2);\n return `M${x},${bottomY} L${x},${currentY + effectiveRadius} Q${x},${currentY} ${x + effectiveRadius},${currentY} L${x + width - effectiveRadius},${currentY} Q${x + width},${currentY} ${x + width},${currentY + effectiveRadius} L${x + width},${bottomY} Z`;\n } else {\n return `M${x},${bottomY} L${x},${currentY} L${x + width},${currentY} L${x + width},${bottomY} Z`;\n }\n };\n })\n .ease(animationEasing)\n .end()\n .then(() => this._initialAnimationComplete.set(true));\n }\n\n /**\n * Gets the appropriate D3 easing function based on the option string\n */\n // getEasingFunction moved to shared chart utils\n\n /**\n * Handles bar hover event and shows tooltip\n */\n private handleBarHover(event: MouseEvent, datum: AXBarChartData, group?: { id: string; label: string }): void {\n if (this.effectiveOptions().showTooltip !== false) {\n const dataValue = this.data() as AXBarChartValue;\n const isClustered = this.isClusteredData(dataValue);\n const flatData: AXBarChartData[] = isClustered\n ? (dataValue as AXBarChartClusteredData[]).flatMap((g) => g.chartData)\n : (dataValue as AXBarChartData[]) || [];\n const index = flatData.findIndex((item) => item.id === datum.id && item.label === datum.label);\n const color = datum.color || this.getColor(index !== -1 ? index : 0);\n\n // Calculate percentage of total\n const total = isClustered\n ? (dataValue as AXBarChartClusteredData[]).reduce(\n (sum, g) => sum + g.chartData.reduce((s, it) => s + it.value, 0),\n 0,\n )\n : (flatData as AXBarChartData[]).reduce((sum, item) => sum + item.value, 0);\n const percentage = total > 0 ? ((datum.value / total) * 100).toFixed(1) : '0';\n\n this._tooltipData.set({\n title: group ? `${datum.tooltipLabel || datum.label} — ${group.label}` : datum.tooltipLabel || datum.label,\n value: formatLargeNumber(datum.value),\n percentage: `${percentage}%`,\n color: color,\n });\n\n this.updateTooltipPosition(event);\n this._tooltipVisible.set(true);\n }\n }\n\n private updateTooltipPosition(event: MouseEvent): void {\n this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n if (this._tooltipRafId != null) return;\n this._tooltipRafId = requestAnimationFrame(() => {\n this._tooltipRafId = null;\n const coords = this._pendingTooltipCoords;\n if (!coords) return;\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl) return;\n const containerRect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip') as HTMLElement | null;\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = this.computeEnhancedTooltipPosition(containerRect, tooltipRect, coords.x, coords.y);\n this._tooltipPosition.set(pos);\n });\n }\n\n /**\n * Enhanced tooltip positioning that considers chart boundaries and prevents overflow\n */\n private computeEnhancedTooltipPosition(\n containerRect: DOMRect,\n tooltipRect: DOMRect | null,\n clientX: number,\n clientY: number,\n ): { x: number; y: number } {\n const cursorX = clientX - containerRect.left;\n const cursorY = clientY - containerRect.top;\n\n if (!tooltipRect) {\n // Default positioning when tooltip dimensions are unknown\n return {\n x: Math.min(cursorX + this.TOOLTIP_GAP, containerRect.width - this.TOOLTIP_GAP),\n y: Math.max(this.TOOLTIP_GAP, Math.min(cursorY, containerRect.height - this.TOOLTIP_GAP)),\n };\n }\n\n // Calculate available space in each direction\n const spaceRight = containerRect.width - cursorX;\n const spaceLeft = cursorX;\n const spaceBelow = containerRect.height - cursorY;\n const spaceAbove = cursorY;\n\n // Determine best horizontal position\n let x: number;\n if (spaceRight >= tooltipRect.width + this.TOOLTIP_GAP) {\n // Position to the right of cursor\n x = cursorX + this.TOOLTIP_GAP;\n } else if (spaceLeft >= tooltipRect.width + this.TOOLTIP_GAP) {\n // Position to the left of cursor\n x = cursorX - tooltipRect.width - this.TOOLTIP_GAP;\n } else {\n // Center horizontally if neither side has enough space\n x = Math.max(\n this.TOOLTIP_GAP,\n Math.min(\n (containerRect.width - tooltipRect.width) / 2,\n containerRect.width - tooltipRect.width - this.TOOLTIP_GAP,\n ),\n );\n }\n\n // Calculate best vertical position\n let y: number;\n if (spaceBelow >= tooltipRect.height + this.TOOLTIP_GAP) {\n // Position below cursor\n y = cursorY + this.TOOLTIP_GAP;\n } else if (spaceAbove >= tooltipRect.height + this.TOOLTIP_GAP) {\n // Position above cursor\n y = cursorY - tooltipRect.height - this.TOOLTIP_GAP;\n } else {\n // Center vertically if neither direction has enough space\n y = Math.max(\n this.TOOLTIP_GAP,\n Math.min(\n (containerRect.height - tooltipRect.height) / 2,\n containerRect.height - tooltipRect.height - this.TOOLTIP_GAP,\n ),\n );\n }\n\n // Ensure tooltip stays within container bounds\n x = Math.max(this.TOOLTIP_GAP, Math.min(x, containerRect.width - tooltipRect.width - this.TOOLTIP_GAP));\n y = Math.max(this.TOOLTIP_GAP, Math.min(y, containerRect.height - tooltipRect.height - this.TOOLTIP_GAP));\n\n return { x, y };\n }\n\n /**\n * Handles bar click event\n */\n private handleBarClick(event: MouseEvent, datum: AXBarChartData): void {\n this.barClick.emit({ item: datum, event: { nativeEvent: event, sender: this } });\n }\n\n /**\n * Shows a message when no data is available\n */\n private showNoDataMessage(containerElement: HTMLElement): void {\n this.clearChartArea(containerElement);\n this.showMessage(\n containerElement,\n this.effectiveMessages().noDataIcon,\n this.effectiveMessages().noData,\n this.effectiveMessages().noDataHelp,\n 'ax-bar-chart-no-data-message',\n );\n }\n\n /**\n * Shows a message when all bars are hidden\n */\n private showAllBarsHiddenMessage(containerElement: HTMLElement): void {\n this.clearChartArea(containerElement);\n this.showMessage(\n containerElement,\n this.effectiveMessages().allHiddenIcon,\n this.effectiveMessages().allHidden,\n this.effectiveMessages().allHiddenHelp,\n 'ax-bar-chart-no-data-message',\n );\n }\n\n /**\n * Gets the color for a bar based on its index\n */\n protected getColor(index: number): string {\n return getChartColor(index, this.chartColors);\n }\n\n /**\n * Checks if a bar is hidden\n */\n protected isBarHidden(id: string): boolean {\n return this.hiddenBars.has(id);\n }\n\n /**\n * Implementation of AXChartLegendCompatible interface\n * Returns legend items based on the chart data\n */\n getLegendItems(): AXChartLegendItem[] {\n const value = (this.data() || []) as AXBarChartValue;\n if (this.isClusteredData(value)) {\n const groups = value as AXBarChartClusteredData[];\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const total = groups.reduce(\n (sum, g) => sum + g.chartData.reduce((s, it) => s + (typeof it.value === 'number' ? it.value : 0), 0),\n 0,\n );\n return seriesLabels.map((label, index) => {\n const seriesTotal = groups.reduce((s, g) => {\n const item = g.chartData[index];\n const v = item && typeof item.value === 'number' ? item.value : 0;\n return s + v;\n }, 0);\n const percentage = total > 0 ? (seriesTotal / total) * 100 : 0;\n const firstItem = groups[0]?.chartData[index];\n return {\n id: label,\n name: label || `Series ${index + 1}`,\n value: seriesTotal,\n percentage,\n color: firstItem?.color || this.getColor(index),\n hidden: this.hiddenSeries.has(label),\n };\n });\n }\n\n const flat = value as AXBarChartData[];\n const total = flat.reduce((sum, item) => sum + (typeof item.value === 'number' ? item.value : 0), 0);\n return flat.map((item, index) => {\n const val = typeof item.value === 'number' ? item.value : 0;\n const percentage = total > 0 ? (val / total) * 100 : 0;\n return {\n id: item.id,\n name: item.label || `Item ${index + 1}`,\n value: item.value,\n percentage,\n color: item.color || this.getColor(index),\n hidden: this.isBarHidden(item.id),\n };\n });\n }\n\n /**\n * Implementation of AXChartLegendCompatible interface\n * Highlights a specific bar by ID\n */\n highlightSegment(id: string | null): void {\n if (!this.svg) return;\n\n const value = (this.data() || []) as AXBarChartValue;\n const isClustered = this.isClusteredData(value);\n\n const resetAll = () => {\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .classed('ax-bar-chart-highlighted', false)\n .classed('ax-bar-chart-dimmed', false)\n .attr('opacity', 1)\n .attr('filter', null)\n .attr('stroke', null)\n .attr('stroke-width', null)\n .attr('stroke-opacity', null);\n };\n\n if (id === null) {\n resetAll();\n return;\n }\n\n if (!isClustered) {\n if (this.isBarHidden(id as string)) {\n resetAll();\n return;\n }\n const targetBar = this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((d: unknown) => (d as AXBarChartData | undefined)?.id === id);\n if (targetBar.empty()) return;\n const isCurrentlyHighlighted = targetBar.classed('ax-bar-chart-highlighted');\n if (isCurrentlyHighlighted) {\n resetAll();\n } else {\n resetAll();\n targetBar\n .classed('ax-bar-chart-highlighted', true)\n .attr('filter', 'drop-shadow(0 0 4px rgba(0, 0, 0, 0.3))')\n .attr('stroke', '#000')\n .attr('stroke-width', '1px')\n .attr('stroke-opacity', '0.3')\n .style('transition', 'all 0.2s ease-in-out');\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((d: unknown) => (d as AXBarChartData | undefined)?.id !== id)\n .classed('ax-bar-chart-dimmed', true)\n .attr('opacity', 0.5)\n .style('transition', 'opacity 0.2s ease-in-out');\n }\n return;\n }\n\n const targetBars = this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((_d: unknown, i: number, nodes: SVGPathElement[]) => {\n const node = nodes[i];\n return node.getAttribute('data-series') === id;\n });\n if (targetBars.empty()) return;\n const isHighlighted = targetBars.classed('ax-bar-chart-highlighted');\n if (isHighlighted) {\n resetAll();\n } else {\n resetAll();\n targetBars\n .classed('ax-bar-chart-highlighted', true)\n .attr('filter', 'drop-shadow(0 0 4px rgba(0, 0, 0, 0.3))')\n .attr('stroke', '#000')\n .attr('stroke-width', '1px')\n .attr('stroke-opacity', '0.3')\n .style('transition', 'all 0.2s ease-in-out');\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((_d: unknown, i: number, nodes: SVGPathElement[]) => nodes[i].getAttribute('data-series') !== id)\n .classed('ax-bar-chart-dimmed', true)\n .attr('opacity', 0.5)\n .style('transition', 'opacity 0.2s ease-in-out');\n }\n }\n\n /**\n * Implementation of AXChartLegendCompatible interface\n * Toggles visibility of a bar by ID\n * @returns New visibility state (true = visible, false = hidden)\n */\n toggleSegment(id: string): boolean {\n const value = (this.data() || []) as AXBarChartValue;\n const isClustered = this.isClusteredData(value);\n\n if (!isClustered) {\n const wasAllHidden =\n (value as AXBarChartData[]).length > 0 && (value as AXBarChartData[]).every((d) => this.isBarHidden(d.id));\n if (this.hiddenBars.has(id)) {\n this.hiddenBars.delete(id);\n if (wasAllHidden) {\n if (this.chartContainerEl()?.nativeElement) {\n this.d3\n ?.select(this.chartContainerEl().nativeElement)\n .selectAll('svg, .ax-chart-message-container')\n .remove();\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n } else {\n this.updateChart();\n }\n } else {\n this.hiddenBars.add(id);\n this.updateChart();\n }\n return !this.hiddenBars.has(id);\n }\n\n // Clustered mode: toggle series by label\n const groups = value as AXBarChartClusteredData[];\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const seriesCount = seriesLabels.length;\n const wasAllHidden = seriesCount > 0 && this.hiddenSeries.size >= seriesCount;\n\n if (this.hiddenSeries.has(id)) {\n this.hiddenSeries.delete(id);\n if (wasAllHidden) {\n if (this.chartContainerEl()?.nativeElement) {\n this.d3?.select(this.chartContainerEl().nativeElement).selectAll('svg, .ax-chart-message-container').remove();\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n } else {\n this.updateChart();\n }\n } else {\n this.hiddenSeries.add(id);\n this.updateChart();\n }\n\n return !this.hiddenSeries.has(id);\n }\n\n // ===== Helper utilities for modularity and maintainability =====\n\n private getContainerElement(): HTMLElement | null {\n return this.chartContainerEl()?.nativeElement ?? null;\n }\n\n private clearChartArea(containerElement: HTMLElement): void {\n this.d3.select(containerElement).selectAll('svg, .ax-chart-message-container').remove();\n }\n\n /**\n * Truncates long labels with ellipsis\n */\n private truncateLabel(label: string, maxLength: number = this.MAX_LABEL_LENGTH): string {\n if (label.length <= maxLength) return label;\n return label.substring(0, maxLength - 1) + '…';\n }\n\n /**\n * Gets adaptive font size for X-axis based on width and item count\n */\n private getXAxisTickFontSizeBasedOnWidth(): number {\n const itemCount = this.xScale.domain().length;\n const baseSize = Math.round(this.width / 50);\n\n // Reduce font size for many items\n let adjustedSize = baseSize;\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n adjustedSize = Math.round(baseSize * 0.7);\n } else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n adjustedSize = Math.round(baseSize * 0.85);\n }\n\n return Math.max(this.MIN_FONT_SIZE_X_AXIS, Math.min(this.MAX_FONT_SIZE_X_AXIS, adjustedSize));\n }\n\n /**\n * Gets adaptive font size for Y-axis based on height\n */\n private getYAxisTickFontSizeBasedOnHeight(): number {\n const baseSize = Math.round(this.height / 30);\n return Math.max(this.MIN_FONT_SIZE_Y_AXIS, Math.min(this.MAX_FONT_SIZE_Y_AXIS, baseSize));\n }\n\n private buildXAxisCommon(\n axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n idToLabel: Map<string, string>,\n options: AXBarChartOption,\n ): void {\n const itemCount = this.xScale.domain().length;\n\n // Smart tick reduction for many items\n let tickValues = this.xScale.domain();\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n // Show every 5th tick\n tickValues = tickValues.filter((_d, i) => i % 5 === 0);\n } else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n // Show every 2nd tick\n tickValues = tickValues.filter((_d, i) => i % 2 === 0);\n }\n\n const axis = this.d3\n .axisBottom(this.xScale)\n .tickValues(tickValues)\n .tickFormat((id: string) => {\n const label = idToLabel.get(id) ?? String(id);\n // Truncate long labels intelligently\n const maxLength = itemCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n return this.truncateLabel(label, maxLength);\n });\n\n this.xAxis = axesGroup\n .append('g')\n .attr('class', 'ax-bar-chart-axis-x')\n .attr('transform', `translate(0,${this.height})`)\n .call(axis);\n\n const dynamicFontSize = this.getXAxisTickFontSizeBasedOnWidth();\n const xAxisTicks = this.xAxis\n .selectAll('text')\n .style('font-size', `${dynamicFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)')\n .attr('direction', 'ltr');\n\n const isRotated = this.shouldRotateXAxisLabels(idToLabel, dynamicFontSize);\n if (isRotated) {\n xAxisTicks.attr('transform', 'rotate(-45)').style('text-anchor', 'end').attr('dx', '-0.8em').attr('dy', '0.15em');\n }\n\n this.xAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n\n if (options.xAxisLabel && !isRotated) {\n const tickNodes = (this.xAxis.selectAll('text').nodes() || []) as SVGTextElement[];\n const measuredTickHeight =\n tickNodes.length > 0\n ? Math.max(\n ...tickNodes.map((n) => {\n try {\n return n?.getBBox?.()?.height ?? dynamicFontSize;\n } catch {\n return dynamicFontSize;\n }\n }),\n )\n : dynamicFontSize;\n const tickAreaHeight = measuredTickHeight + this.TICK_AREA_PADDING;\n const gapBelowTicks = this.X_AXIS_TITLE_GAP;\n this.createXAxisTitle(axesGroup, options.xAxisLabel, tickAreaHeight, gapBelowTicks);\n }\n }\n\n // computeTooltipPosition moved to shared chart utils\n\n private showMessage(\n containerElement: HTMLElement,\n iconClass: string,\n text: string,\n helpText: string,\n specificClass: string,\n ): void {\n const container = this.d3\n .select(containerElement)\n .append('div')\n .attr('class', `ax-chart-message-container ax-bar-chart-message-background ${specificClass}`);\n\n container\n .append('div')\n .attr('class', 'ax-chart-message-icon ax-bar-chart-no-data-icon')\n .html(`<i class=\"${iconClass} fa-2x\"></i>`);\n\n container.append('div').attr('class', 'ax-chart-message-text ax-bar-chart-no-data-text').text(text);\n\n container.append('div').attr('class', 'ax-chart-message-help ax-bar-chart-no-data-help').text(helpText);\n }\n}\n","<div class=\"ax-bar-chart\" role=\"img\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"true\"\n ></ax-chart-tooltip>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acorex-charts-bar-chart.mjs","sources":["../tmp-esm2022/bar-chart/lib/bar-chart.config.js","../tmp-esm2022/bar-chart/lib/bar-chart.component.js","../tmp-esm2022/bar-chart/acorex-charts-bar-chart.js"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nexport const AXBarChartDefaultConfig = {\n showXAxis: true,\n showYAxis: true,\n showGrid: true,\n showDataLabels: true,\n showTooltip: true,\n rotateXAxisLabels: 'auto',\n barWidth: 80,\n cornerRadius: 4,\n animationDuration: 800,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All bars are hidden',\n allHiddenHelp: 'Click on legend items to show bars',\n noDataIcon: 'fa-light fa-chart-column',\n allHiddenIcon: 'fa-light fa-eye-slash',\n },\n};\nexport const AX_BAR_CHART_CONFIG = new InjectionToken('AX_BAR_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXBarChartDefaultConfig,\n});\nexport function barChartConfig(config = {}) {\n const result = {\n ...AXBarChartDefaultConfig,\n ...config,\n };\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9iYXItY2hhcnQvc3JjL2xpYi9iYXItY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQXFCO0lBQ3ZELFNBQVMsRUFBRSxJQUFJO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixRQUFRLEVBQUUsSUFBSTtJQUNkLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGlCQUFpQixFQUFFLE1BQU07SUFDekIsUUFBUSxFQUFFLEVBQUU7SUFDWixZQUFZLEVBQUUsQ0FBQztJQUNmLGlCQUFpQixFQUFFLEdBQUc7SUFDdEIsZUFBZSxFQUFFLFdBQVc7SUFDNUIsUUFBUSxFQUFFO1FBQ1IsTUFBTSxFQUFFLG1CQUFtQjtRQUMzQixVQUFVLEVBQUUsMENBQTBDO1FBQ3RELFNBQVMsRUFBRSxxQkFBcUI7UUFDaEMsYUFBYSxFQUFFLG9DQUFvQztRQUNuRCxVQUFVLEVBQUUsMEJBQTBCO1FBQ3RDLGFBQWEsRUFBRSx1QkFBdUI7S0FDdkM7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxjQUFjLENBQW1CLHFCQUFxQixFQUFFO0lBQzdGLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyx1QkFBdUI7Q0FDdkMsQ0FBQyxDQUFDO0FBSUgsTUFBTSxVQUFVLGNBQWMsQ0FBQyxTQUFnQyxFQUFFO0lBQy9ELE1BQU0sTUFBTSxHQUFHO1FBQ2IsR0FBRyx1QkFBdUI7UUFDMUIsR0FBRyxNQUFNO0tBQ1YsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhCYXJDaGFydE9wdGlvbiB9IGZyb20gJy4vYmFyLWNoYXJ0LnR5cGUnO1xuXG5leHBvcnQgY29uc3QgQVhCYXJDaGFydERlZmF1bHRDb25maWc6IEFYQmFyQ2hhcnRPcHRpb24gPSB7XG4gIHNob3dYQXhpczogdHJ1ZSxcbiAgc2hvd1lBeGlzOiB0cnVlLFxuICBzaG93R3JpZDogdHJ1ZSxcbiAgc2hvd0RhdGFMYWJlbHM6IHRydWUsXG4gIHNob3dUb29sdGlwOiB0cnVlLFxuICByb3RhdGVYQXhpc0xhYmVsczogJ2F1dG8nLFxuICBiYXJXaWR0aDogODAsXG4gIGNvcm5lclJhZGl1czogNCxcbiAgYW5pbWF0aW9uRHVyYXRpb246IDgwMCxcbiAgYW5pbWF0aW9uRWFzaW5nOiAnY3ViaWMtb3V0JyxcbiAgbWVzc2FnZXM6IHtcbiAgICBub0RhdGE6ICdObyBkYXRhIGF2YWlsYWJsZScsXG4gICAgbm9EYXRhSGVscDogJ1BsZWFzZSBwcm92aWRlIGRhdGEgdG8gZGlzcGxheSB0aGUgY2hhcnQnLFxuICAgIGFsbEhpZGRlbjogJ0FsbCBiYXJzIGFyZSBoaWRkZW4nLFxuICAgIGFsbEhpZGRlbkhlbHA6ICdDbGljayBvbiBsZWdlbmQgaXRlbXMgdG8gc2hvdyBiYXJzJyxcbiAgICBub0RhdGFJY29uOiAnZmEtbGlnaHQgZmEtY2hhcnQtY29sdW1uJyxcbiAgICBhbGxIaWRkZW5JY29uOiAnZmEtbGlnaHQgZmEtZXllLXNsYXNoJyxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBBWF9CQVJfQ0hBUlRfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPEFYQmFyQ2hhcnRPcHRpb24+KCdBWF9CQVJfQ0hBUlRfQ09ORklHJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IEFYQmFyQ2hhcnREZWZhdWx0Q29uZmlnLFxufSk7XG5cbmV4cG9ydCB0eXBlIFBhcnRpYWxCYXJDaGFydENvbmZpZyA9IFBhcnRpYWw8QVhCYXJDaGFydE9wdGlvbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXJDaGFydENvbmZpZyhjb25maWc6IFBhcnRpYWxCYXJDaGFydENvbmZpZyA9IHt9KTogQVhCYXJDaGFydE9wdGlvbiB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAuLi5BWEJhckNoYXJ0RGVmYXVsdENvbmZpZyxcbiAgICAuLi5jb25maWcsXG4gIH07XG4gIHJldHVybiByZXN1bHQ7XG59XG4iXX0=","import { AX_CHART_COLOR_PALETTE, AXChartComponent, formatLargeNumber, getChartColor, getEasingFunction, } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { afterNextRender, ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal, viewChild, ViewEncapsulation, } from '@angular/core';\nimport { AX_BAR_CHART_CONFIG } from './bar-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * Bar Chart Component\n * Renders data as vertical bars with interactive hover effects and animations\n */\nexport class AXBarChartComponent extends AXChartComponent {\n // Inputs\n /** Chart data input */\n data = input([], ...(ngDevMode ? [{ debugName: \"data\" }] : []));\n /** Chart options input */\n options = input({}, ...(ngDevMode ? [{ debugName: \"options\" }] : []));\n // Outputs\n /** Emitted when a bar is clicked */\n barClick = output();\n // Chart container reference\n chartContainerEl = viewChild.required('chartContainer');\n // D3 reference - loaded asynchronously\n d3;\n // Chart elements - using proper D3 types\n svg;\n chart;\n xScale;\n yScale;\n xSubScale;\n xAxis;\n yAxis;\n // Chart dimensions\n width;\n height;\n margin = { top: 0, right: 0, bottom: 0, left: 0 };\n // Constants for layout calculations\n CHAR_WIDTH_RATIO = 0.65;\n TOOLTIP_GAP = 10;\n AXIS_TICK_PADDING = 10;\n Y_AXIS_TITLE_THICKNESS = 14;\n Y_AXIS_TITLE_PADDING = 14;\n X_AXIS_TITLE_FONT_SIZE = 14;\n X_AXIS_TITLE_GAP = 14;\n X_AXIS_TITLE_BLOCK_HEIGHT = 24;\n TOP_EDGE_PADDING = 8;\n BOTTOM_EDGE_PADDING = 8;\n HORIZONTAL_EDGE_PADDING = 12;\n FALLBACK_PLOT_HEIGHT = 240;\n MIN_PLOT_HEIGHT = 120;\n MIN_TOTAL_WIDTH = 200;\n OUTER_PADDING_CLUSTERED = 0.2;\n INNER_PADDING_CLUSTERED = 0.1;\n MIN_PADDING = 0.1;\n HOVER_TRANSITION_DURATION = 150;\n DEFAULT_ANIMATION_DELAY = 50;\n LABEL_ANIMATION_DELAY = 100;\n MIN_TOP_SPACE_FOR_LABEL = 20;\n LABEL_OFFSET = 8;\n ROTATION_TOLERANCE_SMALL_DATASET = 1.4;\n SMALL_DATASET_THRESHOLD = 6;\n Y_AXIS_PADDING = 20;\n TICK_AREA_PADDING = 6;\n TICK_AREA_GAP = 8;\n DEFAULT_FONT_SIZE = 13;\n FONT_WIDTH_MULTIPLIER = 0.6;\n FONT_PADDING = 8;\n MAX_LABEL_LENGTH = 20;\n MIN_FONT_SIZE_X_AXIS = 8;\n MAX_FONT_SIZE_X_AXIS = 14;\n MIN_FONT_SIZE_Y_AXIS = 9;\n MAX_FONT_SIZE_Y_AXIS = 15;\n MANY_ITEMS_THRESHOLD = 20;\n VERY_MANY_ITEMS_THRESHOLD = 50;\n // Animation state\n _initialAnimationComplete = signal(false, ...(ngDevMode ? [{ debugName: \"_initialAnimationComplete\" }] : []));\n // Tooltip state\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 _tooltipRafId = null;\n _pendingTooltipCoords = null;\n // Signals for component state\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\n // Tooltip accessors\n tooltipVisible = this._tooltipVisible.asReadonly();\n tooltipPosition = this._tooltipPosition.asReadonly();\n tooltipData = this._tooltipData.asReadonly();\n // Inject configuration\n configToken = inject(AX_BAR_CHART_CONFIG);\n // Inject the chart colors\n chartColors = inject(AX_CHART_COLOR_PALETTE);\n // Inject AXPlatform\n // Removed unused AXPlatform injection\n // Configuration with defaults\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 bars are hidden',\n allHiddenHelp: 'Click on legend items to show bars',\n noDataIcon: 'fa-light fa-chart-column',\n allHiddenIcon: 'fa-light fa-eye-slash',\n };\n return {\n ...defaultMessages,\n ...this.effectiveOptions().messages,\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveMessages\" }] : []));\n // Track hidden bars and series\n hiddenBars = new Set();\n hiddenSeries = new Set();\n // Computed values for better performance\n isClusteredMode = computed(() => {\n const value = this.data();\n return Array.isArray(value) && value.length > 0 && 'chartData' in value[0];\n }, ...(ngDevMode ? [{ debugName: \"isClusteredMode\" }] : []));\n visibleData = computed(() => {\n const value = this.data() || [];\n if (this.isClusteredMode()) {\n return value;\n }\n return value.filter((d) => !this.hiddenBars.has(d.id));\n }, ...(ngDevMode ? [{ debugName: \"visibleData\" }] : []));\n hasVisibleData = computed(() => {\n const value = this.data();\n if (!Array.isArray(value) || value.length === 0)\n return false;\n if (this.isClusteredMode()) {\n const groups = value;\n const seriesLabels = this.getClusterSeriesLabels(groups);\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n return groups.some((g) => visibleSeries.some((_, idx) => !!g.chartData[idx]));\n }\n return value.some((d) => !this.hiddenBars.has(d.id));\n }, ...(ngDevMode ? [{ debugName: \"hasVisibleData\" }] : []));\n // Type guard helper\n isClusteredData(value) {\n return Array.isArray(value) && value.length > 0 && 'chartData' in value[0];\n }\n getClusterSeriesLabels(groups) {\n return groups[0]?.chartData?.map((d) => d.label) ?? [];\n }\n constructor() {\n super();\n // Dynamically load D3 and initialize the chart when the component is ready\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\n // Create chart after D3 is loaded and container is available\n if (this.d3 && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n });\n // Watch for changes to redraw the chart\n effect(() => {\n // Access inputs to track them\n this.data();\n this.effectiveOptions();\n // Only update if already rendered\n if (this._rendered()) {\n this.updateChart();\n }\n });\n }\n ngOnDestroy() {\n this.cleanupChart();\n }\n /**\n * Loads D3.js dynamically\n */\n async loadD3() {\n try {\n this.d3 = await import('d3');\n // If container is ready, create chart\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n }\n catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n /**\n * Creates the bar chart SVG and renders all elements\n */\n createChart() {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement)\n return;\n const containerElement = this.chartContainerEl().nativeElement;\n const inputValue = (this.data() || []);\n const isClustered = this.isClusteredData(inputValue);\n // Use computed visibility\n const hasAnyVisible = this.hasVisibleData();\n const visibleSingleData = isClustered ? [] : this.visibleData();\n const groupedData = isClustered ? inputValue : [];\n // Clear existing chart SVG and messages (do not remove tooltip component)\n this.d3.select(containerElement).selectAll('svg, .ax-chart-message-container').remove();\n // Early return if no data\n if (!Array.isArray(inputValue) || inputValue.length === 0) {\n this.showNoDataMessage(containerElement);\n return;\n }\n // Early return if all bars are hidden\n if (!hasAnyVisible) {\n this.showAllBarsHiddenMessage(containerElement);\n return;\n }\n // Get options and setup dimensions\n const chartOptions = this.effectiveOptions();\n this.setupDimensions(containerElement, chartOptions);\n // Create scales and axes and render based on mode\n if (isClustered) {\n this.setupScalesClustered(groupedData);\n this.createAxesClustered(chartOptions, groupedData);\n this.renderBarsClustered(groupedData);\n }\n else {\n this.setupScales(visibleSingleData);\n this.createAxes(chartOptions);\n this.renderBars(visibleSingleData);\n }\n }\n /**\n * Updates the chart when inputs change\n */\n updateChart() {\n this.createChart();\n }\n /**\n * Cleans up chart resources\n */\n cleanupChart() {\n if (this._tooltipRafId != null) {\n cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = null;\n }\n this._pendingTooltipCoords = null;\n const container = this.chartContainerEl()?.nativeElement;\n if (container) {\n this.d3?.select(container).selectAll('svg, .ax-chart-message-container').remove();\n }\n this.svg = undefined;\n this.chart = undefined;\n this._tooltipVisible.set(false);\n }\n /**\n * Sets up chart dimensions and creates SVG with responsive attributes\n */\n setupDimensions(containerElement, options) {\n // Remove outer margins; calculate only internal paddings for axes and labels\n this.margin = { top: 0, right: 0, bottom: 0, left: 0 };\n // Get container dimensions\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n // Axis visibility\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n // Internal left padding for Y-axis ticks/labels/title\n const yAxisTitleThickness = options.yAxisLabel ? this.Y_AXIS_TITLE_THICKNESS : 0;\n const yAxisTitlePadding = options.yAxisLabel ? this.Y_AXIS_TITLE_PADDING : 0;\n const leftPaddingForYAxis = showYAxis\n ? this.calculateMaxYAxisTickLabelWidth() + this.AXIS_TICK_PADDING + yAxisTitlePadding + yAxisTitleThickness\n : 0;\n const leftInnerPadding = leftPaddingForYAxis + this.HORIZONTAL_EDGE_PADDING;\n const rightInnerPadding = this.HORIZONTAL_EDGE_PADDING;\n // Estimate internal bottom padding for X-axis ticks/labels/title\n let bottomPaddingForXAxis = 0;\n if (showXAxis) {\n const raw = (this.data() || []);\n const isClustered = this.isClusteredData(raw);\n const barCount = isClustered ? raw.length : raw.length;\n const longestLabel = (() => {\n if (isClustered) {\n const groups = raw;\n return groups.reduce((acc, g) => (acc.length > (g.label?.length ?? 0) ? acc : (g.label ?? '')), '');\n }\n const flat = raw || [];\n return flat.reduce((a, b) => (a.length > b.label.length ? a : b.label), '');\n })();\n const baseWidth = options.width ?? containerWidth;\n const workingWidth = Math.max(1, baseWidth - leftInnerPadding - rightInnerPadding);\n const dynamicFontSize = Math.max(10, Math.min(14, Math.round(workingWidth / 50)));\n // Use truncated label length for calculation (same logic as actual rendering)\n const maxLabelLength = barCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n const effectiveLabelLength = Math.min(longestLabel.length, maxLabelLength);\n const estimatedLongestLabelWidth = effectiveLabelLength * dynamicFontSize * 0.65;\n const availableWidthPerBar = barCount > 0 ? workingWidth / barCount : workingWidth;\n const rotateOption = typeof options.rotateXAxisLabels === 'boolean' ? options.rotateXAxisLabels : undefined;\n const willRotate = this.shouldLabelsRotate(rotateOption, estimatedLongestLabelWidth, availableWidthPerBar);\n const tickAreaHeight = willRotate\n ? estimatedLongestLabelWidth * Math.SQRT1_2 + dynamicFontSize * Math.SQRT1_2 + this.TICK_AREA_PADDING\n : dynamicFontSize + this.TICK_AREA_PADDING + 2;\n const gapBelowTicks = options.xAxisLabel && !willRotate ? this.X_AXIS_TITLE_GAP : 0;\n const titleBlockHeight = options.xAxisLabel && !willRotate ? this.X_AXIS_TITLE_BLOCK_HEIGHT : 0;\n bottomPaddingForXAxis = tickAreaHeight + gapBelowTicks + titleBlockHeight;\n }\n // Determine plotting dimensions with sensible fallbacks\n const baseWidth = options.width ?? containerWidth;\n const totalWidth = Math.max(this.MIN_TOTAL_WIDTH, baseWidth > 0 ? baseWidth : this.MIN_TOTAL_WIDTH);\n const plotWidth = Math.max(0, totalWidth - leftInnerPadding - rightInnerPadding);\n const plotHeight = this.calculatePlotHeight(options.height, containerHeight, bottomPaddingForXAxis);\n this.width = plotWidth;\n this.height = plotHeight;\n // Create SVG with explicit pixel dimensions to avoid collapse\n const totalHeight = this.height + bottomPaddingForXAxis + this.TOP_EDGE_PADDING + this.BOTTOM_EDGE_PADDING;\n const svg = this.d3\n .select(containerElement)\n .append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${totalWidth} ${totalHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n this.svg = svg;\n // Create chart group translated by internal paddings (no external margins)\n this.chart = this.svg\n .append('g')\n .attr('class', 'chart-content')\n .attr('transform', `translate(${leftInnerPadding},${this.TOP_EDGE_PADDING})`);\n }\n /**\n * Calculates plot height based on options and container dimensions\n */\n calculatePlotHeight(optionHeight, containerHeight, bottomPadding) {\n if (optionHeight && optionHeight > 0) {\n return Math.max(this.MIN_PLOT_HEIGHT, optionHeight - bottomPadding);\n }\n if (containerHeight > 0) {\n return Math.max(this.MIN_PLOT_HEIGHT, containerHeight - bottomPadding, this.FALLBACK_PLOT_HEIGHT);\n }\n return this.FALLBACK_PLOT_HEIGHT;\n }\n /**\n * Determines if X-axis labels should rotate\n */\n shouldLabelsRotate(rotateOption, estimatedWidth, availableWidth) {\n if (rotateOption === true)\n return true;\n if (rotateOption === false)\n return false;\n return estimatedWidth > availableWidth;\n }\n /**\n * Creates x and y scales for the chart\n */\n setupScales(data) {\n // Get the bar width percentage (default 60%)\n const barWidthPercent = this.effectiveOptions().barWidth ?? 0.6;\n // Calculate padding based on barWidth (inverse relationship)\n const padding = Math.max(this.MIN_PADDING, 1 - barWidthPercent);\n // Create x scale (band scale for categorical data)\n this.xScale = this.d3\n .scaleBand()\n .domain(data.map((d) => d.id))\n .range([0, this.width])\n .padding(padding);\n // Create y scale (linear scale for values)\n // Support negative values by calculating min/max\n const minValue = this.d3.min(data, (d) => d.value) || 0;\n const maxValue = this.d3.max(data, (d) => d.value) || 0;\n this.yScale = this.d3\n .scaleLinear()\n .domain([Math.min(0, minValue), Math.max(0, maxValue)])\n .nice()\n .range([this.height, 0]);\n }\n /**\n * Creates x and y scales for clustered charts\n */\n setupScalesClustered(groups) {\n const seriesLabels = this.getClusterSeriesLabels(groups);\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n // Outer band for clusters\n this.xScale = this.d3\n .scaleBand()\n .domain(groups.map((g) => g.id))\n .range([0, this.width])\n .padding(this.OUTER_PADDING_CLUSTERED);\n // Inner band for series\n this.xSubScale = this.d3\n .scaleBand()\n .domain(visibleSeries)\n .range([0, this.xScale.bandwidth()])\n .padding(this.INNER_PADDING_CLUSTERED);\n // Y scale across all visible values (support negative values)\n const allVisibleValues = [];\n for (const g of groups) {\n visibleSeries.forEach((_, idx) => {\n const item = g.chartData[idx];\n if (item && typeof item.value === 'number')\n allVisibleValues.push(item.value);\n });\n }\n const yMin = this.d3.min(allVisibleValues) || 0;\n const yMax = this.d3.max(allVisibleValues) || 0;\n this.yScale = this.d3\n .scaleLinear()\n .domain([Math.min(0, yMin), Math.max(0, yMax)])\n .nice()\n .range([this.height, 0]);\n }\n /**\n * Creates x and y axes with grid lines\n */\n createAxes(options) {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n if (showXAxis) {\n this.createXAxis(axesGroup, options);\n }\n if (showYAxis) {\n this.createYAxis(axesGroup, options);\n }\n if (showGrid) {\n this.createGridLines();\n }\n }\n createXAxis(axesGroup, options) {\n const visibleDataForTicks = (this.data() || []).filter((d) => !this.isBarHidden(d.id));\n const idToLabel = new Map(visibleDataForTicks.map((d) => [d.id, d.label]));\n this.buildXAxisCommon(axesGroup, idToLabel, options);\n }\n createYAxis(axesGroup, options) {\n // Create Y axis with smart number formatting\n const yAxisGenerator = this.d3.axisLeft(this.yScale).tickFormat((value) => {\n const numValue = typeof value === 'number' ? value : value.valueOf();\n return formatLargeNumber(numValue);\n });\n // Reduce tick count for better readability\n const maxValue = this.yScale.domain()[1];\n if (maxValue > 1e6) {\n yAxisGenerator.ticks(6); // Fewer ticks for large numbers\n }\n else if (maxValue > 1e3) {\n yAxisGenerator.ticks(8);\n }\n this.yAxis = axesGroup.append('g').attr('class', 'ax-bar-chart-axis-y').call(yAxisGenerator);\n // Style the axis text\n const dynamicFontSize = this.getYAxisTickFontSizeBasedOnHeight();\n this.yAxis\n .selectAll('text')\n .style('font-size', `${dynamicFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)')\n .attr('text-anchor', 'end')\n .attr('direction', 'ltr');\n // Style axis lines\n this.yAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n // Add Y axis title\n if (options.yAxisLabel) {\n this.createYAxisTitle(axesGroup, options.yAxisLabel);\n }\n }\n shouldRotateXAxisLabels(idToLabel, fontSize) {\n const options = this.effectiveOptions();\n // Check if user explicitly set rotation option\n if (options.rotateXAxisLabels === true)\n return true;\n if (options.rotateXAxisLabels === false)\n return false;\n // If 'auto' or undefined, use intelligent calculation\n if (this.xScale.domain().length === 0)\n return false;\n const step = this.xScale.step();\n const labels = Array.from(idToLabel.values());\n const longestLabel = labels.reduce((a, b) => (a.length > b.length ? a : b), '');\n const estimatedWidth = longestLabel.length * fontSize * this.CHAR_WIDTH_RATIO;\n // Heuristic: avoid rotation when there are few categories even if estimation is slightly larger\n const domainCount = this.xScale.domain().length;\n if (domainCount <= this.SMALL_DATASET_THRESHOLD) {\n return estimatedWidth > step * this.ROTATION_TOLERANCE_SMALL_DATASET;\n }\n return estimatedWidth > step;\n }\n createXAxisTitle(axesGroup, title, tickAreaHeight, gapBelowTicks = this.TICK_AREA_GAP) {\n // Title positioned directly below tick area with a consistent gap\n const labelY = this.height + tickAreaHeight + gapBelowTicks;\n axesGroup\n .append('text')\n .attr('class', 'ax-bar-chart-axis-label ax-x-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'hanging') // Align to top of text for better positioning\n .attr('x', this.width / 2)\n .attr('y', labelY)\n .attr('direction', 'ltr')\n .style('font-size', `${this.X_AXIS_TITLE_FONT_SIZE}px`)\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(title);\n }\n createYAxisTitle(axesGroup, title) {\n // Calculate the exact position for Y-axis title\n // Y-axis tick labels use text-anchor: end, so they extend LEFT of the Y-axis line\n // Y-axis is at X = 0 within the chart group\n // Chart group is translated by (margin.left, margin.top)\n // So Y-axis is at X = margin.left in SVG coordinates\n const maxTickLabelWidth = this.calculateMaxYAxisTickLabelWidth();\n const padding = this.Y_AXIS_PADDING;\n // Position title to the left of the tick labels\n // Since text-anchor: end aligns the text to the Y-axis, we need to go further left\n const labelY = -maxTickLabelWidth - padding;\n // Center the title vertically\n const labelX = -this.height / 2;\n axesGroup\n .append('text')\n .attr('class', 'ax-bar-chart-axis-label ax-y-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('transform', 'rotate(-90)')\n .attr('x', labelX)\n .attr('y', labelY)\n .attr('direction', 'ltr')\n .style('font-size', '14px')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(title);\n }\n calculateMaxYAxisTickLabelWidth() {\n // Calculate the maximum width needed for Y-axis tick labels\n const raw = (this.data() || []);\n const isClustered = this.isClusteredData(raw);\n let maxValue = 0;\n if (isClustered) {\n const groups = raw;\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n for (const g of groups) {\n visibleSeries.forEach((_, idx) => {\n const item = g.chartData[idx];\n if (item && typeof item.value === 'number')\n maxValue = Math.max(maxValue, item.value);\n });\n }\n }\n else {\n const visibleData = raw.filter((d) => !this.isBarHidden(d.id));\n maxValue = visibleData.reduce((acc, d) => (d.value > acc ? d.value : acc), 0);\n }\n // Use formatted number for width calculation\n const tickLabelText = Number.isFinite(maxValue) ? formatLargeNumber(maxValue) : '00000';\n return tickLabelText.length * this.DEFAULT_FONT_SIZE * this.FONT_WIDTH_MULTIPLIER + this.FONT_PADDING;\n }\n createGridLines() {\n this.chart\n .append('g')\n .attr('class', 'ax-bar-chart-grid')\n .call(this.d3\n .axisLeft(this.yScale)\n .tickSize(-this.width)\n .tickFormat(() => ''))\n .selectAll('line')\n .style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))')\n .style('stroke-opacity', 0.2);\n // Remove unneeded elements from grid\n this.chart.select('.ax-bar-chart-grid').selectAll('path, text').remove();\n }\n /**\n * Creates axes for clustered charts\n */\n createAxesClustered(options, groups) {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n if (showXAxis) {\n this.createXAxisClustered(axesGroup, options, groups);\n }\n if (showYAxis) {\n this.createYAxis(axesGroup, options);\n }\n if (showGrid) {\n this.createGridLines();\n }\n }\n createXAxisClustered(axesGroup, options, groups) {\n const idToLabel = new Map(groups.map((g) => [g.id, g.label]));\n this.buildXAxisCommon(axesGroup, idToLabel, options);\n }\n /**\n * Renders the bars with animations\n */\n renderBars(data) {\n // Filter out hidden bars\n const visibleData = data.filter((d) => !this.isBarHidden(d.id));\n const originalFullData = this.data() || [];\n // Reset animation state\n this._initialAnimationComplete.set(false);\n // Get corner radius from options\n const radius = this.effectiveOptions().cornerRadius;\n // Get animation options\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n // Create a container for all bars\n const barsContainer = this.chart.append('g').attr('class', 'ax-bar-chart-bars-container');\n // Create groups for each bar to handle transformations\n const barGroups = barsContainer\n .selectAll('.ax-bar-chart-bar-group')\n .data(visibleData)\n .enter()\n .append('g')\n .style('cursor', 'pointer')\n .attr('class', 'ax-bar-chart-bar-group');\n // Add bars inside groups\n const bars = barGroups\n .append('path')\n .attr('class', 'ax-bar-chart-bar')\n .attr('d', (d) => {\n const x = this.xScale(d.id);\n const width = this.xScale.bandwidth();\n const y = this.height - 0.5; // initial height is zero\n return `M${x},${y} L${x},${y} L${x + width},${y} L${x + width},${y} Z`;\n })\n .attr('fill', (d) => {\n // Find the index of the current bar (d) in the original data array\n const originalIndex = originalFullData.findIndex((item) => item.id === d.id);\n // Use the original color if provided, otherwise get color from palette using original index\n // Fallback to index 0 if not found, though this shouldn't happen with valid data.\n return d.color || this.getColor(originalIndex !== -1 ? originalIndex : 0);\n });\n // Add data labels if they're enabled\n if (this.effectiveOptions().showDataLabels !== false) {\n barGroups\n .append('text')\n .attr('class', 'ax-bar-chart-data-label')\n .attr('text-anchor', 'middle')\n .attr('x', (d) => this.xScale(d.id) + this.xScale.bandwidth() / 2)\n .attr('y', this.height) // Start from bottom for animation\n .style('font-size', 'clamp(8px, 2vmin, 12px)')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-data-labels-color))')\n .style('opacity', 0) // Start invisible for animation\n .text((d) => {\n // Format large numbers in data labels\n return d.value >= 1000 ? formatLargeNumber(d.value) : d.value;\n });\n // Animate data labels with smart positioning to avoid clipping\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n barGroups\n .selectAll('.ax-bar-chart-data-label')\n .transition()\n .duration(animationDuration)\n .delay((d, i) => i * animationDelay + this.LABEL_ANIMATION_DELAY)\n .attr('y', (d) => {\n const barTop = this.yScale(d.value);\n // If bar is near the top (100% or close), position label inside the bar\n if (barTop < this.MIN_TOP_SPACE_FOR_LABEL) {\n return barTop + this.LABEL_OFFSET;\n }\n // Otherwise, position above the bar\n return barTop - this.LABEL_OFFSET;\n })\n .attr('data-inside-bar', (d) => {\n const barTop = this.yScale(d.value);\n return barTop < this.MIN_TOP_SPACE_FOR_LABEL ? 'true' : 'false';\n })\n .style('opacity', 1)\n .ease(animationEasing);\n }\n // Set up event handlers on each group\n barGroups\n .on('mouseenter', (event, d) => {\n // Only apply hover effects if initial animation is complete\n if (!this._initialAnimationComplete())\n return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n // Standard hover effect - darken the bar slightly and add a subtle shadow\n barEl\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .style('filter', 'brightness(0.7) drop-shadow(0 0 2px rgba(0,0,0,0.1))');\n this.handleBarHover(event, d);\n })\n .on('mousemove', (event) => {\n // Only update tooltip if initial animation is complete\n if (this._initialAnimationComplete()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', (event) => {\n // Only apply hover effects if initial animation is complete\n if (!this._initialAnimationComplete())\n return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n // Remove hover effect\n barEl.transition().duration(this.HOVER_TRANSITION_DURATION).style('filter', null);\n this._tooltipVisible.set(false);\n })\n .on('click', (event, d) => {\n // Only trigger click events if initial animation is complete\n if (this._initialAnimationComplete()) {\n this.handleBarClick(event, d);\n }\n });\n // Add animation\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n bars\n .transition()\n .duration(animationDuration)\n .delay((d, i) => i * animationDelay)\n .attrTween('d', (d) => {\n const x = this.xScale(d.id);\n const width = this.xScale.bandwidth();\n const finalHeight = this.height - this.yScale(d.value);\n return (t) => {\n const currentHeight = finalHeight * t;\n const currentY = this.height - currentHeight;\n const bottomY = this.height - 0.5; // Add small gap to prevent overlap with x-axis\n if (radius > 0 && currentHeight > 0) {\n // Limit radius to prevent it from exceeding half the bar width\n const effectiveRadius = Math.min(radius, width / 2);\n return `M${x},${bottomY} L${x},${currentY + effectiveRadius} Q${x},${currentY} ${x + effectiveRadius},${currentY} L${x + width - effectiveRadius},${currentY} Q${x + width},${currentY} ${x + width},${currentY + effectiveRadius} L${x + width},${bottomY} Z`;\n }\n else {\n return `M${x},${bottomY} L${x},${currentY} L${x + width},${currentY} L${x + width},${bottomY} Z`;\n }\n };\n })\n .ease(animationEasing) // Use the configured easing function\n .end() // Wait for all animations to complete\n .then(() => {\n // Mark animation as complete to enable hover effects\n this._initialAnimationComplete.set(true);\n });\n }\n /**\n * Renders bars for clustered charts\n */\n renderBarsClustered(groups) {\n const seriesLabels = this.getClusterSeriesLabels(groups);\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n this._initialAnimationComplete.set(false);\n const radius = this.effectiveOptions().cornerRadius;\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n const barsContainer = this.chart.append('g').attr('class', 'ax-bar-chart-bars-container');\n const groupSel = barsContainer\n .selectAll('.ax-bar-chart-group')\n .data(groups)\n .enter()\n .append('g')\n .attr('class', 'ax-bar-chart-group')\n .attr('transform', (g) => `translate(${this.xScale(g.id)},0)`);\n const barGroups = groupSel\n .selectAll('.ax-bar-chart-bar-group')\n .data((g) => visibleSeries.map((label, idx) => ({ group: g, seriesLabel: label, seriesIndex: idx })))\n .enter()\n .append('g')\n .style('cursor', 'pointer')\n .attr('class', 'ax-bar-chart-bar-group');\n const bars = barGroups\n .append('path')\n .attr('class', 'ax-bar-chart-bar')\n .attr('data-series', (d) => d.seriesLabel)\n .attr('d', (d) => {\n const x = this.xSubScale(d.seriesLabel);\n const width = this.xSubScale.bandwidth();\n const y = this.height - 0.5;\n return `M${x},${y} L${x},${y} L${x + width},${y} L${x + width},${y} Z`;\n })\n .attr('fill', (d) => {\n const item = d.group.chartData[d.seriesIndex];\n return item?.color || this.getColor(d.seriesIndex);\n });\n if (this.effectiveOptions().showDataLabels !== false) {\n barGroups\n .append('text')\n .attr('class', 'ax-bar-chart-data-label')\n .attr('text-anchor', 'middle')\n .attr('x', (d) => (this.xSubScale(d.seriesLabel) || 0) + this.xSubScale.bandwidth() / 2)\n .attr('y', this.height)\n .style('font-size', 'clamp(8px, 2vmin, 12px)')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-data-labels-color))')\n .style('opacity', 0)\n .text((d) => {\n const value = d.group.chartData[d.seriesIndex]?.value;\n if (value === undefined)\n return '';\n // Format large numbers in data labels\n return value >= 1000 ? formatLargeNumber(value) : value;\n });\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n barGroups\n .selectAll('.ax-bar-chart-data-label')\n .transition()\n .duration(animationDuration)\n .delay((_d, i) => i * animationDelay + this.LABEL_ANIMATION_DELAY)\n .attr('y', (d) => {\n const item = d.group.chartData[d.seriesIndex];\n if (!item)\n return this.height;\n const barTop = this.yScale(item.value);\n // If bar is near the top (100% or close), position label inside the bar\n if (barTop < this.MIN_TOP_SPACE_FOR_LABEL) {\n return barTop + this.LABEL_OFFSET;\n }\n // Otherwise, position above the bar\n return barTop - this.LABEL_OFFSET;\n })\n .attr('data-inside-bar', (d) => {\n const item = d.group.chartData[d.seriesIndex];\n if (!item)\n return 'false';\n const barTop = this.yScale(item.value);\n return barTop < this.MIN_TOP_SPACE_FOR_LABEL ? 'true' : 'false';\n })\n .style('opacity', 1)\n .ease(animationEasing);\n }\n barGroups\n .on('mouseenter', (event, d) => {\n if (!this._initialAnimationComplete())\n return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n barEl\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .style('filter', 'brightness(0.7) drop-shadow(0 0 2px rgba(0,0,0,0.1))');\n const item = d.group.chartData[d.seriesIndex];\n if (item)\n this.handleBarHover(event, item, d.group);\n })\n .on('mousemove', (event) => {\n if (this._initialAnimationComplete())\n this.updateTooltipPosition(event);\n })\n .on('mouseleave', (event) => {\n if (!this._initialAnimationComplete())\n return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n barEl.transition().duration(this.HOVER_TRANSITION_DURATION).style('filter', null);\n this._tooltipVisible.set(false);\n })\n .on('click', (event, d) => {\n if (!this._initialAnimationComplete())\n return;\n const item = d.group.chartData[d.seriesIndex];\n if (item)\n this.handleBarClick(event, item);\n });\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n bars\n .transition()\n .duration(animationDuration)\n .delay((_d, i) => i * animationDelay)\n .attrTween('d', (d) => {\n const x = this.xSubScale(d.seriesLabel);\n const width = this.xSubScale.bandwidth();\n const item = d.group.chartData[d.seriesIndex];\n const finalHeight = item ? this.height - this.yScale(item.value) : 0;\n return (t) => {\n const currentHeight = finalHeight * t;\n const currentY = this.height - currentHeight;\n const bottomY = this.height - 0.5; // Add small gap to prevent overlap with x-axis\n if (radius > 0 && currentHeight > 0) {\n // Limit radius to prevent it from exceeding half the bar width\n const effectiveRadius = Math.min(radius, width / 2);\n return `M${x},${bottomY} L${x},${currentY + effectiveRadius} Q${x},${currentY} ${x + effectiveRadius},${currentY} L${x + width - effectiveRadius},${currentY} Q${x + width},${currentY} ${x + width},${currentY + effectiveRadius} L${x + width},${bottomY} Z`;\n }\n else {\n return `M${x},${bottomY} L${x},${currentY} L${x + width},${currentY} L${x + width},${bottomY} Z`;\n }\n };\n })\n .ease(animationEasing)\n .end()\n .then(() => this._initialAnimationComplete.set(true));\n }\n /**\n * Gets the appropriate D3 easing function based on the option string\n */\n // getEasingFunction moved to shared chart utils\n /**\n * Handles bar hover event and shows tooltip\n */\n handleBarHover(event, datum, group) {\n if (this.effectiveOptions().showTooltip !== false) {\n const dataValue = this.data();\n const isClustered = this.isClusteredData(dataValue);\n const flatData = isClustered\n ? dataValue.flatMap((g) => g.chartData)\n : dataValue || [];\n const index = flatData.findIndex((item) => item.id === datum.id && item.label === datum.label);\n const color = datum.color || this.getColor(index !== -1 ? index : 0);\n // Calculate percentage of total\n const total = isClustered\n ? dataValue.reduce((sum, g) => sum + g.chartData.reduce((s, it) => s + it.value, 0), 0)\n : flatData.reduce((sum, item) => sum + item.value, 0);\n const percentage = total > 0 ? ((datum.value / total) * 100).toFixed(1) : '0';\n this._tooltipData.set({\n title: group ? `${datum.tooltipLabel || datum.label} — ${group.label}` : datum.tooltipLabel || datum.label,\n value: formatLargeNumber(datum.value),\n percentage: `${percentage}%`,\n color: color,\n });\n this.updateTooltipPosition(event);\n this._tooltipVisible.set(true);\n }\n }\n updateTooltipPosition(event) {\n this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n if (this._tooltipRafId != null)\n return;\n this._tooltipRafId = requestAnimationFrame(() => {\n this._tooltipRafId = null;\n const coords = this._pendingTooltipCoords;\n if (!coords)\n return;\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl)\n return;\n const containerRect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = this.computeEnhancedTooltipPosition(containerRect, tooltipRect, coords.x, coords.y);\n this._tooltipPosition.set(pos);\n });\n }\n /**\n * Enhanced tooltip positioning that considers chart boundaries and prevents overflow\n */\n computeEnhancedTooltipPosition(containerRect, tooltipRect, clientX, clientY) {\n const cursorX = clientX - containerRect.left;\n const cursorY = clientY - containerRect.top;\n if (!tooltipRect) {\n // Default positioning when tooltip dimensions are unknown\n return {\n x: Math.min(cursorX + this.TOOLTIP_GAP, containerRect.width - this.TOOLTIP_GAP),\n y: Math.max(this.TOOLTIP_GAP, Math.min(cursorY, containerRect.height - this.TOOLTIP_GAP)),\n };\n }\n // Calculate available space in each direction\n const spaceRight = containerRect.width - cursorX;\n const spaceLeft = cursorX;\n const spaceBelow = containerRect.height - cursorY;\n const spaceAbove = cursorY;\n // Determine best horizontal position\n let x;\n if (spaceRight >= tooltipRect.width + this.TOOLTIP_GAP) {\n // Position to the right of cursor\n x = cursorX + this.TOOLTIP_GAP;\n }\n else if (spaceLeft >= tooltipRect.width + this.TOOLTIP_GAP) {\n // Position to the left of cursor\n x = cursorX - tooltipRect.width - this.TOOLTIP_GAP;\n }\n else {\n // Center horizontally if neither side has enough space\n x = Math.max(this.TOOLTIP_GAP, Math.min((containerRect.width - tooltipRect.width) / 2, containerRect.width - tooltipRect.width - this.TOOLTIP_GAP));\n }\n // Calculate best vertical position\n let y;\n if (spaceBelow >= tooltipRect.height + this.TOOLTIP_GAP) {\n // Position below cursor\n y = cursorY + this.TOOLTIP_GAP;\n }\n else if (spaceAbove >= tooltipRect.height + this.TOOLTIP_GAP) {\n // Position above cursor\n y = cursorY - tooltipRect.height - this.TOOLTIP_GAP;\n }\n else {\n // Center vertically if neither direction has enough space\n y = Math.max(this.TOOLTIP_GAP, Math.min((containerRect.height - tooltipRect.height) / 2, containerRect.height - tooltipRect.height - this.TOOLTIP_GAP));\n }\n // Ensure tooltip stays within container bounds\n x = Math.max(this.TOOLTIP_GAP, Math.min(x, containerRect.width - tooltipRect.width - this.TOOLTIP_GAP));\n y = Math.max(this.TOOLTIP_GAP, Math.min(y, containerRect.height - tooltipRect.height - this.TOOLTIP_GAP));\n return { x, y };\n }\n /**\n * Handles bar click event\n */\n handleBarClick(event, datum) {\n this.barClick.emit({ item: datum, event: { nativeEvent: event, sender: this } });\n }\n /**\n * Shows a message when no data is available\n */\n showNoDataMessage(containerElement) {\n this.clearChartArea(containerElement);\n this.showMessage(containerElement, this.effectiveMessages().noDataIcon, this.effectiveMessages().noData, this.effectiveMessages().noDataHelp, 'ax-bar-chart-no-data-message');\n }\n /**\n * Shows a message when all bars are hidden\n */\n showAllBarsHiddenMessage(containerElement) {\n this.clearChartArea(containerElement);\n this.showMessage(containerElement, this.effectiveMessages().allHiddenIcon, this.effectiveMessages().allHidden, this.effectiveMessages().allHiddenHelp, 'ax-bar-chart-no-data-message');\n }\n /**\n * Gets the color for a bar based on its index\n */\n getColor(index) {\n return getChartColor(index, this.chartColors);\n }\n /**\n * Checks if a bar is hidden\n */\n isBarHidden(id) {\n return this.hiddenBars.has(id);\n }\n /**\n * Implementation of AXChartLegendCompatible interface\n * Returns legend items based on the chart data\n */\n getLegendItems() {\n const value = (this.data() || []);\n if (this.isClusteredData(value)) {\n const groups = value;\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const total = groups.reduce((sum, g) => sum + g.chartData.reduce((s, it) => s + (typeof it.value === 'number' ? it.value : 0), 0), 0);\n return seriesLabels.map((label, index) => {\n const seriesTotal = groups.reduce((s, g) => {\n const item = g.chartData[index];\n const v = item && typeof item.value === 'number' ? item.value : 0;\n return s + v;\n }, 0);\n const percentage = total > 0 ? (seriesTotal / total) * 100 : 0;\n const firstItem = groups[0]?.chartData[index];\n return {\n id: label,\n name: label || `Series ${index + 1}`,\n value: seriesTotal,\n percentage,\n color: firstItem?.color || this.getColor(index),\n hidden: this.hiddenSeries.has(label),\n };\n });\n }\n const flat = value;\n const total = flat.reduce((sum, item) => sum + (typeof item.value === 'number' ? item.value : 0), 0);\n return flat.map((item, index) => {\n const val = typeof item.value === 'number' ? item.value : 0;\n const percentage = total > 0 ? (val / total) * 100 : 0;\n return {\n id: item.id,\n name: item.label || `Item ${index + 1}`,\n value: item.value,\n percentage,\n color: item.color || this.getColor(index),\n hidden: this.isBarHidden(item.id),\n };\n });\n }\n /**\n * Implementation of AXChartLegendCompatible interface\n * Highlights a specific bar by ID\n */\n highlightSegment(id) {\n if (!this.svg)\n return;\n const value = (this.data() || []);\n const isClustered = this.isClusteredData(value);\n const resetAll = () => {\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .classed('ax-bar-chart-highlighted', false)\n .classed('ax-bar-chart-dimmed', false)\n .attr('opacity', 1)\n .attr('filter', null)\n .attr('stroke', null)\n .attr('stroke-width', null)\n .attr('stroke-opacity', null);\n };\n if (id === null) {\n resetAll();\n return;\n }\n if (!isClustered) {\n if (this.isBarHidden(id)) {\n resetAll();\n return;\n }\n const targetBar = this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((d) => d?.id === id);\n if (targetBar.empty())\n return;\n const isCurrentlyHighlighted = targetBar.classed('ax-bar-chart-highlighted');\n if (isCurrentlyHighlighted) {\n resetAll();\n }\n else {\n resetAll();\n targetBar\n .classed('ax-bar-chart-highlighted', true)\n .attr('filter', 'drop-shadow(0 0 4px rgba(0, 0, 0, 0.3))')\n .attr('stroke', '#000')\n .attr('stroke-width', '1px')\n .attr('stroke-opacity', '0.3')\n .style('transition', 'all 0.2s ease-in-out');\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((d) => d?.id !== id)\n .classed('ax-bar-chart-dimmed', true)\n .attr('opacity', 0.5)\n .style('transition', 'opacity 0.2s ease-in-out');\n }\n return;\n }\n const targetBars = this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((_d, i, nodes) => {\n const node = nodes[i];\n return node.getAttribute('data-series') === id;\n });\n if (targetBars.empty())\n return;\n const isHighlighted = targetBars.classed('ax-bar-chart-highlighted');\n if (isHighlighted) {\n resetAll();\n }\n else {\n resetAll();\n targetBars\n .classed('ax-bar-chart-highlighted', true)\n .attr('filter', 'drop-shadow(0 0 4px rgba(0, 0, 0, 0.3))')\n .attr('stroke', '#000')\n .attr('stroke-width', '1px')\n .attr('stroke-opacity', '0.3')\n .style('transition', 'all 0.2s ease-in-out');\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((_d, i, nodes) => nodes[i].getAttribute('data-series') !== id)\n .classed('ax-bar-chart-dimmed', true)\n .attr('opacity', 0.5)\n .style('transition', 'opacity 0.2s ease-in-out');\n }\n }\n /**\n * Implementation of AXChartLegendCompatible interface\n * Toggles visibility of a bar by ID\n * @returns New visibility state (true = visible, false = hidden)\n */\n toggleSegment(id) {\n const value = (this.data() || []);\n const isClustered = this.isClusteredData(value);\n if (!isClustered) {\n const wasAllHidden = value.length > 0 && value.every((d) => this.isBarHidden(d.id));\n if (this.hiddenBars.has(id)) {\n this.hiddenBars.delete(id);\n if (wasAllHidden) {\n if (this.chartContainerEl()?.nativeElement) {\n this.d3\n ?.select(this.chartContainerEl().nativeElement)\n .selectAll('svg, .ax-chart-message-container')\n .remove();\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n }\n else {\n this.updateChart();\n }\n }\n else {\n this.hiddenBars.add(id);\n this.updateChart();\n }\n return !this.hiddenBars.has(id);\n }\n // Clustered mode: toggle series by label\n const groups = value;\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const seriesCount = seriesLabels.length;\n const wasAllHidden = seriesCount > 0 && this.hiddenSeries.size >= seriesCount;\n if (this.hiddenSeries.has(id)) {\n this.hiddenSeries.delete(id);\n if (wasAllHidden) {\n if (this.chartContainerEl()?.nativeElement) {\n this.d3?.select(this.chartContainerEl().nativeElement).selectAll('svg, .ax-chart-message-container').remove();\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n }\n else {\n this.updateChart();\n }\n }\n else {\n this.hiddenSeries.add(id);\n this.updateChart();\n }\n return !this.hiddenSeries.has(id);\n }\n // ===== Helper utilities for modularity and maintainability =====\n getContainerElement() {\n return this.chartContainerEl()?.nativeElement ?? null;\n }\n clearChartArea(containerElement) {\n this.d3.select(containerElement).selectAll('svg, .ax-chart-message-container').remove();\n }\n /**\n * Truncates long labels with ellipsis\n */\n truncateLabel(label, maxLength = this.MAX_LABEL_LENGTH) {\n if (label.length <= maxLength)\n return label;\n return label.substring(0, maxLength - 1) + '…';\n }\n /**\n * Gets adaptive font size for X-axis based on width and item count\n */\n getXAxisTickFontSizeBasedOnWidth() {\n const itemCount = this.xScale.domain().length;\n const baseSize = Math.round(this.width / 50);\n // Reduce font size for many items\n let adjustedSize = baseSize;\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n adjustedSize = Math.round(baseSize * 0.7);\n }\n else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n adjustedSize = Math.round(baseSize * 0.85);\n }\n return Math.max(this.MIN_FONT_SIZE_X_AXIS, Math.min(this.MAX_FONT_SIZE_X_AXIS, adjustedSize));\n }\n /**\n * Gets adaptive font size for Y-axis based on height\n */\n getYAxisTickFontSizeBasedOnHeight() {\n const baseSize = Math.round(this.height / 30);\n return Math.max(this.MIN_FONT_SIZE_Y_AXIS, Math.min(this.MAX_FONT_SIZE_Y_AXIS, baseSize));\n }\n buildXAxisCommon(axesGroup, idToLabel, options) {\n const itemCount = this.xScale.domain().length;\n // Smart tick reduction for many items\n let tickValues = this.xScale.domain();\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n // Show every 5th tick\n tickValues = tickValues.filter((_d, i) => i % 5 === 0);\n }\n else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n // Show every 2nd tick\n tickValues = tickValues.filter((_d, i) => i % 2 === 0);\n }\n const axis = this.d3\n .axisBottom(this.xScale)\n .tickValues(tickValues)\n .tickFormat((id) => {\n const label = idToLabel.get(id) ?? String(id);\n // Truncate long labels intelligently\n const maxLength = itemCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n return this.truncateLabel(label, maxLength);\n });\n this.xAxis = axesGroup\n .append('g')\n .attr('class', 'ax-bar-chart-axis-x')\n .attr('transform', `translate(0,${this.height})`)\n .call(axis);\n const dynamicFontSize = this.getXAxisTickFontSizeBasedOnWidth();\n const xAxisTicks = this.xAxis\n .selectAll('text')\n .style('font-size', `${dynamicFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)')\n .attr('direction', 'ltr');\n const isRotated = this.shouldRotateXAxisLabels(idToLabel, dynamicFontSize);\n if (isRotated) {\n xAxisTicks.attr('transform', 'rotate(-45)').style('text-anchor', 'end').attr('dx', '-0.8em').attr('dy', '0.15em');\n }\n this.xAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n if (options.xAxisLabel && !isRotated) {\n const tickNodes = (this.xAxis.selectAll('text').nodes() || []);\n const measuredTickHeight = tickNodes.length > 0\n ? Math.max(...tickNodes.map((n) => {\n try {\n return n?.getBBox?.()?.height ?? dynamicFontSize;\n }\n catch {\n return dynamicFontSize;\n }\n }))\n : dynamicFontSize;\n const tickAreaHeight = measuredTickHeight + this.TICK_AREA_PADDING;\n const gapBelowTicks = this.X_AXIS_TITLE_GAP;\n this.createXAxisTitle(axesGroup, options.xAxisLabel, tickAreaHeight, gapBelowTicks);\n }\n }\n // computeTooltipPosition moved to shared chart utils\n showMessage(containerElement, iconClass, text, helpText, specificClass) {\n const container = this.d3\n .select(containerElement)\n .append('div')\n .attr('class', `ax-chart-message-container ax-bar-chart-message-background ${specificClass}`);\n container\n .append('div')\n .attr('class', 'ax-chart-message-icon ax-bar-chart-no-data-icon')\n .html(`<i class=\"${iconClass} fa-2x\"></i>`);\n container.append('div').attr('class', 'ax-chart-message-text ax-bar-chart-no-data-text').text(text);\n container.append('div').attr('class', 'ax-chart-message-help ax-bar-chart-no-data-help').text(helpText);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXBarChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.3\", type: AXBarChartComponent, isStandalone: true, selector: \"ax-bar-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: { barClick: \"barClick\" }, viewQueries: [{ propertyName: \"chartContainerEl\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-bar-chart\\\" role=\\\"img\\\" #chartContainer>\\n <!-- Shared tooltip component -->\\n <ax-chart-tooltip\\n [visible]=\\\"tooltipVisible()\\\"\\n [position]=\\\"tooltipPosition()\\\"\\n [data]=\\\"tooltipData()\\\"\\n [showPercentage]=\\\"true\\\"\\n ></ax-chart-tooltip>\\n</div>\\n\", styles: [\"ax-bar-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);--ax-comp-bar-chart-axis-label-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-bg-color: 0, 0, 0, 0}ax-bar-chart .ax-bar-chart{width:100%;height:100%;position:relative;min-height:0;box-sizing:border-box;overflow:hidden;background-color:rgba(var(--ax-comp-bar-chart-bg-color))}ax-bar-chart .ax-bar-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%}ax-bar-chart .ax-bar-chart svg g:has(text){font-family:inherit}ax-bar-chart .ax-bar-chart .ax-bar-chart-data-label{pointer-events:none;-webkit-user-select:none;user-select:none}ax-bar-chart .ax-bar-chart .ax-bar-chart-data-label[data-inside-bar=true]{fill:#fff;font-weight:600;text-shadow:0 0 2px rgba(0,0,0,.3)}ax-bar-chart .ax-bar-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-bar-chart-bg-color));padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-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: AXBarChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-bar-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-bar-chart\\\" role=\\\"img\\\" #chartContainer>\\n <!-- Shared tooltip component -->\\n <ax-chart-tooltip\\n [visible]=\\\"tooltipVisible()\\\"\\n [position]=\\\"tooltipPosition()\\\"\\n [data]=\\\"tooltipData()\\\"\\n [showPercentage]=\\\"true\\\"\\n ></ax-chart-tooltip>\\n</div>\\n\", styles: [\"ax-bar-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);--ax-comp-bar-chart-axis-label-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-bg-color: 0, 0, 0, 0}ax-bar-chart .ax-bar-chart{width:100%;height:100%;position:relative;min-height:0;box-sizing:border-box;overflow:hidden;background-color:rgba(var(--ax-comp-bar-chart-bg-color))}ax-bar-chart .ax-bar-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%}ax-bar-chart .ax-bar-chart svg g:has(text){font-family:inherit}ax-bar-chart .ax-bar-chart .ax-bar-chart-data-label{pointer-events:none;-webkit-user-select:none;user-select:none}ax-bar-chart .ax-bar-chart .ax-bar-chart-data-label[data-inside-bar=true]{fill:#fff;font-weight:600;text-shadow:0 0 2px rgba(0,0,0,.3)}ax-bar-chart .ax-bar-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-bar-chart-bg-color));padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-help{font-size:.8rem;opacity:.6}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9iYXItY2hhcnQvc3JjL2xpYi9iYXItY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2Jhci1jaGFydC9zcmMvbGliL2Jhci1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUVoQixpQkFBaUIsRUFDakIsYUFBYSxFQUNiLGlCQUFpQixHQUNsQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSx1QkFBdUIsRUFBc0IsTUFBTSw4QkFBOEIsQ0FBQztBQUUzRixPQUFPLEVBQ0wsZUFBZSxFQUNmLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFFTixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFTekQ7OztHQUdHO0FBU0gsTUFBTSxPQUFPLG1CQUNYLFNBQVEsZ0JBQWdCO0lBR3hCLFNBQVM7SUFDVCx1QkFBdUI7SUFDdkIsSUFBSSxHQUFHLEtBQUssQ0FBa0IsRUFBcUIsZ0RBQUMsQ0FBQztJQUVyRCwwQkFBMEI7SUFDMUIsT0FBTyxHQUFHLEtBQUssQ0FBbUIsRUFBRSxtREFBQyxDQUFDO0lBRXRDLFVBQVU7SUFDVixvQ0FBb0M7SUFDcEMsUUFBUSxHQUFHLE1BQU0sRUFBd0IsQ0FBQztJQUUxQyw0QkFBNEI7SUFDWCxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUE2QixnQkFBZ0IsQ0FBQyxDQUFDO0lBRXJHLHVDQUF1QztJQUM3QixFQUFF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LHFnQkMvQ2hDLDhSQVNBLCtsRERtQ1ksdUJBQXVCOzsyRkFHdEIsbUJBQW1CO2tCQVIvQixTQUFTOytCQUNFLGNBQWMsaUJBR1QsaUJBQWlCLENBQUMsSUFBSSxXQUM1QixDQUFDLHVCQUF1QixDQUFDLG1CQUNqQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQVhfQ0hBUlRfQ09MT1JfUEFMRVRURSxcbiAgQVhDaGFydENvbXBvbmVudCxcbiAgQVhDaGFydENvbXBvbmVudEJhc2UsXG4gIGZvcm1hdExhcmdlTnVtYmVyLFxuICBnZXRDaGFydENvbG9yLFxuICBnZXRFYXNpbmdGdW5jdGlvbixcbn0gZnJvbSAnQGFjb3JleC9jaGFydHMnO1xuaW1wb3J0IHsgQVhDaGFydExlZ2VuZENvbXBhdGlibGUsIEFYQ2hhcnRMZWdlbmRJdGVtIH0gZnJvbSAnQGFjb3JleC9jaGFydHMvY2hhcnQtbGVnZW5kJztcbmltcG9ydCB7IEFYQ2hhcnRUb29sdGlwQ29tcG9uZW50LCBBWENoYXJ0VG9vbHRpcERhdGEgfSBmcm9tICdAYWNvcmV4L2NoYXJ0cy9jaGFydC10b29sdGlwJztcblxuaW1wb3J0IHtcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBFbGVtZW50UmVmLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBPbkRlc3Ryb3ksXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxuICB2aWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYX0JBUl9DSEFSVF9DT05GSUcgfSBmcm9tICcuL2Jhci1jaGFydC5jb25maWcnO1xuaW1wb3J0IHtcbiAgQVhCYXJDaGFydENsaWNrRXZlbnQsXG4gIEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhLFxuICBBWEJhckNoYXJ0RGF0YSxcbiAgQVhCYXJDaGFydE9wdGlvbixcbiAgQVhCYXJDaGFydFZhbHVlLFxufSBmcm9tICcuL2Jhci1jaGFydC50eXBlJztcblxuLyoqXG4gKiBCYXIgQ2hhcnQgQ29tcG9uZW50XG4gKiBSZW5kZXJzIGRhdGEgYXMgdmVydGljYWwgYmFycyB3aXRoIGludGVyYWN0aXZlIGhvdmVyIGVmZmVjdHMgYW5kIGFuaW1hdGlvbnNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtYmFyLWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jhci1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Jhci1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbQVhDaGFydFRvb2x0aXBDb21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQVhCYXJDaGFydENvbXBvbmVudFxuICBleHRlbmRzIEFYQ2hhcnRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlLCBBWENoYXJ0Q29tcG9uZW50QmFzZVxue1xuICAvLyBJbnB1dHNcbiAgLyoqIENoYXJ0IGRhdGEgaW5wdXQgKi9cbiAgZGF0YSA9IGlucHV0PEFYQmFyQ2hhcnRWYWx1ZT4oW10gYXMgQVhCYXJDaGFydFZhbHVlKTtcblxuICAvKiogQ2hhcnQgb3B0aW9ucyBpbnB1dCAqL1xuICBvcHRpb25zID0gaW5wdXQ8QVhCYXJDaGFydE9wdGlvbj4oe30pO1xuXG4gIC8vIE91dHB1dHNcbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIGJhciBpcyBjbGlja2VkICovXG4gIGJhckNsaWNrID0gb3V0cHV0PEFYQmFyQ2hhcnRDbGlja0V2ZW50PigpO1xuXG4gIC8vIENoYXJ0IGNvbnRhaW5lciByZWZlcmVuY2VcbiAgcHJpdmF0ZSByZWFkb25seSBjaGFydENvbnRhaW5lckVsID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignY2hhcnRDb250YWluZXInKTtcblxuICAvLyBEMyByZWZlcmVuY2UgLSBsb2FkZWQgYXN5bmNocm9ub3VzbHlcbiAgcHJvdGVjdGVkIGQzITogdHlwZW9mIGltcG9ydCgnZDMnKTtcblxuICAvLyBDaGFydCBlbGVtZW50cyAtIHVzaW5nIHByb3BlciBEMyB0eXBlc1xuICBwcml2YXRlIHN2ZyE6IFJldHVyblR5cGU8dHlwZW9mIGltcG9ydCgnZDMnKS5zZWxlY3Q8U1ZHU1ZHRWxlbWVudCwgdW5rbm93bj4+O1xuICBwcml2YXRlIGNoYXJ0ITogUmV0dXJuVHlwZTx0eXBlb2YgaW1wb3J0KCdkMycpLnNlbGVjdDxTVkdHRWxlbWVudCwgdW5rbm93bj4+O1xuICBwcml2YXRlIHhTY2FsZSE6IFJldHVyblR5cGU8dHlwZW9mIGltcG9ydCgnZDMnKS5zY2FsZUJhbmQ8c3RyaW5nPj47XG4gIHByaXZhdGUgeVNjYWxlITogUmV0dXJuVHlwZTx0eXBlb2YgaW1wb3J0KCdkMycpLnNjYWxlTGluZWFyPG51bWJlciwgbnVtYmVyPj47XG4gIHByaXZhdGUgeFN1YlNjYWxlITogUmV0dXJuVHlwZTx0eXBlb2YgaW1wb3J0KCdkMycpLnNjYWxlQmFuZDxzdHJpbmc+PjtcbiAgcHJpdmF0ZSB4QXhpcyE6IFJldHVyblR5cGU8dHlwZW9mIGltcG9ydCgnZDMnKS5zZWxlY3Q8U1ZHR0VsZW1lbnQsIHVua25vd24+PjtcbiAgcHJpdmF0ZSB5QXhpcyE6IFJldHVyblR5cGU8dHlwZW9mIGltcG9ydCgnZDMnKS5zZWxlY3Q8U1ZHR0VsZW1lbnQsIHVua25vd24+PjtcblxuICAvLyBDaGFydCBkaW1lbnNpb25zXG4gIHByaXZhdGUgd2lkdGghOiBudW1iZXI7XG4gIHByaXZhdGUgaGVpZ2h0ITogbnVtYmVyO1xuICBwcml2YXRlIG1hcmdpbiA9IHsgdG9wOiAwLCByaWdodDogMCwgYm90dG9tOiAwLCBsZWZ0OiAwIH07XG5cbiAgLy8gQ29uc3RhbnRzIGZvciBsYXlvdXQgY2FsY3VsYXRpb25zXG4gIHByaXZhdGUgcmVhZG9ubHkgQ0hBUl9XSURUSF9SQVRJTyA9IDAuNjU7XG4gIHByaXZhdGUgcmVhZG9ubHkgVE9PTFRJUF9HQVAgPSAxMDtcbiAgcHJpdmF0ZSByZWFkb25seSBBWElTX1RJQ0tfUEFERElORyA9IDEwO1xuICBwcml2YXRlIHJlYWRvbmx5IFlfQVhJU19USVRMRV9USElDS05FU1MgPSAxNDtcbiAgcHJpdmF0ZSByZWFkb25seSBZX0FYSVNfVElUTEVfUEFERElORyA9IDE0O1xuICBwcml2YXRlIHJlYWRvbmx5IFhfQVhJU19USVRMRV9GT05UX1NJWkUgPSAxNDtcbiAgcHJpdmF0ZSByZWFkb25seSBYX0FYSVNfVElUTEVfR0FQID0gMTQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgWF9BWElTX1RJVExFX0JMT0NLX0hFSUdIVCA9IDI0O1xuICBwcml2YXRlIHJlYWRvbmx5IFRPUF9FREdFX1BBRERJTkcgPSA4O1xuICBwcml2YXRlIHJlYWRvbmx5IEJPVFRPTV9FREdFX1BBRERJTkcgPSA4O1xuICBwcml2YXRlIHJlYWRvbmx5IEhPUklaT05UQUxfRURHRV9QQURESU5HID0gMTI7XG4gIHByaXZhdGUgcmVhZG9ubHkgRkFMTEJBQ0tfUExPVF9IRUlHSFQgPSAyNDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX1BMT1RfSEVJR0hUID0gMTIwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9UT1RBTF9XSURUSCA9IDIwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBPVVRFUl9QQURESU5HX0NMVVNURVJFRCA9IDAuMjtcbiAgcHJpdmF0ZSByZWFkb25seSBJTk5FUl9QQURESU5HX0NMVVNURVJFRCA9IDAuMTtcbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fUEFERElORyA9IDAuMTtcbiAgcHJpdmF0ZSByZWFkb25seSBIT1ZFUl9UUkFOU0lUSU9OX0RVUkFUSU9OID0gMTUwO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfQU5JTUFUSU9OX0RFTEFZID0gNTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTEFCRUxfQU5JTUFUSU9OX0RFTEFZID0gMTAwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9UT1BfU1BBQ0VfRk9SX0xBQkVMID0gMjA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTEFCRUxfT0ZGU0VUID0gODtcbiAgcHJpdmF0ZSByZWFkb25seSBST1RBVElPTl9UT0xFUkFOQ0VfU01BTExfREFUQVNFVCA9IDEuNDtcbiAgcHJpdmF0ZSByZWFkb25seSBTTUFMTF9EQVRBU0VUX1RIUkVTSE9MRCA9IDY7XG4gIHByaXZhdGUgcmVhZG9ubHkgWV9BWElTX1BBRERJTkcgPSAyMDtcbiAgcHJpdmF0ZSByZWFkb25seSBUSUNLX0FSRUFfUEFERElORyA9IDY7XG4gIHByaXZhdGUgcmVhZG9ubHkgVElDS19BUkVBX0dBUCA9IDg7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9GT05UX1NJWkUgPSAxMztcbiAgcHJpdmF0ZSByZWFkb25seSBGT05UX1dJRFRIX01VTFRJUExJRVIgPSAwLjY7XG4gIHByaXZhdGUgcmVhZG9ubHkgRk9OVF9QQURESU5HID0gODtcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfTEFCRUxfTEVOR1RIID0gMjA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX0ZPTlRfU0laRV9YX0FYSVMgPSA4O1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9GT05UX1NJWkVfWF9BWElTID0gMTQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX0ZPTlRfU0laRV9ZX0FYSVMgPSA5O1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9GT05UX1NJWkVfWV9BWElTID0gMTU7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUFOWV9JVEVNU19USFJFU0hPTEQgPSAyMDtcbiAgcHJpdmF0ZSByZWFkb25seSBWRVJZX01BTllfSVRFTVNfVEhSRVNIT0xEID0gNTA7XG5cbiAgLy8gQW5pbWF0aW9uIHN0YXRlXG4gIHByaXZhdGUgX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gVG9vbHRpcCBzdGF0ZVxuICBwcml2YXRlIF90b29sdGlwVmlzaWJsZSA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBQb3NpdGlvbiA9IHNpZ25hbCh7IHg6IDAsIHk6IDAgfSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBEYXRhID0gc2lnbmFsPEFYQ2hhcnRUb29sdGlwRGF0YT4oe1xuICAgIHRpdGxlOiAnJyxcbiAgICB2YWx1ZTogJzAnLFxuICAgIHBlcmNlbnRhZ2U6ICcwJScsXG4gICAgY29sb3I6ICcnLFxuICB9KTtcbiAgcHJpdmF0ZSBfdG9vbHRpcFJhZklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfcGVuZGluZ1Rvb2x0aXBDb29yZHM6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFNpZ25hbHMgZm9yIGNvbXBvbmVudCBzdGF0ZVxuICBwcml2YXRlIF9pbml0aWFsaXplZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX3JlbmRlcmVkID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBUb29sdGlwIGFjY2Vzc29yc1xuICBwcm90ZWN0ZWQgdG9vbHRpcFZpc2libGUgPSB0aGlzLl90b29sdGlwVmlzaWJsZS5hc1JlYWRvbmx5KCk7XG4gIHByb3RlY3RlZCB0b29sdGlwUG9zaXRpb24gPSB0aGlzLl90b29sdGlwUG9zaXRpb24uYXNSZWFkb25seSgpO1xuICBwcm90ZWN0ZWQgdG9vbHRpcERhdGEgPSB0aGlzLl90b29sdGlwRGF0YS5hc1JlYWRvbmx5KCk7XG5cbiAgLy8gSW5qZWN0IGNvbmZpZ3VyYXRpb25cbiAgcHJpdmF0ZSBjb25maWdUb2tlbiA9IGluamVjdChBWF9CQVJfQ0hBUlRfQ09ORklHKTtcblxuICAvLyBJbmplY3QgdGhlIGNoYXJ0IGNvbG9yc1xuICBwcml2YXRlIGNoYXJ0Q29sb3JzID0gaW5qZWN0KEFYX0NIQVJUX0NPTE9SX1BBTEVUVEUpO1xuXG4gIC8vIEluamVjdCBBWFBsYXRmb3JtXG4gIC8vIFJlbW92ZWQgdW51c2VkIEFYUGxhdGZvcm0gaW5qZWN0aW9uXG5cbiAgLy8gQ29uZmlndXJhdGlvbiB3aXRoIGRlZmF1bHRzXG4gIHByb3RlY3RlZCBlZmZlY3RpdmVPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmNvbmZpZ1Rva2VuLFxuICAgICAgLi4udGhpcy5vcHRpb25zKCksXG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gTWVzc2FnZXMgd2l0aCBkZWZhdWx0c1xuICBwcm90ZWN0ZWQgZWZmZWN0aXZlTWVzc2FnZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdE1lc3NhZ2VzID0ge1xuICAgICAgbm9EYXRhOiAnTm8gZGF0YSBhdmFpbGFibGUnLFxuICAgICAgbm9EYXRhSGVscDogJ1BsZWFzZSBwcm92aWRlIGRhdGEgdG8gZGlzcGxheSB0aGUgY2hhcnQnLFxuICAgICAgYWxsSGlkZGVuOiAnQWxsIGJhcnMgYXJlIGhpZGRlbicsXG4gICAgICBhbGxIaWRkZW5IZWxwOiAnQ2xpY2sgb24gbGVnZW5kIGl0ZW1zIHRvIHNob3cgYmFycycsXG4gICAgICBub0RhdGFJY29uOiAnZmEtbGlnaHQgZmEtY2hhcnQtY29sdW1uJyxcbiAgICAgIGFsbEhpZGRlbkljb246ICdmYS1saWdodCBmYS1leWUtc2xhc2gnLFxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZmF1bHRNZXNzYWdlcyxcbiAgICAgIC4uLnRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLm1lc3NhZ2VzLFxuICAgIH07XG4gIH0pO1xuXG4gIC8vIFRyYWNrIGhpZGRlbiBiYXJzIGFuZCBzZXJpZXNcbiAgcHJpdmF0ZSByZWFkb25seSBoaWRkZW5CYXJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGlkZGVuU2VyaWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLy8gQ29tcHV0ZWQgdmFsdWVzIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgcHJpdmF0ZSByZWFkb25seSBpc0NsdXN0ZXJlZE1vZGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGEoKTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiAnY2hhcnREYXRhJyBpbiB2YWx1ZVswXTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB2aXNpYmxlRGF0YSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YSgpIHx8IFtdO1xuICAgIGlmICh0aGlzLmlzQ2x1c3RlcmVkTW9kZSgpKSB7XG4gICAgICByZXR1cm4gdmFsdWUgYXMgQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXTtcbiAgICB9XG4gICAgcmV0dXJuICh2YWx1ZSBhcyBBWEJhckNoYXJ0RGF0YVtdKS5maWx0ZXIoKGQpID0+ICF0aGlzLmhpZGRlbkJhcnMuaGFzKGQuaWQpKTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBoYXNWaXNpYmxlRGF0YSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YSgpO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5pc0NsdXN0ZXJlZE1vZGUoKSkge1xuICAgICAgY29uc3QgZ3JvdXBzID0gdmFsdWUgYXMgQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXTtcbiAgICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IHRoaXMuZ2V0Q2x1c3RlclNlcmllc0xhYmVscyhncm91cHMpO1xuICAgICAgY29uc3QgdmlzaWJsZVNlcmllcyA9IHNlcmllc0xhYmVscy5maWx0ZXIoKHMpID0+ICF0aGlzLmhpZGRlblNlcmllcy5oYXMocykpO1xuICAgICAgcmV0dXJuIGdyb3Vwcy5zb21lKChnKSA9PiB2aXNpYmxlU2VyaWVzLnNvbWUoKF8sIGlkeCkgPT4gISFnLmNoYXJ0RGF0YVtpZHhdKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICh2YWx1ZSBhcyBBWEJhckNoYXJ0RGF0YVtdKS5zb21lKChkKSA9PiAhdGhpcy5oaWRkZW5CYXJzLmhhcyhkLmlkKSk7XG4gIH0pO1xuXG4gIC8vIFR5cGUgZ3VhcmQgaGVscGVyXG4gIHByaXZhdGUgaXNDbHVzdGVyZWREYXRhKHZhbHVlOiBBWEJhckNoYXJ0VmFsdWUpOiB2YWx1ZSBpcyBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiAnY2hhcnREYXRhJyBpbiB2YWx1ZVswXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2x1c3RlclNlcmllc0xhYmVscyhncm91cHM6IEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGdyb3Vwc1swXT8uY2hhcnREYXRhPy5tYXAoKGQpID0+IGQubGFiZWwpID8/IFtdO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyBEeW5hbWljYWxseSBsb2FkIEQzIGFuZCBpbml0aWFsaXplIHRoZSBjaGFydCB3aGVuIHRoZSBjb21wb25lbnQgaXMgcmVhZHlcbiAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQuc2V0KHRydWUpO1xuICAgICAgdGhpcy5sb2FkRDMoKTtcbiAgICAgIC8vIENyZWF0ZSBjaGFydCBhZnRlciBEMyBpcyBsb2FkZWQgYW5kIGNvbnRhaW5lciBpcyBhdmFpbGFibGVcbiAgICAgIGlmICh0aGlzLmQzICYmIHRoaXMuY2hhcnRDb250YWluZXJFbCgpKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWQuc2V0KHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gV2F0Y2ggZm9yIGNoYW5nZXMgdG8gcmVkcmF3IHRoZSBjaGFydFxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAvLyBBY2Nlc3MgaW5wdXRzIHRvIHRyYWNrIHRoZW1cbiAgICAgIHRoaXMuZGF0YSgpO1xuICAgICAgdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG5cbiAgICAgIC8vIE9ubHkgdXBkYXRlIGlmIGFscmVhZHkgcmVuZGVyZWRcbiAgICAgIGlmICh0aGlzLl9yZW5kZXJlZCgpKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cENoYXJ0KCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgRDMuanMgZHluYW1pY2FsbHlcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkRDMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZDMgPSBhd2FpdCBpbXBvcnQoJ2QzJyk7XG4gICAgICAvLyBJZiBjb250YWluZXIgaXMgcmVhZHksIGNyZWF0ZSBjaGFydFxuICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKCkgJiYgdGhpcy5jaGFydENvbnRhaW5lckVsKCkpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgICB0aGlzLl9yZW5kZXJlZC5zZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIEQzLmpzOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgYmFyIGNoYXJ0IFNWRyBhbmQgcmVuZGVycyBhbGwgZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVDaGFydCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZDMgfHwgIXRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBpbnB1dFZhbHVlID0gKHRoaXMuZGF0YSgpIHx8IFtdKSBhcyBBWEJhckNoYXJ0VmFsdWU7XG4gICAgY29uc3QgaXNDbHVzdGVyZWQgPSB0aGlzLmlzQ2x1c3RlcmVkRGF0YShpbnB1dFZhbHVlKTtcblxuICAgIC8vIFVzZSBjb21wdXRlZCB2aXNpYmlsaXR5XG4gICAgY29uc3QgaGFzQW55VmlzaWJsZSA9IHRoaXMuaGFzVmlzaWJsZURhdGEoKTtcbiAgICBjb25zdCB2aXNpYmxlU2luZ2xlRGF0YSA9IGlzQ2x1c3RlcmVkID8gW10gOiAodGhpcy52aXNpYmxlRGF0YSgpIGFzIEFYQmFyQ2hhcnREYXRhW10pO1xuICAgIGNvbnN0IGdyb3VwZWREYXRhID0gaXNDbHVzdGVyZWQgPyAoaW5wdXRWYWx1ZSBhcyBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdKSA6IFtdO1xuXG4gICAgLy8gQ2xlYXIgZXhpc3RpbmcgY2hhcnQgU1ZHIGFuZCBtZXNzYWdlcyAoZG8gbm90IHJlbW92ZSB0b29sdGlwIGNvbXBvbmVudClcbiAgICB0aGlzLmQzLnNlbGVjdChjb250YWluZXJFbGVtZW50KS5zZWxlY3RBbGwoJ3N2ZywgLmF4LWNoYXJ0LW1lc3NhZ2UtY29udGFpbmVyJykucmVtb3ZlKCk7XG5cbiAgICAvLyBFYXJseSByZXR1cm4gaWYgbm8gZGF0YVxuICAgIGlmICghQXJyYXkuaXNBcnJheShpbnB1dFZhbHVlKSB8fCBpbnB1dFZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5zaG93Tm9EYXRhTWVzc2FnZShjb250YWluZXJFbGVtZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFYXJseSByZXR1cm4gaWYgYWxsIGJhcnMgYXJlIGhpZGRlblxuICAgIGlmICghaGFzQW55VmlzaWJsZSkge1xuICAgICAgdGhpcy5zaG93QWxsQmFyc0hpZGRlbk1lc3NhZ2UoY29udGFpbmVyRWxlbWVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR2V0IG9wdGlvbnMgYW5kIHNldHVwIGRpbWVuc2lvbnNcbiAgICBjb25zdCBjaGFydE9wdGlvbnMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcbiAgICB0aGlzLnNldHVwRGltZW5zaW9ucyhjb250YWluZXJFbGVtZW50LCBjaGFydE9wdGlvbnMpO1xuXG4gICAgLy8gQ3JlYXRlIHNjYWxlcyBhbmQgYXhlcyBhbmQgcmVuZGVyIGJhc2VkIG9uIG1vZGVcbiAgICBpZiAoaXNDbHVzdGVyZWQpIHtcbiAgICAgIHRoaXMuc2V0dXBTY2FsZXNDbHVzdGVyZWQoZ3JvdXBlZERhdGEpO1xuICAgICAgdGhpcy5jcmVhdGVBeGVzQ2x1c3RlcmVkKGNoYXJ0T3B0aW9ucywgZ3JvdXBlZERhdGEpO1xuICAgICAgdGhpcy5yZW5kZXJCYXJzQ2x1c3RlcmVkKGdyb3VwZWREYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXR1cFNjYWxlcyh2aXNpYmxlU2luZ2xlRGF0YSk7XG4gICAgICB0aGlzLmNyZWF0ZUF4ZXMoY2hhcnRPcHRpb25zKTtcbiAgICAgIHRoaXMucmVuZGVyQmFycyh2aXNpYmxlU2luZ2xlRGF0YSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGNoYXJ0IHdoZW4gaW5wdXRzIGNoYW5nZVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnMgdXAgY2hhcnQgcmVzb3VyY2VzXG4gICAqL1xuICBwdWJsaWMgY2xlYW51cENoYXJ0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl90b29sdGlwUmFmSWQgIT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFJhZklkKTtcbiAgICAgIHRoaXMuX3Rvb2x0aXBSYWZJZCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzID0gbnVsbDtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIHRoaXMuZDM/LnNlbGVjdChjb250YWluZXIpLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXInKS5yZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy5zdmcgPSB1bmRlZmluZWQhO1xuICAgIHRoaXMuY2hhcnQgPSB1bmRlZmluZWQhO1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCBjaGFydCBkaW1lbnNpb25zIGFuZCBjcmVhdGVzIFNWRyB3aXRoIHJlc3BvbnNpdmUgYXR0cmlidXRlc1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cERpbWVuc2lvbnMoY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM6IEFYQmFyQ2hhcnRPcHRpb24pOiB2b2lkIHtcbiAgICAvLyBSZW1vdmUgb3V0ZXIgbWFyZ2luczsgY2FsY3VsYXRlIG9ubHkgaW50ZXJuYWwgcGFkZGluZ3MgZm9yIGF4ZXMgYW5kIGxhYmVsc1xuICAgIHRoaXMubWFyZ2luID0geyB0b3A6IDAsIHJpZ2h0OiAwLCBib3R0b206IDAsIGxlZnQ6IDAgfTtcblxuICAgIC8vIEdldCBjb250YWluZXIgZGltZW5zaW9uc1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gY29udGFpbmVyRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSBjb250YWluZXJFbGVtZW50LmNsaWVudEhlaWdodDtcblxuICAgIC8vIEF4aXMgdmlzaWJpbGl0eVxuICAgIGNvbnN0IHNob3dYQXhpcyA9IG9wdGlvbnMuc2hvd1hBeGlzICE9PSBmYWxzZTtcbiAgICBjb25zdCBzaG93WUF4aXMgPSBvcHRpb25zLnNob3dZQXhpcyAhPT0gZmFsc2U7XG5cbiAgICAvLyBJbnRlcm5hbCBsZWZ0IHBhZGRpbmcgZm9yIFktYXhpcyB0aWNrcy9sYWJlbHMvdGl0bGVcbiAgICBjb25zdCB5QXhpc1RpdGxlVGhpY2tuZXNzID0gb3B0aW9ucy55QXhpc0xhYmVsID8gdGhpcy5ZX0FYSVNfVElUTEVfVEhJQ0tORVNTIDogMDtcbiAgICBjb25zdCB5QXhpc1RpdGxlUGFkZGluZyA9IG9wdGlvbnMueUF4aXNMYWJlbCA/IHRoaXMuWV9BWElTX1RJVExFX1BBRERJTkcgOiAwO1xuICAgIGNvbnN0IGxlZnRQYWRkaW5nRm9yWUF4aXMgPSBzaG93WUF4aXNcbiAgICAgID8gdGhpcy5jYWxjdWxhdGVNYXhZQXhpc1RpY2tMYWJlbFdpZHRoKCkgKyB0aGlzLkFYSVNfVElDS19QQURESU5HICsgeUF4aXNUaXRsZVBhZGRpbmcgKyB5QXhpc1RpdGxlVGhpY2tuZXNzXG4gICAgICA6IDA7XG4gICAgY29uc3QgbGVmdElubmVyUGFkZGluZyA9IGxlZnRQYWRkaW5nRm9yWUF4aXMgKyB0aGlzLkhPUklaT05UQUxfRURHRV9QQURESU5HO1xuICAgIGNvbnN0IHJpZ2h0SW5uZXJQYWRkaW5nID0gdGhpcy5IT1JJWk9OVEFMX0VER0VfUEFERElORztcblxuICAgIC8vIEVzdGltYXRlIGludGVybmFsIGJvdHRvbSBwYWRkaW5nIGZvciBYLWF4aXMgdGlja3MvbGFiZWxzL3RpdGxlXG4gICAgbGV0IGJvdHRvbVBhZGRpbmdGb3JYQXhpcyA9IDA7XG4gICAgaWYgKHNob3dYQXhpcykge1xuICAgICAgY29uc3QgcmF3ID0gKHRoaXMuZGF0YSgpIHx8IFtdKSBhcyBBWEJhckNoYXJ0VmFsdWU7XG4gICAgICBjb25zdCBpc0NsdXN0ZXJlZCA9IHRoaXMuaXNDbHVzdGVyZWREYXRhKHJhdyk7XG4gICAgICBjb25zdCBiYXJDb3VudCA9IGlzQ2x1c3RlcmVkID8gKHJhdyBhcyBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdKS5sZW5ndGggOiAocmF3IGFzIEFYQmFyQ2hhcnREYXRhW10pLmxlbmd0aDtcbiAgICAgIGNvbnN0IGxvbmdlc3RMYWJlbCA9ICgoKSA9PiB7XG4gICAgICAgIGlmIChpc0NsdXN0ZXJlZCkge1xuICAgICAgICAgIGNvbnN0IGdyb3VwcyA9IHJhdyBhcyBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdO1xuICAgICAgICAgIHJldHVybiBncm91cHMucmVkdWNlKChhY2MsIGcpID0+IChhY2MubGVuZ3RoID4gKGcubGFiZWw/Lmxlbmd0aCA/PyAwKSA/IGFjYyA6IChnLmxhYmVsID8/ICcnKSksICcnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmbGF0ID0gKHJhdyBhcyBBWEJhckNoYXJ0RGF0YVtdKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIGZsYXQucmVkdWNlKChhLCBiKSA9PiAoYS5sZW5ndGggPiBiLmxhYmVsLmxlbmd0aCA/IGEgOiBiLmxhYmVsKSwgJycpO1xuICAgICAgfSkoKTtcblxuICAgICAgY29uc3QgYmFzZVdpZHRoID0gb3B0aW9ucy53aWR0aCA/PyBjb250YWluZXJXaWR0aDtcbiAgICAgIGNvbnN0IHdvcmtpbmdXaWR0aCA9IE1hdGgubWF4KDEsIGJhc2VXaWR0aCAtIGxlZnRJbm5lclBhZGRpbmcgLSByaWdodElubmVyUGFkZGluZyk7XG4gICAgICBjb25zdCBkeW5hbWljRm9udFNpemUgPSBNYXRoLm1heCgxMCwgTWF0aC5taW4oMTQsIE1hdGgucm91bmQod29ya2luZ1dpZHRoIC8gNTApKSk7XG5cbiAgICAgIC8vIFVzZSB0cnVuY2F0ZWQgbGFiZWwgbGVuZ3RoIGZvciBjYWxjdWxhdGlvbiAoc2FtZSBsb2dpYyBhcyBhY3R1YWwgcmVuZGVyaW5nKVxuICAgICAgY29uc3QgbWF4TGFiZWxMZW5ndGggPSBiYXJDb3VudCA+IHRoaXMuTUFOWV9JVEVNU19USFJFU0hPTEQgPyAxMCA6IHRoaXMuTUFYX0xBQkVMX0xFTkdUSDtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZUxhYmVsTGVuZ3RoID0gTWF0aC5taW4obG9uZ2VzdExhYmVsLmxlbmd0aCwgbWF4TGFiZWxMZW5ndGgpO1xuICAgICAgY29uc3QgZXN0aW1hdGVkTG9uZ2VzdExhYmVsV2lkdGggPSBlZmZlY3RpdmVMYWJlbExlbmd0aCAqIGR5bmFtaWNGb250U2l6ZSAqIDAuNjU7XG5cbiAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoUGVyQmFyID0gYmFyQ291bnQgPiAwID8gd29ya2luZ1dpZHRoIC8gYmFyQ291bnQgOiB3b3JraW5nV2lkdGg7XG4gICAgICBjb25zdCByb3RhdGVPcHRpb24gPSB0eXBlb2Ygb3B0aW9ucy5yb3RhdGVYQXhpc0xhYmVscyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5yb3RhdGVYQXhpc0xhYmVscyA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHdpbGxSb3RhdGUgPSB0aGlzLnNob3VsZExhYmVsc1JvdGF0ZShyb3RhdGVPcHRpb24sIGVzdGltYXRlZExvbmdlc3RMYWJlbFdpZHRoLCBhdmFpbGFibGVXaWR0aFBlckJhcik7XG5cbiAgICAgIGNvbnN0IHRpY2tBcmVhSGVpZ2h0ID0gd2lsbFJvdGF0ZVxuICAgICAgICA/IGVzdGltYXRlZExvbmdlc3RMYWJlbFdpZHRoICogTWF0aC5TUVJUMV8yICsgZHluYW1pY0ZvbnRTaXplICogTWF0aC5TUVJUMV8yICsgdGhpcy5USUNLX0FSRUFfUEFERElOR1xuICAgICAgICA6IGR5bmFtaWNGb250U2l6ZSArIHRoaXMuVElDS19BUkVBX1BBRERJTkcgKyAyO1xuICAgICAgY29uc3QgZ2FwQmVsb3dUaWNrcyA9IG9wdGlvbnMueEF4aXNMYWJlbCAmJiAhd2lsbFJvdGF0ZSA/IHRoaXMuWF9BWElTX1RJVExFX0dBUCA6IDA7XG4gICAgICBjb25zdCB0aXRsZUJsb2NrSGVpZ2h0ID0gb3B0aW9ucy54QXhpc0xhYmVsICYmICF3aWxsUm90YXRlID8gdGhpcy5YX0FYSVNfVElUTEVfQkxPQ0tfSEVJR0hUIDogMDtcbiAgICAgIGJvdHRvbVBhZGRpbmdGb3JYQXhpcyA9IHRpY2tBcmVhSGVpZ2h0ICsgZ2FwQmVsb3dUaWNrcyArIHRpdGxlQmxvY2tIZWlnaHQ7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIHBsb3R0aW5nIGRpbWVuc2lvbnMgd2l0aCBzZW5zaWJsZSBmYWxsYmFja3NcbiAgICBjb25zdCBiYXNlV2lkdGggPSBvcHRpb25zLndpZHRoID8/IGNvbnRhaW5lcldpZHRoO1xuICAgIGNvbnN0IHRvdGFsV2lkdGggPSBNYXRoLm1heCh0aGlzLk1JTl9UT1RBTF9XSURUSCwgYmFzZVdpZHRoID4gMCA/IGJhc2VXaWR0aCA6IHRoaXMuTUlOX1RPVEFMX1dJRFRIKTtcbiAgICBjb25zdCBwbG90V2lkdGggPSBNYXRoLm1heCgwLCB0b3RhbFdpZHRoIC0gbGVmdElubmVyUGFkZGluZyAtIHJpZ2h0SW5uZXJQYWRkaW5nKTtcblxuICAgIGNvbnN0IHBsb3RIZWlnaHQgPSB0aGlzLmNhbGN1bGF0ZVBsb3RIZWlnaHQob3B0aW9ucy5oZWlnaHQsIGNvbnRhaW5lckhlaWdodCwgYm90dG9tUGFkZGluZ0ZvclhBeGlzKTtcblxuICAgIHRoaXMud2lkdGggPSBwbG90V2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBwbG90SGVpZ2h0O1xuXG4gICAgLy8gQ3JlYXRlIFNWRyB3aXRoIGV4cGxpY2l0IHBpeGVsIGRpbWVuc2lvbnMgdG8gYXZvaWQgY29sbGFwc2VcbiAgICBjb25zdCB0b3RhbEhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgYm90dG9tUGFkZGluZ0ZvclhBeGlzICsgdGhpcy5UT1BfRURHRV9QQURESU5HICsgdGhpcy5CT1RUT01fRURHRV9QQURESU5HO1xuXG4gICAgY29uc3Qgc3ZnID0gdGhpcy5kM1xuICAgICAgLnNlbGVjdChjb250YWluZXJFbGVtZW50KVxuICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgIC5hdHRyKCd3aWR0aCcsICcxMDAlJylcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCAnMTAwJScpXG4gICAgICAuYXR0cigndmlld0JveCcsIGAwIDAgJHt0b3RhbFdpZHRofSAke3RvdGFsSGVpZ2h0fWApXG4gICAgICAuYXR0cigncHJlc2VydmVBc3BlY3RSYXRpbycsICd4TWlkWU1pZCBtZWV0Jyk7XG5cbiAgICB0aGlzLnN2ZyA9IHN2ZztcblxuICAgIC8vIENyZWF0ZSBjaGFydCBncm91cCB0cmFuc2xhdGVkIGJ5IGludGVybmFsIHBhZGRpbmdzIChubyBleHRlcm5hbCBtYXJnaW5zKVxuICAgIHRoaXMuY2hhcnQgPSB0aGlzLnN2Z1xuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuYXR0cignY2xhc3MnLCAnY2hhcnQtY29udGVudCcpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke2xlZnRJbm5lclBhZGRpbmd9LCR7dGhpcy5UT1BfRURHRV9QQURESU5HfSlgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHBsb3QgaGVpZ2h0IGJhc2VkIG9uIG9wdGlvbnMgYW5kIGNvbnRhaW5lciBkaW1lbnNpb25zXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVBsb3RIZWlnaHQoXG4gICAgb3B0aW9uSGVpZ2h0OiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgY29udGFpbmVySGVpZ2h0OiBudW1iZXIsXG4gICAgYm90dG9tUGFkZGluZzogbnVtYmVyLFxuICApOiBudW1iZXIge1xuICAgIGlmIChvcHRpb25IZWlnaHQgJiYgb3B0aW9uSGVpZ2h0ID4gMCkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuTUlOX1BMT1RfSEVJR0hULCBvcHRpb25IZWlnaHQgLSBib3R0b21QYWRkaW5nKTtcbiAgICB9XG4gICAgaWYgKGNvbnRhaW5lckhlaWdodCA+IDApIHtcbiAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLk1JTl9QTE9UX0hFSUdIVCwgY29udGFpbmVySGVpZ2h0IC0gYm90dG9tUGFkZGluZywgdGhpcy5GQUxMQkFDS19QTE9UX0hFSUdIVCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLkZBTExCQUNLX1BMT1RfSEVJR0hUO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgWC1heGlzIGxhYmVscyBzaG91bGQgcm90YXRlXG4gICAqL1xuICBwcml2YXRlIHNob3VsZExhYmVsc1JvdGF0ZShcbiAgICByb3RhdGVPcHRpb246IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgZXN0aW1hdGVkV2lkdGg6IG51bWJlcixcbiAgICBhdmFpbGFibGVXaWR0aDogbnVtYmVyLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAocm90YXRlT3B0aW9uID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAocm90YXRlT3B0aW9uID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBlc3RpbWF0ZWRXaWR0aCA+IGF2YWlsYWJsZVdpZHRoO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgeCBhbmQgeSBzY2FsZXMgZm9yIHRoZSBjaGFydFxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cFNjYWxlcyhkYXRhOiBBWEJhckNoYXJ0RGF0YVtdKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBiYXIgd2lkdGggcGVyY2VudGFnZSAoZGVmYXVsdCA2MCUpXG4gICAgY29uc3QgYmFyV2lkdGhQZXJjZW50ID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYmFyV2lkdGggPz8gMC42O1xuICAgIC8vIENhbGN1bGF0ZSBwYWRkaW5nIGJhc2VkIG9uIGJhcldpZHRoIChpbnZlcnNlIHJlbGF0aW9uc2hpcClcbiAgICBjb25zdCBwYWRkaW5nID0gTWF0aC5tYXgodGhpcy5NSU5fUEFERElORywgMSAtIGJhcldpZHRoUGVyY2VudCk7XG5cbiAgICAvLyBDcmVhdGUgeCBzY2FsZSAoYmFuZCBzY2FsZSBmb3IgY2F0ZWdvcmljYWwgZGF0YSlcbiAgICB0aGlzLnhTY2FsZSA9IHRoaXMuZDNcbiAgICAgIC5zY2FsZUJhbmQoKVxuICAgICAgLmRvbWFpbihkYXRhLm1hcCgoZCkgPT4gZC5pZCkpXG4gICAgICAucmFuZ2UoWzAsIHRoaXMud2lkdGhdKVxuICAgICAgLnBhZGRpbmcocGFkZGluZyk7XG5cbiAgICAvLyBDcmVhdGUgeSBzY2FsZSAobGluZWFyIHNjYWxlIGZvciB2YWx1ZXMpXG4gICAgLy8gU3VwcG9ydCBuZWdhdGl2ZSB2YWx1ZXMgYnkgY2FsY3VsYXRpbmcgbWluL21heFxuICAgIGNvbnN0IG1pblZhbHVlID0gdGhpcy5kMy5taW4oZGF0YSwgKGQpID0+IGQudmFsdWUpIHx8IDA7XG4gICAgY29uc3QgbWF4VmFsdWUgPSB0aGlzLmQzLm1heChkYXRhLCAoZCkgPT4gZC52YWx1ZSkgfHwgMDtcblxuICAgIHRoaXMueVNjYWxlID0gdGhpcy5kM1xuICAgICAgLnNjYWxlTGluZWFyKClcbiAgICAgIC5kb21haW4oW01hdGgubWluKDAsIG1pblZhbHVlKSwgTWF0aC5tYXgoMCwgbWF4VmFsdWUpXSlcbiAgICAgIC5uaWNlKClcbiAgICAgIC5yYW5nZShbdGhpcy5oZWlnaHQsIDBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHggYW5kIHkgc2NhbGVzIGZvciBjbHVzdGVyZWQgY2hhcnRzXG4gICAqL1xuICBwcml2YXRlIHNldHVwU2NhbGVzQ2x1c3RlcmVkKGdyb3VwczogQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXSk6IHZvaWQge1xuICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IHRoaXMuZ2V0Q2x1c3RlclNlcmllc0xhYmVscyhncm91cHMpO1xuICAgIGNvbnN0IHZpc2libGVTZXJpZXMgPSBzZXJpZXNMYWJlbHMuZmlsdGVyKChzKSA9PiAhdGhpcy5oaWRkZW5TZXJpZXMuaGFzKHMpKTtcblxuICAgIC8vIE91dGVyIGJhbmQgZm9yIGNsdXN0ZXJzXG4gICAgdGhpcy54U2NhbGUgPSB0aGlzLmQzXG4gICAgICAuc2NhbGVCYW5kKClcbiAgICAgIC5kb21haW4oZ3JvdXBzLm1hcCgoZykgPT4gZy5pZCkpXG4gICAgICAucmFuZ2UoWzAsIHRoaXMud2lkdGhdKVxuICAgICAgLnBhZGRpbmcodGhpcy5PVVRFUl9QQURESU5HX0NMVVNURVJFRCk7XG5cbiAgICAvLyBJbm5lciBiYW5kIGZvciBzZXJpZXNcbiAgICB0aGlzLnhTdWJTY2FsZSA9IHRoaXMuZDNcbiAgICAgIC5zY2FsZUJhbmQoKVxuICAgICAgLmRvbWFpbih2aXNpYmxlU2VyaWVzKVxuICAgICAgLnJhbmdlKFswLCB0aGlzLnhTY2FsZS5iYW5kd2lkdGgoKV0pXG4gICAgICAucGFkZGluZyh0aGlzLklOTkVSX1BBRERJTkdfQ0xVU1RFUkVEKTtcblxuICAgIC8vIFkgc2NhbGUgYWNyb3NzIGFsbCB2aXNpYmxlIHZhbHVlcyAoc3VwcG9ydCBuZWdhdGl2ZSB2YWx1ZXMpXG4gICAgY29uc3QgYWxsVmlzaWJsZVZhbHVlczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGcgb2YgZ3JvdXBzKSB7XG4gICAgICB2aXNpYmxlU2VyaWVzLmZvckVhY2goKF8sIGlkeCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gZy5jaGFydERhdGFbaWR4XTtcbiAgICAgICAgaWYgKGl0ZW0gJiYgdHlwZW9mIGl0ZW0udmFsdWUgPT09ICdudW1iZXInKSBhbGxWaXNpYmxlVmFsdWVzLnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeU1pbiA9IHRoaXMuZDMubWluKGFsbFZpc2libGVWYWx1ZXMpIHx8IDA7XG4gICAgY29uc3QgeU1heCA9IHRoaXMuZDMubWF4KGFsbFZpc2libGVWYWx1ZXMpIHx8IDA7XG5cbiAgICB0aGlzLnlTY2FsZSA9IHRoaXMuZDNcbiAgICAgIC5zY2FsZUxpbmVhcigpXG4gICAgICAuZG9tYWluKFtNYXRoLm1pbigwLCB5TWluKSwgTWF0aC5tYXgoMCwgeU1heCldKVxuICAgICAgLm5pY2UoKVxuICAgICAgLnJhbmdlKFt0aGlzLmhlaWdodCwgMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgeCBhbmQgeSBheGVzIHdpdGggZ3JpZCBsaW5lc1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBeGVzKG9wdGlvbnM6IEFYQmFyQ2hhcnRPcHRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBzaG93WEF4aXMgPSBvcHRpb25zLnNob3dYQXhpcyAhPT0gZmFsc2U7XG4gICAgY29uc3Qgc2hvd1lBeGlzID0gb3B0aW9ucy5zaG93WUF4aXMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHNob3dHcmlkID0gb3B0aW9ucy5zaG93R3JpZCAhPT0gZmFsc2U7XG5cbiAgICBjb25zdCBheGVzR3JvdXAgPSB0aGlzLmNoYXJ0LmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1heGVzJyk7XG5cbiAgICBpZiAoc2hvd1hBeGlzKSB7XG4gICAgICB0aGlzLmNyZWF0ZVhBeGlzKGF4ZXNHcm91cCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKHNob3dZQXhpcykge1xuICAgICAgdGhpcy5jcmVhdGVZQXhpcyhheGVzR3JvdXAsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChzaG93R3JpZCkge1xuICAgICAgdGhpcy5jcmVhdGVHcmlkTGluZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVhBeGlzKFxuICAgIGF4ZXNHcm91cDogUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5kMy5zZWxlY3Q8U1ZHR0VsZW1lbnQsIHVua25vd24+PixcbiAgICBvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB2aXNpYmxlRGF0YUZvclRpY2tzID0gKHRoaXMuZGF0YSgpIHx8IFtdKS5maWx0ZXIoKGQpID0+ICF0aGlzLmlzQmFySGlkZGVuKGQuaWQpKTtcbiAgICBjb25zdCBpZFRvTGFiZWwgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPih2aXNpYmxlRGF0YUZvclRpY2tzLm1hcCgoZCkgPT4gW2QuaWQsIGQubGFiZWxdKSk7XG4gICAgdGhpcy5idWlsZFhBeGlzQ29tbW9uKGF4ZXNHcm91cCwgaWRUb0xhYmVsLCBvcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlWUF4aXMoXG4gICAgYXhlc0dyb3VwOiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmQzLnNlbGVjdDxTVkdHRWxlbWVudCwgdW5rbm93bj4+LFxuICAgIG9wdGlvbnM6IEFYQmFyQ2hhcnRPcHRpb24sXG4gICk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBZIGF4aXMgd2l0aCBzbWFydCBudW1iZXIgZm9ybWF0dGluZ1xuICAgIGNvbnN0IHlBeGlzR2VuZXJhdG9yID0gdGhpcy5kMy5heGlzTGVmdCh0aGlzLnlTY2FsZSkudGlja0Zvcm1hdCgodmFsdWU6IG51bWJlciB8IHsgdmFsdWVPZigpOiBudW1iZXIgfSkgPT4ge1xuICAgICAgY29uc3QgbnVtVmFsdWUgPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiB2YWx1ZS52YWx1ZU9mKCk7XG4gICAgICByZXR1cm4gZm9ybWF0TGFyZ2VOdW1iZXIobnVtVmFsdWUpO1xuICAgIH0pO1xuXG4gICAgLy8gUmVkdWNlIHRpY2sgY291bnQgZm9yIGJldHRlciByZWFkYWJpbGl0eVxuICAgIGNvbnN0IG1heFZhbHVlID0gdGhpcy55U2NhbGUuZG9tYWluKClbMV07XG4gICAgaWYgKG1heFZhbHVlID4gMWU2KSB7XG4gICAgICB5QXhpc0dlbmVyYXRvci50aWNrcyg2KTsgLy8gRmV3ZXIgdGlja3MgZm9yIGxhcmdlIG51bWJlcnNcbiAgICB9IGVsc2UgaWYgKG1heFZhbHVlID4gMWUzKSB7XG4gICAgICB5QXhpc0dlbmVyYXRvci50aWNrcyg4KTtcbiAgICB9XG5cbiAgICB0aGlzLnlBeGlzID0gYXhlc0dyb3VwLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1heGlzLXknKS5jYWxsKHlBeGlzR2VuZXJhdG9yKTtcblxuICAgIC8vIFN0eWxlIHRoZSBheGlzIHRleHRcbiAgICBjb25zdCBkeW5hbWljRm9udFNpemUgPSB0aGlzLmdldFlBeGlzVGlja0ZvbnRTaXplQmFzZWRPbkhlaWdodCgpO1xuICAgIHRoaXMueUF4aXNcbiAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHtkeW5hbWljRm9udFNpemV9cHhgKVxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc0MDAnKVxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYmEodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtbGFiZWxzLWNvbG9yKSwgMC43KScpXG4gICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnZW5kJylcbiAgICAgIC5hdHRyKCdkaXJlY3Rpb24nLCAnbHRyJyk7XG5cbiAgICAvLyBTdHlsZSBheGlzIGxpbmVzXG4gICAgdGhpcy55QXhpcy5zZWxlY3RBbGwoJ2xpbmUsIHBhdGgnKS5zdHlsZSgnc3Ryb2tlJywgJ3JnYih2YXIoLS1heC1jb21wLWJhci1jaGFydC1ncmlkLWxpbmVzLWNvbG9yKSknKTtcblxuICAgIC8vIEFkZCBZIGF4aXMgdGl0bGVcbiAgICBpZiAob3B0aW9ucy55QXhpc0xhYmVsKSB7XG4gICAgICB0aGlzLmNyZWF0ZVlBeGlzVGl0bGUoYXhlc0dyb3VwLCBvcHRpb25zLnlBeGlzTGFiZWwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUm90YXRlWEF4aXNMYWJlbHMoaWRUb0xhYmVsOiBNYXA8c3RyaW5nLCBzdHJpbmc+LCBmb250U2l6ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdXNlciBleHBsaWNpdGx5IHNldCByb3RhdGlvbiBvcHRpb25cbiAgICBpZiAob3B0aW9ucy5yb3RhdGVYQXhpc0xhYmVscyA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKG9wdGlvbnMucm90YXRlWEF4aXNMYWJlbHMgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBJZiAnYXV0bycgb3IgdW5kZWZpbmVkLCB1c2UgaW50ZWxsaWdlbnQgY2FsY3VsYXRpb25cbiAgICBpZiAodGhpcy54U2NhbGUuZG9tYWluKCkubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBzdGVwID0gdGhpcy54U2NhbGUuc3RlcCgpO1xuICAgIGNvbnN0IGxhYmVscyA9IEFycmF5LmZyb20oaWRUb0xhYmVsLnZhbHVlcygpKTtcbiAgICBjb25zdCBsb25nZXN0TGFiZWwgPSBsYWJlbHMucmVkdWNlKChhLCBiKSA9PiAoYS5sZW5ndGggPiBiLmxlbmd0aCA/IGEgOiBiKSwgJycpO1xuICAgIGNvbnN0IGVzdGltYXRlZFdpZHRoID0gbG9uZ2VzdExhYmVsLmxlbmd0aCAqIGZvbnRTaXplICogdGhpcy5DSEFSX1dJRFRIX1JBVElPO1xuXG4gICAgLy8gSGV1cmlzdGljOiBhdm9pZCByb3RhdGlvbiB3aGVuIHRoZXJlIGFyZSBmZXcgY2F0ZWdvcmllcyBldmVuIGlmIGVzdGltYXRpb24gaXMgc2xpZ2h0bHkgbGFyZ2VyXG4gICAgY29uc3QgZG9tYWluQ291bnQgPSB0aGlzLnhTY2FsZS5kb21haW4oKS5sZW5ndGg7XG4gICAgaWYgKGRvbWFpbkNvdW50IDw9IHRoaXMuU01BTExfREFUQVNFVF9USFJFU0hPTEQpIHtcbiAgICAgIHJldHVybiBlc3RpbWF0ZWRXaWR0aCA+IHN0ZXAgKiB0aGlzLlJPVEFUSU9OX1RPTEVSQU5DRV9TTUFMTF9EQVRBU0VUO1xuICAgIH1cblxuICAgIHJldHVybiBlc3RpbWF0ZWRXaWR0aCA+IHN0ZXA7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVhBeGlzVGl0bGUoXG4gICAgYXhlc0dyb3VwOiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmQzLnNlbGVjdDxTVkdHRWxlbWVudCwgdW5rbm93bj4+LFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgdGlja0FyZWFIZWlnaHQ6IG51bWJlcixcbiAgICBnYXBCZWxvd1RpY2tzID0gdGhpcy5USUNLX0FSRUFfR0FQLFxuICApOiB2b2lkIHtcbiAgICAvLyBUaXRsZSBwb3NpdGlvbmVkIGRpcmVjdGx5IGJlbG93IHRpY2sgYXJlYSB3aXRoIGEgY29uc2lzdGVudCBnYXBcbiAgICBjb25zdCBsYWJlbFkgPSB0aGlzLmhlaWdodCArIHRpY2tBcmVhSGVpZ2h0ICsgZ2FwQmVsb3dUaWNrcztcblxuICAgIGF4ZXNHcm91cFxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWF4aXMtbGFiZWwgYXgteC1heGlzLWxhYmVsJylcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ2hhbmdpbmcnKSAvLyBBbGlnbiB0byB0b3Agb2YgdGV4dCBmb3IgYmV0dGVyIHBvc2l0aW9uaW5nXG4gICAgICAuYXR0cigneCcsIHRoaXMud2lkdGggLyAyKVxuICAgICAgLmF0dHIoJ3knLCBsYWJlbFkpXG4gICAgICAuYXR0cignZGlyZWN0aW9uJywgJ2x0cicpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke3RoaXMuWF9BWElTX1RJVExFX0ZPTlRfU0laRX1weGApXG4gICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzUwMCcpXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWF4aXMtbGFiZWwtY29sb3IpKScpXG4gICAgICAudGV4dCh0aXRsZSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVlBeGlzVGl0bGUoYXhlc0dyb3VwOiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmQzLnNlbGVjdDxTVkdHRWxlbWVudCwgdW5rbm93bj4+LCB0aXRsZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBleGFjdCBwb3NpdGlvbiBmb3IgWS1heGlzIHRpdGxlXG4gICAgLy8gWS1heGlzIHRpY2sgbGFiZWxzIHVzZSB0ZXh0LWFuY2hvcjogZW5kLCBzbyB0aGV5IGV4dGVuZCBMRUZUIG9mIHRoZSBZLWF4aXMgbGluZVxuICAgIC8vIFktYXhpcyBpcyBhdCBYID0gMCB3aXRoaW4gdGhlIGNoYXJ0IGdyb3VwXG4gICAgLy8gQ2hhcnQgZ3JvdXAgaXMgdHJhbnNsYXRlZCBieSAobWFyZ2luLmxlZnQsIG1hcmdpbi50b3ApXG4gICAgLy8gU28gWS1heGlzIGlzIGF0IFggPSBtYXJnaW4ubGVmdCBpbiBTVkcgY29vcmRpbmF0ZXNcblxuICAgIGNvbnN0IG1heFRpY2tMYWJlbFdpZHRoID0gdGhpcy5jYWxjdWxhdGVNYXhZQXhpc1RpY2tMYWJlbFdpZHRoKCk7XG4gICAgY29uc3QgcGFkZGluZyA9IHRoaXMuWV9BWElTX1BBRERJTkc7XG5cbiAgICAvLyBQb3NpdGlvbiB0aXRsZSB0byB0aGUgbGVmdCBvZiB0aGUgdGljayBsYWJlbHNcbiAgICAvLyBTaW5jZSB0ZXh0LWFuY2hvcjogZW5kIGFsaWducyB0aGUgdGV4dCB0byB0aGUgWS1heGlzLCB3ZSBuZWVkIHRvIGdvIGZ1cnRoZXIgbGVmdFxuICAgIGNvbnN0IGxhYmVsWSA9IC1tYXhUaWNrTGFiZWxXaWR0aCAtIHBhZGRpbmc7XG5cbiAgICAvLyBDZW50ZXIgdGhlIHRpdGxlIHZlcnRpY2FsbHlcbiAgICBjb25zdCBsYWJlbFggPSAtdGhpcy5oZWlnaHQgLyAyO1xuXG4gICAgYXhlc0dyb3VwXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYXhpcy1sYWJlbCBheC15LWF4aXMtbGFiZWwnKVxuICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAuYXR0cignZG9taW5hbnQtYmFzZWxpbmUnLCAnbWlkZGxlJylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAncm90YXRlKC05MCknKVxuICAgICAgLmF0dHIoJ3gnLCBsYWJlbFgpXG4gICAgICAuYXR0cigneScsIGxhYmVsWSlcbiAgICAgIC5hdHRyKCdkaXJlY3Rpb24nLCAnbHRyJylcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJzE0cHgnKVxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc1MDAnKVxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWJhci1jaGFydC1heGlzLWxhYmVsLWNvbG9yKSknKVxuICAgICAgLnRleHQodGl0bGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVNYXhZQXhpc1RpY2tMYWJlbFdpZHRoKCk6IG51bWJlciB7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHdpZHRoIG5lZWRlZCBmb3IgWS1heGlzIHRpY2sgbGFiZWxzXG4gICAgY29uc3QgcmF3ID0gKHRoaXMuZGF0YSgpIHx8IFtdKSBhcyBBWEJhckNoYXJ0VmFsdWU7XG4gICAgY29uc3QgaXNDbHVzdGVyZWQgPSB0aGlzLmlzQ2x1c3RlcmVkRGF0YShyYXcpO1xuXG4gICAgbGV0IG1heFZhbHVlID0gMDtcbiAgICBpZiAoaXNDbHVzdGVyZWQpIHtcbiAgICAgIGNvbnN0IGdyb3VwcyA9IHJhdyBhcyBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdO1xuICAgICAgY29uc3Qgc2VyaWVzTGFiZWxzID0gZ3JvdXBzLmxlbmd0aCA+IDAgPyB0aGlzLmdldENsdXN0ZXJTZXJpZXNMYWJlbHMoZ3JvdXBzKSA6IFtdO1xuICAgICAgY29uc3QgdmlzaWJsZVNlcmllcyA9IHNlcmllc0xhYmVscy5maWx0ZXIoKHMpID0+ICF0aGlzLmhpZGRlblNlcmllcy5oYXMocykpO1xuXG4gICAgICBmb3IgKGNvbnN0IGcgb2YgZ3JvdXBzKSB7XG4gICAgICAgIHZpc2libGVTZXJpZXMuZm9yRWFjaCgoXywgaWR4KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbSA9IGcuY2hhcnREYXRhW2lkeF07XG4gICAgICAgICAgaWYgKGl0ZW0gJiYgdHlwZW9mIGl0ZW0udmFsdWUgPT09ICdudW1iZXInKSBtYXhWYWx1ZSA9IE1hdGgubWF4KG1heFZhbHVlLCBpdGVtLnZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZpc2libGVEYXRhID0gKHJhdyBhcyBBWEJhckNoYXJ0RGF0YVtdKS5maWx0ZXIoKGQpID0+ICF0aGlzLmlzQmFySGlkZGVuKGQuaWQpKTtcbiAgICAgIG1heFZhbHVlID0gdmlzaWJsZURhdGEucmVkdWNlKChhY2MsIGQpID0+IChkLnZhbHVlID4gYWNjID8gZC52YWx1ZSA6IGFjYyksIDApO1xuICAgIH1cblxuICAgIC8vIFVzZSBmb3JtYXR0ZWQgbnVtYmVyIGZvciB3aWR0aCBjYWxjdWxhdGlvblxuICAgIGNvbnN0IHRpY2tMYWJlbFRleHQgPSBOdW1iZXIuaXNGaW5pdGUobWF4VmFsdWUpID8gZm9ybWF0TGFyZ2VOdW1iZXIobWF4VmFsdWUpIDogJzAwMDAwJztcbiAgICByZXR1cm4gdGlja0xhYmVsVGV4dC5sZW5ndGggKiB0aGlzLkRFRkFVTFRfRk9OVF9TSVpFICogdGhpcy5GT05UX1dJRFRIX01VTFRJUExJRVIgKyB0aGlzLkZPTlRfUEFERElORztcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlR3JpZExpbmVzKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhcnRcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1ncmlkJylcbiAgICAgIC5jYWxsKFxuICAgICAgICB0aGlzLmQzXG4gICAgICAgICAgLmF4aXNMZWZ0KHRoaXMueVNjYWxlKVxuICAgICAgICAgIC50aWNrU2l6ZSgtdGhpcy53aWR0aClcbiAgICAgICAgICAudGlja0Zvcm1hdCgoKSA9PiAnJyksXG4gICAgICApXG4gICAgICAuc2VsZWN0QWxsKCdsaW5lJylcbiAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ3JnYih2YXIoLS1heC1jb21wLWJhci1jaGFydC1ncmlkLWxpbmVzLWNvbG9yKSknKVxuICAgICAgLnN0eWxlKCdzdHJva2Utb3BhY2l0eScsIDAuMik7XG5cbiAgICAvLyBSZW1vdmUgdW5uZWVkZWQgZWxlbWVudHMgZnJvbSBncmlkXG4gICAgdGhpcy5jaGFydC5zZWxlY3QoJy5heC1iYXItY2hhcnQtZ3JpZCcpLnNlbGVjdEFsbCgncGF0aCwgdGV4dCcpLnJlbW92ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYXhlcyBmb3IgY2x1c3RlcmVkIGNoYXJ0c1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBeGVzQ2x1c3RlcmVkKG9wdGlvbnM6IEFYQmFyQ2hhcnRPcHRpb24sIGdyb3VwczogQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXSk6IHZvaWQge1xuICAgIGNvbnN0IHNob3dYQXhpcyA9IG9wdGlvbnMuc2hvd1hBeGlzICE9PSBmYWxzZTtcbiAgICBjb25zdCBzaG93WUF4aXMgPSBvcHRpb25zLnNob3dZQXhpcyAhPT0gZmFsc2U7XG4gICAgY29uc3Qgc2hvd0dyaWQgPSBvcHRpb25zLnNob3dHcmlkICE9PSBmYWxzZTtcblxuICAgIGNvbnN0IGF4ZXNHcm91cCA9IHRoaXMuY2hhcnQuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWF4ZXMnKTtcblxuICAgIGlmIChzaG93WEF4aXMpIHtcbiAgICAgIHRoaXMuY3JlYXRlWEF4aXNDbHVzdGVyZWQoYXhlc0dyb3VwLCBvcHRpb25zLCBncm91cHMpO1xuICAgIH1cblxuICAgIGlmIChzaG93WUF4aXMpIHtcbiAgICAgIHRoaXMuY3JlYXRlWUF4aXMoYXhlc0dyb3VwLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvd0dyaWQpIHtcbiAgICAgIHRoaXMuY3JlYXRlR3JpZExpbmVzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVYQXhpc0NsdXN0ZXJlZChcbiAgICBheGVzR3JvdXA6IFJldHVyblR5cGU8dHlwZW9mIHRoaXMuZDMuc2VsZWN0PFNWR0dFbGVtZW50LCB1bmtub3duPj4sXG4gICAgb3B0aW9uczogQVhCYXJDaGFydE9wdGlvbixcbiAgICBncm91cHM6IEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGlkVG9MYWJlbCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KGdyb3Vwcy5tYXAoKGcpID0+IFtnLmlkLCBnLmxhYmVsXSkpO1xuICAgIHRoaXMuYnVpbGRYQXhpc0NvbW1vbihheGVzR3JvdXAsIGlkVG9MYWJlbCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgYmFycyB3aXRoIGFuaW1hdGlvbnNcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQmFycyhkYXRhOiBBWEJhckNoYXJ0RGF0YVtdKTogdm9pZCB7XG4gICAgLy8gRmlsdGVyIG91dCBoaWRkZW4gYmFyc1xuICAgIGNvbnN0IHZpc2libGVEYXRhID0gZGF0YS5maWx0ZXIoKGQpID0+ICF0aGlzLmlzQmFySGlkZGVuKGQuaWQpKTtcbiAgICBjb25zdCBvcmlnaW5hbEZ1bGxEYXRhID0gKHRoaXMuZGF0YSgpIGFzIEFYQmFyQ2hhcnREYXRhW10pIHx8IFtdO1xuXG4gICAgLy8gUmVzZXQgYW5pbWF0aW9uIHN0YXRlXG4gICAgdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlLnNldChmYWxzZSk7XG5cbiAgICAvLyBHZXQgY29ybmVyIHJhZGl1cyBmcm9tIG9wdGlvbnNcbiAgICBjb25zdCByYWRpdXMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5jb3JuZXJSYWRpdXM7XG5cbiAgICAvLyBHZXQgYW5pbWF0aW9uIG9wdGlvbnNcbiAgICBjb25zdCBhbmltYXRpb25EdXJhdGlvbiA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIGNvbnN0IGFuaW1hdGlvbkVhc2luZyA9IGdldEVhc2luZ0Z1bmN0aW9uKHRoaXMuZDMsIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkVhc2luZyk7XG5cbiAgICAvLyBDcmVhdGUgYSBjb250YWluZXIgZm9yIGFsbCBiYXJzXG4gICAgY29uc3QgYmFyc0NvbnRhaW5lciA9IHRoaXMuY2hhcnQuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWJhcnMtY29udGFpbmVyJyk7XG5cbiAgICAvLyBDcmVhdGUgZ3JvdXBzIGZvciBlYWNoIGJhciB0byBoYW5kbGUgdHJhbnNmb3JtYXRpb25zXG4gICAgY29uc3QgYmFyR3JvdXBzID0gYmFyc0NvbnRhaW5lclxuICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1iYXItZ3JvdXAnKVxuICAgICAgLmRhdGEodmlzaWJsZURhdGEpXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYmFyLWdyb3VwJyk7XG5cbiAgICAvLyBBZGQgYmFycyBpbnNpZGUgZ3JvdXBzXG4gICAgY29uc3QgYmFycyA9IGJhckdyb3Vwc1xuICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWJhcicpXG4gICAgICAuYXR0cignZCcsIChkOiBBWEJhckNoYXJ0RGF0YSkgPT4ge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy54U2NhbGUoZC5pZCk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy54U2NhbGUuYmFuZHdpZHRoKCk7XG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLmhlaWdodCAtIDAuNTsgLy8gaW5pdGlhbCBoZWlnaHQgaXMgemVyb1xuICAgICAgICByZXR1cm4gYE0ke3h9LCR7eX0gTCR7eH0sJHt5fSBMJHt4ICsgd2lkdGh9LCR7eX0gTCR7eCArIHdpZHRofSwke3l9IFpgO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKCdmaWxsJywgKGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB7XG4gICAgICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGJhciAoZCkgaW4gdGhlIG9yaWdpbmFsIGRhdGEgYXJyYXlcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxJbmRleCA9IG9yaWdpbmFsRnVsbERhdGEuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBkLmlkKTtcbiAgICAgICAgLy8gVXNlIHRoZSBvcmlnaW5hbCBjb2xvciBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGdldCBjb2xvciBmcm9tIHBhbGV0dGUgdXNpbmcgb3JpZ2luYWwgaW5kZXhcbiAgICAgICAgLy8gRmFsbGJhY2sgdG8gaW5kZXggMCBpZiBub3QgZm91bmQsIHRob3VnaCB0aGlzIHNob3VsZG4ndCBoYXBwZW4gd2l0aCB2YWxpZCBkYXRhLlxuICAgICAgICByZXR1cm4gZC5jb2xvciB8fCB0aGlzLmdldENvbG9yKG9yaWdpbmFsSW5kZXggIT09IC0xID8gb3JpZ2luYWxJbmRleCA6IDApO1xuICAgICAgfSk7XG5cbiAgICAvLyBBZGQgZGF0YSBsYWJlbHMgaWYgdGhleSdyZSBlbmFibGVkXG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dEYXRhTGFiZWxzICE9PSBmYWxzZSkge1xuICAgICAgYmFyR3JvdXBzXG4gICAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWRhdGEtbGFiZWwnKVxuICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgICAgLmF0dHIoJ3gnLCAoZDogQVhCYXJDaGFydERhdGEpID0+IHRoaXMueFNjYWxlKGQuaWQpICsgdGhpcy54U2NhbGUuYmFuZHdpZHRoKCkgLyAyKVxuICAgICAgICAuYXR0cigneScsIHRoaXMuaGVpZ2h0KSAvLyBTdGFydCBmcm9tIGJvdHRvbSBmb3IgYW5pbWF0aW9uXG4gICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJ2NsYW1wKDhweCwgMnZtaW4sIDEycHgpJylcbiAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc1MDAnKVxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWRhdGEtbGFiZWxzLWNvbG9yKSknKVxuICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKSAvLyBTdGFydCBpbnZpc2libGUgZm9yIGFuaW1hdGlvblxuICAgICAgICAudGV4dCgoZDogQVhCYXJDaGFydERhdGEpID0+IHtcbiAgICAgICAgICAvLyBGb3JtYXQgbGFyZ2UgbnVtYmVycyBpbiBkYXRhIGxhYmVsc1xuICAgICAgICAgIHJldHVybiBkLnZhbHVlID49IDEwMDAgPyBmb3JtYXRMYXJnZU51bWJlcihkLnZhbHVlKSA6IGQudmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBBbmltYXRlIGRhdGEgbGFiZWxzIHdpdGggc21hcnQgcG9zaXRpb25pbmcgdG8gYXZvaWQgY2xpcHBpbmdcbiAgICAgIGNvbnN0IGFuaW1hdGlvbkRlbGF5ID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYW5pbWF0aW9uRGVsYXkgPz8gdGhpcy5ERUZBVUxUX0FOSU1BVElPTl9ERUxBWTtcbiAgICAgIGJhckdyb3Vwc1xuICAgICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWRhdGEtbGFiZWwnKVxuICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgICAgLmRlbGF5KChkOiBBWEJhckNoYXJ0RGF0YSwgaTogbnVtYmVyKSA9PiBpICogYW5pbWF0aW9uRGVsYXkgKyB0aGlzLkxBQkVMX0FOSU1BVElPTl9ERUxBWSlcbiAgICAgICAgLmF0dHIoJ3knLCAoZDogQVhCYXJDaGFydERhdGEpID0+IHtcbiAgICAgICAgICBjb25zdCBiYXJUb3AgPSB0aGlzLnlTY2FsZShkLnZhbHVlKTtcblxuICAgICAgICAgIC8vIElmIGJhciBpcyBuZWFyIHRoZSB0b3AgKDEwMCUgb3IgY2xvc2UpLCBwb3NpdGlvbiBsYWJlbCBpbnNpZGUgdGhlIGJhclxuICAgICAgICAgIGlmIChiYXJUb3AgPCB0aGlzLk1JTl9UT1BfU1BBQ0VfRk9SX0xBQkVMKSB7XG4gICAgICAgICAgICByZXR1cm4gYmFyVG9wICsgdGhpcy5MQUJFTF9PRkZTRVQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gT3RoZXJ3aXNlLCBwb3NpdGlvbiBhYm92ZSB0aGUgYmFyXG4gICAgICAgICAgcmV0dXJuIGJhclRvcCAtIHRoaXMuTEFCRUxfT0ZGU0VUO1xuICAgICAgICB9KVxuICAgICAgICAuYXR0cignZGF0YS1pbnNpZGUtYmFyJywgKGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB7XG4gICAgICAgICAgY29uc3QgYmFyVG9wID0gdGhpcy55U2NhbGUoZC52YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGJhclRvcCA8IHRoaXMuTUlOX1RPUF9TUEFDRV9GT1JfTEFCRUwgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgICAgICB9KVxuICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAxKVxuICAgICAgICAuZWFzZShhbmltYXRpb25FYXNpbmcpO1xuICAgIH1cblxuICAgIC8vIFNldCB1cCBldmVudCBoYW5kbGVycyBvbiBlYWNoIGdyb3VwXG4gICAgYmFyR3JvdXBzXG4gICAgICAub24oJ21vdXNlZW50ZXInLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB7XG4gICAgICAgIC8vIE9ubHkgYXBwbHkgaG92ZXIgZWZmZWN0cyBpZiBpbml0aWFsIGFuaW1hdGlvbiBpcyBjb21wbGV0ZVxuICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgYmFyRWwgPSB0aGlzLmQzLnNlbGVjdChldmVudC5jdXJyZW50VGFyZ2V0KS5zZWxlY3QoJ3BhdGgnKTtcblxuICAgICAgICAvLyBTdGFuZGFyZCBob3ZlciBlZmZlY3QgLSBkYXJrZW4gdGhlIGJhciBzbGlnaHRseSBhbmQgYWRkIGEgc3VidGxlIHNoYWRvd1xuICAgICAgICBiYXJFbFxuICAgICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgICAuZHVyYXRpb24odGhpcy5IT1ZFUl9UUkFOU0lUSU9OX0RVUkFUSU9OKVxuICAgICAgICAgIC5zdHlsZSgnZmlsdGVyJywgJ2JyaWdodG5lc3MoMC43KSBkcm9wLXNoYWRvdygwIDAgMnB4IHJnYmEoMCwwLDAsMC4xKSknKTtcblxuICAgICAgICB0aGlzLmhhbmRsZUJhckhvdmVyKGV2ZW50LCBkKTtcbiAgICAgIH0pXG4gICAgICAub24oJ21vdXNlbW92ZScsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0b29sdGlwIGlmIGluaXRpYWwgYW5pbWF0aW9uIGlzIGNvbXBsZXRlXG4gICAgICAgIGlmICh0aGlzLl9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUoKSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5vbignbW91c2VsZWF2ZScsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAvLyBPbmx5IGFwcGx5IGhvdmVyIGVmZmVjdHMgaWYgaW5pdGlhbCBhbmltYXRpb24gaXMgY29tcGxldGVcbiAgICAgICAgaWYgKCF0aGlzLl9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUoKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGJhckVsID0gdGhpcy5kMy5zZWxlY3QoZXZlbnQuY3VycmVudFRhcmdldCkuc2VsZWN0KCdwYXRoJyk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGhvdmVyIGVmZmVjdFxuICAgICAgICBiYXJFbC50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy5IT1ZFUl9UUkFOU0lUSU9OX0RVUkFUSU9OKS5zdHlsZSgnZmlsdGVyJywgbnVsbCk7XG5cbiAgICAgICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgICAgIH0pXG4gICAgICAub24oJ2NsaWNrJywgKGV2ZW50OiBNb3VzZUV2ZW50LCBkOiBBWEJhckNoYXJ0RGF0YSkgPT4ge1xuICAgICAgICAvLyBPbmx5IHRyaWdnZXIgY2xpY2sgZXZlbnRzIGlmIGluaXRpYWwgYW5pbWF0aW9uIGlzIGNvbXBsZXRlXG4gICAgICAgIGlmICh0aGlzLl9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUoKSkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlQmFyQ2xpY2soZXZlbnQsIGQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIC8vIEFkZCBhbmltYXRpb25cbiAgICBjb25zdCBhbmltYXRpb25EZWxheSA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkRlbGF5ID8/IHRoaXMuREVGQVVMVF9BTklNQVRJT05fREVMQVk7XG4gICAgYmFyc1xuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgLmRlbGF5KChkOiBBWEJhckNoYXJ0RGF0YSwgaTogbnVtYmVyKSA9PiBpICogYW5pbWF0aW9uRGVsYXkpXG4gICAgICAuYXR0clR3ZWVuKCdkJywgKGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IHggPSB0aGlzLnhTY2FsZShkLmlkKTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLnhTY2FsZS5iYW5kd2lkdGgoKTtcbiAgICAgICAgY29uc3QgZmluYWxIZWlnaHQgPSB0aGlzLmhlaWdodCAtIHRoaXMueVNjYWxlKGQudmFsdWUpO1xuXG4gICAgICAgIHJldHVybiAodDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudEhlaWdodCA9IGZpbmFsSGVpZ2h0ICogdDtcbiAgICAgICAgICBjb25zdCBjdXJyZW50WSA9IHRoaXMuaGVpZ2h0IC0gY3VycmVudEhlaWdodDtcbiAgICAgICAgICBjb25zdCBib3R0b21ZID0gdGhpcy5oZWlnaHQgLSAwLjU7IC8vIEFkZCBzbWFsbCBnYXAgdG8gcHJldmVudCBvdmVybGFwIHdpdGggeC1heGlzXG5cbiAgICAgICAgICBpZiAocmFkaXVzID4gMCAmJiBjdXJyZW50SGVpZ2h0ID4gMCkge1xuICAgICAgICAgICAgLy8gTGltaXQgcmFkaXVzIHRvIHByZXZlbnQgaXQgZnJvbSBleGNlZWRpbmcgaGFsZiB0aGUgYmFyIHdpZHRoXG4gICAgICAgICAgICBjb25zdCBlZmZlY3RpdmVSYWRpdXMgPSBNYXRoLm1pbihyYWRpdXMsIHdpZHRoIC8gMik7XG4gICAgICAgICAgICByZXR1cm4gYE0ke3h9LCR7Ym90dG9tWX0gTCR7eH0sJHtjdXJyZW50WSArIGVmZmVjdGl2ZVJhZGl1c30gUSR7eH0sJHtjdXJyZW50WX0gJHt4ICsgZWZmZWN0aXZlUmFkaXVzfSwke2N1cnJlbnRZfSBMJHt4ICsgd2lkdGggLSBlZmZlY3RpdmVSYWRpdXN9LCR7Y3VycmVudFl9IFEke3ggKyB3aWR0aH0sJHtjdXJyZW50WX0gJHt4ICsgd2lkdGh9LCR7Y3VycmVudFkgKyBlZmZlY3RpdmVSYWRpdXN9IEwke3ggKyB3aWR0aH0sJHtib3R0b21ZfSBaYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGBNJHt4fSwke2JvdHRvbVl9IEwke3h9LCR7Y3VycmVudFl9IEwke3ggKyB3aWR0aH0sJHtjdXJyZW50WX0gTCR7eCArIHdpZHRofSwke2JvdHRvbVl9IFpgO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAuZWFzZShhbmltYXRpb25FYXNpbmcpIC8vIFVzZSB0aGUgY29uZmlndXJlZCBlYXNpbmcgZnVuY3Rpb25cbiAgICAgIC5lbmQoKSAvLyBXYWl0IGZvciBhbGwgYW5pbWF0aW9ucyB0byBjb21wbGV0ZVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAvLyBNYXJrIGFuaW1hdGlvbiBhcyBjb21wbGV0ZSB0byBlbmFibGUgaG92ZXIgZWZmZWN0c1xuICAgICAgICB0aGlzLl9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUuc2V0KHRydWUpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBiYXJzIGZvciBjbHVzdGVyZWQgY2hhcnRzXG4gICAqL1xuICBwcml2YXRlIHJlbmRlckJhcnNDbHVzdGVyZWQoZ3JvdXBzOiBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdKTogdm9pZCB7XG4gICAgY29uc3Qgc2VyaWVzTGFiZWxzID0gdGhpcy5nZXRDbHVzdGVyU2VyaWVzTGFiZWxzKGdyb3Vwcyk7XG4gICAgY29uc3QgdmlzaWJsZVNlcmllcyA9IHNlcmllc0xhYmVscy5maWx0ZXIoKHMpID0+ICF0aGlzLmhpZGRlblNlcmllcy5oYXMocykpO1xuXG4gICAgdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlLnNldChmYWxzZSk7XG5cbiAgICBjb25zdCByYWRpdXMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5jb3JuZXJSYWRpdXM7XG4gICAgY29uc3QgYW5pbWF0aW9uRHVyYXRpb24gPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5hbmltYXRpb25EdXJhdGlvbjtcbiAgICBjb25zdCBhbmltYXRpb25FYXNpbmcgPSBnZXRFYXNpbmdGdW5jdGlvbih0aGlzLmQzLCB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5hbmltYXRpb25FYXNpbmcpO1xuXG4gICAgY29uc3QgYmFyc0NvbnRhaW5lciA9IHRoaXMuY2hhcnQuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWJhcnMtY29udGFpbmVyJyk7XG5cbiAgICBjb25zdCBncm91cFNlbCA9IGJhcnNDb250YWluZXJcbiAgICAgIC5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtZ3JvdXAnKVxuICAgICAgLmRhdGEoZ3JvdXBzKVxuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1ncm91cCcpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgKGc6IEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhKSA9PiBgdHJhbnNsYXRlKCR7dGhpcy54U2NhbGUoZy5pZCl9LDApYCk7XG5cbiAgICB0eXBlIENsdXN0ZXJlZEJhckRhdHVtID0geyBncm91cDogQVhCYXJDaGFydENsdXN0ZXJlZERhdGE7IHNlcmllc0xhYmVsOiBzdHJpbmc7IHNlcmllc0luZGV4OiBudW1iZXIgfTtcblxuICAgIGNvbnN0IGJhckdyb3VwcyA9IGdyb3VwU2VsXG4gICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhci1ncm91cCcpXG4gICAgICAuZGF0YSgoZzogQVhCYXJDaGFydENsdXN0ZXJlZERhdGEpID0+XG4gICAgICAgIHZpc2libGVTZXJpZXMubWFwKChsYWJlbCwgaWR4KTogQ2x1c3RlcmVkQmFyRGF0dW0gPT4gKHsgZ3JvdXA6IGcsIHNlcmllc0xhYmVsOiBsYWJlbCwgc2VyaWVzSW5kZXg6IGlkeCB9KSksXG4gICAgICApXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYmFyLWdyb3VwJyk7XG5cbiAgICBjb25zdCBiYXJzID0gYmFyR3JvdXBzXG4gICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYmFyJylcbiAgICAgIC5hdHRyKCdkYXRhLXNlcmllcycsIChkOiBDbHVzdGVyZWRCYXJEYXR1bSkgPT4gZC5zZXJpZXNMYWJlbClcbiAgICAgIC5hdHRyKCdkJywgKGQ6IENsdXN0ZXJlZEJhckRhdHVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHggPSB0aGlzLnhTdWJTY2FsZShkLnNlcmllc0xhYmVsKTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLnhTdWJTY2FsZS5iYW5kd2lkdGgoKTtcbiAgICAgICAgY29uc3QgeSA9IHRoaXMuaGVpZ2h0IC0gMC41O1xuICAgICAgICByZXR1cm4gYE0ke3h9LCR7eX0gTCR7eH0sJHt5fSBMJHt4ICsgd2lkdGh9LCR7eX0gTCR7eCArIHdpZHRofSwke3l9IFpgO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKCdmaWxsJywgKGQ6IENsdXN0ZXJlZEJhckRhdHVtKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBkLmdyb3VwLmNoYXJ0RGF0YVtkLnNlcmllc0luZGV4XTtcbiAgICAgICAgcmV0dXJuIGl0ZW0/LmNvbG9yIHx8IHRoaXMuZ2V0Q29sb3IoZC5zZXJpZXNJbmRleCk7XG4gICAgICB9KTtcblxuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93RGF0YUxhYmVscyAhPT0gZmFsc2UpIHtcbiAgICAgIGJhckdyb3Vwc1xuICAgICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1kYXRhLWxhYmVsJylcbiAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgIC5hdHRyKCd4JywgKGQ6IENsdXN0ZXJlZEJhckRhdHVtKSA9PiAodGhpcy54U3ViU2NhbGUoZC5zZXJpZXNMYWJlbCkgfHwgMCkgKyB0aGlzLnhTdWJTY2FsZS5iYW5kd2lkdGgoKSAvIDIpXG4gICAgICAgIC5hdHRyKCd5JywgdGhpcy5oZWlnaHQpXG4gICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJ2NsYW1wKDhweCwgMnZtaW4sIDEycHgpJylcbiAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc1MDAnKVxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWRhdGEtbGFiZWxzLWNvbG9yKSknKVxuICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgICAgICAudGV4dCgoZDogQ2x1c3RlcmVkQmFyRGF0dW0pID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGQuZ3JvdXAuY2hhcnREYXRhW2Quc2VyaWVzSW5kZXhdPy52YWx1ZTtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuICcnO1xuICAgICAgICAgIC8vIEZvcm1hdCBsYXJnZSBudW1iZXJzIGluIGRhdGEgbGFiZWxzXG4gICAgICAgICAgcmV0dXJuIHZhbHVlID49IDEwMDAgPyBmb3JtYXRMYXJnZU51bWJlcih2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGFuaW1hdGlvbkRlbGF5ID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYW5pbWF0aW9uRGVsYXkgPz8gdGhpcy5ERUZBVUxUX0FOSU1BVElPTl9ERUxBWTtcbiAgICAgIGJhckdyb3Vwc1xuICAgICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWRhdGEtbGFiZWwnKVxuICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgICAgLmRlbGF5KChfZDogdW5rbm93biwgaTogbnVtYmVyKSA9PiBpICogYW5pbWF0aW9uRGVsYXkgKyB0aGlzLkxBQkVMX0FOSU1BVElPTl9ERUxBWSlcbiAgICAgICAgLmF0dHIoJ3knLCAoZDogQ2x1c3RlcmVkQmFyRGF0dW0pID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVtID0gZC5ncm91cC5jaGFydERhdGFbZC5zZXJpZXNJbmRleF07XG4gICAgICAgICAgaWYgKCFpdGVtKSByZXR1cm4gdGhpcy5oZWlnaHQ7XG5cbiAgICAgICAgICBjb25zdCBiYXJUb3AgPSB0aGlzLnlTY2FsZShpdGVtLnZhbHVlKTtcblxuICAgICAgICAgIC8vIElmIGJhciBpcyBuZWFyIHRoZSB0b3AgKDEwMCUgb3IgY2xvc2UpLCBwb3NpdGlvbiBsYWJlbCBpbnNpZGUgdGhlIGJhclxuICAgICAgICAgIGlmIChiYXJUb3AgPCB0aGlzLk1JTl9UT1BfU1BBQ0VfRk9SX0xBQkVMKSB7XG4gICAgICAgICAgICByZXR1cm4gYmFyVG9wICsgdGhpcy5MQUJFTF9PRkZTRVQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gT3RoZXJ3aXNlLCBwb3NpdGlvbiBhYm92ZSB0aGUgYmFyXG4gICAgICAgICAgcmV0dXJuIGJhclRvcCAtIHRoaXMuTEFCRUxfT0ZGU0VUO1xuICAgICAgICB9KVxuICAgICAgICAuYXR0cignZGF0YS1pbnNpZGUtYmFyJywgKGQ6IENsdXN0ZXJlZEJhckRhdHVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbSA9IGQuZ3JvdXAuY2hhcnREYXRhW2Quc2VyaWVzSW5kZXhdO1xuICAgICAgICAgIGlmICghaXRlbSkgcmV0dXJuICdmYWxzZSc7XG5cbiAgICAgICAgICBjb25zdCBiYXJUb3AgPSB0aGlzLnlTY2FsZShpdGVtLnZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gYmFyVG9wIDwgdGhpcy5NSU5fVE9QX1NQQUNFX0ZPUl9MQUJFTCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgICAgIH0pXG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgIC5lYXNlKGFuaW1hdGlvbkVhc2luZyk7XG4gICAgfVxuXG4gICAgYmFyR3JvdXBzXG4gICAgICAub24oJ21vdXNlZW50ZXInLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IENsdXN0ZXJlZEJhckRhdHVtKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlKCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgYmFyRWwgPSB0aGlzLmQzLnNlbGVjdChldmVudC5jdXJyZW50VGFyZ2V0KS5zZWxlY3QoJ3BhdGgnKTtcbiAgICAgICAgYmFyRWxcbiAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgLmR1cmF0aW9uKHRoaXMuSE9WRVJfVFJBTlNJVElPTl9EVVJBVElPTilcbiAgICAgICAgICAuc3R5bGUoJ2ZpbHRlcicsICdicmlnaHRuZXNzKDAuNykgZHJvcC1zaGFkb3coMCAwIDJweCByZ2JhKDAsMCwwLDAuMSkpJyk7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBkLmdyb3VwLmNoYXJ0RGF0YVtkLnNlcmllc0luZGV4XTtcbiAgICAgICAgaWYgKGl0ZW0pIHRoaXMuaGFuZGxlQmFySG92ZXIoZXZlbnQsIGl0ZW0sIGQuZ3JvdXApO1xuICAgICAgfSlcbiAgICAgIC5vbignbW91c2Vtb3ZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUoKSkgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgICAgfSlcbiAgICAgIC5vbignbW91c2VsZWF2ZScsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGJhckVsID0gdGhpcy5kMy5zZWxlY3QoZXZlbnQuY3VycmVudFRhcmdldCkuc2VsZWN0KCdwYXRoJyk7XG4gICAgICAgIGJhckVsLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLkhPVkVSX1RSQU5TSVRJT05fRFVSQVRJT04pLnN0eWxlKCdmaWx0ZXInLCBudWxsKTtcbiAgICAgICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgICAgIH0pXG4gICAgICAub24oJ2NsaWNrJywgKGV2ZW50OiBNb3VzZUV2ZW50LCBkOiBDbHVzdGVyZWRCYXJEYXR1bSkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBkLmdyb3VwLmNoYXJ0RGF0YVtkLnNlcmllc0luZGV4XTtcbiAgICAgICAgaWYgKGl0ZW0pIHRoaXMuaGFuZGxlQmFyQ2xpY2soZXZlbnQsIGl0ZW0pO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBhbmltYXRpb25EZWxheSA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkRlbGF5ID8/IHRoaXMuREVGQVVMVF9BTklNQVRJT05fREVMQVk7XG4gICAgYmFyc1xuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgLmRlbGF5KChfZDogdW5rbm93biwgaTogbnVtYmVyKSA9PiBpICogYW5pbWF0aW9uRGVsYXkpXG4gICAgICAuYXR0clR3ZWVuKCdkJywgKGQ6IENsdXN0ZXJlZEJhckRhdHVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHggPSB0aGlzLnhTdWJTY2FsZShkLnNlcmllc0xhYmVsKTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLnhTdWJTY2FsZS5iYW5kd2lkdGgoKTtcbiAgICAgICAgY29uc3QgaXRlbSA9IGQuZ3JvdXAuY2hhcnREYXRhW2Quc2VyaWVzSW5kZXhdO1xuICAgICAgICBjb25zdCBmaW5hbEhlaWdodCA9IGl0ZW0gPyB0aGlzLmhlaWdodCAtIHRoaXMueVNjYWxlKGl0ZW0udmFsdWUpIDogMDtcblxuICAgICAgICByZXR1cm4gKHQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRIZWlnaHQgPSBmaW5hbEhlaWdodCAqIHQ7XG4gICAgICAgICAgY29uc3QgY3VycmVudFkgPSB0aGlzLmhlaWdodCAtIGN1cnJlbnRIZWlnaHQ7XG4gICAgICAgICAgY29uc3QgYm90dG9tWSA9IHRoaXMuaGVpZ2h0IC0gMC41OyAvLyBBZGQgc21hbGwgZ2FwIHRvIHByZXZlbnQgb3ZlcmxhcCB3aXRoIHgtYXhpc1xuXG4gICAgICAgICAgaWYgKHJhZGl1cyA+IDAgJiYgY3VycmVudEhlaWdodCA+IDApIHtcbiAgICAgICAgICAgIC8vIExpbWl0IHJhZGl1cyB0byBwcmV2ZW50IGl0IGZyb20gZXhjZWVkaW5nIGhhbGYgdGhlIGJhciB3aWR0aFxuICAgICAgICAgICAgY29uc3QgZWZmZWN0aXZlUmFkaXVzID0gTWF0aC5taW4ocmFkaXVzLCB3aWR0aCAvIDIpO1xuICAgICAgICAgICAgcmV0dXJuIGBNJHt4fSwke2JvdHRvbVl9IEwke3h9LCR7Y3VycmVudFkgKyBlZmZlY3RpdmVSYWRpdXN9IFEke3h9LCR7Y3VycmVudFl9ICR7eCArIGVmZmVjdGl2ZVJhZGl1c30sJHtjdXJyZW50WX0gTCR7eCArIHdpZHRoIC0gZWZmZWN0aXZlUmFkaXVzfSwke2N1cnJlbnRZfSBRJHt4ICsgd2lkdGh9LCR7Y3VycmVudFl9ICR7eCArIHdpZHRofSwke2N1cnJlbnRZICsgZWZmZWN0aXZlUmFkaXVzfSBMJHt4ICsgd2lkdGh9LCR7Ym90dG9tWX0gWmA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgTSR7eH0sJHtib3R0b21ZfSBMJHt4fSwke2N1cnJlbnRZfSBMJHt4ICsgd2lkdGh9LCR7Y3VycmVudFl9IEwke3ggKyB3aWR0aH0sJHtib3R0b21ZfSBaYDtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmVhc2UoYW5pbWF0aW9uRWFzaW5nKVxuICAgICAgLmVuZCgpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLl9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUuc2V0KHRydWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBhcHByb3ByaWF0ZSBEMyBlYXNpbmcgZnVuY3Rpb24gYmFzZWQgb24gdGhlIG9wdGlvbiBzdHJpbmdcbiAgICovXG4gIC8vIGdldEVhc2luZ0Z1bmN0aW9uIG1vdmVkIHRvIHNoYXJlZCBjaGFydCB1dGlsc1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGJhciBob3ZlciBldmVudCBhbmQgc2hvd3MgdG9vbHRpcFxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVCYXJIb3ZlcihldmVudDogTW91c2VFdmVudCwgZGF0dW06IEFYQmFyQ2hhcnREYXRhLCBncm91cD86IHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgZGF0YVZhbHVlID0gdGhpcy5kYXRhKCkgYXMgQVhCYXJDaGFydFZhbHVlO1xuICAgICAgY29uc3QgaXNDbHVzdGVyZWQgPSB0aGlzLmlzQ2x1c3RlcmVkRGF0YShkYXRhVmFsdWUpO1xuICAgICAgY29uc3QgZmxhdERhdGE6IEFYQmFyQ2hhcnREYXRhW10gPSBpc0NsdXN0ZXJlZFxuICAgICAgICA/IChkYXRhVmFsdWUgYXMgQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXSkuZmxhdE1hcCgoZykgPT4gZy5jaGFydERhdGEpXG4gICAgICAgIDogKGRhdGFWYWx1ZSBhcyBBWEJhckNoYXJ0RGF0YVtdKSB8fCBbXTtcbiAgICAgIGNvbnN0IGluZGV4ID0gZmxhdERhdGEuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBkYXR1bS5pZCAmJiBpdGVtLmxhYmVsID09PSBkYXR1bS5sYWJlbCk7XG4gICAgICBjb25zdCBjb2xvciA9IGRhdHVtLmNvbG9yIHx8IHRoaXMuZ2V0Q29sb3IoaW5kZXggIT09IC0xID8gaW5kZXggOiAwKTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIHBlcmNlbnRhZ2Ugb2YgdG90YWxcbiAgICAgIGNvbnN0IHRvdGFsID0gaXNDbHVzdGVyZWRcbiAgICAgICAgPyAoZGF0YVZhbHVlIGFzIEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10pLnJlZHVjZShcbiAgICAgICAgICAgIChzdW0sIGcpID0+IHN1bSArIGcuY2hhcnREYXRhLnJlZHVjZSgocywgaXQpID0+IHMgKyBpdC52YWx1ZSwgMCksXG4gICAgICAgICAgICAwLFxuICAgICAgICAgIClcbiAgICAgICAgOiAoZmxhdERhdGEgYXMgQVhCYXJDaGFydERhdGFbXSkucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArIGl0ZW0udmFsdWUsIDApO1xuICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRvdGFsID4gMCA/ICgoZGF0dW0udmFsdWUgLyB0b3RhbCkgKiAxMDApLnRvRml4ZWQoMSkgOiAnMCc7XG5cbiAgICAgIHRoaXMuX3Rvb2x0aXBEYXRhLnNldCh7XG4gICAgICAgIHRpdGxlOiBncm91cCA/IGAke2RhdHVtLnRvb2x0aXBMYWJlbCB8fCBkYXR1bS5sYWJlbH0g4oCUICR7Z3JvdXAubGFiZWx9YCA6IGRhdHVtLnRvb2x0aXBMYWJlbCB8fCBkYXR1bS5sYWJlbCxcbiAgICAgICAgdmFsdWU6IGZvcm1hdExhcmdlTnVtYmVyKGRhdHVtLnZhbHVlKSxcbiAgICAgICAgcGVyY2VudGFnZTogYCR7cGVyY2VudGFnZX0lYCxcbiAgICAgICAgY29sb3I6IGNvbG9yLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzID0geyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH07XG4gICAgaWYgKHRoaXMuX3Rvb2x0aXBSYWZJZCAhPSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5fdG9vbHRpcFJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRoaXMuX3Rvb2x0aXBSYWZJZCA9IG51bGw7XG4gICAgICBjb25zdCBjb29yZHMgPSB0aGlzLl9wZW5kaW5nVG9vbHRpcENvb3JkcztcbiAgICAgIGlmICghY29vcmRzKSByZXR1cm47XG4gICAgICBjb25zdCBjb250YWluZXJFbCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFjb250YWluZXJFbCkgcmV0dXJuO1xuICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgdG9vbHRpcEVsID0gY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLmNoYXJ0LXRvb2x0aXAnKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICBjb25zdCB0b29sdGlwUmVjdCA9IHRvb2x0aXBFbCA/IHRvb2x0aXBFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG51bGw7XG4gICAgICBjb25zdCBwb3MgPSB0aGlzLmNvbXB1dGVFbmhhbmNlZFRvb2x0aXBQb3NpdGlvbihjb250YWluZXJSZWN0LCB0b29sdGlwUmVjdCwgY29vcmRzLngsIGNvb3Jkcy55KTtcbiAgICAgIHRoaXMuX3Rvb2x0aXBQb3NpdGlvbi5zZXQocG9zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmhhbmNlZCB0b29sdGlwIHBvc2l0aW9uaW5nIHRoYXQgY29uc2lkZXJzIGNoYXJ0IGJvdW5kYXJpZXMgYW5kIHByZXZlbnRzIG92ZXJmbG93XG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVFbmhhbmNlZFRvb2x0aXBQb3NpdGlvbihcbiAgICBjb250YWluZXJSZWN0OiBET01SZWN0LFxuICAgIHRvb2x0aXBSZWN0OiBET01SZWN0IHwgbnVsbCxcbiAgICBjbGllbnRYOiBudW1iZXIsXG4gICAgY2xpZW50WTogbnVtYmVyLFxuICApOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGN1cnNvclggPSBjbGllbnRYIC0gY29udGFpbmVyUmVjdC5sZWZ0O1xuICAgIGNvbnN0IGN1cnNvclkgPSBjbGllbnRZIC0gY29udGFpbmVyUmVjdC50b3A7XG5cbiAgICBpZiAoIXRvb2x0aXBSZWN0KSB7XG4gICAgICAvLyBEZWZhdWx0IHBvc2l0aW9uaW5nIHdoZW4gdG9vbHRpcCBkaW1lbnNpb25zIGFyZSB1bmtub3duXG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBNYXRoLm1pbihjdXJzb3JYICsgdGhpcy5UT09MVElQX0dBUCwgY29udGFpbmVyUmVjdC53aWR0aCAtIHRoaXMuVE9PTFRJUF9HQVApLFxuICAgICAgICB5OiBNYXRoLm1heCh0aGlzLlRPT0xUSVBfR0FQLCBNYXRoLm1pbihjdXJzb3JZLCBjb250YWluZXJSZWN0LmhlaWdodCAtIHRoaXMuVE9PTFRJUF9HQVApKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGF2YWlsYWJsZSBzcGFjZSBpbiBlYWNoIGRpcmVjdGlvblxuICAgIGNvbnN0IHNwYWNlUmlnaHQgPSBjb250YWluZXJSZWN0LndpZHRoIC0gY3Vyc29yWDtcbiAgICBjb25zdCBzcGFjZUxlZnQgPSBjdXJzb3JYO1xuICAgIGNvbnN0IHNwYWNlQmVsb3cgPSBjb250YWluZXJSZWN0LmhlaWdodCAtIGN1cnNvclk7XG4gICAgY29uc3Qgc3BhY2VBYm92ZSA9IGN1cnNvclk7XG5cbiAgICAvLyBEZXRlcm1pbmUgYmVzdCBob3Jpem9udGFsIHBvc2l0aW9uXG4gICAgbGV0IHg6IG51bWJlcjtcbiAgICBpZiAoc3BhY2VSaWdodCA+PSB0b29sdGlwUmVjdC53aWR0aCArIHRoaXMuVE9PTFRJUF9HQVApIHtcbiAgICAgIC8vIFBvc2l0aW9uIHRvIHRoZSByaWdodCBvZiBjdXJzb3JcbiAgICAgIHggPSBjdXJzb3JYICsgdGhpcy5UT09MVElQX0dBUDtcbiAgICB9IGVsc2UgaWYgKHNwYWNlTGVmdCA+PSB0b29sdGlwUmVjdC53aWR0aCArIHRoaXMuVE9PTFRJUF9HQVApIHtcbiAgICAgIC8vIFBvc2l0aW9uIHRvIHRoZSBsZWZ0IG9mIGN1cnNvclxuICAgICAgeCA9IGN1cnNvclggLSB0b29sdGlwUmVjdC53aWR0aCAtIHRoaXMuVE9PTFRJUF9HQVA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENlbnRlciBob3Jpem9udGFsbHkgaWYgbmVpdGhlciBzaWRlIGhhcyBlbm91Z2ggc3BhY2VcbiAgICAgIHggPSBNYXRoLm1heChcbiAgICAgICAgdGhpcy5UT09MVElQX0dBUCxcbiAgICAgICAgTWF0aC5taW4oXG4gICAgICAgICAgKGNvbnRhaW5lclJlY3Qud2lkdGggLSB0b29sdGlwUmVjdC53aWR0aCkgLyAyLFxuICAgICAgICAgIGNvbnRhaW5lclJlY3Qud2lkdGggLSB0b29sdGlwUmVjdC53aWR0aCAtIHRoaXMuVE9PTFRJUF9HQVAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBiZXN0IHZlcnRpY2FsIHBvc2l0aW9uXG4gICAgbGV0IHk6IG51bWJlcjtcbiAgICBpZiAoc3BhY2VCZWxvdyA+PSB0b29sdGlwUmVjdC5oZWlnaHQgKyB0aGlzLlRPT0xUSVBfR0FQKSB7XG4gICAgICAvLyBQb3NpdGlvbiBiZWxvdyBjdXJzb3JcbiAgICAgIHkgPSBjdXJzb3JZICsgdGhpcy5UT09MVElQX0dBUDtcbiAgICB9IGVsc2UgaWYgKHNwYWNlQWJvdmUgPj0gdG9vbHRpcFJlY3QuaGVpZ2h0ICsgdGhpcy5UT09MVElQX0dBUCkge1xuICAgICAgLy8gUG9zaXRpb24gYWJvdmUgY3Vyc29yXG4gICAgICB5ID0gY3Vyc29yWSAtIHRvb2x0aXBSZWN0LmhlaWdodCAtIHRoaXMuVE9PTFRJUF9HQVA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENlbnRlciB2ZXJ0aWNhbGx5IGlmIG5laXRoZXIgZGlyZWN0aW9uIGhhcyBlbm91Z2ggc3BhY2VcbiAgICAgIHkgPSBNYXRoLm1heChcbiAgICAgICAgdGhpcy5UT09MVElQX0dBUCxcbiAgICAgICAgTWF0aC5taW4oXG4gICAgICAgICAgKGNvbnRhaW5lclJlY3QuaGVpZ2h0IC0gdG9vbHRpcFJlY3QuaGVpZ2h0KSAvIDIsXG4gICAgICAgICAgY29udGFpbmVyUmVjdC5oZWlnaHQgLSB0b29sdGlwUmVjdC5oZWlnaHQgLSB0aGlzLlRPT0xUSVBfR0FQLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdG9vbHRpcCBzdGF5cyB3aXRoaW4gY29udGFpbmVyIGJvdW5kc1xuICAgIHggPSBNYXRoLm1heCh0aGlzLlRPT0xUSVBfR0FQLCBNYXRoLm1pbih4LCBjb250YWluZXJSZWN0LndpZHRoIC0gdG9vbHRpcFJlY3Qud2lkdGggLSB0aGlzLlRPT0xUSVBfR0FQKSk7XG4gICAgeSA9IE1hdGgubWF4KHRoaXMuVE9PTFRJUF9HQVAsIE1hdGgubWluKHksIGNvbnRhaW5lclJlY3QuaGVpZ2h0IC0gdG9vbHRpcFJlY3QuaGVpZ2h0IC0gdGhpcy5UT09MVElQX0dBUCkpO1xuXG4gICAgcmV0dXJuIHsgeCwgeSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYmFyIGNsaWNrIGV2ZW50XG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUJhckNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBkYXR1bTogQVhCYXJDaGFydERhdGEpOiB2b2lkIHtcbiAgICB0aGlzLmJhckNsaWNrLmVtaXQoeyBpdGVtOiBkYXR1bSwgZXZlbnQ6IHsgbmF0aXZlRXZlbnQ6IGV2ZW50LCBzZW5kZXI6IHRoaXMgfSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG1lc3NhZ2Ugd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBzaG93Tm9EYXRhTWVzc2FnZShjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJDaGFydEFyZWEoY29udGFpbmVyRWxlbWVudCk7XG4gICAgdGhpcy5zaG93TWVzc2FnZShcbiAgICAgIGNvbnRhaW5lckVsZW1lbnQsXG4gICAgICB0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCkubm9EYXRhSWNvbixcbiAgICAgIHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKS5ub0RhdGEsXG4gICAgICB0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCkubm9EYXRhSGVscCxcbiAgICAgICdheC1iYXItY2hhcnQtbm8tZGF0YS1tZXNzYWdlJyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgbWVzc2FnZSB3aGVuIGFsbCBiYXJzIGFyZSBoaWRkZW5cbiAgICovXG4gIHByaXZhdGUgc2hvd0FsbEJhcnNIaWRkZW5NZXNzYWdlKGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckNoYXJ0QXJlYShjb250YWluZXJFbGVtZW50KTtcbiAgICB0aGlzLnNob3dNZXNzYWdlKFxuICAgICAgY29udGFpbmVyRWxlbWVudCxcbiAgICAgIHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKS5hbGxIaWRkZW5JY29uLFxuICAgICAgdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLmFsbEhpZGRlbixcbiAgICAgIHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKS5hbGxIaWRkZW5IZWxwLFxuICAgICAgJ2F4LWJhci1jaGFydC1uby1kYXRhLW1lc3NhZ2UnLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY29sb3IgZm9yIGEgYmFyIGJhc2VkIG9uIGl0cyBpbmRleFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldENvbG9yKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXRDaGFydENvbG9yKGluZGV4LCB0aGlzLmNoYXJ0Q29sb3JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBiYXIgaXMgaGlkZGVuXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNCYXJIaWRkZW4oaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhpZGRlbkJhcnMuaGFzKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZSBpbnRlcmZhY2VcbiAgICogUmV0dXJucyBsZWdlbmQgaXRlbXMgYmFzZWQgb24gdGhlIGNoYXJ0IGRhdGFcbiAgICovXG4gIGdldExlZ2VuZEl0ZW1zKCk6IEFYQ2hhcnRMZWdlbmRJdGVtW10ge1xuICAgIGNvbnN0IHZhbHVlID0gKHRoaXMuZGF0YSgpIHx8IFtdKSBhcyBBWEJhckNoYXJ0VmFsdWU7XG4gICAgaWYgKHRoaXMuaXNDbHVzdGVyZWREYXRhKHZhbHVlKSkge1xuICAgICAgY29uc3QgZ3JvdXBzID0gdmFsdWUgYXMgQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXTtcbiAgICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IGdyb3Vwcy5sZW5ndGggPiAwID8gdGhpcy5nZXRDbHVzdGVyU2VyaWVzTGFiZWxzKGdyb3VwcykgOiBbXTtcbiAgICAgIGNvbnN0IHRvdGFsID0gZ3JvdXBzLnJlZHVjZShcbiAgICAgICAgKHN1bSwgZykgPT4gc3VtICsgZy5jaGFydERhdGEucmVkdWNlKChzLCBpdCkgPT4gcyArICh0eXBlb2YgaXQudmFsdWUgPT09ICdudW1iZXInID8gaXQudmFsdWUgOiAwKSwgMCksXG4gICAgICAgIDAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNlcmllc0xhYmVscy5tYXAoKGxhYmVsLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBzZXJpZXNUb3RhbCA9IGdyb3Vwcy5yZWR1Y2UoKHMsIGcpID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVtID0gZy5jaGFydERhdGFbaW5kZXhdO1xuICAgICAgICAgIGNvbnN0IHYgPSBpdGVtICYmIHR5cGVvZiBpdGVtLnZhbHVlID09PSAnbnVtYmVyJyA/IGl0ZW0udmFsdWUgOiAwO1xuICAgICAgICAgIHJldHVybiBzICsgdjtcbiAgICAgICAgfSwgMCk7XG4gICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSB0b3RhbCA+IDAgPyAoc2VyaWVzVG90YWwgLyB0b3RhbCkgKiAxMDAgOiAwO1xuICAgICAgICBjb25zdCBmaXJzdEl0ZW0gPSBncm91cHNbMF0/LmNoYXJ0RGF0YVtpbmRleF07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaWQ6IGxhYmVsLFxuICAgICAgICAgIG5hbWU6IGxhYmVsIHx8IGBTZXJpZXMgJHtpbmRleCArIDF9YCxcbiAgICAgICAgICB2YWx1ZTogc2VyaWVzVG90YWwsXG4gICAgICAgICAgcGVyY2VudGFnZSxcbiAgICAgICAgICBjb2xvcjogZmlyc3RJdGVtPy5jb2xvciB8fCB0aGlzLmdldENvbG9yKGluZGV4KSxcbiAgICAgICAgICBoaWRkZW46IHRoaXMuaGlkZGVuU2VyaWVzLmhhcyhsYWJlbCksXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBmbGF0ID0gdmFsdWUgYXMgQVhCYXJDaGFydERhdGFbXTtcbiAgICBjb25zdCB0b3RhbCA9IGZsYXQucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArICh0eXBlb2YgaXRlbS52YWx1ZSA9PT0gJ251bWJlcicgPyBpdGVtLnZhbHVlIDogMCksIDApO1xuICAgIHJldHVybiBmbGF0Lm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IHR5cGVvZiBpdGVtLnZhbHVlID09PSAnbnVtYmVyJyA/IGl0ZW0udmFsdWUgOiAwO1xuICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRvdGFsID4gMCA/ICh2YWwgLyB0b3RhbCkgKiAxMDAgOiAwO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGl0ZW0uaWQsXG4gICAgICAgIG5hbWU6IGl0ZW0ubGFiZWwgfHwgYEl0ZW0gJHtpbmRleCArIDF9YCxcbiAgICAgICAgdmFsdWU6IGl0ZW0udmFsdWUsXG4gICAgICAgIHBlcmNlbnRhZ2UsXG4gICAgICAgIGNvbG9yOiBpdGVtLmNvbG9yIHx8IHRoaXMuZ2V0Q29sb3IoaW5kZXgpLFxuICAgICAgICBoaWRkZW46IHRoaXMuaXNCYXJIaWRkZW4oaXRlbS5pZCksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIG9mIEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlIGludGVyZmFjZVxuICAgKiBIaWdobGlnaHRzIGEgc3BlY2lmaWMgYmFyIGJ5IElEXG4gICAqL1xuICBoaWdobGlnaHRTZWdtZW50KGlkOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN2ZykgcmV0dXJuO1xuXG4gICAgY29uc3QgdmFsdWUgPSAodGhpcy5kYXRhKCkgfHwgW10pIGFzIEFYQmFyQ2hhcnRWYWx1ZTtcbiAgICBjb25zdCBpc0NsdXN0ZXJlZCA9IHRoaXMuaXNDbHVzdGVyZWREYXRhKHZhbHVlKTtcblxuICAgIGNvbnN0IHJlc2V0QWxsID0gKCkgPT4ge1xuICAgICAgdGhpcy5zdmdcbiAgICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1iYXInKVxuICAgICAgICAuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWhpZ2hsaWdodGVkJywgZmFsc2UpXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtZGltbWVkJywgZmFsc2UpXG4gICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMSlcbiAgICAgICAgLmF0dHIoJ2ZpbHRlcicsIG51bGwpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCBudWxsKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgbnVsbClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS1vcGFjaXR5JywgbnVsbCk7XG4gICAgfTtcblxuICAgIGlmIChpZCA9PT0gbnVsbCkge1xuICAgICAgcmVzZXRBbGwoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ2x1c3RlcmVkKSB7XG4gICAgICBpZiAodGhpcy5pc0JhckhpZGRlbihpZCBhcyBzdHJpbmcpKSB7XG4gICAgICAgIHJlc2V0QWxsKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldEJhciA9IHRoaXMuc3ZnXG4gICAgICAgIC5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtYmFyJylcbiAgICAgICAgLmZpbHRlcigoZDogdW5rbm93bikgPT4gKGQgYXMgQVhCYXJDaGFydERhdGEgfCB1bmRlZmluZWQpPy5pZCA9PT0gaWQpO1xuICAgICAgaWYgKHRhcmdldEJhci5lbXB0eSgpKSByZXR1cm47XG4gICAgICBjb25zdCBpc0N1cnJlbnRseUhpZ2hsaWdodGVkID0gdGFyZ2V0QmFyLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1oaWdobGlnaHRlZCcpO1xuICAgICAgaWYgKGlzQ3VycmVudGx5SGlnaGxpZ2h0ZWQpIHtcbiAgICAgICAgcmVzZXRBbGwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc2V0QWxsKCk7XG4gICAgICAgIHRhcmdldEJhclxuICAgICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtaGlnaGxpZ2h0ZWQnLCB0cnVlKVxuICAgICAgICAgIC5hdHRyKCdmaWx0ZXInLCAnZHJvcC1zaGFkb3coMCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMykpJylcbiAgICAgICAgICAuYXR0cignc3Ryb2tlJywgJyMwMDAnKVxuICAgICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAnMXB4JylcbiAgICAgICAgICAuYXR0cignc3Ryb2tlLW9wYWNpdHknLCAnMC4zJylcbiAgICAgICAgICAuc3R5bGUoJ3RyYW5zaXRpb24nLCAnYWxsIDAuMnMgZWFzZS1pbi1vdXQnKTtcbiAgICAgICAgdGhpcy5zdmdcbiAgICAgICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhcicpXG4gICAgICAgICAgLmZpbHRlcigoZDogdW5rbm93bikgPT4gKGQgYXMgQVhCYXJDaGFydERhdGEgfCB1bmRlZmluZWQpPy5pZCAhPT0gaWQpXG4gICAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1kaW1tZWQnLCB0cnVlKVxuICAgICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMC41KVxuICAgICAgICAgIC5zdHlsZSgndHJhbnNpdGlvbicsICdvcGFjaXR5IDAuMnMgZWFzZS1pbi1vdXQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRCYXJzID0gdGhpcy5zdmdcbiAgICAgIC5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtYmFyJylcbiAgICAgIC5maWx0ZXIoKF9kOiB1bmtub3duLCBpOiBudW1iZXIsIG5vZGVzOiBTVkdQYXRoRWxlbWVudFtdKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXNlcmllcycpID09PSBpZDtcbiAgICAgIH0pO1xuICAgIGlmICh0YXJnZXRCYXJzLmVtcHR5KCkpIHJldHVybjtcbiAgICBjb25zdCBpc0hpZ2hsaWdodGVkID0gdGFyZ2V0QmFycy5jbGFzc2VkKCdheC1iYXItY2hhcnQtaGlnaGxpZ2h0ZWQnKTtcbiAgICBpZiAoaXNIaWdobGlnaHRlZCkge1xuICAgICAgcmVzZXRBbGwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzZXRBbGwoKTtcbiAgICAgIHRhcmdldEJhcnNcbiAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1oaWdobGlnaHRlZCcsIHRydWUpXG4gICAgICAgIC5hdHRyKCdmaWx0ZXInLCAnZHJvcC1zaGFkb3coMCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMykpJylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsICcjMDAwJylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsICcxcHgnKVxuICAgICAgICAuYXR0cignc3Ryb2tlLW9wYWNpdHknLCAnMC4zJylcbiAgICAgICAgLnN0eWxlKCd0cmFuc2l0aW9uJywgJ2FsbCAwLjJzIGVhc2UtaW4tb3V0Jyk7XG4gICAgICB0aGlzLnN2Z1xuICAgICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhcicpXG4gICAgICAgIC5maWx0ZXIoKF9kOiB1bmtub3duLCBpOiBudW1iZXIsIG5vZGVzOiBTVkdQYXRoRWxlbWVudFtdKSA9PiBub2Rlc1tpXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2VyaWVzJykgIT09IGlkKVxuICAgICAgICAuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWRpbW1lZCcsIHRydWUpXG4gICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMC41KVxuICAgICAgICAuc3R5bGUoJ3RyYW5zaXRpb24nLCAnb3BhY2l0eSAwLjJzIGVhc2UtaW4tb3V0Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIG9mIEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlIGludGVyZmFjZVxuICAgKiBUb2dnbGVzIHZpc2liaWxpdHkgb2YgYSBiYXIgYnkgSURcbiAgICogQHJldHVybnMgTmV3IHZpc2liaWxpdHkgc3RhdGUgKHRydWUgPSB2aXNpYmxlLCBmYWxzZSA9IGhpZGRlbilcbiAgICovXG4gIHRvZ2dsZVNlZ21lbnQoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZhbHVlID0gKHRoaXMuZGF0YSgpIHx8IFtdKSBhcyBBWEJhckNoYXJ0VmFsdWU7XG4gICAgY29uc3QgaXNDbHVzdGVyZWQgPSB0aGlzLmlzQ2x1c3RlcmVkRGF0YSh2YWx1ZSk7XG5cbiAgICBpZiAoIWlzQ2x1c3RlcmVkKSB7XG4gICAgICBjb25zdCB3YXNBbGxIaWRkZW4gPVxuICAgICAgICAodmFsdWUgYXMgQVhCYXJDaGFydERhdGFbXSkubGVuZ3RoID4gMCAmJiAodmFsdWUgYXMgQVhCYXJDaGFydERhdGFbXSkuZXZlcnkoKGQpID0+IHRoaXMuaXNCYXJIaWRkZW4oZC5pZCkpO1xuICAgICAgaWYgKHRoaXMuaGlkZGVuQmFycy5oYXMoaWQpKSB7XG4gICAgICAgIHRoaXMuaGlkZGVuQmFycy5kZWxldGUoaWQpO1xuICAgICAgICBpZiAod2FzQWxsSGlkZGVuKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmQzXG4gICAgICAgICAgICAgID8uc2VsZWN0KHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgICAgIC5zZWxlY3RBbGwoJ3N2ZywgLmF4LWNoYXJ0LW1lc3NhZ2UtY29udGFpbmVyJylcbiAgICAgICAgICAgICAgLnJlbW92ZSgpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGlkZGVuQmFycy5hZGQoaWQpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gIXRoaXMuaGlkZGVuQmFycy5oYXMoaWQpO1xuICAgIH1cblxuICAgIC8vIENsdXN0ZXJlZCBtb2RlOiB0b2dnbGUgc2VyaWVzIGJ5IGxhYmVsXG4gICAgY29uc3QgZ3JvdXBzID0gdmFsdWUgYXMgQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXTtcbiAgICBjb25zdCBzZXJpZXNMYWJlbHMgPSBncm91cHMubGVuZ3RoID4gMCA/IHRoaXMuZ2V0Q2x1c3RlclNlcmllc0xhYmVscyhncm91cHMpIDogW107XG4gICAgY29uc3Qgc2VyaWVzQ291bnQgPSBzZXJpZXNMYWJlbHMubGVuZ3RoO1xuICAgIGNvbnN0IHdhc0FsbEhpZGRlbiA9IHNlcmllc0NvdW50ID4gMCAmJiB0aGlzLmhpZGRlblNlcmllcy5zaXplID49IHNlcmllc0NvdW50O1xuXG4gICAgaWYgKHRoaXMuaGlkZGVuU2VyaWVzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMuaGlkZGVuU2VyaWVzLmRlbGV0ZShpZCk7XG4gICAgICBpZiAod2FzQWxsSGlkZGVuKSB7XG4gICAgICAgIGlmICh0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMuZDM/LnNlbGVjdCh0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50KS5zZWxlY3RBbGwoJ3N2ZywgLmF4LWNoYXJ0LW1lc3NhZ2UtY29udGFpbmVyJykucmVtb3ZlKCk7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oaWRkZW5TZXJpZXMuYWRkKGlkKTtcbiAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gIXRoaXMuaGlkZGVuU2VyaWVzLmhhcyhpZCk7XG4gIH1cblxuICAvLyA9PT09PSBIZWxwZXIgdXRpbGl0aWVzIGZvciBtb2R1bGFyaXR5IGFuZCBtYWludGFpbmFiaWxpdHkgPT09PT1cblxuICBwcml2YXRlIGdldENvbnRhaW5lckVsZW1lbnQoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJDaGFydEFyZWEoY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLmQzLnNlbGVjdChjb250YWluZXJFbGVtZW50KS5zZWxlY3RBbGwoJ3N2ZywgLmF4LWNoYXJ0LW1lc3NhZ2UtY29udGFpbmVyJykucmVtb3ZlKCk7XG4gIH1cblxuICAvKipcbiAgICogVHJ1bmNhdGVzIGxvbmcgbGFiZWxzIHdpdGggZWxsaXBzaXNcbiAgICovXG4gIHByaXZhdGUgdHJ1bmNhdGVMYWJlbChsYWJlbDogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlciA9IHRoaXMuTUFYX0xBQkVMX0xFTkdUSCk6IHN0cmluZyB7XG4gICAgaWYgKGxhYmVsLmxlbmd0aCA8PSBtYXhMZW5ndGgpIHJldHVybiBsYWJlbDtcbiAgICByZXR1cm4gbGFiZWwuc3Vic3RyaW5nKDAsIG1heExlbmd0aCAtIDEpICsgJ+KApic7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhZGFwdGl2ZSBmb250IHNpemUgZm9yIFgtYXhpcyBiYXNlZCBvbiB3aWR0aCBhbmQgaXRlbSBjb3VudFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRYQXhpc1RpY2tGb250U2l6ZUJhc2VkT25XaWR0aCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGl0ZW1Db3VudCA9IHRoaXMueFNjYWxlLmRvbWFpbigpLmxlbmd0aDtcbiAgICBjb25zdCBiYXNlU2l6ZSA9IE1hdGgucm91bmQodGhpcy53aWR0aCAvIDUwKTtcblxuICAgIC8vIFJlZHVjZSBmb250IHNpemUgZm9yIG1hbnkgaXRlbXNcbiAgICBsZXQgYWRqdXN0ZWRTaXplID0gYmFzZVNpemU7XG4gICAgaWYgKGl0ZW1Db3VudCA+IHRoaXMuVkVSWV9NQU5ZX0lURU1TX1RIUkVTSE9MRCkge1xuICAgICAgYWRqdXN0ZWRTaXplID0gTWF0aC5yb3VuZChiYXNlU2l6ZSAqIDAuNyk7XG4gICAgfSBlbHNlIGlmIChpdGVtQ291bnQgPiB0aGlzLk1BTllfSVRFTVNfVEhSRVNIT0xEKSB7XG4gICAgICBhZGp1c3RlZFNpemUgPSBNYXRoLnJvdW5kKGJhc2VTaXplICogMC44NSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuTUlOX0ZPTlRfU0laRV9YX0FYSVMsIE1hdGgubWluKHRoaXMuTUFYX0ZPTlRfU0laRV9YX0FYSVMsIGFkanVzdGVkU2l6ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWRhcHRpdmUgZm9udCBzaXplIGZvciBZLWF4aXMgYmFzZWQgb24gaGVpZ2h0XG4gICAqL1xuICBwcml2YXRlIGdldFlBeGlzVGlja0ZvbnRTaXplQmFzZWRPbkhlaWdodCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGJhc2VTaXplID0gTWF0aC5yb3VuZCh0aGlzLmhlaWdodCAvIDMwKTtcbiAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5NSU5fRk9OVF9TSVpFX1lfQVhJUywgTWF0aC5taW4odGhpcy5NQVhfRk9OVF9TSVpFX1lfQVhJUywgYmFzZVNpemUpKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRYQXhpc0NvbW1vbihcbiAgICBheGVzR3JvdXA6IFJldHVyblR5cGU8dHlwZW9mIHRoaXMuZDMuc2VsZWN0PFNWR0dFbGVtZW50LCB1bmtub3duPj4sXG4gICAgaWRUb0xhYmVsOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuICAgIG9wdGlvbnM6IEFYQmFyQ2hhcnRPcHRpb24sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW1Db3VudCA9IHRoaXMueFNjYWxlLmRvbWFpbigpLmxlbmd0aDtcblxuICAgIC8vIFNtYXJ0IHRpY2sgcmVkdWN0aW9uIGZvciBtYW55IGl0ZW1zXG4gICAgbGV0IHRpY2tWYWx1ZXMgPSB0aGlzLnhTY2FsZS5kb21haW4oKTtcbiAgICBpZiAoaXRlbUNvdW50ID4gdGhpcy5WRVJZX01BTllfSVRFTVNfVEhSRVNIT0xEKSB7XG4gICAgICAvLyBTaG93IGV2ZXJ5IDV0aCB0aWNrXG4gICAgICB0aWNrVmFsdWVzID0gdGlja1ZhbHVlcy5maWx0ZXIoKF9kLCBpKSA9PiBpICUgNSA9PT0gMCk7XG4gICAgfSBlbHNlIGlmIChpdGVtQ291bnQgPiB0aGlzLk1BTllfSVRFTVNfVEhSRVNIT0xEKSB7XG4gICAgICAvLyBTaG93IGV2ZXJ5IDJuZCB0aWNrXG4gICAgICB0aWNrVmFsdWVzID0gdGlja1ZhbHVlcy5maWx0ZXIoKF9kLCBpKSA9PiBpICUgMiA9PT0gMCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXhpcyA9IHRoaXMuZDNcbiAgICAgIC5heGlzQm90dG9tKHRoaXMueFNjYWxlKVxuICAgICAgLnRpY2tWYWx1ZXModGlja1ZhbHVlcylcbiAgICAgIC50aWNrRm9ybWF0KChpZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gaWRUb0xhYmVsLmdldChpZCkgPz8gU3RyaW5nKGlkKTtcbiAgICAgICAgLy8gVHJ1bmNhdGUgbG9uZyBsYWJlbHMgaW50ZWxsaWdlbnRseVxuICAgICAgICBjb25zdCBtYXhMZW5ndGggPSBpdGVtQ291bnQgPiB0aGlzLk1BTllfSVRFTVNfVEhSRVNIT0xEID8gMTAgOiB0aGlzLk1BWF9MQUJFTF9MRU5HVEg7XG4gICAgICAgIHJldHVybiB0aGlzLnRydW5jYXRlTGFiZWwobGFiZWwsIG1heExlbmd0aCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMueEF4aXMgPSBheGVzR3JvdXBcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1heGlzLXgnKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwke3RoaXMuaGVpZ2h0fSlgKVxuICAgICAgLmNhbGwoYXhpcyk7XG5cbiAgICBjb25zdCBkeW5hbWljRm9udFNpemUgPSB0aGlzLmdldFhBeGlzVGlja0ZvbnRTaXplQmFzZWRPbldpZHRoKCk7XG4gICAgY29uc3QgeEF4aXNUaWNrcyA9IHRoaXMueEF4aXNcbiAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHtkeW5hbWljRm9udFNpemV9cHhgKVxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc0MDAnKVxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYmEodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtbGFiZWxzLWNvbG9yKSwgMC43KScpXG4gICAgICAuYXR0cignZGlyZWN0aW9uJywgJ2x0cicpO1xuXG4gICAgY29uc3QgaXNSb3RhdGVkID0gdGhpcy5zaG91bGRSb3RhdGVYQXhpc0xhYmVscyhpZFRvTGFiZWwsIGR5bmFtaWNGb250U2l6ZSk7XG4gICAgaWYgKGlzUm90YXRlZCkge1xuICAgICAgeEF4aXNUaWNrcy5hdHRyKCd0cmFuc2Zvcm0nLCAncm90YXRlKC00NSknKS5zdHlsZSgndGV4dC1hbmNob3InLCAnZW5kJykuYXR0cignZHgnLCAnLTAuOGVtJykuYXR0cignZHknLCAnMC4xNWVtJyk7XG4gICAgfVxuXG4gICAgdGhpcy54QXhpcy5zZWxlY3RBbGwoJ2xpbmUsIHBhdGgnKS5zdHlsZSgnc3Ryb2tlJywgJ3JnYih2YXIoLS1heC1jb21wLWJhci1jaGFydC1ncmlkLWxpbmVzLWNvbG9yKSknKTtcblxuICAgIGlmIChvcHRpb25zLnhBeGlzTGFiZWwgJiYgIWlzUm90YXRlZCkge1xuICAgICAgY29uc3QgdGlja05vZGVzID0gKHRoaXMueEF4aXMuc2VsZWN0QWxsKCd0ZXh0Jykubm9kZXMoKSB8fCBbXSkgYXMgU1ZHVGV4dEVsZW1lbnRbXTtcbiAgICAgIGNvbnN0IG1lYXN1cmVkVGlja0hlaWdodCA9XG4gICAgICAgIHRpY2tOb2Rlcy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBNYXRoLm1heChcbiAgICAgICAgICAgICAgLi4udGlja05vZGVzLm1hcCgobikgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbj8uZ2V0QkJveD8uKCk/LmhlaWdodCA/PyBkeW5hbWljRm9udFNpemU7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZHluYW1pY0ZvbnRTaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBkeW5hbWljRm9udFNpemU7XG4gICAgICBjb25zdCB0aWNrQXJlYUhlaWdodCA9IG1lYXN1cmVkVGlja0hlaWdodCArIHRoaXMuVElDS19BUkVBX1BBRERJTkc7XG4gICAgICBjb25zdCBnYXBCZWxvd1RpY2tzID0gdGhpcy5YX0FYSVNfVElUTEVfR0FQO1xuICAgICAgdGhpcy5jcmVhdGVYQXhpc1RpdGxlKGF4ZXNHcm91cCwgb3B0aW9ucy54QXhpc0xhYmVsLCB0aWNrQXJlYUhlaWdodCwgZ2FwQmVsb3dUaWNrcyk7XG4gICAgfVxuICB9XG5cbiAgLy8gY29tcHV0ZVRvb2x0aXBQb3NpdGlvbiBtb3ZlZCB0byBzaGFyZWQgY2hhcnQgdXRpbHNcblxuICBwcml2YXRlIHNob3dNZXNzYWdlKFxuICAgIGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIGljb25DbGFzczogc3RyaW5nLFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBoZWxwVGV4dDogc3RyaW5nLFxuICAgIHNwZWNpZmljQ2xhc3M6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5kM1xuICAgICAgLnNlbGVjdChjb250YWluZXJFbGVtZW50KVxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC5hdHRyKCdjbGFzcycsIGBheC1jaGFydC1tZXNzYWdlLWNvbnRhaW5lciBheC1iYXItY2hhcnQtbWVzc2FnZS1iYWNrZ3JvdW5kICR7c3BlY2lmaWNDbGFzc31gKTtcblxuICAgIGNvbnRhaW5lclxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1jaGFydC1tZXNzYWdlLWljb24gYXgtYmFyLWNoYXJ0LW5vLWRhdGEtaWNvbicpXG4gICAgICAuaHRtbChgPGkgY2xhc3M9XCIke2ljb25DbGFzc30gZmEtMnhcIj48L2k+YCk7XG5cbiAgICBjb250YWluZXIuYXBwZW5kKCdkaXYnKS5hdHRyKCdjbGFzcycsICdheC1jaGFydC1tZXNzYWdlLXRleHQgYXgtYmFyLWNoYXJ0LW5vLWRhdGEtdGV4dCcpLnRleHQodGV4dCk7XG5cbiAgICBjb250YWluZXIuYXBwZW5kKCdkaXYnKS5hdHRyKCdjbGFzcycsICdheC1jaGFydC1tZXNzYWdlLWhlbHAgYXgtYmFyLWNoYXJ0LW5vLWRhdGEtaGVscCcpLnRleHQoaGVscFRleHQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYXgtYmFyLWNoYXJ0XCIgcm9sZT1cImltZ1wiICNjaGFydENvbnRhaW5lcj5cbiAgPCEtLSBTaGFyZWQgdG9vbHRpcCBjb21wb25lbnQgLS0+XG4gIDxheC1jaGFydC10b29sdGlwXG4gICAgW3Zpc2libGVdPVwidG9vbHRpcFZpc2libGUoKVwiXG4gICAgW3Bvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbigpXCJcbiAgICBbZGF0YV09XCJ0b29sdGlwRGF0YSgpXCJcbiAgICBbc2hvd1BlcmNlbnRhZ2VdPVwidHJ1ZVwiXG4gID48L2F4LWNoYXJ0LXRvb2x0aXA+XG48L2Rpdj5cbiJdfQ==","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1iYXItY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvYmFyLWNoYXJ0L3NyYy9hY29yZXgtY2hhcnRzLWJhci1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}