@acorex/charts 20.10.8 → 20.10.10

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.
@@ -223,6 +223,7 @@ declare class AXDonutChartComponent extends AXChartComponent implements OnDestro
223
223
  * Renders the donut chart with visible data
224
224
  */
225
225
  private renderDonutChart;
226
+ private getDonutRadii;
226
227
  /**
227
228
  * Create SVG element with filter definitions for shadows
228
229
  * @returns D3 SVG selection (any type due to dynamic D3 loading)
@@ -272,9 +273,10 @@ declare class AXDonutChartComponent extends AXChartComponent implements OnDestro
272
273
  private updateTooltipPosition;
273
274
  private scheduleTooltipPosition;
274
275
  /**
275
- * Adds center display with total value
276
+ * Adds center display with total value, scaled to fit the donut hole.
276
277
  */
277
278
  private addCenterDisplay;
279
+ private calculateCenterTextSizes;
278
280
  /**
279
281
  * Handles chart rendering errors
280
282
  */
@@ -352,10 +352,19 @@ class AXDonutChartComponent extends AXChartComponent {
352
352
  const svg = this.createSvgWithFilters(container, width, height);
353
353
  // Create main chart group
354
354
  this.svg = svg.append('g').attr('transform', `translate(${width / 2}, ${height / 2})`);
355
+ const { innerRadius } = this.getDonutRadii(width, height);
355
356
  // Create donut segments
356
357
  this.createDonutSegments(width, height, visibleData, layoutTotal);
357
358
  // Add total in center
358
- this.addCenterDisplay(displayTotal);
359
+ this.addCenterDisplay(displayTotal, innerRadius);
360
+ }
361
+ getDonutRadii(chartWidth, chartHeight) {
362
+ const maxRadius = Math.min(chartWidth, chartHeight) / 2;
363
+ const radius = Math.max(0, maxRadius - this.CHART_INSET);
364
+ const donutWidthPercent = this.effectiveOptions().donutWidth / 100;
365
+ const innerRadius = radius * (1 - donutWidthPercent);
366
+ const outerRadius = radius * 0.95;
367
+ return { innerRadius, outerRadius, radius };
359
368
  }
360
369
  /**
361
370
  * Create SVG element with filter definitions for shadows
@@ -396,13 +405,7 @@ class AXDonutChartComponent extends AXChartComponent {
396
405
  .value((d) => this.getSegmentLayoutValue(d.value))
397
406
  .sort(null)
398
407
  .padAngle(0.02);
399
- // Calculate the radius of the donut chart
400
- const maxRadius = Math.min(chartWidth, chartHeight) / 2;
401
- const radius = Math.max(0, maxRadius - this.CHART_INSET);
402
- // Calculate inner radius based on donutWidth percentage
403
- const donutWidthPercent = this.effectiveOptions().donutWidth / 100;
404
- const innerRadius = radius * (1 - donutWidthPercent);
405
- const outerRadius = radius * 0.95;
408
+ const { innerRadius, outerRadius } = this.getDonutRadii(chartWidth, chartHeight);
406
409
  const ringWidth = outerRadius - innerRadius;
407
410
  const arc = this.d3
408
411
  .arc()
@@ -695,37 +698,66 @@ class AXDonutChartComponent extends AXChartComponent {
695
698
  });
696
699
  }
697
700
  /**
698
- * Adds center display with total value
701
+ * Adds center display with total value, scaled to fit the donut hole.
699
702
  */
