@acorex/charts 21.0.3-next.33 → 21.0.3-next.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/fesm2022/acorex-charts-bar-chart.mjs +18 -18
  2. package/fesm2022/acorex-charts-bar-chart.mjs.map +1 -1
  3. package/fesm2022/acorex-charts-chart-legend.mjs +13 -13
  4. package/fesm2022/acorex-charts-chart-legend.mjs.map +1 -1
  5. package/fesm2022/acorex-charts-chart-tooltip.mjs +10 -10
  6. package/fesm2022/acorex-charts-chart-tooltip.mjs.map +1 -1
  7. package/fesm2022/acorex-charts-donut-chart.mjs +18 -18
  8. package/fesm2022/acorex-charts-donut-chart.mjs.map +1 -1
  9. package/fesm2022/acorex-charts-funnel-chart.mjs +15 -17
  10. package/fesm2022/acorex-charts-funnel-chart.mjs.map +1 -1
  11. package/fesm2022/acorex-charts-gauge-chart.mjs +15 -15
  12. package/fesm2022/acorex-charts-gauge-chart.mjs.map +1 -1
  13. package/fesm2022/acorex-charts-heatmap-chart.mjs +14 -14
  14. package/fesm2022/acorex-charts-heatmap-chart.mjs.map +1 -1
  15. package/fesm2022/acorex-charts-hierarchy-chart.mjs +19 -19
  16. package/fesm2022/acorex-charts-hierarchy-chart.mjs.map +1 -1
  17. package/fesm2022/acorex-charts-line-chart.mjs +15 -15
  18. package/fesm2022/acorex-charts-line-chart.mjs.map +1 -1
  19. package/fesm2022/acorex-charts.mjs +4 -4
  20. package/fesm2022/acorex-charts.mjs.map +1 -1
  21. package/package.json +13 -12
  22. /package/{bar-chart/index.d.ts → types/acorex-charts-bar-chart.d.ts} +0 -0
  23. /package/{chart-legend/index.d.ts → types/acorex-charts-chart-legend.d.ts} +0 -0
  24. /package/{chart-tooltip/index.d.ts → types/acorex-charts-chart-tooltip.d.ts} +0 -0
  25. /package/{donut-chart/index.d.ts → types/acorex-charts-donut-chart.d.ts} +0 -0
  26. /package/{funnel-chart/index.d.ts → types/acorex-charts-funnel-chart.d.ts} +0 -0
  27. /package/{gauge-chart/index.d.ts → types/acorex-charts-gauge-chart.d.ts} +0 -0
  28. /package/{heatmap-chart/index.d.ts → types/acorex-charts-heatmap-chart.d.ts} +0 -0
  29. /package/{hierarchy-chart/index.d.ts → types/acorex-charts-hierarchy-chart.d.ts} +0 -0
  30. /package/{line-chart/index.d.ts → types/acorex-charts-line-chart.d.ts} +0 -0
  31. /package/{index.d.ts → types/acorex-charts.d.ts} +0 -0