700
- addCenterDisplay(displayTotal) {
701
- if (!this.svg)
703
+ addCenterDisplay(displayTotal, innerRadius) {
704
+ if (!this.svg || innerRadius <= 0)
702
705
  return;
703
- const chartContainerWidth = this.chartContainerEl().nativeElement.clientWidth;
704
- // Improved font scaling: better minimum for small sizes, better ratio for scaling
705
- const baseFontSize = Math.max(1.8, Math.min(3.2, chartContainerWidth / 150));
706
- const subTextFontSize = baseFontSize * 0.5;
707
- // Create group for the total display
706
+ const valueText = displayTotal.toLocaleString();
707
+ const labelText = this.effectiveOptions().totalLabel || 'Total';
708
+ const { valueFontSize, labelFontSize, displayLabel } = this.calculateCenterTextSizes(valueText, labelText, innerRadius);
709
+ const labelLineHeight = labelFontSize * 1.3;
710
+ const valueY = -(labelLineHeight / 2);
708
711
  const totalDisplay = this.svg
709
712
  .append('g')
710
713
  .attr('class', 'ax-donut-chart-total-display')
711
714
  .attr('text-anchor', 'middle');
712
- // Add total value
713
715
  totalDisplay
714
716
  .append('text')
715
717
  .attr('class', 'ax-donut-chart-total-value')
716
- .style('font-size', `${baseFontSize}rem`)
718
+ .attr('y', valueY)
719
+ .attr('dominant-baseline', 'middle')
720
+ .style('font-size', `${valueFontSize}px`)
717
721
  .style('font-weight', '600')
718
722
  .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')
719
- .text(displayTotal.toLocaleString());
720
- // Add label
723
+ .text(valueText);
721
724
  totalDisplay
722
725
  .append('text')
723
726
  .attr('class', 'ax-donut-chart-total-label')
724
- .attr('dy', '1.4em')
725
- .style('font-size', `${subTextFontSize}rem`)
727
+ .attr('y', valueY + valueFontSize * 0.55 + labelLineHeight / 2)
728
+ .attr('dominant-baseline', 'middle')
729
+ .style('font-size', `${labelFontSize}px`)
726
730
  .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')
727
731
  .style('opacity', '0.8')
728
- .text(this.effectiveOptions().totalLabel || 'Total');
732
+ .text(displayLabel);
733
+ }
734
+ calculateCenterTextSizes(valueText, labelText, innerRadius) {
735
+ const availableDiameter = innerRadius * 2;
736
+ const availableWidth = availableDiameter * 0.82;
737
+ const availableHeight = availableDiameter * 0.78;
738
+ const MIN_VALUE_FONT = 9;
739
+ const MAX_VALUE_FONT = innerRadius * 0.42;
740
+ let valueFontSize = Math.min(innerRadius * 0.34, MAX_VALUE_FONT);
741
+ while (valueFontSize > MIN_VALUE_FONT && !this.doesTextFit(valueText, valueFontSize, availableWidth)) {
742
+ valueFontSize -= 0.5;
743
+ }
744
+ valueFontSize = Math.max(MIN_VALUE_FONT, Math.round(valueFontSize * 2) / 2);
745
+ let labelFontSize = Math.max(8, Math.round(valueFontSize * 0.42 * 2) / 2);
746
+ const labelLineHeight = labelFontSize * 1.3;
747
+ const totalHeight = valueFontSize + labelLineHeight;
748
+ if (totalHeight > availableHeight) {
749
+ const scale = availableHeight / totalHeight;
750
+ valueFontSize = Math.max(MIN_VALUE_FONT, Math.round(valueFontSize * scale * 2) / 2);
751
+ labelFontSize = Math.max(8, Math.round(labelFontSize * scale * 2) / 2);
752
+ }
753
+ while (labelFontSize > 8 && !this.doesTextFit(labelText, labelFontSize, availableWidth)) {
754
+ labelFontSize -= 0.5;
755
+ }
756
+ labelFontSize = Math.max(8, Math.round(labelFontSize * 2) / 2);
757
+ const displayLabel = this.doesTextFit(labelText, labelFontSize, availableWidth)
758
+ ? labelText
759
+ : this.truncateTextToFit(labelText, labelFontSize, availableWidth);
760
+ return { valueFontSize, labelFontSize, displayLabel };
729
761
  }
730
762
  /**
731
763
  * Handles chart rendering errors
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-charts-donut-chart.mjs","sources":["../tmp-esm2022/donut-chart/lib/donut-chart.config.js","../tmp-esm2022/donut-chart/lib/donut-chart.component.js","../tmp-esm2022/donut-chart/acorex-charts-donut-chart.js"],"sourcesContent":["import { AX_CHART_DEFAULT_MESSAGES } from '@acorex/charts';\nimport { InjectionToken } from '@angular/core';\nexport const AXDonutChartDefaultConfig = {\n showTooltip: true,\n showDataLabels: true,\n donutWidth: 35,\n cornerRadius: 4,\n animationDuration: 800,\n animationEasing: 'cubic-out',\n messages: {\n ...AX_CHART_DEFAULT_MESSAGES,\n noDataIcon: 'fa-light fa-chart-pie',\n },\n};\nexport const AX_DONUT_CHART_CONFIG = new InjectionToken('AX_DONUT_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXDonutChartDefaultConfig,\n});\nexport function donutChartConfig(config = {}) {\n return {\n ...AXDonutChartDefaultConfig,\n ...config,\n messages: {\n ...AXDonutChartDefaultConfig.messages,\n ...config.messages,\n },\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9udXQtY2hhcnQuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXVCO0lBQzNELFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLFVBQVUsRUFBRSxFQUFFO0lBQ2QsWUFBWSxFQUFFLENBQUM7SUFDZixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxXQUFXO0lBQzVCLFFBQVEsRUFBRTtRQUNSLEdBQUcseUJBQXlCO1FBQzVCLFVBQVUsRUFBRSx1QkFBdUI7S0FDcEM7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxjQUFjLENBQXFCLHVCQUF1QixFQUFFO0lBQ25HLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyx5QkFBeUI7Q0FDekMsQ0FBQyxDQUFDO0FBSUgsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFNBQWtDLEVBQUU7SUFDbkUsT0FBTztRQUNMLEdBQUcseUJBQXlCO1FBQzVCLEdBQUcsTUFBTTtRQUNULFFBQVEsRUFBRTtZQUNSLEdBQUcseUJBQXlCLENBQUMsUUFBUTtZQUNyQyxHQUFHLE1BQU0sQ0FBQyxRQUFRO1NBQ25CO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWF9DSEFSVF9ERUZBVUxUX01FU1NBR0VTIH0gZnJvbSAnQGFjb3JleC9jaGFydHMnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYRG9udXRDaGFydE9wdGlvbiB9IGZyb20gJy4vZG9udXQtY2hhcnQudHlwZSc7XG5cbmV4cG9ydCBjb25zdCBBWERvbnV0Q2hhcnREZWZhdWx0Q29uZmlnOiBBWERvbnV0Q2hhcnRPcHRpb24gPSB7XG4gIHNob3dUb29sdGlwOiB0cnVlLFxuICBzaG93RGF0YUxhYmVsczogdHJ1ZSxcbiAgZG9udXRXaWR0aDogMzUsXG4gIGNvcm5lclJhZGl1czogNCxcbiAgYW5pbWF0aW9uRHVyYXRpb246IDgwMCxcbiAgYW5pbWF0aW9uRWFzaW5nOiAnY3ViaWMtb3V0JyxcbiAgbWVzc2FnZXM6IHtcbiAgICAuLi5BWF9DSEFSVF9ERUZBVUxUX01FU1NBR0VTLFxuICAgIG5vRGF0YUljb246ICdmYS1saWdodCBmYS1jaGFydC1waWUnLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEFYX0RPTlVUX0NIQVJUX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBWERvbnV0Q2hhcnRPcHRpb24+KCdBWF9ET05VVF9DSEFSVF9DT05GSUcnLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4gQVhEb251dENoYXJ0RGVmYXVsdENvbmZpZyxcbn0pO1xuXG5leHBvcnQgdHlwZSBQYXJ0aWFsRG9udXRDaGFydENvbmZpZyA9IFBhcnRpYWw8QVhEb251dENoYXJ0T3B0aW9uPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGRvbnV0Q2hhcnRDb25maWcoY29uZmlnOiBQYXJ0aWFsRG9udXRDaGFydENvbmZpZyA9IHt9KTogQVhEb251dENoYXJ0T3B0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5BWERvbnV0Q2hhcnREZWZhdWx0Q29uZmlnLFxuICAgIC4uLmNvbmZpZyxcbiAgICBtZXNzYWdlczoge1xuICAgICAgLi4uQVhEb251dENoYXJ0RGVmYXVsdENvbmZpZy5tZXNzYWdlcyxcbiAgICAgIC4uLmNvbmZpZy5tZXNzYWdlcyxcbiAgICB9LFxuICB9O1xufVxuIl19","import { AX_CHART_COLOR_PALETTE, AXChartComponent, computeTooltipPosition, createChartInstanceId, getChartColor, getEasingFunction, mergeChartMessages, mergeChartOptions, renderChartEmptyMessage, } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { afterNextRender, ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, effect, inject, input, output, signal, untracked, viewChild, ViewEncapsulation, } from '@angular/core';\nimport { AX_DONUT_CHART_CONFIG } from './donut-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * Donut Chart Component\n * Displays data in a circular donut chart with interactive segments\n */\nexport class AXDonutChartComponent extends AXChartComponent {\n // Dependency Injection\n cdr = inject(ChangeDetectorRef);\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 segment is clicked */\n segmentClick = output();\n /** Emitted when a segment has mouse hover\n * Can be used by external elements to highlight this segment\n */\n segmentHover = output();\n // Chart container reference\n chartContainerEl = viewChild.required('chartContainer');\n // D3 reference - loaded asynchronously\n d3;\n // Chart SVG reference (using 'any' since D3 is loaded dynamically at runtime)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n svg = null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pieData = [];\n // State management\n hiddenSegments = new Set();\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\n _isInitialAnimating = signal(false, ...(ngDevMode ? [{ debugName: \"_isInitialAnimating\" }] : []));\n _currentlyHighlightedSegment = signal(null, ...(ngDevMode ? [{ debugName: \"_currentlyHighlightedSegment\" }] : []));\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 // Public computed properties for the template\n tooltipVisible = this._tooltipVisible.asReadonly();\n tooltipPosition = this._tooltipPosition.asReadonly();\n tooltipData = this._tooltipData.asReadonly();\n // Inject configuration\n configToken = inject(AX_DONUT_CHART_CONFIG);\n // Inject the chart colors\n chartColors = inject(AX_CHART_COLOR_PALETTE);\n // Computed configuration options\n effectiveOptions = computed(() => mergeChartOptions(this.configToken, this.options()), ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n // Constants\n TOOLTIP_GAP = 10;\n HIGHLIGHT_TRANSITION_DURATION = 150;\n HIGHLIGHT_TRANSITION_NAME = 'highlight';\n SEGMENT_ANIMATION_DELAY = 50;\n LABEL_ANIMATION_DELAY = 200;\n MIN_CHART_DIMENSION = 200;\n MIN_CHART_FOR_LABELS = 260;\n CHART_INSET = 12;\n DIMMED_OPACITY = 0.5;\n VISIBLE_OPACITY = 1;\n instanceId = createChartInstanceId('ax-donut');\n get segmentShadowFilterId() {\n return `${this.instanceId}-segment-shadow`;\n }\n // Messages with defaults\n effectiveMessages = computed(() => mergeChartMessages(this.configToken.messages, this.options()?.messages), ...(ngDevMode ? [{ debugName: \"effectiveMessages\" }] : []));\n // Data accessor for handling different incoming data formats\n chartDataArray = computed(() => {\n return this.data() || [];\n }, ...(ngDevMode ? [{ debugName: \"chartDataArray\" }] : []));\n // Color accessor method\n getColor(index) {\n return getChartColor(index, this.chartColors);\n }\n // Segment visibility check\n isSegmentHidden(id) {\n return this.hiddenSegments.has(id);\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 });\n }\n dataChangeEffect = effect(() => {\n // Track data and options changes\n this.data();\n this.effectiveOptions();\n // Only update if already rendered\n untracked(() => {\n if (this._rendered()) {\n this.updateChart();\n }\n });\n }, ...(ngDevMode ? [{ debugName: \"dataChangeEffect\" }] : []));\n /**\n * Highlights a specific segment by ID\n * @param id The segment ID to highlight, or null to clear highlight\n */\n highlightSegment(id) {\n if (this._isInitialAnimating() || !this.svg)\n return;\n if (this._currentlyHighlightedSegment() === id)\n return;\n this._currentlyHighlightedSegment.set(id);\n // Only interrupt ongoing HIGHLIGHT transitions (not initial animations)\n this.svg.selectAll('path').interrupt(this.HIGHLIGHT_TRANSITION_NAME);\n if (id === null) {\n this.clearAllHighlights();\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const targetSegment = this.svg.selectAll('path').filter((d) => d?.data?.id === id);\n if (targetSegment.empty()) {\n this._currentlyHighlightedSegment.set(null);\n this.highlightSegment(null);\n return;\n }\n this.dimNonTargetSegments(id);\n this.highlightTargetSegment(targetSegment);\n this.segmentHover.emit(this.getSegmentDataById(id));\n }\n clearAllHighlights() {\n if (!this.svg)\n return;\n this.svg\n .selectAll('path')\n .classed('ax-donut-chart-highlighted', false)\n .classed('ax-donut-chart-dimmed', false)\n .transition(this.HIGHLIGHT_TRANSITION_NAME)\n .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n .attr('transform', null)\n .style('filter', null)\n .style('opacity', this.VISIBLE_OPACITY);\n this.segmentHover.emit(null);\n }\n dimNonTargetSegments(targetId) {\n if (!this.svg)\n return;\n this.svg\n .selectAll('path')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .filter((d) => d?.data?.id !== targetId)\n .classed('ax-donut-chart-highlighted', false)\n .classed('ax-donut-chart-dimmed', true)\n .transition(this.HIGHLIGHT_TRANSITION_NAME)\n .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n .attr('transform', null)\n .style('filter', null)\n .style('opacity', this.DIMMED_OPACITY);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n highlightTargetSegment(targetSegment) {\n targetSegment\n .classed('ax-donut-chart-dimmed', false)\n .classed('ax-donut-chart-highlighted', true)\n .transition(this.HIGHLIGHT_TRANSITION_NAME)\n .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n .style('filter', `url(#${this.segmentShadowFilterId})`)\n .style('opacity', this.VISIBLE_OPACITY);\n }\n getSegmentDataById(segmentId) {\n return untracked(() => this.chartDataArray()).find((d) => d.id === segmentId) || null;\n }\n /**\n * Toggles visibility of a segment by ID\n * @param id Segment ID to toggle\n * @returns New visibility state (true = visible, false = hidden)\n */\n toggleSegment(id) {\n const chartData = this.chartDataArray();\n const wasAllHidden = chartData.length > 0 && chartData.every((d) => this.isSegmentHidden(d.id));\n if (this.hiddenSegments.has(id)) {\n // Making a segment visible\n this.hiddenSegments.delete(id);\n // If all segments were previously hidden, we need to ensure the message is cleared\n if (wasAllHidden) {\n // Force complete DOM cleanup and redraw\n if (this.chartContainerEl()?.nativeElement) {\n // Clear only chart SVG and message containers (preserve tooltip component)\n this.d3\n ?.select(this.chartContainerEl().nativeElement)\n .selectAll('svg, .ax-chart-empty, .ax-chart-message-container, .ax-donut-chart-no-data-message')\n .remove();\n // Force full redraw\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n }\n else {\n this.updateChart();\n }\n }\n else {\n // Hiding a segment\n this.hiddenSegments.add(id);\n this.updateChart();\n }\n return !this.isSegmentHidden(id);\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 onSegmentClick(item) {\n this.segmentClick.emit(item);\n }\n /**\n * Creates the donut chart from current data\n */\n createChart() {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement)\n return;\n try {\n const containerElement = this.chartContainerEl().nativeElement;\n this.clearChart(containerElement);\n const data = this.chartDataArray();\n if (!data || data.length === 0) {\n this.showNoDataMessage();\n return;\n }\n const visibleData = data.filter((item) => !this.hiddenSegments.has(item.id));\n if (visibleData.length === 0) {\n this.showAllSegmentsHiddenMessage();\n return;\n }\n const options = this.effectiveOptions();\n const { width, height } = this.setupDimensions(containerElement, options);\n this.renderDonutChart(containerElement, width, height, visibleData);\n }\n catch (error) {\n console.error('Error creating donut chart:', error);\n this.handleChartError();\n }\n }\n /**\n * Updates the chart with new data\n */\n updateChart() {\n // Reset highlighted segment state when updating\n this._currentlyHighlightedSegment.set(null);\n this.createChart(); // Recreate the chart with updated data\n }\n /**\n * Clears the chart container\n */\n clearChart(container) {\n this.d3.select(container).selectAll('svg, .ax-chart-empty, .ax-chart-message-container, .ax-donut-chart-no-data-message').remove();\n this._tooltipVisible.set(false);\n }\n /**\n * Shows a message when no data is available\n */\n showNoDataMessage() {\n if (!this.chartContainerEl()?.nativeElement)\n return;\n const messages = this.effectiveMessages();\n renderChartEmptyMessage(this.d3, this.chartContainerEl().nativeElement, {\n icon: messages.noDataIcon,\n title: messages.noData,\n help: messages.noDataHelp,\n });\n }\n /**\n * Shows a message when all segments are hidden\n */\n showAllSegmentsHiddenMessage() {\n if (!this.chartContainerEl()?.nativeElement)\n return;\n const messages = this.effectiveMessages();\n renderChartEmptyMessage(this.d3, this.chartContainerEl().nativeElement, {\n icon: messages.allHiddenIcon,\n title: messages.allHidden,\n help: messages.allHiddenHelp,\n });\n }\n /**\n * Setups chart dimensions based on container and options\n */\n setupDimensions(container, options) {\n const containerWidth = Math.max(container.clientWidth, 1);\n const containerHeight = Math.max(container.clientHeight, 1);\n const desiredWidth = options?.width || containerWidth;\n const desiredHeight = options?.height || containerHeight;\n // Keep donut geometry square so side spacing stays visually balanced.\n const chartSize = Math.max(1, Math.min(desiredWidth, desiredHeight));\n return { width: chartSize, height: chartSize };\n }\n /**\n * Renders the donut chart with visible data\n */\n renderDonutChart(container, width, height, visibleData) {\n const displayTotal = this.getDisplayTotal(visibleData);\n const layoutTotal = this.getLayoutTotal(visibleData);\n // Create SVG container with filters\n const svg = this.createSvgWithFilters(container, width, height);\n // Create main chart group\n this.svg = svg.append('g').attr('transform', `translate(${width / 2}, ${height / 2})`);\n // Create donut segments\n this.createDonutSegments(width, height, visibleData, layoutTotal);\n // Add total in center\n this.addCenterDisplay(displayTotal);\n }\n /**\n * Create SVG element with filter definitions for shadows\n * @returns D3 SVG selection (any type due to dynamic D3 loading)\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n createSvgWithFilters(container, width, height) {\n const svg = this.d3\n .select(container)\n .append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${width} ${height}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n // Add drop shadow filter\n const defs = svg.append('defs');\n const filter = defs.append('filter').attr('id', this.segmentShadowFilterId).attr('height', '130%');\n filter.append('feGaussianBlur').attr('in', 'SourceAlpha').attr('stdDeviation', 2).attr('result', 'blur');\n filter.append('feOffset').attr('in', 'blur').attr('dx', 1).attr('dy', 1).attr('result', 'offsetBlur');\n const feComponentTransfer = filter\n .append('feComponentTransfer')\n .attr('in', 'offsetBlur')\n .attr('result', 'offsetBlur');\n feComponentTransfer.append('feFuncA').attr('type', 'linear').attr('slope', 0.3);\n const feMerge = filter.append('feMerge');\n feMerge.append('feMergeNode').attr('in', 'offsetBlur');\n feMerge.append('feMergeNode').attr('in', 'SourceGraphic');\n return svg;\n }\n /**\n * Create and render the donut segments with animations\n */\n createDonutSegments(chartWidth, chartHeight, data, layoutTotal) {\n this._isInitialAnimating.set(true);\n // Create pie layout\n const pie = this.d3\n .pie()\n .value((d) => this.getSegmentLayoutValue(d.value))\n .sort(null)\n .padAngle(0.02);\n // Calculate the radius of the donut chart\n const maxRadius = Math.min(chartWidth, chartHeight) / 2;\n const radius = Math.max(0, maxRadius - this.CHART_INSET);\n // Calculate inner radius based on donutWidth percentage\n const donutWidthPercent = this.effectiveOptions().donutWidth / 100;\n const innerRadius = radius * (1 - donutWidthPercent);\n const outerRadius = radius * 0.95;\n const ringWidth = outerRadius - innerRadius;\n const arc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius)\n .cornerRadius(this.effectiveOptions().cornerRadius);\n const labelArc = this.d3\n .arc()\n .innerRadius(innerRadius + ringWidth / 2)\n .outerRadius(innerRadius + ringWidth / 2);\n // Get animation options\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n // Generate pie data\n this.pieData = pie(data);\n // Add segments with animation\n const segments = this.svg\n .selectAll('path')\n .data(this.pieData)\n .enter()\n .append('path')\n .attr('class', 'ax-donut-chart-segment')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .attr('fill', (d) => this.getSegmentColor(d.data))\n .style('opacity', 0)\n .style('cursor', 'pointer')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('mouseenter', (event, d) => {\n if (this.effectiveOptions().showTooltip) {\n this.handleSliceHover(event, d.data);\n }\n })\n .on('mouseleave', () => this.handleSegmentLeave())\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('click', (_event, d) => {\n this.onSegmentClick(d.data);\n });\n // Animate segments\n const numSegments = this.pieData.length;\n let completed = 0;\n segments\n .transition()\n .duration(animationDuration)\n .ease(animationEasing)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .delay((_d, i) => i * this.SEGMENT_ANIMATION_DELAY)\n .style('opacity', this.VISIBLE_OPACITY)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .attrTween('d', (d) => {\n const interpolate = this.d3.interpolate({ startAngle: d.startAngle, endAngle: d.startAngle }, d);\n return (t) => arc(interpolate(t));\n })\n .on('end', () => {\n completed++;\n if (completed >= numSegments) {\n this._isInitialAnimating.set(false);\n this.cdr.detectChanges();\n }\n })\n .on('interrupt', () => {\n // Treat interrupts as completion to avoid getting stuck in animating state\n completed++;\n if (completed >= numSegments) {\n this._isInitialAnimating.set(false);\n this.cdr.detectChanges();\n }\n });\n // Add data labels if enabled and chart size is sufficient\n if (this.effectiveOptions().showDataLabels && this.isChartLargeEnoughForLabels(chartWidth, chartHeight)) {\n this.addDataLabels(labelArc, outerRadius, innerRadius, layoutTotal, animationDuration);\n }\n // Determine when all segment animations are complete (handle empty case)\n if (numSegments === 0) {\n this._isInitialAnimating.set(false);\n this.cdr.detectChanges();\n }\n }\n isChartLargeEnoughForLabels(width, height) {\n return Math.min(width, height) >= this.MIN_CHART_FOR_LABELS;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n addDataLabels(labelArc, outerRadius, innerRadius, layoutTotal, animationDuration) {\n if (!this.svg)\n return;\n const dataWithLabels = this.pieData.filter((d) => {\n return this.calculateLabelFontSize(d, outerRadius, innerRadius, layoutTotal) > 0;\n });\n const labels = this.svg\n .selectAll('.ax-donut-chart-data-label')\n .data(dataWithLabels)\n .enter()\n .append('text')\n .attr('class', 'ax-donut-chart-data-label')\n .style('opacity', 0)\n .style('pointer-events', 'none')\n .style('fill', 'rgb(var(--ax-comp-donut-chart-data-labels-color))')\n .attr('transform', (d) => {\n const centroid = labelArc.centroid(d);\n return `translate(${centroid[0]}, ${centroid[1]})`;\n })\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .style('font-size', (d) => `${this.calculateLabelFontSize(d, outerRadius, innerRadius, layoutTotal)}px`)\n .style('font-weight', (d) => (this.getSegmentPercentage(d.data.value, layoutTotal) >= 15 ? '600' : '500'))\n .text((d) => this.getTruncatedLabelText(d, outerRadius, innerRadius, layoutTotal));\n labels\n .transition()\n .duration(animationDuration)\n .delay((_d, i) => i * this.SEGMENT_ANIMATION_DELAY + this.LABEL_ANIMATION_DELAY)\n .style('opacity', this.VISIBLE_OPACITY);\n }\n /**\n * Calculates font size for data labels using the donut ring's physical dimensions.\n *\n * Primary driver is the ring width (radial space), with chord length as an\n * overflow guard and a gentle scale-down for smaller segments to create\n * visual hierarchy.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n calculateLabelFontSize(d, outerRadius, innerRadius, layoutTotal) {\n const angle = d.endAngle - d.startAngle;\n const segmentPercentage = this.getSegmentPercentage(d.data.value, layoutTotal);\n if (segmentPercentage < 2)\n return 0;\n const ringWidth = outerRadius - innerRadius;\n const labelRadius = innerRadius + ringWidth / 2;\n const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n const MIN_CHORD = 22;\n const MIN_RING = 16;\n if (chordLength < MIN_CHORD || ringWidth < MIN_RING)\n return 0;\n const ringBasedSize = ringWidth * 0.48;\n // Segments >= 20% get full size; smaller ones scale from 0.75 → 1.0\n const segmentScale = Math.min(1, 0.75 + 0.25 * (segmentPercentage / 20));\n // At least 2 characters (\"X%\") must fit horizontally\n const maxByChord = chordLength / (2 * 0.65);\n const fontSize = Math.min(ringBasedSize * segmentScale, maxByChord);\n const MIN_FONT_SIZE = 11;\n const MAX_FONT_SIZE = 20;\n return Math.round(Math.max(MIN_FONT_SIZE, Math.min(fontSize, MAX_FONT_SIZE)) * 2) / 2;\n }\n formatPercentage(value) {\n if (value < 1)\n return '<1%';\n if (value < 10)\n return `${value.toFixed(1)}%`;\n return `${Math.round(value)}%`;\n }\n /**\n * Returns the best-fit label text for a segment, progressively truncating\n * from \"Label (XX%)\" → \"Label\" → \"XX%\" → truncated label → truncated percentage.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getTruncatedLabelText(d, outerRadius, innerRadius, layoutTotal) {\n const fontSize = this.calculateLabelFontSize(d, outerRadius, innerRadius, layoutTotal);\n if (fontSize === 0)\n return '';\n const ringWidth = outerRadius - innerRadius;\n const labelRadius = innerRadius + ringWidth / 2;\n const angle = d.endAngle - d.startAngle;\n const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n const availableWidth = chordLength * 0.8;\n const percentage = this.getSegmentPercentage(d.data.value, layoutTotal);\n if (percentage < 2)\n return '';\n const label = d.data.label || '';\n const percentageText = this.formatPercentage(percentage);\n const fullText = label ? `${label} (${percentageText})` : percentageText;\n if (this.doesTextFit(fullText, fontSize, availableWidth))\n return fullText;\n if (label && this.doesTextFit(label, fontSize, availableWidth))\n return label;\n if (this.doesTextFit(percentageText, fontSize, availableWidth))\n return percentageText;\n if (label)\n return this.truncateTextToFit(label, fontSize, availableWidth);\n return this.truncateTextToFit(percentageText, fontSize, availableWidth);\n }\n /**\n * Checks if text fits within available width using conservative estimation\n * Uses 0.65em per character to account for font variations\n */\n doesTextFit(text, fontSize, availableWidth) {\n if (!text)\n return false;\n // Use conservative character width (0.65em for safety)\n // Wider fonts like bold text need more space\n const estimatedWidth = text.length * fontSize * 0.65;\n return estimatedWidth <= availableWidth;\n }\n /**\n * Truncates text to fit within available width with ellipsis\n * Uses conservative character width to prevent overflow\n * Adapts character width estimation based on font size\n */\n truncateTextToFit(text, fontSize, availableWidth) {\n if (!text)\n return '';\n // Adaptive character width: smaller fonts are relatively wider\n // Larger fonts: ~0.6em, Smaller fonts: ~0.7em\n const charWidthRatio = fontSize <= 10 ? 0.7 : 0.65;\n const charWidth = fontSize * charWidthRatio;\n // Reserve space for ellipsis\n const ellipsisWidth = fontSize * 0.7;\n const availableForText = availableWidth - ellipsisWidth;\n if (availableForText <= 0)\n return '';\n const maxChars = Math.floor(availableForText / charWidth);\n if (maxChars <= 0)\n return '';\n if (text.length <= maxChars)\n return text;\n // Ensure at least 1 character before ellipsis\n return text.substring(0, Math.max(1, maxChars)) + '…';\n }\n getSegmentColor(data) {\n if (data.color)\n return data.color;\n const originalFullData = untracked(() => this.chartDataArray());\n const originalIndex = originalFullData.findIndex((item) => item.id === data.id);\n return this.getColor(originalIndex !== -1 ? originalIndex : 0);\n }\n /**\n * Handle hover effects on a segment\n */\n handleSliceHover(event, datum) {\n if (this._isInitialAnimating())\n return;\n if (this.effectiveOptions().showTooltip !== false) {\n this.showTooltip(event, datum);\n }\n this.highlightSegment(datum.id);\n }\n showTooltip(event, datum) {\n const visibleData = untracked(() => this.chartDataArray()).filter((item) => !this.hiddenSegments.has(item.id));\n const layoutTotal = this.getLayoutTotal(visibleData);\n const percentage = layoutTotal > 0 ? this.getSegmentPercentage(datum.value, layoutTotal).toFixed(1) : '0';\n const color = this.getSegmentColor(datum);\n this._tooltipData.set({\n title: datum.tooltipLabel || datum.label,\n value: datum.value.toString(),\n percentage: `${percentage}%`,\n color,\n });\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n }\n /**\n * Handles mouse leave from segments\n */\n handleSegmentLeave() {\n if (this._isInitialAnimating())\n return;\n this._tooltipVisible.set(false);\n this.highlightSegment(null);\n }\n updateTooltipPosition(event) {\n this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n if (this._tooltipRafId != null)\n return;\n this.scheduleTooltipPosition(0);\n }\n scheduleTooltipPosition(attempt) {\n this._tooltipRafId = requestAnimationFrame(() => {\n const coords = this._pendingTooltipCoords;\n if (!coords) {\n this._tooltipRafId = null;\n return;\n }\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl) {\n this._tooltipRafId = null;\n return;\n }\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n if (!tooltipEl && this._tooltipVisible() && attempt < 3) {\n this.scheduleTooltipPosition(attempt + 1);\n return;\n }\n this._tooltipRafId = null;\n const containerRect = containerEl.getBoundingClientRect();\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = computeTooltipPosition(containerRect, tooltipRect, coords.x, coords.y, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n });\n }\n /**\n * Adds center display with total value\n */\n addCenterDisplay(displayTotal) {\n if (!this.svg)\n return;\n const chartContainerWidth = this.chartContainerEl().nativeElement.clientWidth;\n // Improved font scaling: better minimum for small sizes, better ratio for scaling\n const baseFontSize = Math.max(1.8, Math.min(3.2, chartContainerWidth / 150));\n const subTextFontSize = baseFontSize * 0.5;\n // Create group for the total display\n const totalDisplay = this.svg\n .append('g')\n .attr('class', 'ax-donut-chart-total-display')\n .attr('text-anchor', 'middle');\n // Add total value\n totalDisplay\n .append('text')\n .attr('class', 'ax-donut-chart-total-value')\n .style('font-size', `${baseFontSize}rem`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')\n .text(displayTotal.toLocaleString());\n // Add label\n totalDisplay\n .append('text')\n .attr('class', 'ax-donut-chart-total-label')\n .attr('dy', '1.4em')\n .style('font-size', `${subTextFontSize}rem`)\n .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')\n .style('opacity', '0.8')\n .text(this.effectiveOptions().totalLabel || 'Total');\n }\n /**\n * Handles chart rendering errors\n */\n handleChartError() {\n const container = this.chartContainerEl()?.nativeElement;\n if (container) {\n this.showNoDataMessage();\n }\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-empty, .ax-chart-message-container, .ax-donut-chart-no-data-message').remove();\n }\n this.svg = null;\n this.pieData = [];\n this.hiddenSegments.clear();\n this._tooltipVisible.set(false);\n this._currentlyHighlightedSegment.set(null);\n }\n // ===== Helper utilities for modularity and maintainability =====\n // computeTooltipPosition moved to shared chart utils\n /**\n * Gets an accessibility label describing the donut chart for screen readers\n * @returns Descriptive string for screen readers\n */\n getAccessibilityLabel() {\n const data = this.chartDataArray();\n if (!data || data.length === 0) {\n return 'Empty donut chart. No data available.';\n }\n const displayTotal = this.getDisplayTotal(data);\n const layoutTotal = this.getLayoutTotal(data);\n const segmentDescriptions = data\n .map((segment) => {\n const percentage = layoutTotal > 0 ? this.getSegmentPercentage(segment.value, layoutTotal).toFixed(1) : '0';\n return `${segment.label}: ${segment.value} (${percentage}%)`;\n })\n .join('; ');\n return `Donut chart with ${data.length} segments. Total value: ${displayTotal}. ${segmentDescriptions}`;\n }\n /**\n * Returns the data items for the legend\n * @implements AXChartLegendCompatible\n */\n getLegendItems() {\n const data = this.chartDataArray();\n const layoutTotal = this.getLayoutTotal(data);\n return data.map((item, index) => ({\n id: item.id,\n name: item.label || `Segment ${index + 1}`,\n value: item.value,\n color: this.getSegmentColor(item),\n percentage: this.getSegmentPercentage(item.value, layoutTotal),\n hidden: this.isSegmentHidden(item.id),\n }));\n }\n getSegmentLayoutValue(value) {\n return Math.abs(value);\n }\n getLayoutTotal(data) {\n return data.reduce((sum, item) => sum + this.getSegmentLayoutValue(item.value), 0);\n }\n getDisplayTotal(data) {\n return data.reduce((sum, item) => sum + item.value, 0);\n }\n getSegmentPercentage(segmentValue, layoutTotal) {\n if (layoutTotal <= 0)\n return 0;\n return (this.getSegmentLayoutValue(segmentValue) / layoutTotal) * 100;\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXDonutChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.3\", type: AXDonutChartComponent, isStandalone: true, selector: \"ax-donut-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: { segmentClick: \"segmentClick\", segmentHover: \"segmentHover\" }, viewQueries: [{ propertyName: \"chartContainerEl\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-donut-chart\\\" #chartContainer role=\\\"img\\\" [attr.aria-label]=\\\"getAccessibilityLabel()\\\">\\n <!-- 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-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-donut-chart{display:block;width:100%;height:100%;min-height:0;box-sizing:border-box;--ax-comp-donut-chart-bg-color: 0, 0, 0, 0;--ax-comp-donut-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-donut-chart-value-color: var(--ax-sys-color-on-lightest-surface)}ax-donut-chart .ax-donut-chart{width:100%;height:100%;min-height:0;position:relative;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);border-radius:.5rem;overflow:hidden;background-color:rgba(var(--ax-comp-donut-chart-bg-color))}ax-donut-chart .ax-donut-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-donut-chart .ax-donut-chart svg g:has(text){font-family:inherit}\\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: AXDonutChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-donut-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-donut-chart\\\" #chartContainer role=\\\"img\\\" [attr.aria-label]=\\\"getAccessibilityLabel()\\\">\\n <!-- 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-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-donut-chart{display:block;width:100%;height:100%;min-height:0;box-sizing:border-box;--ax-comp-donut-chart-bg-color: 0, 0, 0, 0;--ax-comp-donut-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-donut-chart-value-color: var(--ax-sys-color-on-lightest-surface)}ax-donut-chart .ax-donut-chart{width:100%;height:100%;min-height:0;position:relative;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);border-radius:.5rem;overflow:hidden;background-color:rgba(var(--ax-comp-donut-chart-bg-color))}ax-donut-chart .ax-donut-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-donut-chart .ax-donut-chart svg g:has(text){font-family:inherit}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9udXQtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFFaEIsc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsdUJBQXVCLEdBQ3hCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLHVCQUF1QixFQUFzQixNQUFNLDhCQUE4QixDQUFDO0FBRTNGLE9BQU8sRUFDTCxlQUFlLEVBQ2YsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFFTixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7O0FBRzdEOzs7R0FHRztBQVNILE1BQU0sT0FBTyxxQkFDWCxTQUFRLGdCQUFnQjtJQUd4Qix1QkFBdUI7SUFDZixHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFeEMsU0FBUztJQUNULHVCQUF1QjtJQUN2QixJQUFJLEdBQUcsS0FBSyxDQUFvQixFQUFFLGdEQUFDLENBQUM7SUFFcEMsMEJBQTBCO0lBQzFCLE9BQU8sR0FBRyxLQUFLLENBQXFCLEVBQUUsbURBQUMsQ0FBQztJQUV4QyxV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QixDQUFDLEtBQWE7UUFDekMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFTyxjQUFjLENBQUMsSUFBd0I7UUFDN0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVPLGVBQWUsQ0FBQyxJQUF3QjtRQUM5QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsWUFBb0IsRUFBRSxXQUFtQjtRQUNwRSxJQUFJLFdBQVcsSUFBSSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDeEUsQ0FBQzt1R0E3NEJVLHFCQUFxQjsyRkFBckIscUJBQXFCLDZpQkMvQ2xDLHVVQVNBLHd4Q0RtQ1ksdUJBQXVCOzsyRkFHdEIscUJBQXFCO2tCQVJqQyxTQUFTOytCQUNFLGdCQUFnQixpQkFHWCxpQkFBaUIsQ0FBQyxJQUFJLFdBQzVCLENBQUMsdUJBQXVCLENBQUMsbUJBQ2pCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBWF9DSEFSVF9DT0xPUl9QQUxFVFRFLFxuICBBWENoYXJ0Q29tcG9uZW50LFxuICBBWENoYXJ0Q29tcG9uZW50QmFzZSxcbiAgY29tcHV0ZVRvb2x0aXBQb3NpdGlvbixcbiAgY3JlYXRlQ2hhcnRJbnN0YW5jZUlkLFxuICBnZXRDaGFydENvbG9yLFxuICBnZXRFYXNpbmdGdW5jdGlvbixcbiAgbWVyZ2VDaGFydE1lc3NhZ2VzLFxuICBtZXJnZUNoYXJ0T3B0aW9ucyxcbiAgcmVuZGVyQ2hhcnRFbXB0eU1lc3NhZ2UsXG59IGZyb20gJ0BhY29yZXgvY2hhcnRzJztcbmltcG9ydCB7IEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlLCBBWENoYXJ0TGVnZW5kSXRlbSB9IGZyb20gJ0BhY29yZXgvY2hhcnRzL2NoYXJ0LWxlZ2VuZCc7XG5pbXBvcnQgeyBBWENoYXJ0VG9vbHRpcENvbXBvbmVudCwgQVhDaGFydFRvb2x0aXBEYXRhIH0gZnJvbSAnQGFjb3JleC9jaGFydHMvY2hhcnQtdG9vbHRpcCc7XG5cbmltcG9ydCB7XG4gIGFmdGVyTmV4dFJlbmRlcixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIEVsZW1lbnRSZWYsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG4gIHVudHJhY2tlZCxcbiAgdmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBWF9ET05VVF9DSEFSVF9DT05GSUcgfSBmcm9tICcuL2RvbnV0LWNoYXJ0LmNvbmZpZyc7XG5pbXBvcnQgeyBBWERvbnV0Q2hhcnREYXRhLCBBWERvbnV0Q2hhcnRPcHRpb24sIEFYRG9udXRDaGFydFZhbHVlIH0gZnJvbSAnLi9kb251dC1jaGFydC50eXBlJztcblxuLyoqXG4gKiBEb251dCBDaGFydCBDb21wb25lbnRcbiAqIERpc3BsYXlzIGRhdGEgaW4gYSBjaXJjdWxhciBkb251dCBjaGFydCB3aXRoIGludGVyYWN0aXZlIHNlZ21lbnRzXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F4LWRvbnV0LWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RvbnV0LWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZG9udXQtY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW0FYQ2hhcnRUb29sdGlwQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFYRG9udXRDaGFydENvbXBvbmVudFxuICBleHRlbmRzIEFYQ2hhcnRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlLCBBWENoYXJ0Q29tcG9uZW50QmFzZVxue1xuICAvLyBEZXBlbmRlbmN5IEluamVjdGlvblxuICBwcml2YXRlIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLy8gSW5wdXRzXG4gIC8qKiBDaGFydCBkYXRhIGlucHV0ICovXG4gIGRhdGEgPSBpbnB1dDxBWERvbnV0Q2hhcnRWYWx1ZT4oW10pO1xuXG4gIC8qKiBDaGFydCBvcHRpb25zIGlucHV0ICovXG4gIG9wdGlvbnMgPSBpbnB1dDxBWERvbnV0Q2hhcnRPcHRpb24+KHt9KTtcblxuICAvLyBPdXRwdXRzXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBzZWdtZW50IGlzIGNsaWNrZWQgKi9cbiAgc2VnbWVudENsaWNrID0gb3V0cHV0PEFYRG9udXRDaGFydERhdGE+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIHNlZ21lbnQgaGFzIG1vdXNlIGhvdmVyXG4gICAqIENhbiBiZSB1c2VkIGJ5IGV4dGVybmFsIGVsZW1lbnRzIHRvIGhpZ2hsaWdodCB0aGlzIHNlZ21lbnRcbiAgICovXG4gIHNlZ21lbnRIb3ZlciA9IG91dHB1dDxBWERvbnV0Q2hhcnREYXRhIHwgbnVsbD4oKTtcblxuICAvLyBDaGFydCBjb250YWluZXIgcmVmZXJlbmNlXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRDb250YWluZXJFbCA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ2NoYXJ0Q29udGFpbmVyJyk7XG5cbiAgLy8gRDMgcmVmZXJlbmNlIC0gbG9hZGVkIGFzeW5jaHJvbm91c2x5XG4gIHByb3RlY3RlZCBkMyE6IHR5cGVvZiBpbXBvcnQoJ2QzJyk7XG5cbiAgLy8gQ2hhcnQgU1ZHIHJlZmVyZW5jZSAodXNpbmcgJ2FueScgc2luY2UgRDMgaXMgbG9hZGVkIGR5bmFtaWNhbGx5IGF0IHJ1bnRpbWUpXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgc3ZnOiBhbnkgPSBudWxsO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHBpZURhdGE6IGFueVtdID0gW107XG5cbiAgLy8gU3RhdGUgbWFuYWdlbWVudFxuICBwcml2YXRlIGhpZGRlblNlZ21lbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgX2luaXRpYWxpemVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfcmVuZGVyZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9pc0luaXRpYWxBbmltYXRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9jdXJyZW50bHlIaWdobGlnaHRlZFNlZ21lbnQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVG9vbHRpcCBzdGF0ZVxuICBwcml2YXRlIF90b29sdGlwVmlzaWJsZSA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBQb3NpdGlvbiA9IHNpZ25hbCh7IHg6IDAsIHk6IDAgfSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBEYXRhID0gc2lnbmFsPEFYQ2hhcnRUb29sdGlwRGF0YT4oe1xuICAgIHRpdGxlOiAnJyxcbiAgICB2YWx1ZTogMCxcbiAgICBwZXJjZW50YWdlOiAnMCUnLFxuICAgIGNvbG9yOiAnJyxcbiAgfSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBSYWZJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3BlbmRpbmdUb29sdGlwQ29vcmRzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAvLyBQdWJsaWMgY29tcHV0ZWQgcHJvcGVydGllcyBmb3IgdGhlIHRlbXBsYXRlXG4gIHByb3RlY3RlZCB0b29sdGlwVmlzaWJsZSA9IHRoaXMuX3Rvb2x0aXBWaXNpYmxlLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBQb3NpdGlvbiA9IHRoaXMuX3Rvb2x0aXBQb3NpdGlvbi5hc1JlYWRvbmx5KCk7XG4gIHByb3RlY3RlZCB0b29sdGlwRGF0YSA9IHRoaXMuX3Rvb2x0aXBEYXRhLmFzUmVhZG9ubHkoKTtcblxuICAvLyBJbmplY3QgY29uZmlndXJhdGlvblxuICBwcml2YXRlIGNvbmZpZ1Rva2VuID0gaW5qZWN0KEFYX0RPTlVUX0NIQVJUX0NPTkZJRyk7XG5cbiAgLy8gSW5qZWN0IHRoZSBjaGFydCBjb2xvcnNcbiAgcHJpdmF0ZSBjaGFydENvbG9ycyA9IGluamVjdChBWF9DSEFSVF9DT0xPUl9QQUxFVFRFKTtcblxuICAvLyBDb21wdXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgcHJvdGVjdGVkIGVmZmVjdGl2ZU9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiBtZXJnZUNoYXJ0T3B0aW9ucyh0aGlzLmNvbmZpZ1Rva2VuLCB0aGlzLm9wdGlvbnMoKSkpO1xuXG4gIC8vIENvbnN0YW50c1xuICBwcml2YXRlIHJlYWRvbmx5IFRPT0xUSVBfR0FQID0gMTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgSElHSExJR0hUX1RSQU5TSVRJT05fRFVSQVRJT04gPSAxNTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgSElHSExJR0hUX1RSQU5TSVRJT05fTkFNRSA9ICdoaWdobGlnaHQnO1xuICBwcml2YXRlIHJlYWRvbmx5IFNFR01FTlRfQU5JTUFUSU9OX0RFTEFZID0gNTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTEFCRUxfQU5JTUFUSU9OX0RFTEFZID0gMjAwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9DSEFSVF9ESU1FTlNJT04gPSAyMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX0NIQVJUX0ZPUl9MQUJFTFMgPSAyNjA7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ0hBUlRfSU5TRVQgPSAxMjtcbiAgcHJpdmF0ZSByZWFkb25seSBESU1NRURfT1BBQ0lUWSA9IDAuNTtcbiAgcHJpdmF0ZSByZWFkb25seSBWSVNJQkxFX09QQUNJVFkgPSAxO1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RhbmNlSWQgPSBjcmVhdGVDaGFydEluc3RhbmNlSWQoJ2F4LWRvbnV0Jyk7XG4gIHByaXZhdGUgZ2V0IHNlZ21lbnRTaGFkb3dGaWx0ZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmluc3RhbmNlSWR9LXNlZ21lbnQtc2hhZG93YDtcbiAgfVxuXG4gIC8vIE1lc3NhZ2VzIHdpdGggZGVmYXVsdHNcbiAgcHJvdGVjdGVkIGVmZmVjdGl2ZU1lc3NhZ2VzID0gY29tcHV0ZWQoKCkgPT5cbiAgICBtZXJnZUNoYXJ0TWVzc2FnZXModGhpcy5jb25maWdUb2tlbi5tZXNzYWdlcywgdGhpcy5vcHRpb25zKCk/Lm1lc3NhZ2VzKSxcbiAgKTtcblxuICAvLyBEYXRhIGFjY2Vzc29yIGZvciBoYW5kbGluZyBkaWZmZXJlbnQgaW5jb21pbmcgZGF0YSBmb3JtYXRzXG4gIHByb3RlY3RlZCBjaGFydERhdGFBcnJheSA9IGNvbXB1dGVkKCgpOiBBWERvbnV0Q2hhcnREYXRhW10gPT4ge1xuICAgIHJldHVybiB0aGlzLmRhdGEoKSB8fCBbXTtcbiAgfSk7XG5cbiAgLy8gQ29sb3IgYWNjZXNzb3IgbWV0aG9kXG4gIHByb3RlY3RlZCBnZXRDb2xvcihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0Q2hhcnRDb2xvcihpbmRleCwgdGhpcy5jaGFydENvbG9ycyk7XG4gIH1cblxuICAvLyBTZWdtZW50IHZpc2liaWxpdHkgY2hlY2tcbiAgcHJvdGVjdGVkIGlzU2VnbWVudEhpZGRlbihpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGlkZGVuU2VnbWVudHMuaGFzKGlkKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gRHluYW1pY2FsbHkgbG9hZCBEMyBhbmQgaW5pdGlhbGl6ZSB0aGUgY2hhcnQgd2hlbiB0aGUgY29tcG9uZW50IGlzIHJlYWR5XG4gICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVkLnNldCh0cnVlKTtcbiAgICAgIHRoaXMubG9hZEQzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFDaGFuZ2VFZmZlY3QgPSBlZmZlY3QoKCkgPT4ge1xuICAgIC8vIFRyYWNrIGRhdGEgYW5kIG9wdGlvbnMgY2hhbmdlc1xuICAgIHRoaXMuZGF0YSgpO1xuICAgIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuXG4gICAgLy8gT25seSB1cGRhdGUgaWYgYWxyZWFkeSByZW5kZXJlZFxuICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fcmVuZGVyZWQoKSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBIaWdobGlnaHRzIGEgc3BlY2lmaWMgc2VnbWVudCBieSBJRFxuICAgKiBAcGFyYW0gaWQgVGhlIHNlZ21lbnQgSUQgdG8gaGlnaGxpZ2h0LCBvciBudWxsIHRvIGNsZWFyIGhpZ2hsaWdodFxuICAgKi9cbiAgaGlnaGxpZ2h0U2VnbWVudChpZDogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcoKSB8fCAhdGhpcy5zdmcpIHJldHVybjtcblxuICAgIGlmICh0aGlzLl9jdXJyZW50bHlIaWdobGlnaHRlZFNlZ21lbnQoKSA9PT0gaWQpIHJldHVybjtcblxuICAgIHRoaXMuX2N1cnJlbnRseUhpZ2hsaWdodGVkU2VnbWVudC5zZXQoaWQpO1xuXG4gICAgLy8gT25seSBpbnRlcnJ1cHQgb25nb2luZyBISUdITElHSFQgdHJhbnNpdGlvbnMgKG5vdCBpbml0aWFsIGFuaW1hdGlvbnMpXG4gICAgdGhpcy5zdmcuc2VsZWN0QWxsKCdwYXRoJykuaW50ZXJydXB0KHRoaXMuSElHSExJR0hUX1RSQU5TSVRJT05fTkFNRSk7XG5cbiAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuY2xlYXJBbGxIaWdobGlnaHRzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCB0YXJnZXRTZWdtZW50ID0gdGhpcy5zdmcuc2VsZWN0QWxsKCdwYXRoJykuZmlsdGVyKChkOiBhbnkpID0+IGQ/LmRhdGE/LmlkID09PSBpZCk7XG5cbiAgICBpZiAodGFyZ2V0U2VnbWVudC5lbXB0eSgpKSB7XG4gICAgICB0aGlzLl9jdXJyZW50bHlIaWdobGlnaHRlZFNlZ21lbnQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5oaWdobGlnaHRTZWdtZW50KG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGltTm9uVGFyZ2V0U2VnbWVudHMoaWQpO1xuICAgIHRoaXMuaGlnaGxpZ2h0VGFyZ2V0U2VnbWVudCh0YXJnZXRTZWdtZW50KTtcbiAgICB0aGlzLnNlZ21lbnRIb3Zlci5lbWl0KHRoaXMuZ2V0U2VnbWVudERhdGFCeUlkKGlkKSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyQWxsSGlnaGxpZ2h0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICB0aGlzLnN2Z1xuICAgICAgLnNlbGVjdEFsbCgncGF0aCcpXG4gICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtaGlnaGxpZ2h0ZWQnLCBmYWxzZSlcbiAgICAgIC5jbGFzc2VkKCdheC1kb251dC1jaGFydC1kaW1tZWQnLCBmYWxzZSlcbiAgICAgIC50cmFuc2l0aW9uKHRoaXMuSElHSExJR0hUX1RSQU5TSVRJT05fTkFNRSlcbiAgICAgIC5kdXJhdGlvbih0aGlzLkhJR0hMSUdIVF9UUkFOU0lUSU9OX0RVUkFUSU9OKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIG51bGwpXG4gICAgICAuc3R5bGUoJ2ZpbHRlcicsIG51bGwpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCB0aGlzLlZJU0lCTEVfT1BBQ0lUWSk7XG5cbiAgICB0aGlzLnNlZ21lbnRIb3Zlci5lbWl0KG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaW1Ob25UYXJnZXRTZWdtZW50cyh0YXJnZXRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN2ZykgcmV0dXJuO1xuXG4gICAgdGhpcy5zdmdcbiAgICAgIC5zZWxlY3RBbGwoJ3BhdGgnKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIC5maWx0ZXIoKGQ6IGFueSkgPT4gZD8uZGF0YT8uaWQgIT09IHRhcmdldElkKVxuICAgICAgLmNsYXNzZWQoJ2F4LWRvbnV0LWNoYXJ0LWhpZ2hsaWdodGVkJywgZmFsc2UpXG4gICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtZGltbWVkJywgdHJ1ZSlcbiAgICAgIC50cmFuc2l0aW9uKHRoaXMuSElHSExJR0hUX1RSQU5TSVRJT05fTkFNRSlcbiAgICAgIC5kdXJhdGlvbih0aGlzLkhJR0hMSUdIVF9UUkFOU0lUSU9OX0RVUkFUSU9OKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIG51bGwpXG4gICAgICAuc3R5bGUoJ2ZpbHRlcicsIG51bGwpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCB0aGlzLkRJTU1FRF9PUEFDSVRZKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgaGlnaGxpZ2h0VGFyZ2V0U2VnbWVudCh0YXJnZXRTZWdtZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0YXJnZXRTZWdtZW50XG4gICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtZGltbWVkJywgZmFsc2UpXG4gICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtaGlnaGxpZ2h0ZWQnLCB0cnVlKVxuICAgICAgLnRyYW5zaXRpb24odGhpcy5ISUdITElHSFRfVFJBTlNJVElPTl9OQU1FKVxuICAgICAgLmR1cmF0aW9uKHRoaXMuSElHSExJR0hUX1RSQU5TSVRJT05fRFVSQVRJT04pXG4gICAgICAuc3R5bGUoJ2ZpbHRlcicsIGB1cmwoIyR7dGhpcy5zZWdtZW50U2hhZG93RmlsdGVySWR9KWApXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCB0aGlzLlZJU0lCTEVfT1BBQ0lUWSk7XG4gIH1cblxuICBwcml2YXRlIGdldFNlZ21lbnREYXRhQnlJZChzZWdtZW50SWQ6IHN0cmluZyk6IEFYRG9udXRDaGFydERhdGEgfCBudWxsIHtcbiAgICByZXR1cm4gdW50cmFja2VkKCgpID0+IHRoaXMuY2hhcnREYXRhQXJyYXkoKSkuZmluZCgoZCkgPT4gZC5pZCA9PT0gc2VnbWVudElkKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdmlzaWJpbGl0eSBvZiBhIHNlZ21lbnQgYnkgSURcbiAgICogQHBhcmFtIGlkIFNlZ21lbnQgSUQgdG8gdG9nZ2xlXG4gICAqIEByZXR1cm5zIE5ldyB2aXNpYmlsaXR5IHN0YXRlICh0cnVlID0gdmlzaWJsZSwgZmFsc2UgPSBoaWRkZW4pXG4gICAqL1xuICB0b2dnbGVTZWdtZW50KGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBjaGFydERhdGEgPSB0aGlzLmNoYXJ0RGF0YUFycmF5KCk7XG4gICAgY29uc3Qgd2FzQWxsSGlkZGVuID0gY2hhcnREYXRhLmxlbmd0aCA+IDAgJiYgY2hhcnREYXRhLmV2ZXJ5KChkKSA9PiB0aGlzLmlzU2VnbWVudEhpZGRlbihkLmlkKSk7XG5cbiAgICBpZiAodGhpcy5oaWRkZW5TZWdtZW50cy5oYXMoaWQpKSB7XG4gICAgICAvLyBNYWtpbmcgYSBzZWdtZW50IHZpc2libGVcbiAgICAgIHRoaXMuaGlkZGVuU2VnbWVudHMuZGVsZXRlKGlkKTtcblxuICAgICAgLy8gSWYgYWxsIHNlZ21lbnRzIHdlcmUgcHJldmlvdXNseSBoaWRkZW4sIHdlIG5lZWQgdG8gZW5zdXJlIHRoZSBtZXNzYWdlIGlzIGNsZWFyZWRcbiAgICAgIGlmICh3YXNBbGxIaWRkZW4pIHtcbiAgICAgICAgLy8gRm9yY2UgY29tcGxldGUgRE9NIGNsZWFudXAgYW5kIHJlZHJhd1xuICAgICAgICBpZiAodGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBDbGVhciBvbmx5IGNoYXJ0IFNWRyBhbmQgbWVzc2FnZSBjb250YWluZXJzIChwcmVzZXJ2ZSB0b29sdGlwIGNvbXBvbmVudClcbiAgICAgICAgICB0aGlzLmQzXG4gICAgICAgICAgICA/LnNlbGVjdCh0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50KVxuICAgICAgICAgICAgLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtZW1wdHksIC5heC1jaGFydC1tZXNzYWdlLWNvbnRhaW5lciwgLmF4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtbWVzc2FnZScpXG4gICAgICAgICAgICAucmVtb3ZlKCk7XG5cbiAgICAgICAgICAvLyBGb3JjZSBmdWxsIHJlZHJhd1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhpZGluZyBhIHNlZ21lbnRcbiAgICAgIHRoaXMuaGlkZGVuU2VnbWVudHMuYWRkKGlkKTtcbiAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gIXRoaXMuaXNTZWdtZW50SGlkZGVuKGlkKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cENoYXJ0KCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgRDMuanMgZHluYW1pY2FsbHlcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkRDMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZDMgPSBhd2FpdCBpbXBvcnQoJ2QzJyk7XG4gICAgICAvLyBJZiBjb250YWluZXIgaXMgcmVhZHksIGNyZWF0ZSBjaGFydFxuICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKCkgJiYgdGhpcy5jaGFydENvbnRhaW5lckVsKCkpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgICB0aGlzLl9yZW5kZXJlZC5zZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIEQzLmpzOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TZWdtZW50Q2xpY2soaXRlbTogQVhEb251dENoYXJ0RGF0YSk6IHZvaWQge1xuICAgIHRoaXMuc2VnbWVudENsaWNrLmVtaXQoaXRlbSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZG9udXQgY2hhcnQgZnJvbSBjdXJyZW50IGRhdGFcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVDaGFydCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZDMgfHwgIXRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICB0aGlzLmNsZWFyQ2hhcnQoY29udGFpbmVyRWxlbWVudCk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNoYXJ0RGF0YUFycmF5KCk7XG4gICAgICBpZiAoIWRhdGEgfHwgZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zaG93Tm9EYXRhTWVzc2FnZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZpc2libGVEYXRhID0gZGF0YS5maWx0ZXIoKGl0ZW0pID0+ICF0aGlzLmhpZGRlblNlZ21lbnRzLmhhcyhpdGVtLmlkKSk7XG4gICAgICBpZiAodmlzaWJsZURhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuc2hvd0FsbFNlZ21lbnRzSGlkZGVuTWVzc2FnZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcbiAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5zZXR1cERpbWVuc2lvbnMoY29udGFpbmVyRWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICB0aGlzLnJlbmRlckRvbnV0Q2hhcnQoY29udGFpbmVyRWxlbWVudCwgd2lkdGgsIGhlaWdodCwgdmlzaWJsZURhdGEpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBjcmVhdGluZyBkb251dCBjaGFydDonLCBlcnJvcik7XG4gICAgICB0aGlzLmhhbmRsZUNoYXJ0RXJyb3IoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY2hhcnQgd2l0aCBuZXcgZGF0YVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIC8vIFJlc2V0IGhpZ2hsaWdodGVkIHNlZ21lbnQgc3RhdGUgd2hlbiB1cGRhdGluZ1xuICAgIHRoaXMuX2N1cnJlbnRseUhpZ2hsaWdodGVkU2VnbWVudC5zZXQobnVsbCk7XG4gICAgdGhpcy5jcmVhdGVDaGFydCgpOyAvLyBSZWNyZWF0ZSB0aGUgY2hhcnQgd2l0aCB1cGRhdGVkIGRhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGNoYXJ0IGNvbnRhaW5lclxuICAgKi9cbiAgcHJpdmF0ZSBjbGVhckNoYXJ0KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLmQzLnNlbGVjdChjb250YWluZXIpLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtZW1wdHksIC5heC1jaGFydC1tZXNzYWdlLWNvbnRhaW5lciwgLmF4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtbWVzc2FnZScpLnJlbW92ZSgpO1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBtZXNzYWdlIHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGVcbiAgICovXG4gIHByaXZhdGUgc2hvd05vRGF0YU1lc3NhZ2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpO1xuICAgIHJlbmRlckNoYXJ0RW1wdHlNZXNzYWdlKHRoaXMuZDMsIHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQsIHtcbiAgICAgIGljb246IG1lc3NhZ2VzLm5vRGF0YUljb24sXG4gICAgICB0aXRsZTogbWVzc2FnZXMubm9EYXRhLFxuICAgICAgaGVscDogbWVzc2FnZXMubm9EYXRhSGVscCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG1lc3NhZ2Ugd2hlbiBhbGwgc2VnbWVudHMgYXJlIGhpZGRlblxuICAgKi9cbiAgcHJpdmF0ZSBzaG93QWxsU2VnbWVudHNIaWRkZW5NZXNzYWdlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcbiAgICBjb25zdCBtZXNzYWdlcyA9IHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKTtcbiAgICByZW5kZXJDaGFydEVtcHR5TWVzc2FnZSh0aGlzLmQzLCB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50LCB7XG4gICAgICBpY29uOiBtZXNzYWdlcy5hbGxIaWRkZW5JY29uLFxuICAgICAgdGl0bGU6IG1lc3NhZ2VzLmFsbEhpZGRlbixcbiAgICAgIGhlbHA6IG1lc3NhZ2VzLmFsbEhpZGRlbkhlbHAsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0dXBzIGNoYXJ0IGRpbWVuc2lvbnMgYmFzZWQgb24gY29udGFpbmVyIGFuZCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIHNldHVwRGltZW5zaW9ucyhjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zOiBBWERvbnV0Q2hhcnRPcHRpb24pOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gTWF0aC5tYXgoY29udGFpbmVyLmNsaWVudFdpZHRoLCAxKTtcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSBNYXRoLm1heChjb250YWluZXIuY2xpZW50SGVpZ2h0LCAxKTtcblxuICAgIGNvbnN0IGRlc2lyZWRXaWR0aCA9IG9wdGlvbnM/LndpZHRoIHx8IGNvbnRhaW5lcldpZHRoO1xuICAgIGNvbnN0IGRlc2lyZWRIZWlnaHQgPSBvcHRpb25zPy5oZWlnaHQgfHwgY29udGFpbmVySGVpZ2h0O1xuICAgIC8vIEtlZXAgZG9udXQgZ2VvbWV0cnkgc3F1YXJlIHNvIHNpZGUgc3BhY2luZyBzdGF5cyB2aXN1YWxseSBiYWxhbmNlZC5cbiAgICBjb25zdCBjaGFydFNpemUgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihkZXNpcmVkV2lkdGgsIGRlc2lyZWRIZWlnaHQpKTtcblxuICAgIHJldHVybiB7IHdpZHRoOiBjaGFydFNpemUsIGhlaWdodDogY2hhcnRTaXplIH07XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgZG9udXQgY2hhcnQgd2l0aCB2aXNpYmxlIGRhdGFcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyRG9udXRDaGFydChcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgdmlzaWJsZURhdGE6IEFYRG9udXRDaGFydERhdGFbXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZGlzcGxheVRvdGFsID0gdGhpcy5nZXREaXNwbGF5VG90YWwodmlzaWJsZURhdGEpO1xuICAgIGNvbnN0IGxheW91dFRvdGFsID0gdGhpcy5nZXRMYXlvdXRUb3RhbCh2aXNpYmxlRGF0YSk7XG5cbiAgICAvLyBDcmVhdGUgU1ZHIGNvbnRhaW5lciB3aXRoIGZpbHRlcnNcbiAgICBjb25zdCBzdmcgPSB0aGlzLmNyZWF0ZVN2Z1dpdGhGaWx0ZXJzKGNvbnRhaW5lciwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAvLyBDcmVhdGUgbWFpbiBjaGFydCBncm91cFxuICAgIHRoaXMuc3ZnID0gc3ZnLmFwcGVuZCgnZycpLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt3aWR0aCAvIDJ9LCAke2hlaWdodCAvIDJ9KWApO1xuXG4gICAgLy8gQ3JlYXRlIGRvbnV0IHNlZ21lbnRzXG4gICAgdGhpcy5jcmVhdGVEb251dFNlZ21lbnRzKHdpZHRoLCBoZWlnaHQsIHZpc2libGVEYXRhLCBsYXlvdXRUb3RhbCk7XG5cbiAgICAvLyBBZGQgdG90YWwgaW4gY2VudGVyXG4gICAgdGhpcy5hZGRDZW50ZXJEaXNwbGF5KGRpc3BsYXlUb3RhbCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFNWRyBlbGVtZW50IHdpdGggZmlsdGVyIGRlZmluaXRpb25zIGZvciBzaGFkb3dzXG4gICAqIEByZXR1cm5zIEQzIFNWRyBzZWxlY3Rpb24gKGFueSB0eXBlIGR1ZSB0byBkeW5hbWljIEQzIGxvYWRpbmcpXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIGNyZWF0ZVN2Z1dpdGhGaWx0ZXJzKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogYW55IHtcbiAgICBjb25zdCBzdmcgPSB0aGlzLmQzXG4gICAgICAuc2VsZWN0KGNvbnRhaW5lcilcbiAgICAgIC5hcHBlbmQoJ3N2ZycpXG4gICAgICAuYXR0cignd2lkdGgnLCAnMTAwJScpXG4gICAgICAuYXR0cignaGVpZ2h0JywgJzEwMCUnKVxuICAgICAgLmF0dHIoJ3ZpZXdCb3gnLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApXG4gICAgICAuYXR0cigncHJlc2VydmVBc3BlY3RSYXRpbycsICd4TWlkWU1pZCBtZWV0Jyk7XG5cbiAgICAvLyBBZGQgZHJvcCBzaGFkb3cgZmlsdGVyXG4gICAgY29uc3QgZGVmcyA9IHN2Zy5hcHBlbmQoJ2RlZnMnKTtcbiAgICBjb25zdCBmaWx0ZXIgPSBkZWZzLmFwcGVuZCgnZmlsdGVyJykuYXR0cignaWQnLCB0aGlzLnNlZ21lbnRTaGFkb3dGaWx0ZXJJZCkuYXR0cignaGVpZ2h0JywgJzEzMCUnKTtcblxuICAgIGZpbHRlci5hcHBlbmQoJ2ZlR2F1c3NpYW5CbHVyJykuYXR0cignaW4nLCAnU291cmNlQWxwaGEnKS5hdHRyKCdzdGREZXZpYXRpb24nLCAyKS5hdHRyKCdyZXN1bHQnLCAnYmx1cicpO1xuICAgIGZpbHRlci5hcHBlbmQoJ2ZlT2Zmc2V0JykuYXR0cignaW4nLCAnYmx1cicpLmF0dHIoJ2R4JywgMSkuYXR0cignZHknLCAxKS5hdHRyKCdyZXN1bHQnLCAnb2Zmc2V0Qmx1cicpO1xuXG4gICAgY29uc3QgZmVDb21wb25lbnRUcmFuc2ZlciA9IGZpbHRlclxuICAgICAgLmFwcGVuZCgnZmVDb21wb25lbnRUcmFuc2ZlcicpXG4gICAgICAuYXR0cignaW4nLCAnb2Zmc2V0Qmx1cicpXG4gICAgICAuYXR0cigncmVzdWx0JywgJ29mZnNldEJsdXInKTtcblxuICAgIGZlQ29tcG9uZW50VHJhbnNmZXIuYXBwZW5kKCdmZUZ1bmNBJykuYXR0cigndHlwZScsICdsaW5lYXInKS5hdHRyKCdzbG9wZScsIDAuMyk7XG5cbiAgICBjb25zdCBmZU1lcmdlID0gZmlsdGVyLmFwcGVuZCgnZmVNZXJnZScpO1xuICAgIGZlTWVyZ2UuYXBwZW5kKCdmZU1lcmdlTm9kZScpLmF0dHIoJ2luJywgJ29mZnNldEJsdXInKTtcbiAgICBmZU1lcmdlLmFwcGVuZCgnZmVNZXJnZU5vZGUnKS5hdHRyKCdpbicsICdTb3VyY2VHcmFwaGljJyk7XG5cbiAgICByZXR1cm4gc3ZnO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbmQgcmVuZGVyIHRoZSBkb251dCBzZWdtZW50cyB3aXRoIGFuaW1hdGlvbnNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRG9udXRTZWdtZW50cyhcbiAgICBjaGFydFdpZHRoOiBudW1iZXIsXG4gICAgY2hhcnRIZWlnaHQ6IG51bWJlcixcbiAgICBkYXRhOiBBWERvbnV0Q2hhcnREYXRhW10sXG4gICAgbGF5b3V0VG90YWw6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5faXNJbml0aWFsQW5pbWF0aW5nLnNldCh0cnVlKTtcblxuICAgIC8vIENyZWF0ZSBwaWUgbGF5b3V0XG4gICAgY29uc3QgcGllID0gdGhpcy5kM1xuICAgICAgLnBpZTxBWERvbnV0Q2hhcnREYXRhPigpXG4gICAgICAudmFsdWUoKGQpID0+IHRoaXMuZ2V0U2VnbWVudExheW91dFZhbHVlKGQudmFsdWUpKVxuICAgICAgLnNvcnQobnVsbClcbiAgICAgIC5wYWRBbmdsZSgwLjAyKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgcmFkaXVzIG9mIHRoZSBkb251dCBjaGFydFxuICAgIGNvbnN0IG1heFJhZGl1cyA9IE1hdGgubWluKGNoYXJ0V2lkdGgsIGNoYXJ0SGVpZ2h0KSAvIDI7XG4gICAgY29uc3QgcmFkaXVzID0gTWF0aC5tYXgoMCwgbWF4UmFkaXVzIC0gdGhpcy5DSEFSVF9JTlNFVCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgaW5uZXIgcmFkaXVzIGJhc2VkIG9uIGRvbnV0V2lkdGggcGVyY2VudGFnZVxuICAgIGNvbnN0IGRvbnV0V2lkdGhQZXJjZW50ID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuZG9udXRXaWR0aCAvIDEwMDtcbiAgICBjb25zdCBpbm5lclJhZGl1cyA9IHJhZGl1cyAqICgxIC0gZG9udXRXaWR0aFBlcmNlbnQpO1xuXG4gICAgY29uc3Qgb3V0ZXJSYWRpdXMgPSByYWRpdXMgKiAwLjk1O1xuICAgIGNvbnN0IHJpbmdXaWR0aCA9IG91dGVyUmFkaXVzIC0gaW5uZXJSYWRpdXM7XG5cbiAgICBjb25zdCBhcmMgPSB0aGlzLmQzXG4gICAgICAuYXJjKClcbiAgICAgIC5pbm5lclJhZGl1cyhpbm5lclJhZGl1cylcbiAgICAgIC5vdXRlclJhZGl1cyhvdXRlclJhZGl1cylcbiAgICAgIC5jb3JuZXJSYWRpdXModGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuY29ybmVyUmFkaXVzKTtcblxuICAgIGNvbnN0IGxhYmVsQXJjID0gdGhpcy5kM1xuICAgICAgLmFyYygpXG4gICAgICAuaW5uZXJSYWRpdXMoaW5uZXJSYWRpdXMgKyByaW5nV2lkdGggLyAyKVxuICAgICAgLm91dGVyUmFkaXVzKGlubmVyUmFkaXVzICsgcmluZ1dpZHRoIC8gMik7XG5cbiAgICAvLyBHZXQgYW5pbWF0aW9uIG9wdGlvbnNcbiAgICBjb25zdCBhbmltYXRpb25EdXJhdGlvbiA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIGNvbnN0IGFuaW1hdGlvbkVhc2luZyA9IGdldEVhc2luZ0Z1bmN0aW9uKHRoaXMuZDMsIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkVhc2luZyk7XG5cbiAgICAvLyBHZW5lcmF0ZSBwaWUgZGF0YVxuICAgIHRoaXMucGllRGF0YSA9IHBpZShkYXRhKTtcblxuICAgIC8vIEFkZCBzZWdtZW50cyB3aXRoIGFuaW1hdGlvblxuICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5zdmdcbiAgICAgIC5zZWxlY3RBbGwoJ3BhdGgnKVxuICAgICAgLmRhdGEodGhpcy5waWVEYXRhKVxuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWRvbnV0LWNoYXJ0LXNlZ21lbnQnKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIC5hdHRyKCdmaWxsJywgKGQ6IGFueSkgPT4gdGhpcy5nZXRTZWdtZW50Q29sb3IoZC5kYXRhKSlcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApXG4gICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJylcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAub24oJ21vdXNlZW50ZXInLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd1Rvb2x0aXApIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVNsaWNlSG92ZXIoZXZlbnQsIGQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAub24oJ21vdXNlbGVhdmUnLCAoKSA9PiB0aGlzLmhhbmRsZVNlZ21lbnRMZWF2ZSgpKVxuICAgICAgLm9uKCdtb3VzZW1vdmUnLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3Rvb2x0aXBWaXNpYmxlKCkpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgLm9uKCdjbGljaycsIChfZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uU2VnbWVudENsaWNrKGQuZGF0YSk7XG4gICAgICB9KTtcblxuICAgIC8vIEFuaW1hdGUgc2VnbWVudHNcbiAgICBjb25zdCBudW1TZWdtZW50cyA9IHRoaXMucGllRGF0YS5sZW5ndGg7XG4gICAgbGV0IGNvbXBsZXRlZCA9IDA7XG4gICAgc2VnbWVudHNcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgIC5lYXNlKGFuaW1hdGlvbkVhc2luZylcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAuZGVsYXkoKF9kOiBhbnksIGk6IG51bWJlcikgPT4gaSAqIHRoaXMuU0VHTUVOVF9BTklNQVRJT05fREVMQVkpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCB0aGlzLlZJU0lCTEVfT1BBQ0lUWSlcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAuYXR0clR3ZWVuKCdkJywgKGQ6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZSA9IHRoaXMuZDMuaW50ZXJwb2xhdGUoeyBzdGFydEFuZ2xlOiBkLnN0YXJ0QW5nbGUsIGVuZEFuZ2xlOiBkLnN0YXJ0QW5nbGUgfSwgZCk7XG4gICAgICAgIHJldHVybiAodDogbnVtYmVyKSA9PiBhcmMoaW50ZXJwb2xhdGUodCkpIGFzIHN0cmluZztcbiAgICAgIH0pXG4gICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgY29tcGxldGVkKys7XG4gICAgICAgIGlmIChjb21wbGV0ZWQgPj0gbnVtU2VnbWVudHMpIHtcbiAgICAgICAgICB0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAub24oJ2ludGVycnVwdCcsICgpID0+IHtcbiAgICAgICAgLy8gVHJlYXQgaW50ZXJydXB0cyBhcyBjb21wbGV0aW9uIHRvIGF2b2lkIGdldHRpbmcgc3R1Y2sgaW4gYW5pbWF0aW5nIHN0YXRlXG4gICAgICAgIGNvbXBsZXRlZCsrO1xuICAgICAgICBpZiAoY29tcGxldGVkID49IG51bVNlZ21lbnRzKSB7XG4gICAgICAgICAgdGhpcy5faXNJbml0aWFsQW5pbWF0aW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIC8vIEFkZCBkYXRhIGxhYmVscyBpZiBlbmFibGVkIGFuZCBjaGFydCBzaXplIGlzIHN1ZmZpY2llbnRcbiAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd0RhdGFMYWJlbHMgJiYgdGhpcy5pc0NoYXJ0TGFyZ2VFbm91Z2hGb3JMYWJlbHMoY2hhcnRXaWR0aCwgY2hhcnRIZWlnaHQpKSB7XG4gICAgICB0aGlzLmFkZERhdGFMYWJlbHMobGFiZWxBcmMsIG91dGVyUmFkaXVzLCBpbm5lclJhZGl1cywgbGF5b3V0VG90YWwsIGFuaW1hdGlvbkR1cmF0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgd2hlbiBhbGwgc2VnbWVudCBhbmltYXRpb25zIGFyZSBjb21wbGV0ZSAoaGFuZGxlIGVtcHR5IGNhc2UpXG4gICAgaWYgKG51bVNlZ21lbnRzID09PSAwKSB7XG4gICAgICB0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzQ2hhcnRMYXJnZUVub3VnaEZvckxhYmVscyh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KSA+PSB0aGlzLk1JTl9DSEFSVF9GT1JfTEFCRUxTO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBhZGREYXRhTGFiZWxzKFxuICAgIGxhYmVsQXJjOiBhbnksXG4gICAgb3V0ZXJSYWRpdXM6IG51bWJlcixcbiAgICBpbm5lclJhZGl1czogbnVtYmVyLFxuICAgIGxheW91dFRvdGFsOiBudW1iZXIsXG4gICAgYW5pbWF0aW9uRHVyYXRpb246IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN2ZykgcmV0dXJuO1xuXG4gICAgY29uc3QgZGF0YVdpdGhMYWJlbHMgPSB0aGlzLnBpZURhdGEuZmlsdGVyKChkKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVMYWJlbEZvbnRTaXplKGQsIG91dGVyUmFkaXVzLCBpbm5lclJhZGl1cywgbGF5b3V0VG90YWwpID4gMDtcbiAgICB9KTtcblxuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuc3ZnXG4gICAgICAuc2VsZWN0QWxsKCcuYXgtZG9udXQtY2hhcnQtZGF0YS1sYWJlbCcpXG4gICAgICAuZGF0YShkYXRhV2l0aExhYmVscylcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1kb251dC1jaGFydC1kYXRhLWxhYmVsJylcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApXG4gICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWRvbnV0LWNoYXJ0LWRhdGEtbGFiZWxzLWNvbG9yKSknKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIChkKSA9PiB7XG4gICAgICAgIGNvbnN0IGNlbnRyb2lkID0gbGFiZWxBcmMuY2VudHJvaWQoZCk7XG4gICAgICAgIHJldHVybiBgdHJhbnNsYXRlKCR7Y2VudHJvaWRbMF19LCAke2NlbnRyb2lkWzFdfSlgO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIChkKSA9PiBgJHt0aGlzLmNhbGN1bGF0ZUxhYmVsRm9udFNpemUoZCwgb3V0ZXJSYWRpdXMsIGlubmVyUmFkaXVzLCBsYXlvdXRUb3RhbCl9cHhgKVxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsIChkKSA9PiAodGhpcy5nZXRTZWdtZW50UGVyY2VudGFnZShkLmRhdGEudmFsdWUsIGxheW91dFRvdGFsKSA+PSAxNSA/ICc2MDAnIDogJzUwMCcpKVxuICAgICAgLnRleHQoKGQpID0+IHRoaXMuZ2V0VHJ1bmNhdGVkTGFiZWxUZXh0KGQsIG91dGVyUmFkaXVzLCBpbm5lclJhZGl1cywgbGF5b3V0VG90YWwpKTtcblxuICAgIGxhYmVsc1xuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgLmRlbGF5KChfZCwgaTogbnVtYmVyKSA9PiBpICogdGhpcy5TRUdNRU5UX0FOSU1BVElPTl9ERUxBWSArIHRoaXMuTEFCRUxfQU5JTUFUSU9OX0RFTEFZKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgdGhpcy5WSVNJQkxFX09QQUNJVFkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgZm9udCBzaXplIGZvciBkYXRhIGxhYmVscyB1c2luZyB0aGUgZG9udXQgcmluZydzIHBoeXNpY2FsIGRpbWVuc2lvbnMuXG4gICAqXG4gICAqIFByaW1hcnkgZHJpdmVyIGlzIHRoZSByaW5nIHdpZHRoIChyYWRpYWwgc3BhY2UpLCB3aXRoIGNob3JkIGxlbmd0aCBhcyBhblxuICAgKiBvdmVyZmxvdyBndWFyZCBhbmQgYSBnZW50bGUgc2NhbGUtZG93biBmb3Igc21hbGxlciBzZWdtZW50cyB0byBjcmVhdGVcbiAgICogdmlzdWFsIGhpZXJhcmNoeS5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgY2FsY3VsYXRlTGFiZWxGb250U2l6ZShkOiBhbnksIG91dGVyUmFkaXVzOiBudW1iZXIsIGlubmVyUmFkaXVzOiBudW1iZXIsIGxheW91dFRvdGFsOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGFuZ2xlID0gZC5lbmRBbmdsZSAtIGQuc3RhcnRBbmdsZTtcbiAgICBjb25zdCBzZWdtZW50UGVyY2VudGFnZSA9IHRoaXMuZ2V0U2VnbWVudFBlcmNlbnRhZ2UoZC5kYXRhLnZhbHVlLCBsYXlvdXRUb3RhbCk7XG5cbiAgICBpZiAoc2VnbWVudFBlcmNlbnRhZ2UgPCAyKSByZXR1cm4gMDtcblxuICAgIGNvbnN0IHJpbmdXaWR0aCA9IG91dGVyUmFkaXVzIC0gaW5uZXJSYWRpdXM7XG4gICAgY29uc3QgbGFiZWxSYWRpdXMgPSBpbm5lclJhZGl1cyArIHJpbmdXaWR0aCAvIDI7XG4gICAgY29uc3QgY2hvcmRMZW5ndGggPSAyICogbGFiZWxSYWRpdXMgKiBNYXRoLnNpbihhbmdsZSAvIDIpO1xuXG4gICAgY29uc3QgTUlOX0NIT1JEID0gMjI7XG4gICAgY29uc3QgTUlOX1JJTkcgPSAxNjtcbiAgICBpZiAoY2hvcmRMZW5ndGggPCBNSU5fQ0hPUkQgfHwgcmluZ1dpZHRoIDwgTUlOX1JJTkcpIHJldHVybiAwO1xuXG4gICAgY29uc3QgcmluZ0Jhc2VkU2l6ZSA9IHJpbmdXaWR0aCAqIDAuNDg7XG5cbiAgICAvLyBTZWdtZW50cyA+PSAyMCUgZ2V0IGZ1bGwgc2l6ZTsgc21hbGxlciBvbmVzIHNjYWxlIGZyb20gMC43NSDihpIgMS4wXG4gICAgY29uc3Qgc2VnbWVudFNjYWxlID0gTWF0aC5taW4oMSwgMC43NSArIDAuMjUgKiAoc2VnbWVudFBlcmNlbnRhZ2UgLyAyMCkpO1xuXG4gICAgLy8gQXQgbGVhc3QgMiBjaGFyYWN0ZXJzIChcIlglXCIpIG11c3QgZml0IGhvcml6b250YWxseVxuICAgIGNvbnN0IG1heEJ5Q2hvcmQgPSBjaG9yZExlbmd0aCAvICgyICogMC42NSk7XG5cbiAgICBjb25zdCBmb250U2l6ZSA9IE1hdGgubWluKHJpbmdCYXNlZFNpemUgKiBzZWdtZW50U2NhbGUsIG1heEJ5Q2hvcmQpO1xuXG4gICAgY29uc3QgTUlOX0ZPTlRfU0laRSA9IDExO1xuICAgIGNvbnN0IE1BWF9GT05UX1NJWkUgPSAyMDtcblxuICAgIHJldHVybiBNYXRoLnJvdW5kKE1hdGgubWF4KE1JTl9GT05UX1NJWkUsIE1hdGgubWluKGZvbnRTaXplLCBNQVhfRk9OVF9TSVpFKSkgKiAyKSAvIDI7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFBlcmNlbnRhZ2UodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlIDwgMSkgcmV0dXJuICc8MSUnO1xuICAgIGlmICh2YWx1ZSA8IDEwKSByZXR1cm4gYCR7dmFsdWUudG9GaXhlZCgxKX0lYDtcbiAgICByZXR1cm4gYCR7TWF0aC5yb3VuZCh2YWx1ZSl9JWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYmVzdC1maXQgbGFiZWwgdGV4dCBmb3IgYSBzZWdtZW50LCBwcm9ncmVzc2l2ZWx5IHRydW5jYXRpbmdcbiAgICogZnJvbSBcIkxhYmVsIChYWCUpXCIg4oaSIFwiTGFiZWxcIiDihpIgXCJYWCVcIiDihpIgdHJ1bmNhdGVkIGxhYmVsIOKGkiB0cnVuY2F0ZWQgcGVyY2VudGFnZS5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgZ2V0VHJ1bmNhdGVkTGFiZWxUZXh0KGQ6IGFueSwgb3V0ZXJSYWRpdXM6IG51bWJlciwgaW5uZXJSYWRpdXM6IG51bWJlciwgbGF5b3V0VG90YWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgZm9udFNpemUgPSB0aGlzLmNhbGN1bGF0ZUxhYmVsRm9udFNpemUoZCwgb3V0ZXJSYWRpdXMsIGlubmVyUmFkaXVzLCBsYXlvdXRUb3RhbCk7XG4gICAgaWYgKGZvbnRTaXplID09PSAwKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCByaW5nV2lkdGggPSBvdXRlclJhZGl1cyAtIGlubmVyUmFkaXVzO1xuICAgIGNvbnN0IGxhYmVsUmFkaXVzID0gaW5uZXJSYWRpdXMgKyByaW5nV2lkdGggLyAyO1xuICAgIGNvbnN0IGFuZ2xlID0gZC5lbmRBbmdsZSAtIGQuc3RhcnRBbmdsZTtcbiAgICBjb25zdCBjaG9yZExlbmd0aCA9IDIgKiBsYWJlbFJhZGl1cyAqIE1hdGguc2luKGFuZ2xlIC8gMik7XG4gICAgY29uc3QgYXZhaWxhYmxlV2lkdGggPSBjaG9yZExlbmd0aCAqIDAuODtcblxuICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSB0aGlzLmdldFNlZ21lbnRQZXJjZW50YWdlKGQuZGF0YS52YWx1ZSwgbGF5b3V0VG90YWwpO1xuICAgIGlmIChwZXJjZW50YWdlIDwgMikgcmV0dXJuICcnO1xuXG4gICAgY29uc3QgbGFiZWwgPSBkLmRhdGEubGFiZWwgfHwgJyc7XG4gICAgY29uc3QgcGVyY2VudGFnZVRleHQgPSB0aGlzLmZvcm1hdFBlcmNlbnRhZ2UocGVyY2VudGFnZSk7XG4gICAgY29uc3QgZnVsbFRleHQgPSBsYWJlbCA/IGAke2xhYmVsfSAoJHtwZXJjZW50YWdlVGV4dH0pYCA6IHBlcmNlbnRhZ2VUZXh0O1xuXG4gICAgaWYgKHRoaXMuZG9lc1RleHRGaXQoZnVsbFRleHQsIGZvbnRTaXplLCBhdmFpbGFibGVXaWR0aCkpIHJldHVybiBmdWxsVGV4dDtcbiAgICBpZiAobGFiZWwgJiYgdGhpcy5kb2VzVGV4dEZpdChsYWJlbCwgZm9udFNpemUsIGF2YWlsYWJsZVdpZHRoKSkgcmV0dXJuIGxhYmVsO1xuICAgIGlmICh0aGlzLmRvZXNUZXh0Rml0KHBlcmNlbnRhZ2VUZXh0LCBmb250U2l6ZSwgYXZhaWxhYmxlV2lkdGgpKSByZXR1cm4gcGVyY2VudGFnZVRleHQ7XG4gICAgaWYgKGxhYmVsKSByZXR1cm4gdGhpcy50cnVuY2F0ZVRleHRUb0ZpdChsYWJlbCwgZm9udFNpemUsIGF2YWlsYWJsZVdpZHRoKTtcbiAgICByZXR1cm4gdGhpcy50cnVuY2F0ZVRleHRUb0ZpdChwZXJjZW50YWdlVGV4dCwgZm9udFNpemUsIGF2YWlsYWJsZVdpZHRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGV4dCBmaXRzIHdpdGhpbiBhdmFpbGFibGUgd2lkdGggdXNpbmcgY29uc2VydmF0aXZlIGVzdGltYXRpb25cbiAgICogVXNlcyAwLjY1ZW0gcGVyIGNoYXJhY3RlciB0byBhY2NvdW50IGZvciBmb250IHZhcmlhdGlvbnNcbiAgICovXG4gIHByaXZhdGUgZG9lc1RleHRGaXQodGV4dDogc3RyaW5nLCBmb250U2l6ZTogbnVtYmVyLCBhdmFpbGFibGVXaWR0aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gZmFsc2U7XG4gICAgXG4gICAgLy8gVXNlIGNvbnNlcnZhdGl2ZSBjaGFyYWN0ZXIgd2lkdGggKDAuNjVlbSBmb3Igc2FmZXR5KVxuICAgIC8vIFdpZGVyIGZvbnRzIGxpa2UgYm9sZCB0ZXh0IG5lZWQgbW9yZSBzcGFjZVxuICAgIGNvbnN0IGVzdGltYXRlZFdpZHRoID0gdGV4dC5sZW5ndGggKiBmb250U2l6ZSAqIDAuNjU7XG4gICAgcmV0dXJuIGVzdGltYXRlZFdpZHRoIDw9IGF2YWlsYWJsZVdpZHRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFRydW5jYXRlcyB0ZXh0IHRvIGZpdCB3aXRoaW4gYXZhaWxhYmxlIHdpZHRoIHdpdGggZWxsaXBzaXNcbiAgICogVXNlcyBjb25zZXJ2YXRpdmUgY2hhcmFjdGVyIHdpZHRoIHRvIHByZXZlbnQgb3ZlcmZsb3dcbiAgICogQWRhcHRzIGNoYXJhY3RlciB3aWR0aCBlc3RpbWF0aW9uIGJhc2VkIG9uIGZvbnQgc2l6ZVxuICAgKi9cbiAgcHJpdmF0ZSB0cnVuY2F0ZVRleHRUb0ZpdCh0ZXh0OiBzdHJpbmcsIGZvbnRTaXplOiBudW1iZXIsIGF2YWlsYWJsZVdpZHRoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dCkgcmV0dXJuICcnO1xuICAgIFxuICAgIC8vIEFkYXB0aXZlIGNoYXJhY3RlciB3aWR0aDogc21hbGxlciBmb250cyBhcmUgcmVsYXRpdmVseSB3aWRlclxuICAgIC8vIExhcmdlciBmb250czogfjAuNmVtLCBTbWFsbGVyIGZvbnRzOiB+MC43ZW1cbiAgICBjb25zdCBjaGFyV2lkdGhSYXRpbyA9IGZvbnRTaXplIDw9IDEwID8gMC43IDogMC42NTtcbiAgICBjb25zdCBjaGFyV2lkdGggPSBmb250U2l6ZSAqIGNoYXJXaWR0aFJhdGlvO1xuICAgIFxuICAgIC8vIFJlc2VydmUgc3BhY2UgZm9yIGVsbGlwc2lzXG4gICAgY29uc3QgZWxsaXBzaXNXaWR0aCA9IGZvbnRTaXplICogMC43O1xuICAgIGNvbnN0IGF2YWlsYWJsZUZvclRleHQgPSBhdmFpbGFibGVXaWR0aCAtIGVsbGlwc2lzV2lkdGg7XG4gICAgXG4gICAgaWYgKGF2YWlsYWJsZUZvclRleHQgPD0gMCkgcmV0dXJuICcnO1xuICAgIFxuICAgIGNvbnN0IG1heENoYXJzID0gTWF0aC5mbG9vcihhdmFpbGFibGVGb3JUZXh0IC8gY2hhcldpZHRoKTtcbiAgICBcbiAgICBpZiAobWF4Q2hhcnMgPD0gMCkgcmV0dXJuICcnO1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA8PSBtYXhDaGFycykgcmV0dXJuIHRleHQ7XG4gICAgXG4gICAgLy8gRW5zdXJlIGF0IGxlYXN0IDEgY2hhcmFjdGVyIGJlZm9yZSBlbGxpcHNpc1xuICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZygwLCBNYXRoLm1heCgxLCBtYXhDaGFycykpICsgJ+KApic7XG4gIH1cblxuICBwcml2YXRlIGdldFNlZ21lbnRDb2xvcihkYXRhOiBBWERvbnV0Q2hhcnREYXRhKTogc3RyaW5nIHtcbiAgICBpZiAoZGF0YS5jb2xvcikgcmV0dXJuIGRhdGEuY29sb3I7XG5cbiAgICBjb25zdCBvcmlnaW5hbEZ1bGxEYXRhID0gdW50cmFja2VkKCgpID0+IHRoaXMuY2hhcnREYXRhQXJyYXkoKSk7XG4gICAgY29uc3Qgb3JpZ2luYWxJbmRleCA9IG9yaWdpbmFsRnVsbERhdGEuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBkYXRhLmlkKTtcbiAgICBcbiAgICByZXR1cm4gdGhpcy5nZXRDb2xvcihvcmlnaW5hbEluZGV4ICE9PSAtMSA/IG9yaWdpbmFsSW5kZXggOiAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgaG92ZXIgZWZmZWN0cyBvbiBhIHNlZ21lbnRcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlU2xpY2VIb3ZlcihldmVudDogTW91c2VFdmVudCwgZGF0dW06IEFYRG9udXRDaGFydERhdGEpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faXNJbml0aWFsQW5pbWF0aW5nKCkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93VG9vbHRpcCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuc2hvd1Rvb2x0aXAoZXZlbnQsIGRhdHVtKTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5oaWdobGlnaHRTZWdtZW50KGRhdHVtLmlkKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd1Rvb2x0aXAoZXZlbnQ6IE1vdXNlRXZlbnQsIGRhdHVtOiBBWERvbnV0Q2hhcnREYXRhKTogdm9pZCB7XG4gICAgY29uc3QgdmlzaWJsZURhdGEgPSB1bnRyYWNrZWQoKCkgPT4gdGhpcy5jaGFydERhdGFBcnJheSgpKS5maWx0ZXIoKGl0ZW0pID0+ICF0aGlzLmhpZGRlblNlZ21lbnRzLmhhcyhpdGVtLmlkKSk7XG4gICAgY29uc3QgbGF5b3V0VG90YWwgPSB0aGlzLmdldExheW91dFRvdGFsKHZpc2libGVEYXRhKTtcbiAgICBjb25zdCBwZXJjZW50YWdlID1cbiAgICAgIGxheW91dFRvdGFsID4gMCA/IHRoaXMuZ2V0U2VnbWVudFBlcmNlbnRhZ2UoZGF0dW0udmFsdWUsIGxheW91dFRvdGFsKS50b0ZpeGVkKDEpIDogJzAnO1xuICAgIGNvbnN0IGNvbG9yID0gdGhpcy5nZXRTZWdtZW50Q29sb3IoZGF0dW0pO1xuXG4gICAgdGhpcy5fdG9vbHRpcERhdGEuc2V0KHtcbiAgICAgIHRpdGxlOiBkYXR1bS50b29sdGlwTGFiZWwgfHwgZGF0dW0ubGFiZWwsXG4gICAgICB2YWx1ZTogZGF0dW0udmFsdWUudG9TdHJpbmcoKSxcbiAgICAgIHBlcmNlbnRhZ2U6IGAke3BlcmNlbnRhZ2V9JWAsXG4gICAgICBjb2xvcixcbiAgICB9KTtcblxuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldCh0cnVlKTtcbiAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBtb3VzZSBsZWF2ZSBmcm9tIHNlZ21lbnRzXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVNlZ21lbnRMZWF2ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faXNJbml0aWFsQW5pbWF0aW5nKCkpIHJldHVybjtcblxuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gICAgdGhpcy5oaWdobGlnaHRTZWdtZW50KG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9wZW5kaW5nVG9vbHRpcENvb3JkcyA9IHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9O1xuICAgIGlmICh0aGlzLl90b29sdGlwUmFmSWQgIT0gbnVsbCkgcmV0dXJuO1xuICAgIHRoaXMuc2NoZWR1bGVUb29sdGlwUG9zaXRpb24oMCk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlVG9vbHRpcFBvc2l0aW9uKGF0dGVtcHQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3Rvb2x0aXBSYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBjb25zdCBjb29yZHMgPSB0aGlzLl9wZW5kaW5nVG9vbHRpcENvb3JkcztcbiAgICAgIGlmICghY29vcmRzKSB7XG4gICAgICAgIHRoaXMuX3Rvb2x0aXBSYWZJZCA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghY29udGFpbmVyRWwpIHtcbiAgICAgICAgdGhpcy5fdG9vbHRpcFJhZklkID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0b29sdGlwRWwgPSBjb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcuY2hhcnQtdG9vbHRpcCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmICghdG9vbHRpcEVsICYmIHRoaXMuX3Rvb2x0aXBWaXNpYmxlKCkgJiYgYXR0ZW1wdCA8IDMpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVRvb2x0aXBQb3NpdGlvbihhdHRlbXB0ICsgMSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdG9vbHRpcFJhZklkID0gbnVsbDtcbiAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSBjb250YWluZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHRvb2x0aXBSZWN0ID0gdG9vbHRpcEVsID8gdG9vbHRpcEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogbnVsbDtcbiAgICAgIGNvbnN0IHBvcyA9IGNvbXB1dGVUb29sdGlwUG9zaXRpb24oY29udGFpbmVyUmVjdCwgdG9vbHRpcFJlY3QsIGNvb3Jkcy54LCBjb29yZHMueSwgdGhpcy5UT09MVElQX0dBUCk7XG4gICAgICB0aGlzLl90b29sdGlwUG9zaXRpb24uc2V0KHBvcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBjZW50ZXIgZGlzcGxheSB3aXRoIHRvdGFsIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGFkZENlbnRlckRpc3BsYXkoZGlzcGxheVRvdGFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICBjb25zdCBjaGFydENvbnRhaW5lcldpZHRoID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAvLyBJbXByb3ZlZCBmb250IHNjYWxpbmc6IGJldHRlciBtaW5pbXVtIGZvciBzbWFsbCBzaXplcywgYmV0dGVyIHJhdGlvIGZvciBzY2FsaW5nXG4gICAgY29uc3QgYmFzZUZvbnRTaXplID0gTWF0aC5tYXgoMS44LCBNYXRoLm1pbigzLjIsIGNoYXJ0Q29udGFpbmVyV2lkdGggLyAxNTApKTtcbiAgICBjb25zdCBzdWJUZXh0Rm9udFNpemUgPSBiYXNlRm9udFNpemUgKiAwLjU7XG5cbiAgICAvLyBDcmVhdGUgZ3JvdXAgZm9yIHRoZSB0b3RhbCBkaXNwbGF5XG4gICAgY29uc3QgdG90YWxEaXNwbGF5ID0gdGhpcy5zdmdcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWRvbnV0LWNoYXJ0LXRvdGFsLWRpc3BsYXknKVxuICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpO1xuXG4gICAgLy8gQWRkIHRvdGFsIHZhbHVlXG4gICAgdG90YWxEaXNwbGF5XG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1kb251dC1jaGFydC10b3RhbC12YWx1ZScpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke2Jhc2VGb250U2l6ZX1yZW1gKVxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc2MDAnKVxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWRvbnV0LWNoYXJ0LXZhbHVlLWNvbG9yKSknKVxuICAgICAgLnRleHQoZGlzcGxheVRvdGFsLnRvTG9jYWxlU3RyaW5nKCkpO1xuXG4gICAgLy8gQWRkIGxhYmVsXG4gICAgdG90YWxEaXNwbGF5XG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1kb251dC1jaGFydC10b3RhbC1sYWJlbCcpXG4gICAgICAuYXR0cignZHknLCAnMS40ZW0nKVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHtzdWJUZXh0Rm9udFNpemV9cmVtYClcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1kb251dC1jaGFydC12YWx1ZS1jb2xvcikpJylcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwLjgnKVxuICAgICAgLnRleHQodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkudG90YWxMYWJlbCB8fCAnVG90YWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGNoYXJ0IHJlbmRlcmluZyBlcnJvcnNcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlQ2hhcnRFcnJvcigpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICB0aGlzLnNob3dOb0RhdGFNZXNzYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyB1cCBjaGFydCByZXNvdXJjZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhbnVwQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Rvb2x0aXBSYWZJZCAhPSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl90b29sdGlwUmFmSWQpO1xuICAgICAgdGhpcy5fdG9vbHRpcFJhZklkID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fcGVuZGluZ1Rvb2x0aXBDb29yZHMgPSBudWxsO1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgdGhpcy5kMz8uc2VsZWN0KGNvbnRhaW5lcikuc2VsZWN0QWxsKCdzdmcsIC5heC1jaGFydC1lbXB0eSwgLmF4LWNoYXJ0LW1lc3NhZ2UtY29udGFpbmVyLCAuYXgtZG9udXQtY2hhcnQtbm8tZGF0YS1tZXNzYWdlJykucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zdmcgPSBudWxsO1xuICAgIHRoaXMucGllRGF0YSA9IFtdO1xuICAgIHRoaXMuaGlkZGVuU2VnbWVudHMuY2xlYXIoKTtcbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuX2N1cnJlbnRseUhpZ2hsaWdodGVkU2VnbWVudC5zZXQobnVsbCk7XG4gIH1cblxuICAvLyA9PT09PSBIZWxwZXIgdXRpbGl0aWVzIGZvciBtb2R1bGFyaXR5IGFuZCBtYWludGFpbmFiaWxpdHkgPT09PT1cblxuICAvLyBjb21wdXRlVG9vbHRpcFBvc2l0aW9uIG1vdmVkIHRvIHNoYXJlZCBjaGFydCB1dGlsc1xuXG4gIC8qKlxuICAgKiBHZXRzIGFuIGFjY2Vzc2liaWxpdHkgbGFiZWwgZGVzY3JpYmluZyB0aGUgZG9udXQgY2hhcnQgZm9yIHNjcmVlbiByZWFkZXJzXG4gICAqIEByZXR1cm5zIERlc2NyaXB0aXZlIHN0cmluZyBmb3Igc2NyZWVuIHJlYWRlcnNcbiAgICovXG4gIHByb3RlY3RlZCBnZXRBY2Nlc3NpYmlsaXR5TGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5jaGFydERhdGFBcnJheSgpO1xuXG4gICAgaWYgKCFkYXRhIHx8IGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJ0VtcHR5IGRvbnV0IGNoYXJ0LiBObyBkYXRhIGF2YWlsYWJsZS4nO1xuICAgIH1cblxuICAgIGNvbnN0IGRpc3BsYXlUb3RhbCA9IHRoaXMuZ2V0RGlzcGxheVRvdGFsKGRhdGEpO1xuICAgIGNvbnN0IGxheW91dFRvdGFsID0gdGhpcy5nZXRMYXlvdXRUb3RhbChkYXRhKTtcbiAgICBjb25zdCBzZWdtZW50RGVzY3JpcHRpb25zID0gZGF0YVxuICAgICAgLm1hcCgoc2VnbWVudCkgPT4ge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID1cbiAgICAgICAgICBsYXlvdXRUb3RhbCA+IDAgPyB0aGlzLmdldFNlZ21lbnRQZXJjZW50YWdlKHNlZ21lbnQudmFsdWUsIGxheW91dFRvdGFsKS50b0ZpeGVkKDEpIDogJzAnO1xuICAgICAgICByZXR1cm4gYCR7c2VnbWVudC5sYWJlbH06ICR7c2VnbWVudC52YWx1ZX0gKCR7cGVyY2VudGFnZX0lKWA7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJzsgJyk7XG5cbiAgICByZXR1cm4gYERvbnV0IGNoYXJ0IHdpdGggJHtkYXRhLmxlbmd0aH0gc2VnbWVudHMuIFRvdGFsIHZhbHVlOiAke2Rpc3BsYXlUb3RhbH0uICR7c2VnbWVudERlc2NyaXB0aW9uc31gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRhdGEgaXRlbXMgZm9yIHRoZSBsZWdlbmRcbiAgICogQGltcGxlbWVudHMgQVhDaGFydExlZ2VuZENvbXBhdGlibGVcbiAgICovXG4gIGdldExlZ2VuZEl0ZW1zKCk6IEFYQ2hhcnRMZWdlbmRJdGVtW10ge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNoYXJ0RGF0YUFycmF5KCk7XG4gICAgY29uc3QgbGF5b3V0VG90YWwgPSB0aGlzLmdldExheW91dFRvdGFsKGRhdGEpO1xuXG4gICAgcmV0dXJuIGRhdGEubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcbiAgICAgIGlkOiBpdGVtLmlkLFxuICAgICAgbmFtZTogaXRlbS5sYWJlbCB8fCBgU2VnbWVudCAke2luZGV4ICsgMX1gLFxuICAgICAgdmFsdWU6IGl0ZW0udmFsdWUsXG4gICAgICBjb2xvcjogdGhpcy5nZXRTZWdtZW50Q29sb3IoaXRlbSksXG4gICAgICBwZXJjZW50YWdlOiB0aGlzLmdldFNlZ21lbnRQZXJjZW50YWdlKGl0ZW0udmFsdWUsIGxheW91dFRvdGFsKSxcbiAgICAgIGhpZGRlbjogdGhpcy5pc1NlZ21lbnRIaWRkZW4oaXRlbS5pZCksXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWdtZW50TGF5b3V0VmFsdWUodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguYWJzKHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGF5b3V0VG90YWwoZGF0YTogQVhEb251dENoYXJ0RGF0YVtdKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZGF0YS5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgdGhpcy5nZXRTZWdtZW50TGF5b3V0VmFsdWUoaXRlbS52YWx1ZSksIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREaXNwbGF5VG90YWwoZGF0YTogQVhEb251dENoYXJ0RGF0YVtdKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZGF0YS5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgaXRlbS52YWx1ZSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGdldFNlZ21lbnRQZXJjZW50YWdlKHNlZ21lbnRWYWx1ZTogbnVtYmVyLCBsYXlvdXRUb3RhbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAobGF5b3V0VG90YWwgPD0gMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuICh0aGlzLmdldFNlZ21lbnRMYXlvdXRWYWx1ZShzZWdtZW50VmFsdWUpIC8gbGF5b3V0VG90YWwpICogMTAwO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYXgtZG9udXQtY2hhcnRcIiAjY2hhcnRDb250YWluZXIgcm9sZT1cImltZ1wiIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0QWNjZXNzaWJpbGl0eUxhYmVsKClcIj5cbiAgPCEtLSBUb29sdGlwIGNvbXBvbmVudCAtLT5cbiAgPGF4LWNoYXJ0LXRvb2x0aXBcbiAgICBbdmlzaWJsZV09XCJ0b29sdGlwVmlzaWJsZSgpXCJcbiAgICBbcG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uKClcIlxuICAgIFtkYXRhXT1cInRvb2x0aXBEYXRhKClcIlxuICAgIFtzaG93UGVyY2VudGFnZV09XCJ0cnVlXCJcbiAgPjwvYXgtY2hhcnQtdG9vbHRpcD5cbjwvZGl2PlxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1kb251dC1jaGFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9kb251dC1jaGFydC9zcmMvYWNvcmV4LWNoYXJ0cy1kb251dC1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acorex-charts-donut-chart.mjs","sources":["../tmp-esm2022/donut-chart/lib/donut-chart.config.js","../tmp-esm2022/donut-chart/lib/donut-chart.component.js","../tmp-esm2022/donut-chart/acorex-charts-donut-chart.js"],"sourcesContent":["import { AX_CHART_DEFAULT_MESSAGES } from '@acorex/charts';\nimport { InjectionToken } from '@angular/core';\nexport const AXDonutChartDefaultConfig = {\n showTooltip: true,\n showDataLabels: true,\n donutWidth: 35,\n cornerRadius: 4,\n animationDuration: 800,\n animationEasing: 'cubic-out',\n messages: {\n ...AX_CHART_DEFAULT_MESSAGES,\n noDataIcon: 'fa-light fa-chart-pie',\n },\n};\nexport const AX_DONUT_CHART_CONFIG = new InjectionToken('AX_DONUT_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXDonutChartDefaultConfig,\n});\nexport function donutChartConfig(config = {}) {\n return {\n ...AXDonutChartDefaultConfig,\n ...config,\n messages: {\n ...AXDonutChartDefaultConfig.messages,\n ...config.messages,\n },\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9udXQtY2hhcnQuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXVCO0lBQzNELFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLFVBQVUsRUFBRSxFQUFFO0lBQ2QsWUFBWSxFQUFFLENBQUM7SUFDZixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxXQUFXO0lBQzVCLFFBQVEsRUFBRTtRQUNSLEdBQUcseUJBQXlCO1FBQzVCLFVBQVUsRUFBRSx1QkFBdUI7S0FDcEM7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxjQUFjLENBQXFCLHVCQUF1QixFQUFFO0lBQ25HLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyx5QkFBeUI7Q0FDekMsQ0FBQyxDQUFDO0FBSUgsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFNBQWtDLEVBQUU7SUFDbkUsT0FBTztRQUNMLEdBQUcseUJBQXlCO1FBQzVCLEdBQUcsTUFBTTtRQUNULFFBQVEsRUFBRTtZQUNSLEdBQUcseUJBQXlCLENBQUMsUUFBUTtZQUNyQyxHQUFHLE1BQU0sQ0FBQyxRQUFRO1NBQ25CO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWF9DSEFSVF9ERUZBVUxUX01FU1NBR0VTIH0gZnJvbSAnQGFjb3JleC9jaGFydHMnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYRG9udXRDaGFydE9wdGlvbiB9IGZyb20gJy4vZG9udXQtY2hhcnQudHlwZSc7XG5cbmV4cG9ydCBjb25zdCBBWERvbnV0Q2hhcnREZWZhdWx0Q29uZmlnOiBBWERvbnV0Q2hhcnRPcHRpb24gPSB7XG4gIHNob3dUb29sdGlwOiB0cnVlLFxuICBzaG93RGF0YUxhYmVsczogdHJ1ZSxcbiAgZG9udXRXaWR0aDogMzUsXG4gIGNvcm5lclJhZGl1czogNCxcbiAgYW5pbWF0aW9uRHVyYXRpb246IDgwMCxcbiAgYW5pbWF0aW9uRWFzaW5nOiAnY3ViaWMtb3V0JyxcbiAgbWVzc2FnZXM6IHtcbiAgICAuLi5BWF9DSEFSVF9ERUZBVUxUX01FU1NBR0VTLFxuICAgIG5vRGF0YUljb246ICdmYS1saWdodCBmYS1jaGFydC1waWUnLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEFYX0RPTlVUX0NIQVJUX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBWERvbnV0Q2hhcnRPcHRpb24+KCdBWF9ET05VVF9DSEFSVF9DT05GSUcnLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4gQVhEb251dENoYXJ0RGVmYXVsdENvbmZpZyxcbn0pO1xuXG5leHBvcnQgdHlwZSBQYXJ0aWFsRG9udXRDaGFydENvbmZpZyA9IFBhcnRpYWw8QVhEb251dENoYXJ0T3B0aW9uPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGRvbnV0Q2hhcnRDb25maWcoY29uZmlnOiBQYXJ0aWFsRG9udXRDaGFydENvbmZpZyA9IHt9KTogQVhEb251dENoYXJ0T3B0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5BWERvbnV0Q2hhcnREZWZhdWx0Q29uZmlnLFxuICAgIC4uLmNvbmZpZyxcbiAgICBtZXNzYWdlczoge1xuICAgICAgLi4uQVhEb251dENoYXJ0RGVmYXVsdENvbmZpZy5tZXNzYWdlcyxcbiAgICAgIC4uLmNvbmZpZy5tZXNzYWdlcyxcbiAgICB9LFxuICB9O1xufVxuIl19","import { AX_CHART_COLOR_PALETTE, AXChartComponent, computeTooltipPosition, createChartInstanceId, getChartColor, getEasingFunction, mergeChartMessages, mergeChartOptions, renderChartEmptyMessage, } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { afterNextRender, ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, effect, inject, input, output, signal, untracked, viewChild, ViewEncapsulation, } from '@angular/core';\nimport { AX_DONUT_CHART_CONFIG } from './donut-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * Donut Chart Component\n * Displays data in a circular donut chart with interactive segments\n */\nexport class AXDonutChartComponent extends AXChartComponent {\n // Dependency Injection\n cdr = inject(ChangeDetectorRef);\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 segment is clicked */\n segmentClick = output();\n /** Emitted when a segment has mouse hover\n * Can be used by external elements to highlight this segment\n */\n segmentHover = output();\n // Chart container reference\n chartContainerEl = viewChild.required('chartContainer');\n // D3 reference - loaded asynchronously\n d3;\n // Chart SVG reference (using 'any' since D3 is loaded dynamically at runtime)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n svg = null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pieData = [];\n // State management\n hiddenSegments = new Set();\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\n _isInitialAnimating = signal(false, ...(ngDevMode ? [{ debugName: \"_isInitialAnimating\" }] : []));\n _currentlyHighlightedSegment = signal(null, ...(ngDevMode ? [{ debugName: \"_currentlyHighlightedSegment\" }] : []));\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 // Public computed properties for the template\n tooltipVisible = this._tooltipVisible.asReadonly();\n tooltipPosition = this._tooltipPosition.asReadonly();\n tooltipData = this._tooltipData.asReadonly();\n // Inject configuration\n configToken = inject(AX_DONUT_CHART_CONFIG);\n // Inject the chart colors\n chartColors = inject(AX_CHART_COLOR_PALETTE);\n // Computed configuration options\n effectiveOptions = computed(() => mergeChartOptions(this.configToken, this.options()), ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n // Constants\n TOOLTIP_GAP = 10;\n HIGHLIGHT_TRANSITION_DURATION = 150;\n HIGHLIGHT_TRANSITION_NAME = 'highlight';\n SEGMENT_ANIMATION_DELAY = 50;\n LABEL_ANIMATION_DELAY = 200;\n MIN_CHART_DIMENSION = 200;\n MIN_CHART_FOR_LABELS = 260;\n CHART_INSET = 12;\n DIMMED_OPACITY = 0.5;\n VISIBLE_OPACITY = 1;\n instanceId = createChartInstanceId('ax-donut');\n get segmentShadowFilterId() {\n return `${this.instanceId}-segment-shadow`;\n }\n // Messages with defaults\n effectiveMessages = computed(() => mergeChartMessages(this.configToken.messages, this.options()?.messages), ...(ngDevMode ? [{ debugName: \"effectiveMessages\" }] : []));\n // Data accessor for handling different incoming data formats\n chartDataArray = computed(() => {\n return this.data() || [];\n }, ...(ngDevMode ? [{ debugName: \"chartDataArray\" }] : []));\n // Color accessor method\n getColor(index) {\n return getChartColor(index, this.chartColors);\n }\n // Segment visibility check\n isSegmentHidden(id) {\n return this.hiddenSegments.has(id);\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 });\n }\n dataChangeEffect = effect(() => {\n // Track data and options changes\n this.data();\n this.effectiveOptions();\n // Only update if already rendered\n untracked(() => {\n if (this._rendered()) {\n this.updateChart();\n }\n });\n }, ...(ngDevMode ? [{ debugName: \"dataChangeEffect\" }] : []));\n /**\n * Highlights a specific segment by ID\n * @param id The segment ID to highlight, or null to clear highlight\n */\n highlightSegment(id) {\n if (this._isInitialAnimating() || !this.svg)\n return;\n if (this._currentlyHighlightedSegment() === id)\n return;\n this._currentlyHighlightedSegment.set(id);\n // Only interrupt ongoing HIGHLIGHT transitions (not initial animations)\n this.svg.selectAll('path').interrupt(this.HIGHLIGHT_TRANSITION_NAME);\n if (id === null) {\n this.clearAllHighlights();\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const targetSegment = this.svg.selectAll('path').filter((d) => d?.data?.id === id);\n if (targetSegment.empty()) {\n this._currentlyHighlightedSegment.set(null);\n this.highlightSegment(null);\n return;\n }\n this.dimNonTargetSegments(id);\n this.highlightTargetSegment(targetSegment);\n this.segmentHover.emit(this.getSegmentDataById(id));\n }\n clearAllHighlights() {\n if (!this.svg)\n return;\n this.svg\n .selectAll('path')\n .classed('ax-donut-chart-highlighted', false)\n .classed('ax-donut-chart-dimmed', false)\n .transition(this.HIGHLIGHT_TRANSITION_NAME)\n .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n .attr('transform', null)\n .style('filter', null)\n .style('opacity', this.VISIBLE_OPACITY);\n this.segmentHover.emit(null);\n }\n dimNonTargetSegments(targetId) {\n if (!this.svg)\n return;\n this.svg\n .selectAll('path')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .filter((d) => d?.data?.id !== targetId)\n .classed('ax-donut-chart-highlighted', false)\n .classed('ax-donut-chart-dimmed', true)\n .transition(this.HIGHLIGHT_TRANSITION_NAME)\n .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n .attr('transform', null)\n .style('filter', null)\n .style('opacity', this.DIMMED_OPACITY);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n highlightTargetSegment(targetSegment) {\n targetSegment\n .classed('ax-donut-chart-dimmed', false)\n .classed('ax-donut-chart-highlighted', true)\n .transition(this.HIGHLIGHT_TRANSITION_NAME)\n .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n .style('filter', `url(#${this.segmentShadowFilterId})`)\n .style('opacity', this.VISIBLE_OPACITY);\n }\n getSegmentDataById(segmentId) {\n return untracked(() => this.chartDataArray()).find((d) => d.id === segmentId) || null;\n }\n /**\n * Toggles visibility of a segment by ID\n * @param id Segment ID to toggle\n * @returns New visibility state (true = visible, false = hidden)\n */\n toggleSegment(id) {\n const chartData = this.chartDataArray();\n const wasAllHidden = chartData.length > 0 && chartData.every((d) => this.isSegmentHidden(d.id));\n if (this.hiddenSegments.has(id)) {\n // Making a segment visible\n this.hiddenSegments.delete(id);\n // If all segments were previously hidden, we need to ensure the message is cleared\n if (wasAllHidden) {\n // Force complete DOM cleanup and redraw\n if (this.chartContainerEl()?.nativeElement) {\n // Clear only chart SVG and message containers (preserve tooltip component)\n this.d3\n ?.select(this.chartContainerEl().nativeElement)\n .selectAll('svg, .ax-chart-empty, .ax-chart-message-container, .ax-donut-chart-no-data-message')\n .remove();\n // Force full redraw\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n }\n else {\n this.updateChart();\n }\n }\n else {\n // Hiding a segment\n this.hiddenSegments.add(id);\n this.updateChart();\n }\n return !this.isSegmentHidden(id);\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 onSegmentClick(item) {\n this.segmentClick.emit(item);\n }\n /**\n * Creates the donut chart from current data\n */\n createChart() {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement)\n return;\n try {\n const containerElement = this.chartContainerEl().nativeElement;\n this.clearChart(containerElement);\n const data = this.chartDataArray();\n if (!data || data.length === 0) {\n this.showNoDataMessage();\n return;\n }\n const visibleData = data.filter((item) => !this.hiddenSegments.has(item.id));\n if (visibleData.length === 0) {\n this.showAllSegmentsHiddenMessage();\n return;\n }\n const options = this.effectiveOptions();\n const { width, height } = this.setupDimensions(containerElement, options);\n this.renderDonutChart(containerElement, width, height, visibleData);\n }\n catch (error) {\n console.error('Error creating donut chart:', error);\n this.handleChartError();\n }\n }\n /**\n * Updates the chart with new data\n */\n updateChart() {\n // Reset highlighted segment state when updating\n this._currentlyHighlightedSegment.set(null);\n this.createChart(); // Recreate the chart with updated data\n }\n /**\n * Clears the chart container\n */\n clearChart(container) {\n this.d3.select(container).selectAll('svg, .ax-chart-empty, .ax-chart-message-container, .ax-donut-chart-no-data-message').remove();\n this._tooltipVisible.set(false);\n }\n /**\n * Shows a message when no data is available\n */\n showNoDataMessage() {\n if (!this.chartContainerEl()?.nativeElement)\n return;\n const messages = this.effectiveMessages();\n renderChartEmptyMessage(this.d3, this.chartContainerEl().nativeElement, {\n icon: messages.noDataIcon,\n title: messages.noData,\n help: messages.noDataHelp,\n });\n }\n /**\n * Shows a message when all segments are hidden\n */\n showAllSegmentsHiddenMessage() {\n if (!this.chartContainerEl()?.nativeElement)\n return;\n const messages = this.effectiveMessages();\n renderChartEmptyMessage(this.d3, this.chartContainerEl().nativeElement, {\n icon: messages.allHiddenIcon,\n title: messages.allHidden,\n help: messages.allHiddenHelp,\n });\n }\n /**\n * Setups chart dimensions based on container and options\n */\n setupDimensions(container, options) {\n const containerWidth = Math.max(container.clientWidth, 1);\n const containerHeight = Math.max(container.clientHeight, 1);\n const desiredWidth = options?.width || containerWidth;\n const desiredHeight = options?.height || containerHeight;\n // Keep donut geometry square so side spacing stays visually balanced.\n const chartSize = Math.max(1, Math.min(desiredWidth, desiredHeight));\n return { width: chartSize, height: chartSize };\n }\n /**\n * Renders the donut chart with visible data\n */\n renderDonutChart(container, width, height, visibleData) {\n const displayTotal = this.getDisplayTotal(visibleData);\n const layoutTotal = this.getLayoutTotal(visibleData);\n // Create SVG container with filters\n const svg = this.createSvgWithFilters(container, width, height);\n // Create main chart group\n this.svg = svg.append('g').attr('transform', `translate(${width / 2}, ${height / 2})`);\n const { innerRadius } = this.getDonutRadii(width, height);\n // Create donut segments\n this.createDonutSegments(width, height, visibleData, layoutTotal);\n // Add total in center\n this.addCenterDisplay(displayTotal, innerRadius);\n }\n getDonutRadii(chartWidth, chartHeight) {\n const maxRadius = Math.min(chartWidth, chartHeight) / 2;\n const radius = Math.max(0, maxRadius - this.CHART_INSET);\n const donutWidthPercent = this.effectiveOptions().donutWidth / 100;\n const innerRadius = radius * (1 - donutWidthPercent);\n const outerRadius = radius * 0.95;\n return { innerRadius, outerRadius, radius };\n }\n /**\n * Create SVG element with filter definitions for shadows\n * @returns D3 SVG selection (any type due to dynamic D3 loading)\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n createSvgWithFilters(container, width, height) {\n const svg = this.d3\n .select(container)\n .append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${width} ${height}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n // Add drop shadow filter\n const defs = svg.append('defs');\n const filter = defs.append('filter').attr('id', this.segmentShadowFilterId).attr('height', '130%');\n filter.append('feGaussianBlur').attr('in', 'SourceAlpha').attr('stdDeviation', 2).attr('result', 'blur');\n filter.append('feOffset').attr('in', 'blur').attr('dx', 1).attr('dy', 1).attr('result', 'offsetBlur');\n const feComponentTransfer = filter\n .append('feComponentTransfer')\n .attr('in', 'offsetBlur')\n .attr('result', 'offsetBlur');\n feComponentTransfer.append('feFuncA').attr('type', 'linear').attr('slope', 0.3);\n const feMerge = filter.append('feMerge');\n feMerge.append('feMergeNode').attr('in', 'offsetBlur');\n feMerge.append('feMergeNode').attr('in', 'SourceGraphic');\n return svg;\n }\n /**\n * Create and render the donut segments with animations\n */\n createDonutSegments(chartWidth, chartHeight, data, layoutTotal) {\n this._isInitialAnimating.set(true);\n // Create pie layout\n const pie = this.d3\n .pie()\n .value((d) => this.getSegmentLayoutValue(d.value))\n .sort(null)\n .padAngle(0.02);\n const { innerRadius, outerRadius } = this.getDonutRadii(chartWidth, chartHeight);\n const ringWidth = outerRadius - innerRadius;\n const arc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius)\n .cornerRadius(this.effectiveOptions().cornerRadius);\n const labelArc = this.d3\n .arc()\n .innerRadius(innerRadius + ringWidth / 2)\n .outerRadius(innerRadius + ringWidth / 2);\n // Get animation options\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n // Generate pie data\n this.pieData = pie(data);\n // Add segments with animation\n const segments = this.svg\n .selectAll('path')\n .data(this.pieData)\n .enter()\n .append('path')\n .attr('class', 'ax-donut-chart-segment')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .attr('fill', (d) => this.getSegmentColor(d.data))\n .style('opacity', 0)\n .style('cursor', 'pointer')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('mouseenter', (event, d) => {\n if (this.effectiveOptions().showTooltip) {\n this.handleSliceHover(event, d.data);\n }\n })\n .on('mouseleave', () => this.handleSegmentLeave())\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('click', (_event, d) => {\n this.onSegmentClick(d.data);\n });\n // Animate segments\n const numSegments = this.pieData.length;\n let completed = 0;\n segments\n .transition()\n .duration(animationDuration)\n .ease(animationEasing)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .delay((_d, i) => i * this.SEGMENT_ANIMATION_DELAY)\n .style('opacity', this.VISIBLE_OPACITY)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .attrTween('d', (d) => {\n const interpolate = this.d3.interpolate({ startAngle: d.startAngle, endAngle: d.startAngle }, d);\n return (t) => arc(interpolate(t));\n })\n .on('end', () => {\n completed++;\n if (completed >= numSegments) {\n this._isInitialAnimating.set(false);\n this.cdr.detectChanges();\n }\n })\n .on('interrupt', () => {\n // Treat interrupts as completion to avoid getting stuck in animating state\n completed++;\n if (completed >= numSegments) {\n this._isInitialAnimating.set(false);\n this.cdr.detectChanges();\n }\n });\n // Add data labels if enabled and chart size is sufficient\n if (this.effectiveOptions().showDataLabels && this.isChartLargeEnoughForLabels(chartWidth, chartHeight)) {\n this.addDataLabels(labelArc, outerRadius, innerRadius, layoutTotal, animationDuration);\n }\n // Determine when all segment animations are complete (handle empty case)\n if (numSegments === 0) {\n this._isInitialAnimating.set(false);\n this.cdr.detectChanges();\n }\n }\n isChartLargeEnoughForLabels(width, height) {\n return Math.min(width, height) >= this.MIN_CHART_FOR_LABELS;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n addDataLabels(labelArc, outerRadius, innerRadius, layoutTotal, animationDuration) {\n if (!this.svg)\n return;\n const dataWithLabels = this.pieData.filter((d) => {\n return this.calculateLabelFontSize(d, outerRadius, innerRadius, layoutTotal) > 0;\n });\n const labels = this.svg\n .selectAll('.ax-donut-chart-data-label')\n .data(dataWithLabels)\n .enter()\n .append('text')\n .attr('class', 'ax-donut-chart-data-label')\n .style('opacity', 0)\n .style('pointer-events', 'none')\n .style('fill', 'rgb(var(--ax-comp-donut-chart-data-labels-color))')\n .attr('transform', (d) => {\n const centroid = labelArc.centroid(d);\n return `translate(${centroid[0]}, ${centroid[1]})`;\n })\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .style('font-size', (d) => `${this.calculateLabelFontSize(d, outerRadius, innerRadius, layoutTotal)}px`)\n .style('font-weight', (d) => (this.getSegmentPercentage(d.data.value, layoutTotal) >= 15 ? '600' : '500'))\n .text((d) => this.getTruncatedLabelText(d, outerRadius, innerRadius, layoutTotal));\n labels\n .transition()\n .duration(animationDuration)\n .delay((_d, i) => i * this.SEGMENT_ANIMATION_DELAY + this.LABEL_ANIMATION_DELAY)\n .style('opacity', this.VISIBLE_OPACITY);\n }\n /**\n * Calculates font size for data labels using the donut ring's physical dimensions.\n *\n * Primary driver is the ring width (radial space), with chord length as an\n * overflow guard and a gentle scale-down for smaller segments to create\n * visual hierarchy.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n calculateLabelFontSize(d, outerRadius, innerRadius, layoutTotal) {\n const angle = d.endAngle - d.startAngle;\n const segmentPercentage = this.getSegmentPercentage(d.data.value, layoutTotal);\n if (segmentPercentage < 2)\n return 0;\n const ringWidth = outerRadius - innerRadius;\n const labelRadius = innerRadius + ringWidth / 2;\n const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n const MIN_CHORD = 22;\n const MIN_RING = 16;\n if (chordLength < MIN_CHORD || ringWidth < MIN_RING)\n return 0;\n const ringBasedSize = ringWidth * 0.48;\n // Segments >= 20% get full size; smaller ones scale from 0.75 → 1.0\n const segmentScale = Math.min(1, 0.75 + 0.25 * (segmentPercentage / 20));\n // At least 2 characters (\"X%\") must fit horizontally\n const maxByChord = chordLength / (2 * 0.65);\n const fontSize = Math.min(ringBasedSize * segmentScale, maxByChord);\n const MIN_FONT_SIZE = 11;\n const MAX_FONT_SIZE = 20;\n return Math.round(Math.max(MIN_FONT_SIZE, Math.min(fontSize, MAX_FONT_SIZE)) * 2) / 2;\n }\n formatPercentage(value) {\n if (value < 1)\n return '<1%';\n if (value < 10)\n return `${value.toFixed(1)}%`;\n return `${Math.round(value)}%`;\n }\n /**\n * Returns the best-fit label text for a segment, progressively truncating\n * from \"Label (XX%)\" → \"Label\" → \"XX%\" → truncated label → truncated percentage.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getTruncatedLabelText(d, outerRadius, innerRadius, layoutTotal) {\n const fontSize = this.calculateLabelFontSize(d, outerRadius, innerRadius, layoutTotal);\n if (fontSize === 0)\n return '';\n const ringWidth = outerRadius - innerRadius;\n const labelRadius = innerRadius + ringWidth / 2;\n const angle = d.endAngle - d.startAngle;\n const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n const availableWidth = chordLength * 0.8;\n const percentage = this.getSegmentPercentage(d.data.value, layoutTotal);\n if (percentage < 2)\n return '';\n const label = d.data.label || '';\n const percentageText = this.formatPercentage(percentage);\n const fullText = label ? `${label} (${percentageText})` : percentageText;\n if (this.doesTextFit(fullText, fontSize, availableWidth))\n return fullText;\n if (label && this.doesTextFit(label, fontSize, availableWidth))\n return label;\n if (this.doesTextFit(percentageText, fontSize, availableWidth))\n return percentageText;\n if (label)\n return this.truncateTextToFit(label, fontSize, availableWidth);\n return this.truncateTextToFit(percentageText, fontSize, availableWidth);\n }\n /**\n * Checks if text fits within available width using conservative estimation\n * Uses 0.65em per character to account for font variations\n */\n doesTextFit(text, fontSize, availableWidth) {\n if (!text)\n return false;\n // Use conservative character width (0.65em for safety)\n // Wider fonts like bold text need more space\n const estimatedWidth = text.length * fontSize * 0.65;\n return estimatedWidth <= availableWidth;\n }\n /**\n * Truncates text to fit within available width with ellipsis\n * Uses conservative character width to prevent overflow\n * Adapts character width estimation based on font size\n */\n truncateTextToFit(text, fontSize, availableWidth) {\n if (!text)\n return '';\n // Adaptive character width: smaller fonts are relatively wider\n // Larger fonts: ~0.6em, Smaller fonts: ~0.7em\n const charWidthRatio = fontSize <= 10 ? 0.7 : 0.65;\n const charWidth = fontSize * charWidthRatio;\n // Reserve space for ellipsis\n const ellipsisWidth = fontSize * 0.7;\n const availableForText = availableWidth - ellipsisWidth;\n if (availableForText <= 0)\n return '';\n const maxChars = Math.floor(availableForText / charWidth);\n if (maxChars <= 0)\n return '';\n if (text.length <= maxChars)\n return text;\n // Ensure at least 1 character before ellipsis\n return text.substring(0, Math.max(1, maxChars)) + '…';\n }\n getSegmentColor(data) {\n if (data.color)\n return data.color;\n const originalFullData = untracked(() => this.chartDataArray());\n const originalIndex = originalFullData.findIndex((item) => item.id === data.id);\n return this.getColor(originalIndex !== -1 ? originalIndex : 0);\n }\n /**\n * Handle hover effects on a segment\n */\n handleSliceHover(event, datum) {\n if (this._isInitialAnimating())\n return;\n if (this.effectiveOptions().showTooltip !== false) {\n this.showTooltip(event, datum);\n }\n this.highlightSegment(datum.id);\n }\n showTooltip(event, datum) {\n const visibleData = untracked(() => this.chartDataArray()).filter((item) => !this.hiddenSegments.has(item.id));\n const layoutTotal = this.getLayoutTotal(visibleData);\n const percentage = layoutTotal > 0 ? this.getSegmentPercentage(datum.value, layoutTotal).toFixed(1) : '0';\n const color = this.getSegmentColor(datum);\n this._tooltipData.set({\n title: datum.tooltipLabel || datum.label,\n value: datum.value.toString(),\n percentage: `${percentage}%`,\n color,\n });\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n }\n /**\n * Handles mouse leave from segments\n */\n handleSegmentLeave() {\n if (this._isInitialAnimating())\n return;\n this._tooltipVisible.set(false);\n this.highlightSegment(null);\n }\n updateTooltipPosition(event) {\n this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n if (this._tooltipRafId != null)\n return;\n this.scheduleTooltipPosition(0);\n }\n scheduleTooltipPosition(attempt) {\n this._tooltipRafId = requestAnimationFrame(() => {\n const coords = this._pendingTooltipCoords;\n if (!coords) {\n this._tooltipRafId = null;\n return;\n }\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl) {\n this._tooltipRafId = null;\n return;\n }\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n if (!tooltipEl && this._tooltipVisible() && attempt < 3) {\n this.scheduleTooltipPosition(attempt + 1);\n return;\n }\n this._tooltipRafId = null;\n const containerRect = containerEl.getBoundingClientRect();\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = computeTooltipPosition(containerRect, tooltipRect, coords.x, coords.y, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n });\n }\n /**\n * Adds center display with total value, scaled to fit the donut hole.\n */\n addCenterDisplay(displayTotal, innerRadius) {\n if (!this.svg || innerRadius <= 0)\n return;\n const valueText = displayTotal.toLocaleString();\n const labelText = this.effectiveOptions().totalLabel || 'Total';\n const { valueFontSize, labelFontSize, displayLabel } = this.calculateCenterTextSizes(valueText, labelText, innerRadius);\n const labelLineHeight = labelFontSize * 1.3;\n const valueY = -(labelLineHeight / 2);\n const totalDisplay = this.svg\n .append('g')\n .attr('class', 'ax-donut-chart-total-display')\n .attr('text-anchor', 'middle');\n totalDisplay\n .append('text')\n .attr('class', 'ax-donut-chart-total-value')\n .attr('y', valueY)\n .attr('dominant-baseline', 'middle')\n .style('font-size', `${valueFontSize}px`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')\n .text(valueText);\n totalDisplay\n .append('text')\n .attr('class', 'ax-donut-chart-total-label')\n .attr('y', valueY + valueFontSize * 0.55 + labelLineHeight / 2)\n .attr('dominant-baseline', 'middle')\n .style('font-size', `${labelFontSize}px`)\n .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')\n .style('opacity', '0.8')\n .text(displayLabel);\n }\n calculateCenterTextSizes(valueText, labelText, innerRadius) {\n const availableDiameter = innerRadius * 2;\n const availableWidth = availableDiameter * 0.82;\n const availableHeight = availableDiameter * 0.78;\n const MIN_VALUE_FONT = 9;\n const MAX_VALUE_FONT = innerRadius * 0.42;\n let valueFontSize = Math.min(innerRadius * 0.34, MAX_VALUE_FONT);\n while (valueFontSize > MIN_VALUE_FONT && !this.doesTextFit(valueText, valueFontSize, availableWidth)) {\n valueFontSize -= 0.5;\n }\n valueFontSize = Math.max(MIN_VALUE_FONT, Math.round(valueFontSize * 2) / 2);\n let labelFontSize = Math.max(8, Math.round(valueFontSize * 0.42 * 2) / 2);\n const labelLineHeight = labelFontSize * 1.3;\n const totalHeight = valueFontSize + labelLineHeight;\n if (totalHeight > availableHeight) {\n const scale = availableHeight / totalHeight;\n valueFontSize = Math.max(MIN_VALUE_FONT, Math.round(valueFontSize * scale * 2) / 2);\n labelFontSize = Math.max(8, Math.round(labelFontSize * scale * 2) / 2);\n }\n while (labelFontSize > 8 && !this.doesTextFit(labelText, labelFontSize, availableWidth)) {\n labelFontSize -= 0.5;\n }\n labelFontSize = Math.max(8, Math.round(labelFontSize * 2) / 2);\n const displayLabel = this.doesTextFit(labelText, labelFontSize, availableWidth)\n ? labelText\n : this.truncateTextToFit(labelText, labelFontSize, availableWidth);\n return { valueFontSize, labelFontSize, displayLabel };\n }\n /**\n * Handles chart rendering errors\n */\n handleChartError() {\n const container = this.chartContainerEl()?.nativeElement;\n if (container) {\n this.showNoDataMessage();\n }\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-empty, .ax-chart-message-container, .ax-donut-chart-no-data-message').remove();\n }\n this.svg = null;\n this.pieData = [];\n this.hiddenSegments.clear();\n this._tooltipVisible.set(false);\n this._currentlyHighlightedSegment.set(null);\n }\n // ===== Helper utilities for modularity and maintainability =====\n // computeTooltipPosition moved to shared chart utils\n /**\n * Gets an accessibility label describing the donut chart for screen readers\n * @returns Descriptive string for screen readers\n */\n getAccessibilityLabel() {\n const data = this.chartDataArray();\n if (!data || data.length === 0) {\n return 'Empty donut chart. No data available.';\n }\n const displayTotal = this.getDisplayTotal(data);\n const layoutTotal = this.getLayoutTotal(data);\n const segmentDescriptions = data\n .map((segment) => {\n const percentage = layoutTotal > 0 ? this.getSegmentPercentage(segment.value, layoutTotal).toFixed(1) : '0';\n return `${segment.label}: ${segment.value} (${percentage}%)`;\n })\n .join('; ');\n return `Donut chart with ${data.length} segments. Total value: ${displayTotal}. ${segmentDescriptions}`;\n }\n /**\n * Returns the data items for the legend\n * @implements AXChartLegendCompatible\n */\n getLegendItems() {\n const data = this.chartDataArray();\n const layoutTotal = this.getLayoutTotal(data);\n return data.map((item, index) => ({\n id: item.id,\n name: item.label || `Segment ${index + 1}`,\n value: item.value,\n color: this.getSegmentColor(item),\n percentage: this.getSegmentPercentage(item.value, layoutTotal),\n hidden: this.isSegmentHidden(item.id),\n }));\n }\n getSegmentLayoutValue(value) {\n return Math.abs(value);\n }\n getLayoutTotal(data) {\n return data.reduce((sum, item) => sum + this.getSegmentLayoutValue(item.value), 0);\n }\n getDisplayTotal(data) {\n return data.reduce((sum, item) => sum + item.value, 0);\n }\n getSegmentPercentage(segmentValue, layoutTotal) {\n if (layoutTotal <= 0)\n return 0;\n return (this.getSegmentLayoutValue(segmentValue) / layoutTotal) * 100;\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXDonutChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.3\", type: AXDonutChartComponent, isStandalone: true, selector: \"ax-donut-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: { segmentClick: \"segmentClick\", segmentHover: \"segmentHover\" }, viewQueries: [{ propertyName: \"chartContainerEl\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-donut-chart\\\" #chartContainer role=\\\"img\\\" [attr.aria-label]=\\\"getAccessibilityLabel()\\\">\\n <!-- 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-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-donut-chart{display:block;width:100%;height:100%;min-height:0;box-sizing:border-box;--ax-comp-donut-chart-bg-color: 0, 0, 0, 0;--ax-comp-donut-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-donut-chart-value-color: var(--ax-sys-color-on-lightest-surface)}ax-donut-chart .ax-donut-chart{width:100%;height:100%;min-height:0;position:relative;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);border-radius:.5rem;overflow:hidden;background-color:rgba(var(--ax-comp-donut-chart-bg-color))}ax-donut-chart .ax-donut-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-donut-chart .ax-donut-chart svg g:has(text){font-family:inherit}\\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: AXDonutChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-donut-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-donut-chart\\\" #chartContainer role=\\\"img\\\" [attr.aria-label]=\\\"getAccessibilityLabel()\\\">\\n <!-- 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-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-donut-chart{display:block;width:100%;height:100%;min-height:0;box-sizing:border-box;--ax-comp-donut-chart-bg-color: 0, 0, 0, 0;--ax-comp-donut-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-donut-chart-value-color: var(--ax-sys-color-on-lightest-surface)}ax-donut-chart .ax-donut-chart{width:100%;height:100%;min-height:0;position:relative;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);border-radius:.5rem;overflow:hidden;background-color:rgba(var(--ax-comp-donut-chart-bg-color))}ax-donut-chart .ax-donut-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-donut-chart .ax-donut-chart svg g:has(text){font-family:inherit}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9udXQtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2RvbnV0LWNoYXJ0L3NyYy9saWIvZG9udXQtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFFaEIsc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsdUJBQXVCLEdBQ3hCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLHVCQUF1QixFQUFzQixNQUFNLDhCQUE4QixDQUFDO0FBRTNGLE9BQU8sRUFDTCxlQUFlLEVBQ2YsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFFTixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7O0FBRzdEOzs7R0FHRztBQVNILE1BQU0sT0FBTyxxQkFDWCxTQUFRLGdCQUFnQjtJQUd4Qix1QkFBdUI7SUFDZixHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFeEMsU0FBUztJQUNULHVCQUF1QjtJQUN2QixJQUFJLEdBQUcsS0FBSyxDQUFvQixFQUFFLGdEQUFDLENBQUM7SUFFcEMsMEJBQTBCO0lBQzFCLE9BQU8sR0FBRyxLQUFLLENBQXFCLEVBQUUsbURBQUMsQ0FBQztJQUV4QyxV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dGVudCI6WyJpbXBvcnQge1xuICBBWF9DSEFSVF9DT0xPUl9QQUxFVFRFLFxuICBBWENoYXJ0Q29tcG9uZW50LFxuICBBWENoYXJ0Q29tcG9uZW50QmFzZSxcbiAgY29tcHV0ZVRvb2x0aXBQb3NpdGlvbixcbiAgY3JlYXRlQ2hhcnRJbnN0YW5jZUlkLFxuICBnZXRDaGFydENvbG9yLFxuICBnZXRFYXNpbmdGdW5jdGlvbixcbiAgbWVyZ2VDaGFydE1lc3NhZ2VzLFxuICBtZXJnZUNoYXJ0T3B0aW9ucyxcbiAgcmVuZGVyQ2hhcnRFbXB0eU1lc3NhZ2UsXG59IGZyb20gJ0BhY29yZXgvY2hhcnRzJztcbmltcG9ydCB7IEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlLCBBWENoYXJ0TGVnZW5kSXRlbSB9IGZyb20gJ0BhY29yZXgvY2hhcnRzL2NoYXJ0LWxlZ2VuZCc7XG5pbXBvcnQgeyBBWENoYXJ0VG9vbHRpcENvbXBvbmVudCwgQVhDaGFydFRvb2x0aXBEYXRhIH0gZnJvbSAnQGFjb3JleC9jaGFydHMvY2hhcnQtdG9vbHRpcCc7XG5cbmltcG9ydCB7XG4gIGFmdGVyTmV4dFJlbmRlcixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIEVsZW1lbnRSZWYsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG4gIHVudHJhY2tlZCxcbiAgdmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBWF9ET05VVF9DSEFSVF9DT05GSUcgfSBmcm9tICcuL2RvbnV0LWNoYXJ0LmNvbmZpZyc7XG5pbXBvcnQgeyBBWERvbnV0Q2hhcnREYXRhLCBBWERvbnV0Q2hhcnRPcHRpb24sIEFYRG9udXRDaGFydFZhbHVlIH0gZnJvbSAnLi9kb251dC1jaGFydC50eXBlJztcblxuLyoqXG4gKiBEb251dCBDaGFydCBDb21wb25lbnRcbiAqIERpc3BsYXlzIGRhdGEgaW4gYSBjaXJjdWxhciBkb251dCBjaGFydCB3aXRoIGludGVyYWN0aXZlIHNlZ21lbnRzXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F4LWRvbnV0LWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RvbnV0LWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZG9udXQtY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW0FYQ2hhcnRUb29sdGlwQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFYRG9udXRDaGFydENvbXBvbmVudFxuICBleHRlbmRzIEFYQ2hhcnRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlLCBBWENoYXJ0Q29tcG9uZW50QmFzZVxue1xuICAvLyBEZXBlbmRlbmN5IEluamVjdGlvblxuICBwcml2YXRlIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLy8gSW5wdXRzXG4gIC8qKiBDaGFydCBkYXRhIGlucHV0ICovXG4gIGRhdGEgPSBpbnB1dDxBWERvbnV0Q2hhcnRWYWx1ZT4oW10pO1xuXG4gIC8qKiBDaGFydCBvcHRpb25zIGlucHV0ICovXG4gIG9wdGlvbnMgPSBpbnB1dDxBWERvbnV0Q2hhcnRPcHRpb24+KHt9KTtcblxuICAvLyBPdXRwdXRzXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBzZWdtZW50IGlzIGNsaWNrZWQgKi9cbiAgc2VnbWVudENsaWNrID0gb3V0cHV0PEFYRG9udXRDaGFydERhdGE+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIHNlZ21lbnQgaGFzIG1vdXNlIGhvdmVyXG4gICAqIENhbiBiZSB1c2VkIGJ5IGV4dGVybmFsIGVsZW1lbnRzIHRvIGhpZ2hsaWdodCB0aGlzIHNlZ21lbnRcbiAgICovXG4gIHNlZ21lbnRIb3ZlciA9IG91dHB1dDxBWERvbnV0Q2hhcnREYXRhIHwgbnVsbD4oKTtcblxuICAvLyBDaGFydCBjb250YWluZXIgcmVmZXJlbmNlXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRDb250YWluZXJFbCA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ2NoYXJ0Q29udGFpbmVyJyk7XG5cbiAgLy8gRDMgcmVmZXJlbmNlIC0gbG9hZGVkIGFzeW5jaHJvbm91c2x5XG4gIHByb3RlY3RlZCBkMyE6IHR5cGVvZiBpbXBvcnQoJ2QzJyk7XG5cbiAgLy8gQ2hhcnQgU1ZHIHJlZmVyZW5jZSAodXNpbmcgJ2FueScgc2luY2UgRDMgaXMgbG9hZGVkIGR5bmFtaWNhbGx5IGF0IHJ1bnRpbWUpXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgc3ZnOiBhbnkgPSBudWxsO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHBpZURhdGE6IGFueVtdID0gW107XG5cbiAgLy8gU3RhdGUgbWFuYWdlbWVudFxuICBwcml2YXRlIGhpZGRlblNlZ21lbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgX2luaXRpYWxpemVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfcmVuZGVyZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9pc0luaXRpYWxBbmltYXRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9jdXJyZW50bHlIaWdobGlnaHRlZFNlZ21lbnQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVG9vbHRpcCBzdGF0ZVxuICBwcml2YXRlIF90b29sdGlwVmlzaWJsZSA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBQb3NpdGlvbiA9IHNpZ25hbCh7IHg6IDAsIHk6IDAgfSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBEYXRhID0gc2lnbmFsPEFYQ2hhcnRUb29sdGlwRGF0YT4oe1xuICAgIHRpdGxlOiAnJyxcbiAgICB2YWx1ZTogMCxcbiAgICBwZXJjZW50YWdlOiAnMCUnLFxuICAgIGNvbG9yOiAnJyxcbiAgfSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBSYWZJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3BlbmRpbmdUb29sdGlwQ29vcmRzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAvLyBQdWJsaWMgY29tcHV0ZWQgcHJvcGVydGllcyBmb3IgdGhlIHRlbXBsYXRlXG4gIHByb3RlY3RlZCB0b29sdGlwVmlzaWJsZSA9IHRoaXMuX3Rvb2x0aXBWaXNpYmxlLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBQb3NpdGlvbiA9IHRoaXMuX3Rvb2x0aXBQb3NpdGlvbi5hc1JlYWRvbmx5KCk7XG4gIHByb3RlY3RlZCB0b29sdGlwRGF0YSA9IHRoaXMuX3Rvb2x0aXBEYXRhLmFzUmVhZG9ubHkoKTtcblxuICAvLyBJbmplY3QgY29uZmlndXJhdGlvblxuICBwcml2YXRlIGNvbmZpZ1Rva2VuID0gaW5qZWN0KEFYX0RPTlVUX0NIQVJUX0NPTkZJRyk7XG5cbiAgLy8gSW5qZWN0IHRoZSBjaGFydCBjb2xvcnNcbiAgcHJpdmF0ZSBjaGFydENvbG9ycyA9IGluamVjdChBWF9DSEFSVF9DT0xPUl9QQUxFVFRFKTtcblxuICAvLyBDb21wdXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgcHJvdGVjdGVkIGVmZmVjdGl2ZU9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiBtZXJnZUNoYXJ0T3B0aW9ucyh0aGlzLmNvbmZpZ1Rva2VuLCB0aGlzLm9wdGlvbnMoKSkpO1xuXG4gIC8vIENvbnN0YW50c1xuICBwcml2YXRlIHJlYWRvbmx5IFRPT0xUSVBfR0FQID0gMTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgSElHSExJR0hUX1RSQU5TSVRJT05fRFVSQVRJT04gPSAxNTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgSElHSExJR0hUX1RSQU5TSVRJT05fTkFNRSA9ICdoaWdobGlnaHQnO1xuICBwcml2YXRlIHJlYWRvbmx5IFNFR01FTlRfQU5JTUFUSU9OX0RFTEFZID0gNTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTEFCRUxfQU5JTUFUSU9OX0RFTEFZID0gMjAwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9DSEFSVF9ESU1FTlNJT04gPSAyMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX0NIQVJUX0ZPUl9MQUJFTFMgPSAyNjA7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ0hBUlRfSU5TRVQgPSAxMjtcbiAgcHJpdmF0ZSByZWFkb25seSBESU1NRURfT1BBQ0lUWSA9IDAuNTtcbiAgcHJpdmF0ZSByZWFkb25seSBWSVNJQkxFX09QQUNJVFkgPSAxO1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RhbmNlSWQgPSBjcmVhdGVDaGFydEluc3RhbmNlSWQoJ2F4LWRvbnV0Jyk7XG4gIHByaXZhdGUgZ2V0IHNlZ21lbnRTaGFkb3dGaWx0ZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmluc3RhbmNlSWR9LXNlZ21lbnQtc2hhZG93YDtcbiAgfVxuXG4gIC8vIE1lc3NhZ2VzIHdpdGggZGVmYXVsdHNcbiAgcHJvdGVjdGVkIGVmZmVjdGl2ZU1lc3NhZ2VzID0gY29tcHV0ZWQoKCkgPT5cbiAgICBtZXJnZUNoYXJ0TWVzc2FnZXModGhpcy5jb25maWdUb2tlbi5tZXNzYWdlcywgdGhpcy5vcHRpb25zKCk/Lm1lc3NhZ2VzKSxcbiAgKTtcblxuICAvLyBEYXRhIGFjY2Vzc29yIGZvciBoYW5kbGluZyBkaWZmZXJlbnQgaW5jb21pbmcgZGF0YSBmb3JtYXRzXG4gIHByb3RlY3RlZCBjaGFydERhdGFBcnJheSA9IGNvbXB1dGVkKCgpOiBBWERvbnV0Q2hhcnREYXRhW10gPT4ge1xuICAgIHJldHVybiB0aGlzLmRhdGEoKSB8fCBbXTtcbiAgfSk7XG5cbiAgLy8gQ29sb3IgYWNjZXNzb3IgbWV0aG9kXG4gIHByb3RlY3RlZCBnZXRDb2xvcihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0Q2hhcnRDb2xvcihpbmRleCwgdGhpcy5jaGFydENvbG9ycyk7XG4gIH1cblxuICAvLyBTZWdtZW50IHZpc2liaWxpdHkgY2hlY2tcbiAgcHJvdGVjdGVkIGlzU2VnbWVudEhpZGRlbihpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGlkZGVuU2VnbWVudHMuaGFzKGlkKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gRHluYW1pY2FsbHkgbG9hZCBEMyBhbmQgaW5pdGlhbGl6ZSB0aGUgY2hhcnQgd2hlbiB0aGUgY29tcG9uZW50IGlzIHJlYWR5XG4gICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVkLnNldCh0cnVlKTtcbiAgICAgIHRoaXMubG9hZEQzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFDaGFuZ2VFZmZlY3QgPSBlZmZlY3QoKCkgPT4ge1xuICAgIC8vIFRyYWNrIGRhdGEgYW5kIG9wdGlvbnMgY2hhbmdlc1xuICAgIHRoaXMuZGF0YSgpO1xuICAgIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuXG4gICAgLy8gT25seSB1cGRhdGUgaWYgYWxyZWFkeSByZW5kZXJlZFxuICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fcmVuZGVyZWQoKSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBIaWdobGlnaHRzIGEgc3BlY2lmaWMgc2VnbWVudCBieSBJRFxuICAgKiBAcGFyYW0gaWQgVGhlIHNlZ21lbnQgSUQgdG8gaGlnaGxpZ2h0LCBvciBudWxsIHRvIGNsZWFyIGhpZ2hsaWdodFxuICAgKi9cbiAgaGlnaGxpZ2h0U2VnbWVudChpZDogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcoKSB8fCAhdGhpcy5zdmcpIHJldHVybjtcblxuICAgIGlmICh0aGlzLl9jdXJyZW50bHlIaWdobGlnaHRlZFNlZ21lbnQoKSA9PT0gaWQpIHJldHVybjtcblxuICAgIHRoaXMuX2N1cnJlbnRseUhpZ2hsaWdodGVkU2VnbWVudC5zZXQoaWQpO1xuXG4gICAgLy8gT25seSBpbnRlcnJ1cHQgb25nb2luZyBISUdITElHSFQgdHJhbnNpdGlvbnMgKG5vdCBpbml0aWFsIGFuaW1hdGlvbnMpXG4gICAgdGhpcy5zdmcuc2VsZWN0QWxsKCdwYXRoJykuaW50ZXJydXB0KHRoaXMuSElHSExJR0hUX1RSQU5TSVRJT05fTkFNRSk7XG5cbiAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuY2xlYXJBbGxIaWdobGlnaHRzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCB0YXJnZXRTZWdtZW50ID0gdGhpcy5zdmcuc2VsZWN0QWxsKCdwYXRoJykuZmlsdGVyKChkOiBhbnkpID0+IGQ/LmRhdGE/LmlkID09PSBpZCk7XG5cbiAgICBpZiAodGFyZ2V0U2VnbWVudC5lbXB0eSgpKSB7XG4gICAgICB0aGlzLl9jdXJyZW50bHlIaWdobGlnaHRlZFNlZ21lbnQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5oaWdobGlnaHRTZWdtZW50KG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGltTm9uVGFyZ2V0U2VnbWVudHMoaWQpO1xuICAgIHRoaXMuaGlnaGxpZ2h0VGFyZ2V0U2VnbWVudCh0YXJnZXRTZWdtZW50KTtcbiAgICB0aGlzLnNlZ21lbnRIb3Zlci5lbWl0KHRoaXMuZ2V0U2VnbWVudERhdGFCeUlkKGlkKSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyQWxsSGlnaGxpZ2h0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICB0aGlzLnN2Z1xuICAgICAgLnNlbGVjdEFsbCgncGF0aCcpXG4gICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtaGlnaGxpZ2h0ZWQnLCBmYWxzZSlcbiAgICAgIC5jbGFzc2VkKCdheC1kb251dC1jaGFydC1kaW1tZWQnLCBmYWxzZSlcbiAgICAgIC50cmFuc2l0aW9uKHRoaXMuSElHSExJR0hUX1RSQU5TSVRJT05fTkFNRSlcbiAgICAgIC5kdXJhdGlvbih0aGlzLkhJR0hMSUdIVF9UUkFOU0lUSU9OX0RVUkFUSU9OKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIG51bGwpXG4gICAgICAuc3R5bGUoJ2ZpbHRlcicsIG51bGwpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCB0aGlzLlZJU0lCTEVfT1BBQ0lUWSk7XG5cbiAgICB0aGlzLnNlZ21lbnRIb3Zlci5lbWl0KG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaW1Ob25UYXJnZXRTZWdtZW50cyh0YXJnZXRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN2ZykgcmV0dXJuO1xuXG4gICAgdGhpcy5zdmdcbiAgICAgIC5zZWxlY3RBbGwoJ3BhdGgnKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIC5maWx0ZXIoKGQ6IGFueSkgPT4gZD8uZGF0YT8uaWQgIT09IHRhcmdldElkKVxuICAgICAgLmNsYXNzZWQoJ2F4LWRvbnV0LWNoYXJ0LWhpZ2hsaWdodGVkJywgZmFsc2UpXG4gICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtZGltbWVkJywgdHJ1ZSlcbiAgICAgIC50cmFuc2l0aW9uKHRoaXMuSElHSExJR0hUX1RSQU5TSVRJT05fTkFNRSlcbiAgICAgIC5kdXJhdGlvbih0aGlzLkhJR0hMSUdIVF9UUkFOU0lUSU9OX0RVUkFUSU9OKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIG51bGwpXG4gICAgICAuc3R5bGUoJ2ZpbHRlcicsIG51bGwpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCB0aGlzLkRJTU1FRF9PUEFDSVRZKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgaGlnaGxpZ2h0VGFyZ2V0U2VnbWVudCh0YXJnZXRTZWdtZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0YXJnZXRTZWdtZW50XG4gICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtZGltbWVkJywgZmFsc2UpXG4gICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtaGlnaGxpZ2h0ZWQnLCB0cnVlKVxuICAgICAgLnRyYW5zaXRpb24odGhpcy5ISUdITElHSFRfVFJBTlNJVElPTl9OQU1FKVxuICAgICAgLmR1cmF0aW9uKHRoaXMuSElHSExJR0hUX1RSQU5TSVRJT05fRFVSQVRJT04pXG4gICAgICAuc3R5bGUoJ2ZpbHRlcicsIGB1cmwoIyR7dGhpcy5zZWdtZW50U2hhZG93RmlsdGVySWR9KWApXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCB0aGlzLlZJU0lCTEVfT1BBQ0lUWSk7XG4gIH1cblxuICBwcml2YXRlIGdldFNlZ21lbnREYXRhQnlJZChzZWdtZW50SWQ6IHN0cmluZyk6IEFYRG9udXRDaGFydERhdGEgfCBudWxsIHtcbiAgICByZXR1cm4gdW50cmFja2VkKCgpID0+IHRoaXMuY2hhcnREYXRhQXJyYXkoKSkuZmluZCgoZCkgPT4gZC5pZCA9PT0gc2VnbWVudElkKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdmlzaWJpbGl0eSBvZiBhIHNlZ21lbnQgYnkgSURcbiAgICogQHBhcmFtIGlkIFNlZ21lbnQgSUQgdG8gdG9nZ2xlXG4gICAqIEByZXR1cm5zIE5ldyB2aXNpYmlsaXR5IHN0YXRlICh0cnVlID0gdmlzaWJsZSwgZmFsc2UgPSBoaWRkZW4pXG4gICAqL1xuICB0b2dnbGVTZWdtZW50KGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBjaGFydERhdGEgPSB0aGlzLmNoYXJ0RGF0YUFycmF5KCk7XG4gICAgY29uc3Qgd2FzQWxsSGlkZGVuID0gY2hhcnREYXRhLmxlbmd0aCA+IDAgJiYgY2hhcnREYXRhLmV2ZXJ5KChkKSA9PiB0aGlzLmlzU2VnbWVudEhpZGRlbihkLmlkKSk7XG5cbiAgICBpZiAodGhpcy5oaWRkZW5TZWdtZW50cy5oYXMoaWQpKSB7XG4gICAgICAvLyBNYWtpbmcgYSBzZWdtZW50IHZpc2libGVcbiAgICAgIHRoaXMuaGlkZGVuU2VnbWVudHMuZGVsZXRlKGlkKTtcblxuICAgICAgLy8gSWYgYWxsIHNlZ21lbnRzIHdlcmUgcHJldmlvdXNseSBoaWRkZW4sIHdlIG5lZWQgdG8gZW5zdXJlIHRoZSBtZXNzYWdlIGlzIGNsZWFyZWRcbiAgICAgIGlmICh3YXNBbGxIaWRkZW4pIHtcbiAgICAgICAgLy8gRm9yY2UgY29tcGxldGUgRE9NIGNsZWFudXAgYW5kIHJlZHJhd1xuICAgICAgICBpZiAodGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBDbGVhciBvbmx5IGNoYXJ0IFNWRyBhbmQgbWVzc2FnZSBjb250YWluZXJzIChwcmVzZXJ2ZSB0b29sdGlwIGNvbXBvbmVudClcbiAgICAgICAgICB0aGlzLmQzXG4gICAgICAgICAgICA/LnNlbGVjdCh0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50KVxuICAgICAgICAgICAgLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtZW1wdHksIC5heC1jaGFydC1tZXNzYWdlLWNvbnRhaW5lciwgLmF4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtbWVzc2FnZScpXG4gICAgICAgICAgICAucmVtb3ZlKCk7XG5cbiAgICAgICAgICAvLyBGb3JjZSBmdWxsIHJlZHJhd1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhpZGluZyBhIHNlZ21lbnRcbiAgICAgIHRoaXMuaGlkZGVuU2VnbWVudHMuYWRkKGlkKTtcbiAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gIXRoaXMuaXNTZWdtZW50SGlkZGVuKGlkKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cENoYXJ0KCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgRDMuanMgZHluYW1pY2FsbHlcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkRDMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZDMgPSBhd2FpdCBpbXBvcnQoJ2QzJyk7XG4gICAgICAvLyBJZiBjb250YWluZXIgaXMgcmVhZHksIGNyZWF0ZSBjaGFydFxuICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKCkgJiYgdGhpcy5jaGFydENvbnRhaW5lckVsKCkpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgICB0aGlzLl9yZW5kZXJlZC5zZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIEQzLmpzOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TZWdtZW50Q2xpY2soaXRlbTogQVhEb251dENoYXJ0RGF0YSk6IHZvaWQge1xuICAgIHRoaXMuc2VnbWVudENsaWNrLmVtaXQoaXRlbSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZG9udXQgY2hhcnQgZnJvbSBjdXJyZW50IGRhdGFcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVDaGFydCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZDMgfHwgIXRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICB0aGlzLmNsZWFyQ2hhcnQoY29udGFpbmVyRWxlbWVudCk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNoYXJ0RGF0YUFycmF5KCk7XG4gICAgICBpZiAoIWRhdGEgfHwgZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zaG93Tm9EYXRhTWVzc2FnZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZpc2libGVEYXRhID0gZGF0YS5maWx0ZXIoKGl0ZW0pID0+ICF0aGlzLmhpZGRlblNlZ21lbnRzLmhhcyhpdGVtLmlkKSk7XG4gICAgICBpZiAodmlzaWJsZURhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuc2hvd0FsbFNlZ21lbnRzSGlkZGVuTWVzc2FnZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcbiAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5zZXR1cERpbWVuc2lvbnMoY29udGFpbmVyRWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICB0aGlzLnJlbmRlckRvbnV0Q2hhcnQoY29udGFpbmVyRWxlbWVudCwgd2lkdGgsIGhlaWdodCwgdmlzaWJsZURhdGEpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBjcmVhdGluZyBkb251dCBjaGFydDonLCBlcnJvcik7XG4gICAgICB0aGlzLmhhbmRsZUNoYXJ0RXJyb3IoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY2hhcnQgd2l0aCBuZXcgZGF0YVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIC8vIFJlc2V0IGhpZ2hsaWdodGVkIHNlZ21lbnQgc3RhdGUgd2hlbiB1cGRhdGluZ1xuICAgIHRoaXMuX2N1cnJlbnRseUhpZ2hsaWdodGVkU2VnbWVudC5zZXQobnVsbCk7XG4gICAgdGhpcy5jcmVhdGVDaGFydCgpOyAvLyBSZWNyZWF0ZSB0aGUgY2hhcnQgd2l0aCB1cGRhdGVkIGRhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGNoYXJ0IGNvbnRhaW5lclxuICAgKi9cbiAgcHJpdmF0ZSBjbGVhckNoYXJ0KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLmQzLnNlbGVjdChjb250YWluZXIpLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtZW1wdHksIC5heC1jaGFydC1tZXNzYWdlLWNvbnRhaW5lciwgLmF4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtbWVzc2FnZScpLnJlbW92ZSgpO1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBtZXNzYWdlIHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGVcbiAgICovXG4gIHByaXZhdGUgc2hvd05vRGF0YU1lc3NhZ2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpO1xuICAgIHJlbmRlckNoYXJ0RW1wdHlNZXNzYWdlKHRoaXMuZDMsIHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQsIHtcbiAgICAgIGljb246IG1lc3NhZ2VzLm5vRGF0YUljb24sXG4gICAgICB0aXRsZTogbWVzc2FnZXMubm9EYXRhLFxuICAgICAgaGVscDogbWVzc2FnZXMubm9EYXRhSGVscCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG1lc3NhZ2Ugd2hlbiBhbGwgc2VnbWVudHMgYXJlIGhpZGRlblxuICAgKi9cbiAgcHJpdmF0ZSBzaG93QWxsU2VnbWVudHNIaWRkZW5NZXNzYWdlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcbiAgICBjb25zdCBtZXNzYWdlcyA9IHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKTtcbiAgICByZW5kZXJDaGFydEVtcHR5TWVzc2FnZSh0aGlzLmQzLCB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50LCB7XG4gICAgICBpY29uOiBtZXNzYWdlcy5hbGxIaWRkZW5JY29uLFxuICAgICAgdGl0bGU6IG1lc3NhZ2VzLmFsbEhpZGRlbixcbiAgICAgIGhlbHA6IG1lc3NhZ2VzLmFsbEhpZGRlbkhlbHAsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0dXBzIGNoYXJ0IGRpbWVuc2lvbnMgYmFzZWQgb24gY29udGFpbmVyIGFuZCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIHNldHVwRGltZW5zaW9ucyhjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zOiBBWERvbnV0Q2hhcnRPcHRpb24pOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gTWF0aC5tYXgoY29udGFpbmVyLmNsaWVudFdpZHRoLCAxKTtcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSBNYXRoLm1heChjb250YWluZXIuY2xpZW50SGVpZ2h0LCAxKTtcblxuICAgIGNvbnN0IGRlc2lyZWRXaWR0aCA9IG9wdGlvbnM/LndpZHRoIHx8IGNvbnRhaW5lcldpZHRoO1xuICAgIGNvbnN0IGRlc2lyZWRIZWlnaHQgPSBvcHRpb25zPy5oZWlnaHQgfHwgY29udGFpbmVySGVpZ2h0O1xuICAgIC8vIEtlZXAgZG9udXQgZ2VvbWV0cnkgc3F1YXJlIHNvIHNpZGUgc3BhY2luZyBzdGF5cyB2aXN1YWxseSBiYWxhbmNlZC5cbiAgICBjb25zdCBjaGFydFNpemUgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihkZXNpcmVkV2lkdGgsIGRlc2lyZWRIZWlnaHQpKTtcblxuICAgIHJldHVybiB7IHdpZHRoOiBjaGFydFNpemUsIGhlaWdodDogY2hhcnRTaXplIH07XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgZG9udXQgY2hhcnQgd2l0aCB2aXNpYmxlIGRhdGFcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyRG9udXRDaGFydChcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgdmlzaWJsZURhdGE6IEFYRG9udXRDaGFydERhdGFbXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZGlzcGxheVRvdGFsID0gdGhpcy5nZXREaXNwbGF5VG90YWwodmlzaWJsZURhdGEpO1xuICAgIGNvbnN0IGxheW91dFRvdGFsID0gdGhpcy5nZXRMYXlvdXRUb3RhbCh2aXNpYmxlRGF0YSk7XG5cbiAgICAvLyBDcmVhdGUgU1ZHIGNvbnRhaW5lciB3aXRoIGZpbHRlcnNcbiAgICBjb25zdCBzdmcgPSB0aGlzLmNyZWF0ZVN2Z1dpdGhGaWx0ZXJzKGNvbnRhaW5lciwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAvLyBDcmVhdGUgbWFpbiBjaGFydCBncm91cFxuICAgIHRoaXMuc3ZnID0gc3ZnLmFwcGVuZCgnZycpLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt3aWR0aCAvIDJ9LCAke2hlaWdodCAvIDJ9KWApO1xuXG4gICAgY29uc3QgeyBpbm5lclJhZGl1cyB9ID0gdGhpcy5nZXREb251dFJhZGlpKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgLy8gQ3JlYXRlIGRvbnV0IHNlZ21lbnRzXG4gICAgdGhpcy5jcmVhdGVEb251dFNlZ21lbnRzKHdpZHRoLCBoZWlnaHQsIHZpc2libGVEYXRhLCBsYXlvdXRUb3RhbCk7XG5cbiAgICAvLyBBZGQgdG90YWwgaW4gY2VudGVyXG4gICAgdGhpcy5hZGRDZW50ZXJEaXNwbGF5KGRpc3BsYXlUb3RhbCwgaW5uZXJSYWRpdXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREb251dFJhZGlpKFxuICAgIGNoYXJ0V2lkdGg6IG51bWJlcixcbiAgICBjaGFydEhlaWdodDogbnVtYmVyLFxuICApOiB7IGlubmVyUmFkaXVzOiBudW1iZXI7IG91dGVyUmFkaXVzOiBudW1iZXI7IHJhZGl1czogbnVtYmVyIH0ge1xuICAgIGNvbnN0IG1heFJhZGl1cyA9IE1hdGgubWluKGNoYXJ0V2lkdGgsIGNoYXJ0SGVpZ2h0KSAvIDI7XG4gICAgY29uc3QgcmFkaXVzID0gTWF0aC5tYXgoMCwgbWF4UmFkaXVzIC0gdGhpcy5DSEFSVF9JTlNFVCk7XG4gICAgY29uc3QgZG9udXRXaWR0aFBlcmNlbnQgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5kb251dFdpZHRoIC8gMTAwO1xuICAgIGNvbnN0IGlubmVyUmFkaXVzID0gcmFkaXVzICogKDEgLSBkb251dFdpZHRoUGVyY2VudCk7XG4gICAgY29uc3Qgb3V0ZXJSYWRpdXMgPSByYWRpdXMgKiAwLjk1O1xuXG4gICAgcmV0dXJuIHsgaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCByYWRpdXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgU1ZHIGVsZW1lbnQgd2l0aCBmaWx0ZXIgZGVmaW5pdGlvbnMgZm9yIHNoYWRvd3NcbiAgICogQHJldHVybnMgRDMgU1ZHIHNlbGVjdGlvbiAoYW55IHR5cGUgZHVlIHRvIGR5bmFtaWMgRDMgbG9hZGluZylcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgY3JlYXRlU3ZnV2l0aEZpbHRlcnMoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoY29udGFpbmVyKVxuICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgIC5hdHRyKCd3aWR0aCcsICcxMDAlJylcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCAnMTAwJScpXG4gICAgICAuYXR0cigndmlld0JveCcsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YClcbiAgICAgIC5hdHRyKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJywgJ3hNaWRZTWlkIG1lZXQnKTtcblxuICAgIC8vIEFkZCBkcm9wIHNoYWRvdyBmaWx0ZXJcbiAgICBjb25zdCBkZWZzID0gc3ZnLmFwcGVuZCgnZGVmcycpO1xuICAgIGNvbnN0IGZpbHRlciA9IGRlZnMuYXBwZW5kKCdmaWx0ZXInKS5hdHRyKCdpZCcsIHRoaXMuc2VnbWVudFNoYWRvd0ZpbHRlcklkKS5hdHRyKCdoZWlnaHQnLCAnMTMwJScpO1xuXG4gICAgZmlsdGVyLmFwcGVuZCgnZmVHYXVzc2lhbkJsdXInKS5hdHRyKCdpbicsICdTb3VyY2VBbHBoYScpLmF0dHIoJ3N0ZERldmlhdGlvbicsIDIpLmF0dHIoJ3Jlc3VsdCcsICdibHVyJyk7XG4gICAgZmlsdGVyLmFwcGVuZCgnZmVPZmZzZXQnKS5hdHRyKCdpbicsICdibHVyJykuYXR0cignZHgnLCAxKS5hdHRyKCdkeScsIDEpLmF0dHIoJ3Jlc3VsdCcsICdvZmZzZXRCbHVyJyk7XG5cbiAgICBjb25zdCBmZUNvbXBvbmVudFRyYW5zZmVyID0gZmlsdGVyXG4gICAgICAuYXBwZW5kKCdmZUNvbXBvbmVudFRyYW5zZmVyJylcbiAgICAgIC5hdHRyKCdpbicsICdvZmZzZXRCbHVyJylcbiAgICAgIC5hdHRyKCdyZXN1bHQnLCAnb2Zmc2V0Qmx1cicpO1xuXG4gICAgZmVDb21wb25lbnRUcmFuc2Zlci5hcHBlbmQoJ2ZlRnVuY0EnKS5hdHRyKCd0eXBlJywgJ2xpbmVhcicpLmF0dHIoJ3Nsb3BlJywgMC4zKTtcblxuICAgIGNvbnN0IGZlTWVyZ2UgPSBmaWx0ZXIuYXBwZW5kKCdmZU1lcmdlJyk7XG4gICAgZmVNZXJnZS5hcHBlbmQoJ2ZlTWVyZ2VOb2RlJykuYXR0cignaW4nLCAnb2Zmc2V0Qmx1cicpO1xuICAgIGZlTWVyZ2UuYXBwZW5kKCdmZU1lcmdlTm9kZScpLmF0dHIoJ2luJywgJ1NvdXJjZUdyYXBoaWMnKTtcblxuICAgIHJldHVybiBzdmc7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuZCByZW5kZXIgdGhlIGRvbnV0IHNlZ21lbnRzIHdpdGggYW5pbWF0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVEb251dFNlZ21lbnRzKFxuICAgIGNoYXJ0V2lkdGg6IG51bWJlcixcbiAgICBjaGFydEhlaWdodDogbnVtYmVyLFxuICAgIGRhdGE6IEFYRG9udXRDaGFydERhdGFbXSxcbiAgICBsYXlvdXRUb3RhbDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcuc2V0KHRydWUpO1xuXG4gICAgLy8gQ3JlYXRlIHBpZSBsYXlvdXRcbiAgICBjb25zdCBwaWUgPSB0aGlzLmQzXG4gICAgICAucGllPEFYRG9udXRDaGFydERhdGE+KClcbiAgICAgIC52YWx1ZSgoZCkgPT4gdGhpcy5nZXRTZWdtZW50TGF5b3V0VmFsdWUoZC52YWx1ZSkpXG4gICAgICAuc29ydChudWxsKVxuICAgICAgLnBhZEFuZ2xlKDAuMDIpO1xuXG4gICAgY29uc3QgeyBpbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMgfSA9IHRoaXMuZ2V0RG9udXRSYWRpaShjaGFydFdpZHRoLCBjaGFydEhlaWdodCk7XG4gICAgY29uc3QgcmluZ1dpZHRoID0gb3V0ZXJSYWRpdXMgLSBpbm5lclJhZGl1cztcblxuICAgIGNvbnN0IGFyYyA9IHRoaXMuZDNcbiAgICAgIC5hcmMoKVxuICAgICAgLmlubmVyUmFkaXVzKGlubmVyUmFkaXVzKVxuICAgICAgLm91dGVyUmFkaXVzKG91dGVyUmFkaXVzKVxuICAgICAgLmNvcm5lclJhZGl1cyh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5jb3JuZXJSYWRpdXMpO1xuXG4gICAgY29uc3QgbGFiZWxBcmMgPSB0aGlzLmQzXG4gICAgICAuYXJjKClcbiAgICAgIC5pbm5lclJhZGl1cyhpbm5lclJhZGl1cyArIHJpbmdXaWR0aCAvIDIpXG4gICAgICAub3V0ZXJSYWRpdXMoaW5uZXJSYWRpdXMgKyByaW5nV2lkdGggLyAyKTtcblxuICAgIC8vIEdldCBhbmltYXRpb24gb3B0aW9uc1xuICAgIGNvbnN0IGFuaW1hdGlvbkR1cmF0aW9uID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYW5pbWF0aW9uRHVyYXRpb247XG4gICAgY29uc3QgYW5pbWF0aW9uRWFzaW5nID0gZ2V0RWFzaW5nRnVuY3Rpb24odGhpcy5kMywgdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYW5pbWF0aW9uRWFzaW5nKTtcblxuICAgIC8vIEdlbmVyYXRlIHBpZSBkYXRhXG4gICAgdGhpcy5waWVEYXRhID0gcGllKGRhdGEpO1xuXG4gICAgLy8gQWRkIHNlZ21lbnRzIHdpdGggYW5pbWF0aW9uXG4gICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLnN2Z1xuICAgICAgLnNlbGVjdEFsbCgncGF0aCcpXG4gICAgICAuZGF0YSh0aGlzLnBpZURhdGEpXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtZG9udXQtY2hhcnQtc2VnbWVudCcpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAoZDogYW55KSA9PiB0aGlzLmdldFNlZ21lbnRDb2xvcihkLmRhdGEpKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMClcbiAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIC5vbignbW91c2VlbnRlcicsIChldmVudDogTW91c2VFdmVudCwgZDogYW55KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93VG9vbHRpcCkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlU2xpY2VIb3ZlcihldmVudCwgZC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5vbignbW91c2VsZWF2ZScsICgpID0+IHRoaXMuaGFuZGxlU2VnbWVudExlYXZlKCkpXG4gICAgICAub24oJ21vdXNlbW92ZScsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fdG9vbHRpcFZpc2libGUoKSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAub24oJ2NsaWNrJywgKF9ldmVudDogTW91c2VFdmVudCwgZDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25TZWdtZW50Q2xpY2soZC5kYXRhKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gQW5pbWF0ZSBzZWdtZW50c1xuICAgIGNvbnN0IG51bVNlZ21lbnRzID0gdGhpcy5waWVEYXRhLmxlbmd0aDtcbiAgICBsZXQgY29tcGxldGVkID0gMDtcbiAgICBzZWdtZW50c1xuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgLmVhc2UoYW5pbWF0aW9uRWFzaW5nKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIC5kZWxheSgoX2Q6IGFueSwgaTogbnVtYmVyKSA9PiBpICogdGhpcy5TRUdNRU5UX0FOSU1BVElPTl9ERUxBWSlcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsIHRoaXMuVklTSUJMRV9PUEFDSVRZKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIC5hdHRyVHdlZW4oJ2QnLCAoZDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGludGVycG9sYXRlID0gdGhpcy5kMy5pbnRlcnBvbGF0ZSh7IHN0YXJ0QW5nbGU6IGQuc3RhcnRBbmdsZSwgZW5kQW5nbGU6IGQuc3RhcnRBbmdsZSB9LCBkKTtcbiAgICAgICAgcmV0dXJuICh0OiBudW1iZXIpID0+IGFyYyhpbnRlcnBvbGF0ZSh0KSkgYXMgc3RyaW5nO1xuICAgICAgfSlcbiAgICAgIC5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICBjb21wbGV0ZWQrKztcbiAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBudW1TZWdtZW50cykge1xuICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbEFuaW1hdGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5vbignaW50ZXJydXB0JywgKCkgPT4ge1xuICAgICAgICAvLyBUcmVhdCBpbnRlcnJ1cHRzIGFzIGNvbXBsZXRpb24gdG8gYXZvaWQgZ2V0dGluZyBzdHVjayBpbiBhbmltYXRpbmcgc3RhdGVcbiAgICAgICAgY29tcGxldGVkKys7XG4gICAgICAgIGlmIChjb21wbGV0ZWQgPj0gbnVtU2VnbWVudHMpIHtcbiAgICAgICAgICB0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgLy8gQWRkIGRhdGEgbGFiZWxzIGlmIGVuYWJsZWQgYW5kIGNoYXJ0IHNpemUgaXMgc3VmZmljaWVudFxuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93RGF0YUxhYmVscyAmJiB0aGlzLmlzQ2hhcnRMYXJnZUVub3VnaEZvckxhYmVscyhjaGFydFdpZHRoLCBjaGFydEhlaWdodCkpIHtcbiAgICAgIHRoaXMuYWRkRGF0YUxhYmVscyhsYWJlbEFyYywgb3V0ZXJSYWRpdXMsIGlubmVyUmFkaXVzLCBsYXlvdXRUb3RhbCwgYW5pbWF0aW9uRHVyYXRpb24pO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSB3aGVuIGFsbCBzZWdtZW50IGFuaW1hdGlvbnMgYXJlIGNvbXBsZXRlIChoYW5kbGUgZW1wdHkgY2FzZSlcbiAgICBpZiAobnVtU2VnbWVudHMgPT09IDApIHtcbiAgICAgIHRoaXMuX2lzSW5pdGlhbEFuaW1hdGluZy5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNDaGFydExhcmdlRW5vdWdoRm9yTGFiZWxzKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE1hdGgubWluKHdpZHRoLCBoZWlnaHQpID49IHRoaXMuTUlOX0NIQVJUX0ZPUl9MQUJFTFM7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIGFkZERhdGFMYWJlbHMoXG4gICAgbGFiZWxBcmM6IGFueSxcbiAgICBvdXRlclJhZGl1czogbnVtYmVyLFxuICAgIGlubmVyUmFkaXVzOiBudW1iZXIsXG4gICAgbGF5b3V0VG90YWw6IG51bWJlcixcbiAgICBhbmltYXRpb25EdXJhdGlvbjogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICBjb25zdCBkYXRhV2l0aExhYmVscyA9IHRoaXMucGllRGF0YS5maWx0ZXIoKGQpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZUxhYmVsRm9udFNpemUoZCwgb3V0ZXJSYWRpdXMsIGlubmVyUmFkaXVzLCBsYXlvdXRUb3RhbCkgPiAwO1xuICAgIH0pO1xuXG4gICAgY29uc3QgbGFiZWxzID0gdGhpcy5zdmdcbiAgICAgIC5zZWxlY3RBbGwoJy5heC1kb251dC1jaGFydC1kYXRhLWxhYmVsJylcbiAgICAgIC5kYXRhKGRhdGFXaXRoTGFiZWxzKVxuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWRvbnV0LWNoYXJ0LWRhdGEtbGFiZWwnKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMClcbiAgICAgIC5zdHlsZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtZG9udXQtY2hhcnQtZGF0YS1sYWJlbHMtY29sb3IpKScpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgKGQpID0+IHtcbiAgICAgICAgY29uc3QgY2VudHJvaWQgPSBsYWJlbEFyYy5jZW50cm9pZChkKTtcbiAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGUoJHtjZW50cm9pZFswXX0sICR7Y2VudHJvaWRbMV19KWA7XG4gICAgICB9KVxuICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAuYXR0cignZG9taW5hbnQtYmFzZWxpbmUnLCAnbWlkZGxlJylcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgKGQpID0+IGAke3RoaXMuY2FsY3VsYXRlTGFiZWxGb250U2l6ZShkLCBvdXRlclJhZGl1cywgaW5uZXJSYWRpdXMsIGxheW91dFRvdGFsKX1weGApXG4gICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgKGQpID0+ICh0aGlzLmdldFNlZ21lbnRQZXJjZW50YWdlKGQuZGF0YS52YWx1ZSwgbGF5b3V0VG90YWwpID49IDE1ID8gJzYwMCcgOiAnNTAwJykpXG4gICAgICAudGV4dCgoZCkgPT4gdGhpcy5nZXRUcnVuY2F0ZWRMYWJlbFRleHQoZCwgb3V0ZXJSYWRpdXMsIGlubmVyUmFkaXVzLCBsYXlvdXRUb3RhbCkpO1xuXG4gICAgbGFiZWxzXG4gICAgICAudHJhbnNpdGlvbigpXG4gICAgICAuZHVyYXRpb24oYW5pbWF0aW9uRHVyYXRpb24pXG4gICAgICAuZGVsYXkoKF9kLCBpOiBudW1iZXIpID0+IGkgKiB0aGlzLlNFR01FTlRfQU5JTUFUSU9OX0RFTEFZICsgdGhpcy5MQUJFTF9BTklNQVRJT05fREVMQVkpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCB0aGlzLlZJU0lCTEVfT1BBQ0lUWSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBmb250IHNpemUgZm9yIGRhdGEgbGFiZWxzIHVzaW5nIHRoZSBkb251dCByaW5nJ3MgcGh5c2ljYWwgZGltZW5zaW9ucy5cbiAgICpcbiAgICogUHJpbWFyeSBkcml2ZXIgaXMgdGhlIHJpbmcgd2lkdGggKHJhZGlhbCBzcGFjZSksIHdpdGggY2hvcmQgbGVuZ3RoIGFzIGFuXG4gICAqIG92ZXJmbG93IGd1YXJkIGFuZCBhIGdlbnRsZSBzY2FsZS1kb3duIGZvciBzbWFsbGVyIHNlZ21lbnRzIHRvIGNyZWF0ZVxuICAgKiB2aXN1YWwgaGllcmFyY2h5LlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBjYWxjdWxhdGVMYWJlbEZvbnRTaXplKGQ6IGFueSwgb3V0ZXJSYWRpdXM6IG51bWJlciwgaW5uZXJSYWRpdXM6IG51bWJlciwgbGF5b3V0VG90YWw6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgYW5nbGUgPSBkLmVuZEFuZ2xlIC0gZC5zdGFydEFuZ2xlO1xuICAgIGNvbnN0IHNlZ21lbnRQZXJjZW50YWdlID0gdGhpcy5nZXRTZWdtZW50UGVyY2VudGFnZShkLmRhdGEudmFsdWUsIGxheW91dFRvdGFsKTtcblxuICAgIGlmIChzZWdtZW50UGVyY2VudGFnZSA8IDIpIHJldHVybiAwO1xuXG4gICAgY29uc3QgcmluZ1dpZHRoID0gb3V0ZXJSYWRpdXMgLSBpbm5lclJhZGl1cztcbiAgICBjb25zdCBsYWJlbFJhZGl1cyA9IGlubmVyUmFkaXVzICsgcmluZ1dpZHRoIC8gMjtcbiAgICBjb25zdCBjaG9yZExlbmd0aCA9IDIgKiBsYWJlbFJhZGl1cyAqIE1hdGguc2luKGFuZ2xlIC8gMik7XG5cbiAgICBjb25zdCBNSU5fQ0hPUkQgPSAyMjtcbiAgICBjb25zdCBNSU5fUklORyA9IDE2O1xuICAgIGlmIChjaG9yZExlbmd0aCA8IE1JTl9DSE9SRCB8fCByaW5nV2lkdGggPCBNSU5fUklORykgcmV0dXJuIDA7XG5cbiAgICBjb25zdCByaW5nQmFzZWRTaXplID0gcmluZ1dpZHRoICogMC40ODtcblxuICAgIC8vIFNlZ21lbnRzID49IDIwJSBnZXQgZnVsbCBzaXplOyBzbWFsbGVyIG9uZXMgc2NhbGUgZnJvbSAwLjc1IOKGkiAxLjBcbiAgICBjb25zdCBzZWdtZW50U2NhbGUgPSBNYXRoLm1pbigxLCAwLjc1ICsgMC4yNSAqIChzZWdtZW50UGVyY2VudGFnZSAvIDIwKSk7XG5cbiAgICAvLyBBdCBsZWFzdCAyIGNoYXJhY3RlcnMgKFwiWCVcIikgbXVzdCBmaXQgaG9yaXpvbnRhbGx5XG4gICAgY29uc3QgbWF4QnlDaG9yZCA9IGNob3JkTGVuZ3RoIC8gKDIgKiAwLjY1KTtcblxuICAgIGNvbnN0IGZvbnRTaXplID0gTWF0aC5taW4ocmluZ0Jhc2VkU2l6ZSAqIHNlZ21lbnRTY2FsZSwgbWF4QnlDaG9yZCk7XG5cbiAgICBjb25zdCBNSU5fRk9OVF9TSVpFID0gMTE7XG4gICAgY29uc3QgTUFYX0ZPTlRfU0laRSA9IDIwO1xuXG4gICAgcmV0dXJuIE1hdGgucm91bmQoTWF0aC5tYXgoTUlOX0ZPTlRfU0laRSwgTWF0aC5taW4oZm9udFNpemUsIE1BWF9GT05UX1NJWkUpKSAqIDIpIC8gMjtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0UGVyY2VudGFnZSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPCAxKSByZXR1cm4gJzwxJSc7XG4gICAgaWYgKHZhbHVlIDwgMTApIHJldHVybiBgJHt2YWx1ZS50b0ZpeGVkKDEpfSVgO1xuICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKHZhbHVlKX0lYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBiZXN0LWZpdCBsYWJlbCB0ZXh0IGZvciBhIHNlZ21lbnQsIHByb2dyZXNzaXZlbHkgdHJ1bmNhdGluZ1xuICAgKiBmcm9tIFwiTGFiZWwgKFhYJSlcIiDihpIgXCJMYWJlbFwiIOKGkiBcIlhYJVwiIOKGkiB0cnVuY2F0ZWQgbGFiZWwg4oaSIHRydW5jYXRlZCBwZXJjZW50YWdlLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBnZXRUcnVuY2F0ZWRMYWJlbFRleHQoZDogYW55LCBvdXRlclJhZGl1czogbnVtYmVyLCBpbm5lclJhZGl1czogbnVtYmVyLCBsYXlvdXRUb3RhbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBmb250U2l6ZSA9IHRoaXMuY2FsY3VsYXRlTGFiZWxGb250U2l6ZShkLCBvdXRlclJhZGl1cywgaW5uZXJSYWRpdXMsIGxheW91dFRvdGFsKTtcbiAgICBpZiAoZm9udFNpemUgPT09IDApIHJldHVybiAnJztcblxuICAgIGNvbnN0IHJpbmdXaWR0aCA9IG91dGVyUmFkaXVzIC0gaW5uZXJSYWRpdXM7XG4gICAgY29uc3QgbGFiZWxSYWRpdXMgPSBpbm5lclJhZGl1cyArIHJpbmdXaWR0aCAvIDI7XG4gICAgY29uc3QgYW5nbGUgPSBkLmVuZEFuZ2xlIC0gZC5zdGFydEFuZ2xlO1xuICAgIGNvbnN0IGNob3JkTGVuZ3RoID0gMiAqIGxhYmVsUmFkaXVzICogTWF0aC5zaW4oYW5nbGUgLyAyKTtcbiAgICBjb25zdCBhdmFpbGFibGVXaWR0aCA9IGNob3JkTGVuZ3RoICogMC44O1xuXG4gICAgY29uc3QgcGVyY2VudGFnZSA9IHRoaXMuZ2V0U2VnbWVudFBlcmNlbnRhZ2UoZC5kYXRhLnZhbHVlLCBsYXlvdXRUb3RhbCk7XG4gICAgaWYgKHBlcmNlbnRhZ2UgPCAyKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCBsYWJlbCA9IGQuZGF0YS5sYWJlbCB8fCAnJztcbiAgICBjb25zdCBwZXJjZW50YWdlVGV4dCA9IHRoaXMuZm9ybWF0UGVyY2VudGFnZShwZXJjZW50YWdlKTtcbiAgICBjb25zdCBmdWxsVGV4dCA9IGxhYmVsID8gYCR7bGFiZWx9ICgke3BlcmNlbnRhZ2VUZXh0fSlgIDogcGVyY2VudGFnZVRleHQ7XG5cbiAgICBpZiAodGhpcy5kb2VzVGV4dEZpdChmdWxsVGV4dCwgZm9udFNpemUsIGF2YWlsYWJsZVdpZHRoKSkgcmV0dXJuIGZ1bGxUZXh0O1xuICAgIGlmIChsYWJlbCAmJiB0aGlzLmRvZXNUZXh0Rml0KGxhYmVsLCBmb250U2l6ZSwgYXZhaWxhYmxlV2lkdGgpKSByZXR1cm4gbGFiZWw7XG4gICAgaWYgKHRoaXMuZG9lc1RleHRGaXQocGVyY2VudGFnZVRleHQsIGZvbnRTaXplLCBhdmFpbGFibGVXaWR0aCkpIHJldHVybiBwZXJjZW50YWdlVGV4dDtcbiAgICBpZiAobGFiZWwpIHJldHVybiB0aGlzLnRydW5jYXRlVGV4dFRvRml0KGxhYmVsLCBmb250U2l6ZSwgYXZhaWxhYmxlV2lkdGgpO1xuICAgIHJldHVybiB0aGlzLnRydW5jYXRlVGV4dFRvRml0KHBlcmNlbnRhZ2VUZXh0LCBmb250U2l6ZSwgYXZhaWxhYmxlV2lkdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0ZXh0IGZpdHMgd2l0aGluIGF2YWlsYWJsZSB3aWR0aCB1c2luZyBjb25zZXJ2YXRpdmUgZXN0aW1hdGlvblxuICAgKiBVc2VzIDAuNjVlbSBwZXIgY2hhcmFjdGVyIHRvIGFjY291bnQgZm9yIGZvbnQgdmFyaWF0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBkb2VzVGV4dEZpdCh0ZXh0OiBzdHJpbmcsIGZvbnRTaXplOiBudW1iZXIsIGF2YWlsYWJsZVdpZHRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiBmYWxzZTtcbiAgICBcbiAgICAvLyBVc2UgY29uc2VydmF0aXZlIGNoYXJhY3RlciB3aWR0aCAoMC42NWVtIGZvciBzYWZldHkpXG4gICAgLy8gV2lkZXIgZm9udHMgbGlrZSBib2xkIHRleHQgbmVlZCBtb3JlIHNwYWNlXG4gICAgY29uc3QgZXN0aW1hdGVkV2lkdGggPSB0ZXh0Lmxlbmd0aCAqIGZvbnRTaXplICogMC42NTtcbiAgICByZXR1cm4gZXN0aW1hdGVkV2lkdGggPD0gYXZhaWxhYmxlV2lkdGg7XG4gIH1cblxuICAvKipcbiAgICogVHJ1bmNhdGVzIHRleHQgdG8gZml0IHdpdGhpbiBhdmFpbGFibGUgd2lkdGggd2l0aCBlbGxpcHNpc1xuICAgKiBVc2VzIGNvbnNlcnZhdGl2ZSBjaGFyYWN0ZXIgd2lkdGggdG8gcHJldmVudCBvdmVyZmxvd1xuICAgKiBBZGFwdHMgY2hhcmFjdGVyIHdpZHRoIGVzdGltYXRpb24gYmFzZWQgb24gZm9udCBzaXplXG4gICAqL1xuICBwcml2YXRlIHRydW5jYXRlVGV4dFRvRml0KHRleHQ6IHN0cmluZywgZm9udFNpemU6IG51bWJlciwgYXZhaWxhYmxlV2lkdGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gJyc7XG4gICAgXG4gICAgLy8gQWRhcHRpdmUgY2hhcmFjdGVyIHdpZHRoOiBzbWFsbGVyIGZvbnRzIGFyZSByZWxhdGl2ZWx5IHdpZGVyXG4gICAgLy8gTGFyZ2VyIGZvbnRzOiB+MC42ZW0sIFNtYWxsZXIgZm9udHM6IH4wLjdlbVxuICAgIGNvbnN0IGNoYXJXaWR0aFJhdGlvID0gZm9udFNpemUgPD0gMTAgPyAwLjcgOiAwLjY1O1xuICAgIGNvbnN0IGNoYXJXaWR0aCA9IGZvbnRTaXplICogY2hhcldpZHRoUmF0aW87XG4gICAgXG4gICAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgZWxsaXBzaXNcbiAgICBjb25zdCBlbGxpcHNpc1dpZHRoID0gZm9udFNpemUgKiAwLjc7XG4gICAgY29uc3QgYXZhaWxhYmxlRm9yVGV4dCA9IGF2YWlsYWJsZVdpZHRoIC0gZWxsaXBzaXNXaWR0aDtcbiAgICBcbiAgICBpZiAoYXZhaWxhYmxlRm9yVGV4dCA8PSAwKSByZXR1cm4gJyc7XG4gICAgXG4gICAgY29uc3QgbWF4Q2hhcnMgPSBNYXRoLmZsb29yKGF2YWlsYWJsZUZvclRleHQgLyBjaGFyV2lkdGgpO1xuICAgIFxuICAgIGlmIChtYXhDaGFycyA8PSAwKSByZXR1cm4gJyc7XG4gICAgaWYgKHRleHQubGVuZ3RoIDw9IG1heENoYXJzKSByZXR1cm4gdGV4dDtcbiAgICBcbiAgICAvLyBFbnN1cmUgYXQgbGVhc3QgMSBjaGFyYWN0ZXIgYmVmb3JlIGVsbGlwc2lzXG4gICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIE1hdGgubWF4KDEsIG1heENoYXJzKSkgKyAn4oCmJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VnbWVudENvbG9yKGRhdGE6IEFYRG9udXRDaGFydERhdGEpOiBzdHJpbmcge1xuICAgIGlmIChkYXRhLmNvbG9yKSByZXR1cm4gZGF0YS5jb2xvcjtcblxuICAgIGNvbnN0IG9yaWdpbmFsRnVsbERhdGEgPSB1bnRyYWNrZWQoKCkgPT4gdGhpcy5jaGFydERhdGFBcnJheSgpKTtcbiAgICBjb25zdCBvcmlnaW5hbEluZGV4ID0gb3JpZ2luYWxGdWxsRGF0YS5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGRhdGEuaWQpO1xuICAgIFxuICAgIHJldHVybiB0aGlzLmdldENvbG9yKG9yaWdpbmFsSW5kZXggIT09IC0xID8gb3JpZ2luYWxJbmRleCA6IDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBob3ZlciBlZmZlY3RzIG9uIGEgc2VnbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVTbGljZUhvdmVyKGV2ZW50OiBNb3VzZUV2ZW50LCBkYXR1bTogQVhEb251dENoYXJ0RGF0YSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcoKSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5zaG93VG9vbHRpcChldmVudCwgZGF0dW0pO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmhpZ2hsaWdodFNlZ21lbnQoZGF0dW0uaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93VG9vbHRpcChldmVudDogTW91c2VFdmVudCwgZGF0dW06IEFYRG9udXRDaGFydERhdGEpOiB2b2lkIHtcbiAgICBjb25zdCB2aXNpYmxlRGF0YSA9IHVudHJhY2tlZCgoKSA9PiB0aGlzLmNoYXJ0RGF0YUFycmF5KCkpLmZpbHRlcigoaXRlbSkgPT4gIXRoaXMuaGlkZGVuU2VnbWVudHMuaGFzKGl0ZW0uaWQpKTtcbiAgICBjb25zdCBsYXlvdXRUb3RhbCA9IHRoaXMuZ2V0TGF5b3V0VG90YWwodmlzaWJsZURhdGEpO1xuICAgIGNvbnN0IHBlcmNlbnRhZ2UgPVxuICAgICAgbGF5b3V0VG90YWwgPiAwID8gdGhpcy5nZXRTZWdtZW50UGVyY2VudGFnZShkYXR1bS52YWx1ZSwgbGF5b3V0VG90YWwpLnRvRml4ZWQoMSkgOiAnMCc7XG4gICAgY29uc3QgY29sb3IgPSB0aGlzLmdldFNlZ21lbnRDb2xvcihkYXR1bSk7XG5cbiAgICB0aGlzLl90b29sdGlwRGF0YS5zZXQoe1xuICAgICAgdGl0bGU6IGRhdHVtLnRvb2x0aXBMYWJlbCB8fCBkYXR1bS5sYWJlbCxcbiAgICAgIHZhbHVlOiBkYXR1bS52YWx1ZS50b1N0cmluZygpLFxuICAgICAgcGVyY2VudGFnZTogYCR7cGVyY2VudGFnZX0lYCxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KHRydWUpO1xuICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIG1vdXNlIGxlYXZlIGZyb20gc2VnbWVudHNcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlU2VnbWVudExlYXZlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcoKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmhpZ2hsaWdodFNlZ21lbnQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzID0geyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH07XG4gICAgaWYgKHRoaXMuX3Rvb2x0aXBSYWZJZCAhPSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5zY2hlZHVsZVRvb2x0aXBQb3NpdGlvbigwKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVUb29sdGlwUG9zaXRpb24oYXR0ZW1wdDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fdG9vbHRpcFJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzO1xuICAgICAgaWYgKCFjb29yZHMpIHtcbiAgICAgICAgdGhpcy5fdG9vbHRpcFJhZklkID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250YWluZXJFbCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFjb250YWluZXJFbCkge1xuICAgICAgICB0aGlzLl90b29sdGlwUmFmSWQgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvb2x0aXBFbCA9IGNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoJy5jaGFydC10b29sdGlwJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgaWYgKCF0b29sdGlwRWwgJiYgdGhpcy5fdG9vbHRpcFZpc2libGUoKSAmJiBhdHRlbXB0IDwgMykge1xuICAgICAgICB0aGlzLnNjaGVkdWxlVG9vbHRpcFBvc2l0aW9uKGF0dGVtcHQgKyAxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl90b29sdGlwUmFmSWQgPSBudWxsO1xuICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgdG9vbHRpcFJlY3QgPSB0b29sdGlwRWwgPyB0b29sdGlwRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiBudWxsO1xuICAgICAgY29uc3QgcG9zID0gY29tcHV0ZVRvb2x0aXBQb3NpdGlvbihjb250YWluZXJSZWN0LCB0b29sdGlwUmVjdCwgY29vcmRzLngsIGNvb3Jkcy55LCB0aGlzLlRPT0xUSVBfR0FQKTtcbiAgICAgIHRoaXMuX3Rvb2x0aXBQb3NpdGlvbi5zZXQocG9zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGNlbnRlciBkaXNwbGF5IHdpdGggdG90YWwgdmFsdWUsIHNjYWxlZCB0byBmaXQgdGhlIGRvbnV0IGhvbGUuXG4gICAqL1xuICBwcml2YXRlIGFkZENlbnRlckRpc3BsYXkoZGlzcGxheVRvdGFsOiBudW1iZXIsIGlubmVyUmFkaXVzOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnIHx8IGlubmVyUmFkaXVzIDw9IDApIHJldHVybjtcblxuICAgIGNvbnN0IHZhbHVlVGV4dCA9IGRpc3BsYXlUb3RhbC50b0xvY2FsZVN0cmluZygpO1xuICAgIGNvbnN0IGxhYmVsVGV4dCA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnRvdGFsTGFiZWwgfHwgJ1RvdGFsJztcbiAgICBjb25zdCB7IHZhbHVlRm9udFNpemUsIGxhYmVsRm9udFNpemUsIGRpc3BsYXlMYWJlbCB9ID0gdGhpcy5jYWxjdWxhdGVDZW50ZXJUZXh0U2l6ZXMoXG4gICAgICB2YWx1ZVRleHQsXG4gICAgICBsYWJlbFRleHQsXG4gICAgICBpbm5lclJhZGl1cyxcbiAgICApO1xuXG4gICAgY29uc3QgbGFiZWxMaW5lSGVpZ2h0ID0gbGFiZWxGb250U2l6ZSAqIDEuMztcbiAgICBjb25zdCB2YWx1ZVkgPSAtKGxhYmVsTGluZUhlaWdodCAvIDIpO1xuXG4gICAgY29uc3QgdG90YWxEaXNwbGF5ID0gdGhpcy5zdmdcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWRvbnV0LWNoYXJ0LXRvdGFsLWRpc3BsYXknKVxuICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpO1xuXG4gICAgdG90YWxEaXNwbGF5XG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1kb251dC1jaGFydC10b3RhbC12YWx1ZScpXG4gICAgICAuYXR0cigneScsIHZhbHVlWSlcbiAgICAgIC5hdHRyKCdkb21pbmFudC1iYXNlbGluZScsICdtaWRkbGUnKVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHt2YWx1ZUZvbnRTaXplfXB4YClcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNjAwJylcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1kb251dC1jaGFydC12YWx1ZS1jb2xvcikpJylcbiAgICAgIC50ZXh0KHZhbHVlVGV4dCk7XG5cbiAgICB0b3RhbERpc3BsYXlcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWRvbnV0LWNoYXJ0LXRvdGFsLWxhYmVsJylcbiAgICAgIC5hdHRyKCd5JywgdmFsdWVZICsgdmFsdWVGb250U2l6ZSAqIDAuNTUgKyBsYWJlbExpbmVIZWlnaHQgLyAyKVxuICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke2xhYmVsRm9udFNpemV9cHhgKVxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWRvbnV0LWNoYXJ0LXZhbHVlLWNvbG9yKSknKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgJzAuOCcpXG4gICAgICAudGV4dChkaXNwbGF5TGFiZWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVDZW50ZXJUZXh0U2l6ZXMoXG4gICAgdmFsdWVUZXh0OiBzdHJpbmcsXG4gICAgbGFiZWxUZXh0OiBzdHJpbmcsXG4gICAgaW5uZXJSYWRpdXM6IG51bWJlcixcbiAgKTogeyB2YWx1ZUZvbnRTaXplOiBudW1iZXI7IGxhYmVsRm9udFNpemU6IG51bWJlcjsgZGlzcGxheUxhYmVsOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgYXZhaWxhYmxlRGlhbWV0ZXIgPSBpbm5lclJhZGl1cyAqIDI7XG4gICAgY29uc3QgYXZhaWxhYmxlV2lkdGggPSBhdmFpbGFibGVEaWFtZXRlciAqIDAuODI7XG4gICAgY29uc3QgYXZhaWxhYmxlSGVpZ2h0ID0gYXZhaWxhYmxlRGlhbWV0ZXIgKiAwLjc4O1xuXG4gICAgY29uc3QgTUlOX1ZBTFVFX0ZPTlQgPSA5O1xuICAgIGNvbnN0IE1BWF9WQUxVRV9GT05UID0gaW5uZXJSYWRpdXMgKiAwLjQyO1xuICAgIGxldCB2YWx1ZUZvbnRTaXplID0gTWF0aC5taW4oaW5uZXJSYWRpdXMgKiAwLjM0LCBNQVhfVkFMVUVfRk9OVCk7XG5cbiAgICB3aGlsZSAodmFsdWVGb250U2l6ZSA+IE1JTl9WQUxVRV9GT05UICYmICF0aGlzLmRvZXNUZXh0Rml0KHZhbHVlVGV4dCwgdmFsdWVGb250U2l6ZSwgYXZhaWxhYmxlV2lkdGgpKSB7XG4gICAgICB2YWx1ZUZvbnRTaXplIC09IDAuNTtcbiAgICB9XG4gICAgdmFsdWVGb250U2l6ZSA9IE1hdGgubWF4KE1JTl9WQUxVRV9GT05ULCBNYXRoLnJvdW5kKHZhbHVlRm9udFNpemUgKiAyKSAvIDIpO1xuXG4gICAgbGV0IGxhYmVsRm9udFNpemUgPSBNYXRoLm1heCg4LCBNYXRoLnJvdW5kKHZhbHVlRm9udFNpemUgKiAwLjQyICogMikgLyAyKTtcbiAgICBjb25zdCBsYWJlbExpbmVIZWlnaHQgPSBsYWJlbEZvbnRTaXplICogMS4zO1xuICAgIGNvbnN0IHRvdGFsSGVpZ2h0ID0gdmFsdWVGb250U2l6ZSArIGxhYmVsTGluZUhlaWdodDtcblxuICAgIGlmICh0b3RhbEhlaWdodCA+IGF2YWlsYWJsZUhlaWdodCkge1xuICAgICAgY29uc3Qgc2NhbGUgPSBhdmFpbGFibGVIZWlnaHQgLyB0b3RhbEhlaWdodDtcbiAgICAgIHZhbHVlRm9udFNpemUgPSBNYXRoLm1heChNSU5fVkFMVUVfRk9OVCwgTWF0aC5yb3VuZCh2YWx1ZUZvbnRTaXplICogc2NhbGUgKiAyKSAvIDIpO1xuICAgICAgbGFiZWxGb250U2l6ZSA9IE1hdGgubWF4KDgsIE1hdGgucm91bmQobGFiZWxGb250U2l6ZSAqIHNjYWxlICogMikgLyAyKTtcbiAgICB9XG5cbiAgICB3aGlsZSAobGFiZWxGb250U2l6ZSA+IDggJiYgIXRoaXMuZG9lc1RleHRGaXQobGFiZWxUZXh0LCBsYWJlbEZvbnRTaXplLCBhdmFpbGFibGVXaWR0aCkpIHtcbiAgICAgIGxhYmVsRm9udFNpemUgLT0gMC41O1xuICAgIH1cbiAgICBsYWJlbEZvbnRTaXplID0gTWF0aC5tYXgoOCwgTWF0aC5yb3VuZChsYWJlbEZvbnRTaXplICogMikgLyAyKTtcblxuICAgIGNvbnN0IGRpc3BsYXlMYWJlbCA9IHRoaXMuZG9lc1RleHRGaXQobGFiZWxUZXh0LCBsYWJlbEZvbnRTaXplLCBhdmFpbGFibGVXaWR0aClcbiAgICAgID8gbGFiZWxUZXh0XG4gICAgICA6IHRoaXMudHJ1bmNhdGVUZXh0VG9GaXQobGFiZWxUZXh0LCBsYWJlbEZvbnRTaXplLCBhdmFpbGFibGVXaWR0aCk7XG5cbiAgICByZXR1cm4geyB2YWx1ZUZvbnRTaXplLCBsYWJlbEZvbnRTaXplLCBkaXNwbGF5TGFiZWwgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGNoYXJ0IHJlbmRlcmluZyBlcnJvcnNcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlQ2hhcnRFcnJvcigpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICB0aGlzLnNob3dOb0RhdGFNZXNzYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyB1cCBjaGFydCByZXNvdXJjZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhbnVwQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Rvb2x0aXBSYWZJZCAhPSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl90b29sdGlwUmFmSWQpO1xuICAgICAgdGhpcy5fdG9vbHRpcFJhZklkID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fcGVuZGluZ1Rvb2x0aXBDb29yZHMgPSBudWxsO1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgdGhpcy5kMz8uc2VsZWN0KGNvbnRhaW5lcikuc2VsZWN0QWxsKCdzdmcsIC5heC1jaGFydC1lbXB0eSwgLmF4LWNoYXJ0LW1lc3NhZ2UtY29udGFpbmVyLCAuYXgtZG9udXQtY2hhcnQtbm8tZGF0YS1tZXNzYWdlJykucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zdmcgPSBudWxsO1xuICAgIHRoaXMucGllRGF0YSA9IFtdO1xuICAgIHRoaXMuaGlkZGVuU2VnbWVudHMuY2xlYXIoKTtcbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuX2N1cnJlbnRseUhpZ2hsaWdodGVkU2VnbWVudC5zZXQobnVsbCk7XG4gIH1cblxuICAvLyA9PT09PSBIZWxwZXIgdXRpbGl0aWVzIGZvciBtb2R1bGFyaXR5IGFuZCBtYWludGFpbmFiaWxpdHkgPT09PT1cblxuICAvLyBjb21wdXRlVG9vbHRpcFBvc2l0aW9uIG1vdmVkIHRvIHNoYXJlZCBjaGFydCB1dGlsc1xuXG4gIC8qKlxuICAgKiBHZXRzIGFuIGFjY2Vzc2liaWxpdHkgbGFiZWwgZGVzY3JpYmluZyB0aGUgZG9udXQgY2hhcnQgZm9yIHNjcmVlbiByZWFkZXJzXG4gICAqIEByZXR1cm5zIERlc2NyaXB0aXZlIHN0cmluZyBmb3Igc2NyZWVuIHJlYWRlcnNcbiAgICovXG4gIHByb3RlY3RlZCBnZXRBY2Nlc3NpYmlsaXR5TGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5jaGFydERhdGFBcnJheSgpO1xuXG4gICAgaWYgKCFkYXRhIHx8IGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJ0VtcHR5IGRvbnV0IGNoYXJ0LiBObyBkYXRhIGF2YWlsYWJsZS4nO1xuICAgIH1cblxuICAgIGNvbnN0IGRpc3BsYXlUb3RhbCA9IHRoaXMuZ2V0RGlzcGxheVRvdGFsKGRhdGEpO1xuICAgIGNvbnN0IGxheW91dFRvdGFsID0gdGhpcy5nZXRMYXlvdXRUb3RhbChkYXRhKTtcbiAgICBjb25zdCBzZWdtZW50RGVzY3JpcHRpb25zID0gZGF0YVxuICAgICAgLm1hcCgoc2VnbWVudCkgPT4ge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID1cbiAgICAgICAgICBsYXlvdXRUb3RhbCA+IDAgPyB0aGlzLmdldFNlZ21lbnRQZXJjZW50YWdlKHNlZ21lbnQudmFsdWUsIGxheW91dFRvdGFsKS50b0ZpeGVkKDEpIDogJzAnO1xuICAgICAgICByZXR1cm4gYCR7c2VnbWVudC5sYWJlbH06ICR7c2VnbWVudC52YWx1ZX0gKCR7cGVyY2VudGFnZX0lKWA7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJzsgJyk7XG5cbiAgICByZXR1cm4gYERvbnV0IGNoYXJ0IHdpdGggJHtkYXRhLmxlbmd0aH0gc2VnbWVudHMuIFRvdGFsIHZhbHVlOiAke2Rpc3BsYXlUb3RhbH0uICR7c2VnbWVudERlc2NyaXB0aW9uc31gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRhdGEgaXRlbXMgZm9yIHRoZSBsZWdlbmRcbiAgICogQGltcGxlbWVudHMgQVhDaGFydExlZ2VuZENvbXBhdGlibGVcbiAgICovXG4gIGdldExlZ2VuZEl0ZW1zKCk6IEFYQ2hhcnRMZWdlbmRJdGVtW10ge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNoYXJ0RGF0YUFycmF5KCk7XG4gICAgY29uc3QgbGF5b3V0VG90YWwgPSB0aGlzLmdldExheW91dFRvdGFsKGRhdGEpO1xuXG4gICAgcmV0dXJuIGRhdGEubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcbiAgICAgIGlkOiBpdGVtLmlkLFxuICAgICAgbmFtZTogaXRlbS5sYWJlbCB8fCBgU2VnbWVudCAke2luZGV4ICsgMX1gLFxuICAgICAgdmFsdWU6IGl0ZW0udmFsdWUsXG4gICAgICBjb2xvcjogdGhpcy5nZXRTZWdtZW50Q29sb3IoaXRlbSksXG4gICAgICBwZXJjZW50YWdlOiB0aGlzLmdldFNlZ21lbnRQZXJjZW50YWdlKGl0ZW0udmFsdWUsIGxheW91dFRvdGFsKSxcbiAgICAgIGhpZGRlbjogdGhpcy5pc1NlZ21lbnRIaWRkZW4oaXRlbS5pZCksXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWdtZW50TGF5b3V0VmFsdWUodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguYWJzKHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGF5b3V0VG90YWwoZGF0YTogQVhEb251dENoYXJ0RGF0YVtdKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZGF0YS5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgdGhpcy5nZXRTZWdtZW50TGF5b3V0VmFsdWUoaXRlbS52YWx1ZSksIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREaXNwbGF5VG90YWwoZGF0YTogQVhEb251dENoYXJ0RGF0YVtdKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZGF0YS5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgaXRlbS52YWx1ZSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGdldFNlZ21lbnRQZXJjZW50YWdlKHNlZ21lbnRWYWx1ZTogbnVtYmVyLCBsYXlvdXRUb3RhbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAobGF5b3V0VG90YWwgPD0gMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuICh0aGlzLmdldFNlZ21lbnRMYXlvdXRWYWx1ZShzZWdtZW50VmFsdWUpIC8gbGF5b3V0VG90YWwpICogMTAwO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYXgtZG9udXQtY2hhcnRcIiAjY2hhcnRDb250YWluZXIgcm9sZT1cImltZ1wiIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0QWNjZXNzaWJpbGl0eUxhYmVsKClcIj5cbiAgPCEtLSBUb29sdGlwIGNvbXBvbmVudCAtLT5cbiAgPGF4LWNoYXJ0LXRvb2x0aXBcbiAgICBbdmlzaWJsZV09XCJ0b29sdGlwVmlzaWJsZSgpXCJcbiAgICBbcG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uKClcIlxuICAgIFtkYXRhXT1cInRvb2x0aXBEYXRhKClcIlxuICAgIFtzaG93UGVyY2VudGFnZV09XCJ0cnVlXCJcbiAgPjwvYXgtY2hhcnQtdG9vbHRpcD5cbjwvZGl2PlxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1kb251dC1jaGFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9kb251dC1jaGFydC9zcmMvYWNvcmV4LWNoYXJ0cy1kb251dC1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acorex/charts",
3
- "version": "20.10.8",
3
+ "version": "20.10.10",
4
4
  "peerDependencies": {
5
5
  "d3": ">=7.9.0"
6
6
  },
@@ -15,10 +15,6 @@
15
15
  "types": "./index.d.ts",
16
16
  "default": "./fesm2022/acorex-charts.mjs"
17
17
  },
18
- "./bar-chart": {
19
- "types": "./bar-chart/index.d.ts",
20
- "default": "./fesm2022/acorex-charts-bar-chart.mjs"
21
- },
22
18
  "./chart-legend": {
23
19
  "types": "./chart-legend/index.d.ts",
24
20
  "default": "./fesm2022/acorex-charts-chart-legend.mjs"
@@ -27,6 +23,10 @@
27
23
  "types": "./chart-tooltip/index.d.ts",
28
24
  "default": "./fesm2022/acorex-charts-chart-tooltip.mjs"
29
25
  },
26
+ "./bar-chart": {
27
+ "types": "./bar-chart/index.d.ts",
28
+ "default": "./fesm2022/acorex-charts-bar-chart.mjs"
29
+ },
30
30
  "./donut-chart": {
31
31
  "types": "./donut-chart/index.d.ts",
32
32
  "default": "./fesm2022/acorex-charts-donut-chart.mjs"