@@ -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.updateTooltipPosition(event);\n this._tooltipVisible.set(true);\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._tooltipRafId = requestAnimationFrame(() => {\n this._tooltipRafId = null;\n const coords = this._pendingTooltipCoords;\n if (!coords)\n return;\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl)\n return;\n const containerRect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = 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:clamp(220px,38vw,360px);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%;position:relative;min-height:0;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:clamp(220px,38vw,360px);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%;position:relative;min-height:0;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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LENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxZQUFvQixFQUFFLFdBQW1CO1FBQ3BFLElBQUksV0FBVyxJQUFJLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUMvQixPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUN4RSxDQUFDO3VHQTUzQlUscUJBQXFCOzJGQUFyQixxQkFBcUIsNmlCQy9DbEMsdVVBU0EsOHlDRG1DWSx1QkFBdUI7OzJGQUd0QixxQkFBcUI7a0JBUmpDLFNBQVM7K0JBQ0UsZ0JBQWdCLGlCQUdYLGlCQUFpQixDQUFDLElBQUksV0FDNUIsQ0FBQyx1QkFBdUIsQ0FBQyxtQkFDakIsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFYX0NIQVJUX0NPTE9SX1BBTEVUVEUsXG4gIEFYQ2hhcnRDb21wb25lbnQsXG4gIEFYQ2hhcnRDb21wb25lbnRCYXNlLFxuICBjb21wdXRlVG9vbHRpcFBvc2l0aW9uLFxuICBjcmVhdGVDaGFydEluc3RhbmNlSWQsXG4gIGdldENoYXJ0Q29sb3IsXG4gIGdldEVhc2luZ0Z1bmN0aW9uLFxuICBtZXJnZUNoYXJ0TWVzc2FnZXMsXG4gIG1lcmdlQ2hhcnRPcHRpb25zLFxuICByZW5kZXJDaGFydEVtcHR5TWVzc2FnZSxcbn0gZnJvbSAnQGFjb3JleC9jaGFydHMnO1xuaW1wb3J0IHsgQVhDaGFydExlZ2VuZENvbXBhdGlibGUsIEFYQ2hhcnRMZWdlbmRJdGVtIH0gZnJvbSAnQGFjb3JleC9jaGFydHMvY2hhcnQtbGVnZW5kJztcbmltcG9ydCB7IEFYQ2hhcnRUb29sdGlwQ29tcG9uZW50LCBBWENoYXJ0VG9vbHRpcERhdGEgfSBmcm9tICdAYWNvcmV4L2NoYXJ0cy9jaGFydC10b29sdGlwJztcblxuaW1wb3J0IHtcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgRWxlbWVudFJlZixcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgT25EZXN0cm95LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdW50cmFja2VkLFxuICB2aWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYX0RPTlVUX0NIQVJUX0NPTkZJRyB9IGZyb20gJy4vZG9udXQtY2hhcnQuY29uZmlnJztcbmltcG9ydCB7IEFYRG9udXRDaGFydERhdGEsIEFYRG9udXRDaGFydE9wdGlvbiwgQVhEb251dENoYXJ0VmFsdWUgfSBmcm9tICcuL2RvbnV0LWNoYXJ0LnR5cGUnO1xuXG4vKipcbiAqIERvbnV0IENoYXJ0IENvbXBvbmVudFxuICogRGlzcGxheXMgZGF0YSBpbiBhIGNpcmN1bGFyIGRvbnV0IGNoYXJ0IHdpdGggaW50ZXJhY3RpdmUgc2VnbWVudHNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtZG9udXQtY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZG9udXQtY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb251dC1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbQVhDaGFydFRvb2x0aXBDb21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQVhEb251dENoYXJ0Q29tcG9uZW50XG4gIGV4dGVuZHMgQVhDaGFydENvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQVhDaGFydExlZ2VuZENvbXBhdGlibGUsIEFYQ2hhcnRDb21wb25lbnRCYXNlXG57XG4gIC8vIERlcGVuZGVuY3kgSW5qZWN0aW9uXG4gIHByaXZhdGUgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvLyBJbnB1dHNcbiAgLyoqIENoYXJ0IGRhdGEgaW5wdXQgKi9cbiAgZGF0YSA9IGlucHV0PEFYRG9udXRDaGFydFZhbHVlPihbXSk7XG5cbiAgLyoqIENoYXJ0IG9wdGlvbnMgaW5wdXQgKi9cbiAgb3B0aW9ucyA9IGlucHV0PEFYRG9udXRDaGFydE9wdGlvbj4oe30pO1xuXG4gIC8vIE91dHB1dHNcbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIHNlZ21lbnQgaXMgY2xpY2tlZCAqL1xuICBzZWdtZW50Q2xpY2sgPSBvdXRwdXQ8QVhEb251dENoYXJ0RGF0YT4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIGEgc2VnbWVudCBoYXMgbW91c2UgaG92ZXJcbiAgICogQ2FuIGJlIHVzZWQgYnkgZXh0ZXJuYWwgZWxlbWVudHMgdG8gaGlnaGxpZ2h0IHRoaXMgc2VnbWVudFxuICAgKi9cbiAgc2VnbWVudEhvdmVyID0gb3V0cHV0PEFYRG9udXRDaGFydERhdGEgfCBudWxsPigpO1xuXG4gIC8vIENoYXJ0IGNvbnRhaW5lciByZWZlcmVuY2VcbiAgcHJpdmF0ZSByZWFkb25seSBjaGFydENvbnRhaW5lckVsID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignY2hhcnRDb250YWluZXInKTtcblxuICAvLyBEMyByZWZlcmVuY2UgLSBsb2FkZWQgYXN5bmNocm9ub3VzbHlcbiAgcHJvdGVjdGVkIGQzITogdHlwZW9mIGltcG9ydCgnZDMnKTtcblxuICAvLyBDaGFydCBTVkcgcmVmZXJlbmNlICh1c2luZyAnYW55JyBzaW5jZSBEMyBpcyBsb2FkZWQgZHluYW1pY2FsbHkgYXQgcnVudGltZSlcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBzdmc6IGFueSA9IG51bGw7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgcGllRGF0YTogYW55W10gPSBbXTtcblxuICAvLyBTdGF0ZSBtYW5hZ2VtZW50XG4gIHByaXZhdGUgaGlkZGVuU2VnbWVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9yZW5kZXJlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX2lzSW5pdGlhbEFuaW1hdGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX2N1cnJlbnRseUhpZ2hsaWdodGVkU2VnbWVudCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBUb29sdGlwIHN0YXRlXG4gIHByaXZhdGUgX3Rvb2x0aXBWaXNpYmxlID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfdG9vbHRpcFBvc2l0aW9uID0gc2lnbmFsKHsgeDogMCwgeTogMCB9KTtcbiAgcHJpdmF0ZSBfdG9vbHRpcERhdGEgPSBzaWduYWw8QVhDaGFydFRvb2x0aXBEYXRhPih7XG4gICAgdGl0bGU6ICcnLFxuICAgIHZhbHVlOiAwLFxuICAgIHBlcmNlbnRhZ2U6ICcwJScsXG4gICAgY29sb3I6ICcnLFxuICB9KTtcbiAgcHJpdmF0ZSBfdG9vbHRpcFJhZklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfcGVuZGluZ1Rvb2x0aXBDb29yZHM6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFB1YmxpYyBjb21wdXRlZCBwcm9wZXJ0aWVzIGZvciB0aGUgdGVtcGxhdGVcbiAgcHJvdGVjdGVkIHRvb2x0aXBWaXNpYmxlID0gdGhpcy5fdG9vbHRpcFZpc2libGUuYXNSZWFkb25seSgpO1xuICBwcm90ZWN0ZWQgdG9vbHRpcFBvc2l0aW9uID0gdGhpcy5fdG9vbHRpcFBvc2l0aW9uLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBEYXRhID0gdGhpcy5fdG9vbHRpcERhdGEuYXNSZWFkb25seSgpO1xuXG4gIC8vIEluamVjdCBjb25maWd1cmF0aW9uXG4gIHByaXZhdGUgY29uZmlnVG9rZW4gPSBpbmplY3QoQVhfRE9OVVRfQ0hBUlRfQ09ORklHKTtcblxuICAvLyBJbmplY3QgdGhlIGNoYXJ0IGNvbG9yc1xuICBwcml2YXRlIGNoYXJ0Q29sb3JzID0gaW5qZWN0KEFYX0NIQVJUX0NPTE9SX1BBTEVUVEUpO1xuXG4gIC8vIENvbXB1dGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICBwcm90ZWN0ZWQgZWZmZWN0aXZlT3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IG1lcmdlQ2hhcnRPcHRpb25zKHRoaXMuY29uZmlnVG9rZW4sIHRoaXMub3B0aW9ucygpKSk7XG5cbiAgLy8gQ29uc3RhbnRzXG4gIHByaXZhdGUgcmVhZG9ubHkgVE9PTFRJUF9HQVAgPSAxMDtcbiAgcHJpdmF0ZSByZWFkb25seSBISUdITElHSFRfVFJBTlNJVElPTl9EVVJBVElPTiA9IDE1MDtcbiAgcHJpdmF0ZSByZWFkb25seSBISUdITElHSFRfVFJBTlNJVElPTl9OQU1FID0gJ2hpZ2hsaWdodCc7XG4gIHByaXZhdGUgcmVhZG9ubHkgU0VHTUVOVF9BTklNQVRJT05fREVMQVkgPSA1MDtcbiAgcHJpdmF0ZSByZWFkb25seSBMQUJFTF9BTklNQVRJT05fREVMQVkgPSAyMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX0NIQVJUX0RJTUVOU0lPTiA9IDIwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fQ0hBUlRfRk9SX0xBQkVMUyA9IDI2MDtcbiAgcHJpdmF0ZSByZWFkb25seSBDSEFSVF9JTlNFVCA9IDEyO1xuICBwcml2YXRlIHJlYWRvbmx5IERJTU1FRF9PUEFDSVRZID0gMC41O1xuICBwcml2YXRlIHJlYWRvbmx5IFZJU0lCTEVfT1BBQ0lUWSA9IDE7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VJZCA9IGNyZWF0ZUNoYXJ0SW5zdGFuY2VJZCgnYXgtZG9udXQnKTtcbiAgcHJpdmF0ZSBnZXQgc2VnbWVudFNoYWRvd0ZpbHRlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuaW5zdGFuY2VJZH0tc2VnbWVudC1zaGFkb3dgO1xuICB9XG5cbiAgLy8gTWVzc2FnZXMgd2l0aCBkZWZhdWx0c1xuICBwcm90ZWN0ZWQgZWZmZWN0aXZlTWVzc2FnZXMgPSBjb21wdXRlZCgoKSA9PlxuICAgIG1lcmdlQ2hhcnRNZXNzYWdlcyh0aGlzLmNvbmZpZ1Rva2VuLm1lc3NhZ2VzLCB0aGlzLm9wdGlvbnMoKT8ubWVzc2FnZXMpLFxuICApO1xuXG4gIC8vIERhdGEgYWNjZXNzb3IgZm9yIGhhbmRsaW5nIGRpZmZlcmVudCBpbmNvbWluZyBkYXRhIGZvcm1hdHNcbiAgcHJvdGVjdGVkIGNoYXJ0RGF0YUFycmF5ID0gY29tcHV0ZWQoKCk6IEFYRG9udXRDaGFydERhdGFbXSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSgpIHx8IFtdO1xuICB9KTtcblxuICAvLyBDb2xvciBhY2Nlc3NvciBtZXRob2RcbiAgcHJvdGVjdGVkIGdldENvbG9yKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXRDaGFydENvbG9yKGluZGV4LCB0aGlzLmNoYXJ0Q29sb3JzKTtcbiAgfVxuXG4gIC8vIFNlZ21lbnQgdmlzaWJpbGl0eSBjaGVja1xuICBwcm90ZWN0ZWQgaXNTZWdtZW50SGlkZGVuKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oaWRkZW5TZWdtZW50cy5oYXMoaWQpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyBEeW5hbWljYWxseSBsb2FkIEQzIGFuZCBpbml0aWFsaXplIHRoZSBjaGFydCB3aGVuIHRoZSBjb21wb25lbnQgaXMgcmVhZHlcbiAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQuc2V0KHRydWUpO1xuICAgICAgdGhpcy5sb2FkRDMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YUNoYW5nZUVmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgLy8gVHJhY2sgZGF0YSBhbmQgb3B0aW9ucyBjaGFuZ2VzXG4gICAgdGhpcy5kYXRhKCk7XG4gICAgdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG5cbiAgICAvLyBPbmx5IHVwZGF0ZSBpZiBhbHJlYWR5IHJlbmRlcmVkXG4gICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9yZW5kZXJlZCgpKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEhpZ2hsaWdodHMgYSBzcGVjaWZpYyBzZWdtZW50IGJ5IElEXG4gICAqIEBwYXJhbSBpZCBUaGUgc2VnbWVudCBJRCB0byBoaWdobGlnaHQsIG9yIG51bGwgdG8gY2xlYXIgaGlnaGxpZ2h0XG4gICAqL1xuICBoaWdobGlnaHRTZWdtZW50KGlkOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzSW5pdGlhbEFuaW1hdGluZygpIHx8ICF0aGlzLnN2ZykgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuX2N1cnJlbnRseUhpZ2hsaWdodGVkU2VnbWVudCgpID09PSBpZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fY3VycmVudGx5SGlnaGxpZ2h0ZWRTZWdtZW50LnNldChpZCk7XG5cbiAgICAvLyBPbmx5IGludGVycnVwdCBvbmdvaW5nIEhJR0hMSUdIVCB0cmFuc2l0aW9ucyAobm90IGluaXRpYWwgYW5pbWF0aW9ucylcbiAgICB0aGlzLnN2Zy5zZWxlY3RBbGwoJ3BhdGgnKS5pbnRlcnJ1cHQodGhpcy5ISUdITElHSFRfVFJBTlNJVElPTl9OQU1FKTtcblxuICAgIGlmIChpZCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5jbGVhckFsbEhpZ2hsaWdodHMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHRhcmdldFNlZ21lbnQgPSB0aGlzLnN2Zy5zZWxlY3RBbGwoJ3BhdGgnKS5maWx0ZXIoKGQ6IGFueSkgPT4gZD8uZGF0YT8uaWQgPT09IGlkKTtcblxuICAgIGlmICh0YXJnZXRTZWdtZW50LmVtcHR5KCkpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRseUhpZ2hsaWdodGVkU2VnbWVudC5zZXQobnVsbCk7XG4gICAgICB0aGlzLmhpZ2hsaWdodFNlZ21lbnQobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaW1Ob25UYXJnZXRTZWdtZW50cyhpZCk7XG4gICAgdGhpcy5oaWdobGlnaHRUYXJnZXRTZWdtZW50KHRhcmdldFNlZ21lbnQpO1xuICAgIHRoaXMuc2VnbWVudEhvdmVyLmVtaXQodGhpcy5nZXRTZWdtZW50RGF0YUJ5SWQoaWQpKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJBbGxIaWdobGlnaHRzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdmcpIHJldHVybjtcblxuICAgIHRoaXMuc3ZnXG4gICAgICAuc2VsZWN0QWxsKCdwYXRoJylcbiAgICAgIC5jbGFzc2VkKCdheC1kb251dC1jaGFydC1oaWdobGlnaHRlZCcsIGZhbHNlKVxuICAgICAgLmNsYXNzZWQoJ2F4LWRvbnV0LWNoYXJ0LWRpbW1lZCcsIGZhbHNlKVxuICAgICAgLnRyYW5zaXRpb24odGhpcy5ISUdITElHSFRfVFJBTlNJVElPTl9OQU1FKVxuICAgICAgLmR1cmF0aW9uKHRoaXMuSElHSExJR0hUX1RSQU5TSVRJT05fRFVSQVRJT04pXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgbnVsbClcbiAgICAgIC5zdHlsZSgnZmlsdGVyJywgbnVsbClcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsIHRoaXMuVklTSUJMRV9PUEFDSVRZKTtcblxuICAgIHRoaXMuc2VnbWVudEhvdmVyLmVtaXQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGRpbU5vblRhcmdldFNlZ21lbnRzKHRhcmdldElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICB0aGlzLnN2Z1xuICAgICAgLnNlbGVjdEFsbCgncGF0aCcpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgLmZpbHRlcigoZDogYW55KSA9PiBkPy5kYXRhPy5pZCAhPT0gdGFyZ2V0SWQpXG4gICAgICAuY2xhc3NlZCgnYXgtZG9udXQtY2hhcnQtaGlnaGxpZ2h0ZWQnLCBmYWxzZSlcbiAgICAgIC5jbGFzc2VkKCdheC1kb251dC1jaGFydC1kaW1tZWQnLCB0cnVlKVxuICAgICAgLnRyYW5zaXRpb24odGhpcy5ISUdITElHSFRfVFJBTlNJVElPTl9OQU1FKVxuICAgICAgLmR1cmF0aW9uKHRoaXMuSElHSExJR0hUX1RSQU5TSVRJT05fRFVSQVRJT04pXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgbnVsbClcbiAgICAgIC5zdHlsZSgnZmlsdGVyJywgbnVsbClcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsIHRoaXMuRElNTUVEX09QQUNJVFkpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBoaWdobGlnaHRUYXJnZXRTZWdtZW50KHRhcmdldFNlZ21lbnQ6IGFueSk6IHZvaWQge1xuICAgIHRhcmdldFNlZ21lbnRcbiAgICAgIC5jbGFzc2VkKCdheC1kb251dC1jaGFydC1kaW1tZWQnLCBmYWxzZSlcbiAgICAgIC5jbGFzc2VkKCdheC1kb251dC1jaGFydC1oaWdobGlnaHRlZCcsIHRydWUpXG4gICAgICAudHJhbnNpdGlvbih0aGlzLkhJR0hMSUdIVF9UUkFOU0lUSU9OX05BTUUpXG4gICAgICAuZHVyYXRpb24odGhpcy5ISUdITElHSFRfVFJBTlNJVElPTl9EVVJBVElPTilcbiAgICAgIC5zdHlsZSgnZmlsdGVyJywgYHVybCgjJHt0aGlzLnNlZ21lbnRTaGFkb3dGaWx0ZXJJZH0pYClcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsIHRoaXMuVklTSUJMRV9PUEFDSVRZKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VnbWVudERhdGFCeUlkKHNlZ21lbnRJZDogc3RyaW5nKTogQVhEb251dENoYXJ0RGF0YSB8IG51bGwge1xuICAgIHJldHVybiB1bnRyYWNrZWQoKCkgPT4gdGhpcy5jaGFydERhdGFBcnJheSgpKS5maW5kKChkKSA9PiBkLmlkID09PSBzZWdtZW50SWQpIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB2aXNpYmlsaXR5IG9mIGEgc2VnbWVudCBieSBJRFxuICAgKiBAcGFyYW0gaWQgU2VnbWVudCBJRCB0byB0b2dnbGVcbiAgICogQHJldHVybnMgTmV3IHZpc2liaWxpdHkgc3RhdGUgKHRydWUgPSB2aXNpYmxlLCBmYWxzZSA9IGhpZGRlbilcbiAgICovXG4gIHRvZ2dsZVNlZ21lbnQoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNoYXJ0RGF0YSA9IHRoaXMuY2hhcnREYXRhQXJyYXkoKTtcbiAgICBjb25zdCB3YXNBbGxIaWRkZW4gPSBjaGFydERhdGEubGVuZ3RoID4gMCAmJiBjaGFydERhdGEuZXZlcnkoKGQpID0+IHRoaXMuaXNTZWdtZW50SGlkZGVuKGQuaWQpKTtcblxuICAgIGlmICh0aGlzLmhpZGRlblNlZ21lbnRzLmhhcyhpZCkpIHtcbiAgICAgIC8vIE1ha2luZyBhIHNlZ21lbnQgdmlzaWJsZVxuICAgICAgdGhpcy5oaWRkZW5TZWdtZW50cy5kZWxldGUoaWQpO1xuXG4gICAgICAvLyBJZiBhbGwgc2VnbWVudHMgd2VyZSBwcmV2aW91c2x5IGhpZGRlbiwgd2UgbmVlZCB0byBlbnN1cmUgdGhlIG1lc3NhZ2UgaXMgY2xlYXJlZFxuICAgICAgaWYgKHdhc0FsbEhpZGRlbikge1xuICAgICAgICAvLyBGb3JjZSBjb21wbGV0ZSBET00gY2xlYW51cCBhbmQgcmVkcmF3XG4gICAgICAgIGlmICh0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIC8vIENsZWFyIG9ubHkgY2hhcnQgU1ZHIGFuZCBtZXNzYWdlIGNvbnRhaW5lcnMgKHByZXNlcnZlIHRvb2x0aXAgY29tcG9uZW50KVxuICAgICAgICAgIHRoaXMuZDNcbiAgICAgICAgICAgID8uc2VsZWN0KHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgICAuc2VsZWN0QWxsKCdzdmcsIC5heC1jaGFydC1lbXB0eSwgLmF4LWNoYXJ0LW1lc3NhZ2UtY29udGFpbmVyLCAuYXgtZG9udXQtY2hhcnQtbm8tZGF0YS1tZXNzYWdlJylcbiAgICAgICAgICAgIC5yZW1vdmUoKTtcblxuICAgICAgICAgIC8vIEZvcmNlIGZ1bGwgcmVkcmF3XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGlkaW5nIGEgc2VnbWVudFxuICAgICAgdGhpcy5oaWRkZW5TZWdtZW50cy5hZGQoaWQpO1xuICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgIH1cblxuICAgIHJldHVybiAhdGhpcy5pc1NlZ21lbnRIaWRkZW4oaWQpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhbnVwQ2hhcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBEMy5qcyBkeW5hbWljYWxseVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGxvYWREMygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5kMyA9IGF3YWl0IGltcG9ydCgnZDMnKTtcbiAgICAgIC8vIElmIGNvbnRhaW5lciBpcyByZWFkeSwgY3JlYXRlIGNoYXJ0XG4gICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQoKSAmJiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkLnNldCh0cnVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgRDMuanM6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvblNlZ21lbnRDbGljayhpdGVtOiBBWERvbnV0Q2hhcnREYXRhKTogdm9pZCB7XG4gICAgdGhpcy5zZWdtZW50Q2xpY2suZW1pdChpdGVtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBkb251dCBjaGFydCBmcm9tIGN1cnJlbnQgZGF0YVxuICAgKi9cbiAgcHVibGljIGNyZWF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kMyB8fCAhdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudDtcbiAgICAgIHRoaXMuY2xlYXJDaGFydChjb250YWluZXJFbGVtZW50KTtcblxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY2hhcnREYXRhQXJyYXkoKTtcbiAgICAgIGlmICghZGF0YSB8fCBkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnNob3dOb0RhdGFNZXNzYWdlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmlzaWJsZURhdGEgPSBkYXRhLmZpbHRlcigoaXRlbSkgPT4gIXRoaXMuaGlkZGVuU2VnbWVudHMuaGFzKGl0ZW0uaWQpKTtcbiAgICAgIGlmICh2aXNpYmxlRGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zaG93QWxsU2VnbWVudHNIaWRkZW5NZXNzYWdlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLnNldHVwRGltZW5zaW9ucyhjb250YWluZXJFbGVtZW50LCBvcHRpb25zKTtcbiAgICAgIHRoaXMucmVuZGVyRG9udXRDaGFydChjb250YWluZXJFbGVtZW50LCB3aWR0aCwgaGVpZ2h0LCB2aXNpYmxlRGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNyZWF0aW5nIGRvbnV0IGNoYXJ0OicsIGVycm9yKTtcbiAgICAgIHRoaXMuaGFuZGxlQ2hhcnRFcnJvcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjaGFydCB3aXRoIG5ldyBkYXRhXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgLy8gUmVzZXQgaGlnaGxpZ2h0ZWQgc2VnbWVudCBzdGF0ZSB3aGVuIHVwZGF0aW5nXG4gICAgdGhpcy5fY3VycmVudGx5SGlnaGxpZ2h0ZWRTZWdtZW50LnNldChudWxsKTtcbiAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7IC8vIFJlY3JlYXRlIHRoZSBjaGFydCB3aXRoIHVwZGF0ZWQgZGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgY2hhcnQgY29udGFpbmVyXG4gICAqL1xuICBwcml2YXRlIGNsZWFyQ2hhcnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMuZDMuc2VsZWN0KGNvbnRhaW5lcikuc2VsZWN0QWxsKCdzdmcsIC5heC1jaGFydC1lbXB0eSwgLmF4LWNoYXJ0LW1lc3NhZ2UtY29udGFpbmVyLCAuYXgtZG9udXQtY2hhcnQtbm8tZGF0YS1tZXNzYWdlJykucmVtb3ZlKCk7XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG1lc3NhZ2Ugd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBzaG93Tm9EYXRhTWVzc2FnZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG4gICAgY29uc3QgbWVzc2FnZXMgPSB0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCk7XG4gICAgcmVuZGVyQ2hhcnRFbXB0eU1lc3NhZ2UodGhpcy5kMywgdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudCwge1xuICAgICAgaWNvbjogbWVzc2FnZXMubm9EYXRhSWNvbixcbiAgICAgIHRpdGxlOiBtZXNzYWdlcy5ub0RhdGEsXG4gICAgICBoZWxwOiBtZXNzYWdlcy5ub0RhdGFIZWxwLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgbWVzc2FnZSB3aGVuIGFsbCBzZWdtZW50cyBhcmUgaGlkZGVuXG4gICAqL1xuICBwcml2YXRlIHNob3dBbGxTZWdtZW50c0hpZGRlbk1lc3NhZ2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpO1xuICAgIHJlbmRlckNoYXJ0RW1wdHlNZXNzYWdlKHRoaXMuZDMsIHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQsIHtcbiAgICAgIGljb246IG1lc3NhZ2VzLmFsbEhpZGRlbkljb24sXG4gICAgICB0aXRsZTogbWVzc2FnZXMuYWxsSGlkZGVuLFxuICAgICAgaGVscDogbWVzc2FnZXMuYWxsSGlkZGVuSGVscCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cHMgY2hhcnQgZGltZW5zaW9ucyBiYXNlZCBvbiBjb250YWluZXIgYW5kIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgc2V0dXBEaW1lbnNpb25zKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM6IEFYRG9udXRDaGFydE9wdGlvbik6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgY29uc3QgY29udGFpbmVyV2lkdGggPSBNYXRoLm1heChjb250YWluZXIuY2xpZW50V2lkdGgsIDEpO1xuICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IE1hdGgubWF4KGNvbnRhaW5lci5jbGllbnRIZWlnaHQsIDEpO1xuXG4gICAgY29uc3QgZGVzaXJlZFdpZHRoID0gb3B0aW9ucz8ud2lkdGggfHwgY29udGFpbmVyV2lkdGg7XG4gICAgY29uc3QgZGVzaXJlZEhlaWdodCA9IG9wdGlvbnM/LmhlaWdodCB8fCBjb250YWluZXJIZWlnaHQ7XG4gICAgLy8gS2VlcCBkb251dCBnZW9tZXRyeSBzcXVhcmUgc28gc2lkZSBzcGFjaW5nIHN0YXlzIHZpc3VhbGx5IGJhbGFuY2VkLlxuICAgIGNvbnN0IGNoYXJ0U2l6ZSA9IE1hdGgubWF4KDEsIE1hdGgubWluKGRlc2lyZWRXaWR0aCwgZGVzaXJlZEhlaWdodCkpO1xuXG4gICAgcmV0dXJuIHsgd2lkdGg6IGNoYXJ0U2l6ZSwgaGVpZ2h0OiBjaGFydFNpemUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBkb251dCBjaGFydCB3aXRoIHZpc2libGUgZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJEb251dENoYXJ0KFxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICB2aXNpYmxlRGF0YTogQVhEb251dENoYXJ0RGF0YVtdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBkaXNwbGF5VG90YWwgPSB0aGlzLmdldERpc3BsYXlUb3RhbCh2aXNpYmxlRGF0YSk7XG4gICAgY29uc3QgbGF5b3V0VG90YWwgPSB0aGlzLmdldExheW91dFRvdGFsKHZpc2libGVEYXRhKTtcblxuICAgIC8vIENyZWF0ZSBTVkcgY29udGFpbmVyIHdpdGggZmlsdGVyc1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuY3JlYXRlU3ZnV2l0aEZpbHRlcnMoY29udGFpbmVyLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgIC8vIENyZWF0ZSBtYWluIGNoYXJ0IGdyb3VwXG4gICAgdGhpcy5zdmcgPSBzdmcuYXBwZW5kKCdnJykuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3dpZHRoIC8gMn0sICR7aGVpZ2h0IC8gMn0pYCk7XG5cbiAgICAvLyBDcmVhdGUgZG9udXQgc2VnbWVudHNcbiAgICB0aGlzLmNyZWF0ZURvbnV0U2VnbWVudHMod2lkdGgsIGhlaWdodCwgdmlzaWJsZURhdGEsIGxheW91dFRvdGFsKTtcblxuICAgIC8vIEFkZCB0b3RhbCBpbiBjZW50ZXJcbiAgICB0aGlzLmFkZENlbnRlckRpc3BsYXkoZGlzcGxheVRvdGFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgU1ZHIGVsZW1lbnQgd2l0aCBmaWx0ZXIgZGVmaW5pdGlvbnMgZm9yIHNoYWRvd3NcbiAgICogQHJldHVybnMgRDMgU1ZHIHNlbGVjdGlvbiAoYW55IHR5cGUgZHVlIHRvIGR5bmFtaWMgRDMgbG9hZGluZylcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgY3JlYXRlU3ZnV2l0aEZpbHRlcnMoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoY29udGFpbmVyKVxuICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgIC5hdHRyKCd3aWR0aCcsICcxMDAlJylcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCAnMTAwJScpXG4gICAgICAuYXR0cigndmlld0JveCcsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YClcbiAgICAgIC5hdHRyKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJywgJ3hNaWRZTWlkIG1lZXQnKTtcblxuICAgIC8vIEFkZCBkcm9wIHNoYWRvdyBmaWx0ZXJcbiAgICBjb25zdCBkZWZzID0gc3ZnLmFwcGVuZCgnZGVmcycpO1xuICAgIGNvbnN0IGZpbHRlciA9IGRlZnMuYXBwZW5kKCdmaWx0ZXInKS5hdHRyKCdpZCcsIHRoaXMuc2VnbWVudFNoYWRvd0ZpbHRlcklkKS5hdHRyKCdoZWlnaHQnLCAnMTMwJScpO1xuXG4gICAgZmlsdGVyLmFwcGVuZCgnZmVHYXVzc2lhbkJsdXInKS5hdHRyKCdpbicsICdTb3VyY2VBbHBoYScpLmF0dHIoJ3N0ZERldmlhdGlvbicsIDIpLmF0dHIoJ3Jlc3VsdCcsICdibHVyJyk7XG4gICAgZmlsdGVyLmFwcGVuZCgnZmVPZmZzZXQnKS5hdHRyKCdpbicsICdibHVyJykuYXR0cignZHgnLCAxKS5hdHRyKCdkeScsIDEpLmF0dHIoJ3Jlc3VsdCcsICdvZmZzZXRCbHVyJyk7XG5cbiAgICBjb25zdCBmZUNvbXBvbmVudFRyYW5zZmVyID0gZmlsdGVyXG4gICAgICAuYXBwZW5kKCdmZUNvbXBvbmVudFRyYW5zZmVyJylcbiAgICAgIC5hdHRyKCdpbicsICdvZmZzZXRCbHVyJylcbiAgICAgIC5hdHRyKCdyZXN1bHQnLCAnb2Zmc2V0Qmx1cicpO1xuXG4gICAgZmVDb21wb25lbnRUcmFuc2Zlci5hcHBlbmQoJ2ZlRnVuY0EnKS5hdHRyKCd0eXBlJywgJ2xpbmVhcicpLmF0dHIoJ3Nsb3BlJywgMC4zKTtcblxuICAgIGNvbnN0IGZlTWVyZ2UgPSBmaWx0ZXIuYXBwZW5kKCdmZU1lcmdlJyk7XG4gICAgZmVNZXJnZS5hcHBlbmQoJ2ZlTWVyZ2VOb2RlJykuYXR0cignaW4nLCAnb2Zmc2V0Qmx1cicpO1xuICAgIGZlTWVyZ2UuYXBwZW5kKCdmZU1lcmdlTm9kZScpLmF0dHIoJ2luJywgJ1NvdXJjZUdyYXBoaWMnKTtcblxuICAgIHJldHVybiBzdmc7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuZCByZW5kZXIgdGhlIGRvbnV0IHNlZ21lbnRzIHdpdGggYW5pbWF0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVEb251dFNlZ21lbnRzKFxuICAgIGNoYXJ0V2lkdGg6IG51bWJlcixcbiAgICBjaGFydEhlaWdodDogbnVtYmVyLFxuICAgIGRhdGE6IEFYRG9udXRDaGFydERhdGFbXSxcbiAgICBsYXlvdXRUb3RhbDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcuc2V0KHRydWUpO1xuXG4gICAgLy8gQ3JlYXRlIHBpZSBsYXlvdXRcbiAgICBjb25zdCBwaWUgPSB0aGlzLmQzXG4gICAgICAucGllPEFYRG9udXRDaGFydERhdGE+KClcbiAgICAgIC52YWx1ZSgoZCkgPT4gdGhpcy5nZXRTZWdtZW50TGF5b3V0VmFsdWUoZC52YWx1ZSkpXG4gICAgICAuc29ydChudWxsKVxuICAgICAgLnBhZEFuZ2xlKDAuMDIpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSByYWRpdXMgb2YgdGhlIGRvbnV0IGNoYXJ0XG4gICAgY29uc3QgbWF4UmFkaXVzID0gTWF0aC5taW4oY2hhcnRXaWR0aCwgY2hhcnRIZWlnaHQpIC8gMjtcbiAgICBjb25zdCByYWRpdXMgPSBNYXRoLm1heCgwLCBtYXhSYWRpdXMgLSB0aGlzLkNIQVJUX0lOU0VUKTtcblxuICAgIC8vIENhbGN1bGF0ZSBpbm5lciByYWRpdXMgYmFzZWQgb24gZG9udXRXaWR0aCBwZXJjZW50YWdlXG4gICAgY29uc3QgZG9udXRXaWR0aFBlcmNlbnQgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5kb251dFdpZHRoIC8gMTAwO1xuICAgIGNvbnN0IGlubmVyUmFkaXVzID0gcmFkaXVzICogKDEgLSBkb251dFdpZHRoUGVyY2VudCk7XG5cbiAgICBjb25zdCBvdXRlclJhZGl1cyA9IHJhZGl1cyAqIDAuOTU7XG4gICAgY29uc3QgcmluZ1dpZHRoID0gb3V0ZXJSYWRpdXMgLSBpbm5lclJhZGl1cztcblxuICAgIGNvbnN0IGFyYyA9IHRoaXMuZDNcbiAgICAgIC5hcmMoKVxuICAgICAgLmlubmVyUmFkaXVzKGlubmVyUmFkaXVzKVxuICAgICAgLm91dGVyUmFkaXVzKG91dGVyUmFkaXVzKVxuICAgICAgLmNvcm5lclJhZGl1cyh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5jb3JuZXJSYWRpdXMpO1xuXG4gICAgY29uc3QgbGFiZWxBcmMgPSB0aGlzLmQzXG4gICAgICAuYXJjKClcbiAgICAgIC5pbm5lclJhZGl1cyhpbm5lclJhZGl1cyArIHJpbmdXaWR0aCAvIDIpXG4gICAgICAub3V0ZXJSYWRpdXMoaW5uZXJSYWRpdXMgKyByaW5nV2lkdGggLyAyKTtcblxuICAgIC8vIEdldCBhbmltYXRpb24gb3B0aW9uc1xuICAgIGNvbnN0IGFuaW1hdGlvbkR1cmF0aW9uID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYW5pbWF0aW9uRHVyYXRpb247XG4gICAgY29uc3QgYW5pbWF0aW9uRWFzaW5nID0gZ2V0RWFzaW5nRnVuY3Rpb24odGhpcy5kMywgdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYW5pbWF0aW9uRWFzaW5nKTtcblxuICAgIC8vIEdlbmVyYXRlIHBpZSBkYXRhXG4gICAgdGhpcy5waWVEYXRhID0gcGllKGRhdGEpO1xuXG4gICAgLy8gQWRkIHNlZ21lbnRzIHdpdGggYW5pbWF0aW9uXG4gICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLnN2Z1xuICAgICAgLnNlbGVjdEFsbCgncGF0aCcpXG4gICAgICAuZGF0YSh0aGlzLnBpZURhdGEpXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtZG9udXQtY2hhcnQtc2VnbWVudCcpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAoZDogYW55KSA9PiB0aGlzLmdldFNlZ21lbnRDb2xvcihkLmRhdGEpKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMClcbiAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIC5vbignbW91c2VlbnRlcicsIChldmVudDogTW91c2VFdmVudCwgZDogYW55KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93VG9vbHRpcCkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlU2xpY2VIb3ZlcihldmVudCwgZC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5vbignbW91c2VsZWF2ZScsICgpID0+IHRoaXMuaGFuZGxlU2VnbWVudExlYXZlKCkpXG4gICAgICAub24oJ21vdXNlbW92ZScsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fdG9vbHRpcFZpc2libGUoKSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAub24oJ2NsaWNrJywgKF9ldmVudDogTW91c2VFdmVudCwgZDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25TZWdtZW50Q2xpY2soZC5kYXRhKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gQW5pbWF0ZSBzZWdtZW50c1xuICAgIGNvbnN0IG51bVNlZ21lbnRzID0gdGhpcy5waWVEYXRhLmxlbmd0aDtcbiAgICBsZXQgY29tcGxldGVkID0gMDtcbiAgICBzZWdtZW50c1xuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgLmVhc2UoYW5pbWF0aW9uRWFzaW5nKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIC5kZWxheSgoX2Q6IGFueSwgaTogbnVtYmVyKSA9PiBpICogdGhpcy5TRUdNRU5UX0FOSU1BVElPTl9ERUxBWSlcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsIHRoaXMuVklTSUJMRV9PUEFDSVRZKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIC5hdHRyVHdlZW4oJ2QnLCAoZDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGludGVycG9sYXRlID0gdGhpcy5kMy5pbnRlcnBvbGF0ZSh7IHN0YXJ0QW5nbGU6IGQuc3RhcnRBbmdsZSwgZW5kQW5nbGU6IGQuc3RhcnRBbmdsZSB9LCBkKTtcbiAgICAgICAgcmV0dXJuICh0OiBudW1iZXIpID0+IGFyYyhpbnRlcnBvbGF0ZSh0KSkgYXMgc3RyaW5nO1xuICAgICAgfSlcbiAgICAgIC5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICBjb21wbGV0ZWQrKztcbiAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBudW1TZWdtZW50cykge1xuICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbEFuaW1hdGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5vbignaW50ZXJydXB0JywgKCkgPT4ge1xuICAgICAgICAvLyBUcmVhdCBpbnRlcnJ1cHRzIGFzIGNvbXBsZXRpb24gdG8gYXZvaWQgZ2V0dGluZyBzdHVjayBpbiBhbmltYXRpbmcgc3RhdGVcbiAgICAgICAgY29tcGxldGVkKys7XG4gICAgICAgIGlmIChjb21wbGV0ZWQgPj0gbnVtU2VnbWVudHMpIHtcbiAgICAgICAgICB0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgLy8gQWRkIGRhdGEgbGFiZWxzIGlmIGVuYWJsZWQgYW5kIGNoYXJ0IHNpemUgaXMgc3VmZmljaWVudFxuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93RGF0YUxhYmVscyAmJiB0aGlzLmlzQ2hhcnRMYXJnZUVub3VnaEZvckxhYmVscyhjaGFydFdpZHRoLCBjaGFydEhlaWdodCkpIHtcbiAgICAgIHRoaXMuYWRkRGF0YUxhYmVscyhsYWJlbEFyYywgb3V0ZXJSYWRpdXMsIGlubmVyUmFkaXVzLCBsYXlvdXRUb3RhbCwgYW5pbWF0aW9uRHVyYXRpb24pO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSB3aGVuIGFsbCBzZWdtZW50IGFuaW1hdGlvbnMgYXJlIGNvbXBsZXRlIChoYW5kbGUgZW1wdHkgY2FzZSlcbiAgICBpZiAobnVtU2VnbWVudHMgPT09IDApIHtcbiAgICAgIHRoaXMuX2lzSW5pdGlhbEFuaW1hdGluZy5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNDaGFydExhcmdlRW5vdWdoRm9yTGFiZWxzKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE1hdGgubWluKHdpZHRoLCBoZWlnaHQpID49IHRoaXMuTUlOX0NIQVJUX0ZPUl9MQUJFTFM7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIGFkZERhdGFMYWJlbHMoXG4gICAgbGFiZWxBcmM6IGFueSxcbiAgICBvdXRlclJhZGl1czogbnVtYmVyLFxuICAgIGlubmVyUmFkaXVzOiBudW1iZXIsXG4gICAgbGF5b3V0VG90YWw6IG51bWJlcixcbiAgICBhbmltYXRpb25EdXJhdGlvbjogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICBjb25zdCBkYXRhV2l0aExhYmVscyA9IHRoaXMucGllRGF0YS5maWx0ZXIoKGQpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZUxhYmVsRm9udFNpemUoZCwgb3V0ZXJSYWRpdXMsIGlubmVyUmFkaXVzLCBsYXlvdXRUb3RhbCkgPiAwO1xuICAgIH0pO1xuXG4gICAgY29uc3QgbGFiZWxzID0gdGhpcy5zdmdcbiAgICAgIC5zZWxlY3RBbGwoJy5heC1kb251dC1jaGFydC1kYXRhLWxhYmVsJylcbiAgICAgIC5kYXRhKGRhdGFXaXRoTGFiZWxzKVxuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWRvbnV0LWNoYXJ0LWRhdGEtbGFiZWwnKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMClcbiAgICAgIC5zdHlsZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtZG9udXQtY2hhcnQtZGF0YS1sYWJlbHMtY29sb3IpKScpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgKGQpID0+IHtcbiAgICAgICAgY29uc3QgY2VudHJvaWQgPSBsYWJlbEFyYy5jZW50cm9pZChkKTtcbiAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGUoJHtjZW50cm9pZFswXX0sICR7Y2VudHJvaWRbMV19KWA7XG4gICAgICB9KVxuICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAuYXR0cignZG9taW5hbnQtYmFzZWxpbmUnLCAnbWlkZGxlJylcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgKGQpID0+IGAke3RoaXMuY2FsY3VsYXRlTGFiZWxGb250U2l6ZShkLCBvdXRlclJhZGl1cywgaW5uZXJSYWRpdXMsIGxheW91dFRvdGFsKX1weGApXG4gICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgKGQpID0+ICh0aGlzLmdldFNlZ21lbnRQZXJjZW50YWdlKGQuZGF0YS52YWx1ZSwgbGF5b3V0VG90YWwpID49IDE1ID8gJzYwMCcgOiAnNTAwJykpXG4gICAgICAudGV4dCgoZCkgPT4gdGhpcy5nZXRUcnVuY2F0ZWRMYWJlbFRleHQoZCwgb3V0ZXJSYWRpdXMsIGlubmVyUmFkaXVzLCBsYXlvdXRUb3RhbCkpO1xuXG4gICAgbGFiZWxzXG4gICAgICAudHJhbnNpdGlvbigpXG4gICAgICAuZHVyYXRpb24oYW5pbWF0aW9uRHVyYXRpb24pXG4gICAgICAuZGVsYXkoKF9kLCBpOiBudW1iZXIpID0+IGkgKiB0aGlzLlNFR01FTlRfQU5JTUFUSU9OX0RFTEFZICsgdGhpcy5MQUJFTF9BTklNQVRJT05fREVMQVkpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCB0aGlzLlZJU0lCTEVfT1BBQ0lUWSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBmb250IHNpemUgZm9yIGRhdGEgbGFiZWxzIHVzaW5nIHRoZSBkb251dCByaW5nJ3MgcGh5c2ljYWwgZGltZW5zaW9ucy5cbiAgICpcbiAgICogUHJpbWFyeSBkcml2ZXIgaXMgdGhlIHJpbmcgd2lkdGggKHJhZGlhbCBzcGFjZSksIHdpdGggY2hvcmQgbGVuZ3RoIGFzIGFuXG4gICAqIG92ZXJmbG93IGd1YXJkIGFuZCBhIGdlbnRsZSBzY2FsZS1kb3duIGZvciBzbWFsbGVyIHNlZ21lbnRzIHRvIGNyZWF0ZVxuICAgKiB2aXN1YWwgaGllcmFyY2h5LlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBjYWxjdWxhdGVMYWJlbEZvbnRTaXplKGQ6IGFueSwgb3V0ZXJSYWRpdXM6IG51bWJlciwgaW5uZXJSYWRpdXM6IG51bWJlciwgbGF5b3V0VG90YWw6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgYW5nbGUgPSBkLmVuZEFuZ2xlIC0gZC5zdGFydEFuZ2xlO1xuICAgIGNvbnN0IHNlZ21lbnRQZXJjZW50YWdlID0gdGhpcy5nZXRTZWdtZW50UGVyY2VudGFnZShkLmRhdGEudmFsdWUsIGxheW91dFRvdGFsKTtcblxuICAgIGlmIChzZWdtZW50UGVyY2VudGFnZSA8IDIpIHJldHVybiAwO1xuXG4gICAgY29uc3QgcmluZ1dpZHRoID0gb3V0ZXJSYWRpdXMgLSBpbm5lclJhZGl1cztcbiAgICBjb25zdCBsYWJlbFJhZGl1cyA9IGlubmVyUmFkaXVzICsgcmluZ1dpZHRoIC8gMjtcbiAgICBjb25zdCBjaG9yZExlbmd0aCA9IDIgKiBsYWJlbFJhZGl1cyAqIE1hdGguc2luKGFuZ2xlIC8gMik7XG5cbiAgICBjb25zdCBNSU5fQ0hPUkQgPSAyMjtcbiAgICBjb25zdCBNSU5fUklORyA9IDE2O1xuICAgIGlmIChjaG9yZExlbmd0aCA8IE1JTl9DSE9SRCB8fCByaW5nV2lkdGggPCBNSU5fUklORykgcmV0dXJuIDA7XG5cbiAgICBjb25zdCByaW5nQmFzZWRTaXplID0gcmluZ1dpZHRoICogMC40ODtcblxuICAgIC8vIFNlZ21lbnRzID49IDIwJSBnZXQgZnVsbCBzaXplOyBzbWFsbGVyIG9uZXMgc2NhbGUgZnJvbSAwLjc1IOKGkiAxLjBcbiAgICBjb25zdCBzZWdtZW50U2NhbGUgPSBNYXRoLm1pbigxLCAwLjc1ICsgMC4yNSAqIChzZWdtZW50UGVyY2VudGFnZSAvIDIwKSk7XG5cbiAgICAvLyBBdCBsZWFzdCAyIGNoYXJhY3RlcnMgKFwiWCVcIikgbXVzdCBmaXQgaG9yaXpvbnRhbGx5XG4gICAgY29uc3QgbWF4QnlDaG9yZCA9IGNob3JkTGVuZ3RoIC8gKDIgKiAwLjY1KTtcblxuICAgIGNvbnN0IGZvbnRTaXplID0gTWF0aC5taW4ocmluZ0Jhc2VkU2l6ZSAqIHNlZ21lbnRTY2FsZSwgbWF4QnlDaG9yZCk7XG5cbiAgICBjb25zdCBNSU5fRk9OVF9TSVpFID0gMTE7XG4gICAgY29uc3QgTUFYX0ZPTlRfU0laRSA9IDIwO1xuXG4gICAgcmV0dXJuIE1hdGgucm91bmQoTWF0aC5tYXgoTUlOX0ZPTlRfU0laRSwgTWF0aC5taW4oZm9udFNpemUsIE1BWF9GT05UX1NJWkUpKSAqIDIpIC8gMjtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0UGVyY2VudGFnZSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPCAxKSByZXR1cm4gJzwxJSc7XG4gICAgaWYgKHZhbHVlIDwgMTApIHJldHVybiBgJHt2YWx1ZS50b0ZpeGVkKDEpfSVgO1xuICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKHZhbHVlKX0lYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBiZXN0LWZpdCBsYWJlbCB0ZXh0IGZvciBhIHNlZ21lbnQsIHByb2dyZXNzaXZlbHkgdHJ1bmNhdGluZ1xuICAgKiBmcm9tIFwiTGFiZWwgKFhYJSlcIiDihpIgXCJMYWJlbFwiIOKGkiBcIlhYJVwiIOKGkiB0cnVuY2F0ZWQgbGFiZWwg4oaSIHRydW5jYXRlZCBwZXJjZW50YWdlLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBnZXRUcnVuY2F0ZWRMYWJlbFRleHQoZDogYW55LCBvdXRlclJhZGl1czogbnVtYmVyLCBpbm5lclJhZGl1czogbnVtYmVyLCBsYXlvdXRUb3RhbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBmb250U2l6ZSA9IHRoaXMuY2FsY3VsYXRlTGFiZWxGb250U2l6ZShkLCBvdXRlclJhZGl1cywgaW5uZXJSYWRpdXMsIGxheW91dFRvdGFsKTtcbiAgICBpZiAoZm9udFNpemUgPT09IDApIHJldHVybiAnJztcblxuICAgIGNvbnN0IHJpbmdXaWR0aCA9IG91dGVyUmFkaXVzIC0gaW5uZXJSYWRpdXM7XG4gICAgY29uc3QgbGFiZWxSYWRpdXMgPSBpbm5lclJhZGl1cyArIHJpbmdXaWR0aCAvIDI7XG4gICAgY29uc3QgYW5nbGUgPSBkLmVuZEFuZ2xlIC0gZC5zdGFydEFuZ2xlO1xuICAgIGNvbnN0IGNob3JkTGVuZ3RoID0gMiAqIGxhYmVsUmFkaXVzICogTWF0aC5zaW4oYW5nbGUgLyAyKTtcbiAgICBjb25zdCBhdmFpbGFibGVXaWR0aCA9IGNob3JkTGVuZ3RoICogMC44O1xuXG4gICAgY29uc3QgcGVyY2VudGFnZSA9IHRoaXMuZ2V0U2VnbWVudFBlcmNlbnRhZ2UoZC5kYXRhLnZhbHVlLCBsYXlvdXRUb3RhbCk7XG4gICAgaWYgKHBlcmNlbnRhZ2UgPCAyKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCBsYWJlbCA9IGQuZGF0YS5sYWJlbCB8fCAnJztcbiAgICBjb25zdCBwZXJjZW50YWdlVGV4dCA9IHRoaXMuZm9ybWF0UGVyY2VudGFnZShwZXJjZW50YWdlKTtcbiAgICBjb25zdCBmdWxsVGV4dCA9IGxhYmVsID8gYCR7bGFiZWx9ICgke3BlcmNlbnRhZ2VUZXh0fSlgIDogcGVyY2VudGFnZVRleHQ7XG5cbiAgICBpZiAodGhpcy5kb2VzVGV4dEZpdChmdWxsVGV4dCwgZm9udFNpemUsIGF2YWlsYWJsZVdpZHRoKSkgcmV0dXJuIGZ1bGxUZXh0O1xuICAgIGlmIChsYWJlbCAmJiB0aGlzLmRvZXNUZXh0Rml0KGxhYmVsLCBmb250U2l6ZSwgYXZhaWxhYmxlV2lkdGgpKSByZXR1cm4gbGFiZWw7XG4gICAgaWYgKHRoaXMuZG9lc1RleHRGaXQocGVyY2VudGFnZVRleHQsIGZvbnRTaXplLCBhdmFpbGFibGVXaWR0aCkpIHJldHVybiBwZXJjZW50YWdlVGV4dDtcbiAgICBpZiAobGFiZWwpIHJldHVybiB0aGlzLnRydW5jYXRlVGV4dFRvRml0KGxhYmVsLCBmb250U2l6ZSwgYXZhaWxhYmxlV2lkdGgpO1xuICAgIHJldHVybiB0aGlzLnRydW5jYXRlVGV4dFRvRml0KHBlcmNlbnRhZ2VUZXh0LCBmb250U2l6ZSwgYXZhaWxhYmxlV2lkdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0ZXh0IGZpdHMgd2l0aGluIGF2YWlsYWJsZSB3aWR0aCB1c2luZyBjb25zZXJ2YXRpdmUgZXN0aW1hdGlvblxuICAgKiBVc2VzIDAuNjVlbSBwZXIgY2hhcmFjdGVyIHRvIGFjY291bnQgZm9yIGZvbnQgdmFyaWF0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBkb2VzVGV4dEZpdCh0ZXh0OiBzdHJpbmcsIGZvbnRTaXplOiBudW1iZXIsIGF2YWlsYWJsZVdpZHRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiBmYWxzZTtcbiAgICBcbiAgICAvLyBVc2UgY29uc2VydmF0aXZlIGNoYXJhY3RlciB3aWR0aCAoMC42NWVtIGZvciBzYWZldHkpXG4gICAgLy8gV2lkZXIgZm9udHMgbGlrZSBib2xkIHRleHQgbmVlZCBtb3JlIHNwYWNlXG4gICAgY29uc3QgZXN0aW1hdGVkV2lkdGggPSB0ZXh0Lmxlbmd0aCAqIGZvbnRTaXplICogMC42NTtcbiAgICByZXR1cm4gZXN0aW1hdGVkV2lkdGggPD0gYXZhaWxhYmxlV2lkdGg7XG4gIH1cblxuICAvKipcbiAgICogVHJ1bmNhdGVzIHRleHQgdG8gZml0IHdpdGhpbiBhdmFpbGFibGUgd2lkdGggd2l0aCBlbGxpcHNpc1xuICAgKiBVc2VzIGNvbnNlcnZhdGl2ZSBjaGFyYWN0ZXIgd2lkdGggdG8gcHJldmVudCBvdmVyZmxvd1xuICAgKiBBZGFwdHMgY2hhcmFjdGVyIHdpZHRoIGVzdGltYXRpb24gYmFzZWQgb24gZm9udCBzaXplXG4gICAqL1xuICBwcml2YXRlIHRydW5jYXRlVGV4dFRvRml0KHRleHQ6IHN0cmluZywgZm9udFNpemU6IG51bWJlciwgYXZhaWxhYmxlV2lkdGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gJyc7XG4gICAgXG4gICAgLy8gQWRhcHRpdmUgY2hhcmFjdGVyIHdpZHRoOiBzbWFsbGVyIGZvbnRzIGFyZSByZWxhdGl2ZWx5IHdpZGVyXG4gICAgLy8gTGFyZ2VyIGZvbnRzOiB+MC42ZW0sIFNtYWxsZXIgZm9udHM6IH4wLjdlbVxuICAgIGNvbnN0IGNoYXJXaWR0aFJhdGlvID0gZm9udFNpemUgPD0gMTAgPyAwLjcgOiAwLjY1O1xuICAgIGNvbnN0IGNoYXJXaWR0aCA9IGZvbnRTaXplICogY2hhcldpZHRoUmF0aW87XG4gICAgXG4gICAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgZWxsaXBzaXNcbiAgICBjb25zdCBlbGxpcHNpc1dpZHRoID0gZm9udFNpemUgKiAwLjc7XG4gICAgY29uc3QgYXZhaWxhYmxlRm9yVGV4dCA9IGF2YWlsYWJsZVdpZHRoIC0gZWxsaXBzaXNXaWR0aDtcbiAgICBcbiAgICBpZiAoYXZhaWxhYmxlRm9yVGV4dCA8PSAwKSByZXR1cm4gJyc7XG4gICAgXG4gICAgY29uc3QgbWF4Q2hhcnMgPSBNYXRoLmZsb29yKGF2YWlsYWJsZUZvclRleHQgLyBjaGFyV2lkdGgpO1xuICAgIFxuICAgIGlmIChtYXhDaGFycyA8PSAwKSByZXR1cm4gJyc7XG4gICAgaWYgKHRleHQubGVuZ3RoIDw9IG1heENoYXJzKSByZXR1cm4gdGV4dDtcbiAgICBcbiAgICAvLyBFbnN1cmUgYXQgbGVhc3QgMSBjaGFyYWN0ZXIgYmVmb3JlIGVsbGlwc2lzXG4gICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIE1hdGgubWF4KDEsIG1heENoYXJzKSkgKyAn4oCmJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VnbWVudENvbG9yKGRhdGE6IEFYRG9udXRDaGFydERhdGEpOiBzdHJpbmcge1xuICAgIGlmIChkYXRhLmNvbG9yKSByZXR1cm4gZGF0YS5jb2xvcjtcblxuICAgIGNvbnN0IG9yaWdpbmFsRnVsbERhdGEgPSB1bnRyYWNrZWQoKCkgPT4gdGhpcy5jaGFydERhdGFBcnJheSgpKTtcbiAgICBjb25zdCBvcmlnaW5hbEluZGV4ID0gb3JpZ2luYWxGdWxsRGF0YS5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGRhdGEuaWQpO1xuICAgIFxuICAgIHJldHVybiB0aGlzLmdldENvbG9yKG9yaWdpbmFsSW5kZXggIT09IC0xID8gb3JpZ2luYWxJbmRleCA6IDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBob3ZlciBlZmZlY3RzIG9uIGEgc2VnbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVTbGljZUhvdmVyKGV2ZW50OiBNb3VzZUV2ZW50LCBkYXR1bTogQVhEb251dENoYXJ0RGF0YSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcoKSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5zaG93VG9vbHRpcChldmVudCwgZGF0dW0pO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmhpZ2hsaWdodFNlZ21lbnQoZGF0dW0uaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93VG9vbHRpcChldmVudDogTW91c2VFdmVudCwgZGF0dW06IEFYRG9udXRDaGFydERhdGEpOiB2b2lkIHtcbiAgICBjb25zdCB2aXNpYmxlRGF0YSA9IHVudHJhY2tlZCgoKSA9PiB0aGlzLmNoYXJ0RGF0YUFycmF5KCkpLmZpbHRlcigoaXRlbSkgPT4gIXRoaXMuaGlkZGVuU2VnbWVudHMuaGFzKGl0ZW0uaWQpKTtcbiAgICBjb25zdCBsYXlvdXRUb3RhbCA9IHRoaXMuZ2V0TGF5b3V0VG90YWwodmlzaWJsZURhdGEpO1xuICAgIGNvbnN0IHBlcmNlbnRhZ2UgPVxuICAgICAgbGF5b3V0VG90YWwgPiAwID8gdGhpcy5nZXRTZWdtZW50UGVyY2VudGFnZShkYXR1bS52YWx1ZSwgbGF5b3V0VG90YWwpLnRvRml4ZWQoMSkgOiAnMCc7XG4gICAgY29uc3QgY29sb3IgPSB0aGlzLmdldFNlZ21lbnRDb2xvcihkYXR1bSk7XG5cbiAgICB0aGlzLl90b29sdGlwRGF0YS5zZXQoe1xuICAgICAgdGl0bGU6IGRhdHVtLnRvb2x0aXBMYWJlbCB8fCBkYXR1bS5sYWJlbCxcbiAgICAgIHZhbHVlOiBkYXR1bS52YWx1ZS50b1N0cmluZygpLFxuICAgICAgcGVyY2VudGFnZTogYCR7cGVyY2VudGFnZX0lYCxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIG1vdXNlIGxlYXZlIGZyb20gc2VnbWVudHNcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlU2VnbWVudExlYXZlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0luaXRpYWxBbmltYXRpbmcoKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmhpZ2hsaWdodFNlZ21lbnQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzID0geyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH07XG4gICAgaWYgKHRoaXMuX3Rvb2x0aXBSYWZJZCAhPSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5fdG9vbHRpcFJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRoaXMuX3Rvb2x0aXBSYWZJZCA9IG51bGw7XG4gICAgICBjb25zdCBjb29yZHMgPSB0aGlzLl9wZW5kaW5nVG9vbHRpcENvb3JkcztcbiAgICAgIGlmICghY29vcmRzKSByZXR1cm47XG4gICAgICBjb25zdCBjb250YWluZXJFbCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFjb250YWluZXJFbCkgcmV0dXJuO1xuICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgdG9vbHRpcEVsID0gY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLmNoYXJ0LXRvb2x0aXAnKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICBjb25zdCB0b29sdGlwUmVjdCA9IHRvb2x0aXBFbCA/IHRvb2x0aXBFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG51bGw7XG4gICAgICBjb25zdCBwb3MgPSBjb21wdXRlVG9vbHRpcFBvc2l0aW9uKGNvbnRhaW5lclJlY3QsIHRvb2x0aXBSZWN0LCBjb29yZHMueCwgY29vcmRzLnksIHRoaXMuVE9PTFRJUF9HQVApO1xuICAgICAgdGhpcy5fdG9vbHRpcFBvc2l0aW9uLnNldChwb3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgY2VudGVyIGRpc3BsYXkgd2l0aCB0b3RhbCB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBhZGRDZW50ZXJEaXNwbGF5KGRpc3BsYXlUb3RhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN2ZykgcmV0dXJuO1xuXG4gICAgY29uc3QgY2hhcnRDb250YWluZXJXaWR0aCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgLy8gSW1wcm92ZWQgZm9udCBzY2FsaW5nOiBiZXR0ZXIgbWluaW11bSBmb3Igc21hbGwgc2l6ZXMsIGJldHRlciByYXRpbyBmb3Igc2NhbGluZ1xuICAgIGNvbnN0IGJhc2VGb250U2l6ZSA9IE1hdGgubWF4KDEuOCwgTWF0aC5taW4oMy4yLCBjaGFydENvbnRhaW5lcldpZHRoIC8gMTUwKSk7XG4gICAgY29uc3Qgc3ViVGV4dEZvbnRTaXplID0gYmFzZUZvbnRTaXplICogMC41O1xuXG4gICAgLy8gQ3JlYXRlIGdyb3VwIGZvciB0aGUgdG90YWwgZGlzcGxheVxuICAgIGNvbnN0IHRvdGFsRGlzcGxheSA9IHRoaXMuc3ZnXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1kb251dC1jaGFydC10b3RhbC1kaXNwbGF5JylcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKTtcblxuICAgIC8vIEFkZCB0b3RhbCB2YWx1ZVxuICAgIHRvdGFsRGlzcGxheVxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtZG9udXQtY2hhcnQtdG90YWwtdmFsdWUnKVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHtiYXNlRm9udFNpemV9cmVtYClcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNjAwJylcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1kb251dC1jaGFydC12YWx1ZS1jb2xvcikpJylcbiAgICAgIC50ZXh0KGRpc3BsYXlUb3RhbC50b0xvY2FsZVN0cmluZygpKTtcblxuICAgIC8vIEFkZCBsYWJlbFxuICAgIHRvdGFsRGlzcGxheVxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtZG9udXQtY2hhcnQtdG90YWwtbGFiZWwnKVxuICAgICAgLmF0dHIoJ2R5JywgJzEuNGVtJylcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7c3ViVGV4dEZvbnRTaXplfXJlbWApXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtZG9udXQtY2hhcnQtdmFsdWUtY29sb3IpKScpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAnMC44JylcbiAgICAgIC50ZXh0KHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnRvdGFsTGFiZWwgfHwgJ1RvdGFsJyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBjaGFydCByZW5kZXJpbmcgZXJyb3JzXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUNoYXJ0RXJyb3IoKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgdGhpcy5zaG93Tm9EYXRhTWVzc2FnZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnMgdXAgY2hhcnQgcmVzb3VyY2VzXG4gICAqL1xuICBwdWJsaWMgY2xlYW51cENoYXJ0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl90b29sdGlwUmFmSWQgIT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFJhZklkKTtcbiAgICAgIHRoaXMuX3Rvb2x0aXBSYWZJZCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzID0gbnVsbDtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIHRoaXMuZDM/LnNlbGVjdChjb250YWluZXIpLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtZW1wdHksIC5heC1jaGFydC1tZXNzYWdlLWNvbnRhaW5lciwgLmF4LWRvbnV0LWNoYXJ0LW5vLWRhdGEtbWVzc2FnZScpLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIHRoaXMuc3ZnID0gbnVsbDtcbiAgICB0aGlzLnBpZURhdGEgPSBbXTtcbiAgICB0aGlzLmhpZGRlblNlZ21lbnRzLmNsZWFyKCk7XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgICB0aGlzLl9jdXJyZW50bHlIaWdobGlnaHRlZFNlZ21lbnQuc2V0KG51bGwpO1xuICB9XG5cbiAgLy8gPT09PT0gSGVscGVyIHV0aWxpdGllcyBmb3IgbW9kdWxhcml0eSBhbmQgbWFpbnRhaW5hYmlsaXR5ID09PT09XG5cbiAgLy8gY29tcHV0ZVRvb2x0aXBQb3NpdGlvbiBtb3ZlZCB0byBzaGFyZWQgY2hhcnQgdXRpbHNcblxuICAvKipcbiAgICogR2V0cyBhbiBhY2Nlc3NpYmlsaXR5IGxhYmVsIGRlc2NyaWJpbmcgdGhlIGRvbnV0IGNoYXJ0IGZvciBzY3JlZW4gcmVhZGVyc1xuICAgKiBAcmV0dXJucyBEZXNjcmlwdGl2ZSBzdHJpbmcgZm9yIHNjcmVlbiByZWFkZXJzXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0QWNjZXNzaWJpbGl0eUxhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuY2hhcnREYXRhQXJyYXkoKTtcblxuICAgIGlmICghZGF0YSB8fCBkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICdFbXB0eSBkb251dCBjaGFydC4gTm8gZGF0YSBhdmFpbGFibGUuJztcbiAgICB9XG5cbiAgICBjb25zdCBkaXNwbGF5VG90YWwgPSB0aGlzLmdldERpc3BsYXlUb3RhbChkYXRhKTtcbiAgICBjb25zdCBsYXlvdXRUb3RhbCA9IHRoaXMuZ2V0TGF5b3V0VG90YWwoZGF0YSk7XG4gICAgY29uc3Qgc2VnbWVudERlc2NyaXB0aW9ucyA9IGRhdGFcbiAgICAgIC5tYXAoKHNlZ21lbnQpID0+IHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9XG4gICAgICAgICAgbGF5b3V0VG90YWwgPiAwID8gdGhpcy5nZXRTZWdtZW50UGVyY2VudGFnZShzZWdtZW50LnZhbHVlLCBsYXlvdXRUb3RhbCkudG9GaXhlZCgxKSA6ICcwJztcbiAgICAgICAgcmV0dXJuIGAke3NlZ21lbnQubGFiZWx9OiAke3NlZ21lbnQudmFsdWV9ICgke3BlcmNlbnRhZ2V9JSlgO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCc7ICcpO1xuXG4gICAgcmV0dXJuIGBEb251dCBjaGFydCB3aXRoICR7ZGF0YS5sZW5ndGh9IHNlZ21lbnRzLiBUb3RhbCB2YWx1ZTogJHtkaXNwbGF5VG90YWx9LiAke3NlZ21lbnREZXNjcmlwdGlvbnN9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkYXRhIGl0ZW1zIGZvciB0aGUgbGVnZW5kXG4gICAqIEBpbXBsZW1lbnRzIEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlXG4gICAqL1xuICBnZXRMZWdlbmRJdGVtcygpOiBBWENoYXJ0TGVnZW5kSXRlbVtdIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5jaGFydERhdGFBcnJheSgpO1xuICAgIGNvbnN0IGxheW91dFRvdGFsID0gdGhpcy5nZXRMYXlvdXRUb3RhbChkYXRhKTtcblxuICAgIHJldHVybiBkYXRhLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XG4gICAgICBpZDogaXRlbS5pZCxcbiAgICAgIG5hbWU6IGl0ZW0ubGFiZWwgfHwgYFNlZ21lbnQgJHtpbmRleCArIDF9YCxcbiAgICAgIHZhbHVlOiBpdGVtLnZhbHVlLFxuICAgICAgY29sb3I6IHRoaXMuZ2V0U2VnbWVudENvbG9yKGl0ZW0pLFxuICAgICAgcGVyY2VudGFnZTogdGhpcy5nZXRTZWdtZW50UGVyY2VudGFnZShpdGVtLnZhbHVlLCBsYXlvdXRUb3RhbCksXG4gICAgICBoaWRkZW46IHRoaXMuaXNTZWdtZW50SGlkZGVuKGl0ZW0uaWQpLFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VnbWVudExheW91dFZhbHVlKHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLmFicyh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldExheW91dFRvdGFsKGRhdGE6IEFYRG9udXRDaGFydERhdGFbXSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGRhdGEucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArIHRoaXMuZ2V0U2VnbWVudExheW91dFZhbHVlKGl0ZW0udmFsdWUpLCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGlzcGxheVRvdGFsKGRhdGE6IEFYRG9udXRDaGFydERhdGFbXSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGRhdGEucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArIGl0ZW0udmFsdWUsIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWdtZW50UGVyY2VudGFnZShzZWdtZW50VmFsdWU6IG51bWJlciwgbGF5b3V0VG90YWw6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKGxheW91dFRvdGFsIDw9IDApIHJldHVybiAwO1xuICAgIHJldHVybiAodGhpcy5nZXRTZWdtZW50TGF5b3V0VmFsdWUoc2VnbWVudFZhbHVlKSAvIGxheW91dFRvdGFsKSAqIDEwMDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImF4LWRvbnV0LWNoYXJ0XCIgI2NoYXJ0Q29udGFpbmVyIHJvbGU9XCJpbWdcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImdldEFjY2Vzc2liaWxpdHlMYWJlbCgpXCI+XG4gIDwhLS0gVG9vbHRpcCBjb21wb25lbnQgLS0+XG4gIDxheC1jaGFydC10b29sdGlwXG4gICAgW3Zpc2libGVdPVwidG9vbHRpcFZpc2libGUoKVwiXG4gICAgW3Bvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbigpXCJcbiAgICBbZGF0YV09XCJ0b29sdGlwRGF0YSgpXCJcbiAgICBbc2hvd1BlcmNlbnRhZ2VdPVwidHJ1ZVwiXG4gID48L2F4LWNoYXJ0LXRvb2x0aXA+XG48L2Rpdj5cbiJdfQ==","/**\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":["../../../../packages/charts/donut-chart/src/lib/donut-chart.config.ts","../../../../packages/charts/donut-chart/src/lib/donut-chart.component.ts","../../../../packages/charts/donut-chart/src/lib/donut-chart.component.html","../../../../packages/charts/donut-chart/src/acorex-charts-donut-chart.ts"],"sourcesContent":["import { AX_CHART_DEFAULT_MESSAGES } from '@acorex/charts';\nimport { InjectionToken } from '@angular/core';\nimport { AXDonutChartOption } from './donut-chart.type';\n\nexport const AXDonutChartDefaultConfig: AXDonutChartOption = {\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};\n\nexport const AX_DONUT_CHART_CONFIG = new InjectionToken<AXDonutChartOption>('AX_DONUT_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXDonutChartDefaultConfig,\n});\n\nexport type PartialDonutChartConfig = Partial<AXDonutChartOption>;\n\nexport function donutChartConfig(config: PartialDonutChartConfig = {}): AXDonutChartOption {\n return {\n ...AXDonutChartDefaultConfig,\n ...config,\n messages: {\n ...AXDonutChartDefaultConfig.messages,\n ...config.messages,\n },\n };\n}\n","import {\n AX_CHART_COLOR_PALETTE,\n AXChartComponent,\n AXChartComponentBase,\n computeTooltipPosition,\n createChartInstanceId,\n getChartColor,\n getEasingFunction,\n mergeChartMessages,\n mergeChartOptions,\n renderChartEmptyMessage,\n} from '@acorex/charts';\nimport { AXChartLegendCompatible, AXChartLegendItem } from '@acorex/charts/chart-legend';\nimport { AXChartTooltipComponent, AXChartTooltipData } from '@acorex/charts/chart-tooltip';\n\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n output,\n signal,\n untracked,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AX_DONUT_CHART_CONFIG } from './donut-chart.config';\nimport { AXDonutChartData, AXDonutChartOption, AXDonutChartValue } from './donut-chart.type';\n\n/**\n * Donut Chart Component\n * Displays data in a circular donut chart with interactive segments\n */\n@Component({\n selector: 'ax-donut-chart',\n templateUrl: './donut-chart.component.html',\n styleUrls: ['./donut-chart.component.css'],\n encapsulation: ViewEncapsulation.None,\n imports: [AXChartTooltipComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXDonutChartComponent\n extends AXChartComponent\n implements OnDestroy, AXChartLegendCompatible, AXChartComponentBase\n{\n // Dependency Injection\n private cdr = inject(ChangeDetectorRef);\n\n // Inputs\n /** Chart data input */\n data = input<AXDonutChartValue>([]);\n\n /** Chart options input */\n options = input<AXDonutChartOption>({});\n\n // Outputs\n /** Emitted when a segment is clicked */\n segmentClick = output<AXDonutChartData>();\n\n /** Emitted when a segment has mouse hover\n * Can be used by external elements to highlight this segment\n */\n segmentHover = output<AXDonutChartData | null>();\n\n // Chart container reference\n private readonly chartContainerEl = viewChild.required<ElementRef<HTMLDivElement>>('chartContainer');\n\n // D3 reference - loaded asynchronously\n protected d3!: typeof import('d3');\n\n // Chart SVG reference (using 'any' since D3 is loaded dynamically at runtime)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private svg: any = null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private pieData: any[] = [];\n\n // State management\n private hiddenSegments = new Set<string>();\n private _initialized = signal(false);\n private _rendered = signal(false);\n private _isInitialAnimating = signal(false);\n private _currentlyHighlightedSegment = signal<string | null>(null);\n\n // Tooltip state\n private _tooltipVisible = signal(false);\n private _tooltipPosition = signal({ x: 0, y: 0 });\n private _tooltipData = signal<AXChartTooltipData>({\n title: '',\n value: 0,\n percentage: '0%',\n color: '',\n });\n private _tooltipRafId: number | null = null;\n private _pendingTooltipCoords: { x: number; y: number } | null = null;\n\n // Public computed properties for the template\n protected tooltipVisible = this._tooltipVisible.asReadonly();\n protected tooltipPosition = this._tooltipPosition.asReadonly();\n protected tooltipData = this._tooltipData.asReadonly();\n\n // Inject configuration\n private configToken = inject(AX_DONUT_CHART_CONFIG);\n\n // Inject the chart colors\n private chartColors = inject(AX_CHART_COLOR_PALETTE);\n\n // Computed configuration options\n protected effectiveOptions = computed(() => mergeChartOptions(this.configToken, this.options()));\n\n // Constants\n private readonly TOOLTIP_GAP = 10;\n private readonly HIGHLIGHT_TRANSITION_DURATION = 150;\n private readonly HIGHLIGHT_TRANSITION_NAME = 'highlight';\n private readonly SEGMENT_ANIMATION_DELAY = 50;\n private readonly LABEL_ANIMATION_DELAY = 200;\n private readonly MIN_CHART_DIMENSION = 200;\n private readonly MIN_CHART_FOR_LABELS = 260;\n private readonly CHART_INSET = 12;\n private readonly DIMMED_OPACITY = 0.5;\n private readonly VISIBLE_OPACITY = 1;\n private readonly instanceId = createChartInstanceId('ax-donut');\n private get segmentShadowFilterId(): string {\n return `${this.instanceId}-segment-shadow`;\n }\n\n // Messages with defaults\n protected effectiveMessages = computed(() =>\n mergeChartMessages(this.configToken.messages, this.options()?.messages),\n );\n\n // Data accessor for handling different incoming data formats\n protected chartDataArray = computed((): AXDonutChartData[] => {\n return this.data() || [];\n });\n\n // Color accessor method\n protected getColor(index: number): string {\n return getChartColor(index, this.chartColors);\n }\n\n // Segment visibility check\n protected isSegmentHidden(id: string): boolean {\n return this.hiddenSegments.has(id);\n }\n\n constructor() {\n super();\n // Dynamically load D3 and initialize the chart when the component is ready\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\n });\n }\n\n private readonly dataChangeEffect = effect(() => {\n // Track data and options changes\n this.data();\n this.effectiveOptions();\n\n // Only update if already rendered\n untracked(() => {\n if (this._rendered()) {\n this.updateChart();\n }\n });\n });\n\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: string | null): void {\n if (this._isInitialAnimating() || !this.svg) return;\n\n if (this._currentlyHighlightedSegment() === id) return;\n\n this._currentlyHighlightedSegment.set(id);\n\n // Only interrupt ongoing HIGHLIGHT transitions (not initial animations)\n this.svg.selectAll('path').interrupt(this.HIGHLIGHT_TRANSITION_NAME);\n\n if (id === null) {\n this.clearAllHighlights();\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const targetSegment = this.svg.selectAll('path').filter((d: any) => d?.data?.id === id);\n\n if (targetSegment.empty()) {\n this._currentlyHighlightedSegment.set(null);\n this.highlightSegment(null);\n return;\n }\n\n this.dimNonTargetSegments(id);\n this.highlightTargetSegment(targetSegment);\n this.segmentHover.emit(this.getSegmentDataById(id));\n }\n\n private clearAllHighlights(): void {\n if (!this.svg) return;\n\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\n this.segmentHover.emit(null);\n }\n\n private dimNonTargetSegments(targetId: string): void {\n if (!this.svg) return;\n\n this.svg\n .selectAll('path')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .filter((d: any) => 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\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private highlightTargetSegment(targetSegment: any): void {\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\n private getSegmentDataById(segmentId: string): AXDonutChartData | null {\n return untracked(() => this.chartDataArray()).find((d) => d.id === segmentId) || null;\n }\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: string): boolean {\n const chartData = this.chartDataArray();\n const wasAllHidden = chartData.length > 0 && chartData.every((d) => this.isSegmentHidden(d.id));\n\n if (this.hiddenSegments.has(id)) {\n // Making a segment visible\n this.hiddenSegments.delete(id);\n\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\n // Force full redraw\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n } else {\n this.updateChart();\n }\n } else {\n // Hiding a segment\n this.hiddenSegments.add(id);\n this.updateChart();\n }\n\n return !this.isSegmentHidden(id);\n }\n\n ngOnDestroy(): void {\n this.cleanupChart();\n }\n\n /**\n * Loads D3.js dynamically\n */\n protected async loadD3(): Promise<void> {\n try {\n this.d3 = await import('d3');\n // If container is ready, create chart\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n } catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n\n protected onSegmentClick(item: AXDonutChartData): void {\n this.segmentClick.emit(item);\n }\n\n /**\n * Creates the donut chart from current data\n */\n public createChart(): void {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement) return;\n\n try {\n const containerElement = this.chartContainerEl().nativeElement;\n this.clearChart(containerElement);\n\n const data = this.chartDataArray();\n if (!data || data.length === 0) {\n this.showNoDataMessage();\n return;\n }\n\n const visibleData = data.filter((item) => !this.hiddenSegments.has(item.id));\n if (visibleData.length === 0) {\n this.showAllSegmentsHiddenMessage();\n return;\n }\n\n const options = this.effectiveOptions();\n const { width, height } = this.setupDimensions(containerElement, options);\n this.renderDonutChart(containerElement, width, height, visibleData);\n } catch (error) {\n console.error('Error creating donut chart:', error);\n this.handleChartError();\n }\n }\n\n /**\n * Updates the chart with new data\n */\n public updateChart(): void {\n // Reset highlighted segment state when updating\n this._currentlyHighlightedSegment.set(null);\n this.createChart(); // Recreate the chart with updated data\n }\n\n /**\n * Clears the chart container\n */\n private clearChart(container: HTMLElement): void {\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 /**\n * Shows a message when no data is available\n */\n private showNoDataMessage(): void {\n if (!this.chartContainerEl()?.nativeElement) 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 /**\n * Shows a message when all segments are hidden\n */\n private showAllSegmentsHiddenMessage(): void {\n if (!this.chartContainerEl()?.nativeElement) 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 /**\n * Setups chart dimensions based on container and options\n */\n private setupDimensions(container: HTMLElement, options: AXDonutChartOption): { width: number; height: number } {\n const containerWidth = Math.max(container.clientWidth, 1);\n const containerHeight = Math.max(container.clientHeight, 1);\n\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\n return { width: chartSize, height: chartSize };\n }\n\n /**\n * Renders the donut chart with visible data\n */\n private renderDonutChart(\n container: HTMLElement,\n width: number,\n height: number,\n visibleData: AXDonutChartData[],\n ): void {\n const displayTotal = this.getDisplayTotal(visibleData);\n const layoutTotal = this.getLayoutTotal(visibleData);\n\n // Create SVG container with filters\n const svg = this.createSvgWithFilters(container, width, height);\n\n // Create main chart group\n this.svg = svg.append('g').attr('transform', `translate(${width / 2}, ${height / 2})`);\n\n // Create donut segments\n this.createDonutSegments(width, height, visibleData, layoutTotal);\n\n // Add total in center\n this.addCenterDisplay(displayTotal);\n }\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 private createSvgWithFilters(container: HTMLElement, width: number, height: number): any {\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\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\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\n const feComponentTransfer = filter\n .append('feComponentTransfer')\n .attr('in', 'offsetBlur')\n .attr('result', 'offsetBlur');\n\n feComponentTransfer.append('feFuncA').attr('type', 'linear').attr('slope', 0.3);\n\n const feMerge = filter.append('feMerge');\n feMerge.append('feMergeNode').attr('in', 'offsetBlur');\n feMerge.append('feMergeNode').attr('in', 'SourceGraphic');\n\n return svg;\n }\n\n /**\n * Create and render the donut segments with animations\n */\n private createDonutSegments(\n chartWidth: number,\n chartHeight: number,\n data: AXDonutChartData[],\n layoutTotal: number,\n ): void {\n this._isInitialAnimating.set(true);\n\n // Create pie layout\n const pie = this.d3\n .pie<AXDonutChartData>()\n .value((d) => this.getSegmentLayoutValue(d.value))\n .sort(null)\n .padAngle(0.02);\n\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\n // Calculate inner radius based on donutWidth percentage\n const donutWidthPercent = this.effectiveOptions().donutWidth / 100;\n const innerRadius = radius * (1 - donutWidthPercent);\n\n const outerRadius = radius * 0.95;\n const ringWidth = outerRadius - innerRadius;\n\n const arc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius)\n .cornerRadius(this.effectiveOptions().cornerRadius);\n\n const labelArc = this.d3\n .arc()\n .innerRadius(innerRadius + ringWidth / 2)\n .outerRadius(innerRadius + ringWidth / 2);\n\n // Get animation options\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n\n // Generate pie data\n this.pieData = pie(data);\n\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: any) => 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: MouseEvent, d: any) => {\n if (this.effectiveOptions().showTooltip) {\n this.handleSliceHover(event, d.data);\n }\n })\n .on('mouseleave', () => this.handleSegmentLeave())\n .on('mousemove', (event: MouseEvent) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('click', (_event: MouseEvent, d: any) => {\n this.onSegmentClick(d.data);\n });\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: any, i: number) => 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: any) => {\n const interpolate = this.d3.interpolate({ startAngle: d.startAngle, endAngle: d.startAngle }, d);\n return (t: number) => arc(interpolate(t)) as string;\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\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\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\n private isChartLargeEnoughForLabels(width: number, height: number): boolean {\n return Math.min(width, height) >= this.MIN_CHART_FOR_LABELS;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private addDataLabels(\n labelArc: any,\n outerRadius: number,\n innerRadius: number,\n layoutTotal: number,\n animationDuration: number,\n ): void {\n if (!this.svg) return;\n\n const dataWithLabels = this.pieData.filter((d) => {\n return this.calculateLabelFontSize(d, outerRadius, innerRadius, layoutTotal) > 0;\n });\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\n labels\n .transition()\n .duration(animationDuration)\n .delay((_d, i: number) => i * this.SEGMENT_ANIMATION_DELAY + this.LABEL_ANIMATION_DELAY)\n .style('opacity', this.VISIBLE_OPACITY);\n }\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 private calculateLabelFontSize(d: any, outerRadius: number, innerRadius: number, layoutTotal: number): number {\n const angle = d.endAngle - d.startAngle;\n const segmentPercentage = this.getSegmentPercentage(d.data.value, layoutTotal);\n\n if (segmentPercentage < 2) return 0;\n\n const ringWidth = outerRadius - innerRadius;\n const labelRadius = innerRadius + ringWidth / 2;\n const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n\n const MIN_CHORD = 22;\n const MIN_RING = 16;\n if (chordLength < MIN_CHORD || ringWidth < MIN_RING) return 0;\n\n const ringBasedSize = ringWidth * 0.48;\n\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\n // At least 2 characters (\"X%\") must fit horizontally\n const maxByChord = chordLength / (2 * 0.65);\n\n const fontSize = Math.min(ringBasedSize * segmentScale, maxByChord);\n\n const MIN_FONT_SIZE = 11;\n const MAX_FONT_SIZE = 20;\n\n return Math.round(Math.max(MIN_FONT_SIZE, Math.min(fontSize, MAX_FONT_SIZE)) * 2) / 2;\n }\n\n private formatPercentage(value: number): string {\n if (value < 1) return '<1%';\n if (value < 10) return `${value.toFixed(1)}%`;\n return `${Math.round(value)}%`;\n }\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 private getTruncatedLabelText(d: any, outerRadius: number, innerRadius: number, layoutTotal: number): string {\n const fontSize = this.calculateLabelFontSize(d, outerRadius, innerRadius, layoutTotal);\n if (fontSize === 0) return '';\n\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\n const percentage = this.getSegmentPercentage(d.data.value, layoutTotal);\n if (percentage < 2) return '';\n\n const label = d.data.label || '';\n const percentageText = this.formatPercentage(percentage);\n const fullText = label ? `${label} (${percentageText})` : percentageText;\n\n if (this.doesTextFit(fullText, fontSize, availableWidth)) return fullText;\n if (label && this.doesTextFit(label, fontSize, availableWidth)) return label;\n if (this.doesTextFit(percentageText, fontSize, availableWidth)) return percentageText;\n if (label) return this.truncateTextToFit(label, fontSize, availableWidth);\n return this.truncateTextToFit(percentageText, fontSize, availableWidth);\n }\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 private doesTextFit(text: string, fontSize: number, availableWidth: number): boolean {\n if (!text) return false;\n\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 /**\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 private truncateTextToFit(text: string, fontSize: number, availableWidth: number): string {\n if (!text) return '';\n\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\n // Reserve space for ellipsis\n const ellipsisWidth = fontSize * 0.7;\n const availableForText = availableWidth - ellipsisWidth;\n\n if (availableForText <= 0) return '';\n\n const maxChars = Math.floor(availableForText / charWidth);\n\n if (maxChars <= 0) return '';\n if (text.length <= maxChars) return text;\n\n // Ensure at least 1 character before ellipsis\n return text.substring(0, Math.max(1, maxChars)) + '…';\n }\n\n private getSegmentColor(data: AXDonutChartData): string {\n if (data.color) return data.color;\n\n const originalFullData = untracked(() => this.chartDataArray());\n const originalIndex = originalFullData.findIndex((item) => item.id === data.id);\n\n return this.getColor(originalIndex !== -1 ? originalIndex : 0);\n }\n\n /**\n * Handle hover effects on a segment\n */\n private handleSliceHover(event: MouseEvent, datum: AXDonutChartData): void {\n if (this._isInitialAnimating()) return;\n\n if (this.effectiveOptions().showTooltip !== false) {\n this.showTooltip(event, datum);\n }\n\n this.highlightSegment(datum.id);\n }\n\n private showTooltip(event: MouseEvent, datum: AXDonutChartData): void {\n const visibleData = untracked(() => this.chartDataArray()).filter((item) => !this.hiddenSegments.has(item.id));\n const layoutTotal = this.getLayoutTotal(visibleData);\n const percentage =\n layoutTotal > 0 ? this.getSegmentPercentage(datum.value, layoutTotal).toFixed(1) : '0';\n const color = this.getSegmentColor(datum);\n\n this._tooltipData.set({\n title: datum.tooltipLabel || datum.label,\n value: datum.value.toString(),\n percentage: `${percentage}%`,\n color,\n });\n\n this.updateTooltipPosition(event);\n this._tooltipVisible.set(true);\n }\n\n /**\n * Handles mouse leave from segments\n */\n private handleSegmentLeave(): void {\n if (this._isInitialAnimating()) return;\n\n this._tooltipVisible.set(false);\n this.highlightSegment(null);\n }\n\n private updateTooltipPosition(event: MouseEvent): void {\n this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n if (this._tooltipRafId != null) return;\n this._tooltipRafId = requestAnimationFrame(() => {\n this._tooltipRafId = null;\n const coords = this._pendingTooltipCoords;\n if (!coords) return;\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl) return;\n const containerRect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip') as HTMLElement | null;\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = computeTooltipPosition(containerRect, tooltipRect, coords.x, coords.y, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n });\n }\n\n /**\n * Adds center display with total value\n */\n private addCenterDisplay(displayTotal: number): void {\n if (!this.svg) return;\n\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\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\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\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 /**\n * Handles chart rendering errors\n */\n private handleChartError(): void {\n const container = this.chartContainerEl()?.nativeElement;\n if (container) {\n this.showNoDataMessage();\n }\n }\n\n /**\n * Cleans up chart resources\n */\n public cleanupChart(): void {\n if (this._tooltipRafId != null) {\n cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = null;\n }\n this._pendingTooltipCoords = null;\n\n const container = this.chartContainerEl()?.nativeElement;\n if (container) {\n this.d3?.select(container).selectAll('svg, .ax-chart-empty, .ax-chart-message-container, .ax-donut-chart-no-data-message').remove();\n }\n\n this.svg = null;\n this.pieData = [];\n this.hiddenSegments.clear();\n this._tooltipVisible.set(false);\n this._currentlyHighlightedSegment.set(null);\n }\n\n // ===== Helper utilities for modularity and maintainability =====\n\n // computeTooltipPosition moved to shared chart utils\n\n /**\n * Gets an accessibility label describing the donut chart for screen readers\n * @returns Descriptive string for screen readers\n */\n protected getAccessibilityLabel(): string {\n const data = this.chartDataArray();\n\n if (!data || data.length === 0) {\n return 'Empty donut chart. No data available.';\n }\n\n const displayTotal = this.getDisplayTotal(data);\n const layoutTotal = this.getLayoutTotal(data);\n const segmentDescriptions = data\n .map((segment) => {\n const percentage =\n layoutTotal > 0 ? this.getSegmentPercentage(segment.value, layoutTotal).toFixed(1) : '0';\n return `${segment.label}: ${segment.value} (${percentage}%)`;\n })\n .join('; ');\n\n return `Donut chart with ${data.length} segments. Total value: ${displayTotal}. ${segmentDescriptions}`;\n }\n\n /**\n * Returns the data items for the legend\n * @implements AXChartLegendCompatible\n */\n getLegendItems(): AXChartLegendItem[] {\n const data = this.chartDataArray();\n const layoutTotal = this.getLayoutTotal(data);\n\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\n private getSegmentLayoutValue(value: number): number {\n return Math.abs(value);\n }\n\n private getLayoutTotal(data: AXDonutChartData[]): number {\n return data.reduce((sum, item) => sum + this.getSegmentLayoutValue(item.value), 0);\n }\n\n private getDisplayTotal(data: AXDonutChartData[]): number {\n return data.reduce((sum, item) => sum + item.value, 0);\n }\n\n private getSegmentPercentage(segmentValue: number, layoutTotal: number): number {\n if (layoutTotal <= 0) return 0;\n return (this.getSegmentLayoutValue(segmentValue) / layoutTotal) * 100;\n }\n}\n","<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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}